![]() |
|
|||||||
| Общие вопросы. ZM Обсуждаем вопросы связанные непосредственно с игрой |
|
|
Опции темы | Опции просмотра |
|
|
#29 |
|
Читатель
Регистрация: 12.01.2008
Сообщений: 2,089
Поблагодарил(а): 644
Получил(а): 492 "Спасибо" за 339 сообщений
Сказал(а) Фууу!: 25
Сказали Фууу! 22 раз(а) в 13 сообщениях
Репутация: 514 ![]() ![]() ![]() ![]() ![]() ![]() |
Код:
#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);
}
}
-----------добавлено----------- Хотя, погорячился. Если кто-то зайдет в начале раунда, то респанется он чуть позже, и портнется соответственно тоже позже, поэтому первый таймер лучше оставить как есть (чтоб его могло вовремя портнуть при переборе) и добавить третий. Я думаю принцип понятен, поэтому еще один вариант приводить не буду.
__________________
Здесь слово "русский" не вполне политкорректно, Вот "россиянин" - это "чисто" и "конкретно". (с) Кинчев Последний раз редактировалось TPOLI,KUU[B/IKCM]; 02.07.2009 в 00:02.. Причина: Склейка мультипостинга |
|
|
|
| Этот человек поблагодарил пользователя TPOLI,KUU[B/IKCM] за полезное сообщение: | |
NightDeagle.rus (02.07.2009)
|
|
| Закладки |
| Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|