21

» WarCraft 3 / Fatal при отлове завершения строительства

Пушистый, Фатал происходит не из-за юнита, а из-за функций GetUnitGoldCost() и GetUnitWoodCost().
Вернее когда этот юнит и эти функции встречаются с друг другом
.
21

» WarCraft 3 / PreloadAbility( integer )

quq_CCCP:
Я про эток:
call PreloadGenClear()
call PreloadGenStart()
call TriggerSleepActions(2.00)
call PreloadGenEnd("save//mydata.pld")
Вызываем этот код пред созданием героя, чуствуем просадку фпс, побегали, покастовали спеллы (вейт нужно подольше). Идем смотреть что в текстовик сохранилось, там будет полный список того что загружал движок.
Затем Preloader("save//mydata.pld") - это вызов этого скрипта, который загрузит в память все что указанно в этом скрипте.
Это используется в кампаниях.
Понял, почему не работало. Нужно писать "save\\mydata.pld"
21

» WarCraft 3 / WC3RusTextOptimizer

Если вставить текст в редактор объектов, то получается следующее:
|cFFFFCC00Options:|r
  • ypo?: 15
  • ??? a?a??: Ma???ec?a?
  • ?pe a?a: 1.00
  • a??oc a?a: 700
|cFFFFCC00Boo???e ?e:|r
  • ?a?e???e
  • o?y???e
  • occ
|cFFFFCC00Abilities:|r
  • Ensnare
  • Poison Arrow
|cFF808080C?ocooc "Thunderclup" - ?aa? a?a?a o?pa???e? po?????a o?, ?a?oc???? ypo?, a ?ae c???a???? c?opoc ?epe?e?e???. po o? a ? e????a ?a?ee??? pac??? c ypo??e? a??.|r
Хотя если вставить текст в другое место, то всё норм.
21

» WarCraft 3 / Fatal при отлове завершения строительства

Steal nerves, чтобы она заработала нужно её объявить, где-нибудь написав:
((
native GetUnitWoodCost takes integer unitid returns integer
native GetUnitGoldCost takes integer unitid returns integer
))
21

» WarCraft 3 / Fatal при отлове завершения строительства

Steal nerves, нет не я. она из common.ai
native GetUnitWoodCost takes integer unitid returns integer
native GetUnitGoldCost takes integer unitid returns integer
21

» WarCraft 3 / Fatal при отлове завершения строительства

Steal nerves, нет, причина не в этом. Методом удаления выявил проблемный участок:
private static method onUnitConstructFinish takes nothing returns nothing
	call GetUnitGoldCost(GetUnitTypeId(GetConstructedStructure()))
endmethod

private static method onInit takes nothing returns nothing
    call RegisterAnyUnitEvent( EVENT_PLAYER_UNIT_CONSTRUCT_FINISH, function thistype.onUnitConstructFinish )
endmethod

Удаляя еще больше лишнего, выяснил, что фаталит функция GetUnitGoldCost() при:
call GetUnitGoldCost('T000')
21

» WarCraft 3 / Fatal при отлове завершения строительства

