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

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

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

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

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

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

Хочу переработать скрипт от 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;
				}
			}
		}
	}
}

 

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

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


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

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

  • 0

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

Цитата

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

или это..

Цитата

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

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

 

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

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


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





  • 0

Vladsivko

 

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

 

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

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

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

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


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

Vladsivko

 

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

 

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

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

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

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

Или я не прав?

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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 подключить такой же скрипт только с другими координатами и условием. Сервер не стартовал.

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

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


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

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

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

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


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

BorizzK 

 

Сейчас перечитаю... спасибо

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


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

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

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


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

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

 

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


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

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

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


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

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

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

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

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

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

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


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

BorizzK спасибо за ссылку. После работы ознакомлюсь. 

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


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

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

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

 

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

 

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

 

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

 

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


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

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

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

 

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

 

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

 

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

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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;
        }         

  }
            

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


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

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

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


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

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

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

 

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

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


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

Vladsivko не так

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

 

Про массив

 

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

 

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

{

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

}

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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 метров назад.
Подскажите пожалуйста что я делаю не так?
Не судите строго я только УЧУССС.
За ранние спасибо.

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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;

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

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

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


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

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

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

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

 

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


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

Troy1 

player_position[1] = +5;

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

 

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

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

 

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

 

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

 

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

 

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

player.GetOrientation()[0]

 

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

 

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

 

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

 

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

 

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

 

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

 

 

 

 

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


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

BorizzK Ссылку можно на ту тему?

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


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

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

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

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

Дерзайте

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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