В данной системе все вражеские нейтрайльные боевые единицы респавниятся , может кто помочь как изменить систему чтобы респавнились только некоторые типы войск ( например чтобы респавнились только пехотинцы или же орки )
вот карта а так же код. буду рад любой помощи.

library CreepRespawnSystem initializer InitCreps

    globals
        boolean bj_DESTROY_CORPSE      = true // удалять трупы умерших крипов.
        boolean bj_SHOW_DEATH_EFFECT   = true // показать спецэффект при смерте крипа
        boolean bj_SHOW_RESPAWN_EFFECT = true // показать спецэфект при респауне
        boolean bj_RANDOM_CREEP_TYPE   = false // респаунить каждый раз разных крипов но одного и того же уровня
        boolean bj_CHECK_REPAWN_POS    = false// проверять видит ли игрок точку респауна, и если видит пропустить респаун
        string bj_DEATH_EFFECT         = "Abilities\\Spells\\Orc\\FeralSpirit\\feralspiritdone.mdl" // спецэффект при смерти крипа
        string bj_RESPAWN_EFFECT       = "Abilities\\Spells\\Human\\Resurrect\\ResurrectTarget.mdl" // спецэффект при респауне крипа
        real bj_CREEP_SAVE_INTERVAL    = 0.20 // задержка перед работой системы... Необходимо в тех картах где создание крипов просиходит во время игры.
        real bj_RESP_TIMEOUT           = 2.00 // время чеерез которую возродится крип... В данном случае умножвется на его уровень.
        player bj_PLAYER_NEUTRAL_AGGRESSIVE = Player( 12 ) // Нетрально враждебный, если в вашей крате вы использует другоuо игрока то введите его номер в Player( № )
        // вспомогательные переменные системы
        // не не рекомендуется их изменение
        private unit bj_Neutral_Creep
        private timer bj_RespawnTimer
        private integer bj_HandleInteger
        private integer bj_TimerId
        private real bj_CreepX
        private real bj_CreepY
        private real bj_CreepA
        private location bl_TempPoint
    endglobals

    private function bj_creepRespTimeout takes nothing returns real // задержка перед респауном крипа можно вести конкретное время или выражение
        return bj_RESP_TIMEOUT * GetUnitLevel( GetDyingUnit( ) ) // в данном случие врмя респауна равно уровень крипа умнноженный на bj_RESP_TIMEOUT ( 2 сек )
    endfunction

    private function Bolexp_UnitFiler_Conditions takes nothing returns boolean     // фильтр сохраннения нетрально враждебынх юнитов
        return GetOwningPlayer( GetFilterUnit( ) ) == bj_PLAYER_NEUTRAL_AGGRESSIVE  // в данном случее проходят все юниты подконтрольные игроку bj_PLAYER_NEUTRAL_AGGRESSIVE
    endfunction                                                                    // через and можно добавить дополнительыне критерии отбора.
    
