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)
Ответ на: комментарий от LINUX-ORG-RU

Смотри:

function Grid:OnEnable() end

Вот это не крашит. Даже если таблицу не объявить. А кнопки крашат без таблицы. Не понимать.. Книгу я обязательно прочитаю.

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

Охренеть. Шикарнейшая конструкция. Работает, да. Меня просто сбило, что грид работал, а это не работало. Тепеь я не понимаю почему работает грид без таблицы, но конструкцию запомнил. Это же насколько все упрощает.

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

Лучше не называть переменную (аргумент) table — это перекрывает глобальную переменную table, в которой лежат библиотечные функции для работы с таблицами, и может ввести сумятицу в разум новичков и мимокрокодилов.

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

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

https://pastebin.com/WRuNNzpv

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

Смотри какой кусок говна я тут накидал (спойлер: это не рабоатет)

function alfabet (bookv)
shablon="абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
	myB=string.find(shablon,bookv)
	return myB
end

function hashStr (nome)
	local i = time()
	i = i % 1000
	nome1=string.sub(nome, 1, 1)
	nome2=string.sub(nome, 2, 2)
	nome1=alfabet(nome1)
	nome2=alfabet(nome2)
	hNome=nome1 .. nome2
	hNome=string.sub(hNome, 1, 3)
	hNome=string.format("%03d",hNome)
	r1=string.sub(i, 1, 1)
	r2=string.sub(hNome, 1, 1)
	r3=string.sub(i, 2, 2)
	r4=string.sub(hNome, 2, 2)
	r5=string.sub(i, 3, 3)
	r6=string.sub(hNome, 3, 3)
	r=r1 .. r2 .. r3 .. r4 .. r5 .. r6
	return r
end
local myNome = GetUnitName("player")
hsh=hashStr(myNome)

nachaloStr = string.sub(message, 1, 1)
testN=string.sub(message, 5, 5)
if nachaloStr=="#" and testN~="" then
	nachaloHsh = string.sub(message, 2, 7)
	hshStraniero1=string.sub(nachaloHsh,1,1)
	hshStraniero2=string.sub(nachaloHsh,3,3)
	hshStraniero3=string.sub(nachaloHsh,5,5)
	hshStraniero=hshStraniero1 .. hshStraniero2 .. hshStraniero3
	hsh1=string.sub(hsh,1,1)
	hsh2=string.sub(hsh,3,3)
	hsh3=string.sub(hsh,5,5)
	hsh4=hsh1 .. hsh2 .. hsh3
	hshC=math.abs(hsh4-hshStraniero)
	if hshC<10 then
		hshNome1=string.sub(nachaloHsh,2,2)
		hshNome2=string.sub(nachaloHsh,4,4)
		hshNome3=string.sub(nachaloHsh,6,6)
		hshNome=hshNome1 .. hshNome2 .. hshNome3
		hshNome=string.format("%03d",hshNome)
		hshMyNome1=string.sub(hsh,2,2)
		hshMyNome2=string.sub(hsh,4,4)
		hshMyNome3=string.sub(hsh,6,6)
		hshMyNome=hshMyNome1 .. hshMyNome2 .. hshMyNome3
		hshMyNome=string.format("%03d",hshMyNome)
		if hshMyNome==hshNome then
			hshCMD="maodzedun"
		end
	else
		hshCMD="0"
	end
end

Голова не пашет. Я завтра буду это переписывать и посмотрю что ты скинул.

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

Я завтра буду это переписывать и посмотрю что ты скинул.

Главаное правильно подобрать алгоритм, так тот вариант с md5 у меня выдает 13 хешей в секунду на Lua 5.1.5. А вот этот вариант с некриптостойким crc32 https://pastebin.com/NP3nNQuP у меня выдает 37 000 хешей в секунду на Lua 5.1.5. Менее криптостойкий, но зато быстрый, лучше чем ничего. В промежутке между crc32 и md5 полно разных алгоритмов.

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

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

https://cdn.discordapp.com/attachments/811217303378329643/1095926425116213319/fdsa.png

Задаю ник test=hashStr(«Двацветок»)

Получаю первый символ nome1=string.sub(nome, 1, 1)

Получаю: �

Это нормально вообще?

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

nome="Двацветок"
nome=nome:sub(1,1)
print (nome)
�

А цифры и спецсимолы получает правильно. И латиницу тоже.

Ну да, в игре то же самое. Он кириллицу не может получить.

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

Аххахаха! Да я в луа вообще с кириллицей работать не могу.

str = "Двацветок"
fields = { str:match( (str:gsub(".", "(.)")) ) }
print (fields[2])
�

Ну это тупик пока. Я даже хз.

лицорука До меня дошло. Нужно брать не 1,1, а 1,2 для кириллицы. Теперь у меня вопрос: как с этим работать? Как мне определить, что в строке кириллица, чтобы брать не один символ, а два?

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

Все кажись нашел:

strstr = "Явацветок"
test=strstr:sub(1,1)
test2=strstr:sub(1,2)
test3 = test:byte(1)
test3=tonumber(test3)
if test3==208 then
	print (test2)
else
	print (test)
end

Как же это криво выглядит все.

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

Смотри какую штуку я придумал:

function kirTest(b,n1,n2)
test1=b:sub(n1,n2)
testN=b:byte(1)
testN=tonumber(testN)
if testN == 208 then
	r=b:sub(n1,n2+1)
else
	r=test1
end
return r
end

Кто молодец, а? Хехе. И теперь я могу получать любой символ из строки, независимо от того кириллица это или латиница. Я есть крут!

ну, не совсем крут. Мне нужно понять теперь как приплюсовать в функции каждую букву. Хмм.. Чтобы получить любю букву строки.

Хм… Может так:

function kirTest(b,n1)
test1=b:sub(n1,n2)
testN=b:byte(1)
testN=tonumber(testN)
if testN == 208 then
	if n1==1 then
		r=b:sub(n1*2-1,n*2)
	else
		r=test1
end
return r
end
LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

как приплюсовать в функции каждую букву

Судя по всему, это UTF-8, где символ может занимать и два байта, и три, и один. Может, там все-таки есть из коробки какие-то функции для юникодных строк?

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

Нихера там нету. Вообще все что работает с кириллицей, требует два символа. Есть какие то функции в чистом луа, но это не работает в урезанном говне под названием wow api.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от Nervous
function kirTest(b,n1)
test1=b:sub(n1,n1)
testN=b:byte(1)
testN=tonumber(testN)
if testN == 208 then
	r=b:sub(n1*2-1,n1*2)
else
	r=test1
end
return r
end

Вот. Вот так придется работать с символами. Если нужно будет получать отдельные символы, получать буду по одному. В принципе норм. Если что, получил по однму, склеил как надо - работай. И пофиг что там - кириллица или латиница. Офигенно!

p.s.

Да е мое! Ну что с этим языком не так! Не рабоатет это. Теперь латиницу в кириллице не выводит. Что я упустил? Точнее выводит лишнее:

strstr = "Дваsветок"
testNik=kirTest(strstr,4)
print (testNik)

Вывод: s?

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

Ну серьезно! В луа не работает математика. Тупо не работает. Вот от слова совсем. Она непредсказуема и выдает рандом. Независимо от того, что ты задаешь. Вот смотри:

function kirTest(b,n1)
test1=b:sub(n1,n1)
	nI=b
for i=0,n1-1 do
	testN=nI:byte(1)
	if testN == 208 then
		print (testN)
		nP=nI:len()
		print (nP)
		nI=nI:sub(3,nP)
		print (nI)
		nI1=nI:sub(1,2)
	else

		nP=nI:len()
		nI=nI:sub(2,nP)
		nI1=nI:sub(1,1)
	end
	r=nI1
end

return r
end
--r=b:sub(n1*2-1,n1*2)
--r=test1
strstr = "Двацветок"
testNik=kirTest(strstr,4)

