LINUX.ORG.RU

Предсказуемость математики и луа

 ,


1

1
function hashStr (nome)
	hours, minutes = GetGameTime()
	count1=hours* 3,1415926535
	count2=minutes* 3,1415926535
	count3=count1*count2
	count3=string.sub(count3, 1, 3)
	count3=string.format("%03d",count3)
	hNik=string.byte(nome,1)
	hNik2=string.byte(nome,2)
	hNome=hNik*hNik2
	hNome=string.sub(hNome, 1, 3)
	hNome=string.format("%03d",hNome)
	r1=string.sub(count3, 1, 1)
	r2=string.sub(hNome, 1, 1)
	r3=string.sub(count3, 2, 2)
	r4=string.sub(hNome, 2, 2)
	r5=string.sub(count3, 3, 3)
	r6=string.sub(hNome, 3, 3)
	r=r1 .. r2 .. r3 .. r4 .. r5 .. r6
	return r
end

hours, minutes = GetGameTime() получает текущие час и минуту в формате: 01 22

Скармливаем слово на одном компе - получаем предсказуемо одинаковый результат. Скармливаем на другом компе получаем тоже предсказуемо одинаковый результат, но не такой, как на предыдущем компе. Это как вообще? Данные одинаковые. Ник один и тот же. Время одно и то же. Результат всегда разный. Это вообще законно?! Время возвращается серверное - одинаковое и там и там.

Перемещено Dimez из general

★★★★★

Последнее исправление: hobbit (всего исправлений: 2)

Ответ на: комментарий от Shushundr

Я проверял. Время берется не клиентское, а серверное. Одинаковое для всех. От сервера! Я тестировал даже - выводил время и там и там - идентично. Результат разный.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Время берется не клиентское, а серверное. Одинаковое для всех. От сервера!

Не хотелось бы тебя расстраивать, но время не стоит на месте. Или у тебя там мок, который все время одно и то же значение возвращает?

Nervous ★★★★★
()
Ответ на: комментарий от usi_svobodi

[51:42]130200 <— вот это я получил так: hsh=hashStr(«Калюта») print (hsh)

[51:42][G] [Калюта]: 939200 ВОЖДЬ, можно сделать: 946 [Серебряный Рассвет]

А это получилось у клиента автоматически. Ник все видят. Время то же. Результат радикально разный. Кроме ника.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от Nervous

Время я беру не шибко частою. Принимается час и минута. Они меняются внезапно раз в минуту. Этого достаточно чтобы мгновенно сравнить результат. Но результат разный. Я выше скинул пример.

Заметь, оба результата выведены в одну секунду. Результат разный. Ник один и тот же. Минуты одни и те же, часы одни и те же.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от Nervous
[56:59]Вы шепчете [Калюта]: напиши: /run i, j = GetGameTime(); print (i); print (j)
[57:03]Вы шепчете [Калюта]: и скинь мне результат
[57:08]Аудит выходит из игрового мира.
[57:10]22 <<<
[57:10]57 <<< тут скрипт выполнял я
[57:25][Luviss] заслужила достижение [20-й уровень]!
[57:25][Luviss] заслужила достижение [50 заданий]!
[57:26][Задру] входит в игровой мир.
[57:34]Siriussqq выходит из игрового мира.
[58:05][W:From] [Калюта]: 22 57
LightDiver ★★★★★
() автор топика
Ответ на: комментарий от Nervous

Нет, не отличается. На одной машине всегда работает «типа правильно». То есть у меня он будет выдавать как надо. У него как надо. А вот его и мой результаты не совпадают. Ну бред же?

LightDiver ★★★★★
() автор топика

count3=count1*count2

count3=string.sub

Я в этих ваших луах не силён, но это выглядит подозрительно. То ли строки перемножаем, то ли подстроку от числа берем.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)

Фига ты быстрый, вчера с 1 скриптом игрался, а теперь уже скрипты для source пишешь, похвально ::)

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

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)

nome - Ты уверен что эта переменная всегда содержит одну и ту-же кодировку?

GetGameTime() - Как берется это время, оно учитывает локальную таймзону на стороне клиента?

