Автор скрипта: http://s-platoon.ru/profile/48-nonameultima/
Все благодарности за этот скрипт непосредственно автору скрипта, не мне!
В данной теме, расскажу как сделать зараженные газом области на карте своим методом, на обновленной версии игры 1.0.
Автор: NoNameUltima
1. Открываем на сервере файл: DayZServer\mpmissions\dayzOffline.chernarusplus\init.c
2. В самом верху файла добавляем строку:
#include "$CurrentDir:mpmissions\dayzOffline.chernarusplus\DamagedZone.c"
3. В том же файле находим строки:
class CustomMission: MissionServer
{
Добавляем ниже блок функции OnInit по образцу ниже:
override void OnInit ()
{
super.OnInit();
GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(GAS_ZONE_TRIGGER, 10000, true);
}
Если функция уже есть, в ее конец лишь дописываем сам вызов:
GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(GAS_ZONE_TRIGGER, 10000, true);
Здесь:
*10000 - Время в милисекундах(10 секунд). С такой частотой будет наноситься проверка игроков в зоне и урон в данной области.
4. Создаем в папке рядом с init.c файл с именем и расширением: DamagedZone.c
Вставляем в созданный нами файл следующий код:
vector GAS_ZONE_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;
}
void GAS_ZONE_TRIGGER()
{
/*
GAS_ZONE_TRIGGER
Автор: NoNameUltima
skype: hf-trade
*/
// Зараженные зоны
private TVectorArray gas_points = {"13249 0 3962", "6389 0 2683", "6612 0 2561"};
// Массив намордников
private TStringArray gas_masks = {"GasMask", "GP5GasMask"};
// Радиус зон
private int GAS_ZONE_radius = 350;
// Наносимый урон
private float GAS_ZONE_damage_value = 10;
private array<Man> GAS_ZONE_players_man = new array<Man>;
GetGame().GetPlayers( GAS_ZONE_players_man );
private PlayerBase GAS_ZONE_player;
private vector GAS_ZONE_position_player;
private int GAS_ZONE_x;
private bool GAS_ZONE_isGasMask;
private int GAS_ZONE_attCount;
private int GAS_ZONE_attIdx;
private EntityAI GAS_ZONE_attachment;
private ItemBase GAS_ZONE_item;
private string GAS_ZONE_className;
private float GAS_ZONE_damage_player;
for (private int GAS_ZONE_i = 0; GAS_ZONE_i < GAS_ZONE_players_man.Count(); GAS_ZONE_i++)
{
GAS_ZONE_player = PlayerBase.Cast(GAS_ZONE_players_man.Get(GAS_ZONE_i));
GAS_ZONE_position_player = GAS_ZONE_player.GetPosition();
for (GAS_ZONE_x = 0; GAS_ZONE_x < gas_points.Count(); GAS_ZONE_x++)
{
if ( (vector.Distance(GAS_ZONE_position_player, GAS_ZONE_CorrectToGroundPosY(gas_points.Get(GAS_ZONE_x)))) < GAS_ZONE_radius )
{
GAS_ZONE_isGasMask = false;
GAS_ZONE_attCount = GAS_ZONE_player.GetInventory().AttachmentCount();
for (GAS_ZONE_attIdx = 0; GAS_ZONE_attIdx < GAS_ZONE_attCount; GAS_ZONE_attIdx++)
{
GAS_ZONE_attachment = GAS_ZONE_player.GetInventory().GetAttachmentFromIndex(GAS_ZONE_attIdx);
if ( GAS_ZONE_attachment.IsItemBase() )
{
GAS_ZONE_item = ItemBase.Cast(GAS_ZONE_attachment);
GAS_ZONE_className = GAS_ZONE_item.GetType();
if ( gas_masks.Find(GAS_ZONE_className) >= 0 )
{
//Print ("Намордник найден!");
GAS_ZONE_isGasMask = true;
break;
}
}
}
if (GAS_ZONE_isGasMask == false)
{
//Print ("Намордник не найден!");
GAS_ZONE_damage_player = GAS_ZONE_player.GetHealth("GlobalHealth", "Health");
GAS_ZONE_player.SetHealth("GlobalHealth", "Health", GAS_ZONE_damage_player - GAS_ZONE_damage_value);
}
}
}
}
}
Все остальные настройки подписаны в скрипте, изучайте методом проб и ошибок.
P.S. от автора скрипта
1. Любой желающий, кто знает скриптинг, может изменить формат массива, и сделать зоны с разным радиусом и набором вещей.
2. Можно при желании добавить вывод оповещения, в зараженных зонах.
*Скрипт предоставлен мной (NoNameUltima), в обрезанном виде намерено - остальное на Ваш вкус и цвет
Изменено 4 октября пользователем NoNameUltima
Альтернативный гайд:
Вариант от товарища elanc с инструкцией