diff --git a/PlayerRankings/scripting/PlayerRankings.sp b/PlayerRankings/scripting/PlayerRankings.sp index f5aca316..46acad18 100644 --- a/PlayerRankings/scripting/PlayerRankings.sp +++ b/PlayerRankings/scripting/PlayerRankings.sp @@ -29,9 +29,10 @@ ConVar g_hCVar_ProtectionMinimal3; /* INTERGERS */ int g_iCrownEntity = INVALID_ENT_REFERENCE; +int g_iSkullEntity = INVALID_ENT_REFERENCE; int g_iDialogLevel = 100000; -int g_iPlayerWinner[3]; +int g_iPlayerWinner[6]; int g_iPlayerDamage[MAXPLAYERS+1]; int g_iPlayerDamageHits[MAXPLAYERS+1]; int g_iPlayerDamageFrom1K[MAXPLAYERS + 1]; @@ -228,6 +229,7 @@ public void OnMapStart() { PrecacheSound("unloze/holy.wav"); PrecacheModel("models/unloze/crown_v2.mdl"); + PrecacheModel("models/unloze/skull.mdl"); AddFileToDownloadsTable("sound/unloze/holy.wav"); AddFileToDownloadsTable("models/unloze/crown_v2.mdl"); @@ -241,6 +243,19 @@ public void OnMapStart() AddFileToDownloadsTable("materials/models/unloze/crown/crown_bump.vtf"); AddFileToDownloadsTable("materials/models/unloze/crown/crown_detail.vtf"); AddFileToDownloadsTable("materials/models/unloze/crown/crown_lightwarp.vtf"); + + AddFileToDownloadsTable("models/unloze/skull.mdl"); + AddFileToDownloadsTable("models/unloze/skull.phy"); + AddFileToDownloadsTable("models/unloze/skull.vvd"); + AddFileToDownloadsTable("models/unloze/skull.sw.vtx"); + AddFileToDownloadsTable("models/unloze/skull.dx80.vtx"); + AddFileToDownloadsTable("models/unloze/skull.dx90.vtx"); + AddFileToDownloadsTable("materials/models/unloze/skull/skull.vmt"); + AddFileToDownloadsTable("materials/models/unloze/skull/skull.vtf"); + AddFileToDownloadsTable("materials/models/unloze/skull/skull_bump.vtf"); + AddFileToDownloadsTable("materials/models/unloze/skull/skull_horn_b.vmt"); + AddFileToDownloadsTable("materials/models/unloze/skull/skull_horn_b.vtf"); + AddFileToDownloadsTable("materials/models/unloze/skull/skull_horn_b_bump.vtf"); } //---------------------------------------------------------------------------------------------------- @@ -385,7 +400,7 @@ public void OnRoundStart(Event hEvent, const char[] sEvent, bool bDontBroadcast) //---------------------------------------------------------------------------------------------------- public void OnRoundEnding(Event hEvent, const char[] sEvent, bool bDontBroadcast) { - g_iPlayerWinner = {-1, -1, -1}; + g_iPlayerWinner = {-1, -1, -1, -1, -1, -1}; int iSortedListDefenders[MAXPLAYERS+1][3]; int iSortedCountDefenders; @@ -490,6 +505,8 @@ public void OnRoundEnding(Event hEvent, const char[] sEvent, bool bDontBroadcast { Format(sBuffer, sizeof(sBuffer), "%s\n1. %N - %d infections", sBuffer, iSortedListInfectors[0][0], iSortedListInfectors[0][1]); + g_iPlayerWinner[3] = GetSteamAccountID(iSortedListInfectors[0][0]); + LH_LogPlayerEvent(iSortedListInfectors[0][0], "triggered", "ze_infector_first", true); } @@ -497,6 +514,8 @@ public void OnRoundEnding(Event hEvent, const char[] sEvent, bool bDontBroadcast { Format(sBuffer, sizeof(sBuffer), "%s\n2. %N - %d infections", sBuffer, iSortedListInfectors[1][0], iSortedListInfectors[1][1]); + g_iPlayerWinner[4] = GetSteamAccountID(iSortedListInfectors[1][0]); + LH_LogPlayerEvent(iSortedListInfectors[1][0], "triggered", "ze_infector_second", true); } @@ -504,6 +523,8 @@ public void OnRoundEnding(Event hEvent, const char[] sEvent, bool bDontBroadcast { Format(sBuffer, sizeof(sBuffer), "%s\n3. %N - %d infections", sBuffer, iSortedListInfectors[2][0], iSortedListInfectors[2][1]); + g_iPlayerWinner[5] = GetSteamAccountID(iSortedListInfectors[2][0]); + LH_LogPlayerEvent(iSortedListInfectors[2][0], "triggered", "ze_infector_third", true); } @@ -565,17 +586,25 @@ public void OnClientSpawn(Event hEvent, const char[] sEvent, bool bDontBroadcast { int client = GetClientOfUserId(hEvent.GetInt("userid")); - if (g_iPlayerWinner[0] == GetSteamAccountID(client) && !g_bHideCrown[client]) + if (!g_bHideCrown[client]) { - CreateTimer(7.0, OnClientSpawnPost, client, TIMER_FLAG_NO_MAPCHANGE); - KillCrown(); + if (g_iPlayerWinner[0] == GetSteamAccountID(client)) + { + CreateTimer(7.0, OnClientSpawnPostCrown, client, TIMER_FLAG_NO_MAPCHANGE); + KillCrown(); + } + else if (g_iPlayerWinner[3] == GetSteamAccountID(client)) + { + CreateTimer(7.0, OnClientSpawnPostSkull, client, TIMER_FLAG_NO_MAPCHANGE); + KillSkull(); + } } } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- -public Action OnClientSpawnPost(Handle timer, int client) +public Action OnClientSpawnPostCrown(Handle timer, int client) { if (!IsClientInGame(client) || IsFakeClient(client) || !IsPlayerAlive(client)) return; @@ -584,6 +613,18 @@ public Action OnClientSpawnPost(Handle timer, int client) SpawnCrown(client); } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Action OnClientSpawnPostSkull(Handle timer, int client) +{ + if (!IsClientInGame(client) || IsFakeClient(client) || !IsPlayerAlive(client)) + return; + + KillSkull(); + SpawnSkull(client); +} + //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- @@ -591,8 +632,14 @@ public void OnClientDeath(Event hEvent, const char[] sEvent, bool bDontBroadcast { int client = GetClientOfUserId(hEvent.GetInt("userid")); - if (g_iPlayerWinner[0] == GetSteamAccountID(client) && !IsPlayerAlive(client)) - KillCrown(); + if (!IsPlayerAlive(client)) + { + if (g_iPlayerWinner[0] == GetSteamAccountID(client)) + KillCrown(); + + if (g_iPlayerWinner[3] == GetSteamAccountID(client)) + KillSkull(); + } } //---------------------------------------------------------------------------------------------------- @@ -637,6 +684,46 @@ void SpawnCrown(int client) g_iCrownEntity = iCrownEntity; } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +void SpawnSkull(int client) +{ + int iSkullEntity = INVALID_ENT_REFERENCE; + if ((iSkullEntity = CreateEntityByName("prop_dynamic")) == INVALID_ENT_REFERENCE) + return; + + SetEntityModel(iSkullEntity, "models/unloze/skull.mdl"); + + DispatchKeyValue(iSkullEntity, "solid", "0"); + DispatchKeyValue(iSkullEntity, "modelscale", "1.5"); + DispatchKeyValue(iSkullEntity, "disableshadows", "1"); + DispatchKeyValue(iSkullEntity, "disablereceiveshadows", "1"); + DispatchKeyValue(iSkullEntity, "disablebonefollowers", "1"); + + float fVector[3]; + float fAngles[3]; + GetClientAbsOrigin(client, fVector); + GetClientAbsAngles(client, fAngles); + + fVector[2] -= 30.0; + + TeleportEntity(iSkullEntity, fVector, fAngles, NULL_VECTOR); + + float fDirection[3]; + fDirection[0] = 0.0; + fDirection[1] = 0.0; + fDirection[2] = 1.0; + + TE_SetupSparks(fVector, fDirection, 1000, 200); + TE_SendToAll(); + + SetVariantString("!activator"); + AcceptEntityInput(iSkullEntity, "SetParent", client); + + g_iSkullEntity = iSkullEntity; +} + //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- @@ -646,6 +733,15 @@ void KillCrown() g_iCrownEntity = INVALID_ENT_REFERENCE; } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +void KillSkull() +{ + if ((IsValidEntity(g_iSkullEntity) && AcceptEntityInput(g_iSkullEntity, "Kill")) || g_iSkullEntity != INVALID_ENT_REFERENCE) + g_iSkullEntity = INVALID_ENT_REFERENCE; +} + //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- @@ -657,8 +753,8 @@ public Action ZR_OnClientInfect(&client, &attacker, &bool:motherInfect, &bool:re (g_iPlayerWinner[1] == GetSteamAccountID(client) && GetClientCount() >= g_hCVar_ProtectionMinimal2.IntValue) || (g_iPlayerWinner[2] == GetSteamAccountID(client) && GetClientCount() >= g_hCVar_ProtectionMinimal3.IntValue)) { - PrintToMessageHUD(client, 60, Float:{-1.0, 0.3}, {255, 255, 255, 255}, {255, 255, 255, 255}, 0, 0.1, 0.1, 5.0, 0.0, "You have been protected from being Mother Zombie\nsince you were the Top Defender last round!"); - CPrintToChat(client, "{cyan}%t {white}%s", "Chat Prefix", "You have been protected from being Mother Zombie since you were the Top Defender last round!"); + PrintToMessageHUD(client, 60, Float:{-1.0, 0.3}, {255, 255, 255, 255}, {255, 255, 255, 255}, 0, 0.1, 0.1, 5.0, 0.0, "%t", "Protected"); + CPrintToChat(client, "{cyan}%t {white}%t", "Chat Prefix", "Protected"); EmitSoundToClient(client, "unloze/holy.wav", .volume=1.0); return Plugin_Handled; diff --git a/PlayerRankings/translations/plugin.playerrankings.phrases.txt b/PlayerRankings/translations/plugin.playerrankings.phrases.txt index bad41773..40c43324 100644 --- a/PlayerRankings/translations/plugin.playerrankings.phrases.txt +++ b/PlayerRankings/translations/plugin.playerrankings.phrases.txt @@ -22,7 +22,7 @@ } "Crown" { - "en" "Crown" + "en" "Crowns" } "Crown Enabled" { @@ -56,8 +56,8 @@ { "en" "You will no longer be protected from being mother zombie." } - "protected" + "Protected" { - "en" "You have been protected from being mother zombie, since you where top defender last round." + "en" "You have been protected from being Mother Zombie,\n since you where Top Defender last round." } } \ No newline at end of file