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

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

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

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)
Ответ на: комментарий от 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 ★★★★★
() автор топика