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

    Create a theme in the appropriate section
    No need to write everything in the chat!
  • Sell or buy?

    Use the services of a guarantor
    We will make your transaction safe
  • Don't want a BAN?

    Please read our rules
    Don't disturb the order
  • Visit the market

    There you can sell or buy
    Everything related to game servers
123new

[DayZ 0.60, 0.61, 0.62] Скрипт на спавн авто с очисткой

Recommended Posts

В данной теме напишу простенький гайд о том, как самому на своем собственном сервере DayZ установить костомный (мой) скрипт на спавн, респавн и чистку транспорта.

 

Гайд пригодится тем, кто сам делает свою сборку сервера, либо по каким-то причинам пользуется не моей сборкой сервера (где это уже сделано), а чьей-либо еще. Обращаю ваше внимание на тот факт, что часть файлов, описанных в гайде, у вас могут уже быть вынесены в другое место или названы несколько иначе (это зависит от сборки сервера, которую вы используете, например, в сборке dankdayz вся mpmissions вынесена в отдельный файл в addons сервера), гайд основывается на чистых серверных файлах игры и отталкивается от них.
Гайд сделан для версий игры с серверной частью 0.60-0.62, но может быть совместим и с другими версиями игры, если файлы серверной части игры не поменяли своего текущего месторасположения и содержания. Гайд составлен по версии серверных файлов игры 0.62 чистой "девственной" и не правленой никем версии игры.

Напоминаю заранее, в моих серверных файлах версий 0.60, 0.61 и 0.62 из моих гайдов на данном форуме это уже сделано и делать это не нужно!!!

Нам понадобятся:

1. Notepad++ https://notepad-plus-plus.org/download/

2. Ваши серверные файлы игры

 

И так, приступим.

1. Первое, что нам понадобится - создать сам скрипт. Создаем по пути: "MPMissions\dayz_Auto.ChernarusPlus\"  папку "scripts" , в ней папку "custom"  , и в ней файл с именем "SpawnCars.sqf" . Если такие папки у вас уже имеются, просто не создавайте их, а перейдите в них. Если файл с там именем уже имеется у вас, задайте ему другое имя.

2. Вписываем в созданный файл код следующего содержания (либо скачайте его):

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

diag_log format [" SpawnCar: Reading Settings ..."];
/*
	Car Spawner for DayZ Standalone v 0.60.133.913 and high versions
	author: 123new
	Thanks for help: user BorizzK from s-platoon.ru for help and tests parts script and all community for this. 
	
	Install:
	.\mpmissions\init.sqf
	Add in end file:
	init_spawn_cars = compile preprocessFileLineNumbers "scripts\custom\SpawnCars.sqf";
	Call init_spawn_cars; 	
	and place this script file in:
	.\mpmissions\{your mission name}\scripts\custom\SpawnCars.sqf
	WARNING: add after string: dbInitEconomy
	CAUTION: When you are on the spawn cars in the game server with version 0.60 and higher (0.61 and 0.62 version it blocks events.xml) the transport can be re-spelled and re-spelled by the server itself, regardless of the script. For correct operation it is highly recommended to disable the official transport spawn!
	
	Info about script:
	This script will scan the server database for the specified transport types, push it to the server along with its parts in case of shortage, and clean the destroyed vehicles.
	A first massives - details for car (all details will be spawned)
	A second massives - possible spawn points of the technique (the spawn point will be selected randomly)
	A third (end) massive - configuration: specify the number of cars on writed type, a list of possible spawn points car for writed type and massive from first block with parts car.
	
	Settings format:
	A first massives: [count loot,type loot]
	A second massives: [(coordinate x),(coordinate y),(coordinate z)] 
	A third (end) massive: [max count this type car, type car(classname) or massive types car for random select, selected second massive name, selected first massive name]
	If add after in 'A third (end) massive' 5 and more massives elements with details car, script will be select random details.
*/

// MAIN SETTINGS

_enable_detect_old_ruined_cars = true; // Enable detect old ruined cars in server and delete him
_enable_detect_old_cars_in_point_spawn_in_meters = true; // Enable detect old cars in point spawn in writed meters and secure him for spawn new car 

_meters_check_old_car_in_point_spawn = 10;  // How many meters for chack old car in point spawn - wored only with _enable_detect_old_cars_in_point_spawn_in_meters = true - not recommend set up more 15 meters
_check_damage_for_delete_ruined_car = 1; // How many damage for object car for delete him from server (for set up min 0.1 max 1) - wored only with _enable_detect_old_ruined_cars = true


///////////////////////////  --->  A first massives   <--- ///////////////////////////
//	(count this detail in vehicle),(type detail vehicle)

_items_car_Volga = [
	[4,"CivSedanWheel"],
	[1,"CivSedanDoors_Driver"],
	[1,"CivSedanDoors_CoDriver"],
	[1,"CivSedanDoors_BackLeft"],
	[1,"CivSedanDoors_BackRight"],
	[1,"CivSedanHood"],
	[1,"CivSedanTrunk"],
	[1,"CarRadiator"],
	[1,"CarBattery"],
	[1,"SparkPlug"],
	[2,"HeadlightH7"]
];

