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

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

Ответ
 
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
Фатал из-за перемещения молнии
В общем очень редко, но этот спелл фаталит. Благодаря этому логеру я нашёл строку на которой это проиcходит.
call MoveLightningEx(l,false,X,Y,GetLocZ(X,Y)+50,GetUnitX(u),GetUnitY(u),50+GetUnitZ(u))
» Код спела
function AoFCon takes nothing returns boolean
return GetSpellAbilityId() == 'A0I8'
endfunction

function GetLocZ takes real x, real y returns real
call MoveLocation(udg_L,x,y)
return GetLocationZ(udg_L)
endfunction

function GetUnitZ takes unit u returns real
call MoveLocation(udg_L,GetUnitX(u),GetUnitY(u))
return GetLocationZ(udg_L)
endfunction

function SQ takes real xa, real ya, real xb, real yb returns real
return SquareRoot((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb))
endfunction

function IsUnitDeadBX takes unit u returns boolean
return GetUnitTypeId(u) == 0 or IsUnitType(u, UNIT_TYPE_DEAD)
endfunction

function IsAllyTarget takes unit u,unit d returns boolean
return IsUnitDeadBX(u) == false and not IsUnitType(u, UNIT_TYPE_STRUCTURE) and IsUnitAlly(u,GetOwningPlayer(d)) and GetUnitTypeId(u)!= 'h00S' and GetOwningPlayer(u) != Player(PLAYER_NEUTRAL_PASSIVE)
endfunction

function IsTarget takes unit u,unit d returns boolean
return not IsUnitType(u,UNIT_TYPE_ANCIENT) and GetUnitTypeId(u)!= 'h00S' and not IsUnitDeadBX(u)  and not IsUnitType(u, UNIT_TYPE_STRUCTURE) and not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) and IsUnitEnemy(u, GetOwningPlayer(d)) and GetUnitAbilityLevel(u,'A0I1') == 0
endfunction

function RPX takes lightning l,unit u,unit d returns nothing
call SetLightningColor(l,GetLightningColorR(l),GetLightningColorG(l),GetLightningColorB(l),GetLightningCo​lorA(l))
if IsUnitInvisible(u,GetLocalPlayer()) and IsUnitInvisible(d,GetLocalPlayer()) and GetPlayerState(GetLocalPlayer(),PLAYER_STATE_OBSERVER) == 0 then
call SetLightningColor(l,.0,.0,.0,.0)
endif
endfunction


function AoFBuffEffect takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit u = LoadUnitHandle(udg_AssassinHash,id,0)
local unit c = LoadUnitHandle(udg_AssassinHash,id,1)
local integer i = LoadInteger(udg_AssassinHash,id,1)+1
local unit d
call SaveInteger(udg_AssassinHash,id,1,i)
if i >= 10 or IsTarget(u,c) then
call UnitShareVision(u,GetOwningPlayer(c),true)
set d = CreateUnit(GetOwningPlayer(c),'u003',GetUnitX(u),GetUnitY(u),0)
call SetUnitAbilityLevel(d,'A06P',5)
call UnitApplyTimedLife(d,'BHwe',1.)
call IssueTargetOrder(d,"faeriefire",u)
call UnitShareVision(u,GetOwningPlayer(c),false)
call DestroyTimer(t)
call FlushChildHashtable(udg_AssassinHash,id)
endif
set t = null
set u = null
set d = null
set c = null
endfunction

function AoFBuff takes unit c,unit u returns nothing
local unit d
local timer t
if IsTarget(u,c) then
call UnitShareVision(u,GetOwningPlayer(c),true)
set d = CreateUnit(GetOwningPlayer(c),'u003',GetUnitX(u),GetUnitY(u),0)
call SetUnitAbilityLevel(d,'A06P',5)
call UnitApplyTimedLife(d,'BHwe',1.)
call IssueTargetOrder(d,"faeriefire",u)
call UnitShareVision(u,GetOwningPlayer(c),false)
else
set t = CreateTimer()
call SaveUnitHandle(udg_AssassinHash,GetHandleId(t),0,u)
call SaveUnitHandle(udg_AssassinHash,GetHandleId(t),1,c)
call TimerStart(t,.2,true,function AoFBuffEffect) 
set t = null
endif
set d = null
endfunction

