Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

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

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

Zaam

Разработчик аддонов
  • Постов

    101
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Zaam

  1. Рухнет с ошибкой, т.к. tbl[n] это nil, а nil не индексируется. Правильно так:

    local t = {}
    for kk, vk in vi do t[kk] = vk end
    t[4] = vj
    tbl[n] = t
    

    Ну да упустил. Только зачем временная переменная? Почему нельзя вместо "local t = {}" "tbl[n] = {}"?

    А вообще, получается "Ехал цикл через цикл, видит цикл в цикле цикл..."

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

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

    tbl[n] = vi
    tbl[n][4] = vj
    

    на

    for kk, vk in vi do tbl[n][kk] = vk end
    tbl[n][4] = vj
    

    то всё заработает, так как передаются не таблицы?

  3. Еще косяк в 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}}
    

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

  4. Нарисовал такой вот код:

    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?

  5. ИМХО, привязывать замеры времени к какой-либо анимации стоит только тогда больше не к чему привязаться. И то, это способ создать свое событие, а время лучше отдельно вычислять, а не считать, что оно равно величине переданной в "Sleep".

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

  6. опять вы эти Global суете - local поставь - меньше кода и загрузки клиента будет

    Копипаст рулит.

    Да и не в глобалах там дело.

    а еще счетчик сколько километров пройдено, овса съедено и зайцев убито!

    Овёс и зайцы - лишнее, а вот километры - нужны.

  7. С какими "фадеэфектами"?

    Вот с этими:

    вставь по фаде или ротате еффект

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

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

  8. Оффтоп: никто не разобрался, как грамотно убить навязанный в последней обнове 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/

    Он умеет делать и экзешники.

  9. Короче, как-то так. Всего то 10 kB индокода. :)

    На гуй пока забил. Как снизойдет вдохновение - может допилю. А заодно, поубавлю количество индусов в коде.

    X9ZJ3.jpg

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

    • Плюсую 1
×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования