|
|
|
|
[Вопрос] Fatal Error в заклинании
|
|
Srezi | Дата: Понедельник, 04 Июня 2012, 17:44:48 | Сообщение # 1 |
7 уровень
Группа: Проверенные
Сообщений: 414
Награды: 0
Репутация: 116
Блокировки:
| Создал абилку, в мультиплеере при применении этой абилки игра выдает Fatal Error. Смысл абилки: цепной хил. Кто найдет ошибку, пожалуйста отпишитесь
Code function Trig_ChainHeal_Conditions takes nothing returns boolean return GetSpellAbilityId() == 'A05X' endfunction
function healka takes unit target,real hp returns nothing call SetUnitState(target, UNIT_STATE_LIFE, GetUnitState(target, UNIT_STATE_LIFE) + hp) call Trig_Dead_Actions(target,"|cff00ff00+" + I2S(R2I(hp)),10,96,GetRandomReal(60.00, 120.00)) endfunction
function DCL takes nothing returns nothing local integer id=GetHandleId(GetExpiredTimer()) local real alpha = LoadReal(udg_Hash,id,2) if alpha<=0 then call DestroyLightning(LoadLightningHandle(udg_Hash,id,1)) call DestroyTimer(GetExpiredTimer()) call FlushChildHashtable(udg_Hash,id) else call SetLightningColor(LoadLightningHandle(udg_Hash,id,1),0.25,0.25,1.,alpha) call SaveReal(udg_Hash,id,2,alpha-0.1) endif endfunction
function LNT takes nothing returns nothing local timer t=GetExpiredTimer() local timer tl local integer id=GetHandleId(t) local unit u = LoadUnitHandle(udg_Hash,id,1) local unit ut=LoadUnitHandle(udg_Hash,id,2) local lightning l=LoadLightningHandle(udg_Hash,id,3) local lightning l2 local group g=CreateGroup() local unit e local unit euf=null local integer countTarget=LoadInteger(udg_Hash,id,4) local real x=GetWidgetX(ut) local real y=GetWidgetY(ut) local real x1 local real y1 local real i=10 local real z = GetLocationZ(GetUnitLoc(ut))+i local real z1 = GetLocationZ(GetUnitLoc(euf))+i local real heal = LoadReal(udg_Hash,id,5)
call GroupEnumUnitsInRange(g,x,y,400,null) loop set e=FirstOfGroup(g) exitwhen e==null or euf!=null if IsUnitEnemy(e,GetOwningPlayer(u)) == false and GetUnitState(e, UNIT_STATE_LIFE) > 0.00 and IsUnitType(e, UNIT_TYPE_HERO) == true and IsUnitInGroup(e,udg_CH)==false then set euf=e endif call GroupRemoveUnit(g,e) endloop set x=GetLocationX(GetUnitLoc(ut))+i set y=GetLocationY(GetUnitLoc(ut))+i set x1=GetLocationX(GetUnitLoc(euf))+i set y1=GetLocationY(GetUnitLoc(euf))+i
if countTarget>0 and euf!=null then set tl=CreateTimer() call SaveLightningHandle(udg_Hash,GetHandleId(tl),1,l) call SaveReal(udg_Hash,GetHandleId(tl),2,1) call TimerStart(tl,.05,true,function DCL) call healka(euf,heal) call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\DeathPact\\DeathPactTarget.mdl",euf,"origin")) set l2=AddLightningEx("HWPB",true,x,y,z,x1,y1,z1) call SetLightningColor(l2,0.25,0.25,1.,1) call SaveLightningHandle(udg_Hash,id,3,l2) call SaveInteger(udg_Hash,id,4,countTarget-1) call SaveUnitHandle(udg_Hash,id,2,euf) else set tl=CreateTimer() call SaveLightningHandle(udg_Hash,GetHandleId(tl),1,l) call SaveReal(udg_Hash,GetHandleId(tl),2,1) call TimerStart(tl,0.10,true,function DCL) call GroupClear(udg_CH) call DestroyTimer(t) endif set t=null set tl=null set u=null set ut=null set l=null set l2=null set g=null set e=null set euf=null endfunction
function Trig_ChainHeal_Actions takes nothing returns nothing local timer t=CreateTimer() local integer id=GetHandleId(t) local unit u=GetSpellAbilityUnit() local unit ut=GetSpellTargetUnit() local lightning l local real i = 10 local real x=GetLocationX(GetUnitLoc(u))+i local real y=GetLocationY(GetUnitLoc(u))+i local real z=GetLocationZ(GetUnitLoc(u))+i local real x1=GetLocationX(GetUnitLoc(ut))+i local real y1=GetLocationY(GetUnitLoc(ut))+i local real z1=GetLocationZ(GetUnitLoc(ut))+i local real heal = (15 + (0.10 * GetHeroInt(u,true) * GetUnitAbilityLevel(u,'A05X') ) ) call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\DeathPact\\DeathPactTarget.mdl",ut,"origin")) call GroupAddUnit(udg_CH,ut) set l=AddLightningEx("HWPB",true,x,y,z,x1,y1,z1) call SetLightningColor(l,0.25,0.25,1.,1) call healka(ut,heal) call SaveUnitHandle(udg_Hash,id,1,u) call SaveUnitHandle(udg_Hash,id,2,ut) call SaveLightningHandle(udg_Hash,id,3,l) call SaveInteger(udg_Hash,id,4,3) call SaveReal(udg_Hash,id,5,heal) call TimerStart(t,0.15,true,function LNT) set t=null set u=null set ut=null set l=null endfunction
//=========================================================================== function InitTrig_ChainHeal takes nothing returns nothing local trigger t = CreateTrigger( ) call TriggerRegisterPlayerUnitEvent(t, Player(0), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(1), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(2), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(3), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(4), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(5), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(6), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(7), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(8), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(9), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerAddCondition(t, Condition( function Trig_ChainHeal_Conditions ) ) call TriggerAddAction(t, function Trig_ChainHeal_Actions ) endfunction
Нет места чести на войне, Враг церемониться не будет, Убей его любым путём, Ведь победителей не судят.
|
|
|
|
SirNikolas | Дата: Понедельник, 04 Июня 2012, 18:26:27 | Сообщение # 2 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Srezi) call Trig_Dead_Actions(target,"|cff00ff00+" + I2S(R2I(hp)),10,96,GetRandomReal(60.00, 120.00)) Можно код?
|
|
|
|
Srezi | Дата: Понедельник, 04 Июня 2012, 18:32:11 | Сообщение # 3 |
7 уровень
Группа: Проверенные
Сообщений: 414
Награды: 0
Репутация: 116
Блокировки:
| я это функция "плавающего текста". Она в полном порядке. Проверено.
Нет места чести на войне, Враг церемониться не будет, Убей его любым путём, Ведь победителей не судят.
|
|
|
|
SirNikolas | Дата: Понедельник, 04 Июня 2012, 18:39:20 | Сообщение # 4 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| В синглплеере все нормально?
|
|
|
|
Srezi | Дата: Понедельник, 04 Июня 2012, 18:41:29 | Сообщение # 5 |
7 уровень
Группа: Проверенные
Сообщений: 414
Награды: 0
Репутация: 116
Блокировки:
| ага. а в мультиплеере фатал вылетает
Нет места чести на войне, Враг церемониться не будет, Убей его любым путём, Ведь победителей не судят.
|
|
|
|
ctpaxm | Дата: Понедельник, 04 Июня 2012, 21:52:43 | Сообщение # 6 |
7 уровень
Группа: Проверенные
Сообщений: 418
Награды: 0
Репутация: 60
Блокировки:
| Quote (Srezi) call Trig_Dead_Actions(target,"|cff00ff00+" + I2S(R2I(hp)),10,96,GetRandomReal(60.00, 120.00)) а не будет лучше сразу R2S?
Dead Girls can't say NOT! Делаю свой ORPG проект, нужны триггерщики(JASS-еры) и идейщики... Все подробности в ЛС
Сообщение отредактировал ctpaxm - Понедельник, 04 Июня 2012, 21:52:54 |
|
|
|
Srezi | Дата: Понедельник, 04 Июня 2012, 21:54:35 | Сообщение # 7 |
7 уровень
Группа: Проверенные
Сообщений: 414
Награды: 0
Репутация: 116
Блокировки:
| Quote (ctpaxm) а не будет лучше сразу R2S?
так задумано, долго обьяснять почему именно так)) Не парься
Нет места чести на войне, Враг церемониться не будет, Убей его любым путём, Ведь победителей не судят.
|
|
|
|
Ty3uK | Дата: Понедельник, 04 Июня 2012, 21:56:12 | Сообщение # 8 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| тут куча недочетов, но вывод Р2С даст число с десятичными знаками. в итоге их можно вырезать через сабстринг или предварительно конвертнуть в инт, как тут и сделанно
|
|
|
|
Srezi | Дата: Понедельник, 04 Июня 2012, 22:24:00 | Сообщение # 9 |
7 уровень
Группа: Проверенные
Сообщений: 414
Награды: 0
Репутация: 116
Блокировки:
| Quote (Ty3uK) тут куча недочетов, но вывод Р2С даст число с десятичными знаками. в итоге их можно вырезать через сабстринг или предварительно конвертнуть в инт, как тут и сделанн
Вместо того, чтобы говорить то, что я итак сам знаю, лучше скажи из-за чего Fatal Error вылетает ??)))
Нет места чести на войне, Враг церемониться не будет, Убей его любым путём, Ведь победителей не судят.
|
|
|
|
SirNikolas | Дата: Вторник, 05 Июня 2012, 10:49:44 | Сообщение # 10 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Ty3uK) в итоге их можно вырезать через сабстринг или предварительно конвертнуть в инт, как тут и сделано А еще можно R2SW(hp, 0, 0) Srezi, почитай.
|
|
|
|
Srezi | Дата: Вторник, 05 Июня 2012, 13:58:12 | Сообщение # 11 |
7 уровень
Группа: Проверенные
Сообщений: 414
Награды: 0
Репутация: 116
Блокировки:
| Quote (SirNikolas) А еще можно R2SW(hp, 0, 0) Srezi, почитай.
Думал "локал" не будет вызывать фатал еррор... Лана тему оф, никто не знает.
Нет места чести на войне, Враг церемониться не будет, Убей его любым путём, Ведь победителей не судят.
|
|
|
|
DragoN | Дата: Среда, 06 Июня 2012, 12:26:00 | Сообщение # 12 |
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
| в какой момнт фатал, срази при клике на абилку или через некоторое время?
El Psy Congroo
|
|
|
|
Srezi | Дата: Среда, 06 Июня 2012, 13:08:53 | Сообщение # 13 |
7 уровень
Группа: Проверенные
Сообщений: 414
Награды: 0
Репутация: 116
Блокировки:
| Через 0.5 сек после клика абилки
Нет места чести на войне, Враг церемониться не будет, Убей его любым путём, Ведь победителей не судят.
|
|
|
|
DragoN | Дата: Среда, 06 Июня 2012, 17:34:50 | Сообщение # 14 |
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
| Quote (Srezi) Через 0.5 сек после клика абилки засекал? добавь отладочные сообщения, легче будет выцепить проблемный участок или пиши всё в лог
El Psy Congroo
|
|
|
|
Srezi | Дата: Среда, 06 Июня 2012, 19:34:07 | Сообщение # 15 |
7 уровень
Группа: Проверенные
Сообщений: 414
Награды: 0
Репутация: 116
Блокировки:
| Quote (DragoN) засекал? добавь отладочные сообщения, легче будет выцепить проблемный участок или пиши всё в лог
че тут засекать. герой тыкает абилку, на каст способности дается 0.55 сек, так как на основе канала, а там прописывается время.
кастанул, вылетел.
в чем проблема хз.
Нет места чести на войне, Враг церемониться не будет, Убей его любым путём, Ведь победителей не судят.
|
|
|
|
Ty3uK | Дата: Среда, 06 Июня 2012, 20:16:15 | Сообщение # 16 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| после каждого действия выводи циферку. на какой вылетит - там и ошибка это простейший дебаг
|
|
|
|
SirNikolas | Дата: Четверг, 07 Июня 2012, 06:34:04 | Сообщение # 17 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Ty3uK) после каждого действия выводи циферку. на какой вылетит - там и ошибка Не получится. Вывод в консоль (прошу прощения, на экран) производится после остановки потока. Т. е. для того, чтобы отлаживать таким методом, нужно после каждого сообщения вставлять TriggerSleepAction(.0). Сам понимаешь, чревато еще большими багами. Но попробовать можно.
|
|
|
|
Ty3uK | Дата: Четверг, 07 Июня 2012, 07:14:09 | Сообщение # 18 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| можно и без этого, я же как-то выводил (:
|
|
|
|
kapa6acvlk | Дата: Четверг, 07 Июня 2012, 23:18:32 | Сообщение # 19 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| Используя приведенный код, выкинув из него функцию Trig_Dead_Actions, немного пофиксив, получилось следующее: Code function Trig_ChainHeal_Conditions takes nothing returns boolean return GetSpellAbilityId() == 'AHtb' endfunction
function healka takes unit target,real hp returns nothing call SetUnitState(target, UNIT_STATE_LIFE, GetUnitState(target, UNIT_STATE_LIFE) + hp) endfunction
function DCL takes nothing returns nothing local timer t = GetExpiredTimer() local integer id=GetHandleId(t) local real alpha = LoadReal(udg_Hash,id,2) if alpha<=0. then call DestroyLightning(LoadLightningHandle(udg_Hash,id,1)) call DestroyTimer(t) call FlushChildHashtable(udg_Hash,id) else call SetLightningColor(LoadLightningHandle(udg_Hash,id,1),0.25,0.25,1.,alpha) call SaveReal(udg_Hash,id,2,alpha-0.1) endif set t = null endfunction
function LNT takes nothing returns nothing local timer t=GetExpiredTimer() local timer tl = null local integer id=GetHandleId(t) local unit u = LoadUnitHandle(udg_Hash,id,1) local unit ut=LoadUnitHandle(udg_Hash,id,2) local lightning l=LoadLightningHandle(udg_Hash,id,3) local lightning l2 = null local group g=CreateGroup() local unit e = null local unit euf=null local integer countTarget=LoadInteger(udg_Hash,id,4) local real x=GetWidgetX(ut) local real y=GetWidgetY(ut) local real x1 local real y1 local real i=10 local real heal = LoadReal(udg_Hash,id,5) call GroupEnumUnitsInRange(g,x,y,400,null) loop set e=FirstOfGroup(g) exitwhen e==null if IsUnitAlly(e,GetOwningPlayer(u)) and GetUnitState(e, UNIT_STATE_LIFE) > 1.00 and IsUnitType(e, UNIT_TYPE_HERO) and e != ut then set euf=e exitwhen true endif call GroupRemoveUnit(g,e) endloop set x=GetUnitX(ut)+i set y=GetUnitY(ut)+i set x1=GetUnitX(euf)+i set y1=GetUnitY(euf)+i if countTarget>0 and euf!=null then set tl=CreateTimer() call SaveLightningHandle(udg_Hash,GetHandleId(tl),1,l) call SaveReal(udg_Hash,GetHandleId(tl),2,1) call TimerStart(tl,.05,true,function DCL) call healka(euf,heal) call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\DeathPact\\DeathPactTarget.mdl",euf,"origin")) set l2=AddLightningEx("HWPB",true,x,y,0.0,x1,y1,0.0) call SetLightningColor(l2,0.25,0.25,1.,1) call SaveLightningHandle(udg_Hash,id,3,l2) call SaveInteger(udg_Hash,id,4,countTarget-1) call SaveUnitHandle(udg_Hash,id,2,euf) else set tl=CreateTimer() call SaveLightningHandle(udg_Hash,GetHandleId(tl),1,l) call SaveReal(udg_Hash,GetHandleId(tl),2,1) call TimerStart(tl,0.10,true,function DCL) call DestroyTimer(t) endif call DestroyGroup(g) set t=null set tl=null set u=null set ut=null set l=null set l2=null set g=null set e=null set euf=null endfunction
function Trig_ChainHeal_Actions takes nothing returns nothing local timer t=CreateTimer() local integer id=GetHandleId(t) local unit u=GetSpellAbilityUnit() local unit ut=GetSpellTargetUnit() local lightning l = null local real i = 10 local real x=GetUnitX(u)+i local real y=GetUnitY(u)+i local real x1=GetUnitX(ut)+i local real y1=GetUnitY(ut)+i local real heal = 15 + (0.10 * GetHeroInt(u,true)) call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\DeathPact\\DeathPactTarget.mdl",ut,"origin")) set l=AddLightningEx("HWPB",true,x,y,0.0,x1,y1,0.0) call SetLightningColor(l,0.25,0.25,1.,1) call healka(ut,heal) call SaveUnitHandle(udg_Hash,id,1,u) call SaveUnitHandle(udg_Hash,id,2,ut) call SaveLightningHandle(udg_Hash,id,3,l) call SaveInteger(udg_Hash,id,4,3) call SaveReal(udg_Hash,id,5,heal) call TimerStart(t,0.15,true,function LNT) set t=null set u=null set ut=null set l=null endfunction
//=========================================================================== function InitTrig_ChainHeal takes nothing returns nothing local trigger t = CreateTrigger( ) call TriggerRegisterPlayerUnitEvent(t, Player(0), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(1), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(2), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(3), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(4), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(5), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(6), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(7), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(8), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerRegisterPlayerUnitEvent(t, Player(9), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) call TriggerAddCondition(t, Condition( function Trig_ChainHeal_Conditions ) ) call TriggerAddAction(t, function Trig_ChainHeal_Actions ) endfunction
Только что проверил в мультиплеере, вылетов нет, проблем нет, хилит норм. Только не забудь множитель уровня абилы вернуть, я его убрал. Да и кстати, зачем группа CH??? Я ее тоже выпилил.
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
|
|
|
|
Ty3uK | Дата: Пятница, 08 Июня 2012, 09:08:12 | Сообщение # 20 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| GetUnitState(target, UNIT_STATE_LIFE) замени на GetWidgetLife() SetUnitState() замени на SetWidgetLife() лучше юзать одну глобальную группу, чем несколько раз создавать локальную
|
|
|
|
kapa6acvlk | Дата: Пятница, 08 Июня 2012, 11:28:39 | Сообщение # 21 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| Ty3uK, что вернет GetWidgetLife() ?? Текущее значение здоровья?
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
|
|
|
|
Ty3uK | Дата: Пятница, 08 Июня 2012, 11:46:45 | Сообщение # 22 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| kapa6acvlk, ну из названия выходит, что да
|
|
|
|
Srezi | Дата: Пятница, 08 Июня 2012, 12:18:27 | Сообщение # 23 |
7 уровень
Группа: Проверенные
Сообщений: 414
Награды: 0
Репутация: 116
Блокировки:
| Quote (kapa6acvlk) Используя приведенный код, выкинув из него функцию Trig_Dead_Actions, немного пофиксив, получилось следующее:
Это плавающий тект, показывающий (Кол-во) исцеленного здоровья)
Только что проверил в мультиплеере, вылетов нет, проблем нет, хилит норм. Только не забудь множитель уровня абилы вернуть, я его убрал. Да и кстати, зачем группа CH??? Я ее тоже выпилил.
Чтобы волна не шла по одним и тем же юнитам.
Нет места чести на войне, Враг церемониться не будет, Убей его любым путём, Ведь победителей не судят.
|
|
|
|
Ty3uK | Дата: Пятница, 08 Июня 2012, 12:38:21 | Сообщение # 24 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Srezi, сохранил на хэндл юнита в ячейку с хэндлом юнита бульку и проверяй ее если правда - значит прошла
|
|
|
|
Srezi | Дата: Пятница, 08 Июня 2012, 14:05:12 | Сообщение # 25 |
7 уровень
Группа: Проверенные
Сообщений: 414
Награды: 0
Репутация: 116
Блокировки:
| Quote (Ty3uK) Srezi, сохранил на хэндл юнита в ячейку с хэндлом юнита бульку и проверяй ее если правда - значит прошла
тему уже давно пора закрывать, я починил...
Нет места чести на войне, Враг церемониться не будет, Убей его любым путём, Ведь победителей не судят.
|
|
|
|
|
|
|
|
|
|
|