Vitalik

Ящик с лутом

Вопрос

Всем привет сделал на остров скалистый ящик с лутом, чтоб рандомно появлялся по всему острову. Но почему то как не крути он появляется в определенных разных местах,игроки это быстро раскусили и спокойно находят его,так как знают примерные места где он может появиться.А мне надо такой чтоб прям в любом месте по всей территорий острова появлялся.Может кто уже делал такой поделитесь если не жалко. :smile:

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


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

5 ответов на этот вопрос

Всем привет сделал на остров скалистый ящик с лутом, чтоб рандомно появлялся по всему острову. Но почему то как не крути он появляется в определенных разных местах,игроки это быстро раскусили и спокойно находят его,так как знают примерные места где он может появиться.А мне надо такой чтоб прям в любом месте по всей территорий острова появлялся.Может кто уже делал такой поделитесь если не жалко. :smile:

Используй вот этот,он спавнится точно по заданным координатам:

http://s-platoon.ru/index.php?/topic/422-iaschiki-so-svoim-lutom-vremenem-respauna-i-mnogim/ 

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


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


Используй вот этот,он спавнится точно по заданным координатам:

http://s-platoon.ru/index.php?/topic/422-iaschiki-so-svoim-lutom-vremenem-respauna-i-mnogim/ 

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

_random_pos = [13000 + floor (random 1200), 2700 + floor (random 1000), 0];
_end_pos = [_random_pos, 1, 700, 3, 0, 30, 0] call BIS_fnc_findSafePos;
 

В createVehicle, где спавниш коробку используй _end_pos. Говорят random в арме

подчиняется равномерному закону распределения, так что в принципе

спавниться будет всегда в разных местах.

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

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


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

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

_random_pos = [13000 + floor (random 1200), 2700 + floor (random 1000), 0];
_end_pos = [_random_pos, 1, 700, 3, 0, 30, 0];
 

В createVehicle, где спавниш коробку используй _end_pos. Говорят random в арме

подчиняется равномерному закону распределения, так что в принципе

спавниться будет всегда в разных местах.

да такой надо только не понятно как его использовать или подключить 

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


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

1. Создать файл на сервере в папке modules с произвольным названием, например spawn_lootboox.sqf

2. Скопировать туда

 

 

private ["_arr_wep","_arr_ammo","_arr_bp","_id","_random_pos","_end_pos","_box","_msg", "_wait_time"];
/*gonfig*/
_arr_wep = [
/*[ "name", count, chance];*/
["DMR_DZ", 1, 30],
["SVD_CAMO",1, 70],
["M40A3", 1, 50];
];
_arr_ammo = [
/*["ammo name", min count, max count, chance]*/
["20Rnd_762x51_DMR" , 3, 5, 30],
["10Rnd_762x54_SVD" , 3, 5, 70],
["5Rnd_762x51_M24" , 3, 5, 50]

];
_arr_bp = [
/*["name", count, chance]*/
["DZ_GunBag_EP1" , 1, 20],
["DZ_British_ACU" , 1, 80]
];

_wait_time = 20;
/*end config*/

/*func*/
f_getchance = {
private ["_chance", "_calc_chance", "_result"];
_result = false;
_chance = _this select 0;
_calc_chance = floor (random 100);
if (_calc_chance <= _chance) then { _result = true;};
_result
};
/* end func*/

_id = "7" + str(round(random 99999));
_random_pos = [13000 + floor (random 1200), 2700 + floor (random 1000), 0];
_end_pos = [_random_pos, 1, 700, 3, 0, 30, 0] call BIS_fnc_findSafePos;
_box = createVehicle ["RUVehicleBox", _end_pos, [], 0, "CAN_COLLIDE"];
clearWeaponCargoGlobal _box;
clearMagazineCargoGlobal _box;
clearBackpackCargoGlobal _box;
_box setVariable ["ObjectID", _id, true];
_box setVariable ["ObjectUID", _id, true];
_box setVariable ["permaLoot",true];

{ if ([_x select 3] call f_getchance) then {_box addMagazineCargoGlobal [_x select 0, ((_x select 1) + floor (random (_x select 2) - (_x select 1)))];};} foreach _arr_ammo;
{ if ([_x select 2] call f_getchance) then {_box addWeaponCargoGlobal [_x select 0, _x select 1];};} foreach _arr_wep;
{ if ([_x select 2] call f_getchance) then {_box addBackpackCargoGlobal [_x select 0, _x select 1];};} foreach _arr_bp;

_msg = "На острове сбросили груз с сприпасами";
[nil,nil,rTitleText,_msg,"PLAIN",10] call RE;
sleep (_wait_time * 60);
_msg = "Груз с сприпасами разграблен";
[nil,nil,rTitleText,_msg,"PLAIN",10] call RE;
deleteVehicle _box;
 

 

 

 

