Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
arxlex

[0.63] Закрытая зона для режима PVP

Рекомендованные сообщения

mastaZz zonepvp_pos у тебя массив, а коде if должна быть vector

обьяви в начале функции vector zonepvp_pos_current;

затем перед проверкой зоны в тащи в нее элемент массива и уже тогда проверяй

 

И еще

Пользователей ты перебрал

А положение пользователя относительно каждой зоны?

 

Внутри цикл не забыл?

Подними глаза

 

И переменную player надо в начале функции обьявлять а не в цикле

 

Вот
Сравни со своим кодом
 

void CheckPVPZone()
{
	TVectorArray zonepvp_pos = {"5231.25 0 9820.31", "5180.73 0 9907.51"};// Координаты для центра зоны
	ref array<Man> players = new array<Man>; 
	GetGame().GetPlayers( players );
	PlayerBase player; //ПЕРЕМЕННЫЕ ОБЬЯВЛЯЕМ ТУТ! ИБО В ЦИКЛЕ БУДЕТ ОШИБКА ТК ОНИ БУДУТ ОБЬЯВЛЕНЫ НЕСКОЛЬКО РАЗ
	vector zonepvp_pos_current;
	float newHeal;
	vector position_player;
		
	if ( players.Count() > 0 )
	{
		for ( int i = 0; i < players.Count(); i++ ) 
		{
			Class.CastTo(player, players.Get(i));
			position_player	=	player.GetPosition();
			for ( int x = 0; x < zonepvp_pos.Count(); x++ ) //ТЫ НИЧЕГО НЕ ЗАБЫЛ???
			{

				zonepvp_pos_current = zonepvp_pos.Get(x); //СНАЧАЛА ИЗ ЭЛЕМЕНТ МАССИВА c номером X загоним в переменную!!! 
				if( (vector.Distance(position_player,zonepvp_pos_current)) > 350) //дистанция от центра к игроку, откуда игрок будет получать предупреждения и урон
				{
					newHeal = player.GetHealth("", "") - 1; //1 - это урон для игрока
					player.SetHealth("", "", newHeal);
					string messPlayers = "эй ты (" + player.GetIdentity().GetName() + ") пиздуй обратно, а то здохнеш!";
					Param1<string> m_MessageParam = new Param1<string>(messPlayers); 
					GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); 
				}
			}
		}
	}
}

И     if ( players.Count() > 0 ) тут лишняя конструкция поскольку если игроков будет 0 цикл и так не выполнется
 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах



mastaZz 

1 час назад, mastaZz сказал:

float dist = vector.Distance(player.GetPosition(),zonepvp_pos);
несовместимый параметр zonepvp_pos

Ну когда дойдет, что float и vector вещи "немного" разные, то дальше будет проще...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

BorizzK  спасибо что помогаешь

Изменено пользователем mastaZz (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

BorizzK незнаешь почему в игре радиус зоны сильно уменьшился от того что было до этого(раза в 4) хоть цифра радиуса осталась прежней 350

Изменено пользователем mastaZz (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, mastaZz сказал:

BorizzK незнаешь почему в игре радиус зоны сильно уменьшился от того что было до этого(раза в 4) хоть цифра радиуса осталась прежней 350

Скорее всего потому что есть учет высоты при измерении дистанции. смотри соседнюю тему, там выложен скрипт на измерение дистанции БЕЗ учета высоты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

BorizzK  вот здесь 1й вариант

В 22.10.2018 в 17:42, mastaZz сказал:

BorizzK так ошибку выдаёт


	override void OnInit() //показывает сколько играков и пвп
	{

		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(NumPLayersOnServer, 60000, true);		// 10 min
		
		super.OnInit();
		
		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckPVPZone, 1000, true); //pvp
		
	}
	
	void CheckPVPZone()//pvp
	{
		TVectorArray zonepvp_pos = {5231.25, 0, 9820.31};// Координаты для центра зоны	
		ref array<Man> players = new array<Man>; 
		GetGame().GetPlayers( players );
		if ( players.Count() > 0 )
		{
			for ( int i = 0; i < players.Count(); i++ ) 
			{
				PlayerBase player; 
				Class.CastTo(player, players.Get(i));
				float dist = vector.Distance(player.GetPosition(),zonepvp_pos);
				if(dist > 349) //дистанция от центра к игроку, откуда игрок будет получать предупреждения и урон
				{
					float newHeal = player.GetHealth("", "") - 1; //1 - это урон для игрока
					player.SetHealth("", "", newHeal);
					string messPlayers = "эй ты (" + player.GetIdentity().GetName() + ") пиздуй обратно, а то здохнеш!";
					Param1<string> m_MessageParam = new Param1<string>(messPlayers); 
					GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); 
				}
			}
		}
	}

на следущей точке после TVectorArray zonepvp_pos = {5231.25, 0, 9820.31};// Координаты для центра зоны    

и то что ты предложил 
 

 

В 22.10.2018 в 19:36, BorizzK сказал:

mastaZz zonepvp_pos у тебя массив, а коде if должна быть vector

обьяви в начале функции vector zonepvp_pos_current;

