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

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

Ответ
 
quq_CCCP
Я белый и пушистый!
offline
Опыт: 64,953
Активность: 24897
Участник проектов:
-God's word: The True Way
-Мастерская girvel-а
Системы опыта и респауна крипов

2 редкие наработки на XGM

Недавно я наткнулся на тему о Триггерной системе распределения опыта а также на тему о Респауне крипов, собираясь кинуть авторам ссылки на старые темы я обнаружил что на сайте есть одна гуишная, неработоспособная наработка системы распределения опыта, 2 системы респауна крипов основанных на RB(return bug)
return bug и GameСache неактуальны с момента выхода патча 1.24а
И я решил сделать собственные системы, которые будут актуальны...

Система распределения опыта v 1.0d + GUI

Плюсы моей системы распределения опыта
  • Не требует глобальных переменных
  • Состоит из одного триггера, который можно скопировать...
  • Множество настроек, таких как радиус распределения опыта, и фактор его снижения и другое...
  • Ненужен JGNP, и прочие надстройки, код выполнен на простом jass
  • Подробные комментарии
  • Есть гуи версия для новичков
Минусы
  • Для создание текстага с кол-вом опыта, необходима хеш таблица и 2 функции из кастом кода карты...(минус для гуишников)
  • Не совсем оптимальный код, всё дело в настройках, лучше подставлять конкретные значения в код системы, а не в константные функции...
» Код системы
//Настройка системы опыта   
//********************************************************************************************
function bj_areaOfSharingExpr takes nothing returns real
   return 1000.0 // область в коротрой героям будут давать опыт
endfunction
//**********************************************************
//Давать опыт союзникам?
function bj_boolGiveExprBounty takes nothing returns boolean
   return true // если нет замени true на false (тока без ошибок)
endfunction
//**********************************************************
//Случайное количество опыта? или всегда одно значение за моба
function bj_boolRandomExpFactor takes nothing returns boolean
   return true
endfunction
//**********************************************************
//Фактор случайного опыта (сколько процентов плюс или минус)
function bj_randomExpFactor takes nothing returns real
   local real FACTOR = 0.20 //<< вот тута меняем фактор
   if(FACTOR >=1.00)then         // не трогать!
   set  FACTOR = FACTOR /100.00   // не трогать!
   endif                         // не трогать!
   return FACTOR                 // не трогать!
endfunction  //(ну несли вы сильно умный впишите конекретные значения и удалите раздел настройки)                     
//**********************************************************
// фастор уменьшения опыта взависимости от растояния, те сколько вычесть опыта из числа взависимости от растоятния...
function GetExprReductionFactor takes unit uMonster, unit uKiller returns real
   local real dx = GetUnitX(uMonster) - GetUnitX(uKiller)
   local real dy = GetUnitY(uMonster) - GetUnitY(uKiller)
   return SquareRoot(dx * dx + dy * dy)/50.00 // 50 можно сменить на ваше число, также можно и свою функцию вставить
endfunction
//**********************************************************
// функция проверки уровня героя, его можно настроеть как вам угодно
function IsHeroLevelRequired takes unit uHero, unit uMonster returns boolean
   return (GetHeroLevel(uHero) - GetUnitLevel(uMonster)) < 4
   // ставим сюда своё условие если это неустраивает
   // к примеру если юнит таково то типа то недавать опыт (IsUnitType(uMonster) != 'n000')
   // можно вписать любое выражение результатом которого будет true или false
endfunction
// дополнитеные условия
function Trig_Hero_Exp_Conditions takes nothing returns boolean
    // условия  является ли 
    return IsUnitType( GetKillingUnit(), UNIT_TYPE_HERO ) 
    
endfunction

//********************************************************************************************
// далее меняем настройки на свой старх и риск
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
function Cond_AllyInRangeFilter takes nothing returns boolean
    return IsUnitType( GetFilterUnit(), UNIT_TYPE_HERO ) and IsUnitAlly(GetFilterUnit(),bj_groupEnumOwningPlayer) and GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0.00 and IsHeroLevelRequired(GetFilterUnit(),bj_lastCreatedUnit)
endfunction
// опыт за юнита **Автор NETRAT**
// можно нарыть в библиотеке функций сайта XGM
function aow_GetApxExpBounty takes unit u returns real 
  return SquareRoot((GetUnitState(u, UNIT_STATE_MAX_LIFE) + GetUnitState(u, UNIT_STATE_MAX_MANA)) * GetUnitLevel(u)) * 2
endfunction

function Group_AddHeroExp takes nothing returns nothing // функция добавления опыта...
   local unit hero = GetEnumUnit() 
   local integer HeroExpr = R2I(aow_GetApxExpBounty(bj_lastCreatedUnit) - GetExprReductionFactor(bj_lastCreatedUnit,hero))
   if(bj_boolRandomExpFactor()) then
        set HeroExpr = HeroExpr+R2I(GetRandomReal(PercentToInt(bj_randomExpFactor(),HeroExpr),-PercentToInt(bj_randomExpFac​tor(),HeroExpr)))
   endif
   call FloatingTextFadeout(GetOwningPlayer(hero),hero,"|cff00CD00+"+I2S(HeroExpr)+"|r")​// текстаг, эту строку можно удалить
   call AddHeroXP(hero,HeroExpr,false)
endfunction

function Trig_Hero_Exp_Actions takes nothing returns nothing
    local unit uHero = GetKillingUnit()
    local integer HeroExpr = 0
    local group grp = CreateGroup()
    local boolexpr e 
    local string s 
    if(bj_boolGiveExprBounty()) then
       set bj_lastCreatedUnit = GetDyingUnit()
       set bj_groupEnumOwningPlayer = GetOwningPlayer(uHero)
       set e = Filter(function Cond_AllyInRangeFilter)
       call GroupEnumUnitsInRange(grp, GetUnitX(bj_lastCreatedUnit),GetUnitY(bj_lastCreatedUnit),bj_areaOfSharingExpr(),e)
       call ForGroup(grp, function Group_AddHeroExp)
       call DestroyBoolExpr(e)
       call DestroyGroup(grp)
    else
       set HeroExpr = R2I( aow_GetApxExpBounty(bj_lastCreatedUnit) - GetExprReductionFactor(bj_lastCreatedUnit,uHero))
       if(bj_boolRandomExpFactor()) then
          set HeroExpr = HeroExpr+GetRandomInt(PercentToInt(bj_randomExpFactor(),HeroExpr),-PercentToInt(bj_randomExpFactor()​,HeroExpr))
       endif
       call FloatingTextFadeout(GetOwningPlayer(uHero),uHero,"|cff00CD00+"+I2S(HeroExpr)+"|r"​;) // текстаг, эту строку можно удалить
       call AddHeroXP(uHero,HeroExpr,false)
    endif
    set uHero = null
    set grp = null
    set e = null
endfunction

//===========================================================================
function InitTrig_Hero_Exp takes nothing returns nothing
    set gg_trg_Hero_Exp = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEvent(gg_trg_Hero_Exp, Player(PLAYER_NEUTRAL_AGGRESSIVE), EVENT_PLAYER_UNIT_DEATH, null)
    call TriggerAddCondition( gg_trg_Hero_Exp, Condition( function Trig_Hero_Exp_Conditions ) )
    call TriggerAddAction( gg_trg_Hero_Exp, function Trig_Hero_Exp_Actions )
endfunction
Поправки системы
  • Переделана функция вычисления разброса опыта
  • Исправлено описание системы
  • Изменены часть условий
  • Добавлена гуи версия

Система респауна нейтральных крипов

Плюсы системы
  • Не нужно указывать место и тип крипа, просто помещаем на карту нейтрального крипа, ставим ему угол поворота и всё, всё остальное система сделает за вас... Крипы будут респаунится на том месте где они изначально были.
  • Возможность прикрепление спецэффектов при смерти и респауне крипа
  • Возможность удаления трупов, те при смерти крипа не будет оставаться костей...
  • Возможность проверки видят ли игроки точку респауна крипов.
  • Легко переносится, папка с 2 триггерами, требуется хеш таблица (bj_lastCreatedHashtable)
Минусы
  • Для создание или удаления нейтральных мобов во время игры потребуется использовать следующие функции:
CreateCreepOfType Takes integer UnitId, real UnitX, real UnitY, real UnitAngle, returns unit
RemoveCreep takes unit u returns nothing
Поправки системы
  • Теперь ненужно инициализировать хаештаблицу, просто копируем триггеры
  • Добавлена функция удаления триггера Init Creps
  • Убраны мелкие недочёты
  • Добавлен новый параметр Показать эффект при респауне?
  • Добалена версия где настройки производятся в ГУИ триггере, да да теперь и гуи верися для новичков...
» Читать гуишникам
ДЛЯ РАБОТЫ СИСТЕМЫ НУЖНЫ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
Поэтому пере копирование папки с системой, убедитесь что у вас стоит параметр - создавать неизвестные переменные пр вставке триггеров.
Как это узнать - оч просто, открываем редактор, щёлкаем на вкладку фаил. ищем внизу всплывающего меню вкладку - Параметры, щелкаем по ней...
Ищем внизу меню строчку - Автом. создавать неизв. переменные во время вставки триггеров
Там должна стоять галочка как на скрине >- s2.ipicture.ru/uploads/20120520/5C2OpNt1.jpg
Затем смело копируем с вою папку, если это система респауна то удаляем зачёркнутый триггер Creep Respawn v2.0 он нам ненужен, и ставим свои настройки в гуи триггере init System
» код системы
// Кастом код карты
//функции создания и удалени крипов
//эти функции необязательны для работы системы, но они могут понадобится для создания и удаления крипов во время игры
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
» CRS библиотека
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( № )
        // впспомогательные переменные системы
        unit bj_Neutral_Creep
        integer bj_HandleInteger
        integer bj_TimerId
        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
    endfunction
    
    // далее вмешательство в код настоятельно не рекомендуется...
    //********************************************************************************************
    //********************************************************************************************
    
    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 > 11
            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
        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 )

        if IsSpawnPosVisibly_Conditions( UnitX, UnitY ) then
            if bj_RANDOM_CREEP_TYPE then
                set bj_Neutral_Creep = CreateUnit( bj_PLAYER_NEUTRAL_AGGRESSIVE, ChooseRandomCreep( LevelOrType ), UnitX, UnitY, UnitA )
            else
                set bj_Neutral_Creep = CreateUnit( bj_PLAYER_NEUTRAL_AGGRESSIVE, LevelOrType, UnitX, UnitY, UnitA )
            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, UnitX )
            call SaveReal( bj_lastCreatedHashtable, bj_HandleInteger, 1, UnitY )
            call SaveReal( bj_lastCreatedHashtable, bj_HandleInteger, 2, UnitA )
    
            call FlushChildHashtable( bj_lastCreatedHashtable, TimerId )
            call PauseTimer( t )
            call DestroyTimer( t )
        endif
    
        set t = null
    endfunction

    private function Trig_Creep_Resp_Actions takes nothing returns nothing
        local timer t = CreateTimer( )
        set bj_Neutral_Creep = GetDyingUnit()
        set bj_TimerId = GetHandleId( t )
        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( t, bj_creepRespTimeout( ), true, function Timer_Creep_Respawn_Actions )
    
        set t = null
    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 DestroyBoolExpr( 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
    
endlibrary
Теперь есть GUI версия системы, и все версии в 1 карте
Добавлена версия без хештаблиц, на ситеме XAT by ToadCop
Если есть вопросы по настройке системы или вам что то непонятно, пишите мне, я quq_CCCP помогу вам решить ваши проблему и настроить мою систему.
Прикрепленные файлы
Тип файла: w3x CRS+exp V20.w3x (93.8 Кбайт, 190 просмотров )
Тип файла: w3x XAT+struct.w3x (100.6 Кбайт, 121 просмотров )

Отредактировано quq_CCCP, 25.09.2012 в 16:04.
Старый 10.04.2012, 13:48
DaeDR

offline
Опыт: 7,979
Активность: 1654
Участник проектов:
-Саламандра: Honorverse на Warcraft III
лучше подставлять конкретные значения в код системы, а не в константные функции..
Но ведь можно использовать define.
» Пример
define {
AREA = 500.0
}
function ...
..
GroupEnumUnitsInRange ( g, x, y, AREA, f )
..
endfunction
При компиляции вместо AREA будет поставлено значение 500.0
Но есть и "минусы" (для некоторых): Требует JNGP
DaeDR добавил:
Опыт в области 500.0 как-то маловато. Ведь дальность у героя и моба может быть намного больше. Может лучше поставить 700-1000 AOE?
________________
Реальность - та часть вымысла, в которую мы верим
Старый 10.04.2012, 14:42
quq_CCCP
Я белый и пушистый!
offline
Опыт: 64,953
Активность: 24897
Участник проектов:
-God's word: The True Way
-Мастерская girvel-а
DaeDR, настроить легко на своё усмотрение... хоть 10000 ренж
Старый 10.04.2012, 14:52
DaeDR

offline
Опыт: 7,979
Активность: 1654
Участник проектов:
-Саламандра: Honorverse на Warcraft III
quq_CCCP, Это конечно да. Но многие используют наработки, даже не глядя в них)
Код респауна выложи тоже. Будет хоть на что посмотреть)
________________
Реальность - та часть вымысла, в которую мы верим
Старый 10.04.2012, 14:54
quq_CCCP
Я белый и пушистый!
offline
Опыт: 64,953
Активность: 24897
Участник проектов:
-God's word: The True Way
-Мастерская girvel-а
DaeDR, запусти карту, там действительно есть на что посмотреть, довольно удобная наработка...ну я её еще доделаю...
Старый 10.04.2012, 14:56
DaeDR