function AoFEffect takes nothing returns nothing
local timer t= GetExpiredTimer()
local integer id = GetHandleId(t)
local unit c = LoadUnitHandle(udg_AssassinHash,id,0)
local real X = LoadReal(udg_AssassinHash,id,StringHash("X"))
local real Y = LoadReal(udg_AssassinHash,id,StringHash("Y"))
local unit d
local integer k = LoadInteger(udg_AssassinHash,id,StringHash("Count"))
local integer N = LoadInteger(udg_AssassinHash,id,8)
local real a = 0.
local lightning l
local unit u
local boolean b = false
local real dmg = 0.
local integer i = 0
if k < 133 then
call SaveInteger(udg_AssassinHash,id,StringHash("Count"),k+1)
loop
set i = i + 1
if LoadBoolean(udg_AssassinHash,id,StringHash("AoFB"+I2S(i))) == false then
set u = LoadUnitHandle(udg_AssassinHash,id,StringHash("AoFU"+I2S(i)))
set l = LoadLightningHandle(udg_AssassinHash,id,StringHash("AoFL"+I2S(i)))
call MoveLightningEx(l,false,X,Y,GetLocZ(X,Y)+50,GetUnitX(u),GetUnitY(u),50+GetUnitZ(u))
call SetLightningColor(l,1.,1.,1.,1)
call RPX(l,u,u)
if SQ(X,Y,GetUnitX(u),GetUnitY(u)) > 400. and u != null then
call AoFBuff(c,u)
set b = true
call DestroyLightning(l)
call SaveBoolean(udg_AssassinHash,id,StringHash("AoFB"+I2S(i)),true)
endif
if IsUnitDeadBX(u) then
call DestroyLightning(l)
call SaveBoolean(udg_AssassinHash,id,StringHash("AoFB"+I2S(i)),true)
endif
endif
exitwhen i == N or b
endloop
set i = 0
if b then
set dmg = 120.*GetUnitAbilityLevel(c,'A0I8')
loop
set i = i + 1
if LoadBoolean(udg_AssassinHash,id,StringHash("AoFB"+I2S(i))) == false then
set u = LoadUnitHandle(udg_AssassinHash,id,StringHash("AoFU"+I2S(i)))
set l = LoadLightningHandle(udg_AssassinHash,id,StringHash("AoFL"+I2S(i)))
call DestroyLightning(l)
set a = GetRandomReal(0.,6.283185)
call SetUnitX(u,X+55.*Cos(a))
call SetUnitY(u,Y+55.*Sin(a))
if IsTarget(u,c) then
set d = CreateUnit(GetOwningPlayer(u),'h02K',GetUnitX(u),GetUnitY(u),0)
call UnitApplyTimedLife(d,'BHwe',1.)
call SetUnitAbilityLevel(d,'A09I',3)
call IssueTargetOrder(d,"thunderbolt",u)
set d = null
call UnitDamageTarget(c,u,dmg,true,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,null)
endif
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Incinerate\\FireLordDeathExplod​e.mdl",u,"origin"))
endif
exitwhen i == N
endloop
call DestroyEffect(LoadEffectHandle(udg_AssassinHash,id,StringHash("ED")))
call UnitApplyTimedLife(LoadUnitHandle(udg_AssassinHash,id,1),'BTLF',1.)
call FlushChildHashtable(udg_AssassinHash,id)
call DestroyTimer(t)
endif
else
set i = 0
loop
set i = i + 1
if LoadBoolean(udg_AssassinHash,id,StringHash("AoFB"+I2S(i))) == false then
set u = LoadUnitHandle(udg_AssassinHash,id,StringHash("AoFU"+I2S(i)))
set l = LoadLightningHandle(udg_AssassinHash,id,StringHash("AoFL"+I2S(i)))
call DestroyLightning(l)
endif
exitwhen i == N
endloop
call DestroyEffect(LoadEffectHandle(udg_AssassinHash,id,StringHash("ED")))
call UnitApplyTimedLife(LoadUnitHandle(udg_AssassinHash,id,1),'BTLF',1.)
call FlushChildHashtable(udg_AssassinHash,id)
call DestroyTimer(t)
endif
set t = null
set d = null
set u = null
set c = null
endfunction

