Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
Vladsivko

Купол защиты. HELP

Всем доброго времени суток. Я новичек во всех этих скриптовых делах, по этому и прошу помощи...

Хочу переработать скрипт от elanc, этот скрипт добавляет радиационную зону.

Есть идея переделать его так чтобы радиация не действовала на игроков с определенным uid, а всех остальных  убивало. 

Короче говоря сделать некую приват клан базу.

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

 

class Zone {
	int id;
	int type;
	vector pos;
	float radius;
}

enum ZoneType {
	SAFE,
	GAS,
	RAD,
	BIO
}

ref array<ref Zone> ga_zones = new array<ref Zone>;

ref ControllerZones ctrl_zones = new ControllerZones;

class ControllerZones {
	void ControllerZones() {
		
		int id = 0;
		vector pos;
		float radius;
		int type = 0;

		id = 1;                    // Координаты базы.
		pos = "2125 0 3400"; 
		radius = 100.0;
		AddZone(id, pos, radius);
		
		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, 5000, true);
	}
	
	void ~ControllerZones() {
	}
	
	void AddZone(int id, vector pos, float radius, int type = ZoneType.BIO) {
		ref Zone zone = new ref Zone;
		
		zone.id = id;
		zone.pos = pos;
		zone.radius = radius;
		zone.type = type;

		ga_zones.Insert(zone);
	}
	
	bool InZone(PlayerBase player, ref Zone zone) {
		vector player_position = player.GetPosition();
		player_position[1] = 0;

		if( (vector.Distance(player_position, zone.pos)) < zone.radius ) {
			
			EntityAI attachment;
			ItemBase item;
			string className;
			float biosafe = 0;
			
			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) {
				item		=	Class.Cast(attachment);
				className	=	item.GetType();
				if ( className.Contains("GP5GasMask") ) {
					biosafe = biosafe + 6.0; //Значение 6.0 не умирает в противогазе
				}
			}
			
			if ( biosafe > 1.0 )
				return true;
			
			float damage_player;
			float damage_zone = 6.0;    // если значение 0 то не умирает
			damage_player = player.GetHealth("GlobalHealth", "Health");
			player.SetHealth("GlobalHealth", "Health", damage_player - (damage_zone - ((damage_zone / 6) * biosafe)));
			
			player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_COUGH);  //Включает кашель
			
			Param1<string> m_MessageParam = new Param1<string>("Вам нужны химзащита и противогаз!");  //Cообщение в чат
			GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); 
			
			return true;
		}
		
		return false;
	}
	
	void CheckZones() {
		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));
			
			for ( int j = 0; j < ga_zones.Count(); j++ ) {
				if(InZone(player, ga_zones.Get(j))) {
					break;
				}
			}
		}
	}
}

 

Edited by Vladsivko (see edit history)

Share this post


Link to post
Share on other sites

Recommended Posts

  • 0

Кто подскажет, работает ли это в последней версии? 

Цитата

if ((getPlayerUID player) in ['76561198022484499', '76561198022484499', '76561198022484499']) then{
    }

или это..

Цитата

if ((getPlayerUID player) == '76561198022484499') then{
    }

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

 

Помогите кто знает пожалуйста !

Share this post


Link to post
Share on other sites









  • 0

Vladsivko

 

if ( player.GetIdentity().GetPlainId() == "00000000000000000")

 

тут вообще язык другой -  не SQF

Потрудитесь изучить форум

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0
50 минут назад, BorizzK сказал:

Vladsivko

 

if ( player.GetIdentity().GetPlainId() == "00000000000000000")

 

тут вообще язык другой -  не SQF

Потрудитесь изучить форум

Спасибо, я на форуме уже неделю сижу) 

Как я понял это enfusion движок и язык у него схож с c++?

Или я не прав?

Share this post


Link to post
Share on other sites
  • 0

BorizzK Не сочти за наглость) прошу еще помощи!! 

Подскажи как  тут каждой зоне присвоить свои условия?

class Zone {
	int id;
	int type;
	vector pos;
	float radius;
}

enum ZoneType {
	SAFE,
	GAS,
	RAD,
	BIO
}

ref array<ref Zone> ga_zones = new array<ref Zone>;

ref ControllerZones ctrl_zones = new ControllerZones;