После небольших тестов выяснил, что причина фатала не в регистрации, а в самой способности:
методы: onInit(), onUnitConstructFinish()
код:
struct demolish


    private  static  unit     tower   =  null
    private  static  integer  towerI  =  0
    private  static  real     towerX  =  0.0
    private  static  real     towerY  =  0.0
    private  static  player   owner   =  null
    private  static  integer  costG   =  0
    private  static  integer  costW   =  0
    private  static  Table    gold    =  Table( 0 )
    private  static  Table    wood    =  Table( 0 )


    private static method onUnitSpellCast takes nothing returns nothing
        if (GetSpellAbilityId() == 'A002') then
            set thistype.tower  = GetSpellAbilityUnit()
            set thistype.towerI = GetHandleId(thistype.tower)
            set thistype.towerX = GetUnitX(thistype.tower)
            set thistype.towerY = GetUnitY(thistype.tower)
            set thistype.owner  = GetOwningPlayer(thistype.tower)
            set thistype.costG  = gold[thistype.towerI]
            set thistype.costW  = wood[thistype.towerI]
            
            call KillUnit(thistype.tower)
            call ShowUnit(thistype.tower, false)
            call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Transmute\\PileofGold.mdl", thistype.towerX, thistype.towerY))

            call CreateFloatingTextTag(thistype.owner, FLOATING_TEXTTAG_GOLD,   thistype.costG, thistype.towerX, thistype.towerY, GetUnitFlyHeight(thistype.tower) + 60.0 )
            call CreateFloatingTextTag(thistype.owner, FLOATING_TEXTTAG_LUMBER, thistype.costW, thistype.towerX, thistype.towerY, GetUnitFlyHeight(thistype.tower) + 120.0)

            call SetPlayerState(thistype.owner, PLAYER_STATE_RESOURCE_GOLD,   GetPlayerState(thistype.owner, PLAYER_STATE_RESOURCE_GOLD  ) + thistype.costG)
            call SetPlayerState(thistype.owner, PLAYER_STATE_RESOURCE_LUMBER, GetPlayerState(thistype.owner, PLAYER_STATE_RESOURCE_LUMBER) + thistype.costW)
        endif
    endmethod


    private static method onUnitConstructFinish takes nothing returns nothing
        set thistype.tower  = GetConstructedStructure() <== если это заменить на null, то фаталы прекращаются.
        set thistype.towerI = GetHandleId(thistype.tower)

        set  gold[thistype.towerI] = GetUnitGoldCost(GetUnitTypeId(thistype.tower))
        set  wood[thistype.towerI] = GetUnitWoodCost(GetUnitTypeId(thistype.tower))
    endmethod


    private static method onUnitUpgradeFinish takes nothing returns nothing
        set thistype.tower  = GetTriggerUnit()
        set thistype.towerI = GetHandleId(thistype.tower)

        set gold[thistype.towerI] = GetUnitGoldCost(GetUnitTypeId(thistype.tower)) + gold[thistype.towerI]
        set wood[thistype.towerI] = GetUnitWoodCost(GetUnitTypeId(thistype.tower)) + wood[thistype.towerI]
    endmethod


    private static method onInit takes nothing returns nothing
        set  gold  =  Table.create( )
        set  wood  =  Table.create( )

        call RegisterAnyUnitEvent( EVENT_PLAYER_UNIT_SPELL_CAST,       function thistype.onUnitSpellCast       )
        call RegisterAnyUnitEvent( EVENT_PLAYER_UNIT_CONSTRUCT_FINISH, function thistype.onUnitConstructFinish )
        call RegisterAnyUnitEvent( EVENT_PLAYER_UNIT_UPGRADE_FINISH,   function thistype.onUnitUpgradeFinish   )
    endmethod


endstruct
21

» WarCraft 3 / Удаление баффа

pro100master, да и проверять урон незачем, ведь если бафф есть, то это он и нанёс урон. Ведь бафф будет тут же удалён.
21

» WarCraft 3 / Удаление баффа

8gabriel8, не знал, что скиллы накладывают бафф не сразу.

либо просто дай скиллу 0.01 сек длительности что на много проще
но всё же не проффитно, т.к. это целых 0.01 сек действия эффекта... или пофиг?
На деле на юните бафф даже не успевает появится, но, да действительно, 0.01 непозволительно для меня. Хз почему, я даже выставляю боевой единице урон, скорость атаки и т.д. на 0, даже если выключу атаку:

Diaboliko, да, именно так я понял, что бафф не успевает наложится. Придётся делать через отлов урона.

pro100master, зачем какой-то массив, если источник урона GetEventDamageSource( ) и есть тот, кто наложил бафф?
Загруженные файлы
21

» WarCraft 3 / Удаление баффа

Насколько я понял, в момент срабатывания триггера, на жертве еще не висит бафф, но почему, там же нет снаряда ( способность применяется сразу же).
21

» WarCraft 3 / Проблемы с постройкой зданий

Steal nerves, благодарю. Жаль, что не работает с несколькими работниками на одного игрока.
выбрал бы 8gabriel8'a, т. к. он первый предложил; но Steal nerves сделал ещё и пример.
21

» WarCraft 3 / Проблемы с постройкой зданий