_items_car_Niva = [
	[4,"HatchbackWheel"],
	[1,"HatchbackDoors_Driver"],
	[1,"HatchbackDoors_CoDriver"],
	[1,"HatchbackHood"],
	[1,"HatchbackTrunk"],
	[1,"CarRadiator"],
	[1,"CarBattery"],
	[1,"SparkPlug"],
	[1,"HeadlightH7"]
];

_items_car_Bus = [
	[2,"TransitBusWheel"],
	[2,"TransitBusWheelDouble"],
	[1,"TruckBattery"],
	[1,"GlowPlug"],
	[1,"TruckRadiator"],
	[1,"LightBulb"],
	[1,"EngineBelt"]
];

_items_car_V3S = [
	[4,"V3SWheel"],
	[4,"V3SWheelDouble"],
	[1,"V3SDoors_Driver"],
	[1,"V3SDoors_CoDriver"],
	[1,"V3SHood"],
	[1,"TruckBattery"],
	[2,"LightBulb"],
	[1,"EngineBelt"],
	[1,"HeadlightH7"]
];

_items_car_V3S_Blue = [
	[4,"V3SWheel"],
	[4,"V3SWheelDouble"],
	[1,"V3SDoors_Driver_Blue"],
	[1,"V3SDoors_CoDriver_Blue"],
	[1,"V3SHood_Blue"],
	[1,"TruckBattery"],
	[2,"LightBulb"],
	[1,"EngineBelt"],
	[1,"HeadlightH7"]
];

_items_car_V3S_Grey = [
	[4,"V3SWheel"],
	[4,"V3SWheelDouble"],
	[1,"V3SDoors_Driver_Grey"],
	[1,"V3SDoors_CoDriver_Grey"],
	[1,"V3SHood_Grey"],
	[1,"TruckBattery"],
	[2,"LightBulb"],
	[1,"EngineBelt"],
	[1,"HeadlightH7"]
];

_items_car_V3S_Orange = [
	[4,"V3SWheel"],
	[4,"V3SWheelDouble"],
	[1,"V3SDoors_Driver_Orange"],
	[1,"V3SDoors_CoDriver_Orange"],
	[1,"V3SHood_Orange"],
	[1,"TruckBattery"],
	[2,"LightBulb"],
	[1,"EngineBelt"],
	[1,"HeadlightH7"]
];

///////////////////////////  --->   A second massives   <--- ///////////////////////////
//	massives points spawn for vehicles

_points_car_Volga = [
	[10493.7,2348.17,0],
	[10150.7,1810.41,0],
	[11986.2,3839.67,0],
	[12883.2,6259.25,0],
	[12937.6,10185.7,0],
	[13845.8,13216.7,0],
	[4163.03,11104.75,0],
	[5954.25,10366.5,0],
	[3751.32,8858.37,0],
	[3048.92,7787.31,0],
	[2583.23,5073.8,0],
	[2654.09,5289.31,0]	
];
 
_points_car_Niva = [
	[13891.7,13425.6,0],
	[11262.4,12212.2,0],
	[4794.11,2539.87,0],
	[10740.4,10788.2,0],
	[10661.3,7994.43,0],
	[6063.77,7871.36,0],
	[4519.95,8291.32,0],
	[2182.85,3307.73,0],
	[3658.2,2194.58,0],
	[6855.9,2471.24,0],
	[6565.1,2547.52,0],
	[4262.06,11235,0],
	[6255.8,3256.48,0],
	[6682.32,3580.23,0],
	[13785.5,2930.17,0]	
];

_points_car_Bus = [
	[12275.8,9123.41,0],
	[11885.6,12469.2,0],
	[7185,7675.18,0],
	[4795.56,10250.1,0],
	[2716.53,10031.4,0],
	[2589.18,6355.03,0],
	[1672.24,3843.93,0],
	[1878.72,2254.03,0],
	[4334.19,2462.08,0],
	[5691.65,2579.14,0],
	[7805.4,3534.9,0],
	[12238.9,12635,0]
];

_points_car_V3S = [
	[4767.29,9594.32,0],
	[13980.3,2931.02,0],
	[12238.9,12635,0],
	[12229.7,12590.2,0],
	[7216.52,7755.26,0],
	[3711.64,5969.98,0],
	[4392.4,10510.4,0],
	[1741.44,7930.12,0],
	[5590.24,2699.39,0]
];

///////////////////////////  --->   A third (end) massive   <--- ///////////////////////////
//	(max count vehicles this type in server),(type vehicle or massive types for random select),(massive coords for spawn vehicle),(massive items for this car)
//  If add 5 and more massives elements with details car, script will be select random details.

_types_car_V3S = ["V3S_Cargo_Orange","V3S_Cargo_Blue","V3S_Cargo_Grey","V3S_Cargo"];  /// massive types cars for random select
_types_car_V3S_Chassis = ["V3S_Chassis_Orange","V3S_Chassis_Blue","V3S_Chassis_Grey","V3S_Chassis"];  /// massive types cars for random select

