Zaam
-
Постов
101 -
Зарегистрирован
-
Посещение
Тип контента
Загрузки
Форумы
Статьи и объявления
Гардероб
Маунты
Сообщения Allods Team
Трекер ошибок
Магазин
Галерея
Сообщения, опубликованные Zaam
-
-
Именно это я и подозревал, но не нашел нигде инфы, как передать по значению. Правда, особо и не искал, ибо херня какая-то - в других местах таблицы нормально копируются, а перезапись происходит в пределах неймспейса внутреннего цикла. И значит ли это, что если заменить.А все потому, что таблицы передаются по ссылке, а не по значению.
tbl[n] = vi tbl[n][4] = vj
на
for kk, vk in vi do tbl[n][kk] = vk end tbl[n][4] = vj
то всё заработает, так как передаются не таблицы?
-
Не сработает с входными параметрами {{1, 2, 3, 4}, {5, 6, 7, 8}} и {9, 0}, например.
И результат
{1, , , 7} { , 2, , 8} { , , 3, 9} {4, , , 7} { , 5, , 8} { , , 6, 9}
не совсем то, что мне нужно.
-
Вот собственно и интересует, почему не катит.Еще косяк в tbl[n]=vi присваиваем 3 элемента и дописываем 4й не катит.for i=1,3 do if t==i then ... t=t+1 end n = n + 1 end
Зачем тут эти пляски с условием, если оно всегда будет выполняться?
Нет, не покатит, так как длина таблиц в первой таблице и длина второй таблицы переменная. Это я для того, чтобы убедиться, что баг именно в этом участке кода, написал тест с простыми входными данными.Такой вариант не покатит?Более того, если код доработать:
local n = 1 local tbl = {} for ki, vi in {{1, 2, 3},{4, 5, 6}} do for kj, vj in {7, 8, 9} do tbl[n] = vi tbl[n][4] = vj LogTable(tbl[n]) n = n + 1 end end LogInfo("-------------------------") LogTable(tbl)
то он выдаст:
{1, 2, 3, 7} {1, 2, 3, 8} {1, 2, 3, 9} {4, 5, 6, 7} {4, 5, 6, 8} {4, 5, 6, 9} ------------------------- {{1, 2, 3, 9}, {1, 2, 3, 9}, {1, 2, 3, 9}, {4, 5, 6, 9}, {4, 5, 6, 9}, {4, 5, 6, 9}}
То есть, во внутреннем цикле всё замечательно работает и присваивается, но почему-то на каждой итерации перезаписывает значение добавленного элемента.
-
мозг мне сломал
Я сегодня весь день этот баг ловил. Тут, так сказать, он кристально чистый. А вот в той лапше, в которую он затесался его найти - у меня уже 3 раза мозг взрывался.
-
Нарисовал такой вот код:
local n = 1 local tbl = {} for ki, vi in {{1, 2, 3},{4, 5, 6}} do for kj, vj in {7, 8, 9} do tbl[n] = vi tbl[n][4] = vj n = n + 1 end end
ожидаю, что на выходе tbl будет равна
{{1, 2, 3, 7}, {1, 2, 3, 8}, {1, 2, 3, 9}, {4, 5, 6, 7}, {4, 5, 6, 8}, {4, 5, 6, 9}}
но внезапно получаю
{{1, 2, 3, 9}, {1, 2, 3, 9}, {1, 2, 3, 9}, {4, 5, 6, 9}, {4, 5, 6, 9}, {4, 5, 6, 9}}
WTF?
-
ИМХО, привязывать замеры времени к какой-либо анимации стоит только тогда больше не к чему привязаться. И то, это способ создать свое событие, а время лучше отдельно вычислять, а не считать, что оно равно величине переданной в "Sleep".
В данном случае есть подходящее событие - EVENT_AVATAR_POS_CHANGED. Я сделал через него, и получил гладкую скорость, замеры совпадают почти со всеми известными скоростями в игре. Единственное исключение - скачки скорости при полете на корабле, но там как бы есть родной спидометр.
-
опять вы эти Global суете - local поставь - меньше кода и загрузки клиента будет
Копипаст рулит.
Да и не в глобалах там дело.
а еще счетчик сколько километров пройдено, овса съедено и зайцев убито!Овёс и зайцы - лишнее, а вот километры - нужны.
-
С какими "фадеэфектами"?
Вот с этими:
вставь по фаде или ротате еффектupd:
Скачал, поглядел, так и не понял, с какой же скоростью персы бегают пешком.
Я точно теперь не буду заниматься гуем в своем аддоне, потому поделюсь кодом:
Global( "pos" , nil ) Global( "sp" , 0.0) -- Скорость Global( "dst" , 0.0) -- Суммарный пройденный путь Global( "mseconds" , 0) Global( "SPwork" , false) Global( "wtMessage", nil ) function ShowSpeed() wtMessage:SetVal( "speed", common.FormatFloat(sp, "%.2f" )) wtMessage:SetVal( "dist", common.FormatFloat(dst, "%.1f" )) end function OnSlashCommand( params ) if userMods.FromWString(params.text) == "/ызв" or userMods.FromWString(params.text) == "/spd" then if SPwork==false then SPwork = true common.RegisterEventHandler(OnPosChanged, "EVENT_AVATAR_POS_CHANGED") common.RegisterEventHandler(OnEventTimer, "EVENT_SECOND_TIMER") pos = avatar.GetPos() mseconds = mission.GetPlayTimeMs() dst = 0 ShowSpeed() wtMessage:Show(true) else SPwork=false common.UnRegisterEventHandler(OnPosChanged, "EVENT_AVATAR_POS_CHANGED") common.RegisterEventHandler(OnEventTimer, "EVENT_SECOND_TIMER") wtMessage:Show(false) end end end function OnPosChanged(params) local newpos = avatar.GetPos() local newmseconds = mission.GetPlayTimeMs() local dX = newpos.posX - pos.posX local dY = newpos.posY - pos.posY local dT = newmseconds - mseconds pos = newpos mseconds = newmseconds local dS = math.sqrt(dX * dX + dY * dY) if dS < 50 then sp = dS * 1000 / dT dst = dst + dS ShowSpeed() end end function OnEventTimer(params) if mission.GetPlayTimeMs() - mseconds > 100 then -- Если положение не менялось больше, чем 0,1 с, то sp = 0 -- персонаж стоит на месте. ShowSpeed() end end function Init() common.RegisterEventHandler( OnSlashCommand, "EVENT_UNKNOWN_SLASH_COMMAND") wtMessage = mainForm:GetChildChecked( "Announce", false ) wtMessage:Show( false ) end Init()
Ну и в качестве пожелания - запилить круглый вариант, чтобы можно было его не прислонять к нижней панельке и добавить одометр, тогда ваще отличный аддон будет.
-
Оффтоп: никто не разобрался, как грамотно убить навязанный в последней обнове GameCenter? Полная блокировка в firewall приводит к невозможности запуска самого клиента =/
Я остановился на этом:
if FileExists ( "GameCenterLight\[email protected]" ) Then FileMove ( "GameCenterLight\[email protected]", "GameCenterLight\[email protected]" ) EndIf Run("Launcher.exe") WinWaitActive("[CLASS:NIVAL_MMO_ENGINE]") FileMove ( "GameCenterLight\[email protected]", "GameCenterLight\[email protected]" ) ProcessClose("[email protected]")
Запуск - http://www.autoitscr...om/site/autoit/
Он умеет делать и экзешники.
-
А нафига такой геморрой с фадеэфектами?
-
и где такое чудо можно взять/купить?
Пока только у меня есть, но я жадный и не поделюсь.
По крайней мере, пока не повычищу весь говнокод, а то перед людьми стыдно.
- 1
-
Короче, как-то так. Всего то 10 kB индокода.
На гуй пока забил. Как снизойдет вдохновение - может допилю. А заодно, поубавлю количество индусов в коде.
И, если меня склероз не подводит, максимум видел 7 разных банок, которые можно было довернуть в одной варке.
- 1
-
человеку хочется посмотреть самому
Рили? А не доводилось варить для соги 400 банок на статы за раз?
к тому же вариантов может быть много и смыл их всех выводитьВсе и не нужно.
-
Еще б подсказка выводилась, куда крутить и что из этого получится - тогда можно было бы вообще стандартный аддон не уродовать.
Массивы
в Вопросы и ответы
Опубликовано
А вообще, получается "Ехал цикл через цикл, видит цикл в цикле цикл..."