Добавлен EnergyFrost
Может ли фаталить вар из-за деформации земли в определенной области? Отладка не помогает. Тест тоже бессполезен, но карта фаталит у всех игроков в мультиплеере. Ошибка 100% в коде. Иногда фаталит, иногда нет.
PS автор не я
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, проще написать новый чем этот править
PhysCraft, да это вобще пример того как не надо кодить
EnergyFrost, норм
EnergyFrost, так же замени глобалки локалками
set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(s.a),dammyBallCasterId,GetUnitX(F),GetUnitY(F),GetUnitFacing(F))
за такое положен расстрел
EnergyFrost, проще написать новый чем этот править
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
запихни код под под кат
и кинь дебаг лог при фатале
Ред. EnergyFrost
Дебаг могу только в мультиплеере отследить. Соло никак не могу фатальнуть
ну набери толпу тестеров
хз где правдо
и кинь автору эту статью
а то от хэндла таймера мне хочется застрелиться и прихватить его с собой
и период 0.01
Ред. EnergyFrost
за статью, отдельное спасибо
я не могу понять без дебага
я даже не знаю какой кусок кода фаталит
call Kidok_Data.destroy(s)
Ред. EnergyFrost
Ред. nvc123
PhysCraft, да это вобще пример того как не надо кодить
EnergyFrost, норм
EnergyFrost, так же замени глобалки локалками
set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(s.a),dammyBallCasterId,GetUnitX(F),GetUnitY(F),GetUnitFacing(F))
за такое положен расстрел
EnergyFrost, проще написать новый чем этот править
а вот насчет bj_lastCreatedUnit, я сам не понял, что не так
EnergyFrost, это глобалка а тут куча потоков
она может переписываться