class ControllerZones {
	void ControllerZones() {
		
		int id = 0;
		vector pos;
		float radius;
		int type = 0;

		id = 1; // Pavlovo
		pos = "2125 0 3400"; 
		radius = 200.0;
		AddZone(id, pos, radius);
		
		id = 2; // Zeleno
		pos = "2530 0 5112";
		radius = 150.0;
		AddZone(id, pos, radius);
		
		id = 3; // Dichina
		pos = "4524 0 8290";
		radius = 50.0;
		AddZone(id, pos, radius);
		
		id = 4; // Mushkino
		pos = "1150 0 7235";
		radius = 100.0;
		AddZone(id, pos, radius);
		
		id = 5; // Aero SW
		pos = "4586 0 9533";
		radius = 220.0;
		AddZone(id, pos, radius);
		
		id = 6; // Aero SE
		pos = "5177 0 9960";
		radius = 350.0;
		AddZone(id, pos, radius);
		
		id = 7; // Aero W
		pos = "4228 0 10400";
		radius = 350.0;
		AddZone(id, pos, radius);
		
		id = 8; // Aero E
		pos = "4785 0 10530";
		radius = 250.0;
		AddZone(id, pos, radius);
		
		id = 9; // Aero N
		pos = "4290 0 10956";
		radius = 250.0;
		AddZone(id, pos, radius);
		
		id = 10; // Tisy
		pos = "1600 0 14030";
		radius = 600.0;
		AddZone(id, pos, radius);
		
		id = 11; // Troitskoe
		pos = "7893 0 14689";
		radius = 300.0;
		AddZone(id, pos, radius);
		
		id = 12; // Aero NN
		pos = "4035 0 11700";
		radius = 250.0;
		AddZone(id, pos, radius);
		
		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, 5000, true);
	}
	
	void ~ControllerZones() {
	}
	
	void AddZone(int id, vector pos, float radius, int type = ZoneType.BIO) {
		ref Zone zone = new ref Zone;
		
		zone.id = id;
		zone.pos = pos;
		zone.radius = radius;
		zone.type = type;

		ga_zones.Insert(zone);
	}
	
	bool InZone(PlayerBase player, ref Zone zone) {
		vector player_position = player.GetPosition();
		player_position[1] = 0;

		if( (vector.Distance(player_position, zone.pos)) < zone.radius ) 
		{
			
			EntityAI attachment;
			ItemBase item;
			float biosafe = 0;
			
			attachment = player.FindAttachmentBySlotName("Mask");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if ( item.GetType().Contains("GP5GasMask") && ((item.GetHealth()) > 40) ) 
  				{
					biosafe = biosafe + 1.0; 
				}
			}

			attachment = player.FindAttachmentBySlotName("Headgear");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if ( item.GetType().Contains("NBCHoodGray") && ((item.GetHealth()) > 40) ) 
  				{
					biosafe = biosafe + 1.0; 
				}	
			}

			attachment = player.FindAttachmentBySlotName("Body");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if ( item.GetType().Contains("NBCJacketGray") && ((item.GetHealth()) > 40) ) 
  				{
					biosafe = biosafe + 1.0; 
				}	
			}

			attachment = player.FindAttachmentBySlotName("Legs");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if ( item.GetType().Contains("NBCPantsGray") && ((item.GetHealth()) > 40) ) 
  				{
					biosafe = biosafe + 1.0; 
				}	
			}

			attachment = player.FindAttachmentBySlotName("Feet");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if ( item.GetType().Contains("NBCBootsGray") && ((item.GetHealth()) > 40) ) 
  				{
					biosafe = biosafe + 1.0; 
				}
			}

			attachment = player.FindAttachmentBySlotName("Gloves");
			if ( attachment && attachment.IsItemBase() ) 
			{
				item		=	ItemBase.Cast(attachment);
				if ( item.GetType().Contains("NBCGlovesGray") && ((item.GetHealth()) > 40) ) 
  				{
					biosafe = biosafe + 1.0; 
				}
			}
			
			if ( biosafe > 5.0 )
				return true;
			
			float damage_player;
			float damage_zone = 6.0;
			damage_player = player.GetHealth("GlobalHealth", "Health");
			player.SetHealth("GlobalHealth", "Health", damage_player - (damage_zone - ((damage_zone / 6) * biosafe)));
			
			player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_COUGH);
			player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_VOMIT);
			
			Param1<string> m_MessageParam = new Param1<string>("Оденьте ОЗК и ПРОТИВОГАЗ!!!");
			GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); 
			
			return true;
		}
		
		return false;
	}
	
	void CheckZones() {
		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));
			
			for ( int j = 0; j < ga_zones.Count(); j++ ) {
				if(InZone(player, ga_zones.Get(j))) {
					break;
				}
			}
		}
	}
}