затем перед проверкой зоны в тащи в нее элемент массива и уже тогда проверяй

 

И еще

Пользователей ты перебрал

А положение пользователя относительно каждой зоны?

 

Внутри цикл не забыл?

Подними глаза

 

И переменную player надо в начале функции обьявлять а не в цикле

 

Вот
Сравни со своим кодом
 


void CheckPVPZone()
{
	TVectorArray zonepvp_pos = {"5231.25 0 9820.31", "5180.73 0 9907.51"};// Координаты для центра зоны
	ref array<Man> players = new array<Man>; 
	GetGame().GetPlayers( players );
	PlayerBase player; //ПЕРЕМЕННЫЕ ОБЬЯВЛЯЕМ ТУТ! ИБО В ЦИКЛЕ БУДЕТ ОШИБКА ТК ОНИ БУДУТ ОБЬЯВЛЕНЫ НЕСКОЛЬКО РАЗ
	vector zonepvp_pos_current;
	float newHeal;
	vector position_player;
		
	if ( players.Count() > 0 )
	{
		for ( int i = 0; i < players.Count(); i++ ) 
		{
			Class.CastTo(player, players.Get(i));
			position_player	=	player.GetPosition();
			for ( int x = 0; x < zonepvp_pos.Count(); x++ ) //ТЫ НИЧЕГО НЕ ЗАБЫЛ???
			{

				zonepvp_pos_current = zonepvp_pos.Get(x); //СНАЧАЛА ИЗ ЭЛЕМЕНТ МАССИВА c номером X загоним в переменную!!! 
				if( (vector.Distance(position_player,zonepvp_pos_current)) > 350) //дистанция от центра к игроку, откуда игрок будет получать предупреждения и урон
				{
					newHeal = player.GetHealth("", "") - 1; //1 - это урон для игрока
					player.SetHealth("", "", newHeal);
					string messPlayers = "эй ты (" + player.GetIdentity().GetName() + ") пиздуй обратно, а то здохнеш!";
					Param1<string> m_MessageParam = new Param1<string>(messPlayers); 
					GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); 
				}
			}
		}
	}
}

И     if ( players.Count() > 0 ) тут лишняя конструкция поскольку если игроков будет 0 цикл и так не выполнется
 

в моём варианте радиус 349 в твоём 350, но разница в пвп зоне такая большая что я сначала даже подумал что твой скрипт не работает потому что почти везде где раньше была пвп зона начало дэмажить 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

mastaZz НЗ
Надо проверять код и логгировать переменные

 

Выложи именно свой скрипт и как ты его инициализируешь/запускаешь

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

BorizzK спасибо я решил проблему там и в правду оказалось дело в высоте как и говорил NoNameUltima 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

BorizzK  опять начал разбираться при последнем варианте(который выше) работает почему то, только 1 указанная пвп зона

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

BorizzK  мне подсказали такой вариант, но в нём зоны работают адекватно только у первого игрока, потом по наростанию, число зон работает всё меньше, вплоть до того что у 5го не 1 зона не работает и он всегда получает урон.
 

static vector zonepvp_pos1 = {5217.25, 0, 9786.31};// point1
static vector zonepvp_pos2 = {5217, 0, 9834};// point2
static vector zonepvp_pos3 = {5182, 337.198, 9900};
static vector zonepvp_pos4 = {5295, 337.198, 9847};
static vector zonepvp_pos5 = {5224.25, 0, 9786.31};
	
	override void OnInit() 
	{

		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(NumPLayersOnServer, 60000, true);		// 10 min // DOES NOT BELONG TO PVP ZONE!!!
		
		super.OnInit();
		
		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckPVPZone, 5000, true); //pvp //CHANGED TO 5 SECONDS TO AVOID SERVER STRESS
		
	}
	
	void CheckPVPZone()//pvp
	{
		bool in_zone1 = true;
		bool in_zone2 = true;
		bool in_zone3 = true;
		bool in_zone4 = true;
		bool in_zone5 = true;
		ref array<Man> players = new array<Man>; 
		GetGame().GetPlayers( players );
		if ( players.Count() > 0 )
		{
			for ( int i = 0; i < players.Count(); i++ ) 
			{
				PlayerBase player; 
				Class.CastTo(player, players.Get(i));
				float dist1 = vector.Distance(player.GetPosition(),zonepvp_pos1);
				float dist2 = vector.Distance(player.GetPosition(),zonepvp_pos2);
				float dist3 = vector.Distance(player.GetPosition(),zonepvp_pos3);
				float dist4 = vector.Distance(player.GetPosition(),zonepvp_pos4);
				float dist5 = vector.Distance(player.GetPosition(),zonepvp_pos5);
				if (dist1 > 345) in_zone1 = false; //DISTANCE ZONE 1
				if (dist2 > 345) in_zone2 = false;// DISTANCE ZONE 2
				if (dist3 > 23) in_zone3 = false;//гаражи
				if (dist4 > 23) in_zone4 = false;//красные контейнера
				if (dist5 > 345) in_zone5 = false;//у бараков
				if(!in_zone1 && !in_zone2 && !in_zone3 && !in_zone4 && !in_zone5) //distance from the center to the player, from where the player will receive warnings and damage
				{
					float newHeal = player.GetHealth("", "") - 5; //5 - this is damage to the player //CHANGED TO 5 BECAUSE OF TIME-CHANGE ABOVE
					player.SetHealth("", "", newHeal);
					string messPlayers = "Эй!(" + player.GetIdentity().GetName() + ") вернись или умрёшь!";
					Param1<string> m_MessageParam = new Param1<string>(messPlayers); 
					GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); 
				}
			}
		}
	}