// далее вмешательство в код настоятельно не рекомендуется...
//**********************************************************************************************************************************************
//**********************************************************************************************************************************************
    
    function CreateCreepOfType takes integer CreepType, real SX, real SY, real SA returns unit
        set bj_lastCreatedUnit = CreateUnit( bj_PLAYER_NEUTRAL_AGGRESSIVE, CreepType, SX, SY, SA )
        set bj_HandleInteger = GetHandleId( bj_lastCreatedUnit )
        call SaveReal( bj_lastCreatedHashtable, bj_HandleInteger, 0, SX )
        call SaveReal( bj_lastCreatedHashtable, bj_HandleInteger, 1, SY )
        call SaveReal( bj_lastCreatedHashtable, bj_HandleInteger, 2, SA )
        return bj_lastCreatedUnit
    endfunction

    function RemoveCreep takes unit fp_uCreep returns nothing
        call FlushChildHashtable( bj_lastCreatedHashtable, GetHandleId( fp_uCreep ) )
        call RemoveUnit( fp_uCreep )
        set fp_uCreep = null
    endfunction

    private function Group_SaveCrepsPos_Actions takes nothing returns nothing
        set bj_Neutral_Creep = GetEnumUnit( )
        set bj_HandleInteger = GetHandleId( bj_Neutral_Creep )
        call SaveReal( bj_lastCreatedHashtable, bj_HandleInteger, 0, GetUnitX( bj_Neutral_Creep ) )
        call SaveReal( bj_lastCreatedHashtable, bj_HandleInteger, 1, GetUnitY( bj_Neutral_Creep ) )
        call SaveReal( bj_lastCreatedHashtable, bj_HandleInteger, 2, GetUnitFacing( bj_Neutral_Creep ) )
    endfunction

    private function AddSpecialEffectZ takes string path, real x, real y, real z returns effect
        set bl_TempPoint = Location( x, y )
        set z = z + GetLocationZ( bl_TempPoint ) + 10.00
        call RemoveLocation( bl_TempPoint )
        set bj_lastCreatedDestructable = CreateDestructableZ( 'OTip', x, y, z, 0.00, 1, 0 )
        set bj_lastCreatedEffect = AddSpecialEffect( path, x, y )
        call RemoveDestructable( bj_lastCreatedDestructable )
        return bj_lastCreatedEffect
    endfunction
    
    
    private function IsSpawnPosVisibly_Conditions takes real PX, real PY returns boolean
        local integer nIndex = 0
        if not bj_CHECK_REPAWN_POS then
            return true
        endif
        loop
            exitwhen nIndex > bj_MAX_PLAYER_SLOTS
            if ( IsVisibleToPlayer( PX, PY, Player( nIndex ) ) ) then
                return false
            endif
            set nIndex = nIndex + 1
        endloop
        return true
    endfunction

    private function Timer_Creep_Respawn_Actions takes nothing returns nothing
        set bj_RespawnTimer = GetExpiredTimer( )
        set bj_TimerId= GetHandleId( bj_RespawnTimer )
        set bj_CreepX = LoadReal( bj_lastCreatedHashtable, bj_TimerId, 0 )
        set bj_CreepY = LoadReal( bj_lastCreatedHashtable, bj_TimerId, 1 )
        set bj_CreepA = LoadReal( bj_lastCreatedHashtable, bj_TimerId, 2 )

        if IsSpawnPosVisibly_Conditions( bj_CreepX, bj_CreepY ) then
            if bj_RANDOM_CREEP_TYPE then
                set bj_Neutral_Creep = CreateUnit( bj_PLAYER_NEUTRAL_AGGRESSIVE, ChooseRandomCreep( LoadInteger( bj_lastCreatedHashtable, bj_TimerId, 3 ) ), bj_CreepX, bj_CreepY, bj_CreepA )
            else
                set bj_Neutral_Creep = CreateUnit( bj_PLAYER_NEUTRAL_AGGRESSIVE, LoadInteger( bj_lastCreatedHashtable, bj_TimerId, 3 ), bj_CreepX, bj_CreepY, bj_CreepA )
            endif
            set bj_HandleInteger = GetHandleId( bj_Neutral_Creep )
            if bj_SHOW_RESPAWN_EFFECT then
                call DestroyEffect( AddSpecialEffectTarget( bj_RESPAWN_EFFECT, bj_Neutral_Creep, "origin" ) )
            endif
    
            call SaveReal( bj_lastCreatedHashtable, bj_HandleInteger, 0, bj_CreepX )
            call SaveReal( bj_lastCreatedHashtable, bj_HandleInteger, 1, bj_CreepY )
            call SaveReal( bj_lastCreatedHashtable, bj_HandleInteger, 2, bj_CreepA )
    
            call FlushChildHashtable( bj_lastCreatedHashtable, bj_TimerId )
            call PauseTimer( bj_RespawnTimer )
            call DestroyTimer( bj_RespawnTimer )
        endif
        
    endfunction

    private function Trig_Creep_Resp_Actions takes nothing returns nothing
        set bj_RespawnTimer = CreateTimer( )
        set bj_Neutral_Creep = GetDyingUnit( )
        set bj_TimerId = GetHandleId( bj_RespawnTimer )
        set bj_HandleInteger = GetHandleId( bj_Neutral_Creep )
        if ( bj_SHOW_DEATH_EFFECT and bj_DESTROY_CORPSE and IsUnitType( bj_Neutral_Creep, UNIT_TYPE_FLYING ) ) then
            call DestroyEffect( AddSpecialEffectZ( bj_DEATH_EFFECT, GetUnitX( bj_Neutral_Creep ), GetUnitY( bj_Neutral_Creep ), GetUnitFlyHeight( bj_Neutral_Creep ) ) )
        elseif bj_SHOW_DEATH_EFFECT then
            call DestroyEffect( AddSpecialEffect( bj_DEATH_EFFECT, GetUnitX( bj_Neutral_Creep ), GetUnitY( bj_Neutral_Creep ) ) )
        endif
        call SaveReal( bj_lastCreatedHashtable, bj_TimerId, 0, LoadReal( bj_lastCreatedHashtable, bj_HandleInteger, 0 ) )
        call SaveReal( bj_lastCreatedHashtable, bj_TimerId, 1, LoadReal( bj_lastCreatedHashtable, bj_HandleInteger, 1 ) )
        call SaveReal( bj_lastCreatedHashtable, bj_TimerId, 2, LoadReal( bj_lastCreatedHashtable, bj_HandleInteger, 2 ) )
        if ( bj_RANDOM_CREEP_TYPE ) then
            call SaveInteger( bj_lastCreatedHashtable, bj_TimerId, 3, GetUnitLevel( bj_Neutral_Creep ) )
        else
            call SaveInteger( bj_lastCreatedHashtable, bj_TimerId, 3, GetUnitTypeId( bj_Neutral_Creep ) )
        endif
        call FlushChildHashtable( bj_lastCreatedHashtable, bj_HandleInteger )
        if ( bj_DESTROY_CORPSE ) then
            call RemoveUnit( bj_Neutral_Creep )
        endif
    
        call TimerStart( bj_RespawnTimer, bj_creepRespTimeout( ), true, function Timer_Creep_Respawn_Actions )
    endfunction
    
    private function SaveCreepRespPos takes nothing returns nothing
        local group grp = CreateGroup( )
        local boolexpr NeutralFilter = Condition( function Bolexp_UnitFiler_Conditions )
        local trigger trg = CreateTrigger( )
        call TriggerRegisterPlayerUnitEvent( trg, bj_PLAYER_NEUTRAL_AGGRESSIVE, EVENT_PLAYER_UNIT_DEATH, null )
        call TriggerAddAction( trg, function Trig_Creep_Resp_Actions )
        call DestroyTimer( GetExpiredTimer( ) )
        call GroupEnumUnitsInRect( grp, bj_mapInitialPlayableArea, NeutralFilter )
        call ForGroup( grp, function Group_SaveCrepsPos_Actions )
        call DestroyGroup( grp )
        call DestroyBoolExpr( NeutralFilter )
        set NeutralFilter = null
        set trg = null
        set grp = null
    endfunction
    
    private function InitCreps takes nothing returns nothing
        set bj_lastCreatedHashtable = InitHashtable( )
        call TimerStart( CreateTimer( ), bj_CREEP_SAVE_INTERVAL, false, function SaveCreepRespPos )
    endfunction

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