То есть  например   чтобы  в одну зону можно было с одним сетом зайти а во вторую зону уже с другим сетом одежды..

 

А то тут ко всем зонам одно условие применяется. Сижу, голову ломаю уже пятый час! 

 

Пробовал в init подключить такой же скрипт только с другими координатами и условием. Сервер не стартовал.

Edited by Vladsivko (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Vladsivko мы вроде это все обсосали вдоль и поперек в теме по enScript

Как раз над этим кодом глумились

Share this post


Link to post
Share on other sites
  • 0

Vladsivko кстати насчет 'куполов защиты от входа' так называемых я бы подумал о баллансе спавна лута на карте, т.к. официальная бд сервака поддерживает примерно указанное количество каждой шмотки на карте с учетом ее в схронах и авто, то с течением времени игроки будут тырить лут на базы такие и хранить их. А поскольку их не зарейдить никак, то рано или поздно наступит точка пика, когда все калаши, например, будт у кого-то на базах, и они почти не будут использоваться. Вывод знаете о том, что игроки будут говорить?) Так что подумайте трижды над вводом такой, казалось бы, безобидной фичи.

Share this post


Link to post
Share on other sites
  • 0

123new Так оно скорее всего и будет. Но просто я поставил себе задачу сделать такой скрипт, вот и пытаюсь.  За одно и в тему скриптинга немного вникну. 

 

Share this post


Link to post
Share on other sites
  • 0

123new не подскажешь где можно посмотреть уроки, примеры, основы скриптов? Так сказать чтобы хотя бы вникнуть в логику построения. 

Share this post


Link to post
Share on other sites
  • 0

Vladsivko НУ тема есть по enScript + куча скриптов по форуму

+ тема про создания сервера

+ справочные материалы по enScript на сайте богемии

https://community.bistudio.com/wiki/DayZ:Enforce_Script_Syntax

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

BorizzK я вчера листал тему по enScript, там где как раз про deadzone. Голова закипела пока пытался все это понять)) 

Для себя я понял, для того чтобы для каждой зоны были свои условия надо зонам давать свои "метки" что ли.?

 

И потом делать условия что то вроде:

 

Если положение игрока < радиуса зоны ,и если эта зона zoneID1 то...

 

Короче как то так пока вижу.

 

Share this post


Link to post
Share on other sites
  • 0

Vladsivko для каждой зоны создается свой экземпляр класса и в нем присваиваются значения перемнных

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

 

да там все разжовано более чем

 

я это все многократно переделал улучшил итд итп

 

кода не выкладывал пока тк в процессе доработки

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

В итоге так все заработало) 
            

Цитата

