diff --git a/cstrike/addons/sourcemod/gamedata/plugin.zombiereloaded.txt b/cstrike/addons/sourcemod/gamedata/plugin.zombiereloaded.txt index 975a1f1..c642033 100644 --- a/cstrike/addons/sourcemod/gamedata/plugin.zombiereloaded.txt +++ b/cstrike/addons/sourcemod/gamedata/plugin.zombiereloaded.txt @@ -1,33 +1,48 @@ -"Games" -{ - "cstrike" - { - "Offsets" - { - "RemoveAllItems" - { - "windows" "283" - "linux" "284" - } - "EyePosition" - { - "windows" "117" - "linux" "118" - } - "EyeAngles" - { - "windows" "206" - "linux" "207" - } - } - "Signatures" - { - "TerminateRound" - { - "library" "server" - "windows" "\x83\xEC\x18\x53\x55\x8B\xD9\x8B\x4C\x24\x28\x56\x57\x33\xF6\x8D" - "linux" "@_ZN12CCSGameRules14TerminateRoundEfi" - } - } - } +"Games" +{ + "#default" + { + "#supported" + { + "game" "cstrike" + } + + "Offsets" + { + "RemoveAllItems" + { + "windows" "283" + "linux" "284" + } + + "EyePosition" + { + "windows" "117" + "linux" "118" + } + + "EyeAngles" + { + "windows" "206" + "linux" "207" + } + } + + "Signatures" + { + "TerminateRound" + { + "library" "server" + "windows" "\x83\xEC\x18\x53\x55\x8B\xD9\x8B\x4C\x24\x28\x56\x57\x33\xF6\x8D" + "linux" "@_ZN12CCSGameRules14TerminateRoundEfi" + } + + "CSWeaponDrop" + { + "library" "server" + "windows" "\x2A\x2A\x2A\x2A\x2A\x2A\x53\x55\x56\x57\x8B\xBC\x24\x40\x01\x00\x00\x32\xDB\x85\xFF\x8B\xF1\x0F" + "linux" "@_ZN9CCSPlayer12CSWeaponDropEP17CBaseCombatWeaponbb" + } + } + } } \ No newline at end of file diff --git a/src/zr/models.inc b/src/zr/models.inc index 26d0d58..5d06222 100644 --- a/src/zr/models.inc +++ b/src/zr/models.inc @@ -115,25 +115,3 @@ LoadDownloadData() CloseHandle(fileDownloads); CloseHandle(arrayDownloads); } - -/*ApplyZombieModel(client) -{ - decl String:modelpath[256]; - - new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]); - if (classes) - { - GetClassModel(pClass[client], modelpath, sizeof(modelpath)); - if (!StrEqual(modelpath, "default", false)) - { - SetPlayerModel(client, modelpath); - return; - } - } - - new randmodel = GetRandomInt(0, GetArraySize(arrayModels) - 1); - GetArrayString(arrayModels, randmodel, modelpath, sizeof(modelpath)); - Format(modelpath, sizeof(modelpath), "%s.mdl", modelpath); - - SetPlayerModel(client, modelpath); -}*/ diff --git a/src/zr/offsets.inc b/src/zr/offsets.inc index 7add0bb..3576d95 100644 --- a/src/zr/offsets.inc +++ b/src/zr/offsets.inc @@ -21,9 +21,10 @@ new offsRender; new Handle:g_hGameConf = INVALID_HANDLE; new Handle:g_hRemoveAllItems = INVALID_HANDLE; -new Handle:g_hTerminateRound = INVALID_HANDLE; new Handle:g_hEyePosition = INVALID_HANDLE; new Handle:g_hEyeAngles = INVALID_HANDLE; +new Handle:g_hTerminateRound = INVALID_HANDLE; +new Handle:g_hCSWeaponDrop = INVALID_HANDLE; FindOffsets() { @@ -100,27 +101,61 @@ FindOffsets() SetupGameData() { + // Load game config file. g_hGameConf = LoadGameConfigFile("plugin.zombiereloaded"); + // StartPrepSDKCall(SDKCall_Player); PrepSDKCall_SetFromConf(g_hGameConf, SDKConf_Virtual, "RemoveAllItems"); g_hRemoveAllItems = EndPrepSDKCall(); + if(g_hRemoveAllItems == INVALID_HANDLE) + { + SetFailState("Couldn't find offset \"RemoveAllItems\"!"); + } + StartPrepSDKCall(SDKCall_Player); PrepSDKCall_SetFromConf(g_hGameConf, SDKConf_Virtual, "EyePosition"); PrepSDKCall_SetReturnInfo(SDKType_QAngle, SDKPass_ByValue); g_hEyePosition = EndPrepSDKCall(); + if(g_hEyePosition == INVALID_HANDLE) + { + SetFailState("Couldn't find offset \"EyePosition\"!"); + } + StartPrepSDKCall(SDKCall_Player); PrepSDKCall_SetFromConf(g_hGameConf, SDKConf_Virtual, "EyeAngles"); PrepSDKCall_SetReturnInfo(SDKType_QAngle, SDKPass_ByValue); g_hEyeAngles = EndPrepSDKCall(); + if(g_hEyeAngles == INVALID_HANDLE) + { + SetFailState("Couldn't find offset \"EyeAngles\"!"); + } + StartPrepSDKCall(SDKCall_GameRules); PrepSDKCall_SetFromConf(g_hGameConf, SDKConf_Signature, "TerminateRound"); PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain); PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain); g_hTerminateRound = EndPrepSDKCall(); + + if(g_hTerminateRound == INVALID_HANDLE) + { + SetFailState("Couldn't find signature \"CGameRules::TerminateRound\"!"); + } + + StartPrepSDKCall(SDKCall_Player); + PrepSDKCall_SetFromConf(g_hGameConf, SDKConf_Signature, "CSWeaponDrop"); + PrepSDKCall_AddParameter(SDKType_CBaseEntity, SDKPass_Pointer); + PrepSDKCall_AddParameter(SDKType_Bool, SDKPass_Plain); + PrepSDKCall_AddParameter(SDKType_Bool, SDKPass_Plain); + g_hCSWeaponDrop = EndPrepSDKCall(); + + if(g_hCSWeaponDrop == INVALID_HANDLE) + { + SetFailState("Couldn't find signature \"CBasePlayer::CSWeaponDrop\"!"); + } } SetPlayerVelocity(client, const Float:vec[3], bool:reset) @@ -231,13 +266,12 @@ GetPlayerEyeAngles(client, Float:ang[3]) TerminateRound(Float:delay, reason) { - if (g_hTerminateRound == INVALID_HANDLE) return; SDKCall(g_hTerminateRound, delay, reason); } -SetPlayerModel(client, const String:model[]) +CSDropWeapon(client, weapon) { - SetEntityModel(client, model); + SDKCall(g_hCSWeaponDrop, client, weapon, true, false); } SetPlayerAlpha(client, alpha) diff --git a/src/zr/playerclasses/apply.inc b/src/zr/playerclasses/apply.inc index 4cd95bc..aaacdf8 100644 --- a/src/zr/playerclasses/apply.inc +++ b/src/zr/playerclasses/apply.inc @@ -78,7 +78,7 @@ bool:ClassApplyModel(client, classindex, cachetype = ZR_CLASS_CACHE_PLAYER) // TODO: Add support for keeping the default cs model ("default"). - SetPlayerModel(client, modelpath); + SetEntityModel(client, modelpath); return true; } diff --git a/src/zr/spawnprotect.inc b/src/zr/spawnprotect.inc index 9104129..376ea88 100644 --- a/src/zr/spawnprotect.inc +++ b/src/zr/spawnprotect.inc @@ -1,145 +1,145 @@ -/* - * ============================================================================ - * - * Zombie:Reloaded - * - * File: spawnprotect.inc - * Description: Protects late-joining players from zombies for x seconds. - * - * ============================================================================ - */ - -/** - * Array for storing spawn protect timer handles per client. - */ -new Handle:tSpawnProtect[MAXPLAYERS + 1]; - -/** - * Array for flagging client to be protected. - */ -new bool:pSpawnProtect[MAXPLAYERS + 1]; - -/** - * Array for storing time left for spawn protection per client. - */ -new pSpawnProtectTime[MAXPLAYERS + 1]; - -/** - * Client is joining the server. - * - * @param client The client index. - */ -SpawnProtectClientInit(client) -{ - tSpawnProtect[client] = INVALID_HANDLE; -} - -/** - * Player is spawning into the game. - * - * @param client The client index. - */ -SpawnProtectPlayerSpawn(client) -{ - // Disable spawn protection on client. - pSpawnProtect[client] = false; - - // If zombie hasn't spawned, then stop. - if (!zombieSpawned) - { - return; - } - - // If protect cvar is invalid or 0, then stop. - new protect = GetConVarInt(gCvars[CVAR_PROTECT]); - if (protect <= 0) - { - return; - } - - // Get respawn team. - decl String:respawnteam[32]; - GetConVarString(gCvars[CVAR_RESPAWN_TEAM], respawnteam, sizeof(respawnteam)); - - // If the respawn team is not set to zombie, and either cvar zr_suicide_world_damage or the client - // wasn't killed by world is false, then continue to protect client. - if (!StrEqual(respawnteam, "zombie", false) && !(GetConVarBool(gCvars[CVAR_SUICIDE_WORLD_DAMAGE]) && gKilledByWorld[client])) - { - // Set spawn protect flag on client. - pSpawnProtect[client] = true; - - // Set improved attributes - // (Move to cvar?) - SetPlayerAlpha(client, 0); - SetPlayerSpeed(client, 600.0); - - // Set time left to zr_protect's value. - pSpawnProtectTime[client] = protect; - - // Tell client they are being protected. - ZR_PrintToChat(client, "Spawn protection begin", protect); - - // Send time left in a hud message. - ZR_HudHint(client, "Spawn Protect", pSpawnProtectTime[client]); - - // If timer is currently running, kill it. - if (tSpawnProtect[client] != INVALID_HANDLE) - { - KillTimer(tSpawnProtect[client]); - } - - // Start repeating timer. - tSpawnProtect[client] = CreateTimer(1.0, SpawnProtectTimer, client, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - } -} - -/** - * Timer callback function, countdown for spawn protection. - * - * @param timer The timer handle. - * @param client The client index. - */ -public Action:SpawnProtectTimer(Handle:timer, any:client) -{ - // If client leaves, then stop timer. - if (!IsClientInGame(client)) - { - return Plugin_Stop; - } - - // If client has become a zombie, then stop timer. - if (!IsPlayerHuman(client)) - { - return Plugin_Stop; - } - - // Decrement time left. - pSpawnProtectTime[client]--; - - // Print time left to client. - ZR_HudHint(client, "Spawn Protect", pSpawnProtectTime[client]); - - // Time has expired. - if (pSpawnProtectTime[client] <= 0) - { - // Remove protect flag. - pSpawnProtect[client] = false; - - // Tell client spawn protection is over. - ZR_HudHint(client, "Spawn protection end"); - - // Fix attributes. - // TODO: Set class attributes. - SetPlayerAlpha(client, 255); - SetPlayerSpeed(client, 300.0); - - // Clear timer handle. - tSpawnProtect[client] = INVALID_HANDLE; - - // Stop timer. - return Plugin_Stop; - } - - // Allow timer to continue repeating. - return Plugin_Continue; +/* + * ============================================================================ + * + * Zombie:Reloaded + * + * File: spawnprotect.inc + * Description: Protects late-joining players from zombies for x seconds. + * + * ============================================================================ + */ + +/** + * Array for storing spawn protect timer handles per client. + */ +new Handle:tSpawnProtect[MAXPLAYERS + 1]; + +/** + * Array for flagging client to be protected. + */ +new bool:pSpawnProtect[MAXPLAYERS + 1]; + +/** + * Array for storing time left for spawn protection per client. + */ +new pSpawnProtectTime[MAXPLAYERS + 1]; + +/** + * Client is joining the server. + * + * @param client The client index. + */ +SpawnProtectClientInit(client) +{ + tSpawnProtect[client] = INVALID_HANDLE; +} + +/** + * Player is spawning into the game. + * + * @param client The client index. + */ +SpawnProtectPlayerSpawn(client) +{ + // Disable spawn protection on client. + pSpawnProtect[client] = false; + + // If zombie hasn't spawned, then stop. + if (!zombieSpawned) + { + return; + } + + // If protect cvar is invalid or 0, then stop. + new protect = GetConVarInt(gCvars[CVAR_PROTECT]); + if (protect <= 0) + { + return; + } + + // Get respawn team. + decl String:respawnteam[32]; + GetConVarString(gCvars[CVAR_RESPAWN_TEAM], respawnteam, sizeof(respawnteam)); + + // If the respawn team is not set to zombie, and either cvar zr_suicide_world_damage or the client + // wasn't killed by world is false, then continue to protect client. + if (!StrEqual(respawnteam, "zombie", false) && !(GetConVarBool(gCvars[CVAR_SUICIDE_WORLD_DAMAGE]) && gKilledByWorld[client])) + { + // Set spawn protect flag on client. + pSpawnProtect[client] = true; + + // Set improved attributes + // (Move to cvar?) + SetPlayerAlpha(client, 0); + SetPlayerSpeed(client, 600.0); + + // Set time left to zr_protect's value. + pSpawnProtectTime[client] = protect; + + // Tell client they are being protected. + ZR_PrintToChat(client, "Spawn protection begin", protect); + + // Send time left in a hud message. + ZR_HudHint(client, "Spawn Protect", pSpawnProtectTime[client]); + + // If timer is currently running, kill it. + if (tSpawnProtect[client] != INVALID_HANDLE) + { + KillTimer(tSpawnProtect[client]); + } + + // Start repeating timer. + tSpawnProtect[client] = CreateTimer(1.0, SpawnProtectTimer, client, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + } +} + +/** + * Timer callback function, countdown for spawn protection. + * + * @param timer The timer handle. + * @param client The client index. + */ +public Action:SpawnProtectTimer(Handle:timer, any:client) +{ + // If client leaves, then stop timer. + if (!IsClientInGame(client)) + { + return Plugin_Stop; + } + + // If client has become a zombie, then stop timer. + if (!IsPlayerHuman(client)) + { + return Plugin_Stop; + } + + // Decrement time left. + pSpawnProtectTime[client]--; + + // Print time left to client. + ZR_HudHint(client, "Spawn Protect", pSpawnProtectTime[client]); + + // Time has expired. + if (pSpawnProtectTime[client] <= 0) + { + // Remove protect flag. + pSpawnProtect[client] = false; + + // Tell client spawn protection is over. + ZR_HudHint(client, "Spawn protection end"); + + // Fix attributes. + // TODO: Set class attributes. + SetPlayerAlpha(client, 255); + SetPlayerSpeed(client, 300.0); + + // Clear timer handle. + tSpawnProtect[client] = INVALID_HANDLE; + + // Stop timer. + return Plugin_Stop; + } + + // Allow timer to continue repeating. + return Plugin_Continue; } \ No newline at end of file