Nergal
Active Member
- Joined
- Feb 20, 2021
- Messages
- 18
Hello Everybody. I am Nergal, the creator & lead developer of VSH2 and I would like to discuss the possibility of having the Panda VSH servers upgrade to VSH2!
Firstly, why VSH2?
Well compared to VSH1...
VSH2 also comes with an FF2 Compatibility Layer Engine which allows you to run both VSH2 custom bosses AND FF2 bosses together!
Given all of this, VSH2 uses a built from scratch framework where VSH1 (and barely FF2) had no framework (or even structure really)
For Coders Only, Here's a sample of just what VSH2 is capable of :
Firstly, why VSH2?
Well compared to VSH1...
- VSH2 is in active development.
- VSH2 allows you to have more than 1 bosses at a time (multi-bosses)
- VSH2 not only allows multi-bosses but you can have ANY combo of bosses (i.e. 2 Saxtons and 1 Vagineer)
- VSH2 allows you to create completely custom bosses with completely custom mechanics that not even FF2 can compete with.
- VSH2 has a massive ton of cvars that allows you to adjust gameplay and the gamemode as needed (see below).
- VSH2 has its own special config that you can use to modify weapons such as adding stats, completely overriding stats, or even completely replacing weapons!
- Said config also lets you modify the class help messages and even add extra download assets!
- VSH2 uses a boss event-based callback system that allows a coder to manipulate, modify, and/or execute code based on those events!
- Example, VSH2 has an event for when a boss was airshotted by a projectile, a boss killing a player, or even the boss background music has started playing!
- VSH2 has built-in Goomba stomp plugin support!
- VSH2 actually has Medieval Mode support!
- VSH2 has built-in chat targets: '@ boss' to target bosses, '@minions' to target boss minions, and '@nextboss' to target the next chosen boss.
- VSH2 has a built-in Set Boss command that can be overriden to work for donators only.
- For backwards compatibility, VSH2 uses the same map configuration files as FF2 and VSH1.
- VSH2 uses two types of modules: addons and boss modules. Addons are plugins that hook to and can modify and/or read events from VSH2
- Addons always have higher execution priority than boss modules, which allows you to modify/tweak existing boss behaviors with confidence!
- VSH2 also uses a game mode manager which can be accessed by addons and boss modules whenever needed with information like the number of rounds passed, the next set boss, sorted queue points list, and counting by either players, bosses, or minions!
- VSH2 is completely open source and has even has coding documentation (including an API reference) with it such as the plugin's architecture and source file hierarchy as an image.
VSH2 also comes with an FF2 Compatibility Layer Engine which allows you to run both VSH2 custom bosses AND FF2 bosses together!
Given all of this, VSH2 uses a built from scratch framework where VSH1 (and barely FF2) had no framework (or even structure really)
GitHub - VSH2-Devs/Vs-Saxton-Hale-2: VSH2 is a rewrite of the original VSH, meant to combine the best of VSH and FF2.
VSH2 is a rewrite of the original VSH, meant to combine the best of VSH and FF2. - VSH2-Devs/Vs-Saxton-Hale-2
github.com
For Coders Only, Here's a sample of just what VSH2 is capable of :
Code:
public void Template_OnBossMedicCall(const VSH2Player player)
{
if( !IsTemplate(player) || player.GetPropFloat("flRAGE") < 100.0 )
return;
/// use ConfigMap to set how large the rage radius is!
float radius = 800.0; /// in case of failure, default value!
template_boss_cfg.GetFloat("rage_dist", radius);
/// generic player & building stun is built-in!
player.DoGenericStun(radius);
VSH2Player[] players = new VSH2Player[MaxClients];
int in_range = player.GetPlayersInRange(players, radius);
for( int i; i<in_range; i++ ) {
if( players[i].GetPropAny("bIsBoss") || players[i].GetPropAny("bIsMinion") )
continue;
/// do custom, distance-based rage code here!
}
player.PlayVoiceClip(TemplateRage[GetRandomInt(0, sizeof(TemplateRage)-1)], VSH2_VOICE_RAGE);
player.SetPropFloat("flRAGE", 0.0);
}
public void Template_OnBossThink(const VSH2Player player)
{
int client = player.index;
if( !IsPlayerAlive(client) || !IsTemplate(player) )
return;
/// run speed based on health code.
player.SpeedThink(340.0);
/// run glow timer code (was shot by sniper rifle).
player.GlowThink(0.1);
/// allow superjump if right clicking and enough power.
if( player.SuperJumpThink(2.5, 25.0) ) {
player.PlayVoiceClip(TemplateJump[GetRandomInt(0, sizeof(TemplateJump)-1)], VSH2_VOICE_ABILITY);
/// player.SuperJump will reset "flCharge" back to 0.0
player.SuperJump(player.GetPropFloat("flCharge"), -100.0);
}
/// increase rage if only scouts left.
if( OnlyScoutsLeft(VSH2Team_Red) )
player.SetPropFloat("flRAGE", player.GetPropFloat("flRAGE") + g_vsh2_cvars.scout_rage_gen.FloatValue);
/// run weighdown ability code.
player.WeighDownThink(2.0, 0.1);
/// hud code
SetHudTextParams(-1.0, 0.77, 0.35, 255, 255, 255, 255);
Handle hud = vsh2_gm.hHUD;
float jmp = player.GetPropFloat("flCharge");
float rage = player.GetPropFloat("flRAGE");
if( rage >= 100.0 )
ShowSyncHudText(client, hud, "Jump: %i%% | Rage: FULL - Call Medic (default: E) to activate", player.GetPropInt("bSuperCharge") ? 1000 : RoundFloat(jmp) * 4);
else ShowSyncHudText(client, hud, "Jump: %i%% | Rage: %0.1f", player.GetPropInt("bSuperCharge") ? 1000 : RoundFloat(jmp) * 4, rage);
}