function AoF takes nothing returns nothing
local unit c =  GetSpellAbilityUnit()
local real x = GetSpellTargetX()
local real y = GetSpellTargetY()
local timer t = CreateTimer()
local integer id = GetHandleId(t)
local unit u
local lightning l
local unit d = CreateUnit(GetOwningPlayer(c),'e00O',x,y,0)
local real dmg = 10.*GetUnitAbilityLevel(c,'A0I9')+GetHeroInt(c,true)*.3
local integer i = 0
call DestroyEffect(AddSpecialEffect("FirePulse.mdx",x,y))
call GroupEnumUnitsInRange(udg_G,x,y,300,null)
loop
set u = FirstOfGroup(udg_G)
if IsTarget(u,c) then
set i = i + 1
set l = AddLightningEx("LEAS",false,x,y,GetLocZ(x,y)+50,GetUnitX(u),GetUnitY(u),50+GetUnitZ(u))
call RPX(l,u,u)
call SaveLightningHandle(udg_AssassinHash,id,StringHash("AoFL"+I2S(i)),l)
call SaveUnitHandle(udg_AssassinHash,id,StringHash("AoFU"+I2S(i)),u)
endif
call GroupRemoveUnit(udg_G,u)
exitwhen u == null
endloop
if i != 0 then
call SaveUnitHandle(udg_AssassinHash,id,0,c)
call SaveUnitHandle(udg_AssassinHash,id,1,d)
call SaveInteger(udg_AssassinHash,id,8,i)
call SaveReal(udg_AssassinHash,id,StringHash("X"),x)
call SaveReal(udg_AssassinHash,id,StringHash("Y"),y)
call SetUnitFlyHeight(d,45,0)
call SetUnitScalePercent(d,200,200,200)
call SaveEffectHandle(udg_AssassinHash,id,StringHash("ED"),AddSpecialEffectTarget("Abiliti​es\\Spells\\Other\\SoulBurn\\SoulBurnbuff.mdl",d,"origin"))
call TimerStart(t,0.03,true,function AoFEffect)
else
call UnitApplyTimedLife(d,'BTLF',1.)
call FlushChildHashtable(udg_AssassinHash,id)
call DestroyTimer(t)
endif
set t = null
set c = null
set l = null
set d = null
endfunction
» Последние строчки из логера
x00003B2E3A	StringHash
x00003B2E3B	LoadUnitHandle
x00003B2E3C	udg_AssassinHash
x00003B2E3D	id
x00003B2E3E	i
x00003B2E3F	I2S
x00003B2E40	StringHash
x00003B2E41	LoadLightningHandle
x00003B2E42	l
x00003B2E43	X
x00003B2E44	Y
x00003B2E45	X
x00003B2E46	Y
x00003B2E47	GetLocZ
x00003B2E48	udg_L
x00003B2E49	x
x00003B2E4A	y
x00003B2E4B	MoveLocation
x00003B2E4C	udg_L
x00003B2E4D	GetLocationZ
x00003B2E4E	u
x00003B2E4F	GetUnitX
x00003B2E50	u
x00003B2E51	GetUnitY
x00003B2E52	u
x00003B2E53	GetUnitZ
x00003B2E54	udg_L
x00003B2E55	u
x00003B2E56	GetUnitX
x00003B2E57	u
x00003B2E58	GetUnitY
x00003B2E59	MoveLocation
x00003B2E5A	udg_L
x00003B2E5B	GetLocationZ
x00003B2E5C	MoveLightningEx
Старый 17.09.2013, 11:24
quq_CCCP
Я белый и пушистый!
online
Опыт: 93,279
Активность:
16GB, мб двигает за карту? Или в недопустимые координаты?
Или это исключено проверками на координаты за пределами карты?
Старый 17.09.2013, 15:37
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
quq_CCCP:
16GB, мб двигает за карту? Или в недопустимые координаты?
Или это исключено проверками на координаты за пределами карты?
исключено. фаталило, и в центре. Да и вообще молнии связывают юнитов. А они вылететь за карту не могут. Это 2 спелл мага огня из моего аоса, можешь глянуть чтоб понять, как он работает.
Старый 17.09.2013, 16:28
youtube
сктыщь
offline
Опыт: 8,025
Активность:
возможно просто в какой то момент переменная l равна null
Старый 17.09.2013, 16:31
quq_CCCP
Я белый и пушистый!
online
Опыт: 93,279
Активность:
16GB:
исключено. фаталило, и в центре. Да и вообще молнии связывают юнитов. А они вылететь за карту не могут. Это 2 спелл мага огня из моего аоса, можешь глянуть чтоб понять, как он работает.
Ну а высота? Кстати правильно youtube, говорит, сделай ка дебаг чему равна какая переменная, и чему равны значения в ХТ ячейках...
Старый 17.09.2013, 16:49
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
quq_CCCP:
делай ка дебаг чему равна какая переменная, и чему равны значения в ХТ ячейках...
фаталит раз в 200 игр. Я что буду засирать экран всех игроам и сидеть в каждой игре чтоб увидеть? не не.
Нет не вызывает фатала, если в переменной null. Проверил
Старый 17.09.2013, 17:02
quq_CCCP
Я белый и пушистый!
online
Опыт: 93,279
Активность:
16GB, не у меня не фаталила молния если равен null при разных настройках...
Старый 17.09.2013, 17:16
Doc

offline
Опыт: 63,163
Активность:
дебаглог заюзай...
Старый 17.09.2013, 18:05
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
и что мне проверять? мне бы вообще заставить эту функцию фаталить, в лабораторных условиях...
Старый 17.09.2013, 18:20
Волчачка
Стально!
offline
Опыт: 62,088
Активность:
Цитата:
Сообщение от 16GB
call SetLightningColor(l,1.,1.,1.,1)
call RPX(l,u,u)