Задаем 1-3 все работает. Он проходит три итерации:

 lua GS.lua                                                         14:46:21
208
18
вацветок
208
16
ацветок
208
14
цветок

Задаем 4:

208
18
вацветок
208
16
ацветок
208
14
цветок

Он проходит четыре итерации? Хер там. Три.

Задаем 5: тоже три терации.

Шесть: И тут у нас наконец ЧЕТЫРЕ итерации!

208
18
вацветок
208
16
ацветок
208
14
цветок
208
10
еток

на 7 у нас пять итераций. Это вообще что?! Это как?

12 длину строки он пропустил. Хмм…

Ладно, это ересь. Пока не будет понимания как работать с кириллицей, дальше ничего не получится.

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

Ладно, это ересь. Пока не будет понимания как работать с кириллицей, дальше ничего не получится.

Я ведь в этой теме говорил что строки в utf-8 и ссылку на wiki кидал.

Лучше почитай про utf-8 и unicode. Например кроме того что символ занимает несколько байт, это называется codepoint, символ в обычном понимании может состоять из нескольких codepoint.

Вот например кажется что первые две строки это одна и таже буква, на самом деле первая состоит из двух UTF-8 символов(если браузер или сайт не заменят её при отправке комментария) каждая по два байта, а вторая это один UTF-8 символ из двух байт. Кстати это не везде будет правильно отображаться, например у меня в xed символ над й у символа на первой строке съезжает по горизонтали почти на ширину символа.

й - [0xD0 0xB8] [0xCC 0x86]
й - [0xD0 0xB9]
и - [0xD0 0xB8]

[0xCC 0x86] - это не символ а модификатор который добавляет модификатор букве или эмодзи. Это может быть как добавление элементов на букву например ударение можно добавить любой букве, так и цвет для эмодзи и т.д.

Вот накидал пример чтоб было видно как работать с urf-8:

local text = "Пример текста в utf-8. Ёлка, cat, 聖誕樹"

-- lookup таблица для utf-8.
local utf8LookupTable = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -- 0x00
                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -- 0X10
                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -- 0x20
                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -- 0x30
                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -- 0x40
                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -- 0x50
                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -- 0x60
                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -- 0x70
                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -- 0x80
                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -- 0x90
                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -- 0xA0
                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -- 0xB0
                          2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 0xC0
                          2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 0xD0
                          3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -- 0xE0
                          4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 1, 1 }-- 0xF0

function utf8Size(byte)
    -- Так как в lua отсчет в массивах с 1 а не с 0 не забываем добавить эту единицу
    return utf8LookupTable[byte + 1]
end

function printChar(text)
    local strEnd = #text + 1
    local pos = 1
    local byte = 0
    -- Размер символа в байтах
    local byteNums = 0
    -- UTF-8 символ
    local utf8Char
    -- Крутим цикл пока не закончится строка
    while pos < strEnd do
        -- Берем текущий байт из строки
        byte = text:byte(pos)
        -- Получаем размер UTF-8 символа
        byteNums = utf8Size(byte)
        utf8Char = string.sub(text, pos, pos + byteNums - 1)
        print(string.format("Bytes:%d char:'%s'", byteNums, utf8Char))
        pos = pos + byteNums
    end
end

printChar(text)

Вывод в lua 5.1.5:

Bytes:2 char:'П'
Bytes:2 char:'р'
Bytes:2 char:'и'
Bytes:2 char:'м'
Bytes:2 char:'е'
Bytes:2 char:'р'
Bytes:1 char:' '
Bytes:2 char:'т'
Bytes:2 char:'е'
Bytes:2 char:'к'
Bytes:2 char:'с'
Bytes:2 char:'т'
Bytes:2 char:'а'
Bytes:1 char:' '
Bytes:2 char:'в'
Bytes:1 char:' '
Bytes:1 char:'u'
Bytes:1 char:'t'
Bytes:1 char:'f'
Bytes:1 char:'-'
Bytes:1 char:'8'
Bytes:1 char:'.'
Bytes:1 char:' '
Bytes:2 char:'Ё'
Bytes:2 char:'л'
Bytes:2 char:'к'
Bytes:2 char:'а'
Bytes:1 char:','
Bytes:1 char:' '
Bytes:1 char:'c'
Bytes:1 char:'a'
Bytes:1 char:'t'
Bytes:1 char:','
Bytes:1 char:' '
Bytes:3 char:'聖'
Bytes:3 char:'誕'
Bytes:3 char:'樹'
V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

