Нужна помощь?
Создайте тему в соответствующем разделе
Не нужно писать всё в чат!Загляните на торговую площадку
Там вы можете купить
всё что касается игровых серверовНе хотите бан?
Пожалуйста, ознакомьтесь с нашими правилами
Не нарушайте порядок!Продаёте или покупаете?
Пользуйтесь услугами гаранта
Мы сделаем вашу сделку безопасной
Таблица лидеров
Популярные публикации
Отображаются публикации с наибольшей репутацией на 03/06/19 во всех областях
-
4 баллаКак и обещал выкладываю код и небольшой гайд Собственно речь о функции загрузки UID и координат из файла в массив m_playersSpawnPoints класса миссии, который в последствии можно исполдьзовать в других функциях в классе миссии Отступление массив m_playersSpawnPoints это массив типа map В данном случае <string,string> где и индекс и значение текстовые строки индексом выступает записанный UID, а значением координаты, которые перед использованием преобразуются из текста в vector c помощью функции ToVector() Но об этом позже Раздел 1. Подключение КОд функции: //Players personal spawn points (for new connected players) ref map<string,string> m_playersSpawnPoints = new map<string,string>; void LoadPlayersSpawnPoints() { /* Файл playersSpawnPoints.lst кладем в папку указанную в параметре запуска сервера -profiles= тогда путь будет "$Profile:" или если кладем в файл в mpmissions\dayzOffline.chernarusplus\_CONF путь будет "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\" Путь меняется в переменной m_SettingsPath - "$Profile:" или "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\" Можете указать свой путь, но он должен быть либо в $Profiles: либо в $CurrentDir:\\mpmissions\\dayzOffline.chernarusplus Формат файла: Steam UID в привычном виде 17 цифр Координаты Комментарий (через пробелы) Помните любая ошибка может привести к крашу сервера Не желательны пустые строки! Пример: 76562298156537008 1300 0 5600 Дима 76561998116927209 3000 0 3000 Вася из Новороссийска Про массив: ref map<string, string> m_playersSpawnPoints = new map<string, string>; m_playersSpawnPoints тут массив типа map, где каждый элемент массива состоит из 2х ячеек. 1. Индекс - тип string 2. Значение - тип string Пример работы с массивом типа map Запись в массив m_playersSpawnPoints.Insert("76562298156537008", "1300 0 5600"); //записываем первый элемент - индекс dayz, значение 10 m_playersSpawnPoints.Insert("76561998116927209", "3000 0 3000"); //записываем второй элемент - индекс dayzf, значение 17 Чтение из массива: Получаем значение 0го элемента string m = m_playersSpawnPoints.GetElement(0); // = "1300 0 5600" Получаем индекс 0го элемента string name = m_playersSpawnPoints.GetKey(0); / /= "76562298156537008" Получаем значение по индексу (в данном случае нас интерисует именно ЭТО) string n = m_playersSpawnPoints.Get("76561998116927209"); // = "3000 0 3000" //затем n переводим в вектор Usage in CreateCharacter function for change default spawn position: string PlayerUID = identity.GetPlainId(); if (PlayerUID) { if (m_playersSpawnPoints.Contains(PlayerUID) { pos = m_playersSpawnPoints.Get(PlayerUID).ToVector(); } } */ string FileName = "playersSpawnPoints.lst"; string m_SettingsPath = "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\"; //Folder with config files - .ini or .lst // Or "$Profiles:\\" FileHandle file; string file_line; array<string> read_line; int linecount = 0; //Comments check bool skipline = false; bool skipblock = false; //Comments check file = OpenFile(m_SettingsPath + FileName, FileMode.READ); if (file != 0) { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Read File: " + m_SettingsPath + FileName + " :::"); while (FGets(file, file_line) >= 0) { linecount++; //Comments check and skip if (file_line.IndexOfFrom(0,"//") == 0 || file_line.IndexOfFrom(0,"#") == 0 || file_line.IndexOfFrom(0," ") == 0 || file_line.Length() <= 0) { skipline = true; } else { skipline = false; } if (file_line.IndexOfFrom(0,"/*") == 0) { skipblock = true; } else if (file_line.IndexOfFrom(0,"*/") == 0) { skipblock = false; skipline = true; } //Comments check if (!skipline && !skipblock) { read_line = new array<string>; file_line.Split(" ",read_line); if (read_line.Count() >= 4) { if (read_line.Get(0).Length() == 17) { if (read_line.Get(1).ToFloat() > 0 && read_line.Get(3).ToFloat() > 0) { if (!m_playersSpawnPoints.Contains(read_line.Get(0))) { m_playersSpawnPoints.Insert(read_line.Get(0), read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3)); // UID, Position Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " Add UID " + read_line.Get(0) + " spawnpoint: " + read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3) + " to m_playersSpawnPoints"); } else { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " UID " + read_line.Get(0) + " duplicated, check file!"); } } else { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " Position error: '" + read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3) + "' :::"); } } else { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " UID error: " + file_line + " :::"); } } else { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " have errors: " + file_line + " :::"); } } } CloseFile(file); if (m_playersSpawnPoints.Count() > 0) { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Players personal spawn points count: " + m_playersSpawnPoints.Count() + " :::"); } else { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Players personal spawn points is not loaded! :::"); } } else { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Error open file: " + m_SettingsPath + FileName + " :::"); } } Комментарии, а так же диагностические принты в лог не убираю сознательно ПОдключение и использование. Функцию размещаем в теле класса миссии в init.c или если она вынесена в другой файл (и файл подключени через #include) в том самом файле в теле класса миссии Вот как-то так: class CustomMission : MissionServer { //Тут разные функции и определение переменных класса... //Вот тут переопределенный штатно OnInit override void OnInit () { //тут его код ) //Тут определяем наш массив и функцию //Players personal spawn points (for new connected players) ref map<string,string> m_playersSpawnPoints = new map<string,string>; void LoadPlayersSpawnPoints() { //тут ее код } //Тут разные функции... } Ну Вы поняли... Далее нам надо при запуске и инициализации сервера эту функцию выполнить Но прежде надо создать файл по нужному пути в котором будут UID'ы и координаты В данной редакции используется путь "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\" и имя файла "playersSpawnPoints.lst" те в папке mpmissions\dayzOffline.chernarusplus нужно создать папку _CONF и поместить в нее этот файл Но вы можете это переделать как Вам больше нравится Формат файла: 6561198156925007 2698.36 0 5989.59 USER 6561198156924007 2698.36 0 5989.59 ВАСЯ 6561198156923007 2698.36 0 5989.59 ПЕТЯ //Тут комментарий /* 6561193356923001 3698.36 30 5189.59 ПЕТЯ */ //Тут комментарий #Тут комментарий Первое поле - позиция - Это Steam UID (17 цифирь) 2,3,4 поля позиции числа это координаты X Z Y (Z = высота) - если 0 система поставит перса на землю или ближайшую твердую поверхность под ним все что дальше игнорится Можно каментить строки с помощью // , # Можно каментить блоки /* */ Если первый символ в строке пробел, все остальное то же игнорится Пустые строки то же игнорятся Если в строке с UID и координатами ошибка об этом напишет в лог с указанием номера строки Если UID дублируется об этом то же напишет в лог Ок Файл создали Теперь добавим вызов этой функции в тело функции OnInit в классе миссии (про нее речь шла Выше) Функция OnInit ВСЕГДА выполняется при запуске сервера Внутрь мы добавим вызов LoadPlayersSpawnPoints() В итоге при запуске сервера LoadPlayersSpawnPoints() выполнется и запишет в массив m_playersSpawnPoints UID'ы и координат Добавляем как-то так: override void OnInit() { //Тут может быть различный код //Тут вызов нашей функции //Load players personal spawn poins LoadPlayersSpawnPoints(); // => m_playersSpawnPoints // "UID", "Position" //Тут может быть различный код } Запустили сервер и увидели в логе что файл прочитался и все ок .... LoadPlayersSpawnPoints() ::: Players personal spawn points count: итд итп Или ошибки Если ошибки - читаем все еще раз и/или задаем вопросы в теме (НЕ В ЛИЧКЕ!!!) показывая что куда и как Вы прописали Отлично Тормозим в сервер Продолжение следует минут через 15
-
3 балла
Выбор точек спавна игроков по UID из файла
paranoyk и ещё 2 отреагировал на BorizzK за сообщение в теме
Продолжение Раздел 2. Использование. Поскольку использовать выдачу спавн-точек по UIВ логично при первом подключении игрока к серверу, использовать содержимое массива для выдачи координат спавна по UID мы будеем в штатной функции сервера/миссии CreateCharacter находим эту функцию в теле класса миссии ее определение выглядит вот так override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName) { //тут код и добаляем в самом начале код вот так override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName) { if (identity.GetPlainId()) { string p_UID = identity.GetPlainId(); if (m_playersSpawnPoints.Contains(p_UID)) { vector p_SpawnPoint = m_playersSpawnPoints.Get(p_UID).ToVector(); Print ("::: init.c ::: PlayerBase CreateCharacter ::: Selected personal spawn point Pos: " + pos.ToString() + " for player: " + identity.GetName() + " with UID: "+ p_UID); } } if (p_SpawnPoint) pos = p_SpawnPoint; //тут остальной нативный (штатный) код } Что имеем if (identity.GetPlainId()) - проверка на наличие "идентичности" или "личности" подключившегося игрока лучше проверить, а то вдруг дисконнект в виде разрыва соединения и тп глюков потом будут ошибки в логе - не красиво string p_UID = identity.GetPlainId(); - получаям Steam UID в привычном виде 17 цифирь if (m_playersSpawnPoints.Contains(p_UID)) - если наш массив m_playersSpawnPoints содержит в индексах UID игрока то { vector pos = m_playersSpawnPoints.Get(p_UID).ToVector(); - перезаписываем содержимое переменной pos (содержащей выданные сервером координаты нового игрока) координатами полученными из массива по UID. } Вот собственно и все Ну а далее в этой штатной функции идет штатное создание персонажа Отступлю с собьяснением Entity playerEnt; // определяем переменную в которую попадет персонаж ( "сущность" ) - на самом деле тип Entity то же самое что и EntityAI playerEnt = GetGame().CreatePlayer(identity, characterName, pos, 0, "NONE"); - создание персонажа - вот тут как раз и указываются координаты создания перса Class.CastTo(m_player, playerEnt); - кастим сущность из класса EntityAI в переменную m_player класса PlayerBase что бы иметь ссылку на обьект соответствующего класса - странно, но определять тип переменной m_player в данном случае не обязательно GetGame().SelectPlayer(identity, m_player); - связываем "идентичность/личность" подключившегося игрока с персонажем из переменной m_player return m_player; - функция возвращает вызвавшему ее ДВИЖКУ ссылку на обьект которым управляет игрок Добавлю можно создавать файлы с любыми конфигами на основе этого кода читать их в массивы достаточно просто немного переделать код Есть вопросы? Задавайте Спасибо за внимание... -
2 балла
Выбор точек спавна игроков по UID из файла
paranoyk и ещё один отреагировал на VIRrusR за сообщение в теме
BorizzK , большое спасибо за проделанную работу, разъяснения и проявленное терпение! Всё работает! Специально для дремучих и безграмотных, типа меня, рассказываю как делать пошагово, ибо в теме много слов, вопросов и т.д.: 1. Вписываем в самое начало файла init.c строки: #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_MOD\\SpawnPoints\\SpawnPointsClass.c" //Server_SpawnPoints_Class ref Server_SpawnPoints_Class Server_SpawnPoints = new Server_SpawnPoints_Class(); Если там у Вас уже есть какие-то подключения через #include, то прямо под ними, следующей строкой. Далее, после строки "override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName)" , вместо того, что там есть вписываем вот это: { //Координаты по UID vector p_SpawnPoint = Server_SpawnPoints.GetPlayerSpawnPoint(identity); //See Server_SpawnPoints_Class if (p_SpawnPoint) { pos = p_SpawnPoint; Print ("::: init.c ::: PlayerBase CreateCharacter ::: Selected personal spawn point: Pos: " + pos.ToString() + " for player: " + identity.GetName() + " with UID: " + identity.GetPlainId()); } //Координаты по UID Entity playerEnt; playerEnt = GetGame().CreatePlayer(identity, characterName, pos, 0, "NONE");//Creates random player Class.CastTo(m_player, playerEnt); GetGame().SelectPlayer(identity, m_player); return m_player; } Для "ванильного" init.c должно получится так: #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_MOD\\SpawnPoints\\SpawnPointsClass.c" //Server_SpawnPoints_Class ref Server_SpawnPoints_Class Server_SpawnPoints = new Server_SpawnPoints_Class(); void main() { //INIT WEATHER BEFORE ECONOMY INIT------------------------ Weather weather = g_Game.GetWeather(); weather.MissionWeather(false); // false = use weather controller from Weather.c weather.GetOvercast().Set( Math.RandomFloatInclusive(0.4, 0.6), 1, 0); weather.GetRain().Set( 0, 0, 1); weather.GetFog().Set( Math.RandomFloatInclusive(0.05, 0.1), 1, 0); //INIT ECONOMY-------------------------------------- Hive ce = CreateHive(); if ( ce ) ce.InitOffline(); //DATE RESET AFTER ECONOMY INIT------------------------- int year, month, day, hour, minute; int reset_month = 9, reset_day = 20; GetGame().GetWorld().GetDate(year, month, day, hour, minute); if ((month == reset_month) && (day < reset_day)) { GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute); } else { if ((month == reset_month + 1) && (day > reset_day)) { GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute); } else { if ((month < reset_month) || (month > reset_month + 1)) { GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute); } } } } class CustomMission: MissionServer { void SetRandomHealth(EntityAI itemEnt) { if ( itemEnt ) { int rndHlt = Math.RandomInt(55,100); itemEnt.SetHealth("","",rndHlt); } } override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName) { //Координаты по UID vector p_SpawnPoint = Server_SpawnPoints.GetPlayerSpawnPoint(identity); //See Server_SpawnPoints_Class if (p_SpawnPoint) { pos = p_SpawnPoint; Print ("::: init.c ::: PlayerBase CreateCharacter ::: Selected personal spawn point: Pos: " + pos.ToString() + " for player: " + identity.GetName() + " with UID: " + identity.GetPlainId()); } //Координаты по UID Entity playerEnt; playerEnt = GetGame().CreatePlayer(identity, characterName, pos, 0, "NONE");//Creates random player Class.CastTo(m_player, playerEnt); GetGame().SelectPlayer(identity, m_player); return m_player; } override void StartingEquipSetup(PlayerBase player, bool clothesChosen) { EntityAI itemTop; EntityAI itemEnt; ItemBase itemBs; float rand; itemTop = player.FindAttachmentBySlotName("Body"); if ( itemTop ) { itemEnt = itemTop.GetInventory().CreateInInventory("Rag"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(4); SetRandomHealth(itemEnt); itemEnt = itemTop.GetInventory().CreateInInventory("RoadFlare"); SetRandomHealth(itemEnt); rand = Math.RandomFloatInclusive(0.0, 1.0); if ( rand < 0.35 ) itemEnt = player.GetInventory().CreateInInventory("Apple"); else if ( rand > 0.65 ) itemEnt = player.GetInventory().CreateInInventory("Pear"); else itemEnt = player.GetInventory().CreateInInventory("Plum"); SetRandomHealth(itemEnt); } } }; Mission CreateCustomMission(string path) { return new CustomMission(); } 2. Создаём по пути "/serverfiles/mpmissions/dayzOffline.chernarusplus" на Вашем сервере папку \_MOD\ 3. В папке \_MOD\ создаём ещё одну папку \SpawnPoints\ 4. В папку \SpawnPoints\ помещаем файл "SpawnPointsClass.c" следующего содержания: //Version 06.03.2019.2035 //Author: Borizz.K aka [G.P.]NOIZZ(MC2) (s-platoon.ru) class Server_SpawnPoints_Class { ref map<string,string> m_playersSpawnPoints = new map<string,string>; //Конструктор - выполняется всегда при инициализации класса void Server_SpawnPoints_Class() { Print("::: [Server_SpawnPoints_Class] ::: Init :::"); LoadPlayersSpawnPointsByUid(); } //Деструктор - выполняется всегда при деинициализации класса (например при корректной остановке сервера) void ~Server_SpawnPoints_Class() { Print("::: [Server_SpawnPoints_Class] ::: UnInit :::"); } void LoadPlayersSpawnPointsByUid() { /* Файл playersSpawnPoints.lst кладем в папку указанную в параметре запуска сервера -profiles= тогда путь будет "$Profiles:\\" или если кладем в файл в mpmissions\dayzOffline.chernarusplus\_CONF путь будет "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\" Путь меняется в переменной m_SettingsPath - "$Profiles:\\" или "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\" Можете указать свой путь, но он должен быть либо в $Profiles: либо в $CurrentDir: Формат файла: Steam UID в привычном виде 17 цифр Координаты Комментарий (через пробелы) Помните любая ошибка может привести к крашу сервера Не желательны пустые строки! Пример: 76562298156537008 1300 0 5600 Дима 76561998116927209 3000 0 3000 Вася из Новороссийска Про массив: ref map<string, string> m_playersSpawnPoints = new map<string, string>; m_playersSpawnPoints тут массив типа map, где каждый элемент массива состоит из 2х ячеек. 1. Индекс - тип string 2. Значение - тип string Пример работы с массивом типа map Запись в массив m_playersSpawnPoints.Insert("76562298156537008", "1300 0 5600"); //записываем первый элемент - индекс dayz, значение 10 m_playersSpawnPoints.Insert("76561998116927209", "3000 0 3000"); //записываем второй элемент - индекс dayzf, значение 17 Чтение из массива: Получаем значение 0го элемента string m = m_playersSpawnPoints.GetElement(0); // = "1300 0 5600" Получаем индекс 0го элемента string name = m_playersSpawnPoints.GetKey(0); / /= "76562298156537008" Получаем значение по индексу (в данном случае нас интерисует именно ЭТО) string n = m_playersSpawnPoints.Get("76561998116927209"); // = "3000 0 3000" //затем n переводим в вектор Usage in CreateCharacter function for change default spawn position: string PlayerUID = identity.GetPlainId(); if (PlayerUID) { if (m_playersSpawnPoints.Contains(PlayerUID) { pos = m_playersSpawnPoints.Get(PlayerUID).ToVector(); } } */ string FileName = "playersSpawnPoints.lst"; string m_SettingsPath = "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\"; //Folder with config files - .ini or .lst // Or "$Profiles:\\" FileHandle file; string file_line; array<string> read_line; int linecount = 0; //Comments check bool skipline = false; bool skipblock = false; //Comments check file = OpenFile(m_SettingsPath + FileName, FileMode.READ); if (file != 0) { Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read File: " + m_SettingsPath + FileName + " :::"); while (FGets(file, file_line) >= 0) { linecount++; //Comments check and skip if (file_line.IndexOfFrom(0,"//") == 0 || file_line.IndexOfFrom(0,"#") == 0 || file_line.IndexOfFrom(0," ") == 0 || file_line.Length() <= 0) { skipline = true; } else { skipline = false; } if (file_line.IndexOfFrom(0,"/*") == 0) { skipblock = true; } else if (file_line.IndexOfFrom(0,"*/") == 0) { skipblock = false; skipline = true; } //Comments check if (!skipline && !skipblock) { read_line = new array<string>; file_line.Split(" ",read_line); if (read_line.Count() >= 4) { if (read_line.Get(0).Length() == 17) { if (read_line.Get(1).ToFloat() > 0 && read_line.Get(3).ToFloat() > 0) { if (!m_playersSpawnPoints.Contains(read_line.Get(0))) { m_playersSpawnPoints.Insert(read_line.Get(0), read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3)); // UID, Position Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " Add UID " + read_line.Get(0) + " spawnpoint: " + read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3) + " to m_playersSpawnPoints"); } else { Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " UID " + read_line.Get(0) + " duplicated, check file!"); } } else { Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " Position error: '" + read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3) + "' :::"); } } else { Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " UID error: " + file_line + " :::"); } } else { Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " have errors: " + file_line + " :::"); } } } CloseFile(file); if (m_playersSpawnPoints.Count() > 0) { Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Players personal spawn points count: " + m_playersSpawnPoints.Count() + " :::"); } else { Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Players personal spawn points is not loaded! :::"); } } else { Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Error open file: " + m_SettingsPath + FileName + " :::"); } } vector GetPlayerSpawnPoint(PlayerIdentity identity) { vector pos; if (identity.GetPlainId()) { string p_UID = identity.GetPlainId(); if (m_playersSpawnPoints.Contains(p_UID)) { pos = m_playersSpawnPoints.Get(p_UID).ToVector(); Print ("::: [Server_SpawnPoints_Class] ::: GetPlayerSpawnPoint ::: Selected personal spawn point Pos: " + pos.ToString() + " for player: " + identity.GetName() + " with UID: "+ p_UID); return pos; } } return "0 0 0"; } } 5. Создаём по пути "/serverfiles/mpmissions/dayzOffline.chernarusplus" на Вашем сервере папку \_CONF\ 6. В папку \_CONF\ помещаем файл "playersSpawnPoints.lst" следующего содержания: 6561198156923007 2698.36 0 5989.59 ПЕТЯ //Тут комментарий Где: 6561198156923007 - Steam ID игрока 2698.36 0 5989.59 - координаты точки возрождения в формате X, Z, Y (долгота, высота , широта), если высота равна нулю, то заспавнит на поверхность земли или ближайшую твёрдую поверхность. ПЕТЯ - имя игрока для Вас (ни на что не влияет), после "//" можете вписать любое пояснение (// противный тип из клана чумазеков) Последующего игрока вписываем аналогично, в следующей строке. Запускаем сервер, убиваем персонажа, наслаждаемся респавном по заданным координатам. -
2 балла
Выбор точек спавна игроков по UID из файла
VIRrusR и ещё один отреагировал на BorizzK за сообщение в теме
Вобщем юзайте класс Так удобнее и проще -
1 балл
Запрет разбора строений без модов
Parliament отреагировал на PJIIOxa за сообщение в теме
Parliament DisableBaseDestructionWithoutMods_scriptsmodded_1.1.rar -
1 баллPJIIOxa Ты невнимателен!!! Ты забыл if (identity.GetPlainId()) { string p_UID = identity.GetPlainId(); if (m_playersSpawnPoints.Contains(p_UID)) { vector p_SpawnPoint = m_playersSpawnPoints.Get(p_UID).ToVector(); Print ("::: init.c ::: PlayerBase CreateCharacter ::: Selected personal spawn point Pos: " + pos.ToString() + " for player: " + identity.GetName() + " with UID: "+ p_UID); } } вот это следом if (p_SpawnPoint) pos = p_SpawnPoint; Я там специально про перезапись pos написал, но в код не добавил, что бы посмотреть на Вашу внимательность или можно сделать так if (identity.GetPlainId()) { string p_UID = identity.GetPlainId(); if (m_playersSpawnPoints.Contains(p_UID)) { pos = m_playersSpawnPoints.Get(p_UID).ToVector(); Print ("::: init.c ::: PlayerBase CreateCharacter ::: Selected personal spawn point Pos: " + pos.ToString() + " for player: " + identity.GetName() + " with UID: "+ p_UID); } }
-
1 баллНу вроде движуха не стоит на месте, общими силами продвигаемся, и вот подошел кульминационный момент, составить базу данных, Кто еще заинтересован, ваши варианты, какая структура базы должна быть, файл какой и так далее?
-
1 баллVIRrusR Смотрим нативный (те дефлотный/штатный) ini.c void main() { //INIT WEATHER BEFORE ECONOMY INIT------------------------ Weather weather = g_Game.GetWeather(); weather.MissionWeather(false); // false = use weather controller from Weather.c weather.GetOvercast().Set( Math.RandomFloatInclusive(0.4, 0.6), 1, 0); weather.GetRain().Set( 0, 0, 1); weather.GetFog().Set( Math.RandomFloatInclusive(0.05, 0.1), 1, 0); //INIT ECONOMY-------------------------------------- Hive ce = CreateHive(); if ( ce ) ce.InitOffline(); //DATE RESET AFTER ECONOMY INIT------------------------- int year, month, day, hour, minute; int reset_month = 9, reset_day = 20; GetGame().GetWorld().GetDate(year, month, day, hour, minute); if ((month == reset_month) && (day < reset_day)) { GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute); } else { if ((month == reset_month + 1) && (day > reset_day)) { GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute); } else { if ((month < reset_month) || (month > reset_month + 1)) { GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute); } } } } class CustomMission: MissionServer { void SetRandomHealth(EntityAI itemEnt) { if ( itemEnt ) { int rndHlt = Math.RandomInt(55,100); itemEnt.SetHealth("","",rndHlt); } } override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName) { Entity playerEnt; playerEnt = GetGame().CreatePlayer(identity, characterName, pos, 0, "NONE");//Creates random player Class.CastTo(m_player, playerEnt); GetGame().SelectPlayer(identity, m_player); return m_player; } override void StartingEquipSetup(PlayerBase player, bool clothesChosen) { EntityAI itemTop; EntityAI itemEnt; ItemBase itemBs; float rand; itemTop = player.FindAttachmentBySlotName("Body"); if ( itemTop ) { itemEnt = itemTop.GetInventory().CreateInInventory("Rag"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(4); SetRandomHealth(itemEnt); itemEnt = itemTop.GetInventory().CreateInInventory("RoadFlare"); SetRandomHealth(itemEnt); rand = Math.RandomFloatInclusive(0.0, 1.0); if ( rand < 0.35 ) itemEnt = player.GetInventory().CreateInInventory("Apple"); else if ( rand > 0.65 ) itemEnt = player.GetInventory().CreateInInventory("Pear"); else itemEnt = player.GetInventory().CreateInInventory("Plum"); SetRandomHealth(itemEnt); } } }; Mission CreateCustomMission(string path) { return new CustomMission(); } Что видим? Опишу в общем А видим в нем класс миссии который определен так class CustomMission: MissionServer далее идет открывающая тело скобка (начало кода класса) { далее код класса те функции которые выполняются в контексте класса миссии сервером и переменные (если надо) класса которые действуют в пределах класса и доступны в любых его функциях переопределенные штатные определены как override void имя функции () или ( входные параметры через запятую) { код выполняющийся при вызове функции } можно добавлять свои определив их например void MyFunction() { int a; a = 22; } Далее закрывающая скобка (конец кода класса) } вот то что внутри {} класса я называю телом класса а что внутри {} функции телом функции так вот Класс можно вытащить в отдельный файл вот так создаем по пути Диск:\Папка сервера\mpmissions\dayzOffline.chernarusplus\_MISSION файл MissionAD.c клпируем весь класс в этот файл в самом init.c этот класс удаляем в начале файла init.c вставляем подключение того файла #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_MISSION\\MissionAD.c" вот сам файл MissionAD.c там только класс перенесенный из init.c class CustomMission: MissionServer { void SetRandomHealth(EntityAI itemEnt) { if ( itemEnt ) { int rndHlt = Math.RandomInt(55,100); itemEnt.SetHealth("","",rndHlt); } } override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName) { Entity playerEnt; playerEnt = GetGame().CreatePlayer(identity, characterName, pos, 0, "NONE");//Creates random player Class.CastTo(m_player, playerEnt); GetGame().SelectPlayer(identity, m_player); return m_player; } override void StartingEquipSetup(PlayerBase player, bool clothesChosen) { EntityAI itemTop; EntityAI itemEnt; ItemBase itemBs; float rand; itemTop = player.FindAttachmentBySlotName("Body"); if ( itemTop ) { itemEnt = itemTop.GetInventory().CreateInInventory("Rag"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(4); SetRandomHealth(itemEnt); itemEnt = itemTop.GetInventory().CreateInInventory("RoadFlare"); SetRandomHealth(itemEnt); rand = Math.RandomFloatInclusive(0.0, 1.0); if ( rand < 0.35 ) itemEnt = player.GetInventory().CreateInInventory("Apple"); else if ( rand > 0.65 ) itemEnt = player.GetInventory().CreateInInventory("Pear"); else itemEnt = player.GetInventory().CreateInInventory("Plum"); SetRandomHealth(itemEnt); } } } А вот новый init.c #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_MISSION\\MissionAD.c" void main() { //INIT WEATHER BEFORE ECONOMY INIT------------------------ Weather weather = g_Game.GetWeather(); weather.MissionWeather(false); // false = use weather controller from Weather.c weather.GetOvercast().Set( Math.RandomFloatInclusive(0.4, 0.6), 1, 0); weather.GetRain().Set( 0, 0, 1); weather.GetFog().Set( Math.RandomFloatInclusive(0.05, 0.1), 1, 0); //INIT ECONOMY-------------------------------------- Hive ce = CreateHive(); if ( ce ) ce.InitOffline(); //DATE RESET AFTER ECONOMY INIT------------------------- int year, month, day, hour, minute; int reset_month = 9, reset_day = 20; GetGame().GetWorld().GetDate(year, month, day, hour, minute); if ((month == reset_month) && (day < reset_day)) { GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute); } else { if ((month == reset_month + 1) && (day > reset_day)) { GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute); } else { if ((month < reset_month) || (month > reset_month + 1)) { GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute); } } } } Mission CreateCustomMission(string path) { return new CustomMission(); } Так понятно??? Как по другому обьяснить я не представляю Добавлю Фигурные скобки { } используюся для тела классов, функций и некоторых массивов Простые скобки ( ) используются в условиях, циклах, определении функций В любом коде кол-во открывающих { и закрывающих фигурных скобок } всегда одинаковое кол-во То же касается и обычных кобок ( ) Ну кроме случая когда Вы используете их в комментариях и диагностических принтах (вовод в лог) - там же Вы можете использовать одну { Потому я их там не использую и для обозначения/выделения чего-то в комментариях и выводе в лог использую квадратные скобки [ ]
-
1 баллVIRrusR Про класс Сделаю чуть позже
-
1 баллНадо. Удобнее подключать отдельным файлом, а в init.c вписывать только #Include. И всё же, если Вас не сильно затруднит, как для игроков входящих в список сделать собственный набор стартового лута? То есть обойти то, что прописано в Init.c.
-
1 баллне совсем понял почему. насчет конфига - ждем, это может быть любопытно. Правда не совсем понимаю логики работы этого без клиентского мода.
-
1 баллДобавлю CreateCharacter уже есть в init.c В теле класса миссии Или класс миссии мог быть вынесен в отдельный файл, тогда ищите ее там Ошибочка Переопределения функции OnInit() в классе миссии по умолчанию нет Надо ее создать в начале тела класса миссии Вот так override void OnInit() { LoadPlayersSpawnPoints(); super.OnInit(); } Если функция эта уже там есть просто вставляете в ее тело LoadPlayersSpawnPoints();
-
1 баллPetrovich , нну Вы блин даёте!.. В ServerDZ.cfg, где ж ещё?! P.S. Ребяты, прежде чем спрашивать, хотя бы просматривайте форум, что ли?
-
1 баллverifySignatures = 2; equalmodrequired = 1; в конфиге сервера + одинаковый список модов на клиенте и сервере игры + в keys сервера находятся bikey от каждого из установленных модов. Результат - успешный вход на сервер.
-
1 баллПолностью рабочий init.c с индивидуальным сетом по GUID , проверен. init.c
-
Рассылка
