Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
1 change: 1 addition & 0 deletions extensions/tf2/AMBuilder
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ if 'tf2' in SM.sdks:
'teleporter.cpp',
'gameplayrules.cpp',
'conditions.cpp',
'constmanager.cpp',
'../../public/smsdk_ext.cpp'
]
binary.compiler.defines += ['HAVE_STRING_H']
Expand Down
180 changes: 180 additions & 0 deletions extensions/tf2/constmanager.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
#include "constmanager.h"
#include <steam/steamclientpublic.h>
class CTakeDamageInfo;
#define TF_MATCHMAKING_SHARED_H
#include <tf/tf_shareddefs.h>
#include <tier1/utlmap.h>
#include <econ/econ_item_constants.h>

template<typename T>
inline void PopulateVar(IPluginRuntime* runtime, const char* name, T value)
{
uint32_t idx;
if (runtime->FindPubvarByName(name, &idx) != SP_ERROR_NONE)
{
return;
}
sp_pubvar_t* var;
runtime->GetPubvarByIndex(idx, &var);
*var->offs = static_cast<cell_t>(value);
}

void ConstManager::OnPluginLoaded(IPlugin* plugin)
{
auto* runtime = plugin->GetRuntime();
PopulateVar(runtime, "TF_COND_INVALID", TF_COND_INVALID);
PopulateVar(runtime, "TF_COND_AIMING", TF_COND_AIMING);
PopulateVar(runtime, "TF_COND_ZOOMED", TF_COND_ZOOMED);
PopulateVar(runtime, "TF_COND_DISGUISING", TF_COND_DISGUISING);
PopulateVar(runtime, "TF_COND_DISGUISED", TF_COND_DISGUISED);
PopulateVar(runtime, "TF_COND_STEALTHED", TF_COND_STEALTHED);
PopulateVar(runtime, "TF_COND_INVULNERABLE", TF_COND_INVULNERABLE);
PopulateVar(runtime, "TF_COND_TELEPORTED", TF_COND_TELEPORTED);
PopulateVar(runtime, "TF_COND_TAUNTING", TF_COND_TAUNTING);
PopulateVar(runtime, "TF_COND_INVULNERABLE_WEARINGOFF", TF_COND_INVULNERABLE_WEARINGOFF);
PopulateVar(runtime, "TF_COND_STEALTHED_BLINK", TF_COND_STEALTHED_BLINK);
PopulateVar(runtime, "TF_COND_SELECTED_TO_TELEPORT", TF_COND_SELECTED_TO_TELEPORT);
PopulateVar(runtime, "TF_COND_CRITBOOSTED", TF_COND_CRITBOOSTED);
PopulateVar(runtime, "TF_COND_TMPDAMAGEBONUS", TF_COND_TMPDAMAGEBONUS);
PopulateVar(runtime, "TF_COND_FEIGN_DEATH", TF_COND_FEIGN_DEATH);
PopulateVar(runtime, "TF_COND_PHASE", TF_COND_PHASE);
PopulateVar(runtime, "TF_COND_STUNNED", TF_COND_STUNNED);
PopulateVar(runtime, "TF_COND_OFFENSEBUFF", TF_COND_OFFENSEBUFF);
PopulateVar(runtime, "TF_COND_SHIELD_CHARGE", TF_COND_SHIELD_CHARGE);
PopulateVar(runtime, "TF_COND_DEMO_BUFF", TF_COND_DEMO_BUFF);
PopulateVar(runtime, "TF_COND_ENERGY_BUFF", TF_COND_ENERGY_BUFF);
PopulateVar(runtime, "TF_COND_RADIUSHEAL", TF_COND_RADIUSHEAL);
PopulateVar(runtime, "TF_COND_HEALTH_BUFF", TF_COND_HEALTH_BUFF);
PopulateVar(runtime, "TF_COND_BURNING", TF_COND_BURNING);
PopulateVar(runtime, "TF_COND_HEALTH_OVERHEALED", TF_COND_HEALTH_OVERHEALED);
PopulateVar(runtime, "TF_COND_URINE", TF_COND_URINE);
PopulateVar(runtime, "TF_COND_BLEEDING", TF_COND_BLEEDING);
PopulateVar(runtime, "TF_COND_DEFENSEBUFF", TF_COND_DEFENSEBUFF);
PopulateVar(runtime, "TF_COND_MAD_MILK", TF_COND_MAD_MILK);
PopulateVar(runtime, "TF_COND_MEGAHEAL", TF_COND_MEGAHEAL);
PopulateVar(runtime, "TF_COND_REGENONDAMAGEBUFF", TF_COND_REGENONDAMAGEBUFF);
PopulateVar(runtime, "TF_COND_MARKEDFORDEATH", TF_COND_MARKEDFORDEATH);
PopulateVar(runtime, "TF_COND_NOHEALINGDAMAGEBUFF", TF_COND_NOHEALINGDAMAGEBUFF);
PopulateVar(runtime, "TF_COND_SPEED_BOOST", TF_COND_SPEED_BOOST);
PopulateVar(runtime, "TF_COND_CRITBOOSTED_PUMPKIN", TF_COND_CRITBOOSTED_PUMPKIN);
PopulateVar(runtime, "TF_COND_CRITBOOSTED_USER_BUFF", TF_COND_CRITBOOSTED_USER_BUFF);
PopulateVar(runtime, "TF_COND_CRITBOOSTED_DEMO_CHARGE", TF_COND_CRITBOOSTED_DEMO_CHARGE);
PopulateVar(runtime, "TF_COND_SODAPOPPER_HYPE", TF_COND_SODAPOPPER_HYPE);
PopulateVar(runtime, "TF_COND_CRITBOOSTED_FIRST_BLOOD", TF_COND_CRITBOOSTED_FIRST_BLOOD);
PopulateVar(runtime, "TF_COND_CRITBOOSTED_BONUS_TIME", TF_COND_CRITBOOSTED_BONUS_TIME);
PopulateVar(runtime, "TF_COND_CRITBOOSTED_CTF_CAPTURE", TF_COND_CRITBOOSTED_CTF_CAPTURE);
PopulateVar(runtime, "TF_COND_CRITBOOSTED_ON_KILL", TF_COND_CRITBOOSTED_ON_KILL);
PopulateVar(runtime, "TF_COND_CANNOT_SWITCH_FROM_MELEE", TF_COND_CANNOT_SWITCH_FROM_MELEE);
PopulateVar(runtime, "TF_COND_DEFENSEBUFF_NO_CRIT_BLOCK", TF_COND_DEFENSEBUFF_NO_CRIT_BLOCK);
PopulateVar(runtime, "TF_COND_REPROGRAMMED", TF_COND_REPROGRAMMED);
PopulateVar(runtime, "TF_COND_CRITBOOSTED_RAGE_BUFF", TF_COND_CRITBOOSTED_RAGE_BUFF);
PopulateVar(runtime, "TF_COND_DEFENSEBUFF_HIGH", TF_COND_DEFENSEBUFF_HIGH);
PopulateVar(runtime, "TF_COND_SNIPERCHARGE_RAGE_BUFF", TF_COND_SNIPERCHARGE_RAGE_BUFF);
PopulateVar(runtime, "TF_COND_DISGUISE_WEARINGOFF", TF_COND_DISGUISE_WEARINGOFF);
PopulateVar(runtime, "TF_COND_MARKEDFORDEATH_SILENT", TF_COND_MARKEDFORDEATH_SILENT);
PopulateVar(runtime, "TF_COND_DISGUISED_AS_DISPENSER", TF_COND_DISGUISED_AS_DISPENSER);
PopulateVar(runtime, "TF_COND_SAPPED", TF_COND_SAPPED);
PopulateVar(runtime, "TF_COND_INVULNERABLE_HIDE_UNLESS_DAMAGED", TF_COND_INVULNERABLE_HIDE_UNLESS_DAMAGED);
PopulateVar(runtime, "TF_COND_INVULNERABLE_USER_BUFF", TF_COND_INVULNERABLE_USER_BUFF);
PopulateVar(runtime, "TF_COND_HALLOWEEN_BOMB_HEAD", TF_COND_HALLOWEEN_BOMB_HEAD);
PopulateVar(runtime, "TF_COND_HALLOWEEN_THRILLER", TF_COND_HALLOWEEN_THRILLER);
PopulateVar(runtime, "TF_COND_RADIUSHEAL_ON_DAMAGE", TF_COND_RADIUSHEAL_ON_DAMAGE);
PopulateVar(runtime, "TF_COND_CRITBOOSTED_CARD_EFFECT", TF_COND_CRITBOOSTED_CARD_EFFECT);
PopulateVar(runtime, "TF_COND_INVULNERABLE_CARD_EFFECT", TF_COND_INVULNERABLE_CARD_EFFECT);
PopulateVar(runtime, "TF_COND_MEDIGUN_UBER_BULLET_RESIST", TF_COND_MEDIGUN_UBER_BULLET_RESIST);
PopulateVar(runtime, "TF_COND_MEDIGUN_UBER_BLAST_RESIST", TF_COND_MEDIGUN_UBER_BLAST_RESIST);
PopulateVar(runtime, "TF_COND_MEDIGUN_UBER_FIRE_RESIST", TF_COND_MEDIGUN_UBER_FIRE_RESIST);
PopulateVar(runtime, "TF_COND_MEDIGUN_SMALL_BULLET_RESIST", TF_COND_MEDIGUN_SMALL_BULLET_RESIST);
PopulateVar(runtime, "TF_COND_MEDIGUN_SMALL_BLAST_RESIST", TF_COND_MEDIGUN_SMALL_BLAST_RESIST);
PopulateVar(runtime, "TF_COND_MEDIGUN_SMALL_FIRE_RESIST", TF_COND_MEDIGUN_SMALL_FIRE_RESIST);
PopulateVar(runtime, "TF_COND_STEALTHED_USER_BUFF", TF_COND_STEALTHED_USER_BUFF);
PopulateVar(runtime, "TF_COND_MEDIGUN_DEBUFF", TF_COND_MEDIGUN_DEBUFF);
PopulateVar(runtime, "TF_COND_STEALTHED_USER_BUFF_FADING", TF_COND_STEALTHED_USER_BUFF_FADING);
PopulateVar(runtime, "TF_COND_BULLET_IMMUNE", TF_COND_BULLET_IMMUNE);
PopulateVar(runtime, "TF_COND_BLAST_IMMUNE", TF_COND_BLAST_IMMUNE);
PopulateVar(runtime, "TF_COND_FIRE_IMMUNE", TF_COND_FIRE_IMMUNE);
PopulateVar(runtime, "TF_COND_PREVENT_DEATH", TF_COND_PREVENT_DEATH);
PopulateVar(runtime, "TF_COND_MVM_BOT_STUN_RADIOWAVE", TF_COND_MVM_BOT_STUN_RADIOWAVE);
PopulateVar(runtime, "TF_COND_HALLOWEEN_SPEED_BOOST", TF_COND_HALLOWEEN_SPEED_BOOST);
PopulateVar(runtime, "TF_COND_HALLOWEEN_QUICK_HEAL", TF_COND_HALLOWEEN_QUICK_HEAL);
PopulateVar(runtime, "TF_COND_HALLOWEEN_GIANT", TF_COND_HALLOWEEN_GIANT);
PopulateVar(runtime, "TF_COND_HALLOWEEN_TINY", TF_COND_HALLOWEEN_TINY);
PopulateVar(runtime, "TF_COND_HALLOWEEN_IN_HELL", TF_COND_HALLOWEEN_IN_HELL);
PopulateVar(runtime, "TF_COND_HALLOWEEN_GHOST_MODE", TF_COND_HALLOWEEN_GHOST_MODE);
PopulateVar(runtime, "TF_COND_MINICRITBOOSTED_ON_KILL", TF_COND_MINICRITBOOSTED_ON_KILL);
PopulateVar(runtime, "TF_COND_OBSCURED_SMOKE", TF_COND_OBSCURED_SMOKE);
PopulateVar(runtime, "TF_COND_PARACHUTE_ACTIVE", TF_COND_PARACHUTE_ACTIVE);
PopulateVar(runtime, "TF_COND_BLASTJUMPING", TF_COND_BLASTJUMPING);
PopulateVar(runtime, "TF_COND_HALLOWEEN_KART", TF_COND_HALLOWEEN_KART);
PopulateVar(runtime, "TF_COND_HALLOWEEN_KART_DASH", TF_COND_HALLOWEEN_KART_DASH);
PopulateVar(runtime, "TF_COND_BALLOON_HEAD", TF_COND_BALLOON_HEAD);
PopulateVar(runtime, "TF_COND_MELEE_ONLY", TF_COND_MELEE_ONLY);
PopulateVar(runtime, "TF_COND_SWIMMING_CURSE", TF_COND_SWIMMING_CURSE);
PopulateVar(runtime, "TF_COND_FREEZE_INPUT", TF_COND_FREEZE_INPUT);
PopulateVar(runtime, "TF_COND_HALLOWEEN_KART_CAGE", TF_COND_HALLOWEEN_KART_CAGE);
PopulateVar(runtime, "TF_COND_RUNE_STRENGTH", TF_COND_RUNE_STRENGTH);
PopulateVar(runtime, "TF_COND_RUNE_HASTE", TF_COND_RUNE_HASTE);
PopulateVar(runtime, "TF_COND_RUNE_REGEN", TF_COND_RUNE_REGEN);
PopulateVar(runtime, "TF_COND_RUNE_RESIST", TF_COND_RUNE_RESIST);
PopulateVar(runtime, "TF_COND_RUNE_VAMPIRE", TF_COND_RUNE_VAMPIRE);
PopulateVar(runtime, "TF_COND_RUNE_REFLECT", TF_COND_RUNE_REFLECT);
PopulateVar(runtime, "TF_COND_RUNE_PRECISION", TF_COND_RUNE_PRECISION);
PopulateVar(runtime, "TF_COND_RUNE_AGILITY", TF_COND_RUNE_AGILITY);
PopulateVar(runtime, "TF_COND_GRAPPLINGHOOK", TF_COND_GRAPPLINGHOOK);
PopulateVar(runtime, "TF_COND_GRAPPLINGHOOK_SAFEFALL", TF_COND_GRAPPLINGHOOK_SAFEFALL);
PopulateVar(runtime, "TF_COND_GRAPPLINGHOOK_LATCHED", TF_COND_GRAPPLINGHOOK_LATCHED);
PopulateVar(runtime, "TF_COND_GRAPPLINGHOOK_BLEEDING", TF_COND_GRAPPLINGHOOK_BLEEDING);
PopulateVar(runtime, "TF_COND_AFTERBURN_IMMUNE", TF_COND_AFTERBURN_IMMUNE);
PopulateVar(runtime, "TF_COND_RUNE_KNOCKOUT", TF_COND_RUNE_KNOCKOUT);
PopulateVar(runtime, "TF_COND_RUNE_IMBALANCE", TF_COND_RUNE_IMBALANCE);
PopulateVar(runtime, "TF_COND_CRITBOOSTED_RUNE_TEMP", TF_COND_CRITBOOSTED_RUNE_TEMP);
PopulateVar(runtime, "TF_COND_PASSTIME_INTERCEPTION", TF_COND_PASSTIME_INTERCEPTION);
PopulateVar(runtime, "TF_COND_SWIMMING_NO_EFFECTS", TF_COND_SWIMMING_NO_EFFECTS);
PopulateVar(runtime, "TF_COND_PURGATORY", TF_COND_PURGATORY);
PopulateVar(runtime, "TF_COND_RUNE_KING", TF_COND_RUNE_KING);
PopulateVar(runtime, "TF_COND_RUNE_PLAGUE", TF_COND_RUNE_PLAGUE);
PopulateVar(runtime, "TF_COND_RUNE_SUPERNOVA", TF_COND_RUNE_SUPERNOVA);
PopulateVar(runtime, "TF_COND_PLAGUE", TF_COND_PLAGUE);
PopulateVar(runtime, "TF_COND_KING_BUFFED", TF_COND_KING_BUFFED);
PopulateVar(runtime, "TF_COND_TEAM_GLOWS", TF_COND_TEAM_GLOWS);
PopulateVar(runtime, "TF_COND_KNOCKED_INTO_AIR", TF_COND_KNOCKED_INTO_AIR);
PopulateVar(runtime, "TF_COND_COMPETITIVE_WINNER", TF_COND_COMPETITIVE_WINNER);
PopulateVar(runtime, "TF_COND_COMPETITIVE_LOSER", TF_COND_COMPETITIVE_LOSER);
PopulateVar(runtime, "TF_COND_HEALING_DEBUFF", TF_COND_HEALING_DEBUFF);
PopulateVar(runtime, "TF_COND_PASSTIME_PENALTY_DEBUFF", TF_COND_PASSTIME_PENALTY_DEBUFF);
PopulateVar(runtime, "TF_COND_GRAPPLED_TO_PLAYER", TF_COND_GRAPPLED_TO_PLAYER);
PopulateVar(runtime, "TF_COND_GRAPPLED_BY_PLAYER", TF_COND_GRAPPLED_BY_PLAYER);
PopulateVar(runtime, "TF_COND_PARACHUTE_DEPLOYED", TF_COND_PARACHUTE_DEPLOYED);
PopulateVar(runtime, "TF_COND_GAS", TF_COND_GAS);
PopulateVar(runtime, "TF_COND_BURNING_PYRO", TF_COND_BURNING_PYRO);
PopulateVar(runtime, "TF_COND_ROCKETPACK", TF_COND_ROCKETPACK);
PopulateVar(runtime, "TF_COND_LOST_FOOTING", TF_COND_LOST_FOOTING);
PopulateVar(runtime, "TF_COND_AIR_CURRENT", TF_COND_AIR_CURRENT);
PopulateVar(runtime, "TF_COND_HALLOWEEN_HELL_HEAL", TF_COND_HALLOWEEN_HELL_HEAL);
PopulateVar(runtime, "TF_COND_POWERUPMODE_DOMINANT", TF_COND_POWERUPMODE_DOMINANT);
PopulateVar(runtime, "TF_COND_IMMUNE_TO_PUSHBACK", TF_COND_IMMUNE_TO_PUSHBACK);
PopulateVar(runtime, "TF_COND_LAST", TF_COND_LAST);

PopulateVar(runtime, "TFHoliday_Birthday", kHoliday_TFBirthday);
PopulateVar(runtime, "TFHoliday_Halloween", kHoliday_Halloween);
PopulateVar(runtime, "TFHoliday_Christmas", kHoliday_Christmas);
PopulateVar(runtime, "TFHoliday_CommunityUpdate", kHoliday_CommunityUpdate);
PopulateVar(runtime, "TFHoliday_EndOfTheLine", kHoliday_EOTL);
PopulateVar(runtime, "TFHoliday_ValentinesDay", kHoliday_Valentines);
PopulateVar(runtime, "TFHoliday_MeetThePyro", kHoliday_MeetThePyro);
PopulateVar(runtime, "TFHoliday_FullMoon", kHoliday_FullMoon);
PopulateVar(runtime, "TFHoliday_HalloweenOrFullMoon", kHoliday_HalloweenOrFullMoon);
PopulateVar(runtime, "TFHoliday_HalloweenOrFullMoonOrValentines", kHoliday_HalloweenOrFullMoonOrValentines);
PopulateVar(runtime, "TFHoliday_AprilFools", kHoliday_AprilFools);
PopulateVar(runtime, "TFHoliday_Soldier", kHoliday_Soldier);
PopulateVar(runtime, "TFHoliday_Summer", kHoliday_Summer);

PopulateVar(runtime, "TFCOLLISION_GROUP_GRENADES", TF_COLLISIONGROUP_GRENADES);
PopulateVar(runtime, "TFCOLLISION_GROUP_OBJECT", TFCOLLISION_GROUP_OBJECT);
PopulateVar(runtime, "TFCOLLISION_GROUP_OBJECT_SOLIDTOPLAYERMOVEMENT", TFCOLLISION_GROUP_OBJECT_SOLIDTOPLAYERMOVEMENT);
PopulateVar(runtime, "TFCOLLISION_GROUP_COMBATOBJECT", TFCOLLISION_GROUP_COMBATOBJECT);
PopulateVar(runtime, "TFCOLLISION_GROUP_ROCKETS", TFCOLLISION_GROUP_ROCKETS);
PopulateVar(runtime, "TFCOLLISION_GROUP_RESPAWNROOMS", TFCOLLISION_GROUP_RESPAWNROOMS);
PopulateVar(runtime, "TFCOLLISION_GROUP_TANK", TFCOLLISION_GROUP_TANK);
PopulateVar(runtime, "TFCOLLISION_GROUP_ROCKET_BUT_NOT_WITH_OTHER_ROCKETS", TFCOLLISION_GROUP_ROCKET_BUT_NOT_WITH_OTHER_ROCKETS);
}
11 changes: 11 additions & 0 deletions extensions/tf2/constmanager.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#pragma once