Оказывается, тут есть реализация работы с utf в wow api в виде подключения к аддону.. Кто то реализовал много лет назад. Заодно разобрался как функции выносить в отдельный файл. Оказывается, там все файлы аддона считаются одним большим файлом. Ничего подключать не нужно… Просто выносишь функции в отдельный файл и они доступны сразу из всех файлов аддона. Но ютф это жесть какая то.

Я пока подключил стороннюю реализацию, а свою оставлю на потом. Пусть лежит.

https://www.curseforge.com/wow/addons/utf8

Вообще тут достаточно много таких хреновин, облегчающих работу с тем, что я делаю в ручную. Например - работа с таблицами и базами данных. Но я пока сам лучше. Поизучаю.

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

Ладно. Я спокоен и уравновешен. Ты прикинь. Все что я правил последние трое суток, не имело шанса на успех. В самом начале я в дальний файл в глубинах каталога вообще другого аддона засунул функцию хэширования чисто для теста. Посмотреть как она будет работать, набросать первую версию.. И забыл.

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

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

Все таки большинство моих проблем от незнания как можно правильно. Накопал тут в глубинах интерфейса…включение дебагинга аддонов. Отображение ошибок луа в игре. Да это просто чит какой то. Оно тебе показывает все. Как выполняется и выполнялся аддон до ошибки. В каом месте ошибка. Что именно выдавали переменные. Все пошагово, удобно, красиво.

https://pastebin.com/K0vFvtKb

Это настолько просто стало, что даже как то неспортивно, чтоли…

Он мне сейчас даже не просто баги, а тупо нулевые некритичные выводы показывает, я их закрыаю. Просто потому что могу.

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

А ты представляешь какие возможности открываются, если все это знать? Это же охрененно. Я сейчас представлю, что вообще можно сделать - это же невероятно. Сижу ради интереса правлю ошибки в чужих аддонах. Тут их тучи. При старте игры 28 ошибок вылазило. Обычно они не отображаются просто.

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

У меня тут встал вопрос. Почему в луа может не работать условие «не равно»? ~=

endQuests тут - переменная, в которой «простые_квесты»

if TDG[sender][endQuests][x]~="1" then

Параметр равняется «1» - я проверяю в игре. Возвращается «1».

https://cdn.discordapp.com/attachments/811217303378329643/1097028724819492874/1.png

Я проверяю в таблиц, то же самое: https://cdn.discordapp.com/attachments/811217303378329643/1097028731635257455/2.png

А строка if TDG[sender][endQuests][x]~=«1» then считает что там нет единицы. И это не в первый раз. В другом условии у меня:

if testQ["текущий_квест"]==nil or testQ["текущий_квест"]=="9999" then
        btn[2]:Disable()
        btn[2]:SetText("Нет взятых квестов")
elseif testQ["текущий_квест"]~=nil or testQ["текущий_квест"]~="9999" then
        testComplit=testQ["текущий_квест"]
        id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuildAch = GetAchievementInfo(testComplit)
        if completed == true then
            btn[2]:Disable()
            btn[2]:SetText("Ачивка не выполнена")
        else
            btn[2]:Enable()
            btn[2]:SetText("Сдать квест")
        end
    end

Собственно этот код в принципе не работает. И я не могу понять почему. Сначала я сделал условие «testQ[«текущий_квест»]~=nil or testQ[«текущий_квест»]~=«9999» then» первым, но тогда игра ругается мне что там nil. Но уловие ты видишь? По условию оно должно туда перейти, если там не nil. А оно переходит, если nil.

