Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion addons/sourcemod/configs/vsh/vsh.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -823,7 +823,7 @@
"Tags_AddAttrib"
{
"target" "primary" //Primary weapon
"index" "6" //Faster firing rate
"index" "394" //Faster firing rate (hidden)
"value" "0.1" //10x faster firing speed
"duration" "5.0" //After 5 sec, remove attrib
}
Expand Down Expand Up @@ -1579,6 +1579,11 @@
{
"prefab" "239"
}

"1100" //Bread Bite
{
"prefab" "239"
}

"43" //Killing Gloves of Boxing
{
Expand Down
40 changes: 33 additions & 7 deletions addons/sourcemod/scripting/vsh/bosses/boss_graymann.sp
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,18 @@
#define GRAYMANN_DEMOMINION "models/bots/demo_boss/bot_demo_boss.mdl"
#define GRAYMANN_PYROMINION "models/bots/pyro_boss/bot_pyro_boss.mdl"

#define GRAYMANN_GIANTROCKETSOUND "mvm/giant_soldier/giant_soldier_rocket_shoot.wav"
#define GRAYMANN_GIANTCRITROCKETSOUND "mvm/giant_soldier/giant_soldier_rocket_shoot_crit.wav"
#define GRAYMANN_GIANTGRENADESOUND "mvm/giant_demoman/giant_demoman_grenade_shoot.wav"
#define GRAYMANN_GIANTROCKETSOUND ")mvm/giant_soldier/giant_soldier_rocket_shoot.wav"
#define GRAYMANN_GIANTCRITROCKETSOUND ")mvm/giant_soldier/giant_soldier_rocket_shoot_crit.wav"
#define GRAYMANN_GIANTGRENADESOUND ")mvm/giant_demoman/giant_demoman_grenade_shoot.wav"

#define GRAYMANN_GIANTDESTROYEDSOUND "MVM.GiantCommonExplodes"

#define GRAYMANN_MAX_GIANT_GIBS 4
#define GRAYMANN_GIANT_ROBOT_SCALE 1.5

#define GRAYMANN_RAGE_DURATION 8.0
#define GRAYMANN_SUPERRAGE_DURATION_MULT 2.0

enum
{
GRAYMANN_QUEUE_CAN_SPAWN,
Expand All @@ -35,6 +38,8 @@ static bool g_bGrayMannMinionIsPlayingSoundLoop[MAXPLAYERS + 1];

static bool g_bGrayMannMinionBlockRagdoll;

static bool g_bGrayMannSpeedRage[MAXPLAYERS + 1];

static char g_strGrayMannRoundStart[][] = {
"vsh_rewrite/graymann/intro1.mp3",
"vsh_rewrite/graymann/intro2.mp3",
Expand Down Expand Up @@ -129,8 +134,11 @@ public void GrayMann_Create(SaxtonHaleBase boss)
{
boss.CreateClass("BraveJump");
boss.SetPropFloat("BraveJump", "MaxHeight", boss.GetPropFloat("BraveJump", "MaxHeight") * 0.50);

boss.CreateClass("RageAddCond");
boss.SetPropFloat("RageAddCond", "RageCondDuration", 8.0);
boss.SetPropFloat("RageAddCond", "RageCondDuration", GRAYMANN_RAGE_DURATION);
boss.SetPropFloat("RageAddCond", "RageCondSuperRageMultiplier", GRAYMANN_SUPERRAGE_DURATION_MULT);

RageAddCond_AddCond(boss, TFCond_DefenseBuffed);
RageAddCond_AddCond(boss, TFCond_SpeedBuffAlly);

Expand Down Expand Up @@ -163,8 +171,12 @@ public void GrayMann_GetBossInfo(SaxtonHaleBase boss, char[] sInfo, int length)
StrCat(sInfo, length, "\n ");
StrCat(sInfo, length, "\nRage");
StrCat(sInfo, length, "\n- Damage requirement: 3000");
StrCat(sInfo, length, "\n- Faster movement speed");
StrCat(sInfo, length, "\n- Damage resistance with crit immunity");
StrCat(sInfo, length, "\n- Spawn a random giant robot");
StrCat(sInfo, length, "\n- 200%% Rage: Spawn 2 random giant robots");
StrCat(sInfo, length, "\n- 200%% Rage:");
StrCat(sInfo, length, "\n - Increases duration from 8 to 16 seconds");
StrCat(sInfo, length, "\n - Spawn 2 random giant robots");
}

public void GrayMann_GetModel(SaxtonHaleBase boss, char[] sModel, int length)
Expand All @@ -174,6 +186,12 @@ public void GrayMann_GetModel(SaxtonHaleBase boss, char[] sModel, int length)

public void GrayMann_OnRage(SaxtonHaleBase boss)
{
if (!g_bGrayMannSpeedRage[boss.iClient])
{
boss.flSpeed *= 1.3;
g_bGrayMannSpeedRage[boss.iClient] = true;
}

int iTotalSummons = 1;
if (boss.bSuperRage) iTotalSummons = 2;

Expand All @@ -192,9 +210,8 @@ public void GrayMann_OnSpawn(SaxtonHaleBase boss)
Format(attribs, sizeof(attribs), "2 ; 2.80 ; 252 ; 0.5 ; 259 ; 1.0 ; 150 ; 1.0 ; 180 ; 250");
iWeapon = boss.CallFunction("CreateWeapon", 169, "tf_weapon_wrench", 100, TFQual_Unusual, attribs);
if (iWeapon > MaxClients)
{
SetEntPropEnt(boss.iClient, Prop_Send, "m_hActiveWeapon", iWeapon);
}

/*
wrench attributes:

Expand All @@ -206,6 +223,15 @@ public void GrayMann_OnSpawn(SaxtonHaleBase boss)
*/
}

public void GrayMann_OnThink(SaxtonHaleBase boss)
{
if (g_bGrayMannSpeedRage[boss.iClient] && boss.flRageLastTime < GetGameTime() - (boss.bSuperRage ? GRAYMANN_RAGE_DURATION * GRAYMANN_SUPERRAGE_DURATION_MULT : GRAYMANN_RAGE_DURATION))
{
g_bGrayMannSpeedRage[boss.iClient] = false;
boss.flSpeed /= 1.3;
}
}

public void GrayMann_OnEntityCreated(SaxtonHaleBase boss, int iEntity, const char[] sClassname)
{
if (g_bGrayMannMinionBlockRagdoll && StrEqual(sClassname, "tf_ragdoll"))
Expand Down
93 changes: 65 additions & 28 deletions addons/sourcemod/scripting/vsh/bosses/boss_uberranger.sp
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
#define RANGER_MODEL "models/player/vsh_rewrite/uber_ranger/uber_ranger_v2.mdl"
#define RANGER_THEME "vsh_rewrite/uber_ranger/uberrangers_music.mp3"
#define RANGER_RAGESOUND "mvm/mvm_tele_deliver.wav"
#define RANGER_MODEL "models/player/vsh_rewrite/uber_ranger/uber_ranger_v2.mdl"
#define RANGER_THEME "vsh_rewrite/uber_ranger/uberrangers_music.mp3"

static int g_iUberRangerMinionAFKTimeLeft[MAXPLAYERS];
#define RANGER_RAGESOUND "player/taunt_medic_heroic.wav"
#define RANGER_RAGESOUND_FAILED "replay/replaydialog_warn.wav"

static bool g_bUberRangerHasSwappedWeapons[MAXPLAYERS + 1];

static int g_iUberRangerMinionAFKTimeLeft[MAXPLAYERS + 1];

static ArrayList g_aUberRangerColorList;

static Handle g_hUberRangerMinionAFKTimer[MAXPLAYERS];
static Handle g_hUberRangerMinionAFKTimer[MAXPLAYERS + 1];

static bool g_bUberRangerPlayerWasSummoned[MAXPLAYERS];
static bool g_bUberRangerMinionHasMoved[MAXPLAYERS];
static bool g_bUberRangerPlayerWasSummoned[MAXPLAYERS + 1];
static bool g_bUberRangerMinionHasMoved[MAXPLAYERS + 1];

static char g_strUberRangerRoundStart[][] = {
"vo/medic_battlecry05.mp3"
Expand Down Expand Up @@ -63,6 +67,8 @@ public void UberRanger_Create(SaxtonHaleBase boss)
boss.nClass = TFClass_Medic;
boss.iMaxRageDamage = 2500;

g_bUberRangerHasSwappedWeapons[boss.iClient] = false;

for (int i = 1; i <= MaxClients; i++)
g_bUberRangerPlayerWasSummoned[i] = false;

Expand Down Expand Up @@ -94,7 +100,9 @@ public void UberRanger_OnSpawn(SaxtonHaleBase boss)
{
char sAttribs[64];
strcopy(sAttribs, sizeof(sAttribs), "9 ; 0.4");
boss.CallFunction("CreateWeapon", 211, "tf_weapon_medigun", 100, TFQual_Collectors, sAttribs);
int iWeapon = boss.CallFunction("CreateWeapon", 211, "tf_weapon_medigun", 100, TFQual_Collectors, sAttribs);
if (iWeapon > MaxClients)
TF2_SwitchToWeapon(boss.iClient, iWeapon);

/*
Medigun attribute:
Expand All @@ -103,9 +111,7 @@ public void UberRanger_OnSpawn(SaxtonHaleBase boss)
*/

strcopy(sAttribs, sizeof(sAttribs), "2 ; 2.80 ; 17 ; 0.1 ; 69 ; 0.5 ; 252 ; 0.5 ; 259 ; 1.0");
int iWeapon = boss.CallFunction("CreateWeapon", 37, "tf_weapon_bonesaw", 100, TFQual_Collectors, sAttribs);
if (iWeapon > MaxClients)
SetEntPropEnt(boss.iClient, Prop_Send, "m_hActiveWeapon", iWeapon);
boss.CallFunction("CreateWeapon", 37, "tf_weapon_bonesaw", 100, TFQual_Collectors, sAttribs);

/*
Ubersaw attributes:
Expand All @@ -131,33 +137,64 @@ public void UberRanger_GetModel(SaxtonHaleBase boss, char[] sModel, int length)
strcopy(sModel, length, RANGER_MODEL);
}

public void UberRanger_OnThink(SaxtonHaleBase boss)
{
// Switch to melee when the round starts. This is to let players know that they have a medi gun
if (!g_bUberRangerHasSwappedWeapons[boss.iClient] && GameRules_GetRoundState() != RoundState_Preround)
{
g_bUberRangerHasSwappedWeapons[boss.iClient] = true;
int iMelee = GetPlayerWeaponSlot(boss.iClient, TFWeaponSlot_Melee);
if (iMelee != INVALID_ENT_REFERENCE && GetEntPropEnt(boss.iClient, Prop_Send, "m_hActiveWeapon") != iMelee)
TF2_SwitchToWeapon(boss.iClient, iMelee);
}
}

public void UberRanger_OnRage(SaxtonHaleBase boss)
{
int iTotalSummons = 1;
if (boss.bSuperRage) iTotalSummons = 3;

//Create a lil effect
float vecBossPos[3];
GetClientAbsOrigin(boss.iClient, vecBossPos);
CreateTimer(3.0, Timer_EntityCleanup, TF2_SpawnParticle(TF2_GetClientTeam(boss.iClient) == TFTeam_Blue ? "teleportedin_blue" : "teleportedin_red", vecBossPos));
EmitSoundToAll(RANGER_RAGESOUND, boss.iClient);
if (boss.bSuperRage)
iTotalSummons = 3;

ArrayList aValidMinions = GetValidSummonableClients();
char sMessage[64];
int iSpawns;

int iLength = aValidMinions.Length;
if (iLength < iTotalSummons)
iTotalSummons = iLength;
else
if (iLength > iTotalSummons)
iLength = iTotalSummons;
//Give priority to players who have the highest scores

// Give priority to players who have the highest scores
for (int iSelection = 0; iSelection < iLength; iSelection++)
{
//Spawn and teleport the minion to the boss
// Spawn and teleport the minion to the boss
int iClient = UberRanger_SpawnBestPlayer(aValidMinions);

if (iClient > 0)
if (iClient > 0)
{
TF2_TeleportToClient(iClient, boss.iClient);
iSpawns++;
}
}

if (iSpawns > 0)
{
// Create a lil effect
float vecBossPos[3];
GetClientAbsOrigin(boss.iClient, vecBossPos);
CreateTimer(3.0, Timer_EntityCleanup, TF2_SpawnParticle(TF2_GetClientTeam(boss.iClient) == TFTeam_Blue ? "teleportedin_blue" : "teleportedin_red", vecBossPos));
EmitSoundToAll(RANGER_RAGESOUND, boss.iClient);

FormatEx(sMessage, sizeof(sMessage), "Summoned %d Ranger%s.", iSpawns, iSpawns == 1 ? "" : "s");
ShowTFGameTextToClient(boss.iClient, sMessage, "leaderboard_dominated");
}
else
{
if (GetURandomFloat() >= 0.05)
sMessage = "No players could be summoned.";
else
sMessage = "But nobody came.";

ShowTFGameTextToClient(boss.iClient, sMessage, "dneg_reddefend");
EmitSoundToClient(boss.iClient, RANGER_RAGESOUND_FAILED);
}

delete aValidMinions;
Expand Down Expand Up @@ -190,14 +227,15 @@ public void UberRanger_GetMusicInfo(SaxtonHaleBase boss, char[] sSound, int leng

public void UberRanger_GetHudInfo(SaxtonHaleBase boss, char[] sMessage, int iLength, int iColor[4])
{
StrCat(sMessage, iLength, "\nUse your Medigun to heal your companions!");
StrCat(sMessage, iLength, "\nUse your Medi Gun to heal your companions!");
}

public void UberRanger_Precache(SaxtonHaleBase boss)
{
PrecacheModel(RANGER_MODEL);
PrepareMusic(RANGER_THEME);
PrecacheSound(RANGER_RAGESOUND);
PrecacheSound(RANGER_RAGESOUND_FAILED);

for (int i = 0; i < sizeof(g_strUberRangerRoundStart); i++) PrecacheSound(g_strUberRangerRoundStart[i]);
for (int i = 0; i < sizeof(g_strUberRangerWin); i++) PrecacheSound(g_strUberRangerWin[i]);
Expand Down Expand Up @@ -374,7 +412,6 @@ public void UberRanger_ResetColorList()
g_aUberRangerColorList.PushArray({ 255, 115, 200 }); // Pink as Hell (modified)
g_aUberRangerColorList.PushArray({ 105, 77, 58 }); // Radigan Conagher Brown (modified)
g_aUberRangerColorList.PushArray({ 88, 160, 187 }); // Team Spirit (BLU) (modified)
g_aUberRangerColorList.PushArray({ 210, 59, 59 }); // Team Spirit (RED) (modified)
g_aUberRangerColorList.PushArray({ 50, 205, 50 }); // The Bitter Taste of Defeat and Lime
g_aUberRangerColorList.PushArray({ 79, 100, 59 }); // Zepheniah's Greed (modified)

Expand Down
14 changes: 14 additions & 0 deletions addons/sourcemod/scripting/vsh/stocks.sp
Original file line number Diff line number Diff line change
Expand Up @@ -1137,4 +1137,18 @@ stock void DelayNextWeaponAttack(int iWeapon, float flDelay)
float flNextAttack = GetGameTime() + flDelay;
SetEntPropFloat(iWeapon, Prop_Send, "m_flNextPrimaryAttack", flNextAttack);
SetEntPropFloat(iWeapon, Prop_Send, "m_flNextSecondaryAttack", flNextAttack);
}

stock void ShowTFGameTextToClient(int iClient, const char[] sMessage, const char[] sIcon = "", TFTeam nTeam = TFTeam_Unassigned, float flDuration = 3.0)
{
BfWrite bf = view_as<BfWrite>(StartMessageOne("HudNotifyCustom", iClient));
if (bf)
{
bf.WriteString(sMessage);
bf.WriteString(sIcon);
bf.WriteByte(view_as<int>(nTeam)); // This is just the team color to show
bf.WriteFloat(flDuration); // Doesn't actually do anything! It'll always last 3 seconds

EndMessage();
}
}