Счётчик Хендлов на WURST

Ребят, попытался переделать счётчик хендлов с vjass на WURST, но ничего не создаётся, что я сделал не так?
» Код
package HandlerTest

import ClosureTimers

public location array P
public leaderboard array HB

init
    doAfter(0.01) ->
        integer i = 0
        integer id = 0
        real result = 0

        for p = 0 to 12
            HB[p] = CreateLeaderboard()
            LeaderboardSetLabel(HB[p],"Handle Counter")
            PlayerSetLeaderboard(players[p],HB[p])
            LeaderboardDisplay(HB[p],true)
            LeaderboardAddItem(HB[p],"Handles",0,players[p])
            LeaderboardSetSizeByItemCount(HB[p],1)
            doPeriodically(0.05) hc ->
                while i >= 50
                    i = 1 + 1
                    P[i] = Location(0,0)
                    id = GetHandleId(P[i])
                    result = result + (id - 0x100000)
                result = result / i - i / 2
                while i <= 1
                    RemoveLocation(P[i])
                    P[i] = null
                    i = i-1
                LeaderboardSetItemValue(HB[p],0,R2I(result))
» Делал на основе этого счётчика
library HC initializer init
    globals
        leaderboard HB
    endglobals
    private function HCU takes nothing returns nothing
        local integer i = 0
        local integer id
        local location array P
        local real result = 0
        loop
            exitwhen i >= 50
            set i = i+1
            set P[i] = Location(0,0)
            set id = GetHandleId(P[i])
            set result = result+(id-0x100000)
        endloop
        set result = result/i-i/2
        loop
            call RemoveLocation(P[i])
            set P[i] = null
            exitwhen i <= 1
            set i = i-1
        endloop
        call LeaderboardSetItemValue(HB,0,R2I(result))
    endfunction

    private function HCA takes nothing returns nothing
        set HB = CreateLeaderboard()
        call LeaderboardSetLabel(HB,"Handle Counter")
        call PlayerSetLeaderboard(GetLocalPlayer(),HB)
        call LeaderboardDisplay(HB,true)
        call LeaderboardAddItem(HB,"Handles",0,Player(0))
        call LeaderboardSetSizeByItemCount(HB,1)
        call HCU()
        call TimerStart(GetExpiredTimer(),.05,true,function HCU)
    endfunction

    private function init takes nothing returns nothing
        call TimerStart(CreateTimer(),0,false,function HCA)
    endfunction
endlibrary

Ответ

У тебя локалки объявлены выше скоупом, чем doPeriodically и используются всеми таймерами сразу (или не используются вообще, если в вурст нет замыканий).


Views: 108

rsfghd #1 - 3 weeks ago 1
Голосов: +1 / -0
можешь попробовать сделать через оригинал, а не слепленную мной кашу
его и переносил на вджасс для удобства

я не особо разбираюсь в вурсте, но лидерборд нельзя же создавать при инициализации, нужна задержка в 0.00 секунд, у меня там таймер создавался
Прикрепленные файлы
Стас Орлов #2 - 3 weeks ago (изм. ) 0
Голосов: +0 / -0
rsfghd, я поменял код немного, теперь лидербоард создаётся, но значение не меняется с 0
rsfghd #3 - 3 weeks ago 1
Голосов: +1 / -0
я так понимаю у тебя цикл от 0 до 12, в котором появился периодичный цикл каждые 0.05 секунд?
то есть цикл для других игроков срабатывать не должен по идее, если у тебя не создаются отдельные потоки на игроков

впрочем даже если это не так и с этим всё норм, мои полномочия на этом всё)
Стас Орлов #4 - 3 weeks ago 0
Голосов: +0 / -0
я так понимаю у тебя цикл от 0 до 12, в котором появился периодичный цикл каждые 0.05 секунд?
да
то есть цикл для других игроков срабатывать не должен по идее, если у тебя не создаются отдельные потоки на игроков
Почему? Цикл от 0 до 12 для того и создан, чтобы отдельно для каждого игрока и его лидерборда считались хендлы, разве так нельзя?
rsfghd #5 - 3 weeks ago 1
Голосов: +1 / -0
цикл это цикл, поток это поток
если у тебя в цикле бесконечный цикл то он никогда не закончится и для других игроков их цикл не начнётся

к тому же бесконечный цикл вроде как должен прерывать поток, после лимита операций, но мб вурсту всё равно на оп лимит

doPeriodically(0.05) hc -> это цикл с вейтом или таймер на функцию?
Стас Орлов #6 - 3 weeks ago 0
Голосов: +0 / -0
doPeriodically(0.05) hc -> это цикл с вейтом или таймер на функцию?
Execute an action periodically. The callback has to be destroyed manually.
Example use: | doPeriodically(0.5) cb -> | if i > 10 | destroy cb
function doPeriodically(real time, CallbackPeriodic cb) returns CallbackPeriodic
defined in package ClosureTimers

Вот что написано о нём

Я понял, что всё, что происходит после doPeriodically(0.05) hc -> не работает
rsfghd #7 - 3 weeks ago 1
Голосов: +1 / -0
ну судя по всему там вызывается функция в которую твои локалки никак не передаются и оно не может работать с ними

впрочем я закругляюсь, а то мне кажется что уже чушь несу, пусть кто-то, кто хоть раз открывал вурст помогает)

посмотреть бы как в джасс оно компилируется
quq_CCCP #8 - 3 weeks ago 0
Голосов: +0 / -0
Зачем, а главное посему именно wurst? Готовое на жассе есть
GetLocalPlayer #9 - 3 weeks ago 2
Голосов: +2 / -0
Прости что не отвечаю на вопрос а просто задаю встречный, а зачем тебе счетчик хэндлов на Wurst?. Счетчик хэндлов быть может полезен для проверки если ты где-то забыл обнулить локальную переменную или используешь утечные BJ-функции, которые втихую плодят объекты. Но Wurst обнуляет локальные переменные автоматически, а со стандартной библиотекой BJ-функции едва ли нужны. В счетчике хэндлов на Wurst едва ли есть смысл.
ScorpioT1000 #10 - 3 weeks ago (изм. ) 0
Голосов: +0 / -0

У тебя локалки объявлены выше скоупом, чем doPeriodically и используются всеми таймерами сразу (или не используются вообще, если в вурст нет замыканий).
Стас Орлов #11 - 3 weeks ago 0
Голосов: +0 / -0
GetLocalPlayer, карта изначально была не на вурст, а на гуи, и очень сильно лагает, хочу посмотреть на сколько всё плохо

А если точнее. то в какой-то момент карта застывает и я хочу посмотреть, может в какой-то момент утечки сильно увеличиваются
rsfghd #12 - 3 weeks ago 1
Голосов: +1 / -0
Стас Орлов, если работаешь с вурстом то синтаксис джасса нельзя использовать или что?)
ArhiMEN #13 - 3 weeks ago 0
Голосов: +0 / -0
rsfghd, не понял вопрос
rsfghd #14 - 3 weeks ago 1
Голосов: +1 / -0
ArhiMEN, забей в гугл что такое синтаксис
Стас Орлов #15 - 3 weeks ago 0
Голосов: +0 / -0
Решил проблему
Vlod #16 - 3 weeks ago 2
Голосов: +2 / -0
Стас Орлов, укажите пожалуйста полное решение как ответ
ArhiMEN #17 - 3 weeks ago (изм. ) 0
Голосов: +0 / -0
В while поменял местами числа условия и перенёс в таймер переменные
ScorpioT1000 #18 - 3 weeks ago 0
Голосов: +0 / -0
Оно и было сказано выше)