RedLink

Система логирования по типу InfiSTAR

4 сообщения в этой теме

Всем Привет.

Представляю вам систему логирования действий игроков и т.д. по принципу InfiSTAR.

Для установки вам понадобятся кастомный compiles.sqf (тем кто не знает как это сделать, -> поиск по форуму).

 

1. Открываем в серверной части файл dayz_server\init\server_functions.sqf и в самом низу вставляем:

"SK_log" addPublicVariableEventHandler {(_this select 1) call fnc_Log;};

2. Теперь открываем в папке с миссией файл compiles.sqf и ищем что-то в этом плане:
 

if (!isDedicated) then {
	блаблабла
};

и после него вставляем

	fnc_log = {
	private ["_fileName","_message","_dll","_dll2","_display"];

	_fileName = toLower (_this select 0);
	_message = _this select 1;
	_display = if (count _this > 2) then {_this select 2} else {false};

	if (!isDedicated) then {
		SK_Log = [_fileName,if (typeName _message == "ARRAY") then {_message} else {toArray _message},_display];
		publicVariableServer "SK_Log";
	} else {
		_message = if (typeName _message == "ARRAY") then {toString _message} else {_message};
		if (_display) then {diag_log format ["[%1] %2",toUpper (_fileName),_message];};

		_dll2 = format["!InfiSTAR_Logs~%1~%2",_fileName,_message];
		"LogDLL" callExtension _dll2;
		};
	};

где "!InfiSTAR_Logs" - ваша папка, куда вы хотите складировать логи.

 

3. Открываем файл publicVariable.txt в фильтрах Battleye и в первой строке "5 !=блаблабла" в конце добавляем "!=SK_Log" (пример ниже)

5 !"donn_heli_monitor" !"fnc_log" !=fnc_log !"redHunter" !=redHunter !"cad_pvar_s" !"PVDZE_veh_Update" !="PVDZE_veh_Update" !="PVDZE_adminevents" !="PVDZ_plr_Death" !"PVDZ_plr_Death" !="PVDZE_atp" !"PVDZE_atp" !"PVDZ_plr_LoginRecord" !="PVDZ_plr_LoginRecord" !"PVDZE_log_lockUnlock" !=PVDZE_log_lockUnlock !"redHunter" !=redHunter !"redDiagLog" !=redDiagLog !="PVDZE_atp" !=(remExField|remExFP) !=(PVCDZ_obj_GutBody|drn_AskServerDynamicWeatherEventArgs|BIS_effects_gepv|achievement|dayzFlies) !=PVDZ_(drg_(RaDrag|RaLW|RLact)|getTickTime|hlt_Bleed|obj_(Delete|Publish|RoadFlare|Destroy|Fire)|veh_Save|veh_SF) !=PVDZ_(plr_(Death|Login[12]|LoginRecord|Save|SwitchMove)|Server(_Simulation|StoreVar)|sec_atp) !=PVDZ_(playerMedicalSync|object_replace|groupInvite) !=PVDZ_(send(|Unconscious)) !=PVDZ_Server_(buildLock|LogIt|UpdateGroup) !=PVDZ_Server_process(Code|SetAccessCode) !=PVDZ_objgather_(Delete|Knockdown) !=PVDZE_(obj_(Delete|Publish|Swap|Trade)|fullobj_Publish|maintainArea|veh_(Lock|Publish2|Upgrade)|handleSafeGear|plr_(DeathB|FriendRQ|TradeMenu)) !=PVAH_AdminReq !=PVAH_WriteLogReq !=PVAHR_0_[a-zA-Z0-9]{20,40} !"PVAHR_" !="PVAH_AdminReq" !="PVAH_WriteLogReq" !=PVAHR_0_[a-zA-Z0-9]{20,40} !="PVDZE_(query|store|spawn)Vehicle" !="PVDZE_PingSend" !="PVDZE_veh_Init" !"SK_Log" !=SK_Log

 

4. А теперь самое главное.

Пример вывода лога в отдельный файл. Возьмем для примера файл смерти игрока от тех или иных причин.

Открываем в серверной части файл server_playerDied.sqf и ищем там строку
 

diag_log format["%1 (%2) %3 @%4 %5",_playerName,_playerID,_message,mapGridPosition _pos,_pos];

после нее вставляем

["DEATHS",format ["%1 (%2) %3 @%4 %5",_playerName,_playerID,_message,mapGridPosition _pos,_pos],true] call fnc_log;

Таким образом в указанной в папке в п. 2 создатся файл deaths_блаблабла.txt, в котором будет отображен лог о смерти игрока по тем или иным причинам.

 

Формат записи лога выглядит следующим образом:

_message = format ["Что хочу то и пишу и хочу видеть значение %1",_значение%1];
["ИМЯ_ФАЙЛА_ЛОГА",_message,true] call fnc_log;

или напрямую

["Имя_файла_лога",format ["тут будет то что в значении %1",_значение%1],true] call fnc_log;

 

