Creep Respawn System (CRS)

Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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
код системы!
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 карте
2 комментария удалено
1
6
12 лет назад
1
Скопировал папку инициализации и папку отоброжения опыта в гуи. Карта перестала работать, а именно: При нахождение карты в варике не отоброжаеться кол-во игроков... тоесть карту нельзя запустить всместо игроков просто пустота.
1
32
12 лет назад
1
Следуйте комментариям, удалите 2 строчки из кода в карте...
Они отвечают за текстаг и ненужны для работы системы, то что за них отвечает находится в кастом коде карты....Могу сам настроить вам систему по вашему хотению, обращаться в ЛС или в эту тему
1
22
12 лет назад
1
Msey, не гони гусей, пусть отзывы появятся еще хотя бы пара-тройка штук, тогда публиковать, а оформлено паршиво, переоформить прошу, лого уныло (не в плане что там герб СССР, а в плане того, как он используется)
1
32
12 лет назад
Отредактирован Escapist
1
Escapist, норм оформлено, это не проект а система, тема есть, лого есть, тут как бы пихать то сильно нечего, описание есть..
Что еще нужно?
2
26
12 лет назад
2
Если кто-то будет создавать хеш-таблицу через гуи или InitHashtableBJ, то вся система накроется. Я уже не говорю о том, что какая-то другая система может юзать bj_lastCreatedHashtable. И вообще в системах лучше использовать свои приватные глобалки везде, где возможно. В данной системе приватными можно сделать абсолютно все.
Использование близзовских глобалок не даёт никакого прироста производительности и не имеет смысла.
1
32
12 лет назад
1
Hanabishi, в vJass юзается приватная переменная...
Могу поправить если это так уж критично...
0
33
12 лет назад
0
Поправь.
0
22
12 лет назад
0
quq_CCCP, лого поменяй, или иначе публикации не будет, советую в почитать статеек о работе с текстом в фш и сделать добротный логотип
0
26
12 лет назад
0
Зачем нужна ссылка на форум? Этот ресурс должен обсуждаться здесь.
1
32
12 лет назад
1
Hanabishi, там, уже часть вопросов разобрали...
0
22
12 лет назад
0
Приколиссимо. Я бы заюзал в своей карте, если бы не был гордым.
5
32
12 лет назад
5
bladget, Юзать чужие труды и учится на чужих ошибках не стыдно, стыдно наступать на те же грабли, на которые уже наступали до тебя...
Так что зачем тратить время, когда можно взять готовое и переделать под себя...
6
32
12 лет назад
6
Да кто тут минусит? и за что?
2
1
12 лет назад
2
quq_CCCP большое спасибо очень помог все работает на ура, плюсы дал =)
5
32
12 лет назад
5
Всегда пожалуйста...
1
18
11 лет назад
Отредактирован SANTIMEL
1
Спасибо. Я эту наработку в качестве мода использую.
1
18
11 лет назад
1
Ps : Хрень какая-то, часть убитых мобов, появляется по середине карты.
5
1
11 лет назад
5
У меня всё норм по моему .
Кстати нужная вещь ! Спс автору !
Чтобы оставить комментарий, пожалуйста, войдите на сайт.