ScopteRectuS #1 - 3 дня назад (отредактировано ) 0

» WarCraft 3 / Как узнать кол-во единиц атаки у юнита?

то есть это у него нет чего надо
Я имел ввиду, что у него нет базы данных, хоть я и понял, что имелось ввиду другое..
ScopteRectuS #2 - 3 дня назад (отредактировано ) 0
ScopteRectuS #3 - 3 дня назад 0

» WarCraft 3 / Иконки на заказ

EHP_Sequence, потому что нужно устанавливать две версии: включенную и отключенную.
ScopteRectuS #5 - 6 дней назад 1

» WarCraft 3 / Триггерный бафф

Не особо смотрел раньше в сторону структур, хотя может и зря, но проблема то в основном с ссылкой на функцию, так как тип code с массивом не работает.
Можно использовать function interface вместо code array, в нём можно сохранять даже функции, которые требуют что-то.
ScopteRectuS #6 - 1 неделю назад 8

» WarCraft 3 / WARCRAFT III Помогите!!! JASS: Syntax error!!!

Мне кажется, что не хватает ключевого слова call перед "s__recepts_try(receptlist,it , u)"
ScopteRectuS #7 - 1 неделю назад 0
ScopteRectuS #8 - 1 неделю назад 2

» WarCraft 3 / Помощь в избавлении от BJ


//===========================================================================
function Trig_Suriken_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A01G'
endfunction

//===========================================================================
function Move takes nothing returns nothing
    local timer    t        = GetExpiredTimer()
    local integer  id       = GetHandleId( t )
    
    local unit     caster   = LoadUnitHandle( udg_Hash, id, 1 )
    local unit     suriken  = LoadUnitHandle( udg_Hash, id, 2 )
    local real     surikenX = LoadReal( udg_Hash, id, 7 )
    local real     surikenY = LoadReal( udg_Hash, id, 8 )
    
    local real     targetX  = LoadReal( udg_Hash, id, 3 )
    local real     targetY  = LoadReal( udg_Hash, id, 4 )

    local real     time     = LoadReal   ( udg_Hash, id, 6 )

    local real     dx       = targetX - surikenX
    local real     dy       = targetY - surikenY
    local real     dist     = SquareRoot( dx * dx + dy * dy )
    
    local group    pool     = CreateGroup( )
    local unit     g        = null

    call SaveReal( udg_Hash, id, 6, time + 0.02 )
    
    call GroupEnumUnitsInRange( pool, surikenX, surikenY, 150.00, null )
    loop
        set g = FirstOfGroup( pool )
        exitwhen ( g == null )
        if IsUnitEnemy( g, GetOwningPlayer( caster ) ) then
            call UnitDamageTarget( caster, g, 40.00, false, false, null, null, null )
        endif
        call GroupRemoveUnit( pool, g )
    endloop


    if ( time <= 1.7 ) and ( dist > 16.0 ) then
        set surikenX = ( surikenX + 20.0 * ( dx / dist ) )
        set surikenY = ( surikenY + 20.0 * ( dy / dist ) )

        call SetUnitPosition( suriken, surikenX, surikenY )
        call SaveReal      ( udg_Hash, id, 7, surikenX )
        call SaveReal      ( udg_Hash, id, 8, surikenY )

    elseif ( dist < 16.0 ) and ( time <= 3.4 ) then
        call DestroyTimer( t )
        call KillUnit( suriken )
        call RemoveUnit(suriken)
        call FlushChildHashtable( udg_Hash, id )

    elseif ( time <= 3.4 ) or ( dist > 16.0 ) then
        set surikenX = ( surikenX + 20.0 * ( dx / dist ) )
        set surikenY = ( surikenY + 20.0 * ( dy / dist ) )

        call SetUnitPosition( suriken, surikenX, surikenY )
        call SaveReal      ( udg_Hash, id, 3, GetUnitX( caster ) )
        call SaveReal      ( udg_Hash, id, 4, GetUnitY( caster ) )
        call SaveReal      ( udg_Hash, id, 7, surikenX           )
        call SaveReal      ( udg_Hash, id, 8, surikenY           )

    else
        call DestroyTimer( t )
        call KillUnit( suriken )
        call RemoveUnit(suriken)
        call FlushChildHashtable( udg_Hash, id )
    endif

    call DestroyGroup( pool )
    
    set t       = null
    set caster  = null
    set suriken = null
    set pool    = null
