Ребят, попытался переделать счётчик хендлов с 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 и используются всеми таймерами сразу (или не используются вообще, если в вурст нет замыканий).
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
27
3 года назад
1
можешь попробовать сделать через оригинал, а не слепленную мной кашу
его и переносил на вджасс для удобства

я не особо разбираюсь в вурсте, но лидерборд нельзя же создавать при инициализации, нужна задержка в 0.00 секунд, у меня там таймер создавался
Загруженные файлы
0
12
3 года назад
Отредактирован Стас Орлов
0
rsfghd, я поменял код немного, теперь лидербоард создаётся, но значение не меняется с 0
1
27
3 года назад
1
я так понимаю у тебя цикл от 0 до 12, в котором появился периодичный цикл каждые 0.05 секунд?
то есть цикл для других игроков срабатывать не должен по идее, если у тебя не создаются отдельные потоки на игроков

впрочем даже если это не так и с этим всё норм, мои полномочия на этом всё)
0
12
3 года назад
0
я так понимаю у тебя цикл от 0 до 12, в котором появился периодичный цикл каждые 0.05 секунд?
да
то есть цикл для других игроков срабатывать не должен по идее, если у тебя не создаются отдельные потоки на игроков
Почему? Цикл от 0 до 12 для того и создан, чтобы отдельно для каждого игрока и его лидерборда считались хендлы, разве так нельзя?
1
27
3 года назад
1
цикл это цикл, поток это поток
если у тебя в цикле бесконечный цикл то он никогда не закончится и для других игроков их цикл не начнётся

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

doPeriodically(0.05) hc -> это цикл с вейтом или таймер на функцию?
0
12
3 года назад
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 -> не работает
1
27
3 года назад
1
ну судя по всему там вызывается функция в которую твои локалки никак не передаются и оно не может работать с ними

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

посмотреть бы как в джасс оно компилируется
0
32
3 года назад
0
Зачем, а главное посему именно wurst? Готовое на жассе есть
2
17
3 года назад
2
Прости что не отвечаю на вопрос а просто задаю встречный, а зачем тебе счетчик хэндлов на Wurst?. Счетчик хэндлов быть может полезен для проверки если ты где-то забыл обнулить локальную переменную или используешь утечные BJ-функции, которые втихую плодят объекты. Но Wurst обнуляет локальные переменные автоматически, а со стандартной библиотекой BJ-функции едва ли нужны. В счетчике хэндлов на Wurst едва ли есть смысл.
0
37
3 года назад
Отредактирован ScorpioT1000
0
У тебя локалки объявлены выше скоупом, чем doPeriodically и используются всеми таймерами сразу (или не используются вообще, если в вурст нет замыканий).
Принятый ответ
0
12
3 года назад
0
GetLocalPlayer, карта изначально была не на вурст, а на гуи, и очень сильно лагает, хочу посмотреть на сколько всё плохо

А если точнее. то в какой-то момент карта застывает и я хочу посмотреть, может в какой-то момент утечки сильно увеличиваются
1
27
3 года назад
1
Стас Орлов, если работаешь с вурстом то синтаксис джасса нельзя использовать или что?)
0
11
3 года назад
0
rsfghd, не понял вопрос
1
27
3 года назад
1
ArhiMEN, забей в гугл что такое синтаксис
0
12
3 года назад
0
Решил проблему
2
17
3 года назад
2
Стас Орлов, укажите пожалуйста полное решение как ответ
0
11
3 года назад
Отредактирован ArhiMEN
0
В while поменял местами числа условия и перенёс в таймер переменные
0
37
3 года назад
0
Оно и было сказано выше)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.