Почему-то данная функция выдаёт слишком много опыта:
function ExpBoost_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local unit h = GetKillingUnit()
    local integer exp = R2I(Pow(10, 1+GetUnitLevel(u) - GetUnitLevel(h)))
    local texttag tt
    call BJDebugMsg(I2S(exp))
    if exp < 1 then 
        set exp = 1
    endif
    if exp >= 15000000 then
        set exp = 15000000
    endif               
    call BJDebugMsg(I2S(exp))
    set tt = CreateTextTagLocBJ( "+"+I2S(exp)+" exp", GetUnitLoc(GetTriggerUnit()), 0, 10, 0.00, 0.00, 100, 0 )
    if ebt1 then
        call UnitAddItemByIdSwapped(0x49303548,h)
        set ebt1 = false
    endif
    call AddHeroXP(h, exp, false)
    call SetTextTagVelocityBJ( tt, 64, 70 )
    call SetTextTagLifespanBJ( tt, 3 )
    call SetTextTagPermanentBJ( tt, false )
    call ShowTextTagForceBJ( true, tt, GetPlayersAll() )
    set u = null
    set h = null
endfunction
Уточню, при превосходстве уровня героя над уровнем убитого юнита она должна выдавать 1 опыта, а выдаёт 15000000. Более того, до урезания опыта она и вовсе выдаёт что-то в районе 2^32. Полагаю, дело в переполнении, но это всё равно очень странно. Ведь значения должны быть около нуля, 10^(-100).
Да, мне интересно почему такое происходит, а варианты с обходом этого бага вроде есть. Например, поставить условия до возведения в степень, для ограничения значений.

Принятый ответ

Не уверен на счёт "больше", так как проблема в таких значениях когда уровень убитого сильно меньше.
Ну так если у убийцы уровень больше, то у убитого уровень меньше, ваш кеп. Конкретные примеры будут?

10^(-100)
Увидел.
Ну так а что вы хотите-то.
local real r = Pow(10, -100 )
call DisplayTextToForce( GetPlayersAll(), R2SW(r, 0, -1))
call DisplayTextToForce( GetPlayersAll(), I2S(R2I(r)))

    local real r
    local integer power = -100
    loop
        set r = Pow(10, power)
        call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 5., "r = " + R2SW(r, 0, -1) + ", power = " + I2S(power))
        exitwhen 0 < r and r < 1
        set power = power + 1
    endloop
Согласно этому, наименьшее положительное число равно 1.17549435e-38. 10^-38 меньше, потому выходит 0. 10^-37 больше, потому цикл остановился. Выведен 0, потому что больше 9 знаков после запятой вар выводить не умеет.
Нужно ещё понимать, что максимальное возможное число равно 3.40282346639e+38, а нам выводится 1.7014144e+40. Одним словом, происходит какая-то непостижимая жесть.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
9
3 года назад
Отредактирован map_maiker
2
Borodach:
Выведи имена и их уровни в строчку, возможно там сбой происходит
Не уверен что понял...
rsfghd:
Я в математике не силен, но попробуй сначала разницу уровней вычитать, если она минусовая, то 1 опыта дать, если плюсовая, то сделать вот ту твою фигню с Pow
Я же написал, что знаю как обойти. Мне интересно почему так происходит.
Так-то я сделал примерно как ты сказал:
local real diff = GetUnitLevel(u) - GetUnitLevel(h)
    local texttag tt
    //call BJDebugMsg(I2S(exp))
    if diff < -5 then 
        set diff = -5.
    endif
    if diff > 7 then
        set diff = 7
    endif     
    set exp = R2I(Pow(10, 1+diff))    
Немного тупо, ну да ладно.
0
28
3 года назад
0
Уточню, при превосходстве уровня героя над уровнем убитого юнита она должна выдавать 1 опыта, а выдаёт 15000000
1.5кк всегда, даже если убийуа на 1 уровень больше?
2
27
3 года назад
Отредактирован rsfghd
2
Загуглил возведение в степень отрицательного числа, там пишут, что при возведении отрицательного числа в четную степень, число станет положительным
2
9
3 года назад
2
1.5кк всегда, даже если убийуа на 1 уровень больше?
Не уверен на счёт "больше", так как проблема в таких значениях когда уровень убитого сильно меньше.
rsfghd:
Загуглил возведение в степень отрицательного числа, там пишут, что при возведении отрицательного числа в четную степень, число станет положительным
Эм... Это-то так, но я возвожу 10 в отрицательную степень. Это эквивалентно делению 1 на 10 в положительной степени. 10^-x = 1/(10^x)
2
27
3 года назад
Отредактирован rsfghd
2
map_maiker, тьфу, я думал там наоборот, число 10 это степень. Мда, потопал я отсюда
0
13
3 года назад
0
Не уверен что понял...
Выводи имя убившего и его уровень, также имя умершего и его уровень. Есть вероятность, что у них разница в уровнях больше 7, в пользу того кто убил
0
9
3 года назад
0
Borodach:
Не уверен что понял...
Выводи имя убившего и его уровень, также имя умершего и его уровень. Есть вероятность, что у них разница в уровнях больше 7, в пользу того кто убил
В оригинальной версии функции (та, что в первом посте) нет числа 7. Там есть ограничение 15кк на максимальный опыт.
1
28
3 года назад
Отредактирован PT153
1
Не уверен на счёт "больше", так как проблема в таких значениях когда уровень убитого сильно меньше.
Ну так если у убийцы уровень больше, то у убитого уровень меньше, ваш кеп. Конкретные примеры будут?

10^(-100)
Увидел.
Ну так а что вы хотите-то.
local real r = Pow(10, -100 )
call DisplayTextToForce( GetPlayersAll(), R2SW(r, 0, -1))
call DisplayTextToForce( GetPlayersAll(), I2S(R2I(r)))

    local real r
    local integer power = -100
    loop
        set r = Pow(10, power)
        call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 5., "r = " + R2SW(r, 0, -1) + ", power = " + I2S(power))
        exitwhen 0 < r and r < 1
        set power = power + 1
    endloop
Согласно этому, наименьшее положительное число равно 1.17549435e-38. 10^-38 меньше, потому выходит 0. 10^-37 больше, потому цикл остановился. Выведен 0, потому что больше 9 знаков после запятой вар выводить не умеет.
Нужно ещё понимать, что максимальное возможное число равно 3.40282346639e+38, а нам выводится 1.7014144e+40. Одним словом, происходит какая-то непостижимая жесть.
Загруженные файлы
Принятый ответ
0
32
3 года назад
0
На сайте же были формулы експы за киллы, дефолтные, взял бы оттуда.
0
9
3 года назад
0
PT153, спасибо.
quq_CCCP:
На сайте же были формулы експы за киллы, дефолтные, взял бы оттуда.
Да просто долго качаться со стандартными формулами.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.