endfunction

//===========================================================================
function Trig_Suriken_Actions takes nothing returns nothing
    local timer   t        = CreateTimer( )
    local integer id       = GetHandleId( t )
    
    local unit    caster   = GetSpellAbilityUnit( )
    local real    casterX  = GetUnitX( caster )
    local real    casterY  = GetUnitY( caster )
    
    local real    targetX  = GetSpellTargetX( )
    local real    targetY  = GetSpellTargetY( )

    local unit    suriken  = CreateUnit( GetOwningPlayer( caster ), 'u001', casterX, casterY, 0.0 )
    
    local real    angle    = Atan2( targetY - casterY, targetX - casterX )

    set targetX = GetUnitX( caster ) + 2000.0 * Cos( angle )
    set targetY = GetUnitY( caster ) + 2000.0 * Sin( angle )

    call SaveUnitHandle( udg_Hash, id, 1, caster  )
    call SaveUnitHandle( udg_Hash, id, 2, suriken )
    call SaveReal      ( udg_Hash, id, 3, targetX )
    call SaveReal      ( udg_Hash, id, 4, targetY )
    call SaveReal      ( udg_Hash, id, 6, 0.0     )
    call SaveReal      ( udg_Hash, id, 7, casterX )
    call SaveReal      ( udg_Hash, id, 8, casterY )

    call TimerStart( t, 0.02, true, function Move )

    set t       = null
    set caster  = null
    set suriken = null
endfunction

//===========================================================================
function InitTrig_Suriken_2 takes nothing returns nothing
    set gg_trg_Suriken_2 = CreateTrigger( )
    set udg_Hash = InitHashtable( )
        
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Suriken_2, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Suriken_2, Condition( function Trig_Suriken_Conditions ) )
    call TriggerAddAction( gg_trg_Suriken_2, function Trig_Suriken_Actions )
endfunction
ScopteRectuS #9 - 2 недели назад (отредактировано ) 0

» WarCraft 3 / Круг выбора

UrsaBoss, очень похожа, но это не та же самая модель.
ScopteRectuS #10 - 2 недели назад (отредактировано ) 0

» WarCraft 3 / Круг выбора

8gabriel8, я хотел узнать, где можно скачать такую же.
ScopteRectuS #11 - 2 недели назад 0

» WarCraft 3 / Удаление спецэффекта с null'евым путем к моделе

Сравните такой эффект с null. Если равно, то и удалять нечего.
ScopteRectuS #12 - 2 недели назад 0

» WarCraft 3 / Сustomize Editor Categories

PT153, система установлена на диске С.
В принципе проблема не такая уж и важная, если не удаётся решить, то и бог с ней. Сортировка в РО всё равно ничего не даёт.
ScopteRectuS #13 - 2 недели назад (отредактировано ) 0

» WarCraft 3 / Сustomize Editor Categories

PT153,
D:\Program Files (x86)\NewGen
D:\Program Files (x86)\WarCraft 3 Frozen Throne (1.26)
ScopteRectuS #14 - 2 недели назад 0

» WarCraft 3 / Сustomize Editor Categories

