TheLinsus

Бот администрации на сервере

Вопрос

Видел такую фичу: на сервере всегда присутствует игрок (бот) с ником Admin например. Т.е. после рестарта он сам заходит и сидит там 24/7

Кто-нибудь знает как такого бота создать?

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


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

7 ответов на этот вопрос

Забронировать это рекламное место


1 вариант Создать бота с именем - админи.

2 вариант Создать бота от безголового клиента с именем админ.

оно надо чтоль?

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


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

1 вариант Создать бота с именем - админи.

2 вариант Создать бота от безголового клиента с именем админ.

оно надо чтоль?

Ну я понимаю, что можно поставить тупо аккаунт на хосте например и чтоб он заходил всегда, но если я хочу накрутить человек 10, то нужно 10 аккаунтов?

И как вообще реализовать подключение безголовника?

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


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

Ну я понимаю, что можно поставить тупо аккаунт на хосте например и чтоб он заходил всегда, но если я хочу накрутить человек 10, то нужно 10 аккаунтов?

И как вообще реализовать подключение безголовника?

1. Что такие HC: https://community.bistudio.com/wiki/Arma_3_Headless_Client (Забей что А3, главное понять).

 

2. Известные ссылки по HC: 

http://epochmod.com/forum/index.php?/topic/6329-working-dayz-epoch-headless-client-for-zed-spawn-and-fsm/

https://github.com/DavidFrendin/epoch-hc

http://epochmod.com/forum/index.php?/topic/41713-beta-new-kind-of-headless-client/

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


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

Видел такую фичу: на сервере всегда присутствует игрок (бот) с ником Admin например. Т.е. после рестарта он сам заходит и сидит там 24/7

Кто-нибудь знает как такого бота создать?

Это не совсем бот админа или сам админ. Это работает HeadlesClient. Его задача принимать на себя выполнение некоторых задач сервера тем облегчая его работу, а не пугать читеров. Видел такое на серверах DE 1000. Но как реализовать понятия не имею хоть и пытался разобраться.

Из всего что понял - добавляют в mission.sqf персонажа за Civil сторону и запускают сервер с каким-то дополнительным параметром. Очень хотелось бы увидеть гайд по установке сего чуда на данном форуме.

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


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

HC можно использовать и при разработке скриптов/сборке сервера чтобы самому не перезаходить по 300 раз)

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


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

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

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

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

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


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

Войти

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