_CarsSpawnConfig = [
	[10,"CivilianSedan", _points_car_Volga, _items_car_Volga],
	[12,"TransitBus", _points_car_Bus, _items_car_Bus],
	[7,"OffroadHatchback", _points_car_Niva, _items_car_Niva],
	[4,_types_car_V3S, _points_car_V3S, _items_car_V3S,_items_car_V3S_Blue,_items_car_V3S_Grey,_items_car_V3S_Orange],
	[5,_types_car_V3S_Chassis, _points_car_V3S, _items_car_V3S,_items_car_V3S_Blue,_items_car_V3S_Grey,_items_car_V3S_Orange]
];

{
	if ((count _x) > 4) then
	{
		_rand = floor (random ((count _x) - 1));
		while {(_rand < 4)} do
		{				
			_rand = floor (random ((count _x) - 1));
		};
		_selected_items_car = _x select _rand;
	};
} foreach _CarsSpawnConfig;

////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////  --->   NEXT CODE DON'T EDIT   <--- ///////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////

diag_log format [" SpawnCar: Readed Settings! Start spawn car!"];

fnc_random_int_select =
{
	private["_min","_max","_rand"];
	_min = _this select 0;
	_max = _this select 1;
	_rand = round (random _max);
	
	if ((_rand < _min) or (_rand > _max)) then
	{
		while {(_rand < _min) or (_rand > _max)} do
		{				
			_rand = round (random _max);
		};
	};
	_rand
};

_massive_writed_alltypes_cars = [];
_massive_writed_allcoords_cars = [];

fnc_spawnCar = 
{
	_SelectedLine = _this;
	_selected_count_car = _this select 0;
	_selected_type_car = _this select 1; 
	_selected_points_car = _this select 2;
	_selected_items_car = _this select 3;
	_count_incar_loot = 0;
	_count_aroundcar_loot = 0;
	_count_selected_type_car_in_server = 0;	
		
	_count_selected_type_car_in_server = 0;
	if((typeName _selected_type_car) == "ARRAY") then
	{
		{
			_count_selected_type_car_in_server = _count_selected_type_car_in_server + (count (allMissionObjects _x));
		} forEach _selected_type_car;
		diag_log format [" SpawnCar: %2 old cars of types '%1' has been detected on the server",_selected_type_car,_count_selected_type_car_in_server];
	} else
	{
		_count_selected_type_car_in_server = count (allMissionObjects _selected_type_car); 
		diag_log format [" SpawnCar: %2 old cars of type '%1' has been detected on the server",_selected_type_car,_count_selected_type_car_in_server];
	};

	if (_enable_detect_old_cars_in_point_spawn_in_meters) then
	{
		_temp_selected_points_car = _selected_points_car;
		{
			_selected_point_car = _x;
			{
				if (((typeOf _x) in _massive_writed_alltypes_cars) && (_selected_point_car in _massive_writed_allcoords_cars)) then 
				{
					if (count _selected_points_car > 0) then 
					{
						_selected_points_car = _selected_points_car - [_selected_point_car];
						diag_log format [" SpawnCar: Detected previously spawned car in server: type '%1' at position %2 - point spawn %3 deleted from list spawn this type!",(typeOf _x),(getPos _x),_selected_point_car];
					} else
					{
						diag_log format [" SpawnCar: Detected previously spawned car in server: type '%1' at position %2 - point spawn %3 can't be deleted from list spawn this type because spawnpoints this type allready <= 0!",(typeOf _x),(getPos _x),_selected_point_car];
					};
				};
			} forEach (_selected_point_car nearObjects _meters_check_old_car_in_point_spawn);
		} forEach _temp_selected_points_car;
	};
	
	if (_count_selected_type_car_in_server < _selected_count_car) then
	{
		_selected_count_car = _selected_count_car - _count_selected_type_car_in_server;
		if((typeName _selected_type_car) == "ARRAY") then
		{
			diag_log format [" SpawnCar: Required spawn %2 cars of type list '%1'",_selected_type_car,_selected_count_car];
		} else
		{
			diag_log format [" SpawnCar: Required spawn %2 cars of type '%1'",_selected_type_car,_selected_count_car];
		};
		if (count _selected_points_car > 0) then 
		{
			for "_j" from 1 to _selected_count_car do
			{
				_car_in_server = NULL; 
				if (count _selected_points_car > 0) then 
				{
					_selected_type_car_for_spawn = "";
					if((typeName _selected_type_car) == "ARRAY") then
					{
						_selected_type_car_for_spawn = _selected_type_car select ([0,(count _selected_type_car)-1] call fnc_random_int_select);
					} else
					{
						_selected_type_car_for_spawn = _selected_type_car;
					};
					if ((count _SelectedLine) > 4) then
					{
						_selected_items_car = _SelectedLine select ([3,(count _SelectedLine)-1] call fnc_random_int_select);
						diag_log format [" SpawnCar: Selected for next car massive details: %1 ",_selected_items_car];
					};
					_selected_point_car = _selected_points_car select ([0,(count _selected_points_car)-1] call fnc_random_int_select);
					_car_in_server = createvehicle [_selected_type_car_for_spawn, _selected_point_car, [], 0, "CAN_COLLIDE"];
					if !(isNull _car_in_server) then 
					{
						_selected_points_car = _selected_points_car - [_selected_point_car];
						_car_in_server setDir floor(random 360);
						_selected_name_car = (displayName _car_in_server);
						_originalPos = getPosATL _car_in_server;
						_Damage = random 0.7;
						_map_pos_car = mapGridPosition _car_in_server;
						
						{
						   _count_sel_loot = _x select 0;
						   _type_sel_loot = _x select 1;
						   for [{_i = 0}, {_i < _count_sel_loot}, {_i = _i + 1}] do
						   {
								_loot_car = NULL;
								_loot_car = _car_in_server createInInventory _type_sel_loot;
								if (isNull _loot_car) then 
								{
									_loot_car = createvehicle [_type_sel_loot, _originalPos, [], 5, "CAN_COLLIDE"];
									if ((floor(random 4)) >= 2) then
									{
										_Damage_loot = random 0.7;
										_loot_car setDamage _Damage_loot; 
									};
									_count_aroundcar_loot = _count_aroundcar_loot + 1;
								} else 
								{
									_count_incar_loot = _count_incar_loot + 1;
								};
						   };
						} foreach _selected_items_car;
						diag_log format [" SpawnCar: Spawned %1 in %2 with %3 loot in Car and %4 loot around car ",_selected_name_car,_map_pos_car,_count_incar_loot,_count_aroundcar_loot];
					} else
					{
						diag_log format [" SpawnCar: Type car '%1' is not spawned in server, because when i try spawn car in point '%2' exist errors!",_selected_type_car_for_spawn,_selected_point_car];
					};
				} else
				{
					if((typeName _selected_type_car) == "ARRAY") then
					{
						diag_log format [" SpawnCar: Random type car from array '%1' is not can be spawned in server, because setuped count cars this types > possible count points spawn this type!",_selected_type_car];
					} else
					{
						diag_log format [" SpawnCar: Type car '%1' is not can be spawned in server, because setuped count cars this type > possible count points spawn this type!",_selected_type_car];
					};
				};
			};
		} else
		{
			if((typeName _selected_type_car) == "ARRAY") then
			{
				diag_log format [" SpawnCar: Spawn car from type list '%1' is not possible because not have possible points to spawn.",_selected_type_car];
			} else
			{
				diag_log format [" SpawnCar: Spawn car type(s) '%1' is not possible because not have possible points to spawn.",_selected_type_car];
			};
		};
	} else
	{
		if((typeName _selected_type_car) == "ARRAY") then
		{
			diag_log format [" SpawnCar: Random type car from array '%1' is not need spawn in server, because cars this types allready is max (or more max) in server!",_selected_type_car];
		} else
		{
			diag_log format [" SpawnCar: Type car '%1' is not need spawn in server, because this cars allready is max (or more max) in server!",_selected_type_car];
		};
	};
};

