Skip to content

Commit

Permalink
WIP particle effect instead of recolor for modifiers
Browse files Browse the repository at this point in the history
  • Loading branch information
FortyTwoFortyTwo committed Jun 10, 2024
1 parent b2801bb commit 0348b84
Show file tree
Hide file tree
Showing 12 changed files with 164 additions and 6 deletions.
3 changes: 3 additions & 0 deletions addons/sourcemod/scripting/saxtonhale.sp
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,9 @@ public void OnPluginStart()
func = SaxtonHaleFunction("GetRenderColor", ET_Ignore, Param_Array);
func.SetParam(1, Param_Array, VSHArrayType_Static, 4);

func = SaxtonHaleFunction("GetParticleEffect", ET_Ignore, Param_String, Param_Cell);
func.SetParam(1, Param_String, VSHArrayType_Dynamic, 2);

func = SaxtonHaleFunction("GetMusicInfo", ET_Ignore, Param_String, Param_Cell, Param_FloatByRef);
func.SetParam(1, Param_String, VSHArrayType_Dynamic, 2);

Expand Down
112 changes: 108 additions & 4 deletions addons/sourcemod/scripting/vsh/base_boss.sp
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#define EFFECT_CLASSNAME "info_particle_system" // Any cheap ent that allows SetTransmit

static char g_sClientBossRageMusic[MAXPLAYERS][255];

static float g_flClientBossRageMusicVolume[MAXPLAYERS];
Expand Down Expand Up @@ -145,9 +147,8 @@ public void SaxtonHaleBoss_OnSpawn(SaxtonHaleBase boss)
boss.iHealth = iHealth;
}

int iColor[4] = {255, 255, 255, 255};
boss.CallFunction("GetRenderColor", iColor);
SetEntityRenderColor(boss.iClient, iColor[0], iColor[1], iColor[2], iColor[3]);
ClearBossEffects(boss.iClient);
RequestFrame(ApplyBossEffects, boss.iClient);

