338 lines
8.3 KiB
PHP
338 lines
8.3 KiB
PHP
|
/**
|
||
|
* ====================
|
||
|
* 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;
|
||
|
}
|
||
|
}
|