Представляю варианты 4-х DLL, которые работают для этой системы (качаете любую из них и переименовываете в LogDLL.dll). Эту DLL необходимо закинуть в папку с игрой (например в C:\Games\Arma 2 Operation Arrowhead).

LogDLL.dll создает в папке с логами отдельную папку по названию лога.

LogDLL_-_dd-MM-yyyy и иные ее интерпретации - создает в папке с логами отдельную папку с датой, в которой хранятся все логи за эту дату.

 

Если есть вопросы, задавайте.

 

Оригинал данного скрипта и ссылки на разработчика ниже.

Копирайта

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

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

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


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


Если кому интересно, могу добавить вариант, чтобы логи инфистара также логировались в папку с общими логами.

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


Ссылка на сообщение
Поделиться на других сайтах
7 часов назад, RedLink сказал:

Если кому интересно, могу добавить вариант, чтобы логи инфистара также логировались в папку с общими логами.

Да, интересно

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


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

открываем ah.sqf и ищем

fn_custom_log = FN_CALL_LOG_DLL;

и заменяем на

fn_custom_log = fnc_log;

 

при запуске сервера в логах будет одна ошибка связанная с этой переменной. не обращаем внимание, т.к. это из-за того, что инфистар грузится раньше чем файл, в котором прописана эта переменная. При вторичном запросе переменная отрабатывается и все логи пишутся нормально.

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


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

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

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

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

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


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

Войти

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


Войти сейчас

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

    • Автор: NoNameUltima
      Автор:
      Я. Описание:
      Система уведомлений, создающая всплывающие окошки.(см. видео ниже) Цена:
      500р. Конфигурация:
      Путь к иконке уведомлений. Размер иконки. Позиция вывода уведомлений по оси X. Позиция вывода уведомлений по оси Y. Ширина окошек уведомлений. Видео:
       
    • Автор: RedLink
       
      Всем привет.
      Возник один вопрос, который пока не могу догнать как решить.
      Суть следующая. В последней версии Инфистара есть код, который выводит логи в отдельную папку
      Путем нехитрых манипуляций добавляем ему вывод лог в отдельную папку с датой (ибо надоел тот кошмар, что там за 5 дней скапливается)
      А вот теперь сам вопрос.
      Если переменная dayz_ForcefullmoonNights = true;
      то создается папка с датой, которая указана в server_monitor.sqf - т.е. 2012,8,2 - что в принципе логично.
      А вот если dayz_ForcefullmoonNights = false; - то создается папка с датой, которая указана в mission.sqf (в моем случае это 2008,10,1. Хотя по логике должна присваиваться реальная дата, которая берется из того-же server_monitor при проверке на dayz_ForcefullmoonNights, т.к. в логе сервера мы видим, что TIME SYNC текущая дата сервера.
      Почему так происходит и как это можно поправить?
    • Автор: BorizzK
      Автор: Виталий Мизев
       
      Для начала в папке профиля сервера которая указана в параметре запуска сервера -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; } } } Вот как-то так
       
      На основе этого можно построить свою более развитую систему, например загружая координаты для кастомного спавн лута,  расстановки зданий и тп
       
       
    • Автор: DOK43
      где найти перевод админки INFISTAR v1442 ? или уже готовый файл, помогите
    • Автор: SPIRT
      Поделюсь еще одним рецептом )))))
      Имеем сервер Арма3 который запускаем для себя любимого и для друга, системник, кабель интернета и роутер или модем кому как нравится, так в чем проблема спросите, а вот в чем, если кабель инета подключен напрямую в системник то сервер виден в сетевой игре, а вот если подключаем интернет через модем то наш сервер пропадает из видимости. Бросаемся открывать порты, смотреть что не так, кароч глаза на лоб. Я тоже через все это прошел. Решилась проблема незатейливо включением на роутере функции DMZ или функции демилитаризованная зона. Расскажу на примере собственного роутера  ASUS. Собственно к делу :  Открываем в брузере настройки роутера, далее в левом меню нам нужна вкладка "Локальная сеть" 
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

      в открывшемся меню жмем на вкладку "DHCP сервер" в низу видим ----- "Список присвоенных вручную IP-адресов в обход DHCP (Максимум : 64)" ------ там еть пустое поле 
      MAC-адрес со стрелочкой, жмем на стрелку вылезает имя нашего компьтера и ip адрес  --- жмем "добавить"  на "+" с правой стороны ,в итоге получаем мак адрес нашей сетевой карты и присвоенный ip, жмем применить. 
      Идем далее ---  в левом меню выбираю вкладку интернет , в верхнем баре появляются разделы ..... ...... ..... "DMZ" Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      жмем на нее  вылезает вкладка на ней 2 поля "Включить DMZ" и "IP-адрес выделенной станции", в первом жмем включить, во втором клацаем в пустое поле появляется IP адрес, или вбиваем в ручную тот который выпал рядом с мак адресом сетевой карты  ---- жмем применить . Обязательно перезагружаем модем.
       Далее запускаем свой сервак Арма и радуемся.
      Кому помогло + в репу.