if( (vector.Distance(player_position, zone.pos)) < zone.radius ) 
{
            
   float biosafe = 0;
     

   if (zone.id == 1)

      {           
            if ( player.GetIdentity().GetPlainId() == 76561198022484400 ) 
                {
                    biosafe = biosafe + 25.0; 
                }
       }
            
     if (zone.id == 2)

        {
            
            if ( player.GetIdentity().GetPlainId() == 76561198022484499 ) 
           {
                    biosafe = biosafe + 25.0;
        }         

  }
            

Share this post


Link to post
Share on other sites
  • 0

BorizzK Только мне теперь бы узнать как  сделать так: if ( player.GetIdentity().GetPlainId() == uid  uid  uid uid )  ксобки, ковычки и т.д не работают(

Share this post


Link to post
Share on other sites
  • 0

BorizzK через массив это будет примерно так? 

string UID = {"uid", "uid"};

 

if ( player.GetIdentity().GetPlainId() == UID) 

Share this post


Link to post
Share on other sites
  • 0

Vladsivko не так

потрудитесь открыть вики богемии и прочитать доку по enscript (он похож на c#)  enfusion syntax

 

Про массив

 

array<string> uids = {"uid1", "uid2" };

 

if (uids.Find(player.GetIdentity().GetPlainId()) > -1)

{

//Тут код выполняемый по условию

}

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

BorizzK Привет ребят. Такой вопрос по теме купола защиты. 

Есть скрипт с темы.

Пытался реализовать этот скрипт для купола защиты немного не получается игрока под землю телепортирует при входе в зону зашиты.

 

void TeleportToPos(vector pos, float distance) // Teleport all players to airdrop position on land + distance
 {
  ref array<Man> players = new array<Man>;
  GetGame().GetPlayers( players );
  vector teleport_pos;
  
  for ( int i = 0; i < players.Count(); i++ )
  {
   teleport_pos[0] = pos[0] + distance;
   teleport_pos[2] = pos[2] + distance;
   teleport_pos[1] = GetGame().SurfaceY(teleport_pos[0], teleport_pos[2]);
 
   PlayerBase iplayer;
   Class.CastTo(iplayer, players.Get(i));
   
   SendMessage("You are teleport to: " + teleport_pos.ToString());
   Print("Player " + iplayer.ToString () + " teleport to: " + teleport_pos.ToString());
   iplayer.SetPosition(teleport_pos);
   iplayer.PlaceOnSurface();
  }
 }

Я этот скрипт обрезал теперь он выглядит так.

 ref array<Man> players = new array<Man>;
  GetGame().GetPlayers( players );
  
  for ( int i = 0; i < players.Count(); i++ )
  {
     PlayerBase iplayer;
     Class.CastTo(iplayer, players.Get(i));
   
     player_position[1] = +5;
     player.SetPosition(player_position);
  }

Цель такова. Когда игрок будет заходить в зону его должно откидывать примерно от 5 до 10 метров назад.
Подскажите пожалуйста что я делаю не так?
Не судите строго я только УЧУССС.
За ранние спасибо.

Share this post


Link to post
Share on other sites
  • 0

Troy1 
teleport_pos[0] = pos[0] + distance;
teleport_pos[2] = pos[2] + distance;

 

вот это совершенно не понятно

 

distance это что???? откуда?

 

PlayerBase iplayer;
Class.CastTo(iplayer, players.Get(i));

зачем?

просто используйте

 

players[i]

апксатить из Man в PlayerBase не надо - апкастится оно само при присвоении переменной
вот даункастить надо обязательно
 

 player_position[1] = +5;

Вы его вверх ТПэшите?

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

BorizzK Это я тестил и как бы я не менял у меня игрок вниз под землю улетает.

Если возможно можно пример?

В С# можно эти скрипты писать?

 

Share this post


Link to post
Share on other sites
  • 0

Troy1 

player_position[1] = +5;

это Вы высоту меняете

 

teleport_pos[0] = pos[0] + distance;
teleport_pos[2] = pos[2] + distance;

тут вообще неясно - ибо вы смещаете игрока в направлении верхнего правого угла карты - в не в направлении куда он смотрит/идет/ползет

 

ну предположим так оно и должно быть

 

но - если подойти к этому вопросу правильно, то смещать надо назад или вперед относительно вектора его ориентации

 

те позицию куда ег ов данном случае перемещать над расчитать

 

вектор его положения на плоскости мы знаем -

player.GetOrientation()[0]

 

и его координаты мы знаем

 

и расстояние на сколько двигать

 

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

 

как раз такую задачку я решал пару дней назад

 

в ПОМОЩИ есть тема

 

и ее продолжение

 

 

 

 

Share this post


Link to post
Share on other sites
  • 0

Troy1 А глОза и Поиск для чего человеку?

Те зная текущую координату и вктор направления (угол) (значение первого элемента из vector полученный с помощью GetOrientation()) и зная расстояние в метрах (на сколько перемещать) с помощю функции из той темы мы сможем получить координату куда смещать игрока вперед или назад

если вперед - то угол к вектору плюсовать не будем - он будет 0, если же назад - то угол 180
 

Дерзайте

Edited by BorizzK (see edit history)

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.