Added zr_infect/zr_human, all conflicts from official version are fixed. Added feature to ZSpawn to allow to spawn to different team after timelimit is expired.
This commit is contained in:
		| @@ -234,12 +234,58 @@ | |||||||
| 		"en"		"You have been infected!  Go pass it on to as many other players as you can." | 		"en"		"You have been infected!  Go pass it on to as many other players as you can." | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	"Infect human" | ||||||
|  | 	{ | ||||||
|  | 		"en"		"The merciful gods (known as admins) have resurrected your soul, find some cover!" | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	"Infect disconnect" | 	"Infect disconnect" | ||||||
| 	{ | 	{ | ||||||
| 		"en"		"The last zombie has left the game, and has passed the infection on to you." | 		"en"		"The last zombie has left the game, and has passed the infection on to you." | ||||||
| 		"ru"		"Последний зомби покинул игру и передал свою инфекцию вам." | 		"ru"		"Последний зомби покинул игру и передал свою инфекцию вам." | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	// Commands | ||||||
|  |  | ||||||
|  | 	"Infect command infect syntax" | ||||||
|  | 	{ | ||||||
|  | 		"en"		"Infect a client. Usage: zr_infect <filter> [respawn - 1/0]" | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	"Infect command human syntax" | ||||||
|  | 	{ | ||||||
|  | 		"en"		"Turn a client into a human. Usage: zr_human <filter> [respawn - 1/0] [protect - 1/0]" | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	"Infect command infect successful" | ||||||
|  | 	{ | ||||||
|  | 		"#format"	"{1:s}" | ||||||
|  | 		"en"		"Player @green{1} @defaulthas been successfully infected." | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	"Infect command infect unsuccessful" | ||||||
|  | 	{ | ||||||
|  | 		"#format"	"{1:s}" | ||||||
|  | 		"en"		"Player @green{1} @defaultis already a zombie." | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	"Infect command human successful" | ||||||
|  | 	{ | ||||||
|  | 		"#format"	"{1:s}" | ||||||
|  | 		"en"		"Player @green{1} @defaulthas been successfully brought back as a human." | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	"Infect command human unsuccessful" | ||||||
|  | 	{ | ||||||
|  | 		"#format"	"{1:s}" | ||||||
|  | 		"en"		"Player @green{1} @defaultis already a human." | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	"Infect command zombie has not spawned" | ||||||
|  | 	{ | ||||||
|  | 		"en"		"The mother zombie must spawn before player infection states can be changed." | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	// =========================== | 	// =========================== | ||||||
| 	// Damage (core) | 	// Damage (core) | ||||||
| 	// =========================== | 	// =========================== | ||||||
|   | |||||||
| @@ -35,6 +35,7 @@ CommandsInit() | |||||||
|     LogOnCommandsCreate(); |     LogOnCommandsCreate(); | ||||||
|     ClassOnCommandsCreate(); |     ClassOnCommandsCreate(); | ||||||
|     WeaponsOnCommandsCreate(); |     WeaponsOnCommandsCreate(); | ||||||
|  |     InfectOnCommandsCreate(); | ||||||
|     VolOnCommandsCreate(); |     VolOnCommandsCreate(); | ||||||
|      |      | ||||||
|     // Forward event to modules. (hook commands) |     // Forward event to modules. (hook commands) | ||||||
| @@ -97,7 +98,7 @@ CommandsInit() | |||||||
|  |  | ||||||
|     for (new x = 0; x < tcount; x++) |     for (new x = 0; x < tcount; x++) | ||||||
|     { |     { | ||||||
|         InfectClient(targets[x]); |         InfectHumanToZombie(targets[x]); | ||||||
|         if (LogCheckFlag(LOG_GAME_EVENTS, LOG_MODULE_COMMANDS)) |         if (LogCheckFlag(LOG_GAME_EVENTS, LOG_MODULE_COMMANDS)) | ||||||
|         { |         { | ||||||
|             GetClientName(targets[x], target_name, sizeof(target_name)); |             GetClientName(targets[x], target_name, sizeof(target_name)); | ||||||
|   | |||||||
| @@ -143,6 +143,7 @@ enum CvarsList | |||||||
|     Handle:CVAR_ZSPAWN_TEAM_ZOMBIE, |     Handle:CVAR_ZSPAWN_TEAM_ZOMBIE, | ||||||
|     Handle:CVAR_ZSPAWN_TIMELIMIT, |     Handle:CVAR_ZSPAWN_TIMELIMIT, | ||||||
|     Handle:CVAR_ZSPAWN_TIMELIMIT_TIME, |     Handle:CVAR_ZSPAWN_TIMELIMIT_TIME, | ||||||
|  |     Handle:CVAR_ZSPAWN_TIMELIMIT_ZOMBIE, | ||||||
|     Handle:CVAR_ZTELE_ZOMBIE, |     Handle:CVAR_ZTELE_ZOMBIE, | ||||||
|     Handle:CVAR_ZTELE_HUMAN_BEFORE, |     Handle:CVAR_ZTELE_HUMAN_BEFORE, | ||||||
|     Handle:CVAR_ZTELE_HUMAN_AFTER, |     Handle:CVAR_ZTELE_HUMAN_AFTER, | ||||||
| @@ -430,13 +431,14 @@ CvarsCreate() | |||||||
|     // =========================== |     // =========================== | ||||||
|     // ZSpawn (module) |     // ZSpawn (module) | ||||||
|     // =========================== |     // =========================== | ||||||
|     g_hCvarsList[CVAR_ZSPAWN]                           =    CreateConVar("zr_zspawn",                  "1", "Allow players to spawn into the game late."); |     g_hCvarsList[CVAR_ZSPAWN]                           =    CreateConVar("zr_zspawn",                      "1",        "Allow players to spawn into the game late."); | ||||||
|      |      | ||||||
|     g_hCvarsList[CVAR_ZSPAWN_TEAM_OVERRIDE]             =    CreateConVar("zr_zspawn_team_override",    "1", "Override spawn team when spawning by means of ZSpawn."); |     g_hCvarsList[CVAR_ZSPAWN_TEAM_OVERRIDE]             =    CreateConVar("zr_zspawn_team_override",        "1",        "Override spawn team when spawning by means of ZSpawn."); | ||||||
|     g_hCvarsList[CVAR_ZSPAWN_TEAM_ZOMBIE]               =    CreateConVar("zr_zspawn_team_zombie",      "0", "Spawn player on zombie team when spawning by means of ZSpawn. [Dependency: zr_zspawn_team_override | Override: zr_respawn_zombie]"); |     g_hCvarsList[CVAR_ZSPAWN_TEAM_ZOMBIE]               =    CreateConVar("zr_zspawn_team_zombie",          "0",        "Spawn player on zombie team when spawning by means of ZSpawn. [Dependency: zr_zspawn_team_override | Override: zr_respawn_zombie]"); | ||||||
|      |      | ||||||
|     g_hCvarsList[CVAR_ZSPAWN_TIMELIMIT]                 =    CreateConVar("zr_zspawn_timelimit",        "1", "Put a time limit on the use of ZSpawn."); |     g_hCvarsList[CVAR_ZSPAWN_TIMELIMIT]                 =    CreateConVar("zr_zspawn_timelimit",            "1",        "Put a time limit on the use of ZSpawn."); | ||||||
|     g_hCvarsList[CVAR_ZSPAWN_TIMELIMIT_TIME]            =    CreateConVar("zr_zspawn_timelimit_time",   "120.0", "Time from the start of the round to allow ZSpawn. [Dependency: zr_zspawn_timelimit]"); |     g_hCvarsList[CVAR_ZSPAWN_TIMELIMIT_TIME]            =    CreateConVar("zr_zspawn_timelimit_time",       "120.0",    "Time from the start of the round to allow ZSpawn. [Dependency: zr_zspawn_timelimit]"); | ||||||
|  |     g_hCvarsList[CVAR_ZSPAWN_TIMELIMIT_ZOMBIE]          =    CreateConVar("zr_zspawn_timelimit_zombie",      "1",        "Spawn player on the zombie team AFTER the timelimit is up. ['-1' = Block ZSpawn | '0' = Spawn as human | '1' = Spawn as zombie | Dependency: zr_zspawn_timelimit]"); | ||||||
|      |      | ||||||
|      |      | ||||||
|     // =========================== |     // =========================== | ||||||
|   | |||||||
| @@ -100,6 +100,15 @@ InfectLoad() | |||||||
|     AddFileToDownloadsTable(sound); |     AddFileToDownloadsTable(sound); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Create commands specific to infect here. | ||||||
|  |  */ | ||||||
|  | InfectOnCommandsCreate() | ||||||
|  | { | ||||||
|  |     RegAdminCmd("zr_infect", InfectInfectCommand, ADMFLAG_GENERIC, "Infect a client. Usage: zr_infect <filter> [respawn - 1/0]"); | ||||||
|  |     RegAdminCmd("zr_human", InfectHumanCommand, ADMFLAG_GENERIC, "Turn a client into a human. Usage: zr_human <filter> [respawn - 1/0]"); | ||||||
|  | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Client is joining the server. |  * Client is joining the server. | ||||||
|  *  |  *  | ||||||
| @@ -192,7 +201,7 @@ InfectOnClientDisconnect(client) | |||||||
|     new randclient = GetArrayCell(arrayEligibleClients, randindex); |     new randclient = GetArrayCell(arrayEligibleClients, randindex); | ||||||
|      |      | ||||||
|     // Infect player. |     // Infect player. | ||||||
|     InfectClient(randclient); |     InfectHumanToZombie(randclient); | ||||||
|      |      | ||||||
|     // Tell client they have been randomly been chosen to replace disconnecting zombie. |     // Tell client they have been randomly been chosen to replace disconnecting zombie. | ||||||
|     TranslationPrintToChat(randclient, "Infect disconnect"); |     TranslationPrintToChat(randclient, "Infect disconnect"); | ||||||
| @@ -311,7 +320,7 @@ InfectOnClientHurt(client, attacker, const String:weapon[]) | |||||||
|     } |     } | ||||||
|      |      | ||||||
|     // Infect client. |     // Infect client. | ||||||
|     InfectClient(client, attacker); |     InfectHumanToZombie(client, attacker); | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -470,7 +479,7 @@ public Action:InfectMotherZombie(Handle:timer) | |||||||
|         client = GetArrayCell(arrayEligibleClients, randindex); |         client = GetArrayCell(arrayEligibleClients, randindex); | ||||||
|          |          | ||||||
|         // Infect player. |         // Infect player. | ||||||
|         InfectClient(client, _, true); |         InfectHumanToZombie(client, _, true); | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
| @@ -509,7 +518,7 @@ public Action:InfectMotherZombie(Handle:timer) | |||||||
|             client = GetArrayCell(arrayEligibleClients, randindex); |             client = GetArrayCell(arrayEligibleClients, randindex); | ||||||
|              |              | ||||||
|             // Infect player. |             // Infect player. | ||||||
|             InfectClient(client, _, true); |             InfectHumanToZombie(client, _, true); | ||||||
|              |              | ||||||
|             // Remove player from eligible zombie list. |             // Remove player from eligible zombie list. | ||||||
|             RemoveFromArray(arrayEligibleClients, randindex); |             RemoveFromArray(arrayEligibleClients, randindex); | ||||||
| @@ -524,14 +533,16 @@ public Action:InfectMotherZombie(Handle:timer) | |||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Infects a player. Execute events, sets attributes and flags that indicate |  * Infects a client. Execute events, sets attributes and flags that indicate | ||||||
|  * that the player is a zombie. |  * that the client is a zombie. | ||||||
|  * |  * | ||||||
|  * @param client        The player to infect. |  * @param client            The client to infect. | ||||||
|  * @param attacker      (Optional) The attacker who did the infect. |  * @param attacker          (Optional) The attacker who did the infect. | ||||||
|  * @param motherinfect  (Optional) Indicates a mother zombie infect. |  * @param motherinfect      (Optional) Indicates a mother zombie infect. | ||||||
|  |  * @param respawnoverride   (Optional) Set to true to override respawn cvar. | ||||||
|  |  * @param respawn           (Optional) Value to override with. | ||||||
|  */ |  */ | ||||||
| InfectClient(client, attacker = -1, bool:motherinfect = false) | InfectHumanToZombie(client, attacker = -1, bool:motherinfect = false, bool:respawnoverride = false, bool:respawn = false) | ||||||
| { | { | ||||||
|     // Mark player as zombie. |     // Mark player as zombie. | ||||||
|     bZombie[client] = true; |     bZombie[client] = true; | ||||||
| @@ -631,8 +642,16 @@ InfectClient(client, attacker = -1, bool:motherinfect = false) | |||||||
|             ZTeleTeleportClient(client); |             ZTeleTeleportClient(client); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     // Check override. | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         if (respawnoverride && respawn) | ||||||
|  |         { | ||||||
|  |             ZTeleTeleportClient(client); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|      |      | ||||||
|     // Format infection message. |     // Set client as translation target. | ||||||
|     SetGlobalTransTarget(client); |     SetGlobalTransTarget(client); | ||||||
|      |      | ||||||
|     // Print message to client. |     // Print message to client. | ||||||
| @@ -646,6 +665,46 @@ InfectClient(client, attacker = -1, bool:motherinfect = false) | |||||||
|     ZHPOnClientInfected(client); |     ZHPOnClientInfected(client); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Turns a zombie back into a human. Execute events, sets attributes and flags that indicate | ||||||
|  |  * that the client is a human. | ||||||
|  |  * | ||||||
|  |  * @param client        The client to make human. | ||||||
|  |  * @param respawn       Teleport client back to spawn if true. | ||||||
|  |  * @param protect       Start spawn protection on new human. | ||||||
|  |  */ | ||||||
|  | InfectZombieToHuman(client, bool:respawn = false, bool:protect = false) | ||||||
|  | { | ||||||
|  |     // Mark player as human. | ||||||
|  |     bZombie[client] = false; | ||||||
|  |      | ||||||
|  |     // Switch the player to counter-terrorists. | ||||||
|  |     CS_SwitchTeam(client, CS_TEAM_CT); | ||||||
|  |      | ||||||
|  |     // Set client as translation target. | ||||||
|  |     SetGlobalTransTarget(client); | ||||||
|  |      | ||||||
|  |     // Print message to client. | ||||||
|  |     TranslationPrintToChat(client, "Infect human"); | ||||||
|  |      | ||||||
|  |     // Forward event to modules. | ||||||
|  |     ClassOnClientInfected(client, false); | ||||||
|  |     RoundEndOnClientInfected(); | ||||||
|  |     ZTeleOnClientInfected(client); | ||||||
|  |      | ||||||
|  |     // Check if we should respawn the client. | ||||||
|  |     if (respawn) | ||||||
|  |     { | ||||||
|  |         ZTeleTeleportClient(client); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     // Check if we should spawn protect the client. | ||||||
|  |     if (protect) | ||||||
|  |     { | ||||||
|  |         SpawnProtectStart(client); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Creates effects on a newly infected client. |  * Creates effects on a newly infected client. | ||||||
|  *  |  *  | ||||||
| @@ -754,3 +813,139 @@ bool:InfectIsClientHuman(client) | |||||||
|     // Return opposite of client's zombie flag. |     // Return opposite of client's zombie flag. | ||||||
|     return !bZombie[client]; |     return !bZombie[client]; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Command callback (zr_infect) | ||||||
|  |  * Infects a client. | ||||||
|  |  *    | ||||||
|  |  * @param client    The client index. | ||||||
|  |  * @param argc      Argument count. | ||||||
|  |  */ | ||||||
|  | public Action:InfectInfectCommand(client, argc) | ||||||
|  | { | ||||||
|  |     // If not enough arguments given, then stop. | ||||||
|  |     if (argc < 1) | ||||||
|  |     { | ||||||
|  |         TranslationReplyToCommand(client, "Infect command infect syntax"); | ||||||
|  |         return Plugin_Handled; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if (!g_bZombieSpawned) | ||||||
|  |     { | ||||||
|  |         TranslationReplyToCommand(client, "Infect command zombie has not spawned"); | ||||||
|  |         return Plugin_Handled; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     decl String:target[MAX_NAME_LENGTH], String:targetname[MAX_NAME_LENGTH]; | ||||||
|  |     new targets[MAXPLAYERS], bool:tn_is_ml, result; | ||||||
|  |      | ||||||
|  |     // Get targetname. | ||||||
|  |     GetCmdArg(1, target, sizeof(target)); | ||||||
|  |      | ||||||
|  |     // Find a target. | ||||||
|  |     result = ProcessTargetString(target, client, targets, sizeof(targets), COMMAND_FILTER_ALIVE | COMMAND_FILTER_NO_MULTI, targetname, sizeof(targetname), tn_is_ml); | ||||||
|  |          | ||||||
|  |     // Check if there was a problem finding a client. | ||||||
|  |     if (result <= 0) | ||||||
|  |     { | ||||||
|  |         ZRReplyToTargetError(client, result); | ||||||
|  |         return Plugin_Handled; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     // Check if client is a human before turning into zombie. | ||||||
|  |     if (InfectIsClientHuman(targets[0])) | ||||||
|  |     { | ||||||
|  |         new bool:respawnoverride, bool:respawn; | ||||||
|  |         decl String:strRespawn[8]; | ||||||
|  |          | ||||||
|  |         // Get respawn parameter. | ||||||
|  |         GetCmdArg(2, strRespawn, sizeof(strRespawn)); | ||||||
|  |          | ||||||
|  |         // If parameter exists then cast it into a bool and feed it to infect function. | ||||||
|  |         if (strRespawn[0]) | ||||||
|  |         { | ||||||
|  |             respawnoverride = true; | ||||||
|  |             respawn = bool:StringToInt(strRespawn); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Turn client into a zombie. | ||||||
|  |         InfectHumanToZombie(targets[0], _, _, respawnoverride, respawn); | ||||||
|  |          | ||||||
|  |         // Tell admin command was successful. | ||||||
|  |         TranslationReplyToCommand(client, "Infect command infect successful", targetname); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         // Tell admin command was unsuccessful. | ||||||
|  |         TranslationReplyToCommand(client, "Infect command infect unsuccessful", targetname); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     return Plugin_Handled; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Command callback (zr_human) | ||||||
|  |  * Turns a client into a human. | ||||||
|  |  *    | ||||||
|  |  * @param client    The client index. | ||||||
|  |  * @param argc      Argument count. | ||||||
|  |  */ | ||||||
|  | public Action:InfectHumanCommand(client, argc) | ||||||
|  | { | ||||||
|  |     // If not enough arguments given, then stop. | ||||||
|  |     if (argc < 1) | ||||||
|  |     { | ||||||
|  |         TranslationReplyToCommand(client, "Infect command human syntax"); | ||||||
|  |         return Plugin_Handled; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if (!g_bZombieSpawned) | ||||||
|  |     { | ||||||
|  |         TranslationReplyToCommand(client, "Infect command zombie has not spawned"); | ||||||
|  |         return Plugin_Handled; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     decl String:target[MAX_NAME_LENGTH], String:targetname[MAX_NAME_LENGTH]; | ||||||
|  |     new targets[MAXPLAYERS], bool:tn_is_ml, result; | ||||||
|  |      | ||||||
|  |     // Get targetname. | ||||||
|  |     GetCmdArg(1, target, sizeof(target)); | ||||||
|  |      | ||||||
|  |     // Find a target. | ||||||
|  |     result = ProcessTargetString(target, client, targets, sizeof(targets), COMMAND_FILTER_ALIVE | COMMAND_FILTER_NO_MULTI, targetname, sizeof(targetname), tn_is_ml); | ||||||
|  |          | ||||||
|  |     // Check if there was a problem finding a client. | ||||||
|  |     if (result <= 0) | ||||||
|  |     { | ||||||
|  |         ZRReplyToTargetError(client, result); | ||||||
|  |         return Plugin_Handled; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     // Check if client is a human before turning into zombie. | ||||||
|  |     if (InfectIsClientInfected(targets[0])) | ||||||
|  |     { | ||||||
|  |         new bool:respawn, bool:protect; | ||||||
|  |         decl String:strRespawn[8], String:strProtect[8]; | ||||||
|  |          | ||||||
|  |         // Get respawn&protect parameters | ||||||
|  |         GetCmdArg(2, strRespawn, sizeof(strRespawn)); | ||||||
|  |         GetCmdArg(3, strProtect, sizeof(strProtect)); | ||||||
|  |          | ||||||
|  |         // If parameter exists then cast it into a bool and feed it to "humanize" function. | ||||||
|  |         respawn = (strRespawn[0]) ? (bool:StringToInt(strRespawn)) : false; | ||||||
|  |         protect = (strProtect[0]) ? (bool:StringToInt(strProtect)) : false; | ||||||
|  |          | ||||||
|  |         // Turn client into a zombie. | ||||||
|  |         InfectZombieToHuman(targets[0], respawn, protect); | ||||||
|  |          | ||||||
|  |         // Tell admin command was successful. | ||||||
|  |         TranslationReplyToCommand(client, "Infect command human successful", targetname); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         // Tell admin command was unsuccessful. | ||||||
|  |         TranslationReplyToCommand(client, "Infect command human unsuccessful", targetname); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     return Plugin_Handled; | ||||||
|  | } | ||||||
| @@ -155,13 +155,13 @@ RespawnSpawnClient(client, bool:zombie = false) | |||||||
|     // Infect if zombie is true. |     // Infect if zombie is true. | ||||||
|     if (zombie) |     if (zombie) | ||||||
|     { |     { | ||||||
|         InfectClient(client); |         InfectHumanToZombie(client); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     if (GetConVarBool(g_hCvarsList[CVAR_RESPAWN_TEAM_ZOMBIE_WORLD]) && bKilledByWorld[client]) |     if (GetConVarBool(g_hCvarsList[CVAR_RESPAWN_TEAM_ZOMBIE_WORLD]) && bKilledByWorld[client]) | ||||||
|     { |     { | ||||||
|         InfectClient(client); |         InfectHumanToZombie(client); | ||||||
|         bKilledByWorld[client] = false; |         bKilledByWorld[client] = false; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -73,8 +73,43 @@ SpawnProtectOnClientSpawn(client) | |||||||
|  */    |  */    | ||||||
| SpawnProtectOnClientSpawnPost(client) | SpawnProtectOnClientSpawnPost(client) | ||||||
| { | { | ||||||
|     // If client isn't on a team, then stop. |     // If protect cvar is disabled, then stop. | ||||||
|     if (!ZRIsClientOnTeam(client)) |     new bool:protect = GetConVarBool(g_hCvarsList[CVAR_SPAWNPROTECT]); | ||||||
|  |     if (!protect) | ||||||
|  |     { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     // Start spawn protection. | ||||||
|  |     SpawnProtectStart(client); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Client has been killed. | ||||||
|  |  *  | ||||||
|  |  * @param client    The client index. | ||||||
|  |  */ | ||||||
|  | SpawnProtectOnClientDeath(client) | ||||||
|  | { | ||||||
|  |     // If timer is running, kill it. | ||||||
|  |     if (tSpawnProtect[client] != INVALID_HANDLE) | ||||||
|  |     { | ||||||
|  |         KillTimer(tSpawnProtect[client]); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     // Reset timer handle. | ||||||
|  |     tSpawnProtect[client] = INVALID_HANDLE; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Start spawn protection on a client. | ||||||
|  |  *  | ||||||
|  |  * @param client    The client index. | ||||||
|  |  */ | ||||||
|  | SpawnProtectStart(client) | ||||||
|  | { | ||||||
|  |     // If client is dead, then stop. | ||||||
|  |     if (!IsPlayerAlive(client)) | ||||||
|     { |     { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| @@ -85,13 +120,6 @@ SpawnProtectOnClientSpawnPost(client) | |||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     // If protect cvar is disabled, then stop. |  | ||||||
|     new bool:protect = GetConVarBool(g_hCvarsList[CVAR_SPAWNPROTECT]); |  | ||||||
|     if (!protect) |  | ||||||
|     { |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // If client is a zombie, then stop. |     // If client is a zombie, then stop. | ||||||
|     if (InfectIsClientInfected(client)) |     if (InfectIsClientInfected(client)) | ||||||
|     { |     { | ||||||
| @@ -123,23 +151,6 @@ SpawnProtectOnClientSpawnPost(client) | |||||||
|     tSpawnProtect[client] = CreateTimer(1.0, SpawnProtectTimer, client, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); |     tSpawnProtect[client] = CreateTimer(1.0, SpawnProtectTimer, client, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); | ||||||
| } | } | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Client has been killed. |  | ||||||
|  *  |  | ||||||
|  * @param client    The client index. |  | ||||||
|  */ |  | ||||||
| SpawnProtectOnClientDeath(client) |  | ||||||
| { |  | ||||||
|     // If timer is running, kill it. |  | ||||||
|     if (tSpawnProtect[client] != INVALID_HANDLE) |  | ||||||
|     { |  | ||||||
|         KillTimer(tSpawnProtect[client]); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // Reset timer handle. |  | ||||||
|     tSpawnProtect[client] = INVALID_HANDLE; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Timer callback function, countdown for spawn protection. |  * Timer callback function, countdown for spawn protection. | ||||||
|  *  |  *  | ||||||
|   | |||||||
| @@ -333,7 +333,7 @@ public ZRAdminMenuHandle(Handle:menu_admin, MenuAction:action, client, slot) | |||||||
|          { |          { | ||||||
|              decl String:name[64]; |              decl String:name[64]; | ||||||
|              GetClientName(target, name, sizeof(name)); |              GetClientName(target, name, sizeof(name)); | ||||||
|              InfectClient(target); |              InfectHumanToZombie(target); | ||||||
|              ShowActivity2(client, "[ZR] ", "Infected %s", name); |              ShowActivity2(client, "[ZR] ", "Infected %s", name); | ||||||
|              ZRInfectMenu(client); |              ZRInfectMenu(client); | ||||||
|          } |          } | ||||||
|   | |||||||
| @@ -254,6 +254,54 @@ stock bool:ZRIsClientAdmin(client) | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Replies to a client with a given message describing a targetting  | ||||||
|  |  * failure reason. (formatted for ZR) | ||||||
|  |  * | ||||||
|  |  * Note: The translation phrases are found in common.phrases.txt. | ||||||
|  |  * | ||||||
|  |  * @param client		Client index, or 0 for server. | ||||||
|  |  * @param reason		COMMAND_TARGET reason. | ||||||
|  |  */ | ||||||
|  | stock ZRReplyToTargetError(client, reason) | ||||||
|  | { | ||||||
|  | 	switch (reason) | ||||||
|  | 	{ | ||||||
|  | 		case COMMAND_TARGET_NONE: | ||||||
|  | 		{ | ||||||
|  | 			TranslationReplyToCommand(client, "No matching client"); | ||||||
|  | 		} | ||||||
|  | 		case COMMAND_TARGET_NOT_ALIVE: | ||||||
|  | 		{ | ||||||
|  | 			TranslationReplyToCommand(client, "Target must be alive"); | ||||||
|  | 		} | ||||||
|  | 		case COMMAND_TARGET_NOT_DEAD: | ||||||
|  | 		{ | ||||||
|  | 			TranslationReplyToCommand(client, "Target must be dead"); | ||||||
|  | 		} | ||||||
|  | 		case COMMAND_TARGET_NOT_IN_GAME: | ||||||
|  | 		{ | ||||||
|  | 			TranslationReplyToCommand(client, "Target is not in game"); | ||||||
|  | 		} | ||||||
|  | 		case COMMAND_TARGET_IMMUNE: | ||||||
|  | 		{ | ||||||
|  | 			TranslationReplyToCommand(client, "Unable to target"); | ||||||
|  | 		} | ||||||
|  | 		case COMMAND_TARGET_EMPTY_FILTER: | ||||||
|  | 		{ | ||||||
|  | 			TranslationReplyToCommand(client, "No matching clients"); | ||||||
|  | 		} | ||||||
|  | 		case COMMAND_TARGET_NOT_HUMAN: | ||||||
|  | 		{ | ||||||
|  | 			TranslationReplyToCommand(client, "Cannot target bot"); | ||||||
|  | 		} | ||||||
|  | 		case COMMAND_TARGET_AMBIGUOUS: | ||||||
|  | 		{ | ||||||
|  | 			TranslationReplyToCommand(client, "More than one client matched"); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Adds support for printing strings longer than 1 KB to console. Max 4 KB. |  * Adds support for printing strings longer than 1 KB to console. Max 4 KB. | ||||||
|  * |  * | ||||||
|   | |||||||
| @@ -175,25 +175,40 @@ bool:ZSpawnClient(client) | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|      |      | ||||||
|  |     // Check if zspawn override is enabled, and if so get overidden value. | ||||||
|  |     new bool:teamoverride = GetConVarBool(g_hCvarsList[CVAR_ZSPAWN_TEAM_OVERRIDE]); | ||||||
|  |     new bool:teamzombie = teamoverride ? GetConVarBool(g_hCvarsList[CVAR_ZSPAWN_TEAM_ZOMBIE]) : GetConVarBool(g_hCvarsList[CVAR_RESPAWN_TEAM_ZOMBIE]); | ||||||
|  |      | ||||||
|     // Block is the time limit is up. |     // Block is the time limit is up. | ||||||
|     new bool:zspawntimelimit = GetConVarBool(g_hCvarsList[CVAR_ZSPAWN_TIMELIMIT]); |     new bool:zspawntimelimit = GetConVarBool(g_hCvarsList[CVAR_ZSPAWN_TIMELIMIT]); | ||||||
|     if (zspawntimelimit) |     if (zspawntimelimit) | ||||||
|     { |     { | ||||||
|         if (tZSpawn == INVALID_HANDLE) |         if (tZSpawn == INVALID_HANDLE) | ||||||
|         { |         { | ||||||
|             // Get timelimit |             new zspawntimelimitzombie = GetConVarInt(g_hCvarsList[CVAR_ZSPAWN_TIMELIMIT_ZOMBIE]); | ||||||
|             new Float:zspawntime = GetConVarFloat(g_hCvarsList[CVAR_ZSPAWN_TIMELIMIT_TIME]); |             switch(zspawntimelimitzombie) | ||||||
|              |             { | ||||||
|             // Tell client the timelimit for this command has expired. |                 case -1: | ||||||
|             TranslationPrintToChat(client, "ZSpawn timelimit", RoundToNearest(zspawntime)); |                 { | ||||||
|             return false; |                     // Get timelimit | ||||||
|  |                     new Float:zspawntime = GetConVarFloat(g_hCvarsList[CVAR_ZSPAWN_TIMELIMIT_TIME]); | ||||||
|  |                      | ||||||
|  |                     // Tell client the timelimit for this command has expired. | ||||||
|  |                     TranslationPrintToChat(client, "ZSpawn timelimit", RoundToNearest(zspawntime)); | ||||||
|  |                     return false; | ||||||
|  |                 } | ||||||
|  |                 case 0: | ||||||
|  |                 { | ||||||
|  |                     teamzombie = false; | ||||||
|  |                 } | ||||||
|  |                 case 1: | ||||||
|  |                 { | ||||||
|  |                     teamzombie = true; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     // Check if zspawn override is enabled, and if so get overidden value. |  | ||||||
|     new bool:teamoverride = GetConVarBool(g_hCvarsList[CVAR_ZSPAWN_TEAM_OVERRIDE]); |  | ||||||
|     new bool:teamzombie = teamoverride ? GetConVarBool(g_hCvarsList[CVAR_ZSPAWN_TEAM_ZOMBIE]) : GetConVarBool(g_hCvarsList[CVAR_RESPAWN_TEAM_ZOMBIE]); |  | ||||||
|      |  | ||||||
|     // Tell respawn module to respawn client. |     // Tell respawn module to respawn client. | ||||||
|     RespawnSpawnClient(client, teamzombie); |     RespawnSpawnClient(client, teamzombie); | ||||||
|      |      | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user