Polygon4.Net - Тактические игры online

Polygon4.Net - Тактические игры online (http://forum.polygon4.net/index.php)
-   Общие вопросы. ZM (http://forum.polygon4.net/forumdisplay.php?f=47)
-   -   Автореспавн зомби при возрождении (http://forum.polygon4.net/showthread.php?t=7510)

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[] удаляем
-----------добавлено-----------
Хотя, погорячился.
Если кто-то зайдет в начале раунда, то респанется он чуть позже, и портнется соответственно тоже позже, поэтому первый таймер лучше оставить как есть (чтоб его могло вовремя портнуть при переборе) и добавить третий.
Я думаю принцип понятен, поэтому еще один вариант приводить не буду. ;)

NightDeagle.rus 02.07.2009 00:04

Основное понятно,а вот то,что внутри,более интересней...

TPOLI,KUU[B/IKCM] 02.07.2009 00:09

Цитата:

Сообщение от NightDeagle.rus (Сообщение 126149)
Основное понятно,а вот то,что внутри,более интересней...

где внутри?

NightDeagle.rus 02.07.2009 00:58

Цитата:

Сообщение от TPOLI,KUU[B/IKCM] (Сообщение 126151)
где внутри?

В самом скрипте) Допустим :

Цитата:

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"); автоматическое создание конфиг файла
}



То что показал.
То что хотелось узнать...

TPOLI,KUU[B/IKCM] 02.07.2009 01:52

Switch = CreateConVar("tele_on","1","Turns the plugin on and off 1/0",FCVAR_NOTIFY);

Создаем серверную переменную "tele_on", задаем ее значение "1" и присваиваем это значение переменной Switch
"Turns the plugin on and off 1/0" - описание переменной (как хотим так и описываем, чтоб в конфиг файле потом было понятно что она делает)
FCVAR_NOTIFY - сам не знаю, что значит. Просто в образце (другом плагине) было так

tLIMIT = CreateConVar("time_tele","20.0","time v sec");

Все тоже самое, ток нет FCVAR_NOTIFY (опять же по образцу)

HookEvent("round_freeze_end", RoundFreezeEnd);

HookEvent - команда означающая, что плагин будет отслеживать определенное событие
"round_freeze_end" - событие, которое отслеживается. Количество таких событий ограничено и из каждого можно почерпнуть какие-то данные
Например из "player_death" можно выковырять кого убили, кто убил, каким оружием, был ли хедшот и еще что-то.
В данном случае мв тупо регистрируем само событие.
Т.е. если оно происходит выполняем какое-нить действие.
В данном случае RoundFreezeEnd (название не принципиально, но в плагине необходимо его расписать)

HookEvent("player_spawn", PlayerSpawn);

Тоже самое. Только регистрируется событие Спаун. Т.е. когда игрок спаунится выполняется последовательность, описанная в PlayerSpawn
Отсюда мы правда выковыриваем кто респаунился и все действия производим с ним.

Весь остальной текст - описание этих последовательностей (действий) и подпоследовательностей


Часовой пояс GMT +5, время: 02:27.

Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot
Khorost Group© 2002-2021