PT153, ручками.
8gabriel8, это приказ, который открывает список доступных приказов.
*список доступных построек
21

» WarCraft 3 / Событие на вход в воду

Я не об этом, даже если поставить 0.01 ваша система начнет генерировать регион не во время инициализации карты, а только после того, как пройдет 0.01 сек. Если после генерации региона, все триггеры связанные с ним обновятся, то вопросов нет.
21

» WarCraft 3 / Событие на вход в воду

Если зарегистрировать событие на вход в воду еще до инициализации системы, то когда система будет готова к использованию, триггер обновится или останется с недоднланным регионом?
21

» WarCraft 3 / Почему не отсеивается юнит из группы

8gabriel8, функция DoNothing( ) не имеет тела, т. е. ничего не делает. Так зачем вызывать функцию, которая ничего не делает, если можно и так ничего не делать. -)
Под ничего не делать я имел ввиду не вызвать эту функцию.
Если вы создаёте кампании и не беспокоитесь об утечках, то в этом нет ничего плохого.
21

» WarCraft 3 / Замена одного предмета, на другой при использовании третьего

8gabriel8, думаю, что это стоит перенести в самое начало:
(Item-type of (Item being manipulated) равно (==) Зелье Вампиризма
Так, условие, которое чаще всего даёт ложь, будет выполняться первым, чтобы не делать лишние проверки.
21

» WarCraft 3 / RemoveUnit или KillUnit?

Разве юниты не сами удаляются игрой после смерти, если на них нет ссылок? Да и удалять не рекомендуется, так как это может приводить к фатал ерорам.
21

» WarCraft 3 / Повседневные приёмы в программировании варкрафта

PT153, а что насчёт function interface?
Написал следующий код для себя, подглядывая сюда:
код:
    function interface callback takes integer this returns nothing defaults nothing


    module linkedList
        private  static  timer     period  =  null
        private          thistype  prev
        private          thistype  next
        private          callback  handlerFunc


        method destroyList takes nothing returns nothing
            set  this.prev.next  =  this.next
            set  this.next.prev  =  this.prev
            if ( thistype( 0 ).next == 0 ) then
                call PauseTimer( thistype.period )
            endif
            call thistype.deallocate( this )
        endmethod


        private static method iterate takes nothing returns nothing
            local  thistype  this  =  thistype( 0 ).next
            loop
                exitwhen ( this == 0 )
                call this.handlerFunc.evaluate( integer( this ) )
                set  this  =  this.next
            endloop
        endmethod


        static method createList 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.handlerFunc  =  handlerFunc
            if ( this.prev == 0 ) then
                call TimerStart( thistype.period, timeout, true, function thistype.iterate )
            endif
            return this
        endmethod


        private static method onInit takes nothing returns nothing
            set  thistype.period  =  CreateTimerEx( )
        endmethod


    endmodule
пример использования:
    struct abili
        unit caster
        unit target
        implement linkedList

        method update takes nothing returns nothing
//          ...
        endmethod


        static method createA takes nothing returns nothing
            local  thistype  this  =  thistype.createList( 0.03125, update )

//          ...
        endmethod
        
    endstruct
Я так понял она нужна, только для того чтобы как-то заменить code array, который нельзя создать. Она создаёт триггер, который будет вызван через TriggerEvaluate( ), а параметры будут переданы через глобальные переменные. Это её единственное применение или можно еще что-нибудь замутить интересное?

А насчёт interface/endinterface вроде всё понятно. Просто набор правил, чтобы в случае чего выдать ошибку?
21

» WarCraft 3 / Повседневные приёмы в программировании варкрафта

ScorpioT1000, хотелось бы, что Вы рассказали про полиморфизм. Интерфейсы вроде дают такую возможность.
Хоть убейте, не могу понять, как работать с интерфейсами и где их стоит применять.
21

» WarCraft 3 / vJass

this - это название локальной переменной, которая указывает на ячейку массива. В нестатичных методах это переменная передаётся сама:
method myMethod takes nothing returns nothing
call KillUnit( this.u )
endmethod
function myMethod takes integer this returns nothing
call KillUnit( u[ this ] )
endfunction