TPOLI,KUU[B/IKCM] |
01.07.2009 23:24 |
Код:
#include <sourcemod> Типо подгружает библиотеки (здесь правда лишних напихал)
#include <sdktools_functions>
#include <sdktools>
#include <cstrike>
#include <hacks>
#define VERSION "1.0" Версия (число не особо важно)
new Float:spawnLoc[MAXPLAYERS+1][3]; переменные действующие на весь плагин
new Handle:Switch;
new Handle:tLIMIT;
new bool: aRestrict[MAXPLAYERS+1];
public Plugin:myinfo = информация о плагине. Первые три строчки можно редактироваать как угодно
{
name = "tele_zm",
author = "TPOLI,KUU[B/IKCM]",
description = "tele zombie",
version = VERSION,
url = "www.sourcemod.net"
};
public OnPluginStart() действия, выполняемые при запуске плагина
{
Switch = CreateConVar("tele_on","1","Turns the plugin on and off 1/0",FCVAR_NOTIFY); Создание переменных
tLIMIT = CreateConVar("time_tele","20.0","time v sec");
HookEvent("round_freeze_end", RoundFreezeEnd); регистрирует конец заморозки (во время закупки) и выполняет соответствующее действие
HookEvent("player_spawn", PlayerSpawn); регистрирует спаун игроков
AutoExecConfig(true, "zm_tele"); автоматическое создание конфиг файла
}
public RoundFreezeEnd(Handle:event, const String:name[], bool:dontBroadcast) действие выполняемое в конце заморозки
{
new Float:time = GetConVarFloat(tLIMIT); создаем новую перенменную и записываем в нее из конфига, время через которое зомбаки будут телепортироваться
CreateTimer(time, TeleZombie, _, TIMER_FLAG_NO_MAPCHANGE); Запускаем таймер, при срабатывании которого плагин выполнит следующее действие
}
public Action:TeleZombie(Handle:timer) действие, выполняемое при срабатывании таймера
{
new maxplayers = GetMaxClients(); Записываем в новую переменную число игроков
for (new i = 1; i <= maxplayers; i++) Цикл, который должен проитись по всем игрокам (почему то не по всем проходится, почему и понадобилось дорабатывать плангин)
{
if (GetClientHealth(i) > 100 && GetConVarInt(Switch) && aRestrict[i] != true) условие (если у игрока больше 100хп, плагин включен и игрок еще не портовался)
{
TeleportEntity(i, spawnLoc[i], NULL_VECTOR, NULL_VECTOR); телепортирует игрока
aRestrict[i] = true; для данного игрока записываем что он портнулся
}
}
}
//-----------------------------------------------------------------------------------------------------
public Action:PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast) действие выполняемое при спауне
{
new client = GetClientOfUserId(GetEventInt(event, "userid")); в переменную записываем индификатор игрока
GetClientAbsOrigin(client, spawnLoc[client]); получаем координаты игрока и записываем в другую переменную
new Float:time = GetConVarFloat(tLIMIT);
CreateTimer(time+5.0, TeleZombie2, client, TIMER_FLAG_NO_MAPCHANGE); запускаем таймер (ко времени добавляем 5 сек, т.к. спаунятся игроки на 5 сек раньше, чем кончается заморозка)
aRestrict[client] = false; записываем для данного игрока, что он еще не портнулся
}
public Action:TeleZombie2(Handle:timer, any:index) при срабатывании этого таймера делаем следующее
{
if (GetClientHealth(index) > 100 && GetConVarInt(Switch) && aRestrict[index] != true) проверем что игрок зомби, плагин включен и он еще не портовался
{
TeleportEntity(index, spawnLoc[index], NULL_VECTOR, NULL_VECTOR); портуем его
aRestrict[index] = true; записываем что он портнулся
}
}
-----------добавлено-----------
В принципе первый таймер можно удлинить и при его срабатывании не проверять всех игроков на зомбячество, а записывать булеановскую переменную, которая будет означать, что портировать больше не надо.
А при срабатывании второго таймера проверять эту переменную.
А при регистрации конца заморозки записывать в нее, что телепортировать можно.
Только это переменную надо зарегистрировать в начале раунда.
Тогда плагин будет корректно работать и при автореспауне ;)
-----------добавлено-----------
вот пример:
Код:
#include <sourcemod>
#include <sdktools_functions>
#include <sdktools>
#include <cstrike>
#include <hacks>
#define VERSION "1.0"
new Float:spawnLoc[MAXPLAYERS+1][3];
new Handle:Switch;
new Handle:tLIMIT;
new bool: monatele;
public Plugin:myinfo =
{
name = "tele_zm",
author = "TPOLI,KUU[B/IKCM]",
description = "tele zombie",
version = VERSION,
url = "www.sourcemod.net"
};
public OnPluginStart()
{
Switch = CreateConVar("tele_on","1","Turns the plugin on and off 1/0",FCVAR_NOTIFY);
tLIMIT = CreateConVar("time_tele","20.0","time v sec");
HookEvent("round_freeze_end", RoundFreezeEnd);
HookEvent("player_spawn", PlayerSpawn);
}
public RoundFreezeEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
new Float:time = GetConVarFloat(tLIMIT);
CreateTimer(time+5.0, TeleZombie, _, TIMER_FLAG_NO_MAPCHANGE);
monatele = true;
}
public Action:TeleZombie(Handle:timer)
{
monatele = false;
}
//-----------------------------------------------------------------------------------------------------
public Action:PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
new client = GetClientOfUserId(GetEventInt(event, "userid"));
GetClientAbsOrigin(client, spawnLoc[client]);
new Float:time = GetConVarFloat(tLIMIT);
CreateTimer(time+5.0, TeleZombie2, client, TIMER_FLAG_NO_MAPCHANGE);
}
public Action:TeleZombie2(Handle:timer, any:index)
{
if (GetClientHealth(index) > 100 && GetConVarInt(Switch) && monatele == true)
{
TeleportEntity(index, spawnLoc[index], NULL_VECTOR, NULL_VECTOR);
}
}
В этом случае проверка на то что зомб уже портнулся не надо, поэтому переменную aRestrict[] удаляем
-----------добавлено-----------
Хотя, погорячился.
Если кто-то зайдет в начале раунда, то респанется он чуть позже, и портнется соответственно тоже позже, поэтому первый таймер лучше оставить как есть (чтоб его могло вовремя портнуть при переборе) и добавить третий.
Я думаю принцип понятен, поэтому еще один вариант приводить не буду. ;)
|