Напишу как я решал проблему с тем, что команды корректно не работали, если логин не уникальный. Дело в том, что львиная доля игроков была с ником sirvivor. Возможно уже можно другим способом решить, а я делал так. Из обработчиков чата айдишник не вытащить, но вот в логах сервера есть и айди и команда , которую ввел игрок. Напрямую из скрипта админки не получалось читать лог т.к. он занят записью, а вот с его копии ..... На питоне пишется простенький скрипт, который следит за логом, если он обнаружил команду, тогда ее записывает в файлик, который в свою очередь читает уже скрипт админки. Вообщем все работало и не крашилось. ВОзможно криво, скорей всего никому не нужно, просто проблема в теме осталась не решенной, устранить надо. Код питоновского скрипта.
import shutil
import time
def print_hi(name):
# Use a breakpoint in the code line below to debug your script.
count = 0
while True:
#print('asdadad')
try:
doc_file = open("D:\@0101_Server_Dayz_v2.0\ServerProfiles\DayZServer_x64.ADM", "r")
except OSError:
print("Could not open/read file:")
time.sleep(10)
continue
with doc_file as fp:
lines = fp.readlines()
# Если номер последней выведенной строки
# больше числа строк открытого файла, то это новый файл и возвращаем счетчик
if count > len(lines) + 1:
count = 0
f = open("D:\@0101_Server_Dayz_v2.0\ServerProfiles\DayZServer_x64.ADM2", "w")
f.close()
# если добавились строки то читаем строку
while count < len(lines):
try:
messageServer = lines[count]
print(messageServer)
if len(messageServer) > 0 and messageServer != '\n':
index = messageServer.find("| Chat")
# Если строка от сервера с
if index > 0:
print(messageServer)
try:
f = open("D:\@0101_Server_Dayz_v2.0\ServerProfiles\DayZServer_x64.ADM2", "a")
f.write(messageServer)
except OSError:
print("Could not open/read file:")
time.sleep(10)
continue
f.close()
else:
count = count + 1
continue
count = count + 1
except Exception as e:
print(e)
count = count + 1
doc_file.close()
time.sleep(1)
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
print('start')
print_hi('PyCharm')
input()
Ну и кусок кода из скрипта админки в качестве ориентира.
void OnAdminChatRequest()
{
ref TStringArray m_ListArray;
string file_log = "$profile:\\DayZServer_x64.ADM2"
m_ListArray = LoadFile(file_log);
for (int n = strokaLogaOldRead; n < m_ListArray.Count(); n++ )
{
strokaLogaOldRead = strokaLogaOldRead+ 1;
//Print("::: [PersistentDoors] ::: Load path village: " + m_AdminsListArray.Get(i));
Print(m_ListArray.Get(n));
string strChat = m_ListArray.Get(n);
int ss = strChat.IndexOfFrom( 0, "(id=" );
string uidLog = strChat.Substring(ss+4, 44);
string commandText = strChat.Substring(ss+52, strChat.Length()-(ss+52));
Print("Введена команда "+ commandText);
int ss1 = strChat.IndexOfFrom( 0, "Chat(" );
string login = strChat.Substring(ss1+6, ss - (ss1+7));
Суть ведь ясна? Когда что-то вводится в чат, то срабатывает скрипт админки, который читает копию файла лога ну и к примеру выдавал игроку оружие. Этим же макаром был реализован глобальный чат ну и еще много чего))