#include #include #include #include #include #include #pragma semicolon 1 #pragma newdecls required Handle g_hCVar_CollectablesEnabled = INVALID_HANDLE; Handle g_hCVar_RandomIntervalMin = INVALID_HANDLE; Handle g_hCVar_RandomIntervalMax = INVALID_HANDLE; Handle g_hCVar_InfectionEffectEnabled = INVALID_HANDLE; Handle g_hCVar_MilestoneInfection = INVALID_HANDLE; Handle g_hCVar_MilestoneGrenade = INVALID_HANDLE; Handle g_hCVar_MilestoneSkin = INVALID_HANDLE; Handle g_hCVar_HighscoreDisplay = INVALID_HANDLE; Handle g_hCVar_PlayerRequirement = INVALID_HANDLE; Handle g_hCVar_EntityLimit = INVALID_HANDLE; bool g_bEnabled = true; float g_fPropOrigin[3]; public Plugin myinfo = { name = "Unloze Season Event", author = "Neon", description = "Unloze Season Event", version = "1.2", url = "https://steamcommunity.com/id/n3ontm" }; public void OnPluginStart() { g_hCVar_CollectablesEnabled = CreateConVar("sm_unloze_season_collectables_enabled", "1", "Spawn Collectables.", 0, true, 0.0, true, 1.0); g_hCVar_RandomIntervalMin = CreateConVar("sm_unloze_season_random_interval_min", "60", "Minimum Interval between spawning Collectables.", 0, true, 0.0); g_hCVar_RandomIntervalMax = CreateConVar("sm_unloze_season_random_interval_max", "120", "Maximum Interval between spawning Collectables.", 0, true, 0.0); g_hCVar_InfectionEffectEnabled = CreateConVar("sm_unloze_season_infection_effect_enabled", "1", "Spawn Props on Infection.", 0, true, 0.0, true, 1.0); g_hCVar_MilestoneInfection = CreateConVar("sm_unloze_season_milestone_infection", "25", "Amount of Collectables you need to unlock the Infection Effect.", 0, true, 0.0); g_hCVar_MilestoneGrenade = CreateConVar("sm_unloze_season_milestone_grenade", "75", "Amount of Collectables you need to unlock the Grenade Skin.", 0, true, 0.0); g_hCVar_MilestoneSkin = CreateConVar("sm_unloze_season_milestone_skin", "150", "Amount of Collectables you need to unlock the Skin(s).", 0, true, 0.0); g_hCVar_HighscoreDisplay = CreateConVar("sm_unloze_season_highscore_display", "5", "Amount of Players to display via sm_highscore", 0, true, 0.0); g_hCVar_PlayerRequirement = CreateConVar("sm_unloze_season_player_requirement", "10", "Amount of Players needed to spawn Collectables.", 0, true, 0.0); g_hCVar_EntityLimit = CreateConVar("sm_unloze_season_entity_limit", "2000", "Entity Safety Limit.", 0, true, 0.0); for(int client = 1; client <= MaxClients; client++) { if(IsClientInGame(client) && !IsFakeClient(client) && IsClientAuthorized(client)) OnClientPostAdminFilter(client); } HookEvent("round_start", OnRoundStart, EventHookMode_Post); RegConsoleCmd("sm_presents", Command_Collected, "Shows the total amount of presents you have collected so far"); RegConsoleCmd("sm_highscore", Command_HighScore, "Shows the HighScore"); RegAdminCmd("sm_reload_season", Command_ReloadFlags, ADMFLAG_ROOT); } public void OnMapStart() { AddFileToDownloadsTable("models/player/stenli/smite/fenrir.phy"); AddFileToDownloadsTable("models/player/stenli/smite/fenrir.sw.vtx"); AddFileToDownloadsTable("models/player/stenli/smite/fenrir.vvd"); AddFileToDownloadsTable("models/player/stenli/smite/fenrir.dx80.vtx"); AddFileToDownloadsTable("models/player/stenli/smite/fenrir.dx90.vtx"); AddFileToDownloadsTable("models/player/stenli/smite/fenrir.mdl"); AddFileToDownloadsTable("materials/models/player/stenli/smite/fenrir/body.vmt"); AddFileToDownloadsTable("materials/models/player/stenli/smite/fenrir/body.vtf"); AddFileToDownloadsTable("materials/models/player/stenli/smite/fenrir/body_n.vtf"); AddFileToDownloadsTable("materials/models/player/stenli/smite/fenrir/body_s.vtf"); AddFileToDownloadsTable("materials/models/player/stenli/smite/fenrir/lights.vmt"); PrecacheModel("models/player/stenli/smite/fenrir.mdl"); AddFileToDownloadsTable("models/player/vad36lollipop/lolli_new.vvd"); AddFileToDownloadsTable("models/player/vad36lollipop/lolli_new.dx80.vtx"); AddFileToDownloadsTable("models/player/vad36lollipop/lolli_new.dx90.vtx"); AddFileToDownloadsTable("models/player/vad36lollipop/lolli_new.mdl"); AddFileToDownloadsTable("models/player/vad36lollipop/lolli_new.phy"); AddFileToDownloadsTable("models/player/vad36lollipop/lolli_new.sw.vtx"); AddFileToDownloadsTable("materials/models/player/vad36lollipop/tx_ch_main_juliet_skin_d_cos11.vtf"); AddFileToDownloadsTable("materials/models/player/vad36lollipop/tx_ch_main_juliet_skin_n_cos11.vtf"); AddFileToDownloadsTable("materials/models/player/vad36lollipop/hat.vmt"); AddFileToDownloadsTable("materials/models/player/vad36lollipop/hat.vtf"); AddFileToDownloadsTable("materials/models/player/vad36lollipop/hat_n.vtf"); AddFileToDownloadsTable("materials/models/player/vad36lollipop/tx_ch_main_juliet_cloth.vmt"); AddFileToDownloadsTable("materials/models/player/vad36lollipop/tx_ch_main_juliet_cloth.vtf"); AddFileToDownloadsTable("materials/models/player/vad36lollipop/tx_ch_main_juliet_cloth_n.vtf"); AddFileToDownloadsTable("materials/models/player/vad36lollipop/tx_ch_main_juliet_hair_d_cos11.vmt"); AddFileToDownloadsTable("materials/models/player/vad36lollipop/tx_ch_main_juliet_hair_d_cos11.vtf"); AddFileToDownloadsTable("materials/models/player/vad36lollipop/tx_ch_main_juliet_hair_n_cos11.vtf"); AddFileToDownloadsTable("materials/models/player/vad36lollipop/tx_ch_main_juliet_skin_d_cos11.vmt"); PrecacheModel("models/player/vad36lollipop/lolli_new.mdl"); AddFileToDownloadsTable("models/player/vad36santa/red.dx80.vtx"); AddFileToDownloadsTable("models/player/vad36santa/red.dx90.vtx"); AddFileToDownloadsTable("models/player/vad36santa/red.mdl"); AddFileToDownloadsTable("models/player/vad36santa/red.phy"); AddFileToDownloadsTable("models/player/vad36santa/red.sw.vtx"); AddFileToDownloadsTable("models/player/vad36santa/red.vvd"); AddFileToDownloadsTable("materials/models/player/vad36santa/Santa_N.vtf"); AddFileToDownloadsTable("materials/models/player/vad36santa/Santa_D.vmt"); AddFileToDownloadsTable("materials/models/player/vad36santa/Santa_D.vtf"); AddFileToDownloadsTable("materials/models/player/vad36santa/Santa_D_B.vmt"); AddFileToDownloadsTable("materials/models/player/vad36santa/Santa_D_B.vtf"); PrecacheModel("models/player/vad36santa/red.mdl"); AddFileToDownloadsTable("models/zombieden/xmas/giftbox.dx80.vtx"); AddFileToDownloadsTable("models/zombieden/xmas/giftbox.dx90.vtx"); AddFileToDownloadsTable("models/zombieden/xmas/giftbox.mdl"); AddFileToDownloadsTable("models/zombieden/xmas/giftbox.phy"); AddFileToDownloadsTable("models/zombieden/xmas/giftbox.sw.vtx"); AddFileToDownloadsTable("models/zombieden/xmas/giftbox.vvd"); AddFileToDownloadsTable("materials/models/zombieden/xmas/gift.vmt"); AddFileToDownloadsTable("materials/models/zombieden/xmas/gift.vtf"); AddFileToDownloadsTable("materials/models/zombieden/xmas/gift_2.vmt"); AddFileToDownloadsTable("materials/models/zombieden/xmas/gift_2.vtf"); AddFileToDownloadsTable("materials/models/zombieden/xmas/gift_lightwarp.vtf"); PrecacheModel("models/zombieden/xmas/giftbox.mdl"); AddFileToDownloadsTable("models/models_kit/xmas/xmastree_mini.dx80.vtx"); AddFileToDownloadsTable("models/models_kit/xmas/xmastree_mini.dx90.vtx"); AddFileToDownloadsTable("models/models_kit/xmas/xmastree_mini.mdl"); AddFileToDownloadsTable("models/models_kit/xmas/xmastree_mini.phy"); AddFileToDownloadsTable("models/models_kit/xmas/xmastree_mini.sw.vtx"); AddFileToDownloadsTable("models/models_kit/xmas/xmastree_mini.vvd"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_misca.vmt"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_misca.vtf"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_misca_skin2.vmt"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_misca_skin2.vtf"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_miscb.vmt"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_miscb.vtf"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_miscb_skin2.vmt"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_miscb_skin2.vtf"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_miscb_spec.vtf"); PrecacheModel("models/models_kit/xmas/xmastree_mini.mdl"); AddFileToDownloadsTable("models/models_kit/xmas/xmas_teddybear.dx80.vtx"); AddFileToDownloadsTable("models/models_kit/xmas/xmas_teddybear.dx90.vtx"); AddFileToDownloadsTable("models/models_kit/xmas/xmas_teddybear.mdl"); AddFileToDownloadsTable("models/models_kit/xmas/xmas_teddybear.phy"); AddFileToDownloadsTable("models/models_kit/xmas/xmas_teddybear.sw.vtx"); AddFileToDownloadsTable("models/models_kit/xmas/xmas_teddybear.vvd"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_misca.vmt"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_misca.vtf"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_misca_skin2.vmt"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_misca_skin2.vtf"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_miscb.vmt"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_miscb.vtf"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_miscb_skin2.vmt"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_miscb_skin2.vtf"); AddFileToDownloadsTable("materials/models/models_kit/xmas/xmastree_miscb_spec.vtf"); PrecacheModel("models/models_kit/xmas/xmas_teddybear.mdl"); AddFileToDownloadsTable("models/weapons/w_revenge_xmas_candy.dx80.vtx"); AddFileToDownloadsTable("models/weapons/w_revenge_xmas_candy.dx90.vtx"); AddFileToDownloadsTable("models/weapons/w_revenge_xmas_candy.mdl"); AddFileToDownloadsTable("models/weapons/w_revenge_xmas_candy.phy"); AddFileToDownloadsTable("models/weapons/w_revenge_xmas_candy.sw.vtx"); AddFileToDownloadsTable("models/weapons/w_revenge_xmas_candy.vvd"); AddFileToDownloadsTable("materials/models/weapons/v_models/xmas_candy/cane.vmt"); AddFileToDownloadsTable("materials/models/weapons/v_models/xmas_candy/cane.vtf"); PrecacheModel("models/weapons/w_revenge_xmas_candy.mdl"); AddFileToDownloadsTable("models/johny-srka/snowman.dx80.vtx"); AddFileToDownloadsTable("models/johny-srka/snowman.dx90.vtx"); AddFileToDownloadsTable("models/johny-srka/snowman.mdl"); AddFileToDownloadsTable("models/johny-srka/snowman.phy"); AddFileToDownloadsTable("models/johny-srka/snowman.sw.vtx"); AddFileToDownloadsTable("models/johny-srka/snowman.vvd"); AddFileToDownloadsTable("materials/models/johny-srka/black_felt.vmt"); AddFileToDownloadsTable("materials/models/johny-srka/black_felt.vtf"); AddFileToDownloadsTable("materials/models/johny-srka/fabricpatterns0017_m.vmt"); AddFileToDownloadsTable("materials/models/johny-srka/fabricpatterns0017_m.vtf"); AddFileToDownloadsTable("materials/models/johny-srka/snowfloor002a.vmt"); AddFileToDownloadsTable("materials/models/johny-srka/snowfloor002a.vtf"); AddFileToDownloadsTable("materials/models/johny-srka/wood_old.vmt"); AddFileToDownloadsTable("materials/models/johny-srka/wood_old.vtf"); PrecacheModel("models/johny-srka/snowman.mdl"); AddFileToDownloadsTable("models/weapons/w_snowball_thrown.dx80.vtx"); AddFileToDownloadsTable("models/weapons/w_snowball_thrown.dx90.vtx"); AddFileToDownloadsTable("models/weapons/w_snowball_thrown.mdl"); AddFileToDownloadsTable("models/weapons/w_snowball_thrown.phy"); AddFileToDownloadsTable("models/weapons/w_snowball_thrown.sw.vtx"); AddFileToDownloadsTable("models/weapons/w_snowball_thrown.vvd"); AddFileToDownloadsTable("materials/models/weapons/v_models/snooball/s.vmt"); AddFileToDownloadsTable("materials/models/weapons/v_models/snooball/s.vtf"); AddFileToDownloadsTable("materials/models/weapons/v_models/snooball/s_norm.vtf"); PrecacheModel("models/weapons/w_snowball_thrown.mdl"); AddFileToDownloadsTable("models/weapons/w_ornament_thrown.dx80.vtx"); AddFileToDownloadsTable("models/weapons/w_ornament_thrown.dx90.vtx"); AddFileToDownloadsTable("models/weapons/w_ornament_thrown.mdl"); AddFileToDownloadsTable("models/weapons/w_ornament_thrown.phy"); AddFileToDownloadsTable("models/weapons/w_ornament_thrown.sw.vtx"); AddFileToDownloadsTable("models/weapons/w_ornament_thrown.vvd"); AddFileToDownloadsTable("materials/models/weapons/v_models/ornament/ornament.vmt"); AddFileToDownloadsTable("materials/models/weapons/v_models/ornament/ornament.vtf"); AddFileToDownloadsTable("materials/models/weapons/v_models/ornament/reflect.vtf"); PrecacheModel("models/weapons/w_ornament_thrown.mdl"); AddFileToDownloadsTable("models/weapons/w_santa_hat_thrown.dx80.vtx"); AddFileToDownloadsTable("models/weapons/w_santa_hat_thrown.dx90.vtx"); AddFileToDownloadsTable("models/weapons/w_santa_hat_thrown.mdl"); AddFileToDownloadsTable("models/weapons/w_santa_hat_thrown.phy"); AddFileToDownloadsTable("models/weapons/w_santa_hat_thrown.sw.vtx"); AddFileToDownloadsTable("models/weapons/w_santa_hat_thrown.vvd"); AddFileToDownloadsTable("materials/models/weapons/v_models/eq_fraggrenade/bonnet.vmt"); AddFileToDownloadsTable("materials/models/weapons/v_models/eq_fraggrenade/bonnet.vtf"); PrecacheModel("models/weapons/w_santa_hat_thrown.mdl"); AddFileToDownloadsTable("sound/unl1/season/hohohoho.wav"); PrecacheSound("sound/unl1/season/hohohoho.wav"); float fRandomInterval = GetRandomFloat(GetConVarFloat(g_hCVar_RandomIntervalMin), GetConVarFloat(g_hCVar_RandomIntervalMax)); CreateTimer(fRandomInterval, SpawnCollectable, INVALID_HANDLE, TIMER_FLAG_NO_MAPCHANGE); } public void OnClientPostAdminFilter(int client) { CheckMYSQL(client); } public void OnRoundStart(Event hEvent, const char[] sEvent, bool bDontBroadcast) { CreateTimer(10.0, CheckPlayerCount, INVALID_HANDLE, TIMER_FLAG_NO_MAPCHANGE); } public Action CheckPlayerCount(Handle timer) { g_bEnabled = true; if (GetClientCount(true) < GetConVarInt(g_hCVar_PlayerRequirement)) { g_bEnabled = false; CPrintToChatAll("{green}[Unloze XMAS] {white}Minimum Player Requirement to spawn Presents: {green}%d {white} - Currently online: {red}%d{white}.", GetConVarInt(g_hCVar_PlayerRequirement), GetClientCount(true)); } } public Action Command_ReloadFlags(int client, int args) { for(int i = 1; i <= MaxClients; i++) { if(IsClientInGame(i) && !IsFakeClient(i) && IsClientAuthorized(i)) OnClientPostAdminFilter(i); } CPrintToChat(client, "{green}[Unloze XMAS] {white}Flags have been reloaded!"); return Plugin_Handled; } public Action Command_HighScore(int client, int args) { char error[255]; Database db; if (SQL_CheckConfig("season")) { db = SQL_Connect("season", true, error, sizeof(error)); } if (db == null) { LogError("Could not connect to database: %s", error); delete db; return Plugin_Handled; } char sName[MAX_NAME_LENGTH]; char sQuery[255]; char sBuffer[2048] = "{green}[Unloze XMAS] {white}TOP COLLECTORS:\n"; char sTempBuffer[1024] = ""; int iCollected; int iField; Format(sQuery, sizeof(sQuery), "SELECT * from season_table order by collected desc limit %d", GetConVarInt(g_hCVar_HighscoreDisplay)); DBResultSet rs; if ((rs = SQL_Query(db, sQuery)) == null) { CPrintToChat(client, "{green}[Unloze XMAS] {white}Error! Could not connect to MYSQL-DB!"); delete db; delete rs; return Plugin_Handled; } for(int i = 1; i <= GetConVarInt(g_hCVar_HighscoreDisplay); i++) { rs.FetchRow(); rs.FieldNameToNum("name", iField); rs.FetchString(iField, sName , sizeof(sName)); rs.FieldNameToNum("collected", iField); iCollected = rs.FetchInt(iField); Format(sTempBuffer, sizeof(sTempBuffer), "{green}%d: %s - {red}%d \n", i, sName, iCollected); StrCat(sBuffer, sizeof(sBuffer), sTempBuffer); } CPrintToChat(client, sBuffer); delete db; delete rs; return Plugin_Handled; } public Action Command_Collected(int client, int args) { int iCollected = CheckMYSQL(client); CPrintToChat(client, "{green}[Unloze XMAS] {white}You have collected {green}%d {white}presents so far.", iCollected); if ((iCollected > GetConVarInt(g_hCVar_MilestoneInfection)) && (iCollected > GetConVarInt(g_hCVar_MilestoneSkin))) CPrintToChat(client, "{green}[Unloze XMAS] {white}You have unlocked {red}all rewards{white} already."); if (iCollected < GetConVarInt(g_hCVar_MilestoneInfection)) CPrintToChat(client, "{green}[Unloze XMAS] {white}You need to collect {green}%d {white}more presents to unlock {red}INFECTION EFFECTS{white}.", GetConVarInt(g_hCVar_MilestoneInfection) - iCollected); if (iCollected < GetConVarInt(g_hCVar_MilestoneGrenade)) CPrintToChat(client, "{green}[Unloze XMAS] {white}You need to collect {green}%d {white}more presents to unlock {red}GRENADE SKINS{white}.", GetConVarInt(g_hCVar_MilestoneGrenade) - iCollected); if (iCollected < GetConVarInt(g_hCVar_MilestoneSkin)) CPrintToChat(client, "{green}[Unloze XMAS] {white}You need to collect {green}%d {white}more presents to unlock {red}XMAS PLAYER SKINS{white}.", GetConVarInt(g_hCVar_MilestoneSkin) - iCollected); return Plugin_Handled; } public int CheckMYSQL(int client) { if (client == -1) return -1; char error[255]; Database db; if (SQL_CheckConfig("season")) { db = SQL_Connect("season", true, error, sizeof(error)); } if (db == null) { CPrintToChat(client, "{green}[Unloze XMAS] {white}Error! Could not connect to MYSQL-DB!"); delete db; return -1; } char sSID[64]; GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); char sQuery[255]; Format(sQuery, sizeof(sQuery), "SELECT collected FROM season_table WHERE steam_auth = '%s'", sSID); DBResultSet rs; if ((rs = SQL_Query(db, sQuery)) == null) { delete db; delete rs; return -1; } int iCollected; if (!(rs.RowCount > 0)) { iCollected = 0; } else { int iField; rs.FetchRow(); rs.FieldNameToNum("collected", iField); iCollected = rs.FetchInt(iField); } delete rs; delete db; CheckAndAddFlag(client, iCollected); return iCollected; } public Action SpawnCollectable(Handle timer) { float fRandomInterval = GetRandomFloat(GetConVarFloat(g_hCVar_RandomIntervalMin), GetConVarFloat(g_hCVar_RandomIntervalMax)); CreateTimer(fRandomInterval, SpawnCollectable, INVALID_HANDLE, TIMER_FLAG_NO_MAPCHANGE); if (!GetConVarBool(g_hCVar_CollectablesEnabled) || !(g_bEnabled)) return; int target = GetTargetClient(); GetClientAbsOrigin(target, g_fPropOrigin); int iRotating = SpawnRotating(); int iParticle = SpawnParticle(); int iProp = SpawnProp(); int iHitbox = SpawnHitbox(iRotating, iParticle); int iTrigger = SpawnTrigger(iHitbox); int iAmbient = SpawnAmbientHohohoho(); SetVariantString("!activator"); AcceptEntityInput(iProp, "SetParent", iRotating); SetVariantString("!activator"); AcceptEntityInput(iHitbox, "SetParent", iRotating); SetVariantString("!activator"); AcceptEntityInput(iTrigger, "SetParent", iRotating); AcceptEntityInput(iTrigger, "Enable"); int iEntityLimit = GetConVarInt(g_hCVar_EntityLimit); if ((iRotating > iEntityLimit) || (iParticle > iEntityLimit) || (iProp > iEntityLimit) || (iHitbox > iEntityLimit) || (iTrigger > iEntityLimit) || (iAmbient > iEntityLimit)) { AcceptEntityInput(iHitbox, "FireUser2"); CPrintToChatAll("{green}[Unloze XMAS] {white}Present removed due to {red}critical amount of entities{white}!"); } } public int GetTargetClient() { int[] iEligibleClients = new int[MaxClients]; int iClientCount = 0; for(int i = 1; i <= MaxClients; i++) { if(IsClientInGame(i) && IsPlayerAlive(i) && (ZR_IsClientHuman(i))) { iEligibleClients[iClientCount] = i; iClientCount += 1; } } if (iClientCount == 0) return -1; int randomIndex = GetRandomInt(0, iClientCount - 1); return iEligibleClients[randomIndex]; } public void HookCallbackTrigger(const char[] output, int caller, int activator, float delay) { if (!ZR_IsClientHuman(activator)) { UnhookSingleEntityOutput(caller, "OnStartTouch", HookCallbackTrigger); AcceptEntityInput(caller, "FireUser1"); CPrintToChatAll("{green}[Unloze XMAS] {white}Zombies {red}destroyed{white} a present!"); } } public void HookCallback(const char[] output, int caller, int activator, float delay) { UpdateMYSQL(); } public bool UpdateMYSQL() { char error[255]; Database db; if (SQL_CheckConfig("season")) { db = SQL_Connect("season", true, error, sizeof(error)); } if (db == null) { LogError("Could not connect to database: %s", error); delete db; return false; } for (int client = 1; client <= MaxClients; client++) { if (Client_IsValid(client) && IsClientInGame(client) && IsPlayerAlive(client) && !IsFakeClient(client) && !IsClientSourceTV(client)&& ZR_IsClientHuman(client)) { char sSID[64]; char sName[MAX_NAME_LENGTH]; GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); GetClientName(client, sName, sizeof(sName)); char sQuery[255]; Format(sQuery, sizeof(sQuery), "SELECT collected FROM season_table WHERE steam_auth = '%s'", sSID); DBResultSet rs; if ((rs = SQL_Query(db, sQuery)) == null) { delete db; delete rs; return false; } int iCollected; if (!(rs.RowCount > 0)) { iCollected = 0; Format(sQuery, sizeof(sQuery), "INSERT INTO season_table (steam_auth, name, collected) VALUES ('%s', '%s', '%d')", sSID, sName, iCollected); SQL_FastQuery(db, sQuery); } else { int iField; rs.FetchRow(); rs.FieldNameToNum("collected", iField); iCollected = rs.FetchInt(iField); } iCollected += 1; Format(sQuery, sizeof(sQuery), "UPDATE season_table SET name='%s', collected='%d' WHERE steam_auth='%s'", sName, iCollected, sSID); SQL_FastQuery(db, sQuery); delete rs; CheckAndAddFlag(client, iCollected); CPrintToChat(client, "{green}[Unloze XMAS] {white}Your Team opened a present! You have collected {green}%d {white}presents so far.", iCollected); if (iCollected == GetConVarInt(g_hCVar_MilestoneInfection)) CPrintToChat(client, "{green}[Unloze XMAS] {white}Congratulations! You have unlocked {red}INFECTION EFFECTS{white}!"); if (iCollected == GetConVarInt(g_hCVar_MilestoneGrenade)) CPrintToChat(client, "{green}[Unloze XMAS] {white}Congratulations! You have unlocked {red}GRENADE SKINS{white}!"); if (iCollected == GetConVarInt(g_hCVar_MilestoneSkin)) CPrintToChat(client, "{green}[Unloze XMAS] {white}Congratulations! You have unlocked {red}XMAS SKINS{white}!"); } } delete db; return true; } public void CheckAndAddFlag(int client, int iCollected) { if (iCollected >= GetConVarInt(g_hCVar_MilestoneSkin)) { AddUserFlags(client, Admin_Custom4); } } public int SpawnTrigger(int iHitbox) { char StrOutput1[128]; Format(StrOutput1, sizeof(StrOutput1), "season_hitbox_%i,FireUser2,,0,1", iHitbox); int Entity; // Spawn dynamic prop entity if ((Entity = CreateEntityByName("trigger_multiple")) == INVALID_ENT_REFERENCE) return -1; // Generate unique id for the entity char StrEntityName[64]; Format(StrEntityName, sizeof(StrEntityName), "trigger_multiple_%i", Entity); // Setup entity DispatchKeyValue(Entity, "targetname", StrEntityName); DispatchKeyValue(Entity, "spawnflags", "1"); DispatchKeyValue(Entity, "startdisabled", "1"); DispatchKeyValueVector(Entity, "origin", g_fPropOrigin); DispatchKeyValue(Entity, "OnUser1", StrOutput1); DispatchSpawn(Entity); ActivateEntity(Entity); SetEntityModel(Entity, "models/zombieden/xmas/giftbox.mdl"); float fMinbounds[3] = {-16.0, -16.0, -1.0}; float fMaxbounds[3] = {16.0, 16.0, 32.0}; SetEntPropVector(Entity, Prop_Send, "m_vecMins", fMinbounds); SetEntPropVector(Entity, Prop_Send, "m_vecMaxs", fMaxbounds); SetEntProp(Entity, Prop_Send, "m_nSolidType", 2); int enteffects = GetEntProp(Entity, Prop_Send, "m_fEffects"); enteffects |= 32; SetEntProp(Entity, Prop_Send, "m_fEffects", enteffects); HookSingleEntityOutput(Entity, "OnStartTouch", HookCallbackTrigger, false); return Entity; } public int SpawnRotating() { int Entity; // Spawn dynamic prop entity if ((Entity = CreateEntityByName("func_rotating")) == INVALID_ENT_REFERENCE) return -1; // Generate unique id for the entity char StrEntityName[64]; Format(StrEntityName, sizeof(StrEntityName), "season_rotating_%i", Entity); // Setup entity DispatchKeyValue(Entity, "targetname", StrEntityName); DispatchKeyValue(Entity, "maxspeed", "20"); DispatchKeyValue(Entity, "spawnflags", "65"); DispatchKeyValueVector(Entity, "origin", g_fPropOrigin); DispatchSpawn(Entity); ActivateEntity(Entity); SetEntityModel(Entity, "models/zombieden/xmas/giftbox.mdl"); float fMinbounds[3] = {-1.00, -1.00, -1.00}; float fMaxbounds[3] = {1.00, 1.00, 1.00}; SetEntPropVector(Entity, Prop_Send, "m_vecMins", fMinbounds); SetEntPropVector(Entity, Prop_Send, "m_vecMaxs", fMaxbounds); SetEntProp(Entity, Prop_Send, "m_nSolidType", 2); int enteffects = GetEntProp(Entity, Prop_Send, "m_fEffects"); enteffects |= 32; SetEntProp(Entity, Prop_Send, "m_fEffects", enteffects); return Entity; } public int SpawnProp() { int Entity; // Spawn dynamic prop entity if ((Entity = CreateEntityByName("prop_dynamic_override")) == INVALID_ENT_REFERENCE) return -1; // Setup entity DispatchKeyValue(Entity, "targetname", "season_prop"); DispatchKeyValue(Entity, "model", "models/zombieden/xmas/giftbox.mdl"); DispatchKeyValue(Entity, "modelscale", "0.8"); DispatchKeyValue(Entity, "disableshadows", "1"); DispatchKeyValue(Entity, "disablereceiveshadows", "1"); DispatchKeyValue(Entity, "DisableBoneFollowers", "1"); DispatchKeyValueVector(Entity, "origin", g_fPropOrigin); DispatchSpawn(Entity); ActivateEntity(Entity); int iRandomSkin = GetRandomInt(0, 1); if (iRandomSkin == 0) { SetVariantString("0"); } else if (iRandomSkin == 1) { SetVariantString("1"); } AcceptEntityInput(Entity, "Skin"); return Entity; } public int SpawnParticle() { int Entity; // Spawn dynamic prop entity if ((Entity = CreateEntityByName("info_particle_system")) == INVALID_ENT_REFERENCE) return -1; // Generate unique id for the entity char StrEntityName[64]; Format(StrEntityName, sizeof(StrEntityName), "season_particle_%i", Entity); // Setup entity DispatchKeyValue(Entity, "targetname", StrEntityName); DispatchKeyValue(Entity, "effect_name", "achieved"); DispatchKeyValueVector(Entity, "origin", g_fPropOrigin); DispatchSpawn(Entity); ActivateEntity(Entity); return Entity; } public int SpawnHitbox(int iRotatingParent, int iParticleParent) { char StrOutput1[128]; Format(StrOutput1, sizeof(StrOutput1), "season_rotating_%i,KillHierarchy,,2.5,1", iRotatingParent); char StrOutput2[128]; Format(StrOutput2, sizeof(StrOutput2), "season_particle_%i,Start,,0,1", iParticleParent); char StrOutput3[128]; Format(StrOutput3, sizeof(StrOutput3), "season_rotating_%i,KillHierarchy,,59.0,1", iRotatingParent); char StrOutput4[128]; Format(StrOutput4, sizeof(StrOutput4), "season_sound_hohohoho,Kill,,59.0,1"); char StrOutput5[128]; Format(StrOutput5, sizeof(StrOutput5), "season_rotating_%i,KillHierarchy,,0,1", iRotatingParent); char StrOutput6[128]; Format(StrOutput6, sizeof(StrOutput6), "season_sound_hohohoho,Kill,,0,1"); int Entity; // Spawn dynamic prop entity if ((Entity = CreateEntityByName("func_physbox_multiplayer")) == INVALID_ENT_REFERENCE) return -1; // Generate unique id for the entity char StrEntityName[64]; Format(StrEntityName, sizeof(StrEntityName), "season_hitbox_%i", Entity); // Setup entity DispatchKeyValue(Entity, "targetname", StrEntityName); DispatchKeyValue(Entity, "model", "models/zombieden/xmas/giftbox.mdl"); DispatchKeyValue(Entity, "modelscale", "0.8"); DispatchKeyValue(Entity, "disableshadows", "1"); DispatchKeyValue(Entity, "disablereceiveshadows", "1"); DispatchKeyValue(Entity, "DisableBoneFollowers", "1"); DispatchKeyValue(Entity, "rendermode", "10"); DispatchKeyValue(Entity, "PerformanceMode", "1"); DispatchKeyValue(Entity, "material", "3"); DispatchKeyValue(Entity, "health", "200"); DispatchKeyValue(Entity, "physdamagescale", "1.0"); DispatchKeyValueVector(Entity, "origin", g_fPropOrigin); DispatchKeyValue(Entity, "OnBreak", StrOutput1); DispatchKeyValue(Entity, "OnBreak", StrOutput2); DispatchKeyValue(Entity, "OnBreak", "season_sound_hohohoho,PlaySound,,0,1"); DispatchKeyValue(Entity, "OnBreak", "season_sound_hohohoho,Kill,,2.4,1"); DispatchKeyValue(Entity, "OnUser1", StrOutput3); DispatchKeyValue(Entity, "OnUser1", StrOutput4); DispatchKeyValue(Entity, "OnUser2", StrOutput5); DispatchKeyValue(Entity, "OnUser2", StrOutput6); DispatchSpawn(Entity); ActivateEntity(Entity); AcceptEntityInput(Entity, "FireUser1"); HookSingleEntityOutput(Entity, "OnBreak", HookCallback, true); return Entity; } public int SpawnAmbientHohohoho() { int Entity; // Spawn dynamic prop entity if ((Entity = CreateEntityByName("ambient_generic")) == INVALID_ENT_REFERENCE) return -1; // Setup entity DispatchKeyValue(Entity, "targetname", "season_sound_hohohoho"); DispatchKeyValueVector(Entity, "origin", g_fPropOrigin); DispatchKeyValue(Entity, "spawnflags", "49"); DispatchKeyValue(Entity, "radius", "2000"); DispatchKeyValue(Entity, "message", "unl1/season/hohohoho.wav"); DispatchKeyValue(Entity, "volume", "10"); DispatchKeyValue(Entity, "health", "10"); DispatchKeyValue(Entity, "pitch", "100"); DispatchKeyValue(Entity, "pitchstart", "100"); DispatchSpawn(Entity); ActivateEntity(Entity); return Entity; } public void ZR_OnClientInfected(int client, int attacker, bool motherInfect, bool respawnOverride, bool respawn) { if (GetConVarBool(g_hCVar_InfectionEffectEnabled) && ((CheckMYSQL(client) >= GetConVarInt(g_hCVar_MilestoneInfection)) || CheckMYSQL(attacker) >= GetConVarInt(g_hCVar_MilestoneInfection))) { float fInfectionOrigin[3]; GetClientAbsOrigin(client, fInfectionOrigin); int EntityProp; EntityProp = CreateEntityByName("prop_dynamic_override"); DispatchKeyValue(EntityProp, "targetname", "season_infection_prop"); int iRandomSkin = GetRandomInt(0, 4); if (iRandomSkin == 0) { DispatchKeyValue(EntityProp, "model", "models/models_kit/xmas/xmastree_mini.mdl"); DispatchKeyValue(EntityProp, "modelscale", "0.35"); DispatchKeyValue(EntityProp, "angles", "0 0 0"); } else if (iRandomSkin == 1) { DispatchKeyValue(EntityProp, "model", "models/weapons/w_revenge_xmas_candy.mdl"); DispatchKeyValue(EntityProp, "modelscale", "1.2"); DispatchKeyValue(EntityProp, "angles", "-27 0 0"); } else if (iRandomSkin == 2) { DispatchKeyValue(EntityProp, "model", "models/johny-srka/snowman.mdl"); DispatchKeyValue(EntityProp, "modelscale", "0.45"); DispatchKeyValue(EntityProp, "angles", "0 0 0"); } else if (iRandomSkin == 3) { DispatchKeyValue(EntityProp, "model", "models/weapons/w_santa_hat_thrown.mdl"); DispatchKeyValue(EntityProp, "modelscale", "2.7"); DispatchKeyValue(EntityProp, "angles", "0 0 -90"); fInfectionOrigin[2] += 7; } else if (iRandomSkin == 4) { DispatchKeyValue(EntityProp, "model", "models/models_kit/xmas/xmas_teddybear.mdl"); DispatchKeyValue(EntityProp, "modelscale", "0.7"); } DispatchKeyValue(EntityProp, "disableshadows", "1"); DispatchKeyValue(EntityProp, "disablereceiveshadows", "1"); DispatchKeyValue(EntityProp, "DisableBoneFollowers", "1"); DispatchKeyValueVector(EntityProp, "origin", fInfectionOrigin); DispatchSpawn(EntityProp); ActivateEntity(EntityProp); int EntityRotating; EntityRotating = CreateEntityByName("func_rotating"); DispatchKeyValue(EntityRotating, "targetname", "season_infection_rotating"); DispatchKeyValue(EntityRotating, "maxspeed", "13"); DispatchKeyValue(EntityRotating, "spawnflags", "65"); DispatchKeyValueVector(EntityRotating, "origin", fInfectionOrigin); DispatchKeyValue(EntityRotating, "OnUser1", "!self,KillHierarchy,,45,1"); DispatchKeyValue(EntityRotating, "OnUser2", "!self,KillHierarchy,,0,1"); DispatchSpawn(EntityRotating); ActivateEntity(EntityRotating); SetEntityModel(EntityRotating, "models/models_kit/xmas/xmastree_mini.mdl"); float fMinbounds[3] = {-1.00, -1.00, -1.00}; float fMaxbounds[3] = {1.00, 1.00, 1.00}; SetEntPropVector(EntityRotating, Prop_Send, "m_vecMins", fMinbounds); SetEntPropVector(EntityRotating, Prop_Send, "m_vecMaxs", fMaxbounds); SetEntProp(EntityRotating, Prop_Send, "m_nSolidType", 2); int enteffects = GetEntProp(EntityRotating, Prop_Send, "m_fEffects"); enteffects |= 32; SetEntProp(EntityRotating, Prop_Send, "m_fEffects", enteffects); SetVariantString("!activator"); AcceptEntityInput(EntityProp, "SetParent", EntityRotating); AcceptEntityInput(EntityRotating, "FireUser1"); int iEntityLimit = GetConVarInt(g_hCVar_EntityLimit); if ((EntityRotating > iEntityLimit) || (EntityProp > iEntityLimit)) { AcceptEntityInput(EntityRotating, "FireUser2"); CPrintToChatAll("{green}[Unloze XMAS] {white}Infection Effect removed due to {red}critical amount of entities{white}!"); } } } public void OnEntityCreated(int entity, const char[] classname) { if (StrContains(classname, "_projectile", false) != -1) SDKHook(entity, SDKHook_SpawnPost, ProjectileSpawned); } public void ProjectileSpawned(int Entity) { int iOwner = GetEntPropEnt(Entity, Prop_Data, "m_hOwnerEntity"); if(0 < iOwner <= MaxClients && IsClientInGame(iOwner)) { if (CheckMYSQL(iOwner) >= GetConVarInt(g_hCVar_MilestoneGrenade)) { int iRandomSkin = GetRandomInt(0, 3); if (iRandomSkin == 0) { SetEntityModel(Entity, "models/weapons/w_snowball_thrown.mdl"); SetVariantString("modelscale 3.0"); AcceptEntityInput(Entity, "AddOutput"); } else if (iRandomSkin == 1) { SetEntityModel(Entity, "models/zombieden/xmas/giftbox.mdl"); SetVariantString("modelscale 0.6"); AcceptEntityInput(Entity, "AddOutput"); iRandomSkin = GetRandomInt(0, 1); if (iRandomSkin == 0) { SetVariantString("0"); } else if (iRandomSkin == 1) { SetVariantString("1"); } AcceptEntityInput(Entity, "Skin"); } else if (iRandomSkin == 2) { SetEntityModel(Entity, "models/weapons/w_ornament_thrown.mdl"); SetVariantString("modelscale 2.0"); AcceptEntityInput(Entity, "AddOutput"); } else if (iRandomSkin == 3) { SetEntityModel(Entity, "models/weapons/w_santa_hat_thrown.mdl"); SetVariantString("modelscale 2.3"); AcceptEntityInput(Entity, "AddOutput"); } } } } int IsValidClient(int client, bool nobots = true) { if (client <= 0 || client > MaxClients || !IsClientConnected(client) || (nobots && IsFakeClient(client))) { return false; } return IsClientInGame(client); }