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

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

Ответ
 
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,598
Активность:
Системы опыта и респауна крипов

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

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

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

Плюсы моей системы распределения опыта
  • Не требует глобальных переменных
  • Состоит из одного триггера, который можно скопировать...
  • Множество настроек, таких как радиус распределения опыта, и фактор его снижения и другое...
  • Ненужен JGNP, и прочие надстройки, код выполнен на простом jass
  • Подробные комментарии
  • Есть гуи версия для новичков
Минусы
  • Для создание текстага с кол-вом опыта, необходима хеш таблица и 2 функции из кастом кода карты...(минус для гуишников)
  • Не совсем оптимальный код, всё дело в настройках, лучше подставлять конкретные значения в код системы, а не в константные функции...
» Код системы
((код jass
Настройка системы опыта
********************************************************************************************
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
))
((кат код системы
((код jass
Кастом код карты
функции создания и удалени крипов
эти функции необязательны для работы системы, но они могут понадобится для создания и удаления крипов во время игры
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 библиотека
((код jass
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 Кбайт, 211 просмотров )
Тип файла: w3x XAT+struct.w3x (100.6 Кбайт, 137 просмотров )

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

offline
Опыт: 8,074
Активность:
лучше подставлять конкретные значения в код системы, а не в константные функции..
Но ведь можно использовать 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
Опыт: 94,598
Активность:
DaeDR, настроить легко на своё усмотрение... хоть 10000 ренж
Старый 10.04.2012, 14:52
DaeDR

offline
Опыт: 8,074
Активность:
quq_CCCP, Это конечно да. Но многие используют наработки, даже не глядя в них)
Код респауна выложи тоже. Будет хоть на что посмотреть)
Старый 10.04.2012, 14:54
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,598
Активность:
DaeDR, запусти карту, там действительно есть на что посмотреть, довольно удобная наработка...ну я её еще доделаю...
Старый 10.04.2012, 14:56
DaeDR

offline
Опыт: 8,074
Активность:
Такой вопрос. Почему бы не самоинициализировать Хеш-таблицу и запустить триггер респауна?
» Например вот так
//=======================================================================
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
Опыт: 94,598
Активность:
DaeDR, исключительно для удобства пользователей, у которых всё в одном триггере инициализации,
а кстати.мб сделать версии на vJass/cJass для особо продвинутых?
скоро доработаю
Старый 10.04.2012, 15:06
DaeDR

offline
Опыт: 8,074
Активность:
Как понять это:
function bj_boolRandomType takes nothing returns boolean // разные типы крипов одного уровня?
...
Что это за функция? За что она отвечает? я чего-то не понял
DaeDR добавил:
мб сделать версии на vJass/cJass для особо продвинутых?
Даже не знаю. "Продвинутые" делают сами. Особых сложностей тут нет
Старый 10.04.2012, 15:07
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,598
Активность:
DaeDR:
Как понять это:
function bj_boolRandomType takes nothing returns boolean // разные типы крипов одного уровня?
...
Что это за функция? За что она отвечает? я чего-то не понял
Всегда один тип респится, или разные типы крипов но 1 и того же уровня...
Старый 10.04.2012, 15:08
DaeDR

offline
Опыт: 8,074
Активность:
Но возможно стоит сделать версию через define. Для тех, кто использует JNGP это будет намного лучше и удобней
DaeDR добавил:
quq_CCCP:
DaeDR:
Как понять это:
function bj_boolRandomType takes nothing returns boolean // разные типы крипов одного уровня?
...
Что это за функция? За что она отвечает? я чего-то не понял
Всегда один тип респится, или разные типы крипов но 1 и того же уровня...
Стоит слегка изменить в примере для понимания
Старый 10.04.2012, 15:09
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,598
Активность:
DaeDR, я правда не экспериментировал со всеми настройками, поставил самые красочные, ну можно пробовать не удалять трупы, и не создавать эффекты, и время респа сделать 5* на уровень моба, пробуй...
Старый 10.04.2012, 15:12
DaeDR

offline
Опыт: 8,074
Активность:
Есть такая строчка в коде респауна:
» Код
function Timer_Creep_Respawn_Actions takes nothing returns nothing
    ...
    local unit NewCreep = null // Зачем обнулять, если потом все равно потом заменять? лишнее действие
    ...
endfunction
Мм.. разбирать все по косточкам? А то очень скучно
DaeDR добавил:
...не создавать эффекты, и время респа сделать 5* на уровень моба, пробуй...
Меня интересует только реализация. Сам такую могу сделать без проблем
Старый 10.04.2012, 15:16
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,598
Активность:
DaeDR, да я только за разумную критику, ну это только первая версия, я еще многое доработаю, и переделаю...
Но многим и этого хватит за глаза....
Старый 10.04.2012, 15:17
DaeDR

offline
Опыт: 8,074
Активность:
Может стоит дополнить одну функцию (по респауну)
» Было
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
Опыт: 94,598
Активность:
DaeDR, ну буду исправлять, скоро скину новую версию и код...
Старый 10.04.2012, 15:35
DaeDR

offline
Опыт: 8,074
Активность:
quq_CCCP, Наработка NETRAT была очень старой видно. Есть утечки: локация, группа, boolexpr, возможно и другие.
Надо переписать.
DaeDR добавил:
И quq_CCCP, было бы просто замечательно исправить орфографические ошибки)
Старый 10.04.2012, 15:55
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,598
Активность:
DaeDR, где там утечки? бул еспр удаляется как и локация, там то на то и выходит... см содежание функции..
Старый 10.04.2012, 16:03
DaeDR

offline
Опыт: 8,074
Активность:
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
Опыт: 94,598
Активность:
DaeDR, ну через local location loc
call Removelocation(loc ) и всё...
ну можно чисто нативками но там то на то и выдет...
а нафиг ты строку обнуляеш? нулл не хендлу присвоил? это то же базовый тип, их ненужно обнулять...

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

offline
Опыт: 8,074
Активность:
Старый 10.04.2012, 16:21
Ответ

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

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

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

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



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