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

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

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • Не хотите БАН?

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

    Там вы можете продать или купить
    Всё что касается игровых серверов
arxlex

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

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

Где то на каком то сервере видел такую зону. Решил попробовать реализовать свою версию. 

 

Данный скрипт создает в зоне карты зону для режима PVP, из которого игрок не сможет выйти или уйти. Но все же если игрок решит выйти, по игроку будет нанесен урон, вплоть до того когда игрок не вернется обратно или умрет. Естественно игрок будет получать предупредительные сообщения после того как выйдет за пределы зоны.

 

class CustomMission: MissionServer
{	   
    static vector zonepvp_pos = {6518.44, 0, 2551.88};// Координаты для центра зоны

	...
	
	override void OnInit() 
	{
		super.OnInit();
      
        ...
        
		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckPVPZone, 1000, true);
	}
	
	void CheckPVPZone()
	{
		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 > 320) //дистанция от центра к игроку, откуда игрок будет получать предупреждения и урон
				{
					float newHeal = player.GetHealth("", "") - 5; //5 - это урон для игрока
					player.SetHealth("", "", newHeal);
					string messPlayers = "Игрок (" + player.GetIdentity().GetName() + ") вы покидаете PVP зону, вернитесь пожалуйста!";
					Param1<string> m_MessageParam = new Param1<string>(messPlayers); 
					GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); 
				}
			}
		}
	}
    
    ...
          
}

 

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

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


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


Может кому интересно, прилагаю координаты спавна(cfgplayerspawnpoints.xml) для тестирования

 

[Черногорск]

<generator_posbubbles>
		
		<pos x="6317.81" z="2687.81" />
		<pos x="6303.75" z="2538.75" />
		<pos x="6355.31" z="2340.94" />
		<pos x="6484.69" z="2283.75" />
		<pos x="6549.38" z="2333.44" />
		<pos x="6589.69" z="2396.25" />
		<pos x="6634.69" z="2460.00" />
		<pos x="6655.31" z="2584.69" />
		<pos x="6747.19" z="2689.69" />
		<pos x="6744.38" z="2487.19" />
		<pos x="6643.13" z="2734.69" />
		<pos x="6719.06" z="2737.50" />
		<pos x="6536.25" z="2478.75" />
		<pos x="6285.00" z="2445.00" />		
		
    </generator_posbubbles>

 

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

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


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

Я систему мизева с загрузкой из ini внедрил

Юзаю ее для всего

Доработал ее немного, добавил параметр в cfg сервера и в зависимости от параметра выбираю инишник для спавна, раздачи лута итп

Оч удобно

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

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


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

BorizzK я вообще проще сделал, по принципу sqf, если так можно назвать, несколько массивов и автовыбор нужного в зависимости от выпавшего значения. Впрочем. тема эта называется "Закрытая зона для режима PVP", а значит давайте не флудить тут информацией о прочих делах хозяйских.

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


Ссылка на сообщение
Поделиться на других сайтах
В 17.10.2018 в 16:35, arxlex сказал:

Где то на каком то сервере видел такую зону. Решил попробовать реализовать свою версию. 

 

Данный скрипт создает в зоне карты зону для режима PVP, из которого игрок не сможет выйти или уйти. Но все же если игрок решит выйти, по игроку будет нанесен урон, вплоть до того когда игрок не вернется обратно или умрет. Естественно игрок будет получать предупредительные сообщения после того как выйдет за пределы зоны.

 


class CustomMission: MissionServer
{	   
    static vector zonepvp_pos = {6518.44, 0, 2551.88};// Координаты для центра зоны

	...
	
	override void OnInit() 
	{
		super.OnInit();
      
        ...
        
		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckPVPZone, 1000, true);
	}
	
	void CheckPVPZone()
	{
		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 > 320) //дистанция от центра к игроку, откуда игрок будет получать предупреждения и урон
				{
					float newHeal = player.GetHealth("", "") - 5; //5 - это урон для игрока
					player.SetHealth("", "", newHeal);
					string messPlayers = "Игрок (" + player.GetIdentity().GetName() + ") вы покидаете PVP зону, вернитесь пожалуйста!";
					Param1<string> m_MessageParam = new Param1<string>(messPlayers); 
					GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); 
				}
			}
		}
	}
    
    ...
          
}

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


	static vector zonepvp_pos = {"5231.25, 0, 9820.31", "5186.6, 0, 9895.05"};// Координаты для центра зоны

 