Тогда я сделал первым условием если == nil. Короче, суть проблемы: условие ~= не работает. Почему?

Собственно вот не рабочий блок, например:

if string.find (message,hsh) and string.find (message, "#aai") then
	msg1=mysplit(message)
	msg2=msg[6]
	TDG[sender][endQuests][msg2]="1"
	testQLVL=TDG[sender]["уровень_квестов"]
	testQLVL=tonumber(testQLVL)
	countQ=tablelength(pQuests[testQLVL])
	local chisloProstyhQComplit=0
	chisloProstyhQComplit=tonumber(chisloProstyhQComplit)
	for testQ=1, countQ do
		local x = math.random(1, countQ)
		ach=pQuests[testQLVL][x]
		if TDG[sender][endQuests][x]~="1" then
			SendChatMessage(hsh .. " #aaa " .. sender .. ", покажи мне ачивку " .. ach .. " " .. GetAchievementLink(ach), "OFFICER", nil, 1)
			break
		else
			chisloProstyhQComplit=chisloProstyhQComplit + 1
			if chisloProstyhQComplit==countQ then
				achCmplt="6584"
				SendChatMessage(hsh .. " #aah " .. sender .. ", все стартовые квесты уже выполнены. Теперь покажи мне ачивку" .. achCmplt .. GetAchievementLink(achCmplt), "OFFICER", nil, 1)
			end
		end
	end
end

if TDG[sender][endQuests][x]~=«1» then

Вот это условие. Как видно, оно не должно выполняться. А оно выполняется. Ерунда какая то.

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

Ты мне просто скажи, условие ~= всегда должно же выполняться, я ничего не путаю? Если там НЕ РАВНО параметру, оно его пропустит ведь?

Все, не обращай внимание. Я понял где я дурак. Я рандом получал по количеству ачивок, а потом пытался его же выдавать за ачивку. А надо было получить через него номер ачивки. Все. Спасибо.

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

3,1415926535

Во-первых у тебя там запятая, а в Lua в качестве десятичного разделителя (как и везде) используется точка; во-вторых math.pi.

Время возвращается серверное - одинаковое и там и там.

А задержки на сетевую активность — разные. ☺ Напомню что Lua однопоточный.

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

Знаешь, те скрипты первые месяц назад мне казались почти недоступной для понимания мешаниной кода. Я понимал разве что одну строку из 10. Я сейчас открыл глянул, даже смешно. Ну просто же все. Посмотри с каким леденящим душу **** мне сейчас приходится работать:

function getPOS(x,y)
	local current = GetCurrentResolution()
	if current then
		width, height = string.match(select(current, GetScreenResolutions()), "(%d+)x(%d+)")
	end
	width=tonumber(width)
	local scale = UIParent:GetEffectiveScale()
	local XXX
	local YYY
	local par1
	local par2
	local par3
	local par4
	local par5
	local par6
	local par7
	local par8
	local par9
	local par10
	local par11

	if width==1024 then
		par1=10
		par2=1004
		par3=7
		par4=768
		par5=70
		par6=667
		par7=5
		par8=-6
		par9=-3
		par10=1
		par11=0
		par12=129
		par13=343
		par14=296
		par15=10
		par16=17
		par17=535
		par18=14
	end

	if WorldMapFrameSizeUpButton:IsVisible()==nil then
		XXX=(par1+(par2*x)-par3)
		YYY=((par4 - (par5 + (par6 * y)))-par7)
	else
		testScale=string.sub(scale, 3,7)
		testScale=tonumber(testScale)
		if testScale==87999 then
			poprX=par8
			poprY=par9

			elseif testScale==89999 then
				poprX=par10
				poprY=par11
			end
			YYY=((((par4-(par12 + (par13 * y)))-par14)+par15)/scale)+poprY
			XXX=((par16+(535*x)-par18)/scale)+poprX
	end
	return XXX,YYY
end

Это начало. Это реализация получения координат для карты всего для одного разрешения для трех масштабирований из десятка где то, если не больше.

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