А логи добавлять пробовал? Убедись что на время не влияет таймзона, также проверь побайтово что текстовое представление всегда в одной и той-же кодировке. Если не поможет добавь лог изменений переменных после каждой строчки, реально будет быстрее найти причину вместо гадания на форуме.

V1KT0P ★★
()
Ответ на: комментарий от Nervous
function hashStr (nome)
	hours, minutes = GetGameTime() --получаем час и минуты
	count1=hours* 3,1415926535     --умножаем часы на Пи
	count2=minutes* 3,1415926535   --умножаем минуты на Пи
	count3=count1*count2           --умножаем минуты на часы
	count3=string.sub(count3, 1, 3)--берем первые три цифры результата
	count3=string.format("%03d",count3) --переводим результат в формат 3 цифр
	hNik=string.byte(nome,1)       --берем код первой буквы ника
	hNik2=string.byte(nome,2)      --берем код второй буквы ника
	hNome=hNik*hNik2               -- умножаем коды друг на друга
	hNome=string.sub(hNome, 1, 3)  --берем первые три цифры результата
	hNome=string.format("%03d",hNome) ---переводим в формат трех цифр
	r1=string.sub(count3, 1, 1) ---дальше складываем строки
	r2=string.sub(hNome, 1, 1)
	r3=string.sub(count3, 2, 2)
	r4=string.sub(hNome, 2, 2)
	r5=string.sub(count3, 3, 3)
	r6=string.sub(hNome, 3, 3)
	r=r1 .. r2 .. r3 .. r4 .. r5 .. r6
	return r
end
LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Я последние две недели пилю глобальный аддон.. Тяжко. Очень тяжко.

https://github.com/Vladgobelen/GuildChat/blob/main/developer.lua

Вот серверная часть.

https://github.com/Vladgobelen/NSQuestClient/blob/main/achiv.lua

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

Тут дебаг только принтами и доступен. Тыкаю, принтую.. Фигня выходит.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от V1KT0P

Очень старый сервер игровой, который о кодировках даже не подозревает. А потому всегда выдает одно и то же.

Время беру специально серверное, а не клиентское - оно тоже всегда одно для всех.

И да - все данные я получаю автоматически от сервера. Не вбиваю вручную. Потому проблемы с кодировками не могут быть в принципе.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Где там разделитель? Я их вообще вроде не использую. Ты о чем?

Ой, дошло кажись.

Но это не влияло бы на результат. Ошибка то одинаковая и тут и там. Я скопировал функцию.

Я почему эту дичь то ввел - сначала результат был очень уж предсказуемый и одинаковый. Решил добавить рандома.. Добавил.

У меня задача - защитить строку от подделки. Чтобы с одной стороны игрок не мог ее подделать, а с другой чтобы я мог всегда проверить уникальный ключ.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 3)
Ответ на: комментарий от LightDiver

Результат на разных компах разный, значит на них могут быть разные версии верно? Еще может какие системные настройки подхватываются и влияют. Типа парсинга строки в float/double может зависить от системных настроек разделитель точка или запятая.

V1KT0P ★★
()
Ответ на: комментарий от LINUX-ORG-RU

Ты своим скриптом меня к жизни буквально вернул. Я 18 лет имел фобию на программирование. А тут как прорвало. Как же это я раньше луа то упускал. Он прекрасен.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от V1KT0P

Результат выдают не компы игрока. Результат выдает им сервер. Насколько я это понимаю. На компе игрока вообще луа нет практически всегда.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от V1KT0P

Вообще, нужен шестизначный код, из ника игрока и какой то иной составляющей, меняющейся все время. Чтобы игрок не мог его подобрать с одной стороны, а с другой скрипт всегда знал как его сгенерировать. Принимаю более удачные идеи для реализации. Может можно проще как то.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Вообще, нужен шестизначный код, из ника игрока и какой то иной составляющей, меняющейся все время.

Составь строку из «ник» + «время» + «секретная соль» и возьми от этого крипто хеш. А затем каким либо удобным способом уреж длину.

V1KT0P ★★
()
Ответ на: комментарий от CrX

