В данной теме я распишу мой вариант установки сейвзоны, работающий на момент публикации статьи на версии сервера игры 0.63.149525.
Установка
1. Открываем 'init.c' в 'MpMissions' вашей.
2. Вверху файла добавляем 1 строкой:
#include "$CurrentDir:\\mpmissions\\dayzoffline.chernarusplus\\Scripts\safezone.c"
ref SafeZone_PlugIn SafeZone = new SafeZone_PlugIn();
Где 'dayzoffline.chernarusplus' - имя папки с активной 'MpMissions' вашей.
Пример:
3. В этом же файле находим блок начала класса 'CustomMission: MissionServer' и в его начале после открытия класса добавляем
bool Activate_SafeZone_PlugIn = true; // safezone on (true) or off (false)
override void TickScheduler(float timeslice)
{
GetGame().GetWorld().GetPlayerList(m_Players);
if( m_Players.Count() == 0 ) return;
for(int i = 0; i < SCHEDULER_PLAYERS_PER_TICK; i++)
{
if(m_currentPlayer >= m_Players.Count() )
{
m_currentPlayer = 0;
}
PlayerBase currentPlayer = PlayerBase.Cast(m_Players.Get(m_currentPlayer));
if (Activate_SafeZone_PlugIn) { SafeZone_PlugIn.CheckingPosition(currentPlayer); } //Check if player is near safezone
currentPlayer.OnTick();
m_currentPlayer++;
}
}
Пример:
4. Создаем папку 'Scripts' в корне 'MpMissions' вашей, а в ней создаем файл с именем 'safezone.c' следующего содержания:
class SafeZone_PlugIn
{
protected static vector SAFEZONE_LOACTION = "15145.1 32.9793 13919.0"; //Map coords (position 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!";
//Runs every tick (Stat time tick!) IMPORANT: Does reduce about 120 FPS when server is High-Full Pop!
static void CheckingPosition(PlayerBase player)
{
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 Param1<string> SAFEZONE_Msgparam;
private vector SAFEZONE_pos_player = player.GetPosition();
private vector SAFEZONE_LOCATION_FIXED = CorrectToGroundPosY(SAFEZONE_LOACTION);
private string name_mesage_profile = "GodModeEnabledFor:" + SAFEZONE_UID_PLAYER;
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
{
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());
SendPersonalMessage(SAFEZONE_ENTRY_MESSAGE, player);
}
}
else if (SAFEZONE_distance > SAFEZONE_RADIUS) //Player Outside of Zone
{
SAFEZONE_ZoneCheck = "";
GetGame().GetProfileString(name_mesage_profile,SAFEZONE_ZoneCheck);
if (SAFEZONE_ZoneCheck == "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());
SendPersonalMessage(SAFEZONE_EXIT_MESSAGE, player);
} else
{
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());
}
}
}
Ну или скачиваем его отсюда в готовом виде: safezone.c
Здесь:
'SAFEZONE_LOACTION' - координаты точки центра сейвзоны.
'SAFEZONE_RADIUS' - радиус от указанного центра севзоны, на котором действует защита
'ENTRY_MESSAGE' - сообщение о входе в зону (не рекоммендуется указывать русский язык, может не отображаться)
'EXIT_MESSAGE' - сообщение о выходе из зоны (не рекоммендуется указывать русский язык, может не отображаться)
5. Распаковываем в папку с сервером в корень вот этот архив: ModdedScripts.rar
6. В параметры запуска сервера добавляем:
-mod=ModdedScripts
7. Запускаем сервер и проверяем.
Для совсем ленивых готовая миссия сервера с настроенной сейвзоной. dayzOffline.chernarusplus.rar Пункты 5-7 из инструкции выше после этого необходимо повторить, иначе годмод работать не будет!!!
P.S. Если у вас в корне сервера лежала папка scripts и она читалась сервером, после этого она может перестать считываться!
P.P.S. Да, да, за основу взята сборка от DaOne, и по тому же принципу сделана и safe-zone с незначительными изменениями. За что ему огромное спасибо. Более корректной реализации метода God-Mode не встречал.