всему виной конструкция которую ты писал выше ???
 

if ( players.Count() > 0 )

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Уберите эту конструкцию, она бесполезна на самом деле

Тк цикл не выполнится, если игроков 0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
21 час назад, BorizzK сказал:

Уберите эту конструкцию, она бесполезна на самом деле

Тк цикл не выполнится, если игроков 0

Только что проверил — даже при пустом сервере функция вызывается.

 

Зачем проверять все зоны, если человек находится хотя бы в одной из них.

Я бы сделал как-то так (просто набросок в блокноте, т.ч. в работоспособности кода уверенности нет!!!):

void CheckPVPZone()
{
	if( players.Count() > 0 ) {
		ref array<Man> players = new array<Man>;
		GetGame().GetPlayers( players );
		for( int i = 0; i < players.Count(); i++ ) {
			PlayerBase player; 
			Class.CastTo(player, players.Get(i));
			if(PZCheckPlayer(player, zonepvp_pos1, 345)) continue;
			if(PZCheckPlayer(player, zonepvp_pos2, 345)) continue;
			if(PZCheckPlayer(player, zonepvp_pos3, 23)) continue;
			if(PZCheckPlayer(player, zonepvp_pos4, 23)) continue;
			if(PZCheckPlayer(player, zonepvp_pos5, 345)) continue;
			float newHeal = player.GetHealth("", "") - 5;
			player.SetHealth("", "", newHeal);
			string messPlayers = "Эй!(" + player.GetIdentity().GetName() + ") вернись или умрёшь!";
			Param1<string> m_MessageParam = new Param1<string>(messPlayers); 
			GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); 
		}
	}
}

bool PZCheckPlayer(ref player, vector zone_pos, float radius) {
	float dist = vector.Distance(player.GetPosition(), zone_pos);
	if (dist > radius) {
		return false;
	}
	return true;
}

 

Изменено пользователем elanc
Под вечер перепутал continue с break! =) (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, elanc сказал:

Только что проверил — даже при пустом сервере функция вызывается.

 

2 часа назад, elanc сказал:

for( int i = 0; i < players.Count(); i++ ) {

Ну тогда эта конструкция у тебя возвращает мифы и легенды.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, elanc сказал:

Зачем проверять все зоны, если человек находится хотя бы в одной из них.

Для этого switсh case придумали

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, NoNameUltima сказал:

 

Ну тогда эта конструкция у тебя возвращает мифы и легенды.

а! теперь понял.. короче, с такой точки зрения у нас, наверное, в 99% проектов нужно удалять эту строку.. она здесь для читабельности кода.. =)

 

2 часа назад, NoNameUltima сказал:

Для этого switсh case придумали

сначала тоже про него подумал, только теперь попробуйте его на практике применить в данном куске кода… =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, NoNameUltima сказал:

elanc у меня он нормально применен.

Требуем пруфы в студию!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

elanc Какой пруф? За тебя написать, то к чему даже и case не нужен по факту?
Задачка для дошкольников:

class Zona
	{
		vector	cv_Position	=	{0,0,0};
		int		cv_Radius	=	0;
		
		void Zona(vector v_Position, int v_Radius)
			{
				cv_Position	=	v_Position;
				cv_Radius	=	v_Radius;
			}
			
		bool inZone(PlayerBase v_player)
			{
				if ( vector.Distance(v_player.GetPosition(), cv_Position) < cv_Radius )
					{reutrn true;}
				return false;
			}
	}
	
class Zones
	{
		static	ref array<ref Zona> cv_Zones	=	new array<ref Zona>;
					
		static void InsertZone(vector v_Position, int v_Radius)
			{cv_Zones.Insert( new Zona(v_Position, v_Radius) );}
		
	}

.......	
Zones.InsertZone( Vector(0,0,0), 100 );
.......

ref array<Man>	v_Players	=	new array<Man>;
PlayerBase		v_Player	=	NULL; 
int				v_I			=	0;
int				v_X			=	0;

GetGame().GetPlayers( v_Players );
for( v_I = 0; v_I < v_Players.Count(); v_I++ )
	{
		v_Player	=	v_Players[v_I];
		for( v_X = 0; v_X < Zones.cv_Zones.Count(); v_X++ )
			{
				if ( Zones.cv_Zones[v_X].inZone(v_Player) )
					{
						//Что то делаем
						break;
					}
			}
	}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

NoNameUltima вообще то разговор был об использовании конструкции switch-case в данном случае... :geek:

но кому-нибудь и этот код пригодится как пример..

Изменено пользователем elanc (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

elanc 
Чет даж не представляю как в контексте данной задачи применить конструкцию switch case


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.