XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Барахолка
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
Respawn system 1.2
Название: Respawn system
Текущая версия: 1.2
Система воскрешает мобов и героев. Для героев действует обычное воскрешение с некоторыми настройками. Для мобов же более расширенные настройки.
Настройки таковы:
Герой
  • Настройка эффекта при возраждении (string)
  • Время перерождения (real)
  • Точка воскрешения (X,Y) (real,real)
Моб
  • Настройка эффекта при возраждении (string)
  • Время перерождения (real)
  • Сохранение изначальное позиции моба (boolean)
  • Сохранение угла обзора (boolean)
  • Воскрешение в случайной точке (boolean)
  • Указание радиуса случайной точки от места воскрешения (real,real)
  • Номер игрока чьи мобы будут воскрешаться (integer).
Всё это можно изменить на то, что вам подходит.
» 1.1b > 1.2
1. В 100500 раз повышена читабельность.
2. Небольшая оптимизация.
3. Убрано требование к библиотеке MyJass
4. Добавлены новые функции.
» Система
/*                     RESPAWN SYSTEM BY OXYGEND v1.2                                       */
library RespawnSystem initializer DeathEventCreep requires WorldBounds

    globals
     
        private constant string    Syslog                                   = "Respwan system"
        private constant boolean   ShowDebug                                = false
        private constant boolean   EnableSystem                             = true

    // Настройки воскрешения героя
        private constant string   RESPAWN_EFFECT_HERO                       = "Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl"
        private constant real     RES_X                                     = 482.40
        private constant real     RES_Y                                     = 200.10
        private constant real     RESPAWN_TIME_HERO                         = 5.00
        
      // Настройки воскрешения крипов  
        private constant string   RESPAWN_EFFECT_CREEP                      = "Abilities\\Spells\\Items\\AIre\\AIreTarget.mdl"
        private constant integer  NUMBER_OF_RESPAWN_PLAYER                  = PLAYER_NEUTRAL_AGGRESSIVE
        private constant boolean  SAVE_LOCATION                             = false
        private constant boolean  SAVE_ANGLE                                = true
        private constant boolean  RANGE_CREATE                              = false
        private constant real     MIN_RANGE                                 = -250.00
        private constant real     MAX_RANGE                                 = 250.00
        private constant real     RESPAWN_TIME_CREEP                        = 3.50
        
     // Прочие настройки
        private constant boolean  PRELOAD                                   = true
        private constant integer  HASH_KEY1                                 = 0
        private constant integer  HASH_KEY2                                 = 1
        private constant integer  HASH_KEY3                                 = 2
        private constant integer  HASH_KEY4                                 = 3
        private constant integer  HASH_KEY5                                 = 4
        
        // Остальное
        private hashtable   RESPHASH = InitHashtable()
        private integer     CreepCount = 0
        private real array  Xcreep
        private real array  Ycreep
        private real array  CreepAngle
        private unit array  CreepType
        
    endglobals
    
    private function SysLog takes string s returns nothing
       call DisplayTimedTextToPlayer(Player(pid),0.00,0.00,5.00,"["+spc+Syslog+et+"] "+ "|cFFFF0000"+s+"|r" )
    endfunction
    
    private function HeroCond takes nothing returns boolean
        return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true
    endfunction

    private function CreepCond takes nothing returns boolean
        return GetOwningPlayer(GetTriggerUnit()) == Player(NUMBER_OF_RESPAWN_PLAYER)
    endfunction

    private function BoolCond takes nothing returns boolean
        return true
    endfunction

    private function DeathTimeHero takes nothing returns nothing
        local timer      TIMER          = GetExpiredTimer   (                                        )
        local integer    handid         = GetHandleId       (TIMER                                   )
        local unit       nowRespawn     = LoadUnitHandle    (RESPHASH, handid, HASH_KEY1             )
        local player     playerShow     = Player            (GetPlayerId(GetOwningPlayer(nowRespawn)))
        
         if (GetLocalPlayer() == playerShow) then
             call PanCameraTo(RES_X, RES_Y)
         endif
         
        call ReviveHero           (nowRespawn, RES_X, RES_Y, false)
        call DestroyEffect        (AddSpecialEffect(RESPAWN_EFFECT_HERO, RES_X, RES_Y))
        call FlushChildHashtable  (RESPHASH, handid)
        call DestroyTimer         (TIMER)
        
          static if ShowDebug then
            SysLog("|cFFFF0000Hero respawned. Hashtable cleared.")       
          endif
          
        set TIMER      = null
        set playerShow = null
        set nowRespawn = null
    endfunction
    
    private function DeathTimeCreep takes nothing returns nothing
        local timer     TIMER          = GetExpiredTimer    (                            )
        local real      Angle          = GetRandomReal      (0.00, 360.00                )
        local integer   handid         = GetHandleId        (TIMER                       )
        local integer   creepnum       = LoadInteger        (RESPHASH, handid , HASH_KEY2)
        local integer   nowRespawnId   = LoadInteger        (RESPHASH, handid , HASH_KEY3)
        local player    rp             = Player             (NUMBER_OF_RESPAWN_PLAYER    )
        local real      x              = Xcreep             [creepnum]
        local real      y              = Ycreep             [creepnum]
        local real      addrangeX      = 0.00
        local real      addrangeY      = 0.00
        
         static if RangeCreate then
            set addrangeX = GetRandomReal  (MinRange,MaxRange)
            set addrangeY = GetRandomReal  (MinRange,MaxRange)
         endif
         
         static if not SaveLocation then
           set x = LoadReal  (RESPHASH,handid, HASH_KEY4)
           set y = LoadReal  (RESPHASH, handid, HASH_KEY5)
         endif
         
         if SAVE_ANGLE then
           set Angle = CreepAngle[creepnum]
         endif
         
          set CreepType[creepnum] = CreateUnit  (rp, nowRespawnId,x+addrangeX,y+addrangeY, Angle )
          call DestroyEffect(AddSpecialEffect   (RESPAWN_EFFECT_CREEP, x+addrangeX, y+addrangeY))
          call FlushChildHashtable              (RESPHASH, handid)
          call DestroyTimer                     (TIMER)
          
            static if ShowDebug then
               SysLog("Creep respawned. Hashtable cleared.")
            endif
            
         set TIMER = null
         set rp    = null
    endfunction

    private function DeathActionHero takes nothing returns nothing
        local timer    TIMER    = CreateTimer  (     )
        local unit     Die      = GetDyingUnit (     )
        local integer  handid   = GetHandleId  (TIMER)
        call SaveUnitHandle(RESPHASH, handid, HASH_KEY1, Die)
        call TimerStart(TIMER, RESPAWN_TIME_HERO, false, function DeathTimeHero)
        
            static if ShowDebug then
                SysLog("Hero dead. Saved to hashtable. Respawn in "+R2S(RESPAWN_TIME_HERO))
            endif
            
        set Die = null
    endfunction
    
    private function DeathActionCreep takes nothing returns nothing
        local timer   TIMER      = CreateTimer  (     )
        local unit    Die        = GetDyingUnit (     )
        local integer handid     = GetHandleId  (TIMER)
        local integer index      = 0
        loop
            exitwhen index > CreepCount
             if Die == CreepType[index] then
                  call SaveInteger  (RESPHASH, handid, HASH_KEY2, index)
                   
                 static if not SaveLocation then
                   call SaveReal    (RESPHASH, handid, HASH_KEY4, GetUnitX(Die))
                   call SaveReal    (RESPHASH, handid, HASH_KEY5,GetUnitY(Die))
                 endif
                 
                 call SaveInteger(RESPHASH, handid, HASH_KEY3, GetUnitTypeId(CreepType[index]))
                 call TimerStart(TIMER, RESPAWN_TIME_CREEP, false, function DeathTimeCreep)
             endif
            set index = index + 1
        endloop
            static if ShowDebug then
                SysLog("Creep dead. Saved to hashtable. Respawn in " + R2S(RESPAWN_TIME_CREEP))
            endif
            
        set Die = null
    endfunction
    
    private function SetCreepSetting takes nothing returns nothing
        local unit enum = GetEnumUnit()
        
        static if SaveLocation then
            set Xcreep[CreepCount] = GetUnitX(enum)
            set Ycreep[CreepCount] = GetUnitY(enum)
        endif
        
        static if SaveAngle then
            set CreepAngle[CreepCount] = GetUnitFacing(enum)
        endif
        
        set CreepType[CreepCount] = enum
        set CreepCount = CreepCount + 1
        
        set enum = null
    endfunction

    private function DeathEventHero takes nothing returns nothing
        local integer index = 0
        local trigger t = CreateTrigger()
        local player Pind = null
        loop
          exitwhen index == 15
            set Pind = Player(index)
            call TriggerRegisterPlayerUnitEvent(t, Pind, EVENT_PLAYER_UNIT_DEATH, null)
            set index = index + 1
        endloop
        call TriggerAddCondition  (t, function HeroCond        )
        call TriggerAddAction     (t, function DeathActionHero )
        
        set t    = null
        set Pind = null
    endfunction
    
    private function DeathEventCreep takes nothing returns nothing
        local group     g        = CreateGroup   ()
        local trigger   t        = CreateTrigger ()
        local player    Pind     = null
        local integer   index    = 0
        static if EnableSystem then
        
          call GroupEnumUnitsInRect  (g, WorldBound , function BoolCond)
          call ForGroup              (g, function SetCreepSetting      )
          
            loop
             exitwhen index == 15
              set Pind = Player                     (index)
              call TriggerRegisterPlayerUnitEvent   (t, Pind, EVENT_PLAYER_UNIT_DEATH, null)
              set index = index + 1
            endloop
           
          call TriggerAddCondition  (t, function CreepCond)
          call TriggerAddAction     (t, function DeathActionCreep )
          
           static if PRELOAD then
              call Preload  (RESPAWN_EFFECT_CREEP)
              call Preload  (RESPAWN_EFFECT_HERO)
           endif
           
           call DeathEventHero()
           
            static if ShowDebug then
                SysLog("Creep and Hero respawn event enabled.")
            endif
            
          endif
          
          call DestroyGroup(g)
          set g    = null
          set t    = null
          set Pind = null
     endfunction