Каждый параметр из 18 - вручную полученный результат и высчитанный. А их будет больше…

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

Представь себе. Пишешь ты скрипты в каталоге ~/Мой_Крутой_Скрипт

Сделал пару функций, объявил переменные - не работает. А все потому что в каталоге ~/Документы/Фотки_жопы_бобра лежит файл, в котором функция с тем же названием. Она перехватывает управление и именно к ней обращается твой скрипт. Вот это вообще нормально, а? В вовке, оказывается, все глобальные переменные общие. Цифровой коммунизм. ВСЕ аддоны - по сути один большой аддон. Нужно следить чтобы в других аддонах что то случайно не совпало с твоим. Ну не бред, а?

И даже более того! Все файлы всех аддонов по сути - один большой файл. Только с непонятными приоритетами.

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

Всё глобальное глобально, всё локальное локально. ¯\(ツ)

По поводу вовчика приоритет там вроде задаётся в XML в котором по очереди подключаются файлы в общий файл, возможно через тот же require просто тебе недоступный, но я лишь строю догадку по быстрому гуглежу.

Ты можешь в любом месте дрыгнуть, вернее в месте где ты хочешь вызывать свою функцию.

if type(_G.function_name) == 'function' then
   print("Такая функция уже есть, пейши другое имячко для своей")
end 
_G -- хранит в себе всё всех и вся глобальное, в более старших версиях _ENV

И проверить до написания своей функции не возникнет ли конфликт,перекрытие.

Но как у тебя горело когда ты нашёл проблему я представляю 0))))))))))

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

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

Да ладно приоритет одного аддона. С одним то можно разобраться. Так оно и остальные аддоны читает. А там свои приоритеты типа.

Я пишу функцию, вызываю - не работает. Я меняю - не работает. Я ПИШУ ПРИНТЫ в функцию, ты прикинь, она работает, но принты не выоводит. И тогда я начал что то подозревать.

Короче, функцию писал полчаса. А потом переделывал, переписывал переменные, переопределял их имена и локальность еще 10 часов.