Цитата:
Сообщение от 16GB
function RPX takes lightning l,unit u,unit d returns nothing
call SetLightningColor(l,GetLightningColorR(l),GetLightningColorG(l),GetLightningColo rB(l),GetLightningCo​lorA(l))
if IsUnitInvisible(u,GetLocalPlayer()) and IsUnitInvisible(d,GetLocalPlayer()) and GetPlayerState(GetLocalPlayer(),PLAYER_STATE_OBSERVER) == 0 then
call SetLightningColor(l,.0,.0,.0,.0)
endif
endfunction

Меня больше заинтересовала эти отрезки кода
RPX с SetLightningColor задаются после перемещения молнии.
Иногда бывает, что логгер может записать не всё, а просто оборваться на последних правильно сработанных ф-ях.
Но это редко когда бывает.
Предугадать не всё возможно.
Старый 17.09.2013, 18:35
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
ну заставьте фаталить тогда этот отрезок..
Если это он, я лично ничего там не вижу, эта функция юзается во всех спелах с молнией.
Старый 17.09.2013, 18:36
Волчачка
Стально!
offline
Опыт: 62,088
Активность:
Цитата:
Сообщение от 16GB
ну заставьте фаталить тогда этот отрезок..
Если это он, я лично ничего там не вижу, эта функция юзается во всех спелах с молнией.

Ну всё же, фатал из-за перемещения у молнии, мне кажется бредом.
У варика не может быть ничего, без каких либо причуд.
Мне больше нравиться устраивать фатал такой
создавать кучу работников с моделью "Ролик Артес и Иллидан", вообще жесткий вылет. Даже самый мощный компьютер не справиться. (Ну если спарвится, то жуткие будут лагги)
Для меня самый вин фатал офигенный это когда меням уровень способности\навыка у героя, когда он мертв - это вообще... божественный фатал..
Или один и тот же бафф от разных абилок. это вообще кул.


Ну всё же, сколько раз тестил перемещение молнии, ниразу не фаталило.
Старый 17.09.2013, 18:49
HolyMoon
Hly shit!
offline
Опыт: 6,986
Активность:
я, кстати, тоже наблюдал фатал из-за молний, неоднократно, в другой карте. Никаких, в общем-то, обоснованных предпосылок не было, но, как помню, происходило это, когда имели место два молниевых скила одновременно. Может, стоит в этом направлении двигаться?
HolyMoon добавил:
а, и оба скила по несколько молний разом создают, один из них - прямую делает, чтоб типо толстым лучом казалось, другой - типо веером молнии направляет. Ну это так, мало-ли
Старый 17.09.2013, 19:12
DioD

offline
Опыт: 45,134
Активность:
фатал от молний лечится совершенно элементарным трайкачем
lighing l = getourligntning
if l == null
а дальше думайте сами
Старый 17.09.2013, 20:20
Melissa
Я всегда хочу как лучше!
offline
Опыт: 31,696
Активность:
HolyMoon:
13
вово
плагиатил баф от мжолнира из доты, так из-за этих сс.. молний фаталило настолько часто, что пришлось на даммикаст цепи молний заменить. Хы
Старый 17.09.2013, 20:35
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
DioD:
фатал от молний лечится совершенно элементарным трайкачем
у меня не получилось вызвать фатал, используя null молнию
Старый 17.09.2013, 20:44
DioD

offline
Опыт: 45,134
Активность:
а ты создай молнию удали её и потом попробуй подвинуть...
Старый 17.09.2013, 20:47
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
DioD:
а ты создай молнию удали её и потом попробуй подвинуть...
да фаталит, но по коду, я не понимаю как я могу двигать удалённую, там проверяется через логическую, что молния удалена.
Мб таймер паузить перед удалением.
Ну проверку в код добавлю и пох.
Старый 17.09.2013, 21:38
Волчачка
Стально!
offline
Опыт: 62,088
Активность:
Цитата:
Сообщение от 16GB
Мб таймер паузить перед удалением.

Это и надо!
У тебя в большинства скриптах таймер не сначала уничтожается, а нужно, чтобы сначала удалялся.
Это может помочь)
Он сам нашел ответ на свой фатал.)
Если что, я про среагирование условия на окончание скила.
Старый 17.09.2013, 22:32
DioD

offline
Опыт: 45,134
Активность:
достаточно проверки, это замечательная феилфаст техника спасёт много нервов, особенно в случае загрузки или сохранения игры.
Старый 24.09.2013, 14:42
Ответ

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

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

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

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



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