В данной системе все вражеские нейтрайльные боевые единицы респавниятся , может кто помочь как изменить систему чтобы респавнились только некоторые типы войск ( например чтобы респавнились только пехотинцы или же орки )
вот карта а так же код. буду рад любой помощи.
вот карта а так же код. буду рад любой помощи.
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 для создания крипов, так будет респаунить тока тех крипов которых вы создали этой функцией...
либо используйте CreateCreepOfType для создания крипов, так будет респаунить тока тех крипов которых вы создали этой функцией...
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован quq_CCCP
У тебя триггер срабатывает на юнитов которые небыли сохранены...
Отредактирован Roy Mustang
либо используйте CreateCreepOfType для создания крипов, так будет респаунить тока тех крипов которых вы создали этой функцией...
Отредактирован Roy Mustang
и после выдает еще ошибку i.imgur.com/ku1eImA.png