Добавлен quq_CCCP,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
vJass
Тип:
Наработка
Система респауна крипов V2.0
Плюсы системы
- Не нужно указывать место и тип крипа, просто помещаем на карту нейтрального крипа, ставим ему угол поворота и всё,
- Крипы будут респаунится на том месте где они изначально были.
- Возможность прикрепление спецэффектов при смерти и респауне крипа
- Возможность удаления трупов, те при смерти крипа не будет оставаться костей...
- Возможность проверки видят ли игроки точку респауна крипов.
- Легко переносится, папка с 2 триггерами, требуется хеш таблица (bj_lastCreatedHashtable)
- GUI версия для новичков.
- Для создание или удаления нейтральных мобов во время игры потребуется использовать следующие функции:
CreateCreepOfType Takes integer UnitId, real UnitX, real UnitY, real UnitAngle, returns unit
RemoveCreep takes unit u returns nothing
- Версия на обычном jass, не требует jgnp
код системы
// Кастом код карты
//функции создания и удаления крипов
//эти функции необязательны для работы системы, но они могут понадобится для создания и удаления крипов во время игры
function CreateCreepOfType takes integer CreepType, real SX, real SY, real SA returns unit
local integer creepId
set bj_lastCreatedUnit = CreateUnit(Player(12),CreepType,SX,SY,SA)
set creepId = GetHandleId(bj_lastCreatedUnit)
call SaveReal(bj_lastCreatedHashtable,creepId,0,SX)
call SaveReal(bj_lastCreatedHashtable,creepId,1,SY)
call SaveReal(bj_lastCreatedHashtable,creepId,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
// триггер Init Creps
function Bolexp_UnitFiler_Conditions takes nothing returns boolean
return GetOwningPlayer(GetFilterUnit()) == Player(PLAYER_NEUTRAL_AGGRESSIVE)
endfunction
function Group_SaveCrepsPos_Actions takes nothing returns nothing
local unit uNeutralCreep = GetEnumUnit()
local integer hashId = GetHandleId(uNeutralCreep)
call SaveReal(bj_lastCreatedHashtable,hashId,0,GetUnitX(uNeutralCreep))
call SaveReal(bj_lastCreatedHashtable,hashId,1,GetUnitY(uNeutralCreep))
call SaveReal(bj_lastCreatedHashtable,hashId,2,GetUnitFacing(uNeutralCreep))
set uNeutralCreep = null
endfunction
function Trig_Init_Creps_Actions takes nothing returns nothing
local group grp = CreateGroup()
local boolexpr NeutralFilter = Condition( function Bolexp_UnitFiler_Conditions )
call GroupEnumUnitsInRect(grp, bj_mapInitialPlayableArea, NeutralFilter)
call DestroyBoolExpr(NeutralFilter)
call ForGroup(grp, function Group_SaveCrepsPos_Actions)
call DestroyGroup(grp)
call DestroyBoolExpr(NeutralFilter)
set NeutralFilter = null
set grp = null
call TriggerClearActions(gg_trg_Init_Creps)
call DestroyTrigger(gg_trg_Init_Creps)
set gg_trg_Init_Creps = null
endfunction
//===========================================================================
function InitTrig_Init_Creps takes nothing returns nothing
set gg_trg_Init_Creps = CreateTrigger( )
call TriggerRegisterTimerEvent(gg_trg_Init_Creps, 0.20, false)
call TriggerAddAction( gg_trg_Init_Creps, function Trig_Init_Creps_Actions)
set bj_lastCreatedHashtable = InitHashtable() // инит хеш таблицы
endfunction
//Код триггера Creeps resp
function bj_boolDelCorpse takes nothing returns boolean // удялать трупы?
return false
endfunction
function bj_boolShowDeathFX takes nothing returns boolean // показать спецэффект при смерти крипа?
return true
endfunction
function bj_CreepDeathEffect takes nothing returns string //спецэффект при смерти крипа...
return "Abilities\\Spells\\Orc\\FeralSpirit\\feralspiritdone.mdl"
endfunction
function bj_boolShowRespFX takes nothing returns boolean // показать спецэффект при смерти крипа?
return true
endfunction
function bj_CreepRepsEffect takes nothing returns string //спецэффект при респауне крипа...
return "Abilities\\Spells\\Human\\Resurrect\\ResurrectTarget.mdl"
endfunction
function bj_boolRandomType takes nothing returns boolean // спаунить крипов разного типа, но одного и тогоже уровня?
return true
endfunction
function bj_boolCheckVisiblyPos takes nothing returns boolean //проверять нет ли поблизости юнитов игроков
return false // незабудьте что если включить этот параметр крипы небудут возрождатся пока любой игрок видит их точку респауна
endfunction
function bj_creepRespTimeout takes nothing returns real // задержка перед респауном крипа
return 1.01 // можно поставить return GetUnitLevel(GetDyingUnit())* 5.00 тогда крипы будут возродатся исходя их их уровня умноженного на 5
endfunction
//##################################################################################################​#//
//##################################################################################################​#//
function IsSpawnPosVisibly_Conditions takes real PX, real PY returns boolean
local integer nIndex = 0
if not bj_boolCheckVisiblyPos() then
return true
endif
loop
exitwhen nIndex > 11
if(IsVisibleToPlayer(PX,PY,Player(nIndex)))then
return false
endif
set nIndex = nIndex + 1
endloop
return true
endfunction
function Timer_Creep_Respawn_Actions takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer TimerId = GetHandleId(t)
local real UnitX = LoadReal(bj_lastCreatedHashtable,TimerId,0)
local real UnitY = LoadReal(bj_lastCreatedHashtable,TimerId,1)
local real UnitA = LoadReal(bj_lastCreatedHashtable,TimerId,2)
local integer LevelOrType = LoadInteger(bj_lastCreatedHashtable,TimerId,3)
local unit NewCreep
local integer NewCreepId
if IsSpawnPosVisibly_Conditions(UnitX,UnitY) then
if bj_boolRandomType() then
set NewCreep = CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE),ChooseRandomCreep(LevelOrType),UnitX,UnitY,UnitA)
else
set NewCreep = CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE),LevelOrType,UnitX,UnitY,UnitA)
endif
set NewCreepId = GetHandleId(NewCreep)
if bj_boolShowRespFX() then
call DestroyEffect(AddSpecialEffectTarget(bj_CreepRepsEffect(),NewCreep,"origin"))
endif
call SaveReal(bj_lastCreatedHashtable,NewCreepId,0,UnitX)
call SaveReal(bj_lastCreatedHashtable,NewCreepId,1,UnitY)
call SaveReal(bj_lastCreatedHashtable,NewCreepId,2,UnitA)
call FlushChildHashtable(bj_lastCreatedHashtable,TimerId)
call PauseTimer(t)
call DestroyTimer(t)
endif
set NewCreep = null
set t = null
endfunction
function Trig_Creep_Resp_Actions takes nothing returns nothing
local unit DiedCreep = GetDyingUnit()
local timer t = CreateTimer()
local integer TimerId = GetHandleId(t)
local integer CreepId = GetHandleId(DiedCreep)
if(bj_boolShowDeathFX() and bj_boolDelCorpse())then
call DestroyEffect(AddSpecialEffect(bj_CreepDeathEffect(),GetUnitX(DiedCreep),GetUnitY(DiedCreep)))
elseif bj_boolShowDeathFX() and not(bj_boolDelCorpse()) then
call DestroyEffect(AddSpecialEffectTarget(bj_CreepDeathEffect(),DiedCreep,"origin"))
endif
call SaveReal(bj_lastCreatedHashtable,TimerId,0,LoadReal(bj_lastCreatedHashtable,CreepId,0))
call SaveReal(bj_lastCreatedHashtable,TimerId,1,LoadReal(bj_lastCreatedHashtable,CreepId,1))
call SaveReal(bj_lastCreatedHashtable,TimerId,2,LoadReal(bj_lastCreatedHashtable,CreepId,2))
if(bj_boolRandomType()) then
call SaveInteger(bj_lastCreatedHashtable,TimerId,3,GetUnitLevel(DiedCreep))
else
call SaveInteger(bj_lastCreatedHashtable,TimerId,3,GetUnitTypeId(DiedCreep))
endif
call FlushChildHashtable(bj_lastCreatedHashtable,CreepId)
if(bj_boolDelCorpse()) then
call RemoveUnit(DiedCreep)
endif
call TimerStart(t,bj_creepRespTimeout(),true, function Timer_Creep_Respawn_Actions)
set DiedCreep = null
set t = null
endfunction
//===========================================================================
function InitTrig_Creep_Resp takes nothing returns nothing
set gg_trg_Creep_Resp = CreateTrigger( )
call TriggerRegisterPlayerUnitEvent(gg_trg_Creep_Resp, Player(PLAYER_NEUTRAL_AGGRESSIVE), EVENT_PLAYER_UNIT_DEATH, null)
call TriggerAddAction( gg_trg_Creep_Resp, function Trig_Creep_Resp_Actions )
endfunction
- vJass версия системы в виде библиотеки
Требуется JGNP
Требуется JGNP
код системы!
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 = true // респаунить каждый раз разных крипов но одного и того же уровня
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 hashtable bj_hash
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_hash, bj_HandleInteger, 0, SX )
call SaveReal( bj_hash, bj_HandleInteger, 1, SY )
call SaveReal( bj_hash, bj_HandleInteger, 2, SA )
return bj_lastCreatedUnit
endfunction
function RemoveCreep takes unit fp_uCreep returns nothing
call FlushChildHashtable( bj_hash, 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_hash, bj_HandleInteger, 0, GetUnitX( bj_Neutral_Creep ) )
call SaveReal( bj_hash, bj_HandleInteger, 1, GetUnitY( bj_Neutral_Creep ) )
call SaveReal( bj_hash, 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_hash, bj_TimerId, 0 )
set bj_CreepY = LoadReal( bj_hash, bj_TimerId, 1 )
set bj_CreepA = LoadReal( bj_hash, 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_hash, bj_TimerId, 3 ) ), bj_CreepX, bj_CreepY, bj_CreepA )
else
set bj_Neutral_Creep = CreateUnit( bj_PLAYER_NEUTRAL_AGGRESSIVE, LoadInteger( bj_hash, 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_hash, bj_HandleInteger, 0, bj_CreepX )
call SaveReal( bj_hash, bj_HandleInteger, 1, bj_CreepY )
call SaveReal( bj_hash, bj_HandleInteger, 2, bj_CreepA )
call FlushChildHashtable( bj_hash, 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_hash, bj_TimerId, 0, LoadReal( bj_hash, bj_HandleInteger, 0 ) )
call SaveReal( bj_hash, bj_TimerId, 1, LoadReal( bj_hash, bj_HandleInteger, 1 ) )
call SaveReal( bj_hash, bj_TimerId, 2, LoadReal( bj_hash, bj_HandleInteger, 2 ) )
if ( bj_RANDOM_CREEP_TYPE ) then
call SaveInteger( bj_hash, bj_TimerId, 3, GetUnitLevel( bj_Neutral_Creep ) )
else
call SaveInteger( bj_hash, bj_TimerId, 3, GetUnitTypeId( bj_Neutral_Creep ) )
endif
call FlushChildHashtable( bj_hash, 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_hash = InitHashtable( )
call TimerStart( CreateTimer( ), bj_CREEP_SAVE_INTERVAL, false, function SaveCreepRespPos )
endfunction
endlibrary
endlibrary
Вскоре выйдет новая версия, с новыми параметрами и на структурах
Тема для вопросов по системе
Все версии собраны в 1 карте
Тема для вопросов по системе
Все версии собраны в 1 карте
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Они отвечают за текстаг и ненужны для работы системы, то что за них отвечает находится в кастом коде карты....Могу сам настроить вам систему по вашему хотению, обращаться в ЛС или в эту тему
Отредактирован Escapist
Что еще нужно?
Использование близзовских глобалок не даёт никакого прироста производительности и не имеет смысла.
Могу поправить если это так уж критично...
Так что зачем тратить время, когда можно взять готовое и переделать под себя...
Отредактирован SANTIMEL
Кстати нужная вещь ! Спс автору !