Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Нужна помощь?

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

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

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

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

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

Recommended Posts

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

 

Данный скрипт создает в зоне карты зону для режима 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()); 
				}
			}
		}
	}
    
    ...
          
}

 

Edited by arxlex (see edit history)

Share this post


Link to post
Share on other sites



Может кому интересно, прилагаю координаты спавна(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>

 

Edited by arxlex (see edit history)

Share this post


Link to post
Share on other sites

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

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

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

Оч удобно

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
В 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"};// Координаты для центра зоны

 

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

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites

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 в котором высота соответствует поверхности

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
7 минут назад, mastaZz сказал:

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

 

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
1 минуту назад, mastaZz сказал:

{5231.25, 0, 9820.31}

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

 

{"5231.25 0 9820.31"}

Share this post


Link to post
Share on other sites
1 минуту назад, mastaZz сказал:

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

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

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

vector ZoneCenter = "0 0 0";

 

Share this post


Link to post
Share on other sites

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
         { 
             //значит игрок не в зоне
         }             
    } 
} 

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

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

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"};// Координаты для центра зоны
выдало ошибку и написало не совместимые параметры(((

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.