32

» WarCraft 3 / Хеш таблица, childKey?

Daniil18, массивы быстрее, да и обращение к ним проще, только 1 целое число о 0 до 8191.
Структуры как раз и удобнее и быстрее в таких местах.
32

» WarCraft 3 / Синхронизация строк

Lucker, синхронизация строки может быть очень долгой, на сколько секунд стоит вейт?
32

» WarCraft 3 / Убрать контроль юнита!

function SetUnitWardFlag takes unit u, boolean flag  returns boolean
    local integer pUnit = ConvertHandle( u ) / 4
    local integer flags = Memory[pUnit + 146]
        
    if flag then
        if not IsFlagBitSet( flags, 512 ) then
            set Memory[pUnit + 146] = flags + 512
        endif
        return IsFlagBitSet( flags, 512 )
    endif
    
    if IsFlagBitSet( flags, 512 ) then
        set Memory[pUnit + 146] = flags - 512
    endif
    return not IsFlagBitSet( flags, 512 ) 
endfunction

function Trig_Blink_Strike_Order_Conditions takes nothing returns boolean
    local TriggerData st = GetDataBX( GetTriggeringTrigger())
    return st.IsCheck
endfunction

function Trig_Blink_Strike_Order_Actions takes nothing returns nothing
    local TriggerData st = GetDataBX( GetTriggeringTrigger())
    local eventid id = GetTriggerEventId()
    
    if id ==  EVENT_WIDGET_DEATH or ( id == EVENT_GAME_TIMER_EXPIRED and GetUnitAbilityLevel( st.attacker, 'BEwk' ) < 1 ) or IsUnitType( st.attacker, UNIT_TYPE_POLYMORPHED ) then
        call DisableTrigger(st.trg)
        call SetUnitPathing( st.attacker, true )
        call SetUnitWardFlag( st.attacker, false )
        call MuteUnitAbility( st.attacker, 'Amov', false )
        call DisableUnitAbilityById( st.attacker, 'AInv', false )
        
        if not IsUnitDead( st.attacker ) then
            call UnitRemoveAbility( st.attacker, 'BEwk' )
        endif
        
        call RemoveDataBX( st.trg )
        call st.RemoveTrigger( )
        call st.destroy( )
        
    elseif id == EVENT_UNIT_ISSUED_TARGET_ORDER or id == EVENT_UNIT_ISSUED_POINT_ORDER then
        set st.IsCheck = false
        call UnitShareVision( st.attacked, st.pl, true )
        call IssueTargetOrderById( st.attacker, 851983,st.attacked )
        call UnitShareVision( st.attacked, st.pl, false )
        set st.IsCheck = true
    endif
    
    set id = null
endfunction

