32

» WarCraft 3 / Не совсем вопрос, но просто мб найдутся желающие придумать =)

Daniil18, это ульт апарата из доты.
ClotPh, посмотри предмет "Жезл лунного света", у него довольно интересная, красочная активка.
32

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

Принятый ответ
Чет никаких прорывов, смена уровня инвентаря да спеллбуки, изи.
Вы бы тему Render Engine почитали, вот там так как нигде больше, можно замутить интерфейс хоть по мотивам доты 2, хоть по мотивам диаблы, да вовсе как угодно.
32

» WarCraft 3 / Чтение строк при помощи GetLocalizedString( )

Принятый ответ
Эта функция может читать строки из текстовиков и wts файла строки своего региона, она слупочна. Вспомни сколько грузятся карты без оптимизации, как долго может открываться вкладка - задания.
32

» WarCraft 3 / Мультипак в одном здании...

Принятый ответ
Блин - видел очень давно похожую реализацию, но походу 100500 людей так и не научились это делать, написать чтоли самому...
Суть - для продажи предметов, войск, всяких древ талантов - используйте спеллбук + способности на основе - поставка ресурсов.
Помещаем в спеллбук до 11 способностей на основе "Поставка ресусов" - это аналог канала, настраивается приказ и прочее, но самое главное есть поля - стоймость золотом, стоймость деревом, т.е эта абилка может требовать не только ману но и золото с деревом. Так же там стоит вкладка, заряд игрока владельца - очень важная настройка:
  1. Заряд игрока владельца включен - тогда за каст ресурсы будут списыватся только у игрока владельца юнита, при этом неважно что вашим юнитом управляет другой игрок.
  2. Заряд игрока владельца выключен - тогда при касте этой абилки ресурсы будут списыватся со счета игрока, который и отдал приказ, это даже можно отследить, но немного геморойно:
Суть: делаем триггер который срабатывает на приказ каста поставки ресурсов, или события юнит начинает каст способности, условия по вкусу и действия - создать еще 1 триггер, в события которого добавить - ресурсы игрока N изменились (для каждого игрока способного купить), условием - ресурсов стало меньше на стоймость каста абилки, и действие - выключить триггер, записать GetTriggerPlayer() в глобальную переменную или в еще куда, это и будет наш игрок который кликнул на поставку ресурсов, ну и далее утилизируем триггер, удаляя действия. Можно написать все действия в условии, тогда не придется удалять действия.
Так можно отследить кто кастанул абилку поставки ресурсов если юнитом управляют несколько игроков.
32

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

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

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

Lucker, а что собственно за строки ты хочешь синхронизировать? Пасскод загрузки персонажа? Сначала конвертнии его в цифры локально, а потом уже синхронизируй.
IceFog, Надо будет потестить синх строк... В мемхаке кстати были допиленные функции синха для ботов, но лич вроде не выкладывал подробностей.
32

» WarCraft 3 / Тыкни где менять описание способность через мемхак!!!

Принятый ответ
pro100master, в теме про мемхак есть, SetAbilyTip, SetAbilityUbertip или как то так называется...
Ссылка на список функций функции
Только для второй версии мемхака из темы про детект урона
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 копеек, мол. а если не трогать, тут именно вся соль в том что будут...