3. Сохранить в кодировке UTF8

4. В init.sqf найти секцию объявления эвентов: EpochEvents = [

и добавить внутрь ["any","any","any","any",40,"spawn_lootboox"] , предварительно поставив запятую после последнего события

Должно получиться что то вроде:

EpochEvents = [
    ["any","any","any","any",30,"crash_spawner"],
    ["any","any","any","any",15,"supply_drop"],
    ["any","any","any","any",40,"spawn_lootboox"]
];

5. Пересобираем pbo

6. Profit

 

Настройка скрипта:

 

1) есть 3 секции объявления в spawn_lootboox.sqf: оружие, патроны, рюкзаки

формат для оружия и рюкзаков ["Название", количество, шанс]

формат для патронов ["Название", минимальное количество, максимальное количество, шанс]

не забываем расставлять запятые

2) _wait_time - количество минут, через которое коробка будет удаляться

3) в строке ["any","any","any","any", 40, "spawn_lootboox] число 40 означает через сколько минут будет спавниться коробка, подробнее про формат EpochEvents гуглите сами

 

ЗЫ. Скрипт писал в блокноте в приступе озарения и работоспособность не проверял, но должно работать без проблем

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

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


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

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

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

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

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


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

Войти

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


Войти сейчас

  • Похожие публикации

    • Автор: 123new
      И так, ребятки, вот вам небольшая 'полезняшка' от меня, и совершенно бесплатно!
       
      Описание:
      Скрипт, добавляющий админу сервера возможность указывать для каждого игрока индивидуальный скин спавна, его персональную точку спавна и один из имеющихся на сервере стартовых наборов с лутом, которые можно составить самим. Если указано несколько точек спавна и/или наборов лута, то будет выбран один из предложенных вариантов рандомно. Также, любой из названных параметров можно отключить в скрипте и сделать его стандартным, как он есть поумолчанию на сервере. Дополнительно - есть возможность назначить  свой набор стартового лута для всех игроков на сервере не из списка скрипта!
       
      Нам понадобится:
      1. Сервер DayZ 1.0, сделанный по одному из гайдов:
      2. Notepad++
      3. Немножечко трезвого ума и понимания того, что мы делаем, и как прописывается лут на новом языке enfusion
       
      Установка:
      Перед установкой: Обратите внимание, что имя 'стандартной' миссии сервера при загрузки со Steam называется: 'dayzOffline.chernarusplus'. На хостингах имя этой папки может отличаться. Если это так, то вам в информации ниже необходимо заменить 'dayzOffline.chernarusplus' на имя вашей  папки миссии сервера, иначе вы не сможете запустить сервер игры!
      1. По пути:
      {папка с вашим сервером}\mpmissions\dayzOffline.chernarusplus\ создать папку 'CustomSpawnPlayerConfig' и поместить в созданную нами папку 2 файла
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      или создать их самим со следующим содержанием:
      Script.c
      /* Описание: Скрипт выдачи индивидуального стартового лута, скина игрока и точек спавна Автор: 123new */ class CustomSpawnPlayerConfig { private string Location_Directory_config = "$profile:"; // Расположение папки с конфигом скрипта private string Location_filename_config = "CustomSpawnPlayerConfig.txt"; // имя файла с конфигом скрипта private string default_log_block_name = "[CustomSpawnPlayerConfig] "; // Стандартный блок скрипта для идентификации с script.log private string disable_read_parameter = "0"; // Стандартное значение (без кавычек) для обозначения в файле конфига скрипта неиспользование параметра private string block_split_parameters_config = "|"; // Символ, обозначающий разделение параметров при чтении файла конфига private string block_split_multi_parameters_config = ";"; // Символ, обозначающий перечисление в одной ячейке параметра нескольких параметров при чтении файла конфига private bool enabled_loading_custom_spawnpoints = true; // Параметр, включающий и отключающий возможность использования приватной точки спавна для каждого игрока. В случае отключения кастомная точка спавна будет отключена для всех поумолчанию, вне зависимости от данных в конфиге! private bool enabled_loading_custom_sets = true; // Параметр, включающий и отключающий возможность использования приватного сета для каждого игроков. В случае отключения выдача сетов будет отключена для всех поумолчанию, вне зависимости от данных в конфиге, будет выдаваться только сет для всех игроков! private bool enabled_loading_custom_skins = true; // Параметр, включающий и отключающий возможность использования индивидуального стартового скина игрока для каждого игрока. В случае отключения эта возможность будет отключена для всех поумолчанию, вне зависимости от данных в конфиге! // ------------------------------------------------------------ // ---------------- NEXT CODE DON'T EDIT ----------------- // ------------------------------------------------------------ ref map<string, ref array<vector>> players_spawnpoints = new map<string, ref array<vector> >; ref map<string, ref array<int>> players_sets = new map<string, ref array<int> >; ref map<string, string> players_skins = new map<string, string>; private bool enabled_loaded_successfull_config = false; string Log_CustomSpawnPlayerConfig_GetDateTime() { private int year, month, day, hour, minute, second; GetYearMonthDay(year, month, day); GetHourMinuteSecond(hour, minute, second); string returned_message = "[" + day.ToStringLen(2) + "." + month.ToStringLen(2) + "." + year.ToStringLen(2) + " - " + hour.ToStringLen(2) + "." + minute.ToStringLen(2) + "." + second.ToStringLen(2) + "] "; return returned_message; } bool Check_coords_disable(vector coord) { private bool ret_zn = false; private float pos_x = coord[0]; private float pos_y = coord[1]; private float pos_z = coord[2]; if ((pos_x == 0.0) & (pos_y == 0.0) & (pos_z == 0.0)) { ret_zn = true; } return ret_zn; } vector Set_Read_coords_disable() { return Vector(0.0, 0.0, 0.0); } void CustomSpawnPlayerConfig() { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + "CustomSpawnPlayerConfig initialize start!"); Read_Update_Config(); } void ~CustomSpawnPlayerConfig() { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + "CustomSpawnPlayerConfig work end, class closed!"); } void Read_Update_Config() { private string name_block_work = "[ReadAndUpdateSettings] "; Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + " Started Reading config!"); private array<string> readed_lines_config = ReadFileConfig(); private bool check_normal_read = AnaliseFileConfig(readed_lines_config); if (check_normal_read) { LoadFileConfig(readed_lines_config); Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "config readed successfull!"); enabled_loaded_successfull_config = true; } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "config read failed, work script disabled for players!"); enabled_loaded_successfull_config = false; } } array<string> ReadFileConfig() { private string name_block_work = "[ReadFileConfig] "; private array<string> readed_lines_config = new array<string>; readed_lines_config.Clear(); if (FileExist ( (Location_Directory_config + Location_filename_config) ) ) { private string line_content; FileHandle file = OpenFile((Location_Directory_config + Location_filename_config), FileMode.READ); Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Open file config: " + (Location_Directory_config + Location_filename_config)); if (file != 0) { while ( FGets( file, line_content ) > 0 ) { readed_lines_config.Insert( line_content); } CloseFile(file); } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "ERROR!!! CAN'T OPEN FILE CONFIG : " + (Location_Directory_config + Location_filename_config)); } //readed_lines_config.Debug(); } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "ERROR!!! CAN'T FOUND FILE CONFIG OR DIRECTORY: " + (Location_Directory_config + Location_filename_config)); } return readed_lines_config; } bool AnaliseFileConfig(array<string> readed_lines_config) { private bool return_zn = true; private string name_block_work = "[AnaliseFileConfig] "; if (readed_lines_config.Count() > 0) { foreach (string line : readed_lines_config) { if (line.Contains(block_split_parameters_config)) { private array<string> splited_line = new array<string>; line.Split( block_split_parameters_config, splited_line ); if (splited_line.Count() == 4) { private string UID_player = splited_line.Get(0); private string default_skin_player = splited_line.Get(1); private string sets_numbers_player = splited_line.Get(2); private string points_spawn_player = splited_line.Get(3); if ((UID_player == "") || (default_skin_player == "") || (sets_numbers_player == "") || (points_spawn_player == "")) { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "ERROR!!! Lines in Readed file is not correct, please, fix your config script!"); Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Line checking: " + line); return_zn = false; break; } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "ERROR!!! Readed file is have incorrect count parameters with a tag '" + block_split_parameters_config + "', please, fix your config script!"); Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Line checking: " + line); return_zn = false; break; } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "ERROR!!! Readed file can't have a tag '" + block_split_parameters_config + "', please, fix your config script!"); Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Line checking: " + line); return_zn = false; break; } } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "ERROR!!! Config file is empty, fix your config script!"); return_zn = false; } return return_zn; } void LoadFileConfig(array<string> readed_lines_config) { private string name_block_work = "[LoadFileConfig] "; players_spawnpoints.Clear(); players_sets.Clear(); players_skins.Clear(); foreach (string line : readed_lines_config) { private array<string> splited_line = new array<string>; splited_line.Clear(); line.Split( block_split_parameters_config, splited_line ); private string UID_player = splited_line.Get(0); private string default_skin_player = splited_line.Get(1); private string sets_numbers_player = splited_line.Get(2); private string points_spawn_player = splited_line.Get(3); private array<vector> temp_players_spawnpoints = new array<vector>; temp_players_spawnpoints.Clear(); array<int> temp_players_sets = new array<int>; temp_players_sets.Clear(); array<string> temp_players_spawnpoints_string = new array<string>; temp_players_spawnpoints_string.Clear(); array<string> temp_players_sets_string = new array<string>; temp_players_sets_string.Clear(); if (points_spawn_player.Contains(block_split_multi_parameters_config)) { points_spawn_player.Split( block_split_multi_parameters_config, temp_players_spawnpoints_string ); } else { temp_players_spawnpoints_string.Insert(points_spawn_player); } foreach (string line_spawnpoint : temp_players_spawnpoints_string) { if (line_spawnpoint == disable_read_parameter) { temp_players_spawnpoints.Insert(Set_Read_coords_disable()); } else { temp_players_spawnpoints.Insert(line_spawnpoint.ToVector()); } } Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Generated massive for " + UID_player + " with " + temp_players_spawnpoints.Count().ToString() + " spawnpoints."); if (sets_numbers_player.Contains(block_split_multi_parameters_config)) { sets_numbers_player.Split( block_split_multi_parameters_config, temp_players_sets_string ); } else { temp_players_sets_string.Insert(sets_numbers_player); } foreach (string line_set : temp_players_sets_string) { if (line_set == disable_read_parameter) { temp_players_sets.Insert(0); } else { temp_players_sets.Insert(line_set.ToInt()); } } if (default_skin_player == disable_read_parameter) { default_skin_player = "0"; } Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Generated massive for " + UID_player + " with " + temp_players_sets.Count().ToString() + " sets."); Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Detected for " + UID_player + " skin " + default_skin_player); players_spawnpoints.Insert(UID_player,temp_players_spawnpoints); players_sets.Insert(UID_player,temp_players_sets); players_skins.Insert(UID_player,default_skin_player); } } vector Load_And_Check_Spawnpoints(PlayerIdentity identity, vector pos_default) { private string name_block_work = "[Load_And_Check_Spawnpoints] "; private vector retun_pos = pos_default; if(identity) { private string Name_P = identity.GetName(); private string UID_P = identity.GetPlainId(); private string Game_UID_P = identity.GetId(); private string Game_ID_P = identity.GetPlayerId().ToString(); if (enabled_loading_custom_spawnpoints) { if ((players_spawnpoints.Count() > 0) && (enabled_loaded_successfull_config)) { if (players_spawnpoints.Contains(UID_P)) { private array<vector> readed_lines_config = new array<vector>; readed_lines_config = players_spawnpoints.Get(UID_P); private vector retun_pos_check = readed_lines_config.GetRandomElement(); if (Check_coords_disable(retun_pos_check)) { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") disabled loading private spawn point. Will be used default spawn point!"); } else { retun_pos = retun_pos_check; Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") setuped private spawn point: " + retun_pos.ToString()); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Can't founded private spawnpoint for player " + Name_P + "(steam64id=" + UID_P + ")"); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Config script is incorrect, checking private spawnpoints is disabled! Player: " + Name_P + "(steam64id=" + UID_P + ")"); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "disabled loading personal spawnpoints from config file script!"); } } Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") will be used spawn point: " + retun_pos.ToString()); return retun_pos; } string Load_And_Check_SpawnSkin_Player(PlayerIdentity identity, string characterName) { private string name_block_work = "[SelectStartSkinPlayer] "; private string retun_skin = characterName; if(identity) { private string Name_P = identity.GetName(); private string UID_P = identity.GetPlainId(); private string Game_UID_P = identity.GetId(); private string Game_ID_P = identity.GetPlayerId().ToString(); if (enabled_loading_custom_skins) { if (players_skins.Count() > 0) { if (players_skins.Contains(UID_P)) { private string readed_skin = players_skins.Get(UID_P); if (readed_skin == "0") { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") disabled loading private skin setting, will be used default setting game!"); } else { retun_skin = readed_skin; Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") setuped private skin setting: " + retun_skin); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Can't founded private skin setting for player " + Name_P + "(steam64id=" + UID_P + ")"); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Config script is incorrect, checking private skin setting is disabled! Player: " + Name_P + "(steam64id=" + UID_P + ")"); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "disabled loading personal skin player settings from config file script!"); } } Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") will be used skin: " + retun_skin); return retun_skin; } void Load_And_Check_StartLoadout(PlayerBase player) { private string name_block_work = "[SelectStartSetPlayer] "; private int use_set_id = -1; private PlayerIdentity identity = player.GetIdentity(); if(identity) { private string Name_P = identity.GetName(); private string UID_P = identity.GetPlainId(); private string Game_UID_P = identity.GetId(); private string Game_ID_P = identity.GetPlayerId().ToString(); if (enabled_loading_custom_sets) { if ((players_sets.Count() > 0) && (enabled_loaded_successfull_config)) { if (players_sets.Contains(UID_P)) { private array<int> readed_lines_config = new array<int>; readed_lines_config.Clear(); readed_lines_config = players_sets.Get(UID_P); private int chek_use_set_id = readed_lines_config.GetRandomElement(); if (chek_use_set_id == 0) { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") disabled loading private set numbers. Will be used default set player! "); } else { use_set_id = chek_use_set_id; Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") setuped private set number is: " + use_set_id.ToString()); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Can't founded private sets for player " + Name_P + "(steam64id=" + UID_P + ")"); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Config script is incorrect, checking private sets is disabled! Player: " + Name_P + "(steam64id=" + UID_P + ")"); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "disabled loading personal loadout sets player settings from config file script! Will be used default loadout!"); } if (use_set_id >= 0) { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") will be used spawn set with number is: " + use_set_id.ToString()); } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") will be used spawn default start set without number. "); } StartSetsPlayers.StartSetsPlayer(player, use_set_id); } } }; Sets.c
      class StartSetsPlayersConfig { void StartSetsPlayer(PlayerBase player,int use_set_id) { EntityAI itemCreated = NULL; EntityAI itemCreated1 = NULL; ItemBase itemCasted = NULL; switch( use_set_id ) //Раздаем лут (можно использовать значения от 1 и выше, только не 0 и не -1) { case 1: //Set with number 1 (Сет с номером 1) { player.RemoveAllItems(); // Чтобы удалить с персонажа уже имеющиеся стандартные стартовые шмотки раскомментировать строку (не корректно работает, пишет краш лог) itemCreated = player.GetInventory().CreateInInventory("CoyoteBag_Green"); // Выдаем рюкзак if (itemCreated) // Проверяем, создался ли рюкзак { SetRandomHealthItem(itemCreated); // Выдаем рюкзаку рандомное качество itemCreated1 = itemCreated.GetInventory().CreateInInventory("Apple"); // Добавляем в инвентарь созданного рюкзака яблоко if (itemCreated1) // Проверяем, создалось ли яблоко в рюкзаке { SetRandomHealthItem(itemCreated1); // Выдаем яблоку рандомное качество } itemCreated1 = NULL; // Обнуляем значение переменной после работы с ней itemCreated1 = itemCreated.GetInventory().CreateInInventory("Rag"); // Выдаем игроку бинты в рюкзак if (itemCreated1) // Проверяем, создались ли бинты в рюкзаке { itemCasted = ItemBase.Cast(itemCreated1); // Выполняем преобразование в другой класс для работы с нужной нам функцией itemCasted.SetQuantity(4); // Определяем количество для созданных бинтов как 4 штуки SetRandomHealthItem(itemCreated); // Выдаем бинтам рандомное качество } itemCreated1 = NULL; // Обнуляем значение переменной после работы с ней } itemCreated = NULL; // Обнуляем значение переменной после работы с ней itemCreated = player.GetInventory().CreateInInventory("TTSKOPants"); // Выдаем игроку штаны itemCreated = NULL; // Обнуляем значение переменной после работы с ней itemCreated = player.GetInventory().CreateInInventory("TTsKOJacket_Camo"); // Выдаем игроку куртку itemCreated = NULL; // Обнуляем значение переменной после работы с ней itemCreated = player.GetInventory().CreateInInventory("CombatBoots_Black"); // Выдаем игроку обувь itemCreated = NULL; // Обнуляем значение переменной после работы с ней //itemCasted = ItemBase.Cast(itemCreated); // Строка не нужна, закоментирована. используется для изменения класса EntityAI в ItemBase (чтобы нужные операции были доступны) itemCreated = player.GetInventory().CreateInInventory("CombatKnife"); // Выдаем игроку ножик в любой свободный слот в инвентаре itemCreated = player.GetInventory().CreateInInventory("FNX45"); // Выдаем игроку FNX в любой свободный слот в инвентаре itemCreated = player.GetInventory().CreateInInventory("Mag_FNX45_15Rnd"); // Выдаем игроку магазины к FNX в любой свободный слот в инвентаре itemCreated = player.GetInventory().CreateInInventory("Mag_FNX45_15Rnd"); // Выдаем игроку магазины к FNX в любой свободный слот в инвентаре itemCreated = player.GetInventory().CreateInInventory("Mag_AKM_30Rnd"); // Выдаем игроку магазины к AKM в любой свободный слот в инвентаре itemCreated = player.GetInventory().CreateInInventory("Mag_AKM_30Rnd"); // Выдаем игроку магазины к AKM в любой свободный слот в инвентаре itemCreated = NULL; // Обнуляем значение переменной itemCreated = player.GetHumanInventory().CreateInHands("akm"); // Выдаем игроку AKM в руки if (itemCreated) // Проверяем, создался ли АКМ { itemCreated.GetInventory().CreateAttachment( "PSO11Optic" ); // Выдаем игроку на AKM оптику ПСО 11 и крепим itemCreated.GetInventory().CreateAttachment( "AK_WoodBttstck" ); // Выдаем игроку на AKM цевье, приклад и глушитель, и крепим itemCreated.GetInventory().CreateAttachment( "AK_WoodHndgrd" ); // Выдаем игроку на AKM цевье, приклад и глушитель, и крепим itemCreated.GetInventory().CreateAttachment( "AK_Suppressor" ); // Выдаем игроку на AKM цевье, приклад и глушитель, и крепим } break; } case 2: //Set with number 2 (Сет с номером 2) { break; } case 3: //Set with number 3 (Сет с номером 3) { break; } case 4: //Set with number 4 (Сет с номером 4) { break; } case 5: //Set with number 5 (Сет с номером 5) { break; } case 6: //Set with number 6 (Сет с номером 6) { break; } default: //Default starting spawn set (Сет поумолчанию для всех игроков, если хотите назначить - добавляйте здесь!) { //player.RemoveAllItems(); // Чтобы удалить с персонажа уже имеющиеся стандартные стартовые шмотки раскомментировать строку break; } } } void SetRandomHealthItem(EntityAI itemCreated) { if ( itemCreated ) { private int rndHlt = Math.RandomInt(55,100); itemCreated.SetHealth("","",rndHlt); } } }
      2. В файле:
      {папка с вашим сервером}\mpmissions\dayzOffline.chernarusplus\init.c в самом верху файла добавить:
      #include "$CurrentDir:mpmissions\dayzOffline.chernarusplus\CustomSpawnPlayerConfig\Script.c" #include "$CurrentDir:mpmissions\dayzOffline.chernarusplus\CustomSpawnPlayerConfig\Sets.c" ref CustomSpawnPlayerConfig My_Custom_Spawn_Parameters = new CustomSpawnPlayerConfig(); ref StartSetsPlayersConfig StartSetsPlayers = new StartSetsPlayersConfig(); Чтобы получилось примерно так

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

      3. В функции: void main() перед ее закрывающей скобкой '}' добавить:
      GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(My_Custom_Spawn_Parameters.Read_Update_Config, 120000, true); // Обновление настроек скрипта кастомных спавнов, 1 минута = 60000 где 120000 - 2 минуты. Эта функция будет обновлять конфигурацию скрипта через указанное вами время в процессе работы сервера постоянно.

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

      4. В функции: CreateCharacter после ее открывающей скобки '{' добавить:
      pos = My_Custom_Spawn_Parameters.Load_And_Check_Spawnpoints(identity, pos); characterName = My_Custom_Spawn_Parameters.Load_And_Check_SpawnSkin_Player(identity, characterName);
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      5. В функции:
      StartingEquipSetup перед ее закрывающей скобкой '}' добавить:
      My_Custom_Spawn_Parameters.Load_And_Check_StartLoadout(player);
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      6. В папке, обозначенной параметром запуска сервера '-profile=', поместить файл с именем CustomSpawnPlayerConfig.txt
      и заполнить его данными по следующему формату:
      UID|Skin_player|sets_numbers|points_spawns где UID - это steam64id от профиля игрока в steam
      Skin_player - точный id скина игрока (можно указать 0 для отключения опции)
      sets_numbers - номер сета со стартовым лутом (можно указать несколько через ';', указать один всего, либо указать 0 для отключения опции)
      points_spawns - координаты спавна игрока на карте в формате 'x y z' (можно указать несколько через ';', указать всего одну точку, либо указать 0 для отключения опции)
      Пример:
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      76561198141889254|SurvivorM_Oliver|1|12955.091797 16.115206 7993.588379 76561198141889256|SurvivorM_Oliver|1;2|14791.965820 76.481781 14041.661133;12029.079102 196.356125 7274.689941 76561198141889253|SurvivorM_Oliver|0|0
      7. В файле Sets.c в папке:
      {папка с вашим сервером}\mpmissions\dayzOffline.chernarusplus\CustomSpawnPlayerConfig\ настроить стартовый лут для ваших игроков и написать собственные сеты
      ВАЖНО: количество сетов можно делать любое, номера сетов брать от 1 и выше (не должно быть -1, либо 0, только от 1 и выше)
      Все что укажете в блоке default будет применено для всех игроков при респавне в случае, если им не выдан никакой сет!
       
      P.S. В функции выдачи сетов опция 'player.RemoveAllItems();' работает, но пишет ошибку в scripts.log и crash.log. Причину так и не смог выяснить, на старых патчах игры работало нормально.  Возможно это временное явление!
       
      Благодарности: Товарищу Mizev за его первоначальные гайды в группе VK при появлении в сети серверной части игры
    • Автор: DrTauren
      Наверняка все помнят скрипт с поиском лута в ящиках, когда появляются оповещения типа "Из ящика бандитов выпал ящик с лутом. Найди его!" и тому подобное. Собственно, этот скрипт реализует то же самое, но уже на Арме3.
      Скрипт создаёт маркер на карте и добавляет ящик со снаряжением и подобным в рандомном месте внутри этого маркера. По прошествии определённого времени маркер и ящик исчезают.

      Типы ивентов:
      Красный маркер: военный лут Жёлтый маркер: деньги Синий маркер: строительный лут
      Что нам понадобится:

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


      Инструкция:
      1) Качаем архив, распаковываем его 2) Папку exile_server из архива копируем суда: @ExileServer\addons\
      2.1) Если вы уже вносили изменения в свой файл fn_preInit.sqf, скопируйте последние четыре строки из нового файла в ваш
      3) Открываем папку exile_server_config из архива, а затем файл config.cpp. При помощи CTRL+F ищем это: "Class Events"
      4) Наверху вы увидите строку EnabledEvents... В её конец добавляете это:
      ,"IKEA","MilitaryDrop","MoneyDrop" 5) Под строкой EnabledEvents вставьте этот код:
      class MilitaryDrop { /* Drops a supply box on a parachute next to a random airport on the map. The box may contain items. The box can be transported to a territory and installed to become a normal storage container. */ type = "spawn"; function = "ExileServer_system_event_militarydrop_start"; minTime = 25; // minutes maxTime = 40; // minutes minimumPlayersOnline = 1; dropRadius = 500; // 500m around an airport (including the main airport on Altis!) dropAltitude = 0; // altitude of the drop markerTime = 10; // minutes /* These are different types of boxes can be dropped. You can specify the cargo a box should contain. The type of box is chosen randomly from the following list. Add a type multiple times to increase the chance of being used. */ types[] = {"KSVK_2", "Lynx_2","AS50_2", "L115A3_2","Stinger_2","SPMG_2","M107_2","M320_2","Ak_2","RPG_2"}; class BoxTypes5 { class KSVK_2 { items[] = { {"CUP_srifle_ksvk", 3}, {"CUP_5Rnd_127x108_KSVK_M", 8}, {"5Rnd_127x108_APDS_Mag", 2}, {"optic_KHS_tan", 3} }; }; class M320_2 { items[] = { {"srifle_LRR_camo_F", 1}, {"srifle_LRR_F", 1}, {"srifle_LRR_tna_F", 1}, {"7Rnd_408_Mag", 15}, {"optic_LRPS", 3} }; }; class Lynx_2 { items[] = { {"srifle_GM6_ghex_F", 3}, {"Exile_Magazine_5Rnd_127x108_Bullet_Cam_Mag", 12}, {"optic_LRPS_ghex_F", 3} }; }; class AS50_2 { items[] = { {"CUP_srifle_AS50", 3}, {"CUP_5Rnd_127x99_as50_M", 12}, {"CUP_optic_CWS", 3} }; }; class M107_2 { items[] = { {"CUP_srifle_M107_Base", 3}, {"CUP_10Rnd_127x99_m107", 12}, {"CUP_optic_CWS", 3} }; }; class SPMG_2 { items[] = { {"MMG_02_black_F", 2}, {"MMG_02_camo_F", 1}, {"MMG_02_sand_F", 1}, {"130Rnd_338_Mag", 10} }; }; class L115A3_2 { items[] = { {"CUP_srifle_AWM_des", 3}, {"CUP_5Rnd_86x70_L115A1", 20}, {"optic_LRPS_ghex_F", 3} }; }; class Stinger_2 { items[] = { {"CUP_Stinger", 3}, {"CUP_Stinger_M", 12} }; }; class Ak_2 { items[] = { {"Exile_Weapon_AK47", 3}, {"Exile_Weapon_AK74_GL", 3}, {"Exile_Weapon_AK107_GL", 3}, {"Exile_Weapon_AKM", 3}, {"Exile_Weapon_AKS_Gold", 3}, {"Exile_Magazine_30Rnd_762x39_AK", 10}, {"Exile_Magazine_30Rnd_545x39_AK",10}, {"1Rnd_HE_Grenade_shell",5} }; }; class RPG_2 { items[] = { {"CUP_launch_RPG7V", 3}, {"CUP_PG7V_M", 10} }; }; }; }; class IKEA { /* Drops a supply box on a parachute next to a random airport on the map. The box may contain items. The box can be transported to a territory and installed to become a normal storage container. */ type = "spawn"; function = "ExileServer_system_event_ikea_start"; minTime = 25; // minutes maxTime = 45; // minutes minimumPlayersOnline = 0; dropRadius = 500; // 500m around an airport (including the main airport on Altis!) dropAltitude = 0; // altitude of the drop markerTime = 10; // minutes /* These are different types of boxes can be dropped. You can specify the cargo a box should contain. The type of box is chosen randomly from the following list. Add a type multiple times to increase the chance of being used. */ types[] = {"Materials1", "Materials2", "Materials3", "WoodBox", "WoodBox2", "ConcreteBuildingSupplies", "SpecialBuildingSupplies", "FortifiedUpgradeSupplies", "FortifiedSupplies"}; class BoxTypes2 { class Materials1 { items[] = { {"Exile_Item_Cement", 5}, {"Exile_Item_Sand", 12}, {"Exile_Item_MetalPole", 8}, {"Exile_Item_WaterCanisterDirtyWater", 5}, {"Exile_Item_FuelCanisterFull", 3} }; }; class Materials2 { items[] = { {"Exile_Item_Cement", 11}, {"Exile_Item_Sand", 6}, {"Exile_Item_MetalPole", 9}, {"Exile_Item_WaterCanisterDirtyWater", 8}, {"Exile_Item_FuelCanisterFull", 2} }; }; class Materials3 { items[] = { {"Exile_Item_Cement", 8}, {"Exile_Item_Sand", 9}, {"Exile_Item_MetalPole", 12}, {"Exile_Item_WaterCanisterDirtyWater", 4}, {"Exile_Item_FuelCanisterFull", 5} }; }; class WoodBox { items[] = { {"Exile_Item_WoodFloorKit", 8}, {"Exile_Item_WoodWallKit", 12}, {"Exile_Item_WooDDoorKit", 2} }; }; class WoodBox2 { items[] = { {"Exile_Item_WoodFloorKit", 14}, {"Exile_Item_WoodWallKit", 9}, {"Exile_IteM_WoodGateKit", 2} }; }; class ConcreteBuildingSupplies { items[] = { {"Exile_Item_ConcreteWallKit", 3}, {"Exile_Item_ConcreteDoorKit", 1}, {"Exile_Item_ConcreteFloorKit", 3} }; }; class SpecialBuildingSupplies { items[] = { {"Exile_Item_CodeLock", 2}, {"Exile_Item_MetalBoard", 4}, {"Exile_Item_CamoTentKit", 3}, {"Exile_Item_DuctTape", 3} }; }; class FortifiedUpgradeSupplies { items[] = { {"Exile_Item_MetalPole", 10}, {"Exile_Item_MetalBoard", 20} }; }; class FortifiedSupplies { items[] = { {"Exile_Item_FortificationUpgrade", 6}, {"Exile_Item_Grinder", 4} }; }; }; }; class Weed { /* Drops a supply box on a parachute next to a random airport on the map. The box may contain items. The box can be transported to a territory and installed to become a normal storage container. */ type = "spawn"; function = "ExileServer_system_event_weed_start"; minTime = 30; // minutes maxTime = 50; // minutes minimumPlayersOnline = 0; dropRadius = 150; // 500m around an airport (including the main airport on Altis!) markerTime = 12; // minutes }; class MoneyDrop { /* Drops a supply box on a parachute next to a random airport on the map. The box may contain items. The box can be transported to a territory and installed to become a normal storage container. */ type = "spawn"; function = "ExileServer_system_event_MoneyDrop_start"; minTime = 27; // minutes maxTime = 29; // minutes minimumPlayersOnline = 0; dropRadius = 500; // 500m around an airport (including the main airport on Altis!) dropAltitude = 0; // altitude of the drop markerTime = 10; // minutes /* These are different types of boxes can be dropped. You can specify the cargo a box should contain. The type of box is chosen randomly from the following list. Add a type multiple times to increase the chance of being used. */ types[] = {"MoneyDrop1","MoneyDrop2","MoneyDrop3","MoneyDrop4","MoneyDrop5","MoneyDrop6","MoneyDrop7"}; class BoxTypes4 { class MoneyDrop1 { items[] = { {"CUP_item_Money", 4} }; }; class MoneyDrop2 { items[] = { {"CUP_item_Money", 5} }; }; class MoneyDrop3 { items[] = { {"CUP_item_Money", 4} }; }; class MoneyDrop4 { items[] = { {"CUP_item_Money", 3} }; }; class MoneyDrop5 { items[] = { {"CUP_item_Money", 6} }; }; class MoneyDrop6 { items[] = { {"Exile_Item_RubberDuck", 1} }; }; class MoneyDrop7 { items[] = { {"Exile_Item_RubberDuck", 1} }; }; }; }; Готово 

      Оригинальный гайд на английском:
       http://www.exilemod.com/topic/24466-4-types-of-side-events/  
    • Автор: psycho85
      Подскажите как увеличить кол-во лута в arma 3 epoch, а то спавнится очень мало?
    • Автор: slava21s
      Добавляю здания через редактор в dayz epoch а в этих томах лута нету 
    • Автор: PavelDmitriev94
      Здравствуйте. Такой вопрос, можно ли сделать что бы техника после покупки появлялась сразу с лутом, либо добавить торговцу ящики с предметами? ( К примеру Камаз или ящик со строй.материалами  )