Ник там - 2, 4, и 6 цифры. Как раз таки с ними всегда все идентично. Разные цифры именно времени. НО! Время то одинаковое! Я раз 20 уже перепроверил это - ну одинаковое оно!

Проверю пока результат с точкой вместо запятой. Врядли оно как то влияет, но..вдруг.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

у меня лютые проблемы со сравнением строк:

if string.find (message, "Вождь, сдать") and nachalo~="*" then
    print ("1")

Делаю что то подобное, или не пашет или попадает еще под 100500 приблизительно подобных результатов. Как правильно вытянуть из сообщения конкретную нужную команду?

Например есть у меня сейчас вот такая строка:

[36:47][G] [Калюта]: *030200 ага: 964 [Полетели?]

И вот так вот она не ловится:

if string.find (message, sender) and string.find(message, "ага") then

И так не ловится:

if string.find (message, sender) and string.find(message, "ага:") then

sender тут ник, он точно совпадает. Хэш тоже рабочий, на него проверка дальше в следущем ифе. А вот остальное как правильно выловить?

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

Если не хочешь городить огород, то можно обойтись regexp-ом, в lua он правда урезанный очень и экранированние свое, но его для простых случаев достаточно. Вроде есть даже библиотеки с полной поддержкой regexp-а. Вот только string.lower() для не ASCII не работает и в урезанном regexp-е нет case-insensitive сравнения.

a, b, c = string.match("Вождь, взять квест", "(Вождь), (.+) (.+)")
print("a1:", a)
print("b1:", b)
print("c1:", c)

a, b, c = string.match("Вождь, продать предмет", "(Вождь), (.+) (.+)")
print("")
print("a2:", a)
print("b2:", b)
print("c2:", c)

a, b, c = string.match("Админ, дай валюту", "(Вождь), (.+) (.+)")
print("")
print("a3:", a)
print("b3:", b)
print("c3:", c)

message = "[36:47][G] [Калюта]: *030200 ага: 964 [Полетели?]"
sender = "Калюта"
a, b = string.match(message, "%[(" .. sender .. ")%]: %*[0-9]* (ага):")
print("")
print("a4:", a)
print("b4:", b)

message = "[36:47][G] [Калюта]: *030200 угу: 964 [Полетели?]"
sender = "Калюта"
a, b = string.match(message, "%[(" .. sender .. ")%]: %*[0-9]* (ага):")
print("")
print("a5:", a)
print("b5:", b)
a1:	Вождь
b1:	взять
c1:	квест

a2:	Вождь
b2:	продать
c2:	предмет

a3:	nil
b3:	nil
c3:	nil

a4:	Калюта
b4:	ага

a5:	nil
b5:	nil
V1KT0P ★★
()
Ответ на: комментарий от LightDiver

Ну первое find по умолчанию использует для поиска шаблоны, если ты просто хочешь найти кусок текста как в сишном strstr то ты пишешь так

  • string.find(message, "Вождь, сдать",1,true)
  • 1 это начало поиска
  • true это просто искать текст без шаблонов

или так

message:find("Вождь, сдать",1,true)

Далее find возвращает всегда 2 параметра позицию начала того что нашло и позицию конца того что нашло.

local nachanlo, konets = message:find("Вождь, сдать",1,true) но это так, к слову.

Далее, можно чисто для себя сделать поудобнее типа

function string:strfind(text)
   return self:find(text,1,true)
end

local message = "я маленькая лошадка и [мне?] живётся не сладко";
local submsg  = "[мне?]"

-- идёт поиск по шаблону скобки и вопросительный знак это как шаблоны а не текст
local a,b = message:find(submsg);
-- идёт поиск просто по тексту
local c,d = string.find(message,submsg,1,true);
-- идёт поиск просто по тексту
local e,f = message:strfind(submsg);

print(a,b)
print(c,d)
print(e,f)

print(message:sub(a,b));
print(message:sub(c,d));
print(message:sub(e,f));

dron@gnu:~$ lua rrr.lua 
4	4
41	49
41	49
�
[мне?]
[мне?]
dron@gnu:~$

https://uopilot.tati.pro/index.php?title=String.find_(Lua)

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от V1KT0P

