![]() |
|
Общие вопросы. 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) | |
|
|