offline
Опыт: 7,979
Активность: 1654
Участник проектов:
-Саламандра: Honorverse на Warcraft III
Такой вопрос. Почему бы не самоинициализировать Хеш-таблицу и запустить триггер респауна?
» Например вот так
//=======================================================================
function InitTrig_Init_Creps takes nothing returns nothing
    set gg_trg_Init_Creps = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Init_Creps, function Trig_Init_Creps_Actions )
	//добавить
    set bj_lastCreatedHashtable = InitHashtable()
    call TriggerExecute( gg_trg_Init_Creps )
endfunction
Тогда новичкам вообще не придется с этим заморачиваться, следовательно будет больше желающих ее использовать.
________________
Реальность - та часть вымысла, в которую мы верим
Старый 10.04.2012, 15:03
quq_CCCP
Я белый и пушистый!
offline
Опыт: 64,953
Активность: 24897
Участник проектов:
-God's word: The True Way
-Мастерская girvel-а
DaeDR, исключительно для удобства пользователей, у которых всё в одном триггере инициализации,
а кстати.мб сделать версии на vJass/cJass для особо продвинутых?
скоро доработаю
Старый 10.04.2012, 15:06
DaeDR

offline
Опыт: 7,979
Активность: 1654
Участник проектов:
-Саламандра: Honorverse на Warcraft III
Как понять это:
function bj_boolRandomType takes nothing returns boolean // разные типы крипов одного уровня?
...
Что это за функция? За что она отвечает? я чего-то не понял
DaeDR добавил:
мб сделать версии на vJass/cJass для особо продвинутых?
Даже не знаю. "Продвинутые" делают сами. Особых сложностей тут нет
________________
Реальность - та часть вымысла, в которую мы верим
Старый 10.04.2012, 15:07
quq_CCCP
Я белый и пушистый!
offline
Опыт: 64,953
Активность: 24897
Участник проектов:
-God's word: The True Way
-Мастерская girvel-а
DaeDR:
Как понять это:
function bj_boolRandomType takes nothing returns boolean // разные типы крипов одного уровня?
...
Что это за функция? За что она отвечает? я чего-то не понял
Всегда один тип респится, или разные типы крипов но 1 и того же уровня...
Старый 10.04.2012, 15:08
DaeDR

offline
Опыт: 7,979
Активность: 1654
Участник проектов:
-Саламандра: Honorverse на Warcraft III
Но возможно стоит сделать версию через define. Для тех, кто использует JNGP это будет намного лучше и удобней
DaeDR добавил:
quq_CCCP:
DaeDR:
Как понять это:
function bj_boolRandomType takes nothing returns boolean // разные типы крипов одного уровня?
...
Что это за функция? За что она отвечает? я чего-то не понял
Всегда один тип респится, или разные типы крипов но 1 и того же уровня...
Стоит слегка изменить в примере для понимания
________________
Реальность - та часть вымысла, в которую мы верим
Старый 10.04.2012, 15:09
quq_CCCP
Я белый и пушистый!
offline
Опыт: 64,953
Активность: 24897
Участник проектов:
-God's word: The True Way
-Мастерская girvel-а
DaeDR, я правда не экспериментировал со всеми настройками, поставил самые красочные, ну можно пробовать не удалять трупы, и не создавать эффекты, и время респа сделать 5* на уровень моба, пробуй...
Старый 10.04.2012, 15:12
DaeDR

offline
Опыт: 7,979
Активность: 1654
Участник проектов:
-Саламандра: Honorverse на Warcraft III
Есть такая строчка в коде респауна:
» Код
function Timer_Creep_Respawn_Actions takes nothing returns nothing
    ...
    local unit NewCreep = null // Зачем обнулять, если потом все равно потом заменять? лишнее действие
    ...
