Добавлен rsfghd
Вот не могу понять, в моей карте молния удаляется как положено, а в карте моего друга, если уничтожить кастующего юнита, молния останется навсегда, втф?
Будто при уничтожении кастующего юнита ссылка на молнию (она сохраняется в этого юнита) где-то теряется, хотя в прикреплённой карте всё нормально
Будто при уничтожении кастующего юнита ссылка на молнию (она сохраняется в этого юнита) где-то теряется, хотя в прикреплённой карте всё нормально
Мне не особо нравится просить кого-то делать что-то за меня, но тут у меня вообще никаких шансов нет..
Код карты
globals
hashtable H = InitHashtable()
endglobals
...
scope MySc
globals
location LocationForGetZ = Location(0,0)
endglobals
private function GetUnitZ takes unit u returns real
call MoveLocation(LocationForGetZ,GetUnitX(u),GetUnitY(u))
return GetLocationZ(LocationForGetZ)+GetUnitFlyHeight(u)
endfunction
private function IsUnitDead takes unit u returns boolean
return IsUnitType(u,UNIT_TYPE_DEAD) or GetUnitTypeId(u) == 0
endfunction
private function mt takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer i = GetHandleId(t)
local real r = LoadReal(H,i,1)+0.01
local unit u = LoadUnitHandle(H,i,0)
local integer ii = GetHandleId(u)
local unit uu = LoadUnitHandle(H,ii,1)
if IsUnitDead(u) or IsUnitDead(uu) or LoadInteger(H,ii,4) == 1 then
call PauseTimer(t)
call DestroyTimer(t)
BJDebugMsg("чтрарапрв")
call DestroyLightning(LoadLightningHandle(H,ii,3))
call DestroyEffect(LoadEffectHandle(H,ii,5))
call FlushChildHashtable(H,i)
call FlushChildHashtable(H,ii)
else
if r >= 0.10 then
set ii = GetUnitTypeId(uu)
if ii == 'h000' then
set r = 0.05
elseif ii == 'h001' then
set r = 0.15
elseif ii == 'h002' then
set r = 0.25
endif
call SetUnitState(uu,UNIT_STATE_LIFE,GetUnitState(uu,UNIT_STATE_MAX_LIFE)*RMaxBJ(0,GetUnitLifePercent(uu)+r)*0.01)
set r = 0.
endif
call SaveReal(H,i,1,r)
endif
set t = null
set u = null
set uu = null
endfunction
private function Actions takes nothing returns nothing
local unit u = GetSpellAbilityUnit()
local unit uu = GetSpellTargetUnit()
local timer t = null
local integer i = GetHandleId(u)
local integer ii = GetUnitTypeId(u)
if LoadLightningHandle(H,i,3) != null then
call DestroyLightning(LoadLightningHandle(H,i,3))
endif
if LoadEffectHandle(H,i,5) != null then
call DestroyEffect(LoadEffectHandle(H,i,5))
endif
if ii == 'h000' then
set bj_lastCreatedLightning = AddLightningEx("HWPB",true,GetUnitX(u),GetUnitY(u),GetUnitZ(u),GetUnitX(uu),GetUnitY(uu),GetUnitZ(uu))
elseif ii == 'h001' then
set bj_lastCreatedLightning = AddLightningEx("HWPB",true,GetUnitX(u),GetUnitY(u),GetUnitZ(u),GetUnitX(uu),GetUnitY(uu),GetUnitZ(uu))
elseif ii == 'h002' then
set bj_lastCreatedLightning = AddLightningEx("HWPB",true,GetUnitX(u),GetUnitY(u),GetUnitZ(u),GetUnitX(uu),GetUnitY(uu),GetUnitZ(uu))
endif
call SaveUnitHandle(H,i,1,uu)
call SaveLightningHandle(H,i,3,bj_lastCreatedLightning)
call SaveEffectHandle(H,i,5,AddSpecialEffectTarget("Abilities\\Spells\\Human\\Resurrect\\ResurrectCaster.mdl",uu,"origin"))
if LoadInteger(H,i,2) == 0 then
call SaveInteger(H,i,2,1)
set t = CreateTimer()
call SaveUnitHandle(H,GetHandleId(t),0,u)
call TimerStart(t,0.01,true,function mt)
set t = null
endif
set bj_lastCreatedLightning = null
set u = null
set uu = null
endfunction
//===========================================================================
private function Conditions takes nothing returns boolean
local integer i = GetSpellAbilityId()
return i == 'A000' or i == 'A001' or i == 'A002' // Прожимаемая абилка
endfunction
function InitTrig_Phoenix takes nothing returns nothing
local trigger t = CreateTrigger()
local integer index = 0
loop
call TriggerRegisterPlayerUnitEvent(t,Player(index),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
endloop
call TriggerAddCondition(t,Condition(function Conditions))
call TriggerAddAction(t,function Actions)
set t = null
endfunction
endscope
Код триггера друга (изменены лишь равкоды)
globals
hashtable H = InitHashtable()
endglobals
...
scope MySc
globals
location LocationForGetZ = Location(0,0)
endglobals
private function GetUnitZ takes unit u returns real
call MoveLocation(LocationForGetZ,GetUnitX(u),GetUnitY(u))
return GetLocationZ(LocationForGetZ)+GetUnitFlyHeight(u)
endfunction
private function IsUnitDead takes unit u returns boolean
return IsUnitType(u,UNIT_TYPE_DEAD) or GetUnitTypeId(u) == 0
endfunction
private function mt takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer i = GetHandleId(t)
local real r = LoadReal(H,i,1)+0.01
local unit u = LoadUnitHandle(H,i,0)
local integer ii = GetHandleId(u)
local unit uu = LoadUnitHandle(H,ii,1)
if IsUnitDead(u) or IsUnitDead(uu) or LoadInteger(H,ii,4) == 1 then
call PauseTimer(t)
call DestroyTimer(t)
BJDebugMsg("чтрарапрв")
call DestroyLightning(LoadLightningHandle(H,ii,3))
call DestroyEffect(LoadEffectHandle(H,ii,5))
call FlushChildHashtable(H,i)
call FlushChildHashtable(H,ii)
else
if r >= 0.10 then
set ii = GetUnitTypeId(uu)
if ii == 'o01W' then
set r = 0.05
elseif ii == 'o00U' then
set r = 0.15
elseif ii == 'o00V' then
set r = 0.25
endif
call SetUnitState(uu,UNIT_STATE_LIFE,GetUnitState(uu,UNIT_STATE_MAX_LIFE)*RMaxBJ(0,GetUnitLifePercent(uu)+r)*0.01)
set r = 0.
endif
call SaveReal(H,i,1,r)
endif
set t = null
set u = null
set uu = null
endfunction
private function Actions takes nothing returns nothing
local unit u = GetSpellAbilityUnit()
local unit uu = GetSpellTargetUnit()
local timer t = null
local integer i = GetHandleId(u)
local integer ii = GetUnitTypeId(u)
if LoadLightningHandle(H,i,3) != null then
call DestroyLightning(LoadLightningHandle(H,i,3))
endif
if LoadEffectHandle(H,i,5) != null then
call DestroyEffect(LoadEffectHandle(H,i,5))
endif
if ii == 'o01W' then
set bj_lastCreatedLightning = AddLightningEx("HWPB",true,GetUnitX(u),GetUnitY(u),GetUnitZ(u),GetUnitX(uu),GetUnitY(uu),GetUnitZ(uu))
elseif ii == 'o00U' then
set bj_lastCreatedLightning = AddLightningEx("HWPB",true,GetUnitX(u),GetUnitY(u),GetUnitZ(u),GetUnitX(uu),GetUnitY(uu),GetUnitZ(uu))
elseif ii == 'o00V' then
set bj_lastCreatedLightning = AddLightningEx("HWPB",true,GetUnitX(u),GetUnitY(u),GetUnitZ(u),GetUnitX(uu),GetUnitY(uu),GetUnitZ(uu))
endif
call SaveUnitHandle(H,i,1,uu)
call SaveLightningHandle(H,i,3,bj_lastCreatedLightning)
call SaveEffectHandle(H,i,5,AddSpecialEffectTarget("Abilities\\Spells\\Human\\Resurrect\\ResurrectCaster.mdl",uu,"origin"))
if LoadInteger(H,i,2) == 0 then
call SaveInteger(H,i,2,1)
set t = CreateTimer()
call SaveUnitHandle(H,GetHandleId(t),0,u)
call TimerStart(t,0.01,true,function mt)
set t = null
endif
set bj_lastCreatedLightning = null
set u = null
set uu = null
endfunction
//===========================================================================
private function Conditions takes nothing returns boolean
local integer i = GetSpellAbilityId()
return i == 'A0F5' or i == 'A0F6' or i == 'A0F4'// Прожимаемая абилка
endfunction
function InitTrig_Phoenix takes nothing returns nothing
local trigger t = CreateTrigger()
local integer index = 0
loop
call TriggerRegisterPlayerUnitEvent(t,Player(index),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
endloop
call TriggerAddCondition(t,Condition(function Conditions))
call TriggerAddAction(t,function Actions)
set t = null
endfunction
endscope
Upd: мы специально создали новую хэш-таблицу для этого, значения абсолютно одинаковые и нигде больше она не юзается, перезаписи быть не должно
Upd1: если умирает кастующий юнит, таймер уничтожается, всё очищается и дебаг показывает сообщение, только молния не удаляется, в остальных случаях всё нормально
Upd2: карту друга выложить не могу, простите
Upd1: если умирает кастующий юнит, таймер уничтожается, всё очищается и дебаг показывает сообщение, только молния не удаляется, в остальных случаях всё нормально
Upd2: карту друга выложить не могу, простите
Принятый ответ
Сработало, молния удаляетсяЖду пока друг проверит у себя это
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. rsfghd
Проблема скорее всего в глобалке, а не хэше. У меня хэш работает. Видимо ты пытаешься сохранить не существующую молнию. Че то не так с ними
пример:
есть предположение, что даже если удалить bj_lastCreatedLightning, то молния удаляется, но хэндл сохраняется. Когда вы пытаетесь создать новую с bj_lastCreatedLightning, то почему то ломается. То ли она не создана, или не создалась до конца. bj_lastCreatedLightning нужно перед работой обнулить.
Ред. rsfghd
В моей же карте если уничтожить кастующее здание всё нормально
Проблема не в глобалке, раньше молния была вообще локальной в нашем коде, я просто решил заменить на глобалку, результатов конечно особых не дало
Получается моя "проверка" существует ли молния на самом деле не рабочая?