прописал таким образом(точки спавна в соотвецтвуещих местах) начало дэмажеть вообще по всей карте

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


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

mastaZz кажется, где-то на форуме в теме с сейв-зонами видел, что поскольку координаты указываются в 3d виде (т.е. х у z), то и дистанция по точкам считается также. Надо или точные точки указывать с высотами, или брать длистанцию в виде вектора, т.е строку

float dist = vector.Distance(player.GetPosition(),zonepvp_pos);

 

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


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

123new так мы же решили этот вопрос в теме про газзону )))

 

 

В коде триггера добавляем переменную

vector gas_point;

 

перед проверкой (которая в цикле) в зоне игрок или нет

gas_point = gas_points.Get(x); //помещаем в gas_point элемент массива с координатами
gas_point[1] = GetGame().SurfaceY(gas_point[0], gas_point[2]);//меняем выстоу с 0 на высоту поверхности

и далее везде  gas_points.Get(x) у которого высота 0 меням на gas_point в котором высота соответствует поверхности

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

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


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

123new  а как точные точки указывать с данными?(

 

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

BorizzK а можно создать несколько зон с разными высотами?

Я там в теме выложил функцию промеряющую расстояния между 2 точками без учета высоты.

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


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

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};// Координаты для центра зоны    

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


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

{5231.25, 0, 9820.31}

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

 

{"5231.25 0 9820.31"}

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


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

NoNameUltima поставил кавычки не помагло((((не ругай сильно не шарю просто(

Я вообще не понимаю почему у тебя там массив.

если центр один так и пиши

vector ZoneCenter = "0 0 0";

 

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


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

mastaZz 

Ну во первых - можно сразу указать нужную высоту в координатах - типа 6500 48 6500 где 48 высота в каждом элементе массива

и убрать приземление GetGame().SurfaceY(gas_point[0], gas_point[2]);

 

А можно просто добавить элементов - TVectorArray gas_points = {"6063 0 7871", "5063 0 4571"};

И в последующем цикле проверки будет проверяться приближение к координатам из каждого элемента (зоны)

Собственно в исходном коде ничего править не надо - просто добавить координат в массив

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

разжую

for (int i = 0; i < players.Count(); i++) //цикл - пока счетчик i меньше кол-ва игроков на сервере - цикл запускается для каждого игрока (все 
//что ниже будет исполнено последовательно для каждого игрока 
{ 
	for (x = 0; x < gas_points.Count(); x++)  // цикл пока счетчик  x меньше кол-ва элементов массива - цикл запускается для каждого элемента     //массива те для каждой зоны - будет исполнено последовательно для каждой ззоны 
    {
         gas_point = gas_points.Get(x); //помещаем в gas_point элемент массива с координатами
         gas_point[1] = GetGame().SurfaceY(gas_point[0], gas_point[2]);//меняем выстоу с 0 на высоту поверхности 
         if ( (vector.Distance(position_player, gas_point)) < radius ) //ЕСЛИ расстояние от игрока до центра зоны меньше radius 
         { 
             //значит игрок в зоне 
         }
         else //ИНАЧЕ расстояние от игрока до центра зоны больше radius
         { 
             //значит игрок не в зоне
         }             
    } 
} 

читай каменты внутри кода

 

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

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


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

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", "5180.73, 0, 9907.51"};// Координаты для центра зоны
		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 > 350) //дистанция от центра к игроку, откуда игрок будет получать предупреждения и урон
				{
					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", "5180.73, 0, 9907.51"};// Координаты для центра зоны
выдало ошибку и написало не совместимые параметры(((

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


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

mastaZz А ты упертый... тебе в примере выше уже показали что запятые в веторах которые в кавычках не нужны...

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


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

NoNameUltima убрал запятые ошибка ушла в 
float dist = vector.Distance(player.GetPosition(),zonepvp_pos);
несовместимый параметр zonepvp_pos

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


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

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

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