Вот система сбора предметов (разрушаемых обьектов на самом деле). Вот конструкция из 3-х триггеров. Почему она не работает, а именно - не срабатывает событие второго триггера при смерти разрушаемых обьектов?
Code
function Trig_GetHerb_Actions takes nothing returns nothing local integer o = GetPlayerId(GetOwningPlayer(GetKillingUnit())) + 1 local destructable dest = GetDyingDestructable() local integer dt = GetDestructableTypeId(dest) local real d = LoadReal(udg_Hash, GetHandleId(dest), 0) local integer i = LoadInteger(udg_Hash, GetHandleId(dest), 1)
call BJDebugMsg("yes") if dt == 'B002' then call SetUnitState( udg_HeroesPlaying[o], UNIT_STATE_LIFE, GetUnitState( udg_HeroesPlaying[o], UNIT_STATE_LIFE ) + GetUnitState( udg_HeroesPlaying[o], UNIT_STATE_LIFE ) * d ) endif if dt == 'B005' then call SetUnitState( udg_HeroesPlaying[o], UNIT_STATE_MANA, GetUnitState( udg_HeroesPlaying[o], UNIT_STATE_MANA ) + GetUnitState( udg_HeroesPlaying[o], UNIT_STATE_MANA ) * d ) endif
set udg_Herbs[i] = null set dest = null endfunction
//=========================================================================== function InitTrig_GetHerb takes nothing returns nothing set gg_trg_GetHerb = CreateTrigger( ) call TriggerRegisterDestDeathInRegionEvent( gg_trg_GetHerb, bj_mapInitialPlayableArea ) call TriggerAddAction( gg_trg_GetHerb, function Trig_GetHerb_Actions ) endfunction
Code
function Trig_Rewards_Actions takes nothing returns nothing local unit u = GetDyingUnit() local integer l = GetUnitLevel(u) local player p = GetOwningPlayer(u) local real x = GetWidgetX(u) local real y = GetWidgetY(u) local integer array herb local real hSize local real hRest local integer n = GetRandomInt( 0, 100 ) local integer h if GetPlayerId(p) > 9 and l < 21 then
set herb[1] = 21 - l set herb[2] = herb[1] + 21 - l set herb[3] = herb[2] + R2I( l * 0.7 ) set herb[4] = herb[3] + R2I( l * 0.7 ) set herb[5] = herb[4] + R2I( l * 0.4 ) set herb[6] = herb[5] + R2I( l * 0.4 )
if n <= herb[1] then set h = 'B002' set hSize = 0.45 set hRest = 0.1 elseif n > herb[1] and n <= herb[2] then set h = 'B005' set hSize = 0.45 set hRest = 0.1 elseif n > herb[2] and n <= herb[3] then set h = 'B002' set hSize = 0.55 set hRest = 0.2 elseif n > herb[3] and n <= herb[4] then set h = 'B005' set hSize = 0.55 set hRest = 0.2 elseif n > herb[4] and n <= herb[5] then set h = 'B002' set hSize = 0.7 set hRest = 0.3 elseif n > herb[5] and n <= herb[6] then set h = 'B005' set hSize = 0.7 set hRest = 0.3 elseif n > herb[6] then set h = 0 endif
if h != 0 then if udg_HerbIndex == 50 then set udg_HerbIndex = 1 endif if udg_Herbs[udg_HerbIndex] != null then call RemoveDestructable(udg_Herbs[udg_HerbIndex]) endif set udg_Herbs[udg_HerbIndex] = CreateDestructable( h, x, y, 0.0, hSize, 1 ) call SaveReal(udg_Hash, GetHandleId(udg_Herbs[udg_HerbIndex]), 0, hRest) call SaveInteger(udg_Hash, GetHandleId(udg_Herbs[udg_HerbIndex]), 1, udg_HerbIndex) set udg_HerbIndex = udg_HerbIndex + 1 endif
endif
set p = null set u = null
Сообщение отредактировал FatalBlade - Четверг, 08 Марта 2012, 18:59:16
Это не то. Мне не система зарядов нужно, а система сборки предметов как в стрелялках, то есть просто проходя по предмету, которую я уже фактически реализовал, но есть просто пару косяков.
Щас уже немного другая проблема. Забей на то что я написал выше. Вот код:
Code
function Trig_GetHerb_Actions takes nothing returns nothing local integer o = GetPlayerId(GetOwningPlayer(GetKillingUnit())) + 1 local destructable dest = GetDyingDestructable() local integer dt = GetDestructableTypeId(dest) local real d = LoadReal(udg_Hash, GetHandleId(dest), 0) local integer i = LoadInteger(udg_Hash, GetHandleId(dest), 1)
if dt == 'B002' then call SetUnitState( udg_HeroesPlaying[o], UNIT_STATE_LIFE, GetUnitState( udg_HeroesPlaying[o], UNIT_STATE_LIFE ) + GetUnitState( udg_HeroesPlaying[o], UNIT_STATE_LIFE ) * d ) endif if dt == 'B005' then call SetUnitState( udg_HeroesPlaying[o], UNIT_STATE_MANA, GetUnitState( udg_HeroesPlaying[o], UNIT_STATE_MANA ) + GetUnitState( udg_HeroesPlaying[o], UNIT_STATE_MANA ) * d ) endif
set udg_Herbs[i] = null set dest = null endfunction
//=========================================================================== function InitTrig_GetHerb takes nothing returns nothing set gg_trg_GetHerb = CreateTrigger( ) call TriggerAddAction( gg_trg_GetHerb, function Trig_GetHerb_Actions ) endfunction
Событие добавляется триггерно с другого триггера. Массив юнитов udg_HeroesPlaying[] = герои выбранные игроками. Индекс = номер игрока. Массив декораций udg_Herbs[] = хербы(или орбы) которые в данный момент валяются на земле и могут быть поднятыми.
С помошью дебага я выяснил, что проблема в GetKillingUnit(). В данном случае он не отлавливает юнита убившего декор. А это влияет на переменную "о", которая является номером игрока, а значит и индексом udg_HeroesPlaying[o]. Не возможно вычислить убивателя >> невозможно вычислить игрока >> невозможно вычислить героя который пренадлежит этому игроку.
Что делать? Есть альтернативы, и почему вообще он не отлавлиает GetKillingUnit() ?
Я не пойму, при чем тут GetKillingUnit(). Почему бы не сделать пик декораций вокруг героев каждые полсекунды?
Потому что создаётся группа декораций, которую почему то нельзя занести в переменную и удалить, и потому что пик декораций или предметов, в отличие от пика юнитов, ТРЕБУЕТ СОЗДАНИЕ ОБЛАСТИ!!! А постоянное создание и удаление областей это хоть и не утечно, но это мощные лаги.
Ну вот почему ты так уверен, ты проверял уже? Я вот проверял, пикал каждую секунду юнитов в 4х областях, и какбы лагов не наблюдал.
Каждую секунду в 4-х областях. ммм А у меня пикалось каждые 0.35 секунд в 10 областях На моём компе с этим тоже проблем не было. Но вот на более слабых компах лагало. Я удалил это, и начало работать чуть получше. Конечно я убрал не только это, но и 2 трети глобальных генерируемых областей. Вообщем области = зло.)
Сообщение отредактировал FatalBlade - Пятница, 09 Марта 2012, 15:12:29
Это нехило нагружает слабые компы. У меня к счастью таких проблем нету, но что поделать если в нашем 2012 году у многих людей дома стоят "Тетрисы" а не компы.
Ну вот ты зайди на ХГМ и увидишь, что по постам многих участников форума скаладывается впечатление, что их бытовая техника застряла где то в конце 90-х.
Ty3uK, Классно, читал на разных источниках о galaxy уже даже скачал galaxy++(типо редактор кода), очень радует адекватный сборщик мусора и наличие псевдо ООП в виде структур и классов.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Пятница, 09 Марта 2012, 15:41:41