![]() |
|
|||||||
| Общие вопросы. ZM Обсуждаем вопросы связанные непосредственно с игрой |
![]() |
|
|
Опции темы | Опции просмотра |
|
|
#31 |
|
Читатель
Регистрация: 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)
|
|
|
|
#32 |
|
0.0
Капитан
Регистрация: 19.12.2008
Адрес: Москва,Бутово.
Имя: Гриха.
Сообщений: 873
Поблагодарил(а): 62
Получил(а): 88 "Спасибо" за 67 сообщений
Сказал(а) Фууу!: 0
Сказали Фууу! 0 раз(а) в 0 сообщениях
Репутация: 85 ![]() |
Основное понятно,а вот то,что внутри,более интересней...
|
|
|
|
| Реклама |
|
|
#33 |
|
Читатель
Регистрация: 12.01.2008
Сообщений: 2,089
Поблагодарил(а): 644
Получил(а): 492 "Спасибо" за 339 сообщений
Сказал(а) Фууу!: 25
Сказали Фууу! 22 раз(а) в 13 сообщениях
Репутация: 514 ![]() ![]() ![]() ![]() ![]() ![]() |
где внутри?
|
|
|
|
|
|
#34 | |
|
0.0
Капитан
Регистрация: 19.12.2008
Адрес: Москва,Бутово.
Имя: Гриха.
Сообщений: 873
Поблагодарил(а): 62
Получил(а): 88 "Спасибо" за 67 сообщений
Сказал(а) Фууу!: 0
Сказали Фууу! 0 раз(а) в 0 сообщениях
Репутация: 85 ![]() |
В самом скрипте) Допустим :
Цитата:
То что показал. То что хотелось узнать... |
|
|
|
|
|
|
#35 |
|
Читатель
Регистрация: 12.01.2008
Сообщений: 2,089
Поблагодарил(а): 644
Получил(а): 492 "Спасибо" за 339 сообщений
Сказал(а) Фууу!: 25
Сказали Фууу! 22 раз(а) в 13 сообщениях
Репутация: 514 ![]() ![]() ![]() ![]() ![]() ![]() |
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 Отсюда мы правда выковыриваем кто респаунился и все действия производим с ним. Весь остальной текст - описание этих последовательностей (действий) и подпоследовательностей
__________________
Здесь слово "русский" не вполне политкорректно, Вот "россиянин" - это "чисто" и "конкретно". (с) Кинчев Последний раз редактировалось TPOLI,KUU[B/IKCM]; 02.07.2009 в 01:55.. |
|
|
|
![]() |
| Закладки |
| Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
| Опции темы | |
| Опции просмотра | |
|
|