#include "smsdk_ext.h"

class ConstManager : public IPluginsListener
{
public:
ConstManager() = default;
public: // IPluginsListener
virtual void OnPluginLoaded(IPlugin *plugin) override;
};
6 changes: 4 additions & 2 deletions extensions/tf2/extension.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,6 @@ bool TF2Tools::SDK_OnLoad(char *error, size_t maxlength, bool late)
sharesys->AddNatives(myself, g_TFNatives);
sharesys->RegisterLibrary(myself, "tf2");

plsys->AddPluginsListener(this);

playerhelpers->RegisterCommandTargetProcessor(this);

g_critForward = forwards->CreateForward("TF2_CalcIsAttackCritical", ET_Hook, 4, NULL, Param_Cell, Param_Cell, Param_String, Param_CellByRef);
Expand All @@ -133,6 +131,9 @@ bool TF2Tools::SDK_OnLoad(char *error, size_t maxlength, bool late)

g_HolidayManager.OnSDKLoad(late);

plsys->AddPluginsListener(&m_ConstsManager);
plsys->AddPluginsListener(this);

return true;
}

Expand Down Expand Up @@ -195,6 +196,7 @@ void TF2Tools::SDK_OnUnload()
playerhelpers->UnregisterCommandTargetProcessor(this);