Вот обновленная версия на структурах, я её вроде выкладывал...
либо используйте CreateCreepOfType для создания крипов, так будет респаунить тока тех крипов которых вы создали этой функцией...
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
32
9 лет назад
Отредактирован quq_CCCP
0
    private function IsCreepSaved takes nothing returns boolean
        set bj_Neutral_Creep = GetFilterUnit( )
        return LoadReal( bj_lastCreatedHashtable, bj_HandleInteger, 0 ) != 0.00
    endfunction
    
    private function SaveCreepRespPos takes nothing returns nothing
        local group grp = CreateGroup( )
        local boolexpr NeutralFilter = Condition( function Bolexp_UnitFiler_Conditions )
        local trigger trg = CreateTrigger( )
        call TriggerRegisterPlayerUnitEvent( trg, bj_PLAYER_NEUTRAL_AGGRESSIVE, EVENT_PLAYER_UNIT_DEATH, Condition( function IsCreepSaved ) )
        call TriggerAddAction( trg, function Trig_Creep_Resp_Actions )
        call DestroyTimer( GetExpiredTimer( ) )
        call GroupEnumUnitsInRect( grp, bj_mapInitialPlayableArea, NeutralFilter )
        call ForGroup( grp, function Group_SaveCrepsPos_Actions )
        call DestroyGroup( grp )
        call DestroyBoolExpr( NeutralFilter )
        set NeutralFilter = null
        set trg = null
        set grp = null
    endfunction
Надо добавить фильтр проверки сохраненных, это старая версия, тут я фильтр не делал...
У тебя триггер срабатывает на юнитов которые небыли сохранены...
0
28
9 лет назад
Отредактирован Roy Mustang
0
спс за ответ, я jass не очень понимаю , заменил в тригерах то что вы написали б но это не помогло , мне так же нужно ресать только некоторые типы существ но не все которые принадлежат врагу
0
32
9 лет назад
0
Вот обновленная версия на структурах, я её вроде выкладывал...
либо используйте CreateCreepOfType для создания крипов, так будет респаунить тока тех крипов которых вы создали этой функцией...
Загруженные файлы
Принятый ответ
0
28
9 лет назад
Отредактирован Roy Mustang
0
Карта которую вы скинули не запускается : i.imgur.com/3ey22Rl.png
и после выдает еще ошибку i.imgur.com/ku1eImA.png
0
32
9 лет назад
0
vjass онли, без cjass он виснет на системе ХАТ, сохраните карту 2 раза...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.