Может ли фаталить вар из-за деформации земли в определенной области? Отладка не помогает. Тест тоже бессполезен, но карта фаталит у всех игроков в мультиплеере. Ошибка 100% в коде. Иногда фаталит, иногда нет.
PS автор не я
смотреть сюда
scope Kidok initializer InitTrig_Kidok

globals
private integer dammyBallId = 'h003'
private integer dammyBallCasterId = 'h004'
private integer skillId = 'A004'
endglobals

struct Kidok_Data
unit a
unit dammy
real angle
real distance
real xS
real yS
integer damage
integer aoe
endstruct

private function Trig_Kidok_Conditions takes nothing returns boolean
return GetSpellAbilityId() == skillId
endfunction

private function Kidok_Action takes nothing returns nothing
local timer t = GetExpiredTimer()
local Kidok_Data s = LoadInteger(hash,GetHandleId(t),StringHash("Kidok_Data"))
local real x = GetUnitX(s.dammy)+7*Cos(s.angle*bj_DEGTORAD)
local real y = GetUnitY(s.dammy)+7*Sin(s.angle*bj_DEGTORAD)
local real dx
local real dy
local group g
local unit F
local real height
if GetRectMinX(bj_mapInitialPlayableArea) <= x and x <= GetRectMaxX(bj_mapInitialPlayableArea) and GetRectMinY(bj_mapInitialPlayableArea) <= y and y <= GetRectMaxY(bj_mapInitialPlayableArea)
call SetUnitX(s.dammy,x)
call SetUnitY(s.dammy,y)
call IssueImmediateOrder(s.dammy,"stop")
set dx = s.xS - GetUnitX(s.dammy)
set dy = s.yS - GetUnitY(s.dammy)
set height = (4*500/s.distance)*(s.distance - SquareRoot(dx*dx+dy*dy))*(SquareRoot(dx*dx+dy*dy) / s.distance)
call SetUnitFlyHeight(s.dammy,height,0)
else
call PauseTimer(t)
call DestroyTimer(t)
set g = CreateGroup()
call GroupEnumUnitsInRange(g,GetUnitX(s.dammy),GetUnitY(s.dammy),s.aoe,null)
set F = FirstOfGroup(g)
loop
exitwhen F == null
if IsUnitEnemy(F,GetOwningPlayer(s.a)) and IsUnitType(F,UNIT_TYPE_DEAD) == false and F != null
call UnitDamageTarget(s.a,F,s.damage,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,null)
set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(s.a),dammyBallCasterId,GetUnitX(F),GetUnitY(F),GetUnitFacing(F))
call IssueTargetOrder(bj_lastCreatedUnit,"slow",F)
call UnitApplyTimedLife(bj_lastCreatedUnit,1,1)
endif
call GroupRemoveUnit(g,F)
set F = FirstOfGroup(g)
endloop
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl",GetUnitX(s.dammy),GetUnitY(s.dammy)))
call TerrainDeformCrater(GetUnitX(s.dammy), GetUnitY(s.dammy), 225, 128, R2I(0.2 * 1000), false)
call RemoveUnit(s.dammy)
call Kidok_Data.destroy(s)
endif
if SquareRoot(dx*dx+dy*dy) <= 7.1
call PauseTimer(t)
call DestroyTimer(t)
set g = CreateGroup()
call GroupEnumUnitsInRange(g,GetUnitX(s.dammy),GetUnitY(s.dammy),s.aoe,null)
set F = FirstOfGroup(g)
loop
exitwhen F == null
if IsUnitEnemy(F,GetOwningPlayer(s.a)) and IsUnitType(F,UNIT_TYPE_DEAD) == false and F != null
call UnitDamageTarget(s.a,F,s.damage,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,null)
set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(s.a),dammyBallCasterId,GetUnitX(F),GetUnitY(F),GetUnitFacing(F))
call IssueTargetOrder(bj_lastCreatedUnit,"slow",F)
call UnitApplyTimedLife(bj_lastCreatedUnit,1,1)
endif
call GroupRemoveUnit(g,F)
set F = FirstOfGroup(g)
endloop
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl",GetUnitX(s.dammy),GetUnitY(s.dammy)))
call TerrainDeformCrater(GetUnitX(s.dammy), GetUnitY(s.dammy), 225, 128, R2I(0.3 * 1000), false)
call RemoveUnit(s.dammy)
call Kidok_Data.destroy(s)
endif
endfunction