plsys->RemovePluginsListener(this);
plsys->RemovePluginsListener(&m_ConstsManager);

forwards->ReleaseForward(g_critForward);
forwards->ReleaseForward(g_addCondForward);
Expand Down
2 changes: 2 additions & 0 deletions extensions/tf2/extension.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#include <IBinTools.h>
#include <server_class.h>
#include <igameevents.h>
#include "constmanager.h"

namespace SourceMod {
class ISDKTools;
Expand Down Expand Up @@ -120,6 +121,7 @@ class TF2Tools :
bool m_CondChecksEnabled;
bool m_RulesDetoursEnabled;
bool m_TeleportDetourEnabled;
ConstManager m_ConstsManager;
};

enum TFClassType
Expand Down
15 changes: 0 additions & 15 deletions extensions/tf2/holiday.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -143,21 +143,6 @@ static inline void PopulateHolidayVar(IPluginRuntime *pRuntime, const char *pszN
void HolidayManager::OnPluginLoaded(IPlugin *plugin)
{
HookIfNecessary();

auto *pRuntime = plugin->GetRuntime();
PopulateHolidayVar(pRuntime, "TFHoliday_Birthday");
PopulateHolidayVar(pRuntime, "TFHoliday_Halloween");
PopulateHolidayVar(pRuntime, "TFHoliday_Christmas");
PopulateHolidayVar(pRuntime, "TFHoliday_CommunityUpdate");
PopulateHolidayVar(pRuntime, "TFHoliday_EndOfTheLine");
PopulateHolidayVar(pRuntime, "TFHoliday_ValentinesDay");
PopulateHolidayVar(pRuntime, "TFHoliday_MeetThePyro");
PopulateHolidayVar(pRuntime, "TFHoliday_FullMoon");
PopulateHolidayVar(pRuntime, "TFHoliday_HalloweenOrFullMoon");
PopulateHolidayVar(pRuntime, "TFHoliday_HalloweenOrFullMoonOrValentines");
PopulateHolidayVar(pRuntime, "TFHoliday_AprilFools");
PopulateHolidayVar(pRuntime, "TFHoliday_Soldier");
PopulateHolidayVar(pRuntime, "TFHoliday_Summer");
}

void HolidayManager::OnPluginUnloaded(IPlugin *plugin)
Expand Down
Loading