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)

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

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

https://github.com/Vladgobelen/GuildChat

https://github.com/Vladgobelen/NSQuestClient

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

Да ты прав, зря быканул :D Но если эта переменная табличка то это просто ссылка на табличку с теми самыми ключиками по хешикам. Просто глобальные укладываются в _ENV,_G, локальные в «регистры» VM, но всякое local hello = { world=42 } полезет за world=42 через тот же самый GETTABLE хоть сама hello и не в табличках вовсе.

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

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

local btn = CreateFrame("Button", nil, UIParent, "UIPanelButtonTemplate")
btn:SetPoint("CENTER",0, 400)
btn:SetSize(300, 30)
btn:SetText("Взять квест")
btn:Hide();
btn:SetScript("OnClick", function(self, button)
	SendChatMessage("#zzs", "GUILD", nil, 1)
end)

btn - кнопка в игре. А как мне к этому добавить цифру в переменной? Например i=1. И чтобы из btn и i получить btn1. Как вообще в луа добавлять к названиям переменных данные из переменных?

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

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver
local i = 1;
local x = {};

x["test_"..i]="hello";
i=i+1;
x["test_"..i]="world";

print(x.test_1,x.test_2);
hello	world

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

Не знаю даже.

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

Этот долбаный мастер немало мне нервов попортил, когда я пару недель назад изучал что такое гит и как им пользоваться. В стандарте везде в примерах мастер, а гитхаб по известным причинам отказался от него и не отображает. Мне пришлось первый проект через другого человека перезаливать в мейн из мастера, чтобы он отображался. А сейчас когда качают аддон с гитхаба, он добавляет в конце -main и приходится дополнительно менять название каталога, чтобы аддон работал. Клонировать на винде юзеры не будут. И даже не поймут что это такое.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver
local buttons={}
for nb=1,5 do
buttons['btn'..nb]=CreateFrame("Button", nil, UIParent, "UIPanelButtonTemplate")
buttons['btn'..nb]:Hide();
end

buttons.btn1:Hide();
buttons.btn2:Hide();
buttons.btn3:Hide();
buttons.btn4:Hide();
buttons.btn5:Hide();
-- тоже самое что 
buttons["btn1"]:Hide();
buttons["btn2"]:Hide();
buttons["btn3"]:Hide();
buttons["btn4"]:Hide();
buttons["btn5"]:Hide();
-- тоже самое что
buttons["btn"..1]:Hide();
buttons["btn"..2]:Hide();
buttons["btn"..3]:Hide();
buttons["btn"..4]:Hide();
buttons["btn"..5]:Hide();
-- тоже самое что
local i = 1;
buttons["btn"..i+1]:Hide();
buttons["btn"..i+2]:Hide();
buttons["btn"..i+3]:Hide();
buttons["btn"..i+4]:Hide();
buttons["btn"..i+5]:Hide();
-- тоже самое что
local i = 1;
buttons["btn"..i]:Hide(); i = i + 1;
buttons["btn"..i]:Hide(); i = i + 1;
buttons["btn"..i]:Hide(); i = i + 1;
buttons["btn"..i]:Hide(); i = i + 1;
buttons["btn"..i]:Hide(); i = i + 1;
LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Я нифига не понимаю. По идее тогда я должен сделать так:

btn={}
i=0
btn.i = CreateFrame("Button", nil, UIParent, "UIPanelButtonTemplate")
btn.i:SetPoint("CENTER",0, 400)
btn.i:SetSize(300, 30)
btn.i:SetText("Взять квест")
btn.i:Hide();
btn.i:SetScript("OnClick", function(self, button)
	SendChatMessage("#zzs", "GUILD", nil, 1)
end)

Но так не работает. Я делаю переменную массивом и в нее записываю нужное. Но он не пашет.

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

А в аддоне много файлов?

Если немного, то можно скачивать по прямым ссылкам на файлы.

Можно сделать единый реестр аддонов с простым форматом, где будут перечислены эти ссылки.

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

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

https://github.com/Vladgobelen/NSQuestClient/archive/refs/tags/NSQuestsClient.zip

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

Это был мой первый вариант и он тоже не пашет.

btn={}
i=0
btn[i] = CreateFrame("Button", nil, UIParent, "UIPanelButtonTemplate")
btn[i]:SetPoint("CENTER",0, 400)
btn[i]:SetSize(300, 30)
btn[i]:SetText("Взять квест")
btn[i]:Hide();
btn[i]:SetScript("OnClick", function(self, button)
	SendChatMessage("#zzs", "GUILD", nil, 1)
end)
LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

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

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

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

Вот это полностью рабочий вариант. Как видно, куча повторяющихся участков. И у меня в аддоне такого ооочень много. Где то получается сократить массивами, а где то как здесь. Вот я меняю второй блок:

btn={}
ii=1
btn[ii] = CreateFrame("Button", nil, UIParent, "UIPanelButtonTemplate")
btn[ii]:SetPoint("CENTER",0, 370)
btn[ii]:SetSize(300, 30)
btn[ii]:SetText("Сдать квест")
btn[ii]:Hide();
btn[ii]:SetScript("OnClick", function(self, button)
	SendChatMessage("#zzr", "GUILD", nil, 1)
end)

После этого очень странным образом перестает работать середина кода. Начиная со второй кнопки и до нового типа фрейма:

local minibtn = CreateFrame("Button", nil, Minimap)

То есть перестают работать кнопки 1-4

https://cdn.discordapp.com/attachments/811217303378329643/1095640202476802079/proof.png

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

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

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

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

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU
btn={}
for ii=0,4 do
    btn[ii] = CreateFrame("Button", nil, UIParent, "UIPanelButtonTemplate")
    if ii==0 then
        btn[ii]:SetPoint("CENTER",0, 400)
        btn[ii]:SetSize(300, 30)
        btn[ii]:SetText("Взять квест")
        btn[ii]:Hide();
        btn[ii]:SetScript("OnClick", function(self, button)
	SendChatMessage("#zzs", "GUILD", nil, 1)
        end)
    end
    if ii==1 then
        btn[ii]:SetPoint("CENTER",0, 370)
        btn[ii]:SetSize(300, 30)
        btn[ii]:SetText("Сдать квест")
        btn[ii]:Hide();
        btn[ii]:SetScript("OnClick", function(self, button)
	SendChatMessage("#zzr", "GUILD", nil, 1)
        end)
    end
    if ii==2 then
        btn[ii]:SetPoint("CENTER",0,340)
        btn[ii]:SetSize(300, 30)
        btn[ii]:SetText("Взять бонусный квест вне лимита")
        btn[ii]:Hide();
        btn[ii]:SetScript("OnClick", function(self, button)
	SendChatMessage("#zzz", "GUILD", nil, 1)
        end)
    end
    if ii==3 then
        btn[ii]:SetPoint("CENTER",0,310)
        btn[ii]:SetSize(300, 30)
        btn[ii]:SetText("Сдать бонусный квест вне лимита")
        btn[ii]:Hide();
        btn[ii]:SetScript("OnClick", function(self, button)
        SendChatMessage("#zzy", "GUILD", nil, 1)
        end)
    end
    if ii==4 then
        btn[ii]:SetPoint("CENTER",0,280)
        btn[ii]:SetSize(300, 30)
        btn[ii]:SetText("Узнать свой гильдлвл")
        btn[ii]:Hide();
        btn[ii]:SetScript("OnClick", function(self, button)
	SendChatMessage("#zzt", "GUILD", nil, 1)
        end)
    end

end

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

for ii=0,5 do
        btn[ii]:Hide();
end
LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Ух блин! Работает!

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

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

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

Я чую это как то все можно в функции вынести, но пока нет уже сил думать - как.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU
[17:39][G] [Stealerqq]: #zzs
[17:39][Офицер] [Витинари]: 026619 #aaa Stealerqq, покажи мне ачивку 153 [Старый гном и море]
[17:45][G] [Витинари]: так еще
[17:46][G] [Stealerqq]: #zzy
[17:46][Офицер] [Витинари]: *Stealerqq, сначала нужно взять квест
[17:51][G] [Витинари]: чо
[17:52][G] [Stealerqq]: ой
[17:53][G] [Витинари]: не то)
[18:01][G] [Stealerqq]: случайно тыкнул
[18:01][Кукурук] заслужил достижение [Мастер]!
[18:07][G] [Витинари]:  Stealerqq покажимне
[18:07][Офицер] [Stealerqq]: 023689 003782
[18:09][G] [Витинари]: тыкай
[18:15][Неотложжка] входит в игровой мир.
[18:21][G] [Djareth]: зашибись... какая подстава...
[18:28][G] [Витинари]: ну
[18:29]Шапр выходит из игрового мира.
[19:02][G] [Djareth]: мало того, что кв итем после падения сервака исчез, так еще кинуло в лапы к боссу...
[19:09][Tocio] заслужила достижение [Жертвоприношение? Нет!]!
[19:16][G] [Витинари]:  Stealerqq, раз раз
[19:21][G] [Витинари]:  Stealerqq покажимне
[19:21][Офицер] [Stealerqq]: 025629 005722
[19:23][G] [Stealerqq]: тут
[19:25][G] [Витинари]: ыкай
[19:28][G] [Витинари]: квест
[19:30]21
[19:30]1560
[19:30][G] [Stealerqq]: #zzs
[19:30][Офицер] [Витинари]: 220679 #aaa Stealerqq, покажи мне ачивку 1560 [500 рыбок]
[19:30][Офицер] [Stealerqq]: 220679 #aab эта уже выполнена 1560 [500 рыбок]
[19:35][G] [Витинари]:  Stealerqq покажимне
[19:35][Офицер] [Stealerqq]: 220679 200772
[19:36][G] [Витинари]: еще
[19:37]5
[19:37]845
[19:37][G] [Stealerqq]: #zzs
[19:37][Офицер] [Витинари]: 220679 #aaa Stealerqq, покажи мне ачивку 845 [Ясеневый лес]
[19:37][Офицер] [Stealerqq]: 220679 #aac можно сделать: 845 [Ясеневый лес]
[19:37][Офицер] [Витинари]: 220679 #aae Stealerqq, получи ачивку 845 [Ясеневый лес]
[19:38][G] [Неотложжка]: Всем бодрый вечер!))
[19:48][G] [Djareth]: и вам не хворать
[19:51][Keeinin] входит в игровой мир.
[19:52][G] [Витинари]: лютый косяк с кодами

Хм. В этот раз время точно совпадает. Я проверил и перепроверил много много раз. Юниксовое время совпадает до секунды. Я проверку делаю по предпоследним двум цифрам. То есть запас времени в 10 секунд даю. Код совпадает гораздо чаще чем раньше, но через раз. Нифига не понимаю.

function hashStr (nome)
	i = time()
	i = string.sub(i, 8, 9)
	i = i * i
	i = i * 3.1415926535
	i = string.sub(i, 3, 5)
	i = string.format("%03d",i)
	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

Вот чисто теоретически код же должен совпадать всегда? Ну должен же? Берем юниксовое время. Берем номер буквы алфавита в нике. Все логично, последовательно.

[37:17][Офицер] [Витинари]: 426689 #aaf Stealerqq, а сделал ли ты 845 [Ясеневый лес]?
[37:17][Офицер] [Stealerqq]: *я забыл...скоро сделаю, вернусь позже.
[37:23][G] [Витинари]:  Stealerqq покажимне
[37:24][Офицер] [Stealerqq]: 826679 80677
```
Вот опять. Код должен быть 826679, а у него 426689. Ну ересь.
LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

Заменил time() на os.time(), запускаю локально, периодически вижу вот такое

hash.lua:28: bad argument #2 to 'format' (number has no integer representation)

Судя по всему, не любые две цифры рядом образуют валидное целое число, которое нужно для «%03d», например, «12» — валидное, а «03» — нет.

код же должен совпадать всегда?

У тебя там мало того что побочные эффекты в функции, так, похоже, еще и интерпретатор ошибки глотает.

Шоделать? А как выше уже советовали: разбить код на чистые функции, побочные эффекты по максимуму собрать в одном месте; чистые функции тестировать локально.

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

Э не, 03 тоже должен хават. Он его превратит в 003. Это проверено. А во на переходе могут быть сбои. Время может отличаться на пару секунд. Например системное время у нас отличается секунд на 30 примерно. А вот юниксовоможет на 1-3 секунды. И в эти 1-3 секунды может быть сбой, как я понимаю.

А что если генерировать три строки подряд и сравнивать. Если 2 последние совпали - выдаем. Если нет - генерируем еще три.. Хмм.

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

number has no integer representation

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

string.format("%03d", 1.1)

stdin:1: bad argument #2 to 'format' (number has no integer representation)

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

Мне тут кое что подсказали. Прпробую реализовать.

function hashStr (nome)
	i = os.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

hsh=hashStr(sender)
msg=mysplit(message)
hshStraniero=msg[1]
hshC=(math.abs(hsh-hshStraniero)
if hshC<10 then

Ну вот что то вроде этого. Во-первых, беру последние три цифры юникс-времени. То есть последнюю тысячу секунд. Затем сравнимаю хэш одной машины с хэшем другой. Если разница меньше 10, значит все норм. Должно сработать на этот раз. Тьфу.. ну тут еще выпарсить само время надо, конечно же.

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

А так как i у тебя глобальная и доступна даже после завершения функции, интерпретатор после того, как проглотит ошибку, с довольным видом берет это старое глобальное значение и шпарит дальше.

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

Ну это я так - для примера накидал. Там и os.time нету. Там просто time. Сейчас буду нормально реализовывать.

И про i тут же все просто. Я же первой командой присваиваю ей новое значение, а значит все норм же. Я ж слежу за этим.

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

А что если генерировать три строки подряд и сравнивать. Если 2 последние совпали - выдаем. Если нет - генерируем еще три.. Хмм.

У всяких алгоритмов двухфакторной авторизации завязанной на время при не совпадении берется предыдущее время. Но там обычно интервалы 30 секунд. Тоесть если не получилось для текущего 30 секундного интервала, то пробуем для предыдущего 30 секундного интервала. И лучше крипто хеш использовать, даже два раза по типу hash(nickname+hash(time+secretSalt)), так хрен кто даже перебором подберет secretSalt.

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

hsh=hashStr(sender)
testMes=mysplit(message)

if testMes[1]=="#" then
	hshStraniero1=string.sub(testMes[2],1,1)
	hshStraniero2=string.sub(testMes[2],3,3)
	hshStraniero3=string.sub(testMes[2],5,5)
	hshStraniero=hshStraniero1 .. hshStraniero2 .. hshStraniero3
end

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(hsh-hshStraniero)

if hshC<10 then
	hshCMD="maodzedun"
else
	hshCMD="0"
end

Короче. Кажется так. Добавлю в начало команд символ #. Буду читать по нему. Если есть символ - вычисляем. Если разница между хэшами меньше 10, то команда принимается. Кажется нигде не ошибся.

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

Я только с огорода, усталь, но всё что выше сократить можно так

function btn:configure(id,posex,posey,sizex,sizey,zzid,message)
    self[id] = CreateFrame("Button", nil, UIParent, "UIPanelButtonTemplate");
    self[id]:SetPoint("CENTER",posex, posey)
    self[id]:SetSize(sizex, sizey)
    self[id]:SetText(message)
    self[id]:Hide();
    self[id]:SetScript("OnClick",function(self, button)
           SendChatMessage(zzzid, "GUILD", nil, 1) end)
end

local btn = {};
-- вместо цикла явная индексация, так как у тебя один фиг ifы
-- видимо я так понял имеет значение порядок создания кнопок
btn:configure(1,0,400,300,30,"#zzs","Взять квест");
btn:configure(2,0,370,300,30,"#zzr","Сдать квест");
btn:configure(3,0,340,300,30,"#zzz","Взять бонусный квест вне лимита");
btn:configure(4,0,310,300,30,"#zzy","Сдать бонусный квест вне лимита");
btn:configure(5,0,280,300,30,"#zzt","Узнать свой гилдлвл");

Индексируй с 1ницы, а то будешь удивляться потом, в lua циклы,ключи числовые начинаются с 1, а не с 0. Можно и с 0 работать конечно, просто нужно держать в голове это. Может где ошибся в коде.

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

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

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

А почему двоеточие? btn:configure

То есть получается self передает в двоеточие. Если я правильно понял.

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

Хм.. Красиво, но что то не так. Не пашет.

https://pastebin.com/d3y7EzyR

btn это же обычный массив? btn[1]?

А, вижу, ну да. Но не пашет.

Да, не принимает он именно эту новую конструкцию. Крашит весь скрипт с нуля.

function btn:configure(id,posex,posey,sizex,sizey,zzid,message)

end

Ему не нравится сама вот эта вот постановка вопроса. Если все остальное вырезать, эти две строки крашат скрипт.

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

Короче, я взял полностью рабочий скрипт и добавил в него:

function btn:configure(id,posex,posey,sizex,sizey,zzid,message) end

Просто пустую функцию, к которой никто не обращается. И оно все крашнуло. Возможно там такие функции нельзя, хз..

Хотя нет. Залез сейчас чужой аддон и нашел там что то похожее:

function Grid.modulePrototype:OnInitialize()
	if not self.db then
		self.core:RegisterDefaults(self.name, "profile", self.defaultDB or {})
		self.db = self.core:AcquireDBNamespace(self.name)
	end
	self.debugFrame = Grid.debugFrame
	self.debugging = self.db.profile.debug
	self:Debug("OnInitialize")
	self.core:AddModuleDebugMenu(self)
	self:RegisterModules()
	self:RegisterEvent("ADDON_LOADED")
end

function Grid.modulePrototype:OnEnable()
	self:RegisterEvent("ADDON_LOADED")
	self:EnableModules()
end

Ну да.. Такое есть там:

function Grid:OnEnable()
	self:RegisterEvent("ADDON_LOADED")

	self:EnableModules()

	self:RegisterEvent("PLAYER_REGEN_DISABLED")
	self:RegisterEvent("PLAYER_REGEN_ENABLED")
	self:RegisterEvent("PLAYER_ENTERING_WORLD")

	self:TriggerEvent("Grid_Enabled")

	activeTalentGroup = GetActiveTalentGroup()
	self:CheckDualSpecState()
	self:RegisterEvent("PLAYER_TALENT_UPDATE")
end
LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

Объявить local btn = {}; надо выше фукнции просто. Я забыл перенести.

А почему двоеточие? btn:configure То есть получается self передает в двоеточие. Если я правильно понял.

Да это сахар, эти два кода одинаковы

-- это
local object = {}

function object:add_num(id,num)
   self[id] = num;
end
-- тоже самое что и это

local object = {}

function add_num(table,id,num)
   table[id] = num;
end

--Разница в вызовах
object:add_num(1,42); 
add_num(object,1,42);


-- На самом деле  это
object:add_num(1,42); 
-- Вызывается так
object.add_num(object,1,42); -- и так ты можешь сам вызвать, но просто проще через `:`

-- внутри таблица object передаётся неявно и обратиться к самому себе можно через `self` 
LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от V1KT0P

Слушай Виктора, Виктор дело говорит. Делай иногда перерывы и почитывай книжку. Там всего 200 страниц про язык и то половина вода (ссылку я не видел, но догадываюсь что за книга).

LINUX-ORG-RU ★★★★★
()