endfunction
Мм.. разбирать все по косточкам? А то очень скучно
DaeDR добавил:
...не создавать эффекты, и время респа сделать 5* на уровень моба, пробуй...
Меня интересует только реализация. Сам такую могу сделать без проблем
________________
Реальность - та часть вымысла, в которую мы верим
Старый 10.04.2012, 15:16
quq_CCCP
Я белый и пушистый!
offline
Опыт: 64,953
Активность: 24897
Участник проектов:
-God's word: The True Way
-Мастерская girvel-а
DaeDR, да я только за разумную критику, ну это только первая версия, я еще многое доработаю, и переделаю...
Но многим и этого хватит за глаза....
Старый 10.04.2012, 15:17
DaeDR

offline
Опыт: 7,979
Активность: 1654
Участник проектов:
-Саламандра: Honorverse на Warcraft III
Может стоит дополнить одну функцию (по респауну)
» Было
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 = null
    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_boolShowFX() 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 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 = null
    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_boolShowFX() 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)
	else // иначе, т.е. если юнит был виден!
	call TimerStart(t, 3.0 ,true, function Timer_Creep_Respawn_Actions) //уменьшить время для реса
    endif
    
    set NewCreep = null
    set t = null
endfunction
________________
Реальность - та часть вымысла, в которую мы верим
Старый 10.04.2012, 15:29
quq_CCCP
Я белый и пушистый!
offline
Опыт: 64,953
Активность: 24897
Участник проектов:
-God's word: The True Way
-Мастерская girvel-а
DaeDR, ну буду исправлять, скоро скину новую версию и код...
Старый 10.04.2012, 15:35
DaeDR

offline
Опыт: 7,979
Активность: 1654
Участник проектов:
-Саламандра: Honorverse на Warcraft III
quq_CCCP, Наработка NETRAT была очень старой видно. Есть утечки: локация, группа, boolexpr, возможно и другие.
Надо переписать.
DaeDR добавил:
И quq_CCCP, было бы просто замечательно исправить орфографические ошибки)
________________
Реальность - та часть вымысла, в которую мы верим
Старый 10.04.2012, 15:55
quq_CCCP
Я белый и пушистый!
offline
Опыт: 64,953
Активность: 24897
Участник проектов:
-God's word: The True Way
-Мастерская girvel-а
DaeDR, где там утечки? бул еспр удаляется как и локация, там то на то и выходит... см содежание функции..
Старый 10.04.2012, 16:03
DaeDR

offline
Опыт: 7,979
Активность: 1654
Участник проектов:
-Саламандра: Honorverse на Warcraft III
set grp = GetUnitsInRangeOfLocMatching( bj_areaOfSharingExpr(), GetUnitLoc(uHero), Filter(function Cond_AllyInRangeFilter) )
GetUnitLoc(uHero) - точка, которая точно не удаляется!
Хм. а вот Filter(function Cond_AllyInRangeFilter) не знаю. Но я всегда делаю через local boolexpr
А группа действительно удаляется) не заметил
DaeDR добавил:
И строки не удаляются
call FloatingTextFadeout(GetOwningPlayer(uHero),uHero,"|cff00CD00+"+I2S(HeroExpr)+"|r"​;)
Хотя кто-то мне сказал, что через переменные это не поможет, но все же:
local string s = "|cff00CD00+"+I2S(HeroExpr)+"|r"
call FloatingTextFadeout(GetOwningPlayer(uHero),uHero,s)
set s = null
На душе будет спокойней
________________
Реальность - та часть вымысла, в которую мы верим
Старый 10.04.2012, 16:08
quq_CCCP
Я белый и пушистый!
offline
Опыт: 64,953
Активность: 24897
Участник проектов:
-God's word: The True Way
-Мастерская girvel-а
DaeDR, ну через local location loc
call Removelocation(loc ) и всё...
ну можно чисто нативками но там то на то и выдет...
а нафиг ты строку обнуляеш? нулл не хендлу присвоил? это то же базовый тип, их ненужно обнулять...

Отредактировано quq_CCCP, 10.04.2012 в 16:14.
Старый 10.04.2012, 16:08
DaeDR

offline
Опыт: 7,979
Активность: 1654
Участник проектов:
-Саламандра: Honorverse на Warcraft III
________________
Реальность - та часть вымысла, в которую мы верим
Старый 10.04.2012, 16:21
Ответ

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

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

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

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



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