endlibrary
Прочие переменные и используемая библиотека
globals
    constant integer creeppl = PLAYER_NEUTRAL_AGGRESSIVE
    constant integer pid = 0
    constant string spc = "|cFFFFCD00"
    constant string et = "|r"
endglobals
» World Bounds
library WorldBounds

    globals
        private constant boolean USE_REGION = false
        private constant boolean USE_RECT = true
        private constant boolean USE_EXTREMA_COORDS = true
        private constant boolean USE_CENTER_COORDS = true
    endglobals
    private module WorldBoundInit
        private static method onInit takes nothing returns nothing
            static if not USE_RECT then
                local rect world=GetWorldBounds()
            else
                set world=GetWorldBounds()
            endif
            static if USE_EXTREMA_COORDS then
                set maxX=GetRectMaxX(world)
                set maxY=GetRectMaxY(world)
                set minX=GetRectMinX(world)
                set minY=GetRectMinY(world)
            endif
            static if USE_CENTER_COORDS then
                set centerX=(maxX+minX)/2
                set centerY=(minY+maxY)/2
            endif
            static if USE_REGION then
                set worldRegion=CreateRegion()
                call RegionAddRect(worldRegion,world)
            endif
            static if not USE_RECT then
                call RemoveRect(world)
                set world=null
            endif
                            set WorldBound = world
        endmethod
    endmodule
    struct WorldBounds extends array
        static if USE_EXTREMA_COORDS then
            readonly static real maxX
            readonly static real maxY
            readonly static real minX
            readonly static real minY
        endif
        static if USE_CENTER_COORDS then
            readonly static real centerX
            readonly static real centerY
        endif
        static if USE_RECT then
            readonly static rect world
        endif
        static if USE_REGION then
            readonly static region worldRegion
        endif
        implement WorldBoundInit
    endstruct
