Автор: Виталий Мизев
Для начала в папке профиля сервера которая указана в параметре запуска сервера -profile=
создаем 2 файла
pointPlayerPVP.lst - координаты спавна нового персонажа в формате vector
playersSetUID.ini - Steam UID игроков | номер комплекта стартового лута для выбора
Пример формата файла pointPlayerPVP.lst
6010.40 0 7742.71
6386.92 0 7945.12
6478.50 0 7874.77
6044.73 0 7699.81
Пример формата playersSetUID.ini - STEAMUID|номер
76531195156927007|1
76561838156127001|2
Игроку с Steam UID 6531195156927007 будет выдат комплект 1, 76561838156127001 комплект 2, если в файле UID нет, то рандомно из остальных комплектов
В файле init.c
в теле класса: class CustomMission: MissionServer
сначала обьявим массивы
ref array<string> m_pointPlayerPVP = new array<string>;;
ref map<string, int> m_playersSetUID = new map<string, int>;
это массивы глобальны в классе и могут использоваться во всех функциях класса
в теле override void OnInit() (выполняется при запуске сервера)
Чтение координат спавна из файла в массив m_pointPlayerPVP
string line_content;
FileHandle file = OpenFile("$profile:pointPlayerPVP.lst", FileMode.READ);
Print("::: OpenFile : pointPlayerPVP.lst : $profile");
if (file != 0)
{
while ( FGets( file, line_content ) > 0 )
{
m_pointPlayerPVP.Insert( line_content);
}
CloseFile(file);
}
m_pointPlayerPVP.Debug();
Чтение Steam UID и номера из файла в массив m_playersSetUID
array<string> strFileParam;
file = OpenFile("$profile:playersSetUID.ini", FileMode.READ);
Print("::: OpenFile : playersSetUID.ini : $profile");
if (file != 0)
{
while ( FGets( file, line_content ) > 0 )
{
strFileParam = new array<string>;
line_content.Split( "|", strFileParam );
m_playersSetUID.Insert(strFileParam.Get(0), strFileParam.Get(1).ToInt());
}
CloseFile(file);
}
Далее
При создании НОВОГО обьекта игрока
сначала ему задаются координаты рандомно выбираясь из массива m_pointPlayerPVP
см как идет работа с этим массивом
override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName)
{
Entity playerEnt;
if (m_pointPlayerPVP.Count()>0)
{
Print (m_pointPlayerPVP.Count());
int maxNum = m_pointPlayerPVP.Count();
int numPoint = Math.RandomInt(0, maxNum - 1);
pos = m_pointPlayerPVP.Get(numPoint).ToVector();
}
playerEnt = GetGame().CreatePlayer(identity, characterName, pos, 0, "NONE");//Creates random player
Class.CastTo(m_player, playerEnt);
GetGame().SelectPlayer(identity, m_player);
return m_player;
}
Затем при создании стартового комплекта лута комплект выдается в зависимости от наличия в файле UID и номера после | (комплекта) (в данном случае для номера 1 набор собран (см case :1) , для остальных ничего)
override void StartingEquipSetup(PlayerBase player, bool clothesChosen)
{
//По умолчанию номер комплекта выбирается рандомно
int numSet = Math.RandomInt(2,6); /// 1 - Админ сет, 2-6 сеты для всех пока пусты
EntityAI itemEnt;
ItemBase itemBs;
//Это тут на всякий случай
//Получаем UID
//PlayerIdentity p_identity = player.GetIdentity();
//p_identity.GetName(); // Получим имя игрока
//p_identity.GetPlainId(); // UID в нашем знакомом виде 7656119**********
//p_identity.GetId(); // получим UID в не знакомом виде Ue7dyagee34*********
//p_identity.GetPlayerId(); // получим порядковый номер объекта типа игрок
PlayerIdentity p_identity = player.GetIdentity();
string p_name = p_identity.GetName();
int p_id = p_identity.GetPlayerId();
if( p_identity )
{
string uid_pl = p_identity.GetPlainId();
if (m_playersSetUID.Contains(uid_pl))
{
numSet = m_playersSetUID.Get(uid_pl);
}
}
itemEnt = player.GetInventory().CreateInInventory("Rag");
itemBs = ItemBase.Cast(itemEnt);
itemBs.SetQuantity(4);
SetRandomHealth(itemEnt);
itemEnt = player.GetInventory().CreateInInventory("RoadFlare");
itemBs = ItemBase.Cast(itemEnt);
switch( numSet ) //Раздаем лут
{
case 1: //ADMIN
{
player.RemoveAllItems();
player.GetInventory().CreateInInventory("CoyoteBag_Green");
itemBs = ItemBase.Cast(itemEnt);
player.GetInventory().CreateInInventory("TTSKOPants");
itemBs = ItemBase.Cast(itemEnt);
player.GetInventory().CreateInInventory("TTsKOJacket_Camo");
itemBs = ItemBase.Cast(itemEnt);
player.GetInventory().CreateInInventory("CombatBoots_Black");
itemBs = ItemBase.Cast(itemEnt);
player.GetInventory().CreateInInventory("CombatKnife");
itemBs = ItemBase.Cast(itemEnt);
player.GetInventory().CreateInInventory("FNX45");
itemBs = ItemBase.Cast(itemEnt);
player.GetInventory().CreateInInventory("Mag_FNX45_15Rnd");
itemBs = ItemBase.Cast(itemEnt);
player.GetInventory().CreateInInventory("Mag_FNX45_15Rnd");
itemBs = ItemBase.Cast(itemEnt);
player.GetInventory().CreateInInventory("Mag_AKM_30Rnd");
itemBs = ItemBase.Cast(itemEnt);
player.GetInventory().CreateInInventory("Mag_AKM_30Rnd");
itemBs = ItemBase.Cast(itemEnt);
itemEnt = player.GetInventory().CreateInInventory( "akm" );
itemEnt.GetInventory().CreateAttachment( "PSO11Optic" );
itemEnt.GetInventory().CreateAttachment( "AK_WoodBttstck" );
itemEnt.GetInventory().CreateAttachment( "AK_WoodHndgrd" );
itemEnt.GetInventory().CreateAttachment( "AK_Suppressor" );
itemEnt = player.GetInventory().CreateInInventory("Rag");
itemBs = ItemBase.Cast(itemEnt);
itemBs.SetQuantity(4);
itemEnt = player.GetInventory().CreateInInventory("RoadFlare");
itemBs = ItemBase.Cast(itemEnt);
player.SetHealth("","",1000); //ТЕСТ
//SetAllowDamage НЕ РАБОТАЕТ ДЛЯ ОНЛАЙНА - БОГЕМЦЫ ВЫКЛЮЧИЛИ
//Тут обсуждение - https://forums.dayz.com/topic/240028-pve-server-disable-pvp-damage/
//Есть идея насчет доработки кода обрабатывающего нанесение урона
player.SetAllowDamage(false);
break;
}
case 2:
{
break;
}
case 3:
{
break;
}
case 4:
{
break;
}
case 5:
{
break;
}
case 6:
{
break;
}
}
}
Вот как-то так
На основе этого можно построить свою более развитую систему, например загружая координаты для кастомного спавн лута, расстановки зданий и тп