Зато я теперь полностью пересмотрел подход к коду. Всегда определять локальность переменных, если это возможно, в начале блока, одна функция - одно действие, ЧИТАБЕЛЬНЫЕ имена переменных и никак иначе…

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от Nervous
function hshSenderNomeC(senderNomeC)
	local nomeLen
	local nome1
	local nome11
	local hNomeC
	local hsSenderNomeC1
	local hsSenderNomeC2
	local hsSenderNomeC3
	local hshSenderRC1
	local hshSenderRC2
	local hshSenderRC3
	local hsSenderNomeCRezult
	nomeLen=string.utf8len(senderNomeC)
	nome1={}
	for startLen=1,nomeLen do
		nome1[startLen]=string.utf8sub(senderNomeC, startLen, startLen)
		tmNome=nome1[startLen]
		nome1[startLen]=alfabet(tmNome)
	end
	nome11=0
	for startLen=1,nomeLen do
		nome11=nome11+nome1[startLen]
	end
	nome11=nome11 % 1000
	hNomeC=string.format("%03d",nome11)
	hsSenderNomeC1=string.sub(hNomeC,1,1)
	hsSenderNomeC2=string.sub(hNomeC,2,2)
	hsSenderNomeC3=string.sub(hNomeC,3,3)
	hshSenderRC1 = math.random(0, 9)
	hshSenderRC2 = math.random(0, 9)
	hshSenderRC3 = math.random(0, 9)

	if hshSenderRC2==0 then
	hsSenderNomeCRezult=hshSenderRC1 .. hshSenderRC2 .. hsSenderNomeC1 .. hsSenderNomeC2 .. hshSenderRC3 .. hsSenderNomeC3
	elseif hshSenderRC2==1 then
		hsSenderNomeCRezult=hshSenderRC1 .. hshSenderRC2 .. hsSenderNomeC2 .. hsSenderNomeC1 .. hshSenderRC3 .. hsSenderNomeC3
	elseif hshSenderRC2==2 then
		hsSenderNomeCRezult=hshSenderRC1 .. hshSenderRC2 .. hsSenderNomeC3 .. hsSenderNomeC1 .. hshSenderRC3 .. hsSenderNomeC2
	elseif hshSenderRC2==3 then
		hsSenderNomeCRezult=hshSenderRC1 .. hshSenderRC2 .. hsSenderNomeC1 .. hsSenderNomeC3 .. hshSenderRC3 .. hsSenderNomeC2
	elseif hshSenderRC2==4 then
		hsSenderNomeCRezult=hsSenderNomeC1 .. hshSenderRC2 .. hshSenderRC1 .. hsSenderNomeC3 .. hshSenderRC3 .. hsSenderNomeC2
	elseif hshSenderRC2==5 then
		hsSenderNomeCRezult=hsSenderNomeC1 .. hshSenderRC2 .. hsSenderNomeC3 .. hshSenderRC1 .. hshSenderRC3 .. hsSenderNomeC2
	elseif hshSenderRC2==6 then
		hsSenderNomeCRezult=hsSenderNomeC2 .. hshSenderRC2 .. hsSenderNomeC3 .. hshSenderRC1 .. hshSenderRC3 .. hsSenderNomeC1
	elseif hshSenderRC2==7 then
		hsSenderNomeCRezult=hsSenderNomeC3 .. hshSenderRC2 .. hsSenderNomeC2 .. hshSenderRC3 .. hshSenderRC1 .. hsSenderNomeC1
	elseif hshSenderRC2==8 then
		hsSenderNomeCRezult=hshSenderRC1 .. hshSenderRC2 .. hshSenderRC3 .. hsSenderNomeC1 .. hsSenderNomeC2 .. hsSenderNomeC3
	elseif hshSenderRC2==8 then
		hsSenderNomeCRezult=hsSenderNomeC1 .. hshSenderRC2 .. hsSenderNomeC3 .. hshSenderRC1 .. hsSenderNomeC2 .. hshSenderRC3
	elseif hshSenderRC2==9 then
		hsSenderNomeCRezult=hsSenderNomeC2 .. hshSenderRC2 .. hsSenderNomeC3 .. hshSenderRC1 .. hsSenderNomeC1 .. hshSenderRC3
	end
	if testQ[senderNomeC]["rarHSH"]==nil then
		testQ[senderNomeC]["rarHSH"]={}
	end
	if hsSenderNomeCRezult==testQ[senderNomeC]["rarHSH"] then
		hsSenderNomeCRezult=hshSenderNomeC(senderNomeC)
	end
	table.insert(testQ[senderNomeC]["rarHSH"], hsSenderNomeCRezult)
	return hsSenderNomeCRezult
end

Пятая строка снизу. Я рекурсивно вызывыаю саму функцию из себя при условии совпадения результата с предыдущими. Это же сработает? Просто протестировать это как то сложно.. Хм…

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

Я рекурсивно вызываю саму функцию из себя при условии совпадения результата с предыдущими. Это же сработает? Просто протестировать это как то сложно

Если в рекурсивной функции есть нерекурсивная ветка (базовый случай), то должно работать. Иначе у стека рано или поздно выбьет днище.

ЧИТАБЕЛЬНЫЕ имена переменных

hNomeC

Полный гномец %)

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

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

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

С рекурсиями аккуратно стек маленький.

-- можно на глаз проверить/протестить
-- mem заёмет в стеке 8 байт + всё остальное
function callback(num)
    print(num)
    local mem = num;
    callback(num+1)
end

callback(1)

А у тебя он может быть ещё дополнительно ограничен.

P.S. Что у тебя происходит в коде я нипнимаю :3

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

Это код генерирования уникального хэша на основе ника. Он специально написан так, чтобы его было сложно понять. Чтобы никто шибко умный не додумался как это работает и не читерил.

Код берет ник игрока и на его основе генерирует шесть цифр. Три из них - от ника, три рандомные.