endlibrary

Отредактировано Oxygen D, 18.12.2011 в 01:43.
Старый 18.10.2011, 20:42
Banzay89

offline
Опыт: 11,155
Активность:
маленький вопрос - зачем? зачем делать то, что уже давно сделали до вас?
Старый 18.10.2011, 20:45
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
Писал для себя, решил народу показать. Темболее не нашёл системы реса крипов на изначальных позициях.
Старый 18.10.2011, 20:46
VetsaN
HeartLove Labs
offline
Опыт: 29,157
Активность:
Banzay89, помнится была древняя система на сайте, но она не пашет с новой версией вара
Старый 18.10.2011, 20:47
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
VetsaN:
помнится была древняя система на сайте, но она не пашет с новой версией вара
Ну вот будет ей замена.
З.Ы Единственное что нашёл это система респа крипов на старт позициях сделаная на гуи в 2 триггера с глюками + как я нашёл там 1 утечка с группой.
Старый 18.10.2011, 20:50
VetsaN
HeartLove Labs
offline
Опыт: 29,157
Активность:
Для фирст версии сойдет. Надеюсь получить больше настраиваемых параметров и функций в итоге.
Старый 18.10.2011, 20:50
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
VetsaN, Я хочу ещё поставить воскрешение крипа не на точной позици, а в рандомной точке в радусе.
Старый 18.10.2011, 20:51
Pel_man

