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

Вернуться   Polygon4.Net - Тактические игры online > Общие вопросы > Другие игры > Counter-Strike : Source - ZombieMod > Общие вопросы. ZM
Справка Пользователи Календарь Галерея Закачка файлов Сообщения за день

Общие вопросы. ZM Обсуждаем вопросы связанные непосредственно с игрой

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

Здесь слово "русский" не вполне политкорректно,
Вот "россиянин" - это "чисто" и "конкретно". (с) Кинчев

Последний раз редактировалось TPOLI,KUU[B/IKCM]; 02.07.2009 в 00:02.. Причина: Склейка мультипостинга
TPOLI,KUU[B/IKCM] вне форума   Ответить с цитированием
Этот человек поблагодарил пользователя TPOLI,KUU[B/IKCM] за полезное сообщение:
NightDeagle.rus (02.07.2009)
 

Закладки


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


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


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