boss.CallFunction("UpdateHudInfo", 0.0, 0.01); //Update after frame when boss have all weapons equipped
}
Expand Down Expand Up @@ -355,7 +356,7 @@ public void SaxtonHaleBoss_UpdateHudInfo(SaxtonHaleBase boss, float flinterval,

public void SaxtonHaleBoss_Destroy(SaxtonHaleBase boss)
{
SetEntityRenderColor(boss.iClient, 255, 255, 255, 255);
ClearBossEffects(boss.iClient);

SetVariantString("");
AcceptEntityInput(boss.iClient, "SetCustomModel");
Expand Down Expand Up @@ -426,3 +427,106 @@ public Action Timer_BossRageMusic(Handle hTimer, SaxtonHaleBase boss)

return Plugin_Continue;
}

Action AttachEnt_SetTransmit(int iAttachEnt, int iClient)
{
int iOwner = GetEntPropEnt(iAttachEnt, Prop_Data, "m_pParent");
if (iOwner == INVALID_ENT_REFERENCE)
return Plugin_Stop;

if (TF2_IsPlayerInCondition(iOwner, TFCond_Cloaked) || TF2_IsPlayerInCondition(iOwner, TFCond_Disguised) || TF2_IsPlayerInCondition(iOwner, TFCond_Stealthed))
return Plugin_Stop;

if (iOwner != iClient || TF2_IsPlayerInCondition(iOwner, TFCond_Taunting))
return Plugin_Continue;

return Plugin_Stop;
}

void ApplyBossEffects(SaxtonHaleBase boss)
{
// TODO multiple effects
char sEffect[PLATFORM_MAX_PATH];
boss.CallFunction("GetParticleEffect", sEffect, sizeof(sEffect));
if (sEffect[0])
{
PrecacheParticleSystem(sEffect); // TODO needed?

float vecOrigin[3], vecAngles[3];
GetClientAbsOrigin(boss.iClient, vecOrigin);
GetClientAbsAngles(boss.iClient, vecAngles);

// GetEntityAttachment(boss.iClient, LookupEntityAttachment(boss.iClient, "head"), vecOrigin, vecAngles);

// vecOrigin[0] += 2.0;
// vecOrigin[2] -= 2.0;

vecAngles[1] -= 90.0;
int iEntity = TF2_SpawnParticle(sEffect, .vecOrigin = vecOrigin, .vecAngles = vecAngles, .iEntity = boss.iClient, .sAttachmentOffset = "partyhat");

/* int iEntity = CreateEntityByName(EFFECT_CLASSNAME);
// TeleportEntity(iEntity, vecPos, NULL_VECTOR, NULL_VECTOR);
SetVariantString("!activator");
AcceptEntityInput(iEntity, "SetParent", boss.iClient);
SetVariantString("head");
AcceptEntityInput(iEntity, "SetParentAttachment");
//AcceptEntityInput(iEntity, "SetParentAttachmentMaintainOffset");
DispatchSpawn(iEntity);
// Always transmit so it can render properly
SetEdictFlags(iEntity, GetEdictFlags(iEntity)|FL_EDICT_ALWAYS);
*/
/* TE_Particle(.iParticleIndex = iParticleIndex,
// .origin = vecPos,
.entindex = iEntity,
.attachtype = PATTACH_ABSORIGIN_FOLLOW,
.client = iClient );
*/
/* TE_Start("TFParticleEffect");
TE_WriteFloat("m_vecOrigin[0]", origin[0]);
TE_WriteFloat("m_vecOrigin[1]", origin[1]);
TE_WriteFloat("m_vecOrigin[2]", origin[2]);
TE_WriteFloat("m_vecStart[0]", start[0]);
TE_WriteFloat("m_vecStart[1]", start[1]);
TE_WriteFloat("m_vecStart[2]", start[2]);
TE_WriteVector("m_vecAngles", angles);
TE_WriteNum("m_iParticleSystemIndex", iParticleIndex);
TE_WriteNum("entindex", entindex);
if (attachtype != PATTACH_INVALID)
{
TE_WriteNum("m_iAttachType", view_as<int>(attachtype));
}
if (attachpoint != -1)
{
TE_WriteNum("m_iAttachmentPointIndex", attachpoint);
}
TE_WriteNum("m_bResetParticles", resetParticles ? 1 : 0);
TE_SendToAll();
*/
SDKHook(iEntity, SDKHook_SetTransmit, AttachEnt_SetTransmit);
}
}

void ClearBossEffects(int iClient)
{
int iEntity = INVALID_ENT_REFERENCE;
while ((iEntity = FindEntityByClassname(iEntity, EFFECT_CLASSNAME)) != INVALID_ENT_REFERENCE)
{
if (GetEntPropEnt(iEntity, Prop_Data, "m_pParent") != iClient)
continue;

SetVariantString("ParticleEffectStop");
AcceptEntityInput(iEntity, "DispatchEffect");
AcceptEntityInput(iEntity, "ClearParent");

//Some particles don't get removed properly, teleport far away then delete it
const float flCrazyBigNumber = 8192.00; // 2^13
float vecPos[3] = {flCrazyBigNumber, flCrazyBigNumber, flCrazyBigNumber};
TeleportEntity(iEntity, vecPos);

CreateTimer(0.5, Timer_EntityCleanup, EntIndexToEntRef(iEntity)); //Give enough time for effect to fade out before getting destroyed
}
}
5 changes: 5 additions & 0 deletions addons/sourcemod/scripting/vsh/modifiers/modifiers_angry.sp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ public void ModifiersAngry_GetRenderColor(SaxtonHaleBase boss, int iColor[4])
iColor[3] = 255;
}

public void ModifiersAngry_GetParticleEffect(SaxtonHaleBase boss, char[] sEffect, int length)
{
strcopy(sEffect, length, "unusual_star_parent");
}

public void ModifiersAngry_OnThink(SaxtonHaleBase boss)
{
if (g_flClientAngryLastTime[boss.iClient] <= GetGameTime() - 0.02) //50 dmg per second
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ public void ModifiersElectric_GetRenderColor(SaxtonHaleBase boss, int iColor[4])
iColor[3] = 255;
}

public void ModifiersElectric_GetParticleEffect(SaxtonHaleBase boss, char[] sEffect, int length)
{
strcopy(sEffect, length, "utaunt_electricity_discharge");
}

public Action ModifiersElectric_OnAttackDamage(SaxtonHaleBase boss, int victim, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3], int damagecustom)
{
if (damage < 3.0 || g_bElectricDamage[victim] || TF2_IsUbercharged(victim))
Expand Down
5 changes: 5 additions & 0 deletions addons/sourcemod/scripting/vsh/modifiers/modifiers_hot.sp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ public void ModifiersHot_GetRenderColor(SaxtonHaleBase boss, int iColor[4])
iColor[3] = 255;
}

public void ModifiersHot_GetParticleEffect(SaxtonHaleBase boss, char[] sEffect, int length)
{
strcopy(sEffect, length, "unusual_firefly_teamcolor_red");
}

public void ModifiersHot_OnThink(SaxtonHaleBase boss)
{
int iTeam = GetClientTeam(boss.iClient);
Expand Down
5 changes: 5 additions & 0 deletions addons/sourcemod/scripting/vsh/modifiers/modifiers_ice.sp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ public void ModifiersIce_GetRenderColor(SaxtonHaleBase boss, int iColor[4])
iColor[3] = 255;
}

public void ModifiersIce_GetParticleEffect(SaxtonHaleBase boss, char[] sEffect, int length)
{
strcopy(sEffect, length, "utaunt_ice_snowflakes");
}

