Improved the teleporter. Startup delay, cooldown, separate team delays and limits. Admin commands made, but not coded yet.
This commit is contained in:
		| @@ -1,3 +1,6 @@ | |||||||
|  | 2008.12.20 - 2.5.1.16 | ||||||
|  |   * Improved the teleporter. Startup delay, cooldown, separate team delays and limits. Admin commands made, but not coded yet. | ||||||
|  |  | ||||||
| 2008.12.16 - 2.5.1.15 - Richard | 2008.12.16 - 2.5.1.15 - Richard | ||||||
|   * Removed unnecessary function call in OnPluginEnd causeing the periodical GameRules not available error. |   * Removed unnecessary function call in OnPluginEnd causeing the periodical GameRules not available error. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -94,14 +94,15 @@ | |||||||
| 	"!ztele amount" | 	"!ztele amount" | ||||||
| 	{ | 	{ | ||||||
| 		"#format"	"{1:d}" | 		"#format"	"{1:d}" | ||||||
| 		"en"		"You have @green{1}@default teleports left this round. (Teleport in 3 seconds)" | 		"en"		"You have @green{1}@default teleports left this round." | ||||||
| 		"ru"		"У вас осталось @green{1}@default телепортов в этом раунде. (Телепортация через 3 секунды)" | 		"ru"		"У вас осталось @green{1}@default телепортов в этом раунде." | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	"!ztele amount unlimited" | 	"!ztele time left" | ||||||
| 	{ | 	{ | ||||||
| 		"en"		"You will be teleported in 3 seconds." | 		"#format"	"{1:d}" | ||||||
| 		"ru"		"Вы будете телепортированы через 3 секунды." | 		"en"		"You will be teleported in {1} seconds." | ||||||
|  | 		"ru"		"Вы будете телепортированы через {1} секунды." | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	"!ztele limit reached" | 	"!ztele limit reached" | ||||||
| @@ -112,10 +113,45 @@ | |||||||
|  |  | ||||||
| 	"!ztele humans restricted" | 	"!ztele humans restricted" | ||||||
| 	{ | 	{ | ||||||
| 		"en"		"Once a player has been infected, only zombies can use !ztele" | 		"en"		"Once a player has been infected, only zombies can use !ztele." | ||||||
| 		"ru"		"После инфицирования кого-либо, только зомби могут использовать !ztele" | 		"ru"		"После инфицирования кого-либо, только зомби могут использовать !ztele" | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	"!ztele zombies restricted" | ||||||
|  | 	{ | ||||||
|  | 		"en"		"The teleporter is disabled for zombies." | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	"!ztele stuck" | ||||||
|  | 	{ | ||||||
|  | 		"en"		"Tip: Use !tp to teleport away if you are stuck." | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	"!ztele not spawned" | ||||||
|  | 	{ | ||||||
|  | 		"en"		"You cannot use the teleporter before you've spawned." | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	"!ztele offline" | ||||||
|  | 	{ | ||||||
|  | 		"en"		"The teleporter is not online yet." | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	"!ztele cooldown" | ||||||
|  | 	{ | ||||||
|  | 		"en"		"Your teleporter is still on a cooldown." | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	"!ztele in progress" | ||||||
|  | 	{ | ||||||
|  | 		"en"		"You already have a teleportation in progress." | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	"!ztele successful" | ||||||
|  | 	{ | ||||||
|  | 		"en"		"Teleport successful." | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	"!zhp enabled" | 	"!zhp enabled" | ||||||
| 	{ | 	{ | ||||||
| 		"en"		"HP display enabled, your real HP will be displayed persistently after infection." | 		"en"		"HP display enabled, your real HP will be displayed persistently after infection." | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ | |||||||
| #undef REQUIRE_PLUGIN | #undef REQUIRE_PLUGIN | ||||||
| #include <market> | #include <market> | ||||||
|  |  | ||||||
| #define VERSION "2.5.1.15" | #define VERSION "2.5.1.16" | ||||||
|  |  | ||||||
| #include "zr/zombiereloaded" | #include "zr/zombiereloaded" | ||||||
| #include "zr/global" | #include "zr/global" | ||||||
| @@ -26,6 +26,7 @@ | |||||||
| #include "zr/classes" | #include "zr/classes" | ||||||
| #include "zr/models" | #include "zr/models" | ||||||
| #include "zr/overlays" | #include "zr/overlays" | ||||||
|  | #include "zr/teleport" | ||||||
| #include "zr/zombie" | #include "zr/zombie" | ||||||
| #include "zr/menu" | #include "zr/menu" | ||||||
| #include "zr/sayhooks" | #include "zr/sayhooks" | ||||||
| @@ -174,6 +175,7 @@ public OnClientDisconnect(client) | |||||||
|     ClientUnHookAttack(client); |     ClientUnHookAttack(client); | ||||||
|      |      | ||||||
|     PlayerLeft(client); |     PlayerLeft(client); | ||||||
|  |     ZTeleResetClient(client); | ||||||
|      |      | ||||||
|     new debug_val = GetConVarInt(gCvars[CVAR_DEBUG]); |     new debug_val = GetConVarInt(gCvars[CVAR_DEBUG]); | ||||||
|     new String:debug_msg[64]; |     new String:debug_msg[64]; | ||||||
|   | |||||||
| @@ -10,7 +10,9 @@ CreateCommands() | |||||||
| { | { | ||||||
|     RegAdminCmd("zr_infect", Command_Infect, ADMFLAG_GENERIC, "Infects the specified player"); |     RegAdminCmd("zr_infect", Command_Infect, ADMFLAG_GENERIC, "Infects the specified player"); | ||||||
|     RegAdminCmd("zr_spawn", Command_Respawn, ADMFLAG_GENERIC, "Respawns the specified player following auto-respawning rules"); |     RegAdminCmd("zr_spawn", Command_Respawn, ADMFLAG_GENERIC, "Respawns the specified player following auto-respawning rules"); | ||||||
|      |     RegAdminCmd("zr_teleport", Command_Teleport, ADMFLAG_GENERIC, "Teleports one or more players to spawn. Usage: zr_teleport <target>"); | ||||||
|  |     RegAdminCmd("zr_tele_saveloc", Command_TeleSaveLocation, ADMFLAG_GENERIC, "Saves your or a players location to a buffer. Usage: zr_tele_saveloc [#userid|name]"); | ||||||
|  |     RegAdminCmd("zr_tele_loc", Command_TeleportToLocation, ADMFLAG_GENERIC, "Teleports you or a player to the saved location. Usage: zr_tele_loc [#userid|name]"); | ||||||
|     RegAdminCmd("zr_restrict", Command_Restrict, ADMFLAG_GENERIC, "Restrict a specified weapon"); |     RegAdminCmd("zr_restrict", Command_Restrict, ADMFLAG_GENERIC, "Restrict a specified weapon"); | ||||||
|     RegAdminCmd("zr_unrestrict", Command_UnRestrict, ADMFLAG_GENERIC, "Unrestrict a specified weapon"); |     RegAdminCmd("zr_unrestrict", Command_UnRestrict, ADMFLAG_GENERIC, "Unrestrict a specified weapon"); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -59,8 +59,12 @@ enum ZRSettings | |||||||
|     Handle:CVAR_ZMARKET_BUYZONE, |     Handle:CVAR_ZMARKET_BUYZONE, | ||||||
|     Handle:CVAR_ZSPAWN, |     Handle:CVAR_ZSPAWN, | ||||||
|     Handle:CVAR_ZTELE, |     Handle:CVAR_ZTELE, | ||||||
|     Handle:CVAR_ZTELE_LIMIT, |     Handle:CVAR_ZTELE_STARTUP_DELAY, | ||||||
|     Handle:CVAR_ZTELE_HUMANS, |     Handle:CVAR_ZTELE_COOLDOWN, | ||||||
|  |     Handle:CVAR_ZTELE_HUMAN_DELAY, | ||||||
|  |     Handle:CVAR_ZTELE_HUMAN_LIMIT, | ||||||
|  |     Handle:CVAR_ZTELE_ZOMBIE_DELAY, | ||||||
|  |     Handle:CVAR_ZTELE_ZOMBIE_LIMIT, | ||||||
|     Handle:CVAR_ZSTUCK, |     Handle:CVAR_ZSTUCK, | ||||||
|     Handle:CVAR_ZHP, |     Handle:CVAR_ZHP, | ||||||
|     Handle:CVAR_ZHP_DEFAULT, |     Handle:CVAR_ZHP_DEFAULT, | ||||||
| @@ -131,9 +135,13 @@ CreateCvars() | |||||||
|     gCvars[CVAR_OVERLAYS_ZOMBIE]        =    CreateConVar("zr_overlays_zombie", "overlays/zr/zombies_win", "The overlay shown to tell everyone that zombies won when zr_overlays is 1"); |     gCvars[CVAR_OVERLAYS_ZOMBIE]        =    CreateConVar("zr_overlays_zombie", "overlays/zr/zombies_win", "The overlay shown to tell everyone that zombies won when zr_overlays is 1"); | ||||||
|     gCvars[CVAR_ZMARKET_BUYZONE]        =    CreateConVar("zr_zmarket_buyzone", "1", "Must be in buyzone to access !zmarket, if Market is installed (0: Can be used anywhere)"); |     gCvars[CVAR_ZMARKET_BUYZONE]        =    CreateConVar("zr_zmarket_buyzone", "1", "Must be in buyzone to access !zmarket, if Market is installed (0: Can be used anywhere)"); | ||||||
|     gCvars[CVAR_ZSPAWN]                 =    CreateConVar("zr_zspawn", "1", "Allow players to spawn if they just joined the game (0: Disable)"); |     gCvars[CVAR_ZSPAWN]                 =    CreateConVar("zr_zspawn", "1", "Allow players to spawn if they just joined the game (0: Disable)"); | ||||||
|     gCvars[CVAR_ZTELE]                  =    CreateConVar("zr_ztele", "1", "Allows zombies who get stuck to teleport back to spawn (0: Disable)"); |     gCvars[CVAR_ZTELE]                  =    CreateConVar("zr_ztele", "1", "Allow players to use the teleporter to get to spawn. (0: Disable)"); | ||||||
|     gCvars[CVAR_ZTELE_LIMIT]            =    CreateConVar("zr_ztele_limit", "1", "Max amount of teleports per round when zr_ztele is 1 (0: Unlimited)"); |     gCvars[CVAR_ZTELE_STARTUP_DELAY]    =    CreateConVar("zr_ztele_startup_delay", "40", "Number of seconds to wait before the teleporter is enabled (0: Always enabled)"); | ||||||
|     gCvars[CVAR_ZTELE_HUMANS]           =    CreateConVar("zr_ztele_humans", "1", "Allow humans to use the teleporter (0: Disabled)"); |     gCvars[CVAR_ZTELE_COOLDOWN]         =    CreateConVar("zr_ztele_cooldown", "30", "Number of seconds to wait before the teleporter can be used again, after a teleport. (0: Disable)"); | ||||||
|  |     gCvars[CVAR_ZTELE_HUMAN_DELAY]      =    CreateConVar("zr_ztele_human_delay", "20", "Teleport delay for humans. (0: No delay)"); | ||||||
|  |     gCvars[CVAR_ZTELE_HUMAN_LIMIT]      =    CreateConVar("zr_ztele_human_limit", "3", "Maximum number of teleports humans can do. (0: Humans can't use the teleporter. -1: Unlimited)"); | ||||||
|  |     gCvars[CVAR_ZTELE_ZOMBIE_DELAY]     =    CreateConVar("zr_ztele_zombie_delay", "0", "Teleport delay for zombies. (0: No delay)"); | ||||||
|  |     gCvars[CVAR_ZTELE_ZOMBIE_LIMIT]     =    CreateConVar("zr_ztele_zombie_limit", "8", "Maximum number of teleports zombies can do. (0: Zombies can't use the teleporter. -1: Unlimited)"); | ||||||
|     gCvars[CVAR_ZSTUCK]                 =    CreateConVar("zr_zstuck", "1", "Allow players that are stuck together to get unstuck (0: Disable)"); |     gCvars[CVAR_ZSTUCK]                 =    CreateConVar("zr_zstuck", "1", "Allow players that are stuck together to get unstuck (0: Disable)"); | ||||||
|     gCvars[CVAR_ZHP]                    =    CreateConVar("zr_zhp", "1", "Allows clients to enable/disable zombie health display (1: On,  0: Off)"); |     gCvars[CVAR_ZHP]                    =    CreateConVar("zr_zhp", "1", "Allows clients to enable/disable zombie health display (1: On,  0: Off)"); | ||||||
|     gCvars[CVAR_ZHP_DEFAULT]            =    CreateConVar("zr_zhp_default", "1", "The default value of zombie health display to new clients (1: On,  0: Off)"); |     gCvars[CVAR_ZHP_DEFAULT]            =    CreateConVar("zr_zhp_default", "1", "The default value of zombie health display to new clients (1: On,  0: Off)"); | ||||||
|   | |||||||
| @@ -74,6 +74,9 @@ public Action:RoundFreezeEnd(Handle:event, const String:name[], bool:dontBroadca | |||||||
|     new Float:max = GetConVarFloat(gCvars[CVAR_SPAWN_MAX]); |     new Float:max = GetConVarFloat(gCvars[CVAR_SPAWN_MAX]); | ||||||
|     new Float:randlen = GetRandomFloat(min, max); |     new Float:randlen = GetRandomFloat(min, max); | ||||||
|     tInfect = CreateTimer(randlen, MotherZombie, _, TIMER_FLAG_NO_MAPCHANGE); |     tInfect = CreateTimer(randlen, MotherZombie, _, TIMER_FLAG_NO_MAPCHANGE); | ||||||
|  |      | ||||||
|  |     ZTeleEnable(); | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| public Action:RoundEnd(Handle:event, const String:name[], bool:dontBroadcast) | public Action:RoundEnd(Handle:event, const String:name[], bool:dontBroadcast) | ||||||
| @@ -118,6 +121,8 @@ public Action:RoundEnd(Handle:event, const String:name[], bool:dontBroadcast) | |||||||
|     { |     { | ||||||
|         ShowOverlays(5.0, Zombie); |         ShowOverlays(5.0, Zombie); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     ZTeleReset(); | ||||||
| } | } | ||||||
|  |  | ||||||
| public Action:PlayerTeam(Handle:event, const String:name[], bool:dontBroadcast) | public Action:PlayerTeam(Handle:event, const String:name[], bool:dontBroadcast) | ||||||
| @@ -178,8 +183,7 @@ public Action:PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast) | |||||||
|         SetPlayerMoney(index, cash); |         SetPlayerMoney(index, cash); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     teleCount[index] = 0; |     ZTeleClientSpawned(index); | ||||||
|     GetClientAbsOrigin(index, spawnLoc[index]); |  | ||||||
|      |      | ||||||
|     NightVisionOn(index, false); |     NightVisionOn(index, false); | ||||||
|     NightVision(index, false); |     NightVision(index, false); | ||||||
|   | |||||||
| @@ -77,7 +77,7 @@ public MainMenuHandle(Handle:menu_main, MenuAction:action, client, slot) | |||||||
|             } |             } | ||||||
|             case 4: |             case 4: | ||||||
|             { |             { | ||||||
|                 ZTele(client); |                 ZTeleClientCheck(client); | ||||||
|                 MainMenu(client); |                 MainMenu(client); | ||||||
|             } |             } | ||||||
|             case 5: |             case 5: | ||||||
|   | |||||||
| @@ -45,9 +45,12 @@ public Action:SayCommand(client, argc) | |||||||
|         ZSpawn(client); |         ZSpawn(client); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     else if (StrEqual(args, "!ztele", false)) |     else if (StrEqual(args, "!tp", false) || | ||||||
|  |              StrEqual(args, "!ztele", false) || | ||||||
|  |              StrEqual(args, "!tele", false) || | ||||||
|  |              StrEqual(args, "!teleport", false)) | ||||||
|     { |     { | ||||||
|         ZTele(client); |         ZTeleClientCheck(client); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     else if (StrEqual(args, "!zstuck", false)) |     else if (StrEqual(args, "!zstuck", false)) | ||||||
| @@ -59,6 +62,12 @@ public Action:SayCommand(client, argc) | |||||||
|     { |     { | ||||||
|         ZHP(client); |         ZHP(client); | ||||||
|     } |     } | ||||||
|  |     else if (StrContains(args, "teleport", false) != -1 | ||||||
|  |              || StrContains(args, "stuck", false) != -1 | ||||||
|  |              || StrContains(args, "help", false) != -1) | ||||||
|  |     { | ||||||
|  |         ZR_PrintToChat(client, "!ztele stuck"); | ||||||
|  |     } | ||||||
|      |      | ||||||
|     return Plugin_Continue; |     return Plugin_Continue; | ||||||
| } | } | ||||||
| @@ -217,6 +226,7 @@ ZSpawn(client) | |||||||
|     AddPlayerToList(client); |     AddPlayerToList(client); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
| ZTele(client) | ZTele(client) | ||||||
| { | { | ||||||
|     new bool:tele = GetConVarBool(gCvars[CVAR_ZTELE]); |     new bool:tele = GetConVarBool(gCvars[CVAR_ZTELE]); | ||||||
| @@ -269,6 +279,7 @@ public Action:Teleport(Handle:timer, any:index) | |||||||
|      |      | ||||||
|     tHandles[index][TTELE] = INVALID_HANDLE; |     tHandles[index][TTELE] = INVALID_HANDLE; | ||||||
| } | } | ||||||
|  | */ | ||||||
|  |  | ||||||
| ZStuck(client) | ZStuck(client) | ||||||
| { | { | ||||||
|   | |||||||
							
								
								
									
										338
									
								
								src/zr/teleport.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										338
									
								
								src/zr/teleport.inc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,338 @@ | |||||||
|  | /** | ||||||
|  |  * ==================== | ||||||
|  |  *   Zombie:Reloaded | ||||||
|  |  *   File: teleport.inc | ||||||
|  |  *   Authors: Richard Helgeby / Cpt.Moore | ||||||
|  |  * ====================  | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | ZTeleEnable() | ||||||
|  | { | ||||||
|  |     ztele_online = false; | ||||||
|  |     if (ztele_startup_timer != INVALID_HANDLE) | ||||||
|  |     { | ||||||
|  |         KillTimer(ztele_startup_timer); | ||||||
|  |     } | ||||||
|  |     new Float:startup_delay = GetConVarFloat(gCvars[CVAR_ZTELE_STARTUP_DELAY]); | ||||||
|  |     if (startup_delay > 0) | ||||||
|  |     { | ||||||
|  |         ztele_startup_timer = CreateTimer(startup_delay, Event_TeleporterStartup); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         ztele_online = true; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ZTeleReset() | ||||||
|  | { | ||||||
|  |     ztele_online = false; | ||||||
|  |  | ||||||
|  |     if (ztele_startup_timer != INVALID_HANDLE) | ||||||
|  |     { | ||||||
|  |         KillTimer(ztele_startup_timer); | ||||||
|  |         ztele_startup_timer = INVALID_HANDLE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for (new client = 1; client <= MAXPLAYERS; client++) | ||||||
|  |     { | ||||||
|  |         spawnLoc[client] = NULL_VECTOR; | ||||||
|  |         ztele_spawned[client] = false; | ||||||
|  |         ztele_countdown[client] = -1; | ||||||
|  |         ztele_count[client] = 0; | ||||||
|  |          | ||||||
|  |         // Stop any cooldown or teleportation in progress. | ||||||
|  |         if (ztele_countdown_timer[client] != INVALID_HANDLE) | ||||||
|  |         { | ||||||
|  |             KillTimer(ztele_countdown_timer[client]); | ||||||
|  |             ztele_countdown_timer[client] = INVALID_HANDLE; | ||||||
|  |         } | ||||||
|  |         if (ztele_cooldown_timer[client] != INVALID_HANDLE) | ||||||
|  |         { | ||||||
|  |             KillTimer(ztele_cooldown_timer[client]); | ||||||
|  |             ztele_cooldown_timer[client] = INVALID_HANDLE; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ZTeleResetClient(client, bool:soft_reset = false) | ||||||
|  | { | ||||||
|  |     if (!soft_reset) | ||||||
|  |     { | ||||||
|  |         spawnLoc[client] = NULL_VECTOR; | ||||||
|  |         ztele_spawned[client] = false; | ||||||
|  |     } | ||||||
|  |     ztele_countdown[client] = -1; | ||||||
|  |     ztele_count[client] = 0; | ||||||
|  |      | ||||||
|  |     // Stop any cooldown or teleportation in progress. | ||||||
|  |     if (ztele_countdown_timer[client] != INVALID_HANDLE) | ||||||
|  |     { | ||||||
|  |         KillTimer(ztele_countdown_timer[client]); | ||||||
|  |         ztele_countdown_timer[client] = INVALID_HANDLE; | ||||||
|  |     } | ||||||
|  |     if (ztele_cooldown_timer[client] != INVALID_HANDLE) | ||||||
|  |     { | ||||||
|  |         KillTimer(ztele_cooldown_timer[client]); | ||||||
|  |         ztele_cooldown_timer[client] = INVALID_HANDLE; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ZTeleClientSpawned(client) | ||||||
|  | { | ||||||
|  |     if (IsFakeClient(client)) | ||||||
|  |     { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     ZTeleResetClient(client, true); | ||||||
|  |      | ||||||
|  |     // Store location if not already stored. | ||||||
|  |     if (!ztele_spawned[client]) | ||||||
|  |     { | ||||||
|  |         GetClientAbsOrigin(client, spawnLoc[client]); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public Action:Event_TeleporterStartup(Handle:timer) | ||||||
|  | { | ||||||
|  |     ztele_online = true; | ||||||
|  |     ztele_startup_timer = INVALID_HANDLE; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public Action:Event_TeleportCountdown(Handle:timer, any:client) | ||||||
|  | { | ||||||
|  |     ztele_countdown[client]--; | ||||||
|  |     if (ztele_countdown[client] <= 0) | ||||||
|  |     { | ||||||
|  |         KillTimer(ztele_countdown_timer[client]); | ||||||
|  |         ztele_countdown_timer[client] = INVALID_HANDLE; | ||||||
|  |          | ||||||
|  |         // Do teleport. | ||||||
|  |         TeleportClient(client, true); | ||||||
|  |          | ||||||
|  |         // Create cooldown timer if enabled. | ||||||
|  |         new cooldown = GetConVarInt(gCvars[CVAR_ZTELE_COOLDOWN]); | ||||||
|  |         if (cooldown) | ||||||
|  |         { | ||||||
|  |             ztele_countdown[client] = cooldown; | ||||||
|  |             ztele_cooldown_timer[client] = CreateTimer(1.0, Event_TeleportCooldown, client, TIMER_REPEAT); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else if ((ztele_countdown[client] % 3) == 0) | ||||||
|  |     { | ||||||
|  |         // Display countdown message. | ||||||
|  |         ZR_PrintToChat(client, "!ztele time left", ztele_countdown[client]); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public Action:Event_TeleportCooldown(Handle:Timer, any:client) | ||||||
|  | { | ||||||
|  |     ztele_countdown[client]--; | ||||||
|  |     if (ztele_countdown[client] <= 0) | ||||||
|  |     { | ||||||
|  |         KillTimer(ztele_cooldown_timer[client]); | ||||||
|  |         ztele_cooldown_timer[client] = INVALID_HANDLE; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public Action:Command_Teleport(client, argc) | ||||||
|  | { | ||||||
|  |     // Check (on all specified clients) if a teleport/cooldown is in progress. | ||||||
|  |     // If so, kill those timers. | ||||||
|  |  | ||||||
|  |     // No cooldown when using this command. | ||||||
|  |     return Plugin_Handled; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public Action:Command_TeleSaveLocation(client, argc) | ||||||
|  | { | ||||||
|  |     return Plugin_Handled; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public Action:Command_TeleportToLocation(client, argc) | ||||||
|  | { | ||||||
|  |     // Don't teleport if a location isn't saved yet. | ||||||
|  |     // To do: Find or make a function to check if a vector array is a null vector. | ||||||
|  |     /*if (bufferLoc[] != NULL_VECTOR) | ||||||
|  |     { | ||||||
|  |         return Plugin_Handled; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         ZR_PrintToChat(client, "!ztele location not set"); | ||||||
|  |         return Plugin_Handled; | ||||||
|  |     }*/ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ZTeleClientCheck(client) | ||||||
|  | { | ||||||
|  |     new bool:tele = GetConVarBool(gCvars[CVAR_ZTELE]); | ||||||
|  |     if (!tele) | ||||||
|  |     { | ||||||
|  |         ZR_PrintToChat(client, "Feature is disabled"); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if (!ztele_online) | ||||||
|  |     { | ||||||
|  |         ZR_PrintToChat(client, "!ztele offline"); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     // Check if there's already a teleport in process. | ||||||
|  |     if (ztele_countdown_timer[client] != INVALID_HANDLE) | ||||||
|  |     { | ||||||
|  |         ZR_PrintToChat(client, "!ztele in progress"); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Check if the cooldown isn't done yet. | ||||||
|  |     if (ztele_cooldown_timer[client] != INVALID_HANDLE) | ||||||
|  |     { | ||||||
|  |         ZR_PrintToChat(client, "!ztele cooldown"); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Check limits. | ||||||
|  |     if (IsPlayerHuman(client)) | ||||||
|  |     { | ||||||
|  |         new human_limit = GetConVarInt(gCvars[CVAR_ZTELE_HUMAN_LIMIT]); | ||||||
|  |         new bool:tele_humans; | ||||||
|  |         if (human_limit == 0) | ||||||
|  |         { | ||||||
|  |             tele_humans = false; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             tele_humans = true; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         if (!tele_humans && zombieSpawned) | ||||||
|  |         { | ||||||
|  |             ZR_PrintToChat(client, "!ztele humans restricted"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         if (human_limit > 0 && (ztele_count[client] >= human_limit)) | ||||||
|  |         { | ||||||
|  |             ZR_PrintToChat(client, "!ztele limit reached"); | ||||||
|  |             return;          | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         new zombie_limit = GetConVarInt(gCvars[CVAR_ZTELE_ZOMBIE_LIMIT]); | ||||||
|  |         new bool:tele_zombies; | ||||||
|  |         if (zombie_limit == 0) | ||||||
|  |         { | ||||||
|  |             tele_zombies = false; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             tele_zombies = true; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         if (!tele_zombies) | ||||||
|  |         { | ||||||
|  |             ZR_PrintToChat(client, "!ztele zombies restricted"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         if (zombie_limit > 0 && (ztele_count[client] >= zombie_limit)) | ||||||
|  |         { | ||||||
|  |             ZR_PrintToChat(client, "!ztele limit reached"); | ||||||
|  |             return;          | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     TeleportClient(client); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TeleportClient(client, bool:no_delay = false) | ||||||
|  | { | ||||||
|  |     new teleports_left; | ||||||
|  |     new bool:teleports_unlimited = false; | ||||||
|  |      | ||||||
|  |     if (IsPlayerHuman(client)) | ||||||
|  |     { | ||||||
|  |         new human_delay = GetConVarInt(gCvars[CVAR_ZTELE_HUMAN_DELAY]); | ||||||
|  |         new human_limit = GetConVarInt(gCvars[CVAR_ZTELE_HUMAN_LIMIT]); | ||||||
|  |         if (human_delay > 0) | ||||||
|  |         { | ||||||
|  |             ztele_countdown[client] = human_delay; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             no_delay = true; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         if (human_limit > 0) | ||||||
|  |         { | ||||||
|  |             teleports_left = human_limit - ztele_count[client] - 1; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             teleports_unlimited = true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         new zombie_delay = GetConVarInt(gCvars[CVAR_ZTELE_ZOMBIE_DELAY]); | ||||||
|  |         new zombie_limit = GetConVarInt(gCvars[CVAR_ZTELE_ZOMBIE_LIMIT]); | ||||||
|  |         if (zombie_delay > 0) | ||||||
|  |         { | ||||||
|  |             ztele_countdown[client] = zombie_delay; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             no_delay = true; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         if (zombie_limit > 0) | ||||||
|  |         { | ||||||
|  |             teleports_left = zombie_limit - ztele_count[client] - 1; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             teleports_unlimited = true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if (no_delay) | ||||||
|  |     { | ||||||
|  |         ztele_countdown[client] = -1; | ||||||
|  |         ztele_count[client]++; | ||||||
|  |         TeleportEntity(client, spawnLoc[client], NULL_VECTOR, NULL_VECTOR); | ||||||
|  |         ZR_PrintToChat(client, "!ztele successful"); | ||||||
|  |         if (!teleports_unlimited) | ||||||
|  |         { | ||||||
|  |             ZR_PrintToChat(client, "!ztele amount", teleports_left); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         ztele_countdown_timer[client] = CreateTimer(1.0, Event_TeleportCountdown, client, TIMER_REPEAT); | ||||||
|  |         if (!teleports_unlimited) | ||||||
|  |         { | ||||||
|  |             ZR_PrintToChat(client, "!ztele amount", teleports_left); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | AbortTeleport(client) | ||||||
|  | { | ||||||
|  |     ztele_countdown[client] = -1; | ||||||
|  |      | ||||||
|  |     // Stop any cooldown or teleportation in progress. | ||||||
|  |     if (ztele_countdown_timer[client] != INVALID_HANDLE) | ||||||
|  |     { | ||||||
|  |         KillTimer(ztele_countdown_timer[client]); | ||||||
|  |         ztele_countdown_timer[client] = INVALID_HANDLE; | ||||||
|  |     } | ||||||
|  |     if (ztele_cooldown_timer[client] != INVALID_HANDLE) | ||||||
|  |     { | ||||||
|  |         KillTimer(ztele_cooldown_timer[client]); | ||||||
|  |         ztele_cooldown_timer[client] = INVALID_HANDLE; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -182,6 +182,9 @@ Zombify_Mother(client) | |||||||
|  |  | ||||||
|     InfectionEffects(client); |     InfectionEffects(client); | ||||||
|      |      | ||||||
|  |     ztele_count[client] = 0; | ||||||
|  |     AbortTeleport(client); | ||||||
|  |      | ||||||
|     ZR_PrintToChat(client, "You are a zombie"); |     ZR_PrintToChat(client, "You are a zombie"); | ||||||
|      |      | ||||||
|     if (bZVision[client]) |     if (bZVision[client]) | ||||||
| @@ -269,6 +272,9 @@ Zombify(client, attacker) | |||||||
|      |      | ||||||
|     InfectionEffects(client); |     InfectionEffects(client); | ||||||
|      |      | ||||||
|  |     ztele_count[client] = 0; | ||||||
|  |     AbortTeleport(client); | ||||||
|  |      | ||||||
|     new ZTeam:team = IsRoundOver(); |     new ZTeam:team = IsRoundOver(); | ||||||
|     RoundWin(team); |     RoundWin(team); | ||||||
|      |      | ||||||
|   | |||||||
| @@ -49,9 +49,17 @@ new bool:pProtect[MAXPLAYERS+1]; | |||||||
| new pClass[MAXPLAYERS+1]; | new pClass[MAXPLAYERS+1]; | ||||||
| new pNextClass[MAXPLAYERS+1]; | new pNextClass[MAXPLAYERS+1]; | ||||||
|  |  | ||||||
| new teleCount[MAXPLAYERS+1]; |  | ||||||
| new protCount[MAXPLAYERS+1]; | new protCount[MAXPLAYERS+1]; | ||||||
|  |  | ||||||
| new Float:spawnLoc[MAXPLAYERS + 1][3]; | new Float:spawnLoc[MAXPLAYERS + 1][3]; | ||||||
|  | new Float:bufferLoc[3]; | ||||||
|  | new bool:ztele_spawned[MAXPLAYERS + 1] = {false, ...}; | ||||||
|  | new ztele_countdown[MAXPLAYERS + 1] = {-1, ...}; | ||||||
|  | new ztele_count[MAXPLAYERS + 1]; | ||||||
|  | new bool:ztele_online = false; | ||||||
|  | new Handle:ztele_startup_timer = INVALID_HANDLE; | ||||||
|  | new Handle:ztele_countdown_timer[MAXPLAYERS + 1] = {INVALID_HANDLE, ...}; | ||||||
|  | new Handle:ztele_cooldown_timer[MAXPLAYERS + 1] = {INVALID_HANDLE, ...}; | ||||||
|  |  | ||||||
| new maxclients; | new maxclients; | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								todo.txt
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								todo.txt
									
									
									
									
									
								
							| @@ -13,15 +13,6 @@ Section content is listed in order of importance. Some of these can be ideas too | |||||||
| * Make a admin command to read and write settings to a spesific class, | * Make a admin command to read and write settings to a spesific class, | ||||||
|   using key/value. Integrate it with the zr_admin menu. |   using key/value. Integrate it with the zr_admin menu. | ||||||
|  |  | ||||||
| * Make a more advanced teleporter: |  | ||||||
|   - Admin command: zr_teleport <player> |  | ||||||
|   - Separate teleport limits for both teams |  | ||||||
|   - Separate delays for both teams |  | ||||||
|   - Startup time |  | ||||||
|   - Separate cooldown for both teams |  | ||||||
|   - Maybe some teleportation effects, like sound, glow or smoke. |  | ||||||
|   (make a separate inc-file for the teleporter) |  | ||||||
|  |  | ||||||
| * Zombie dont have fall damage (damage by player 0 = server should always work) | * Zombie dont have fall damage (damage by player 0 = server should always work) | ||||||
|   Make it a CVAR, so for example zombies can't kill themselfs on some maps by |   Make it a CVAR, so for example zombies can't kill themselfs on some maps by | ||||||
|   going through lasers. |   going through lasers. | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user