From ba22823951803418465221374d2f40e065a1c400 Mon Sep 17 00:00:00 2001 From: x07x08 <88050465+x07x08@users.noreply.github.com> Date: Sat, 24 Dec 2022 18:09:07 +0200 Subject: [PATCH] Update 1.2.0 Update the config for the Smismass 2022 update Added an optional taunt ID argument to the taunt command --- .../sourcemod/configs/econtaunts/taunts.cfg | 75 ++- addons/sourcemod/plugins/TF2EconTaunts.smx | Bin 15313 -> 15655 bytes addons/sourcemod/scripting/TF2EconTaunts.sp | 481 +++++++++--------- 3 files changed, 308 insertions(+), 248 deletions(-) diff --git a/addons/sourcemod/configs/econtaunts/taunts.cfg b/addons/sourcemod/configs/econtaunts/taunts.cfg index e09cc55..d488b2d 100644 --- a/addons/sourcemod/configs/econtaunts/taunts.cfg +++ b/addons/sourcemod/configs/econtaunts/taunts.cfg @@ -1,21 +1,23 @@ // "EconTaunts" - do not change it at all // Possible keyvalues for each particle attribute ID : // -// "disabled" - blocks the unusual taunt (a 1 or a 0) +// "disabled" - blocks the unusual taunt (a 1 or a 0) // -// "refire interval" - emits the particle again every set amount of time (in seconds) +// "refire interval" - emits the particle again every set amount of time (in seconds) // -// "use particle system" - uses an info_particle_system instead of the default "tf_wearable + tempent" combo (a 1 or a 0); -// might be better in some (or most) cases, but it does not seem to fix particle leftovers +// "use particle system" - uses an info_particle_system instead of the default "tf_wearable + tempent" combo (a 1 or a 0); +// might be better in some (or most) cases, but it does not seem to fix particle leftovers // // The refire intervals have been taken from "items_game.txt" ("taunt_unusual_effects" section) // -// For now, only one of 2 issue will give a taunt the "disabled" keyvalue : +// For now, only one of these issues will give a taunt the "disabled" keyvalue : // -// Bad parenting - the taunt particle will move alongside the player instead of being motionless; -// this is likely happening because of not having the "EF_BONEMERGE_FASTCULL" flag in the tf_wearble entity (to fix positioning issues) +// Bad parenting - the taunt particle will move alongside the player instead of being motionless; +// this is likely happening because of not having the "EF_BONEMERGE_FASTCULL" flag in the tf_wearble entity (to fix positioning issues) // -// Particle leftovers - the particle is not fully stopped; might be caused by the particle itself +// Particle leftovers - the particle is not fully stopped; might be caused by the particle itself +// +// Visual inconsistencies - any visual bugs that might happen to the particle; might be caused by the particle itself // // Change anything only if you know what you are doing. Stuff might break @@ -135,4 +137,59 @@ { "disabled" "1" // Bad parenting } -} \ No newline at end of file + + "3090" + { + "disabled" "1" // Particle leftovers + } + + "3091" + { + "disabled" "1" // 3090 clone + } + + "3092" + { + "disabled" "1" // 3091 clone + } + + "3098" + { + "use particle system" "1" // Since no particles are attached to the bones of the player, this one is fixable + } + + "3099" + { + "use particle system" "1" // 3098 clone + } + + "3108" + { + "disabled" "1" // Bad parenting + } + + "3109" + { + "disabled" "1" // 3108 clone + } + + "3110" + { + "disabled" "1" // 3109 clone + } + + "3111" + { + "disabled" "1" // 3110 clone + } + + "3112" + { + "disabled" "1" // 3111 clone + } + + "3113" + { + "disabled" "1" // The particles are too big for some reason (visual inconsistency) + } +} diff --git a/addons/sourcemod/plugins/TF2EconTaunts.smx b/addons/sourcemod/plugins/TF2EconTaunts.smx index bfc1981698877ed6dd56db96bedc29d795f465ed..cb401ef4075f79ffbec964253edaae863aadc214 100644 GIT binary patch literal 15655 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 1) { - int iTauntIndex = hTauntList.Get(iEntry); - IntToString(iTauntIndex, strTauntIndex, sizeof(strTauntIndex)); + GetCmdArg(1, strTauntIndex, sizeof(strTauntIndex)); + + int iTauntIndex = StringToInt(strTauntIndex); - TF2Econ_GetItemName(iTauntIndex, strTauntName, sizeof(strTauntName)); - hMenu.AddItem(strTauntIndex, strTauntName, ITEMDRAW_DEFAULT); + if (FilterTaunts(iTauntIndex, TF2_GetPlayerClass(iClient))) + { + PlayTaunt(iClient, iTauntIndex); + } + else + { + ReplyToCommand(iClient, "[SM] Invalid taunt index"); + } + } + else + { + Menu hMenu = new Menu(TauntMenuHandler); + hMenu.SetTitle("Taunts :"); + + ArrayList hTauntList = TF2Econ_GetItemList(FilterTaunts, TF2_GetPlayerClass(iClient)); + int iTauntListSize = hTauntList.Length; + + char strTauntName[64]; + + for (int iEntry = 0; iEntry < iTauntListSize; iEntry++) + { + int iTauntIndex = hTauntList.Get(iEntry); + IntToString(iTauntIndex, strTauntIndex, sizeof(strTauntIndex)); + + TF2Econ_GetItemName(iTauntIndex, strTauntName, sizeof(strTauntName)); + + Format(strTauntName, sizeof(strTauntName), "%s (%i)", strTauntName, iTauntIndex); + + hMenu.AddItem(strTauntIndex, strTauntName, ITEMDRAW_DEFAULT); + } + + hMenu.Display(iClient, MENU_TIME_FOREVER); + + delete hTauntList; } - - hMenu.Display(iClient, MENU_TIME_FOREVER); - - delete hTauntList; return Plugin_Handled; } public int TauntMenuHandler(Menu hMenu, MenuAction iMenuActions, int iParam1, int iParam2) { - switch(iMenuActions) + switch (iMenuActions) { case MenuAction_Select : { @@ -213,9 +239,7 @@ public int TauntMenuHandler(Menu hMenu, MenuAction iMenuActions, int iParam1, in public bool FilterTaunts(int iItemDefIndex, TFClassType iClass) { - int iTauntSlot = TF2Econ_TranslateLoadoutSlotNameToIndex("taunt"); - - return TF2Econ_GetItemLoadoutSlot(iItemDefIndex, iClass) == iTauntSlot; + return TF2Econ_GetItemLoadoutSlot(iItemDefIndex, iClass) == TF2Econ_TranslateLoadoutSlotNameToIndex("taunt"); } public Action CmdUnusualTauntsMenu(int iClient, int iArgs) @@ -282,7 +306,7 @@ public Action CmdRefreshConfig(int iClient, int iArgs) public int UnusualTauntsMenuHandler(Menu hMenu, MenuAction iMenuActions, int iParam1, int iParam2) { - switch(iMenuActions) + switch (iMenuActions) { case MenuAction_Select : { @@ -315,6 +339,7 @@ public int UnusualTauntsMenuHandler(Menu hMenu, MenuAction iMenuActions, int iPa bool PlayTaunt(int iClient, int iTauntIndex) { int iEntity = MakeCEIVEnt(iClient, iTauntIndex); + if (!IsValidEntity(iEntity)) { ReplyToCommand(iClient, "[SM] Couldn't create entity for taunt"); @@ -323,27 +348,23 @@ bool PlayTaunt(int iClient, int iTauntIndex) } int iCEIVOffset = GetEntSendPropOffs(iEntity, "m_Item", true); + if (iCEIVOffset <= 0) { ReplyToCommand(iClient, "[SM] Couldn't find m_Item for taunt item"); - if (iEntity && IsValidEntity(iEntity)) - { - RemoveEntity(iEntity); - } + RemoveEntity(iEntity); return false; } Address pEconItemView = GetEntityAddress(iEntity); + if (!IsValidAddress(pEconItemView)) { ReplyToCommand(iClient, "[SM] Couldn't find entity address for taunt item"); - if (iEntity && IsValidEntity(iEntity)) - { - RemoveEntity(iEntity); - } + RemoveEntity(iEntity); return false; } @@ -354,15 +375,12 @@ bool PlayTaunt(int iClient, int iTauntIndex) { ReplyToCommand(iClient, "[SM] Couldn't play taunt"); - if (iEntity && IsValidEntity(iEntity)) - { - RemoveEntity(iEntity); - } + RemoveEntity(iEntity); return false; } - RemoveEntity(iEntity); // The entity should be valid if the taunt succeeded + RemoveEntity(iEntity); return true; } @@ -376,23 +394,22 @@ stock int MakeCEIVEnt(int iClient, int iItemDef) { int iWearable = CreateEntityByName("tf_wearable"); - if (IsValidEntity(iWearable)) + if (!IsValidEntity(iWearable)) return iWearable; + + SetEntProp(iWearable, Prop_Send, "m_iItemDefinitionIndex", iItemDef); + + if (iItemDef != DEFINDEX_UNDEFINED) { - SetEntProp(iWearable, Prop_Send, "m_iItemDefinitionIndex", iItemDef); - - if (iItemDef != DEFINDEX_UNDEFINED) - { - // using defindex of a valid item - SetEntProp(iWearable, Prop_Send, "m_bInitialized", 1); - SetEntProp(iWearable, Prop_Send, "m_iEntityLevel", 1); - // Something about m_iEntityQuality doesn't play nice with SetEntProp. - SetEntData(iWearable, FindSendPropInfo("CTFWearable", "m_iEntityQuality"), 6); - } - - // Spawn. - DispatchSpawn(iWearable); + // using defindex of a valid item + SetEntProp(iWearable, Prop_Send, "m_bInitialized", 1); + SetEntProp(iWearable, Prop_Send, "m_iEntityLevel", 1); + // Something about m_iEntityQuality doesn't play nice with SetEntProp. + SetEntData(iWearable, FindSendPropInfo("CTFWearable", "m_iEntityQuality"), 6); } + // Spawn. + DispatchSpawn(iWearable); + return iWearable; } @@ -408,23 +425,22 @@ void ParseTauntConfig() char strFilePath[PLATFORM_MAX_PATH]; BuildPath(Path_SM, strFilePath, sizeof(strFilePath), "configs/econtaunts/taunts.cfg"); - if (FileExists(strFilePath, true)) + if (!FileExists(strFilePath, true)) return; + + KeyValues kvTauntConfig = new KeyValues("EconTaunts"); + + if (kvTauntConfig.ImportFromFile(strFilePath) && kvTauntConfig.GotoFirstSubKey()) { - KeyValues kvTauntConfig = new KeyValues("EconTaunts"); + g_hUnusualTauntsList = new ArrayList(sizeof(UnusualTauntConfig)); - if (kvTauntConfig.ImportFromFile(strFilePath) && kvTauntConfig.GotoFirstSubKey()) + do { - g_hUnusualTauntsList = new ArrayList(sizeof(UnusualTauntConfig)); - - do - { - ParseUnusualTaunt(kvTauntConfig); - } - while (kvTauntConfig.GotoNextKey()); + ParseUnusualTaunt(kvTauntConfig); } - - delete kvTauntConfig; + while (kvTauntConfig.GotoNextKey()); } + + delete kvTauntConfig; } void ParseUnusualTaunt(KeyValues kvConfig) @@ -436,23 +452,22 @@ void ParseUnusualTaunt(KeyValues kvConfig) do { - if (kvConfig.GetSectionName(strUnusualTauntIndex, sizeof(strUnusualTauntIndex))) - { - iTauntIndex = StringToInt(strUnusualTauntIndex); - if (iTauntIndex > 0 && !IsUnusualTauntAdded(iTauntIndex)) - { - UnusualTauntConfig UnusualTaunt; - - UnusualTaunt.ParticleIndex = iTauntIndex; - UnusualTaunt.RefireInterval = kvConfig.GetFloat("refire interval", 0.0); - UnusualTaunt.Disabled = !!kvConfig.GetNum("disabled", 0); - UnusualTaunt.UseParticleSystem = !!kvConfig.GetNum("use particle system", 0); - - g_hUnusualTauntsList.PushArray(UnusualTaunt); - } - } + if (!kvConfig.GetSectionName(strUnusualTauntIndex, sizeof(strUnusualTauntIndex)) || + !StringToIntEx(strUnusualTauntIndex, iTauntIndex)) continue; + + if (IsUnusualTauntAdded(iTauntIndex)) continue; + + UnusualTauntConfig UnusualTaunt; + + UnusualTaunt.ParticleIndex = iTauntIndex; + UnusualTaunt.RefireInterval = kvConfig.GetFloat("refire interval", 0.0); + UnusualTaunt.Disabled = !!kvConfig.GetNum("disabled", 0); + UnusualTaunt.UseParticleSystem = !!kvConfig.GetNum("use particle system", 0); + + g_hUnusualTauntsList.PushArray(UnusualTaunt); } while (kvConfig.GotoNextKey()); + kvConfig.GoBack(); } @@ -461,13 +476,12 @@ bool IsUnusualTauntAdded(int iTauntIndex) UnusualTauntConfig UnusualTaunt; int iArrayIndex = g_hUnusualTauntsList.FindValue(iTauntIndex, 0); - if (iArrayIndex != -1) + + if ((iArrayIndex != -1) && (g_hUnusualTauntsList.GetArray(iArrayIndex, UnusualTaunt) > 0)) { - if (g_hUnusualTauntsList.GetArray(iArrayIndex, UnusualTaunt) > 0) - { - LogMessage("Taunt Index : %i found twice, skipping.", UnusualTaunt.ParticleIndex); - return true; - } + LogMessage("Taunt Index : %i found twice, skipping.", UnusualTaunt.ParticleIndex); + + return true; } return false; @@ -475,39 +489,41 @@ bool IsUnusualTauntAdded(int iTauntIndex) public void TF2_OnConditionAdded(int iClient, TFCond iCondition) { - if (iCondition == TFCond_Taunting) + if (iCondition != TFCond_Taunting) return; + + // https://forums.alliedmods.net/showthread.php?p=2359106 + if (!g_hCvarDefaultTaunts.BoolValue && (GetEntProp(iClient, Prop_Send, "m_iTauntItemDefIndex") == -1)) return; + + int iParticleIndex = g_iClientParticleIndex[iClient]; + + if (iParticleIndex == 0) return; + + UnusualTauntConfig UnusualTaunt; + bool bParticleSystem = false; + + int iUnusualConfigIndex = g_hUnusualTauntsList == null ? -1 : g_hUnusualTauntsList.FindValue(iParticleIndex, 0); + + if (iUnusualConfigIndex != -1) + { + g_hUnusualTauntsList.GetArray(iUnusualConfigIndex, UnusualTaunt); + bParticleSystem = UnusualTaunt.UseParticleSystem; + } + + int iParticleEntity = CreateAttachedParticle(iClient, iParticleIndex); + + if (!(bParticleSystem ? IsValidEdict(iParticleEntity) : IsValidEntity(iParticleEntity))) return; + + if (UnusualTaunt.RefireInterval > 0 && !bParticleSystem) { - int iParticleIndex = g_iClientParticleIndex[iClient]; + DataPack hTauntDataPack = new DataPack(); + hTauntDataPack.WriteCell(GetClientUserId(iClient)); + hTauntDataPack.WriteCell(iParticleIndex); + hTauntDataPack.WriteCell(EntIndexToEntRef(iParticleEntity)); - if (iParticleIndex != 0) - { - UnusualTauntConfig UnusualTaunt; - bool bParticleSystem = false; - - int iUnusualConfigIndex = g_hUnusualTauntsList == null ? -1 : g_hUnusualTauntsList.FindValue(iParticleIndex, 0); - if (iUnusualConfigIndex != -1) - { - g_hUnusualTauntsList.GetArray(iUnusualConfigIndex, UnusualTaunt); - bParticleSystem = UnusualTaunt.UseParticleSystem; - } - - int iParticleEntity = CreateAttachedParticle(iClient, iParticleIndex); - if (bParticleSystem ? IsValidEdict(iParticleEntity) : IsValidEntity(iParticleEntity)) - { - if (UnusualTaunt.RefireInterval > 0 && !bParticleSystem) - { - DataPack hTauntDataPack = new DataPack(); - hTauntDataPack.WriteCell(GetClientUserId(iClient)); - hTauntDataPack.WriteCell(iParticleIndex); - hTauntDataPack.WriteCell(EntIndexToEntRef(iParticleEntity)); - - CreateTimer(UnusualTaunt.RefireInterval, RefireTauntParticle, hTauntDataPack, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE | TIMER_DATA_HNDL_CLOSE); - } - - g_iClientParticleEntity[iClient] = EntIndexToEntRef(iParticleEntity); - } - } + CreateTimer(UnusualTaunt.RefireInterval, RefireTauntParticle, hTauntDataPack, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE | TIMER_DATA_HNDL_CLOSE); } + + g_iClientParticleEntity[iClient] = EntIndexToEntRef(iParticleEntity); } public Action RefireTauntParticle(Handle hTimer, DataPack hTauntDataPack) @@ -538,29 +554,28 @@ public Action RefireTauntParticle(Handle hTimer, DataPack hTauntDataPack) public void TF2_OnConditionRemoved(int iClient, TFCond iCondition) { - if (iCondition == TFCond_Taunting) + if (iCondition != TFCond_Taunting) return; + + int iParticleEntity = EntRefToEntIndex(g_iClientParticleEntity[iClient]); + + if (iParticleEntity == -1) return; + + char strEntityClassname[64]; GetEntityClassname(iParticleEntity, strEntityClassname, sizeof(strEntityClassname)); + + if (StrEqual(strEntityClassname, "info_particle_system")) { - int iParticleEntity = EntRefToEntIndex(g_iClientParticleEntity[iClient]); - if (iParticleEntity != -1) + if (IsValidEdict(iParticleEntity)) { - char strEntityClassname[64]; GetEntityClassname(iParticleEntity, strEntityClassname, sizeof(strEntityClassname)); - - if (StrEqual(strEntityClassname, "info_particle_system")) - { - if (IsValidEdict(iParticleEntity)) - { - RemoveEdict(iParticleEntity); - g_iClientParticleEntity[iClient] = -1; - } - } - else - { - if (IsValidEntity(iParticleEntity)) - { - RemoveEntity(iParticleEntity); - g_iClientParticleEntity[iClient] = -1; - } - } + RemoveEdict(iParticleEntity); + g_iClientParticleEntity[iClient] = -1; + } + } + else + { + if (IsValidEntity(iParticleEntity)) + { + RemoveEntity(iParticleEntity); + g_iClientParticleEntity[iClient] = -1; } } } @@ -576,6 +591,7 @@ stock int CreateAttachedParticle(int iClient, int iParticleIndex) bool bParticleSystem = false; int iUnusualConfigIndex = g_hUnusualTauntsList == null ? -1 : g_hUnusualTauntsList.FindValue(iParticleIndex, 0); + if (iUnusualConfigIndex != -1) { g_hUnusualTauntsList.GetArray(iUnusualConfigIndex, UnusualTaunt); @@ -585,70 +601,70 @@ stock int CreateAttachedParticle(int iClient, int iParticleIndex) // I just guessed it, nothing else int iEntity = CreateEntityByName(bParticleSystem ? "info_particle_system" : "tf_wearable"); - if (bParticleSystem ? IsValidEdict(iEntity) : IsValidEntity(iEntity)) + if (!(bParticleSystem ? IsValidEdict(iEntity) : IsValidEntity(iEntity))) return iEntity; + + float fPosition[3]; + GetEntPropVector(iClient, Prop_Send, "m_vecOrigin", fPosition); + TeleportEntity(iEntity, fPosition, NULL_VECTOR, NULL_VECTOR); + + char strEffectName[PLATFORM_MAX_PATH]; + + if (!TF2Econ_GetParticleAttributeSystemName(iParticleIndex, strEffectName, sizeof(strEffectName))) { - float fPosition[3]; - GetEntPropVector(iClient, Prop_Send, "m_vecOrigin", fPosition); - TeleportEntity(iEntity, fPosition, NULL_VECTOR, NULL_VECTOR); + LogError("Failed to get the system name of the particle attribute index. Removing entity."); - char strEffectName[PLATFORM_MAX_PATH]; + bParticleSystem ? RemoveEdict(iEntity) : RemoveEntity(iEntity); - if (!TF2Econ_GetParticleAttributeSystemName(iParticleIndex, strEffectName, sizeof(strEffectName))) - { - LogError("Failed to get the system name of the particle attribute index. Removing entity."); - - bParticleSystem ? RemoveEdict(iEntity) : RemoveEntity(iEntity); - return -1; - } + return -1; + } + + if (!bParticleSystem) + { + DispatchSpawn(iEntity); - if (!bParticleSystem) - { - DispatchSpawn(iEntity); - - // EF_BONEMERGE_FASTCULL moves the entity in an undesired position (in the middle of the client) - // Also setting all these netprops before dispatching spawn resets them for some reason - SetEntProp(iEntity, Prop_Send, "m_fEffects", EF_BONEMERGE | EF_NOSHADOW | EF_PARENT_ANIMATES | EF_NODRAW | EF_NORECEIVESHADOW); - SetEntProp(iEntity, Prop_Send, "m_CollisionGroup", 0); // COLLISION_GROUP_NONE - SetEntProp(iEntity, Prop_Send, "m_usSolidFlags", 0x0004); // FSOLID_NOT_SOLID - SetEntProp(iEntity, Prop_Send, "m_nSolidType", 0); // SOLID_NONE - SetEntProp(iEntity, Prop_Send, "m_bValidatedAttachedEntity", 1); // Visibility - - char strModelName[PLATFORM_MAX_PATH]; - GetEntPropString(iClient, Prop_Data, "m_ModelName", strModelName, sizeof(strModelName)); - SetEntityModel(iEntity, strModelName); - - SetVariantString("!activator"); - AcceptEntityInput(iEntity, "SetParent", iClient, iEntity); - - CreateTempParticle(strEffectName, fPosition, _, _, iEntity, PATTACH_ABSORIGIN_FOLLOW, _, _); - - TE_SendToAll(); - } - else + // EF_BONEMERGE_FASTCULL moves the entity in an undesired position (in the middle of the client) + // Also setting all these netprops before dispatching spawn resets them for some reason + SetEntProp(iEntity, Prop_Send, "m_fEffects", EF_BONEMERGE | EF_NOSHADOW | EF_PARENT_ANIMATES | EF_NODRAW | EF_NORECEIVESHADOW); + SetEntProp(iEntity, Prop_Send, "m_CollisionGroup", 0); // COLLISION_GROUP_NONE + SetEntProp(iEntity, Prop_Send, "m_usSolidFlags", 0x0004); // FSOLID_NOT_SOLID + SetEntProp(iEntity, Prop_Send, "m_nSolidType", 0); // SOLID_NONE + SetEntProp(iEntity, Prop_Send, "m_bValidatedAttachedEntity", 1); // Visibility + + char strModelName[PLATFORM_MAX_PATH]; + GetEntPropString(iClient, Prop_Data, "m_ModelName", strModelName, sizeof(strModelName)); + SetEntityModel(iEntity, strModelName); + + SetVariantString("!activator"); + AcceptEntityInput(iEntity, "SetParent", iClient, iEntity); + + CreateTempParticle(strEffectName, fPosition, _, _, iEntity, PATTACH_ABSORIGIN_FOLLOW, _, _); + + TE_SendToAll(); + } + else + { + DispatchKeyValue(iEntity, "effect_name", strEffectName); + DispatchSpawn(iEntity); + ActivateEntity(iEntity); + + SetVariantString("!activator"); + AcceptEntityInput(iEntity, "SetParent", iClient, iEntity); + + AcceptEntityInput(iEntity, "Start"); + + if (UnusualTaunt.RefireInterval > 0) { - DispatchKeyValue(iEntity, "effect_name", strEffectName); - DispatchSpawn(iEntity); - ActivateEntity(iEntity); - - SetVariantString("!activator"); - AcceptEntityInput(iEntity, "SetParent", iClient, iEntity); - - AcceptEntityInput(iEntity, "Start"); - - if (UnusualTaunt.RefireInterval > 0) - { - char strBuffer[64]; - FormatEx(strBuffer, sizeof(strBuffer), "OnUser1 !self:Stop::%f:-1", UnusualTaunt.RefireInterval); - SetVariantString(strBuffer); - AcceptEntityInput(iEntity, "AddOutput"); - FormatEx(strBuffer, sizeof(strBuffer), "OnUser1 !self:Start::%f:-1", UnusualTaunt.RefireInterval + GetConVarFloat(g_hCvarVariation)); - SetVariantString(strBuffer); - AcceptEntityInput(iEntity, "AddOutput"); - FormatEx(strBuffer, sizeof(strBuffer), "OnUser1 !self:FireUser1::%f:-1", UnusualTaunt.RefireInterval); - SetVariantString(strBuffer); - AcceptEntityInput(iEntity, "AddOutput"); - AcceptEntityInput(iEntity, "FireUser1"); - } + char strBuffer[64]; + FormatEx(strBuffer, sizeof(strBuffer), "OnUser1 !self:Stop::%f:-1", UnusualTaunt.RefireInterval); + SetVariantString(strBuffer); + AcceptEntityInput(iEntity, "AddOutput"); + FormatEx(strBuffer, sizeof(strBuffer), "OnUser1 !self:Start::%f:-1", UnusualTaunt.RefireInterval + GetConVarFloat(g_hCvarVariation)); + SetVariantString(strBuffer); + AcceptEntityInput(iEntity, "AddOutput"); + FormatEx(strBuffer, sizeof(strBuffer), "OnUser1 !self:FireUser1::%f:-1", UnusualTaunt.RefireInterval); + SetVariantString(strBuffer); + AcceptEntityInput(iEntity, "AddOutput"); + AcceptEntityInput(iEntity, "FireUser1"); } } @@ -667,16 +683,20 @@ stock void CreateTempParticle(const char[] strParticle, int iParticleTable, iParticleIndex; iParticleTable = FindStringTable("ParticleEffectNames"); + if (iParticleTable == INVALID_STRING_TABLE) { ThrowError("Could not find string table: ParticleEffectNames"); } iParticleIndex = FindStringIndex(iParticleTable, strParticle); + if (iParticleIndex == INVALID_STRING_INDEX) { LogError("Could not find particle index: %s. Trying to precache it now.", strParticle); - iParticleIndex = PrecacheParticleSystem(strParticle); + + iParticleIndex = GetPrecachedParticle(strParticle); + if (iParticleIndex == INVALID_STRING_INDEX) { ThrowError("Could not find particle index: %s", strParticle); @@ -711,50 +731,32 @@ stock void CreateTempParticle(const char[] strParticle, TE_WriteNum("m_bResetParticles", bResetParticles ? 1 : 0); } -stock int PrecacheParticleSystem(const char[] strParticleSystem) +stock int GetPrecachedParticle(const char[] strParticleSystem) { static int iParticleEffectNames = INVALID_STRING_TABLE; - if (iParticleEffectNames == INVALID_STRING_TABLE) + if ((iParticleEffectNames == INVALID_STRING_TABLE) && + ((iParticleEffectNames = FindStringTable("ParticleEffectNames")) == INVALID_STRING_TABLE)) { - if ((iParticleEffectNames = FindStringTable("ParticleEffectNames")) == INVALID_STRING_TABLE) - { - return INVALID_STRING_INDEX; - } + return INVALID_STRING_INDEX; } - int iIndex = FindStringIndex2(iParticleEffectNames, strParticleSystem); - if (iIndex == INVALID_STRING_INDEX) + int iParticleIndex = FindStringIndex(iParticleEffectNames, strParticleSystem); + + if (iParticleIndex == INVALID_STRING_INDEX) { int iNumStrings = GetStringTableNumStrings(iParticleEffectNames); + if (iNumStrings >= GetStringTableMaxStrings(iParticleEffectNames)) { return INVALID_STRING_INDEX; } AddToStringTable(iParticleEffectNames, strParticleSystem); - iIndex = iNumStrings; - } - - return iIndex; -} - -stock int FindStringIndex2(int iTableIndex, const char[] strString) -{ - char strBuffer[1024]; - - int iNumStrings = GetStringTableNumStrings(iTableIndex); - for (int iIndex = 0; iIndex < iNumStrings; iIndex++) - { - ReadStringTable(iTableIndex, iIndex, strBuffer, sizeof(strBuffer)); - - if (StrEqual(strBuffer, strString)) - { - return iIndex; - } + iParticleIndex = iNumStrings; } - return INVALID_STRING_INDEX; + return iParticleIndex; } /* @@ -767,6 +769,7 @@ bool LocalizeToken(const char[] strToken, char[] strOutput, int strMaxLen) if(g_hTokensMap == null) { LogError("Unable to localize token for server language!"); + return false; } else @@ -862,4 +865,4 @@ void HandleLangLine(char[] strLine, StringMap hLang) { hLang.SetString(strToken, strValue); } -} \ No newline at end of file +}