Я вот хочу чтобы коды были всегда уникальны. Для чего добавляю коды в таблицу, читаю оттуда и сравниваю. Если результат совпадает, вызываю функцию из себя же и генерирую новый результат.. В теории должно быть как то так.

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

Нууу.. Во-первых, нужно разобраться как работает код, найти функцию. Понять как она работает. Как ее приспособить. Это долго, нудно и бесперспективно.

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

Это долго, нудно и бесперспективно.

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

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

Что у тебя происходит в коде я нипнимаю :3

Сейм щит. Я думаю, тут нужно начать с прозы. Записать тупа текстом, как рассказ:

  • чего мы хотим добиться, какая цель у всего этого
  • какие входные данные у нас есть
  • что должно получиться на выходе
  • условия и ограничения, которые надо соблюсти

Выделить из рассказа основные понятия — значения и сущности (как наборы атрибутов — пар ключ-значение), над которыми будем колдовать (существительные, например, «пользователь» с атрибутом «имя пользователя»; сообщение с атрибутами «автор сообщения», «текст сообщения», «хэш сообщения»; чат и т.д); это наши данные.

Выделить из рассказа отношения между значениями/сущностями (глаголы, например, пользователь отправляет сообщение, мы вычисляем хэш сообщения из его текста, имени автора и текущего времени и т.д.); это наши функции. Для каждой функции определить имя (понятное), входные параметры, возвращаемое значение. Функция должна делать что-то одно, если она делает несколько вещей, ее нужно распилить на несколько функций (например, если одна и та же функция форматирует текущее время, вычисляет хэш и отправляет сообщение, ее пора пилить).

Собрать из этих функций, оперирующих этими данными, нужный вычислительный процесс (скорее всего, еще одна функция, главная).

А то, что мы в процессе понаписали, будет зайчатком документации ко всему этому беспределу.

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

хочу чтобы коды были всегда уникальны

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

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

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

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

У игрока клиентская часть аддона. Она и генерирует. Но кто мешает вручную написать, например?

Ебатушки..что ж я накодил то. Он мне за одно использование 386 повторов нагенерил…

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от Nervous
testDateServ=date("%d")
	testDateServ=tonumber(testDate)
	if (testDateServ % 2 == 0) then
		tableHSHserv="rarHSH"
		TDG[mioNomeS]["rarHSH1"]={}
	else
		tableHSHserv="rarHSH1"
		TDG[mioNomeS]["rarHSH"]={}
	end
	if #TDG["Витинари"]["rarHSH"]~=0 then
		for funHSHservCount=1,#TDG[mioNomeS][tableHSHserv] do
			if hshRarS==TDG[mioNomeS][tableHSHserv][funHSHservCount] then
				funCheatTest=1
				break
			else
				funCheatTest=0
				table.insert(TDG[mioNomeS][tableHSHserv],hshRarS)
			end
			funHSHservCount=funHSHservCount+1
		end
	else
		funCheatTest=0
		table.insert(TDG[mioNomeS][tableHSHserv],hshRarS)
	end

Люто болит голова. Походу грипп весенний, мля.. Вообще не думается Вот это мне сейчас нагенерило за три использования больше шести тысяч результатов в таблице. Звиздец.

Кажется понял. Я в элсе при удачном исходе брейк не делаю…

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

У игрока клиентская часть аддона. Она и генерирует.

А серверная часть откуда знает, правильную фразу ей прислали или нет?

Я так понимаю, серверная часть аддона принимает запросы от пользователей, проверяет их на вшивость и, если все окей, выполняет какую-то задачу, к которой у пользователя обычно нет прямого доступа (например, сдать квест, не бегая к NPC или получить мешок денег)?

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

Ну так в серверной части функция расшифровывает хэш, основываясь на правилах. И проверяет заодно, чтобы он был уникальным.. Вот только допишу и будет проверять.

Если расшифровка проходит успешно и код уникальный - значит все хорошо и квест принимаем. В противном случае - нет.

Если все хорошо и квест выполнен, назначаем награду игроку. Все просто.

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