public void ModifiersIce_OnDeath(SaxtonHaleBase boss, Event event)
{
g_bIceRagdoll = true;
Expand Down
5 changes: 5 additions & 0 deletions addons/sourcemod/scripting/vsh/modifiers/modifiers_jumper.sp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ public void ModifiersJumper_GetRenderColor(SaxtonHaleBase boss, int iColor[4])
iColor[3] = 255;
}

public void ModifiersJumper_GetParticleEffect(SaxtonHaleBase boss, char[] sEffect, int length)
{
strcopy(sEffect, length, "utaunt_snowring_icy_wind");
}

public void ModifiersJumper_OnButtonPress(SaxtonHaleBase boss, int iButton)
{
if (GameRules_GetRoundState() == RoundState_Preround)
Expand Down
5 changes: 5 additions & 0 deletions addons/sourcemod/scripting/vsh/modifiers/modifiers_magnet.sp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ public void ModifiersMagnet_GetRenderColor(SaxtonHaleBase boss, int iColor[4])
iColor[3] = 255;
}

public void ModifiersMagnet_GetParticleEffect(SaxtonHaleBase boss, char[] sEffect, int length)
{
strcopy(sEffect, length, "");
}

public void ModifiersMagnet_OnThink(SaxtonHaleBase boss)
{
if (!IsPlayerAlive(boss.iClient))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,8 @@ public void ModifiersOverload_GetRenderColor(SaxtonHaleBase boss, int iColor[4])
iColor[2] = 0;
iColor[3] = 255;
}

public void ModifiersOverload_GetParticleEffect(SaxtonHaleBase boss, char[] sEffect, int length)
{
strcopy(sEffect, length, "unusual_circling_spell_orange_parent");
}
5 changes: 5 additions & 0 deletions addons/sourcemod/scripting/vsh/modifiers/modifiers_speed.sp
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,8 @@ public void ModifiersSpeed_GetRenderColor(SaxtonHaleBase boss, int iColor[4])
iColor[2] = 144;
iColor[3] = 255;
}

public void ModifiersSpeed_GetParticleEffect(SaxtonHaleBase boss, char[] sEffect, int length)
{
strcopy(sEffect, length, "unusual_demonhorns_green_parent");
}
5 changes: 5 additions & 0 deletions addons/sourcemod/scripting/vsh/modifiers/modifiers_vampire.sp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ public void ModifiersVampire_GetRenderColor(SaxtonHaleBase boss, int iColor[4])
iColor[3] = 255;
}

public void ModifiersVampire_GetParticleEffect(SaxtonHaleBase boss, char[] sEffect, int length)
{
strcopy(sEffect, length, "unusual_bats_flaming_proxy_purple");
}

public void ModifiersVampire_OnThink(SaxtonHaleBase boss)
{
if (GameRules_GetRoundState() != RoundState_Preround && IsPlayerAlive(boss.iClient))
Expand Down
10 changes: 8 additions & 2 deletions addons/sourcemod/scripting/vsh/stocks.sp
Original file line number Diff line number Diff line change
Expand Up @@ -710,10 +710,10 @@ stock void TF2_Shake(float vecOrigin[3], float flAmplitude, float flRadius, floa
}
}

stock int TF2_SpawnParticle(char[] sParticle, float vecOrigin[3] = NULL_VECTOR, float flAngles[3] = NULL_VECTOR, bool bActivate = true, int iEntity = 0, int iControlPoint = 0, const char[] sAttachment = "")
stock int TF2_SpawnParticle(char[] sParticle, float vecOrigin[3] = NULL_VECTOR, float vecAngles[3] = NULL_VECTOR, bool bActivate = true, int iEntity = 0, int iControlPoint = 0, const char[] sAttachment = "", const char[] sAttachmentOffset = "")
{
int iParticle = CreateEntityByName("info_particle_system");
TeleportEntity(iParticle, vecOrigin, flAngles, NULL_VECTOR);
TeleportEntity(iParticle, vecOrigin, vecAngles, NULL_VECTOR);
DispatchKeyValue(iParticle, "effect_name", sParticle);
DispatchSpawn(iParticle);

Expand All @@ -727,6 +727,12 @@ stock int TF2_SpawnParticle(char[] sParticle, float vecOrigin[3] = NULL_VECTOR,
SetVariantString(sAttachment);
AcceptEntityInput(iParticle, "SetParentAttachment", iParticle);
}

if (sAttachmentOffset[0])
{
SetVariantString(sAttachmentOffset);
AcceptEntityInput(iParticle, "SetParentAttachmentMaintainOffset", iParticle);
}
}

if (0 < iControlPoint && IsValidEntity(iControlPoint))
Expand Down

0 comments on commit 0348b84

Please sign in to comment.