Войти сейчас

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

    • Автор: BorizzK
      Все вопросы на этот счет сюда
      Все решения, если есть, то же можно сюда
      Начало обсуждения тут
       
       
    • Автор: 123new
      В данной теме я распишу мой вариант установки сейвзоны, работающий на момент публикации статьи на версии сервера игры 1.0.150000.
       
      Установка
      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_LOACTION' - координаты точки центра сейвзоны.
      'SAFEZONE_RADIUS' - радиус от указанного центра севзоны, на котором действует защита
      'ENTRY_MESSAGE' - сообщение о входе в зону (не рекоммендуется указывать русский язык, может не отображаться)
      'EXIT_MESSAGE' - сообщение о выходе из зоны (не рекоммендуется указывать русский язык, может не отображаться)
      5. Распаковываем в папку с сервером в корень вот этот архив:
      6. В параметры запуска сервера добавляем:
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      -mod=ModdedScripts -FilePatching 7. Запускаем сервер и проверяем.
       
      Для совсем ленивых готовая миссия сервера с настроенной сейвзоной. 
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
        Пункты 5-7 из инструкции выше после этого необходимо повторить, иначе годмод работать не будет!!!  
      P.S. Если у вас в корне сервера лежала папка scripts и она читалась сервером, после этого она может перестать считываться!
      P.P.S. Да, да, за основу взята сборка от DaOne, и по тому же принципу сделана и safe-zone с незначительными изменениями. За что ему огромное спасибо. Более корректной реализации метода God-Mode не встречал.
    • Автор: 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
      //AUTHOR: BORIZZ.K //Version 20.12.2018.0011 void PlaceAllCarsToGround() { array<Object> nearest_objects = new array<Object>; array<CargoBase> proxy_cargos = new array<CargoBase>; Object object; string className; int objectcount = 0; vector mapcenter = "7500 0 7500"; int radius = 20000; vector foundcar_pos; mapcenter[1] = GetGame().SurfaceY( mapcenter[0], mapcenter[2] ); GetGame().GetObjectsAtPosition(mapcenter, radius, nearest_objects, proxy_cargos); for ( int i = 0; i < nearest_objects.Count(); i++ ) { object = nearest_objects.Get(i); className = object.GetType(); if ( GetGame().IsKindOf(className, "Car" ) ) //if ( className == "OffroadHatchback" || className == "V3SVehicle" || className == "V3SChassis" || className == "CivilianSedan") { EntityAI objectEnt = EntityAI.Cast(object); if (objectEnt) { foundcar_pos = objectEnt.GetPosition(); Print("::: PlaceAllCarsToGround() ::: Found car: " + className + ", objectEnt: " + objectEnt + ", Position: " + foundcar_pos.ToString() + ", SurfaceGetNormal: " + GetGame().SurfaceGetNormal(foundcar_pos[0], foundcar_pos[2]).ToString()); //Check surface under car /* string surface_type; int liquidType; GetGame().SurfaceUnderObject(object, surface_type, liquidType); Print("::: PlaceAllCarsToGround() ::: Found car: " + className + ", objectEnt: " + objectEnt + ", surface_type: " + surface_type + ", liquidType: " + liquidType); */ if ( foundcar_pos[1] < (GetGame().SurfaceY(foundcar_pos[0], foundcar_pos[2])) - 0.1 || foundcar_pos[1] > (GetGame().SurfaceY(foundcar_pos[0], foundcar_pos[2])) + 0.1 ) { foundcar_pos[1] = GetGame().SurfaceY(foundcar_pos[0], foundcar_pos[2]); objectEnt.SetPosition(foundcar_pos); objectEnt.SetOrientation(objectEnt .GetOrientation()); objectEnt.SetDirection(objectEnt .GetDirection()); Print("::: PlaceAllCarsToGround() ::: Position changed for car : " + className + ", objectEnt: " + objectEnt + ", Position: " + foundcar_pos.ToString()); } else { Print("::: PlaceAllCarsToGround() ::: No position change required for car : " + className + ", objectEnt: " + objectEnt); } } } } } Добавить код в init.c (ВНЕ КЛАССА)
      Вызывать в конце функции main()
      Просто вставив в конце
      PlaceAllCarsToGround();
       
      P.S. Поправил код, + учел рекомендации Ультимы
      У меня на сервере с машинами все ок
       
    • Автор: 123new
      В данной теме я распишу мой вариант установки сейвзоны, работающий на момент публикации статьи на версии сервера игры 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_LOACTION' - координаты точки центра сейвзоны.
      'SAFEZONE_RADIUS' - радиус от указанного центра севзоны, на котором действует защита
      'ENTRY_MESSAGE' - сообщение о входе в зону (не рекоммендуется указывать русский язык, может не отображаться)
      'EXIT_MESSAGE' - сообщение о выходе из зоны (не рекоммендуется указывать русский язык, может не отображаться)
      5. Распаковываем в папку с сервером в корень вот этот архив:
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      6. В параметры запуска сервера добавляем:
      -mod=ModdedScripts 7. Запускаем сервер и проверяем.
       
      Для совсем ленивых готовая миссия сервера с настроенной сейвзоной. 
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
        Пункты 5-7 из инструкции выше после этого необходимо повторить, иначе годмод работать не будет!!!  
      P.S. Если у вас в корне сервера лежала папка scripts и она читалась сервером, после этого она может перестать считываться!
      P.P.S. Да, да, за основу взята сборка от DaOne, и по тому же принципу сделана и safe-zone с незначительными изменениями. За что ему огромное спасибо. Более корректной реализации метода God-Mode не встречал.