private function Trig_Kidok_Actions takes nothing returns nothing
local Kidok_Data s = Kidok_Data.create()
local timer t = CreateTimer()
set s.a = GetSpellAbilityUnit()
set s.xS = GetSpellTargetX()
set s.yS = GetSpellTargetY()
set s.angle = bj_RADTODEG*Atan2(s.yS - GetUnitY(s.a),s.xS - GetUnitX(s.a))
set s.dammy = CreateUnit(GetOwningPlayer(s.a),dammyBallId,GetUnitX(s.a),GetUnitY(s.a),s.angle)
call UnitAddAbility(s.dammy,'Arav')
call UnitRemoveAbility(s.dammy,'Arav')
local real dx = s.xS - GetUnitX(s.dammy)
local real dy = s.yS - GetUnitY(s.dammy)
set s.distance = SquareRoot(dx*dx+dy*dy)
set s.aoe = 260+(20*GetUnitAbilityLevel(s.a,skillId))
if GetUnitAbilityLevel(s.a, skillId) == 1
set s.damage  = 75
else
if GetUnitAbilityLevel(s.a, skillId) == 2
set s.damage  = 155
else
if GetUnitAbilityLevel(s.a, skillId) == 3
set s.damage  = 245
else
if GetUnitAbilityLevel(s.a, skillId) == 4
set s.damage  = 335
else
if GetUnitAbilityLevel(s.a, skillId) == 5
set s.damage  = 455
else
if GetUnitAbilityLevel(s.a, skillId) == 6
set s.damage  = 575
else
if GetUnitAbilityLevel(s.a, skillId) == 7
set s.damage  = 705
else
if GetUnitAbilityLevel(s.a, skillId) == 8
set s.damage  = 835
else
if GetUnitAbilityLevel(s.a, skillId) == 9
set s.damage  = 955
else
if GetUnitAbilityLevel(s.a, skillId) == 10
set s.damage  = 1100
else
if GetUnitAbilityLevel(s.a, skillId) == 11
set s.damage  = 1245
else
if GetUnitAbilityLevel(s.a, skillId) == 12
set s.damage  = 1400
else
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
call SaveInteger(hash,GetHandleId(t),StringHash("Kidok_Data"),s)
call TimerStart(t,0.01,true,function Kidok_Action)
endfunction

//===========================================================================
public function InitTrig_Kidok takes nothing returns nothing
    set gg_trg_Kidok = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Kidok, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Kidok, Condition( function Trig_Kidok_Conditions ) )
    call TriggerAddAction( gg_trg_Kidok, function Trig_Kidok_Actions )
endfunction

endscope

и в коде куча утечек
PhysCraft, да это вобще пример того как не надо кодить
EnergyFrost, норм
EnergyFrost, так же замени глобалки локалками
set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(s.a),dammyBallCasterId,GetUnitX(F),GetUnitY(F),GetUnitFacing(F))
за такое положен расстрел
EnergyFrost, проще написать новый чем этот править
`
ОЖИДАНИЕ РЕКЛАМЫ...
28
мои глаза
запихни код под под кат
и кинь дебаг лог при фатале
15
nvc123, про глаза можешь не говорить, мне так же ребит, но самому лень делать код, поэтому пользую готовое
Дебаг могу только в мультиплеере отследить. Соло никак не могу фатальнуть
28
EnergyFrost, добавь в этот код дебаг лог и когда вылетит фатал скинь этот лог
ну набери толпу тестеров
хз где правдо
и кинь автору эту статью
а то от хэндла таймера мне хочется застрелиться и прихватить его с собой
и период 0.01
15
nvc123, парень, не могу, сорри. А так чисто есть догадка откуда может фатал взятся? вроде весь код грязный, ой, т.е нормально написан, не должно фаталить
за статью, отдельное спасибо
28
EnergyFrost, как по мне так код должен подвесить комп(куча потоков ведь получается)
я не могу понять без дебага
я даже не знаю какой кусок кода фаталит
20
Походу у автора етого кода деформация рук. Он делает две последовательние деформации в одной точке с общей глубиной over 500. Но проблема не в етом, а втом, что при второй деформации он берет координати s.dummy, которого перед етим удалили вместе с s !!! Все ето сразу после спецеффекта, но вконце он снова удаляет несуществующий s.
Попробуй удалить
call RemoveUnit(s.dammy)
call Kidok_Data.destroy(s)
из середини функции Kidok_Action и немного уменш глубины для нормального просмотра спелла в игре.
28
и в коде куча утечек
PhysCraft, да это вобще пример того как не надо кодить
EnergyFrost, норм
EnergyFrost, так же замени глобалки локалками
set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(s.a),dammyBallCasterId,GetUnitX(F),GetUnitY(F),GetUnitFacing(F))
за такое положен расстрел
EnergyFrost, проще написать новый чем этот править
Принятый ответ
15
nvc123, дефайнами пойдет?
а вот насчет bj_lastCreatedUnit, я сам не понял, что не так
28
EnergyFrost, что именно дефайнами?
EnergyFrost, это глобалка а тут куча потоков
она может переписываться
15
nvc123, а, я думал просто, что не пользовать (вызвало замешательство)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.