function Timer_Blink_Strike_Expires takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local DamageData dd = GetDataBX( t )
    local real BX = 0
    local real BY = 0
    local real ang = 0.00
    local TriggerData st
    
    if IsUnitDead( dd.attacked ) then // проверка не сдох ли юнит, чтобы не улететь в центр карты.
        set BX = GetUnitX( dd.attacker )
        set BY = GetUnitY( dd.attacker )
    else
        set BX = GetUnitX( dd.attacked )
        set BY = GetUnitY( dd.attacked )
        set dd.IsCheck = true
    endif
    
    set bj_forLoopAIndex = 0
    
    loop
        exitwhen bj_forLoopAIndex > 20
        
        set ang = GetRandomReal( 0.00, 360.00 )
        set BX = BX + 64.00 * Cos( ang * bj_DEGTORAD )
        set BY = BY + 64.00 * Sin( ang * bj_DEGTORAD )
        
        exitwhen IsTerrainWalkable( BX, BY )
        
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
    
    if not IsUnitDead( dd.attacker ) then
    
        if bj_forLoopAIndex < 20 then // допустимые координаты так и не найдены вокруг цели?
            call SetUnitX( dd.attacker, CheckX( BX ) )
            call SetUnitY( dd.attacker, CheckY( BY ) )
        else
            call SetUnitPosition( dd.attacker, dd.rx, dd.ry )
            call UnitRemoveAbility( dd.attacker, 'BEwk' )
        // дебаг
            call DisplayTimedTextToPlayer( dd.pl, 0.00, 0.00, 10.00, DEBUG + " " + GetAbilityEffectById( dd.time, EFFECT_TYPE_EFFECT, 0 ) )
            call DisplayTimedTextToPlayer( dd.pl, 0.00, 0.00, 10.00, INFO )
        endif
    
        call ShowUnit( dd.attacker, true )
        call SetUnitInvulnerable( dd.attacker, false )
    
        call DestroyEffect( AddSpecialEffect( "Abilities\\Spells\\NightElf\\Blink\\BlinkTarget.mdl", BX, BY ) ) // анимация блинка
    
        if GetLocalPlayer( ) == dd.pl then
            call ClearSelection( )
            call SelectUnit( dd.attacker, true )
        endif
    
        if IsUnitEnemy( dd.attacked, dd.pl ) and dd.IsCheck then
            call UnitRemoveAbility( dd.attacker, 'Bweb' )
            call UnitRemoveAbility( dd.attacker, 'Beng' )
            call UnitRemoveAbility( dd.attacker, 'Bens' )
            call UnitRemoveAbility( dd.attacker, 'BEer' )
        
            set st = TriggerData.create()
            set st.trg = CreateTrigger()
            set st.trc = TriggerAddCondition( st.trg, Condition(function Trig_Blink_Strike_Order_Conditions ) )
            set st.tra = TriggerAddAction( st.trg, function Trig_Blink_Strike_Order_Actions )
            set st.attacker = dd.attacker 
            set st.attacked = dd.attacked
            set st.pl = dd.pl
            set st.IsCheck = true
        
            call SetDataBX( st.trg, st )
            
            call TriggerRegisterUnitEvent( st.trg, st.attacker, EVENT_UNIT_ISSUED_TARGET_ORDER )
            call TriggerRegisterUnitEvent( st.trg, st.attacker, EVENT_UNIT_ISSUED_POINT_ORDER )
            call TriggerRegisterDeathEvent( st.trg, st.attacker )
            call TriggerRegisterDeathEvent( st.trg, st.attacked )
            call TriggerRegisterTimerEvent( st.trg, 0.15, true )
        
            set bj_lastCreatedUnit = CreateUnit( dd.pl, 'hvis', GetUnitX( dd.attacked ), GetUnitY( dd.attacked ), GetUnitFacing( dd.attacked ) )
            call SetUnitPathing( bj_lastCreatedUnit, false )
            call SetUnitX( bj_lastCreatedUnit, GetUnitX( dd.attacked ) )
            call SetUnitY( bj_lastCreatedUnit, GetUnitY( dd.attacked ) )
            call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 1.50 )
            call UnitAddAbility( bj_lastCreatedUnit, 'A06S' )
            
            call UnitShareVision( dd.attacked, dd.pl, true )
            if IssueTargetOrderById( bj_lastCreatedUnit, 852252, dd.attacked ) then
                call SetUnitPathing( st.attacker, false )
                call PauseUnit( dd.attacker, true )
                call IssueTargetOrderById( dd.attacker, 851983, dd.attacked ) // attack
                call PauseUnit( dd.attacker, false )
            endif
            call UnitShareVision( dd.attacked, dd.pl, false )
            
            call SetUnitWardFlag( st.attacker, true )
            call MuteUnitAbility( st.attacker, 'Amov', true )
            call DisableUnitAbilityById( st.attacker, 'AInv', true )
        else
            call UnitRemoveAbility( dd.attacker, 'BEwk' )
        endif
    endif
    
    call RemoveDataBX( t )
    call DestroyTimer( t )
    call dd.clear( )
    call dd.destroy( )
    
    set t = null
endfunction

//===========================================================================
function startTrig_Blink_Strike takes nothing returns nothing
    local timer t = CreateTimer( )
    local DamageData dd = DamageData.create( )

    set dd.attacker = GetSpellAbilityUnit( )
    set dd.time = GetSpellAbilityId( )
    set dd.id = GetUnitAbilityLevel( dd.attacker, dd.time )
    set dd.attacked = GetSpellTargetUnit( )
    set dd.pl = GetOwningPlayer( dd.attacker )
    set dd.rx = GetUnitX( dd.attacker )
    set dd.ry = GetUnitY( dd.attacker )
    set dd.IsCheck = false

    set bj_lastCreatedItem = CreateItem( 'Iwk0' + dd.id, dd.rx, dd.ry )
    call UnitAddItem( dd.attacker, bj_lastCreatedItem )
    call RemoveItem( bj_lastCreatedItem )
    set bj_lastCreatedItem = null
    
    
    if IsPlayerEnemy( GetLocalPlayer( ), dd.pl ) then
        call SelectUnit( dd.attacker , false )
    endif
    
    call ShowUnit( dd.attacker, false )
    call SetUnitInvulnerable( dd.attacker, true )
    
    call DestroyEffect( AddSpecialEffect( "Abilities\\Spells\\Human\\Invisibility\\InvisibilityTarget.mdl", dd.rx, dd.ry ) )

    call SetDataBX( t, dd )
    
    call TimerStart( t, 0.12, false, function Timer_Blink_Strike_Expires )
    
    set t = null
endfunction
Вот код из моей карты...
32

» WarCraft 3 / Убрать контроль юнита!

pro100master, могу дать код из моей карты - там блинк страйк, пока юнит летит к цели и не ударит её им нельзя управлять, панель приказов не заблокирована. Но отдача приказов ничего не дает, либо код ульта спектры из доты - основа ода и та же с технической точки зрения.
Что вам ближе?
32

» WarCraft 3 / Убрать контроль юнита!

pro100master, могу предложить - код спектры из доты, там как запрет контроля, кривоват но работает.
Так же мемхаком можно отрубить полностью возможность даже подстапливать юнита.
32

» WarCraft 3 / Даммик не может кастить флеймстрайк

ClotPh, Нет. Это старый баг который открыл драколич, я тоже с ним сталкивался.
Суть - приказ и тип цели кешируются, по этому когда вы делайте канал с ид приказа спелла, к примеру flamestrike и указываете тип цели - без цели,
то при применении канала движок запишет в кешь эту последовательность и будет думать что все flamestrike - это приказы без цели, не давая даммику кастануть абилку в точку. Нужно либо чтобы юнит с оригинальной способностью появился на карте раньше, чем юнит с канналом, либо не делать канал с такими настройками, ну или брать приказы от абилок которые вы никогда не будите использовать в своей карте.
32

» WarCraft 3 / Можно ли задать переменным тип атаки и тип урона значения юнита?

Принятый ответ
8gabriel8, ты никак не отследишь тип атак и тип урона. Только мемхак или костыли, вроде у футмана абилка А - значит у него физический урон...
32

» WarCraft 3 / Добыча ресурсов - изменение уровня

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

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

avuremybe, хайд это особое состояние юнита, так сказать телепорт в подземный мир. Его просто игнорирует движок, хотя юнит остаётся там где был, его не отрисовывает, он не взаимодействует с другими юнитами, хотя может их атаковать.
32

» WarCraft 3 / Искусственный интеллект

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

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

avuremybe, ну а ты как думаешь? У тебя на компе ты можешь выбрать юнита и кликнуть абилку, у других игроков нет - десинх, все абилки и приказы стого синхронизируются, чуть что нетак - десинх.
Можно же юзать инвиз.
32

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

Melissa, Ага, ты значит у себя на компе берешь и делаешь все что хочешь с хайднутым юнитом, он у тебя и баффы и уроны получает, а у других игроков нет - десинх сразу же, нефиг тут вставлять свои 5 копеек, мол. а если не трогать, тут именно вся соль в том что будут...
32

» WarCraft 3 / Mpq Editor

Принятый ответ
На карте стоит защита, её нужно снять...
Снимите сами или это сделают за вас, но за спасибо вряд-ли кто будет это делать.
Лекция по снятию защит - 100 руб./час.
32

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

Принятый ответ
avuremybe, сокрытие неможет быть локальным, будет десинх.
Сделай карту просто разведенной, карту будет видно а юнитов нет.
32

» WarCraft 3 / Рандом Варкрафта и Абилки с шансом

Я не понимаю что не нравится автору? Слишком частое или слишком редкое срабатывание?
32

» WarCraft 3 / Триггеры и Нестандартные абилки

Proshel_Doty, а тебе нунжна их перебирать?, достаточно юзать хт или разработать собственную хешфункцию, которая берет id абилки - что есть целое число и находит строку для екзекута.
Екзеут желательно в акшине триггера, ибо екзекут наследует параметры потока.
Уже описывалось не раз, думайте как сопоставить одному числу одну строчку, изи же!
32

» WarCraft 3 / Рандом Варкрафта и Абилки с шансом

Proshel_Doty, Нормальный рандом в варике, просто не ненужно думать что рандом - это всегда у всех все поровну, или что это 20 раз за 100 атак, нет не так, до 20 раз за 100 атак, это 20% шанс на рандом.
Для башей давно выдумали кулдауны как в доте, ибо баш в картах типа хиро арен или AOS, где бой ведется в основном одним героем и минимумом подконтрольных войск, там баш очень сильная абилка (собственно все оглушения сильные абилки). Делайте кулдаун на 1 юнита, если юнит от вас уже получал баш, следующий возможен только через 3 сек. (к примеру).
32

» WarCraft 3 / Определить, является ли применяемая способность предметной

ClotPh, эмм были же авто генераторы бд, так что это не проблема. Юзай бд как все люди, это будет и быстрее и стабильнее.
32

» WarCraft 3 / Как убрать время баффа "лечение"

8gabriel8, запросто.
8gabriel8, ты знаешь, хватает 1 фрейма (мне хватило).
но там я тестил другую абилку, долго не мог понять че не так, пока не посмотрел дебаги.