Вашу ж мать, а так можно было? Я сначала разделяю строку функцией и помещаю в массив. С массивом работаю:

SendChatMessage(hsh .. " 001 " .. sender ", покажи мне ачивку " .. ach .. " " .. GetAchievementLink(ach), "guild", nil, 1)

Вот такая команда формирует строку: "575975 001 Ник, покажи мне ачивку 975 (линк на ачивку).

function mysplit (inputstr, sep)
        if sep == nil then
                sep = "%s"
        end
        local t={}
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                table.insert(t, str)
        end
        return t
end

msg=mysplit(msg) и дальше уже, например, msg[1]==575975

Спасибо, сейчас попробую нормально.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от V1KT0P

Ты затронул самую мерзопакостную отвратительную вещь что есть в lua лучше про шаблоны вообще ничего не знать, это адъ это боль, это жопа, это смерть, этого не должно существовать. Там накосячить проще простого. Оно только для обработки документов хорошо в смысле простых документов типа отчёты и прочее где всё специально под такой разбор отформатировано. Шаблоны ИМХО позорное пятно на lua лучше бы их вообще не было. УЖАС но для простых случае норм конечно

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Я до твоего скрипта луа в глаза не видел, сейчас ковыряюсь через поиск интуитивно. Ищу по смыслу что лучше подходит. Иногда нихрена не понятно, но жутко интересно. Да и последние 18 лет кроме баша ничего не юзал. Открыл как работают функции неделю назад…

https://github.com/Vladgobelen/GuildChat/blob/main/quests/quests.lua

В игре для гильдии теперь пытаюсь автоматизировать систему РПшную… Выполнение заданий, получение опыта, квесты.. Правда кое в каких местах получается мини-МУД каой то расшияремый. Интересно чем это закончится.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 3)
Ответ на: комментарий от LINUX-ORG-RU

Ах да, а кроме вима есть что приличнее для луа, чтобы и синтаксис подсвечивало и главное - о глупых ошибках предупреждало?

Нашел тут зеро брейн студио типа чисто для луа - так эта гадость даже хуже kwrite.. Но вот банальности никто не показывает. Типа не закрытого end или если у меня в if = вместо ==. Или если then отсутствует или их наоборот два. Вроде очевидные ошибки и должно подсвечиваться.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LightDiver

Ничего кроме gvim не использую. Никаких помогалок, подсвечивалок и прочего, подсветка синтаксиса из коробки, мне как-то больше ничего не надо. Сначала эти косяки тебя бьют по рукам ошибками запуска и как пса отучивают гадить мимо лотка, потом ты уже сам стараешься не допускать пропущенных штучек, а в случае логических проблем обращать на них внимание =) Да и не пишу я большой код, где все эти штуки реально нужны :3

Ну если тебя не воротит от редакторов браузеров то всякие атомы/вскоды и проче хипсерские штучки наверняка имеют на борту всё что ты хочешь, но лично мне хватает даже банального gedit, но это мне, на меня не гляди :D

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Ну, мне пока nvim нравится. Однако, там плохо - прокрутка экрана смещает курсор и потом возвращаться хреново на нужное место. А самоконтроль оно конечно хорошо, но не тогда, когда у тебя где то в 100+ строках кода глупый косяк и тебе нужно все перечитать построчно, чтобы его найти. Мне вон один файл пришлось с нуля переписать к хренам. Помогло комментирование и проговаривание каждой строки, включая объявление переменных.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Ну ищи плагины для lua для nvim так как он сам наполовину на lua и написан считай :D Там всё должно быть. Просто надо поискать.

К слову раз ты про игрушки, сразу бери love2d на вооружение. У меня вон на ПК звук сломался я не долго думая запилил себе на lua+love2d передачу звука с ПК на мобилку https://www.youtube.com/watch?v=EUAXxl8DmMI там конечно надо всё переписать, но да ладно ну там с Love свои конечно приколы, но всё равно норм. Хотя я и сам то не скажу что прям хорошо lua знаю, так. Тут тык, там тык, тут подгуглил, там почитал хехе

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 3)