offline
Опыт: 1,033
Активность:
Система просто кул, продолжай в том же духе
Старый 18.10.2011, 21:13
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
Уже поставил, пост обновил.
Старый 18.10.2011, 21:13
Suite
┌_____┐
offline
Опыт: 11,222
Активность:
Oxygen_D, у меня вопрос можна ли эти коды сокротить хотябы на 0.5 раз. А то уж много кода для респавн системы.
Старый 18.10.2011, 21:17
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
Suite, Можно немного, если убрать дебаг. Но его оставил, а то вдруг, что.
Старый 18.10.2011, 21:19
Pel_man

offline
Опыт: 1,033
Активность:
у меня вопрос можна ли эти коды сокротить хотябы на 0.5 раз. А то уж много кода для респавн системы.
А в чем проблема?
Старый 18.10.2011, 21:24
Banzay89

offline
Опыт: 11,155
Активность:
Oxygen_D:
Темболее не нашёл системы реса крипов на изначальных позициях.
плохо искал, очень плохо. но все же молодец, хоть ктото еще чтото делает =D
Старый 18.10.2011, 21:32
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Цитата:
Сообщение от Suite
Oxygen_D, у меня вопрос можна ли эти коды сокротить хотябы на 0.5 раз. А то уж много кода для респавн системы.


:facepalm: количество кода никак не связано с качеством и производительностью в большинстве случаев.
Старый 18.10.2011, 21:52
SageOne
x
offline
Опыт: 46,054
Активность:
Добавил в заметки, думаю, что заюзаю в диабло, когда снова за него засяду :)
Спасибо.
Старый 18.10.2011, 21:59
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
Пиначет:
Добавил в заметки, думаю, что заюзаю в диабло, когда снова за него засяду :)
Спасибо.
Пожалуйста:)
alexprey:
уныло
И что ты нашёл такого унылого тут?
Старый 18.10.2011, 22:25
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Цитата:
Сообщение от Oxygen D
И что ты нашёл такого унылого тут?

Разве код не уныл? С кучей ненужностей
Старый 18.10.2011, 23:27
Pel_man

offline
Опыт: 1,033
Активность:
Vadik29, Ты сможешь сделать это МУИ? +воскрешение героев МУИ и воскрешение мобов на их же локациях безутечно? На ГУИ?
Старый 19.10.2011, 16:15
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Pel_man, представь такое иногда возможно. Запомни ГУИ - это не всегда утечки, а МУИ в данном случаи здесь не уместно
Старый 19.10.2011, 16:24
Suite
┌_____┐
offline
Опыт: 11,222
Активность:
xD муи респавн крипов ага.
Да легко делается муи воскрешение на гуи. В лучшем случие есть CS ;)
тут че и респавн героев тоже есть? 0.о
Suite добавил:
a все увидил
Старый 19.10.2011, 16:55
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 15:01.