PT153, не помогло. (
P.S: заметил, что ошибка "Cannot start plugin" перестаёт появляться, если запустить редактор с правами администратора. Но изменений в РО всё равно нету.
ScopteRectuS #15 - 2 недели назад 9

» WarCraft 3 / Как сделать проверку на то, состоит ли юнит в отряде?

constant native IsUnitInGroup (unit whichUnit, group whichGroup) returns boolean
ScopteRectuS #16 - 2 недели назад 0

» WarCraft 3 / Сustomize Editor Categories

nvc123, нет, ошибка "Cannot start plugin" появляется и при отключении, и при включении этих кнопок. От перезапуска ничего не меняется.
ScopteRectuS #17 - 2 недели назад (отредактировано ) 0

» WarCraft 3 / Сustomize Editor Categories

nvc123, так изменения не приняты же, перезапуск ничего не даст. У меня проблемы с самим редактором походу, переустановка не помогает.
Ошибка "Can not start plugin" у меня уже давно и я не придавал ей значения.
+ в игровом интерфейсе у меня настройки шрифтов отсутствуют.
» это окно открывается 5+ сек, хотя раньше открывалось мгновенно:
прикреплены файлы
ScopteRectuS #18 - 2 недели назад 0

» WarCraft 3 / Сustomize Editor Categories

К слову, ошибка "Cannot start plugin" выскакивает при изменении любых параметров во вкладке UMSWE.
прикреплены файлы
ScopteRectuS #19 - 2 недели назад 0

» WarCraft 3 / Сustomize Editor Categories

Почему у меня не вносятся изменения, а выдает ошибку:
А в самом редакторе нет изменений:
прикреплены файлы
ScopteRectuS #20 - 3 недели назад 1

» WarCraft 3 / Скорость дамми юнита

noyl, косинус и синус суммы текущего угла и угловой скорости.
ScopteRectuS #21 - 4 недели назад (отредактировано ) 0

» WarCraft 3 / Область с формой треугольника

Atesla, ну функция IsAngleBetweenAngles сюда, если я правильно, подходит.
IsAngleBetweenAngles( угол BOK, угол BОС, угол BОD ) and ( DistanceBetweenPoints(точка О, точка К) < SPELL_RADIUS )
прикреплены файлы
ScopteRectuS #22 - 4 недели назад (отредактировано ) 0

» WarCraft 3 / Область с формой треугольника

Если конусная способность на подобии тёмной стаи, то можно использовать эту функцию из сайта:
// Возвращает true : Если угол находится между двумя углами
function IsAngleBetweenAngles takes real angle, real angle1, real angle2 returns boolean
    local real x
    set angle = ModuloReal(angle, 360)
    set angle1 = ModuloReal(angle1, 360)
    set angle2 = ModuloReal(angle2, 360)
    if (angle1 > angle2) then
        set x = angle1
        set angle1 = angle2
        set angle2 = x
    endif
    if (angle2 - angle1) > (angle1 - (angle2-360)) then
        set angle2 = angle2 - 360
        if angle > 180 then
            set angle = angle-360
        endif
        return angle >= angle2 and angle <= angle1
    endif
    return (angle >= angle1) and (angle <= angle2)
endfunction
ScopteRectuS #23 - 4 недели назад 0

» WarCraft 3 / Область с формой треугольника

Можно проверить суммой площадей, если сумма 3-ех треугольников, образованных этой точкой равны площади изначального треугольника, то скорее всего точка принадлежит треугольнику.
Вот еще.
ScopteRectuS #24 - 4 недели назад 0

» WarCraft 3 / Как знать Id любой абилки которую применил?

Карта крашится
Значит что-то неправильно делаете.
ScopteRectuS #25 - 4 недели назад (отредактировано ) 1

» WarCraft 3 / Как знать Id любой абилки которую применил?

//      Convert a integer id value into a 4-letter id code.
function DebugIdInteger2IdString takes integer value returns string
    local string charMap = ".................................!.#$%&'()*+,-./0123456789:;<=>.@ABCDEFGHIJKLMNOPQRS​TUVWXYZ[.]^_`abcdefghijklmnopqrstuvwxyz{|}~.........................................................​........................................................................"
    local string result = ""
    local integer remainingValue = value
    local integer charValue
    local integer byteno
    set byteno = 0
    loop
        set charValue = ModuloInteger(remainingValue, 256)
        set remainingValue = remainingValue / 256
        set result = SubString(charMap, charValue, charValue + 1) + result

        set byteno = byteno + 1
        exitwhen byteno == 4
    endloop
    return result
endfunction
Custom Script: call BJDebugMsg("Ability Name: " + GetObjectName(GetSpellAbilityId()))
Custom Script: call BJDebugMsg("Ability Id: " + DebugIdInteger2IdString(GetSpellAbilityId()))
ScopteRectuS #26 - 4 недели назад 0

» WarCraft 3 / Моноширинный шрифт

Никто не знает что ли?
ScopteRectuS #27 - 4 недели назад 0

» WarCraft 3 / Не перемещается область для события. Что делать?

Потому что событие вешается на регион, а вы перемещаете область.
ScopteRectuS #28 - 1 месяц назад 4
ScopteRectuS #29 - 1 месяц назад 2

» WarCraft 3 / Утечное событие?

Утечка - это когда не удаляются ненужные объекты. Здесь регион нельзя удалять, потому что без него событие не будет работать. Но если у вас много таких событий, то лучше использовать один регион для всех событий, при условии, что размеры региона не будут изменяться в процессе игры, потому что это может нарушить работу других событий, привязанных к данному региону.
А функция TriggerRegisterEnterRectSimple в теории не утечна, но на практике может утекать, например, если в потоке триггера будет вызвано её уничтожение RemoveRegion(GetTriggeringRegion()).
ScopteRectuS #30 - 1 месяц назад 0

» WarCraft 3 / Триггерное количество еды

Нужно добавить struct Food extends array, так не будут создаваться ненужные allocate/deallocate функции, которые здесь не используются.
ScopteRectuS #31 - 1 месяц назад 0

» WarCraft 3 / GetRealId( )

PT153, Я не имел ввиду, что это мемхак, а то что функцию я брал из библиотеки Typecast, которая прилагается к мемхаку.
Чтобы понять это, придётся прочитать всё вышенаписанное.
ScopteRectuS #32 - 1 месяц назад (отредактировано ) 0

» WarCraft 3 / GetRealId( )

Сделал следующим образом:
» раскрыть
	function interface callback takes integer this returns nothing defaults nothing


    struct linkedList

        private static timer    period      = null
        private        real     curTimeout
        private        real     timeout
        private        thistype prev
        private        thistype next
        private        callback handlerFunc


		static constant method operator listPeriod takes nothing returns real
            return 0.01
        endmethod


        method destroy takes nothing returns nothing
            set this.prev.next = this.next
            set this.next.prev = this.prev

            if (thistype(0).next == thistype(0)) then
                call PauseTimer(this.period)
            endif

            call thistype.deallocate(this)
        endmethod


        private static method iterate takes nothing returns nothing
            local thistype this = thistype(0).next

            loop
                exitwhen (this == thistype(0))

                set this.curTimeout = this.curTimeout + thistype.listPeriod

                if (this.curTimeout >= this.timeout) then
                    set this.curTimeout = 0.0
                    call this.handlerFunc.evaluate(integer(this))
                endif

                set this = this.next
            endloop
        endmethod


        static method create takes real timeout, callback handlerFunc returns thistype
            local thistype this = thistype.allocate()

            set this.next        = thistype(0)
            set this.prev        = thistype(0).prev
            set this.next.prev   = this
            set this.prev.next   = this
            set this.timeout     = timeout
            set this.curTimeout  = 0.0
            set this.handlerFunc = handlerFunc

            if (thistype.period == null) then
                set thistype.period = CreateTimerEx()
            endif

            if (this.prev == thistype(0)) then
                call TimerStart(thistype.period, thistype.listPeriod, true, function thistype.iterate)
            endif

            return this
        endmethod


    endstruct
Будет ли это создавать большую нагрузку на игру из-за низкого периода таймера, несмотря на то, что таймер хоть и работает с низкой частотой, он ничего толком то и не делает, кроме арифметических вычислений?
ScopteRectuS #33 - 1 месяц назад 0

» WarCraft 3 / Не воспроизводится музыка (SetMapMusic())

Может в настройках игры музыка отключена?
ScopteRectuS #34 - 1 месяц назад 0

» WarCraft 3 / Как сделать первый удар с крита?

easypeasy, хм, и вправду не идёт...Тогда не знаю.((
ScopteRectuS #35 - 1 месяц назад 0
ScopteRectuS #36 - 1 месяц назад 0

» WarCraft 3 / Как сделать первый удар с крита?

easypeasy, Cобытие "Юнит атакован" срабатывает в момент начала атаки, а не в момент получения удара. А будет ли удар критическим или нет, высчитывается еще до начала события "Юнит атакован". В вашем случае удар не критический потому что способность добавляется уже после того, как игра решит, будет ли удар критическим или нет. Поэтому я порекомендовал перезапустить атаку юниту, чтобы новый замах шёл с уже добавленной способностью.
ScopteRectuS #37 - 1 месяц назад 0

» WarCraft 3 / Как сделать первый удар с крита?

PrincePhoenix, ну, я подумал, что временное отключение триггера - это само собой разумеющееся.
ScopteRectuS #38 - 1 месяц назад 2

» WarCraft 3 / Как сделать первый удар с крита?

Нужно отменить атаку, а потом снова дать приказ на атаку.
, когда триггер сработает.
ScopteRectuS #39 - 1 месяц назад (отредактировано ) 0

» WarCraft 3 / Описание предмета

ssbbssc, не проверял, но думаю, что Ctrl + Enter занимает меньше, т. к. ставится всего лишь один символ.
ScopteRectuS #40 - 1 месяц назад 6

» WarCraft 3 / Описание предмета

|n - переход на новую строку
Ctrl + Enter - тоже переход
ScopteRectuS #41 - 2 месяца назад (отредактировано ) 0

» WarCraft 3 / Jass заклинание Комбо

Hanuman, где именно не понятно?
ScopteRectuS #42 - 2 месяца назад 3

» WarCraft 3 / Jass заклинание Комбо

Нет, не сложно. Всего лишь нужно сохранить копию куда-нибудь и отлавливать касты оригинала, после отлова отдавать такой же приказ на каст, но уже копие.
ScopteRectuS #43 - 2 месяца назад 2

» WarCraft 3 / Как дать герою предмет изначально? (не через Jass)

ClotPh, там свиток даётся только первому юниту, если не изменить значение переменной.
globals
	integer bj_MELEE_MAX_TWINKED_HEROES = 0
endglobals

function MeleeGrantItemsToHero takes unit whichUnit returns nothing
    local integer owner   = GetPlayerId(GetOwningPlayer(whichUnit))

    // If we haven't twinked N heroes for this player yet, twink away.
    if (bj_meleeTwinkedHeroes[owner] < bj_MELEE_MAX_TWINKED_HEROES) then
        call UnitAddItemById(whichUnit, 'stwp')
        set bj_meleeTwinkedHeroes[owner] = bj_meleeTwinkedHeroes[owner] + 1
    endif
endfunction

function MeleeGrantItemsToTrainedHero takes nothing returns nothing
    call MeleeGrantItemsToHero(GetTrainedUnit())
endfunction

function MeleeGrantHeroItems takes nothing returns nothing
    local integer index
    local trigger trig

    // Initialize the twinked hero counts.
    set index = 0
    loop
        set bj_meleeTwinkedHeroes[index] = 0

        set index = index + 1
        exitwhen index == bj_MAX_PLAYER_SLOTS
    endloop

    // Register for an event whenever a hero is trained, so that we can give
    // him/her their starting items.
    set index = 0
    loop
        set trig = CreateTrigger()
        call TriggerRegisterPlayerUnitEvent(trig, Player(index), EVENT_PLAYER_UNIT_TRAIN_FINISH, filterMeleeTrainedUnitIsHeroBJ)
        call TriggerAddAction(trig, function MeleeGrantItemsToTrainedHero)

        set index = index + 1
        exitwhen index == bj_MAX_PLAYERS
    endloop

    // Register for an event whenever a neutral hero is hired, so that we
    // can give him/her their starting items.
    set trig = CreateTrigger()
    call TriggerRegisterPlayerUnitEvent(trig, Player(PLAYER_NEUTRAL_PASSIVE), EVENT_PLAYER_UNIT_SELL, filterMeleeTrainedUnitIsHeroBJ)
    call TriggerAddAction(trig, function MeleeGrantItemsToHiredHero)

    // Flag that we are giving starting items to heroes, so that the melee
    // starting units code can create them as necessary.
    set bj_meleeGrantHeroItems = true
endfunction
ScopteRectuS #44 - 2 месяца назад (отредактировано ) 0

» RenderEdge / [RenderEdge] Memory Hack

Сори за нубский вопрос, только начал разбираться с RenderEdge.
Как задавать координаты, например для функции EditUpperButtonBarButton( ), задаю свои координаты, a кнопка улетает не пойму куда. ANCHOR_TOPRIGHT, ANCHOR_BOTTOM, ANCHOR_RIGHT и т.д. - это точки, откуда отсчитываются координаты?
В прилагаемой карте есть функции FromPixelX( ), FromPixelY( )..., которые используются в функции EditStandardInterface( ). Правильно ли я понял, что эти функции локальные и у каждого игрока кнопки будут настроены относительно их разрешений экрана?
Также карта критует во время загрузки, если в коде есть ! inject main.

UPD: понял, это не координаты, а проценты, как у мультибоарда.
ScopteRectuS #45 - 2 месяца назад 5

» WarCraft 3 / Новый редактор

Darkew, отвечает за то, будет ли урон от предметов учитываться для критического удара.
ScopteRectuS #46 - 2 месяца назад 1

» WarCraft 3 / GetRealId( )

Попробовал return bug, возвращает уникальные значения у real'ов, имеющих 31 символа после запятой, после 32 символа начинает возвращать 0:
function realToInteger takes real r returns integer
    loop
        return r
    endloop
    return 0
endfunction
    
    
function func_name takes nothing returns nothing
    call BJDebugMsg( I2S( realToInteger( 0.12345 ) ) )                             // return 1039979357
    call BJDebugMsg( I2S( realToInteger( 0.123456 ) ) )                            // return 1039980161
    call BJDebugMsg( I2S( realToInteger( 0.1234567 ) ) )                           // return 1039980256
    call BJDebugMsg( I2S( realToInteger( 0.12345678 ) ) )                          // return 1039980265
    call BJDebugMsg( I2S( realToInteger( 0.123456789 ) ) )                         // return 1039980266
    call BJDebugMsg( I2S( realToInteger( 0.1234567890 ) ) )                        // return ...
    call BJDebugMsg( I2S( realToInteger( 0.12345678901 ) ) )                       // return ...
    call BJDebugMsg( I2S( realToInteger( 0.123456789012 ) ) )                      // return ...
    call BJDebugMsg( I2S( realToInteger( 0.1234567890123 ) ) )                     // return ...
    call BJDebugMsg( I2S( realToInteger( 0.12345678901234 ) ) )                    // return ...
    call BJDebugMsg( I2S( realToInteger( 0.123456789012345 ) ) )                   // return ...
    call BJDebugMsg( I2S( realToInteger( 0.1234567890123456 ) ) )                  // return ...
    call BJDebugMsg( I2S( realToInteger( 0.12345678901234567 ) ) )                 // return ...
    call BJDebugMsg( I2S( realToInteger( 0.123456789012345678 ) ) )                // return ...
    call BJDebugMsg( I2S( realToInteger( 0.1234567890123456789 ) ) )               // return ...
    call BJDebugMsg( I2S( realToInteger( 0.12345678901234567890 ) ) )              // return ...
    call BJDebugMsg( I2S( realToInteger( 0.123456789012345678901 ) ) )             // return ...
    call BJDebugMsg( I2S( realToInteger( 0.1234567890123456789012 ) ) )            // return ...
    call BJDebugMsg( I2S( realToInteger( 0.12345678901234567890123 ) ) )           // return ...
    call BJDebugMsg( I2S( realToInteger( 0.123456789012345678901234 ) ) )          // return ...
    call BJDebugMsg( I2S( realToInteger( 0.1234567890123456789012345 ) ) )         // return ...
    call BJDebugMsg( I2S( realToInteger( 0.12345678901234567890123456 ) ) )        // return ...
    call BJDebugMsg( I2S( realToInteger( 0.123456789012345678901234567 ) ) )       // return ...
    call BJDebugMsg( I2S( realToInteger( 0.1234567890123456789012345678 ) ) )      // return -1065120231
    call BJDebugMsg( I2S( realToInteger( 0.12345678901234567890123456789 ) ) )     // return -1080887466
    call BJDebugMsg( I2S( realToInteger( 0.123456789012345678901234567890 ) ) )    // return  1067220501
    call BJDebugMsg( I2S( realToInteger( 0.1234567890123456789012345678901 ) ) )   // return -1108908349
    call BJDebugMsg( I2S( realToInteger( 0.12345678901234567890123456789012 ) ) )  // return  0
    call BJDebugMsg( I2S( realToInteger( 0.123456789012345678901234567890123 ) ) ) // return  0
ScopteRectuS, также, что удивительно, одинаковые числа, но имеющие разное кол-во введённых символов выдают разные числа:
    call BJDebugMsg( I2S( realToInteger( 0.12345678901234567890123456789 ) ) )     // return -1080887466
    call BJDebugMsg( I2S( realToInteger( 0.123456789012345678901234567890 ) ) )    // return  1067220501
ScopteRectuS #47 - 2 месяца назад (отредактировано ) 0

» WarCraft 3 / GetRealId( )

Идея со структурой мне показалось очень интересной, но увы, не работает.
» раскрыть
	struct timeout
        private real     period
        private thistype prev
        private thistype next

        private static method inStock takes real period returns thistype
            local  thistype  this  =  thistype( 0 ).next
            loop
                exitwhen ( this == thistype( 0 ) ) or ( this.period == period )
                set  this  =  this.next
            endloop
            return this
        endmethod

        static method create takes real period returns thistype
            local thistype this = thistype.inStock( period )
            call BJDebugMsg( "inStock" + I2S( this ) )
            if ( this == thistype( 0 ) ) then
                set this             = thistype.allocate( )
                set this.next        = thistype( 0 )
                set this.prev        = thistype( 0 ).prev
                set this.next.prev   = this
                set this.prev.next   = this
                set this.period      = period
            endif
            return this
        endmethod
    endstruct
В методе inStock, если идёт сравнение 0,03125 и 0,03126, то игра считает, что это одинаковые числа.

Fakov, такая, что максимальный размер массива 8192, что есть четырёхзначное число.
Это неважно, мне не обязательно хранить в массиве, поэтому ограничения 8192 нет. Можно просто:
SaveHandle( hash, randomKey, R2I( real ), handle ), главное, чтобы R2I( ) возвращал уникальные значения для каждого real'a.
ScopteRectuS #48 - 2 месяца назад 0

» WarCraft 3 / GetRealId( )

Clamp, я же написал:
GetLocalPlayer, проверил, R2S( ) округляет. R2S( 0.03125 ) > "0.031"
call BJDebugMsg( I2S( StringHash( R2S( 0.03125 ) ) ) ) == -1331723389
call BJDebugMsg( I2S( StringHash( R2S( 0.03126 ) ) ) ) == -1331723389
ScopteRectuS #49 - 2 месяца назад (отредактировано ) 0

» WarCraft 3 / GetRealId( )

Clamp, всё равно, даже если это будет более ресурсозатратным, чем простое создание и удаление таймеров, хотелось бы довести свое дело до конца.
Я бы сказал, что мною движет желание это сделать больше, чем оптимизация кода.
ScopteRectuS #50 - 2 месяца назад 0

» WarCraft 3 / GetRealId( )

Clamp, и экономить, и просто сделать. Да и код становится более читабелен, написал одну функцию и всё, не нужно ничего крепить, создавать, запускать...