if (_enable_detect_old_ruined_cars) then
{
	_deleted_ruined_Cars = 0;
	{
		if (damage _x == _check_damage_for_delete_ruined_car) then
		{
			deleteVehicle _x;
			_deleted_ruined_Cars = _deleted_ruined_Cars + 1;
		};
	} forEach (allMissionObjects "Car");
	if (_deleted_ruined_Cars > 0) then {
		diag_log format [" SpawnCar: Deleted %1 old ruined cars from server",_deleted_ruined_Cars];
	};
};

if (_enable_detect_old_cars_in_point_spawn_in_meters) then
{
	{
		if((typeName(_x select 1)) == "ARRAY") then
		{
			{
				if (!(_x in _massive_writed_alltypes_cars)) then
				{
					_massive_writed_alltypes_cars = _massive_writed_alltypes_cars + [_x];
				};
			} foreach (_x select 1);
		} else
		{
			if (!((_x select 1) in _massive_writed_alltypes_cars)) then
			{
				_massive_writed_alltypes_cars = _massive_writed_alltypes_cars + [(_x select 1)];
			};
		};
		{
			if (!(_x in _massive_writed_allcoords_cars)) then
			{
				_massive_writed_allcoords_cars = _massive_writed_allcoords_cars + [_x];
			};
		} foreach (_x select 2);
	} foreach _CarsSpawnConfig;
};

{
   _x call fnc_spawnCar;
} foreach _CarsSpawnConfig;

3. Создаем по пути: "MPMissions\dayz_Auto.ChernarusPlus\"  папку "scripts" , и в ней файл с именем "compiles.sqf" . Если такая папка у вас уже имеются, просто не создавайте ее,  а перейдите в нее. Если файл с там именем уже имеется у вас, то не создавайте его, а допишите информацию со следующего пункта инструкции в конец файла!
4. Вставляем в файл следующую строку:

init_spawn_cars = compile preprocessFileLineNumbers "scripts\custom\SpawnCars.sqf";

5. Открываем по указанному далее пути файл в "Notepad++": "MPMissions\dayz_Auto.ChernarusPlus\init.sqf". Находим в файле строки с

call compile preprocessFileLineNumbers

5. Вставляем после всех "call compile preprocessFileLineNumbers" следующее:

call compile preprocessFileLineNumbers "scripts\compiles.sqf";
_Enable_SPAWNER_CARS = true; // Кастомный скрипт спавна транспорта (true - включить, false - выключить)

6. В этом же файле находим строки:

simulWeatherSync;
dbInitEconomy [true];
setTimeForScripts 0.03;

7. Добавляем после них:

if (_Enable_SPAWNER_CARS) then {
	Call init_spawn_cars; 
};

Вот и все.

 

ВАЖНО:

Перед активацией скрипта отключите официальный спавнер транспорта сервера из официальной системы сервера игры. Инструкция есть тут:

 

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

_Enable_SPAWNER_CARS = false; // Кастомный скрипт спавна транспорта (true - включить, false - выключить)

Все настройки по спавну транспорта есть в самом файле скрипта, который в п. 2 инструкции вы и создавали. Надеюсь, сложности с его настройкой не возникнет, пояснения там имеются.

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Similar Content

    • By 123new
      В данной теме я распишу мой вариант установки сейвзоны, работающий на момент публикации статьи на версии сервера игры 1.06.152885.
       
      Установка
      1. Открываем 'init.c' в  'MpMissions' вашей.
      2. Вверху файла добавляем 1 строкой:
      #include "$CurrentDir:\\mpmissions\\dayzoffline.chernarusplus\\Scripts\safezone.c" Где 'dayzoffline.chernarusplus' - имя папки с активной 'MpMissions' вашей.
      Т.е. для карты Livonia 'dayzoffline.chernarusplus'  надо вручную заменить на 'dayzOffline.enoch'
      Пример:

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      3.Создаем папку 'Scripts' в корне 'MpMissions' вашей, а в ней создаем файл с именем 'safezone.c' следующего содержания:
      /* Author: Sania(ZoS) (aka 123new) Project: S-platoon.ru Install: 1. Create a 'Scripts' directory in your active mpmissions 2. Plase this filename (safezone.c) in 'Scripts' 3. Add in init.c this line: #include "$CurrentDir:\\mpmissions\\dayzoffline.chernarusplus\\Scripts\safezone.c" Where is 'dayzoffline.chernarusplus' is active mpmission directory in cfg filename server 4. Configure a next settings */ class SafeZone_PlugIn { protected bool Activate_SafeZone_PlugIn = true; // safezone on (true) or off (false) protected float SAFEZONE_time_repeat_checking = 10; //In seconds ref static TStringArray SAFEZONE_LOACTIONS = {"15145.1 32.9793 13919.0", "12145.1 32.9793 10919.0"};//Map coords (positions of the safe zone) protected static float SAFEZONE_RADIUS = 100; //In meter protected static string SAFEZONE_ENTRY_MESSAGE = "Welcome to The SafeZone! Godmode ENABLED!"; protected static string SAFEZONE_EXIT_MESSAGE = "You Have Left The SafeZone! Godmode DISABLED!"; void OnInit() { if(Activate_SafeZone_PlugIn) { GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(RunCheckStart, (SAFEZONE_time_repeat_checking * 1000), true); } } static void RunCheckStart() { private array<Man> players = new array<Man>; GetGame().GetPlayers( players ); if (SAFEZONE_LOACTIONS.Count() > 0) { if (players.Count() > 0) { foreach(string SAFEZONE_LOACTION: SAFEZONE_LOACTIONS) { if( players.Count() > 0 ) { foreach(Man player: players) { if(player) { private PlayerBase player_casted = PlayerBase.Cast(player); CheckingPosition(player_casted,SAFEZONE_LOACTION.ToVector()); } } } } } } } static void CheckingPosition(PlayerBase player,vector SAFEZONE_LOACTION) { private float SAFEZONE_distance; private string SAFEZONE_ZoneCheck, SAFEZONE_UID_PLAYER, SAFEZONE_NAME_PLAYER; SAFEZONE_NAME_PLAYER = player.GetIdentity().GetName(); SAFEZONE_UID_PLAYER = player.GetIdentity().GetPlainId(); //Steam 64 private vector SAFEZONE_pos_player = player.GetPosition(); private vector SAFEZONE_LOCATION_FIXED = CorrectToGroundPosY(SAFEZONE_LOACTION); private string name_mesage_profile = "GodModeEnabledFor: " + SAFEZONE_UID_PLAYER + " Location: " + SAFEZONE_LOACTION.ToString(); SAFEZONE_distance = vector.Distance(SAFEZONE_pos_player,SAFEZONE_LOCATION_FIXED); if (SAFEZONE_distance <= SAFEZONE_RADIUS) //Player Inside Zone { SAFEZONE_ZoneCheck = ""; GetGame().GetProfileString(name_mesage_profile,SAFEZONE_ZoneCheck); if (SAFEZONE_ZoneCheck == "true") //Already in zone { GetGame().SetProfileString(name_mesage_profile,"true"); player.SetAllowDamage(false); //GodMode On return; } else { GetGame().SetProfileString(name_mesage_profile,"true"); Print("[SafeZone] " + SAFEZONE_NAME_PLAYER + " (" + SAFEZONE_UID_PLAYER + ") Enter in safeZone in position: " + SAFEZONE_LOCATION_FIXED.ToString()); player.SetAllowDamage(false); //GodMode On SendPersonalMessage(SAFEZONE_ENTRY_MESSAGE, player); } } else { //Player Outside of Zone if (SAFEZONE_distance > SAFEZONE_RADIUS) //Player Outside of Zone { SAFEZONE_ZoneCheck = ""; GetGame().GetProfileString(name_mesage_profile,SAFEZONE_ZoneCheck); if (SAFEZONE_ZoneCheck == "false") { GetGame().SetProfileString(name_mesage_profile,"false"); return; } else { if (SAFEZONE_ZoneCheck != "") { GetGame().SetProfileString(name_mesage_profile,"false"); Print("[SafeZone] " + SAFEZONE_NAME_PLAYER + " (" + SAFEZONE_UID_PLAYER + ") Left safeZone in position: " + SAFEZONE_LOCATION_FIXED.ToString()); player.SetAllowDamage(true); //GodMode Off SendPersonalMessage(SAFEZONE_EXIT_MESSAGE, player); } else { GetGame().SetProfileString(name_mesage_profile,"false"); return; } } } } } static vector CorrectToGroundPosY(vector pos) { private float pos_x = pos[0]; private float pos_z = pos[2]; private float pos_y = GetGame().SurfaceY(pos_x, pos_z); private vector tmp_pos = Vector(pos_x, pos_y, pos_z); return tmp_pos; } static void SendPersonalMessage(string message, PlayerBase casted_player) { Man player; Class.CastTo(player, casted_player); if(( player ) && (message != "")) { Param1<string> m_GlobalMessage = new Param1<string>(message); GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_GlobalMessage, true, player.GetIdentity()); } } } /* class SafeZone_Config //test config for json { vector SAFEZONE_LOACTION = "15145.1 32.9793 13919.0"; //Map coords (position of the safe zone) float SAFEZONE_RADIUS = 100.0; //In meter string SAFEZONE_ENTRY_MESSAGE = "Welcome to The SafeZone! Godmode ENABLED!"; string SAFEZONE_EXIT_MESSAGE = "You Have Left The SafeZone! Godmode DISABLED!";\ } */ ref SafeZone_PlugIn SafeZone = new SafeZone_PlugIn(); modded class CustomMission { override void OnInit () { super.OnInit(); SafeZone.OnInit(); } } Ну или скачиваем его отсюда в готовом виде:
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Здесь:
       'SAFEZONE_LOACTIONS' - координаты точкек центра сейвзоны, можно указать несколько.
      'SAFEZONE_RADIUS' - радиус от указанного центра севзоны, на котором действует защита
      'ENTRY_MESSAGE' - сообщение о входе в зону (не рекоммендуется указывать русский язык, может не отображаться)
      'EXIT_MESSAGE' - сообщение о выходе из зоны (не рекоммендуется указывать русский язык, может не отображаться)
      'SAFEZONE_time_repeat_checking' - время повтора проверки наличия игроков в зонах, в секундах
      'Activate_SafeZone_PlugIn' - активация плагина скрипта, true - ключен, false - выключен
      4. Запускаем сервер и проверяем.
       
      Для совсем ленивых готовая миссия сервера с настроенной сейвзоной для патча игры 1.06 
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
      Гайд обновлен: 31.01.2020
       
       
    • By DrTauren
      Что нам понадобится:
      1) Архив
      2) Notepad


      Инструкция:
      1) Качаем архив и копируем из него папку custom в вашу папку с миссией
      2) Открываем init.sqf и ищем такие строки:
      if (!isDedicated) then { 0 fadeSound 0; waitUntil {!isNil "dayz_loadScreenMsg"}; dayz_loadScreenMsg = (localize "STR_AUTHENTICATING"); _id = player addEventHandler ["Respawn", {_id = [] spawn player_death;}]; }; 3) Перед закрывающей скобкой }; прописываем это:
      _nil = [] execVM "custom\JAEM\EvacChopper_init.sqf"; 4) Выбираем одно из двух, выполняем действия указанные ниже:
      Если у вас нет своего variables.sqf в папке с миссией:  
       
      Если у вас есть свой variables.sqf в папке с миссией:  

      5) Копируем файлы remoteexec.txt, waypointcondition.txt, waypointstatement.txt в вашу папку с фильтрами BattlEye (\instance_11_Chernarus\BattlEye)

      Настройка параметров:
      Открываем файл EvacChopper_init.sqf (custom\JAEM\EvacChopper_init.sqf), находим нужную строку, редактируем по своему усмотрению:
      evac_chopperPrice = 3; Цена вашего спасения евреями. По умолчанию 3 Брифкейса
       
      evac_needRadio = 0; Обязательно ли радио для того, что бы вызвать хапуг? (0-не нужно, 1-таки извольте)
       
      evac_zoneMarker = 0; Дымовая граната на месте эвакуации (0-не надо, 1-таки не увидим мы без дыма)
       
      evac_minDistance = 500; Дословно: минимальное расстояние, что бы вызвать евреев. Меньше 500 не ставить!
    • By Serdce
      Ссылка на первоисточник - https://github.com/BrettNordin/Exile
      Я всего лишь перевёл
      Собственно переходим по ссылке, и скачиваем архив.
      Для тех, кто не знает как качать с хаба скрин 
      И так, едем дальше
      Скачанный архив распаковываем в удобное место для работы,
      Идём в ваш @ExileServer, там нас интересуют файлы - extDB2.dll , extDB2.so , extDB2-conf.ini , XM8.dll , XM8.so Удаляем эти файлы
      Далее идём в @ExileServer которую мы скачали, всё её содержимое копируем в аналогичную папку на сервере.
      Теперь идём в вашу MPmissions и там распаковываем вашу миссию "Exile.название карты",
      Туда мы копируем содержимое папки Exile.MapName из архива,
      Далее открываем ваш config.cpp и ищем там class CfgExileCustomCode 
      В него мы добавляем - #include "CfgExileCustomCode.cpp"
      Должно получится так
      Запаковываем обратно)
      Ну и теперь из архива мы копируем tbbmalloc.dll, tbbmalloc_x64.dll в папку расположения вашего Arma3_server.exe
      Не забываем поменять в вашем файле запуска сервера с arma3server.exe на arma3server_x64.exe 
      Ну и финишная прямая, открываем вашу базу данных ( желательно с название exile ) и добавляем файл Exile_Database_Update_64x.sql
      Далее настройте под себя ваш extdb3-conf.ini
       
    • By Astrahrom
      Столкнулся с цикличной проблемой в лаунчере, при установке ботов A3EAI:
      Script @epochhive\A3EAI_config.sqf not found Оказалось, что все дело в том, что в открытом доступе лежат старые версии этого скрипта, и все кто пытается воткнуть в Epochhive, как я, данный скрипт - делают это по старой схеме, не актуальной для последних версий.
       
      Решение
       
      Скачиваем - https://yadi.sk/d/HfXeB1pEAGoRtw
       
      Устанавливаем:
      1. Взять из папки архива "1. Installation Package" папку "@A3EAI" и вложить её в папку с вашим сервером;
      2. Прописать скрипт в вашем запускаторе, примерно так:
      -servermod=@EpochHive;@A3EAI; Пример моего запускатора:
      @echo off start "arma3" "arma3server.exe" -servermod=@EpochHive;@A3EAI; -mod=@Epoch; -config=C:\Arma3Server\sc\server.cfg -port=2307 -profiles=sc -cfg=C:\Arma3Server\sc\basic.cfg -name=sc -autoINIT Варианты настройки, которые хранятся в самой папке @A3EAI\addons\a3eai_config в файле config.cpp.
    • By 123new
      В данной теме я распишу возможность создания серверного мода для сервера на собственном примере и объясню как его собрать.Работающий на момент публикации статьи на версии сервера игры 1.04.152050.
       
      Нам понадобятся:
      1. Сервер игры актуальной версии, не ниже патча 1.04. Как установить можно узнать тут:
      До версии 1.04 параметра servermod у сервера игры не существовало!!!
      2. Программа 'PBO manager' с состава инструментария армы из сети: https://www.armaholic.com/page.php?id=16369
      Зеркало: https://yadi.sk/d/_gmzoNSDpNJTt
      Еще зеркало:
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      3. Скрипты для упаковки в наш мод, сформированные и подготовленные нами вручную. Как - смотрите тему
      4. Notepad++ https://notepad-plus-plus.org/download
      P.S. Вместо 'PBO manager' можно использовать DayZ Tools, но как им пользоваться разбираемся сами 😉
       
      И так, приступим:
      1. Предположим, что у нас имеется свой некий набор скриптов (если нет - читаем выше), который необходимо добавить серверу, но не на уровне миссии сервера, а на более ранних уровнях его загрузки. Например, добавить свой killfeed, модифицировать или изменить какой-либо из родных скриптов сервера игры, либо вовсе модификации, подключенной у вас.
      Для примера в этой теме и данного гайда я взял вот этот набор скриптов, собранный непосредственно для данной темы за 5 минут, и не изменяющий в сервере ровным счетом ничего. Он может послужить базой для создания своих модов, функций, переменных или классов. Данный гайд будем описывать, исходя из этого архива.
      Архив:
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Подробнее о создании скриптов для своих целей - читайте вот эту тему!
      2. Создаем папку с нашим модом. Для примера, это будет папка '@My_Server_Mod'. В созданной нами папке создаем папку 'Addons', а в ней папку 'My_Server_Mod'.
      3. Помещаем содержимое распакованного архива в папку 'My_Server_Mod'. Должно получиться так:

      4. В папке 'My_Server_Mod' создаем файлик 'config.cpp' и заполняем его следующими данными (советую использовать Notepad++ для этого):
      class CfgPatches // требуется обязательно { class My_Server_Mod // требуется обязательно, совпадает с именем мода { units[]={}; // may be not worked weapons[]={}; // may be not worked requiredVersion=0.1; // may be not worked requiredAddons[]={}; /* requiredAddons[]= { "DZ_Data", // Перечисляем требуемые и используемые модом аддоны (pbo-файлы игры и модов по их внутренним скриптовым именам) }; */ }; }; class CfgMods // // требуется обязательно, совпадает с именем мода { // https://community.bistudio.com/wiki/DayZ:Modding_Structure#Mod_presentation class My_Server_Mod { dir = "My_Server_Mod"; // Имя папки мода, совпадает с именем мода picture = ""; // Картинка в описании мода action = ""; // Ссылка, например вот так: action = "https://dayz.com/"; hideName = 1; // Не уверен, что этот параметр работает hidePicture = 1; // Не уверен, что этот параметр работает name = "My_Server_Mod"; // Имя мода (а также его внутреннее скриптовое имя) logoSmall = "Mods/TestMod/modlogosmall.tga"; // значок рядом с именем мода, если описание не развернуто logo = "Mods/TestMod/modlogo.tga"; // логотип под меню игры logoOver = "Mods/TestMod/modlogohover.tga"; // при наведении курсора мыши на логотип tooltip = "tooltip"; // подсказка при наведении курсора мыши overview = "My Server Mod"; // Описание credits = "123new"; // credits author = "123new"; // author authorID = "0"; // author steam ID version = "1.0"; // version extra = 0; // Не уверен, что этот параметр работает type = "mod"; // требуется обязательно, остается неизменным // inputs = "mods\testmod\inputs\my_new_inputs.xml"; // необязательно, при использовании пользовательских inputs dependencies[]={"Core","GameLib","Game","World","Mission"}; // необязательно, если необходимо установить зависимость класса class defs { class engineScriptModule { value=""; // если значение пустое, используется функция ввода по умолчанию files[]={"My_Server_Mod/scripts/1_Core"}; // вы можете добавить любое количество файлов или каталогов, и они будут скомпилированы вместе с оригинальными скриптами игрового модуля }; class gameLibScriptModule { value=""; files[]={"My_Server_Mod/scripts/2_GameLib"}; }; class gameScriptModule { //value="CreateGameMod"; // когда значение заполнено, имя функции ввода модуля скрипта по умолчанию перезаписывается им value = ""; files[]={"My_Server_Mod/scripts/3_Game"}; }; class worldScriptModule { value=""; files[]={"My_Server_Mod/scripts/4_World"}; }; class missionScriptModule { value=""; files[]={"My_Server_Mod/scripts/5_Mission"}; }; }; // Если какой-то из разделов скриптинга вам не нужен и вы не сибираетесь его паковать, сотрите необходимый блок с ним выше и в массиве dependencies }; }; Пояснения в файле оставил. Файл готовый:
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Как видите, в 'deffs' названия классов и путей соответствуют родным из 'scripts.pbo', но с допиской имени мода. Имя мода в данном случае и есть идентификатор для обращения к своему моду извне. А в 'dependencies' перечисляются используемые классы оригинальных скриптов без дописки номера секции. Количество используемых 'dependencies' и блоков 'deffs' должно быть идентично.
      Пояснения есть также и в официальной документации от разработчика: https://community.bistudio.com/wiki/DayZ:Modding_Structure#Mod_presentation
      5. Запаковываем нашу папку 'My_Server_Mod' в pbo-файл 'My_Server_Mod.pbo' через 'PBO manager', как на скриншоте ниже:

      Можно использовать и другие способы запаковки, если знаете их или привычны вам.
      6. Добавляем в параметры запуска сервера параметр:
      "-servermod=@My_Server_Mod;" -FilePatching 7. Радуемся, наш серверный мод готов. Пример готового серверного мода:
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      P.S. Создавать bikey файл для мода и bisign подписи для него не требуется, иначе это может привести к неработоспособности серверной модификации (возможно, недоработка сервера игры разработчиком)
       
      Отмечу сразу, что данный способ подходит для модификации и переписывания оригинальных классов скриптов сервера от разработчиков и модификации чужих модов с помощью моддинга, применяется исключительно на стороне сервера игры и клиент игры не затрагивает. Распространять такой мод игрокам НЕ НУЖНО!
      Изменение оригинальных скриптов, для которых не предусмотрена операция 'modded class' в движке игры, а также классов и функций, которые защищены языком и движком игры от такого рода действий через серверные моды не получится. Если вы столкнулись с этим, вам проще распаковать scripts.pbo и поместить папку scripts в корень сервера игры, добавить в параметры запуска сервера параметр -FilePatching и изменять напрямую в папке необходимые вам файлы.Запаковывать назад в pbo папку и размещать в dta в таком случае не нужно!
       
      P.P.S. Процедура создания своего собственного клиент-серверного мода на основе скриптов работает таким же образом. В случае создания такого мода, файл 'config.cpp' может быть для стандартного мода более разнообразным, а также после требуется обязательная подпись такого мода в bisign и создание bikey файлов. Более подробно это освещать требуется отдельно!
×
×
  • Create New...