Сейчас 06:46:38 Суббота, 20 апреля, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Ошибка в триггере, бесконечно наносится урон
Ошибка в триггере, бесконечно наносится урон
SmartarosДата: Четверг, 09 Августа 2012, 15:27:09 | Сообщение # 51
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
мож николас знает?))
 

HexingДата: Четверг, 09 Августа 2012, 16:12:35 | Сообщение # 52
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
напишите код и в чём проблема

 

SmartarosДата: Четверг, 09 Августа 2012, 16:21:21 | Сообщение # 53
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
он есть в теме
 

HexingДата: Четверг, 09 Августа 2012, 16:36:32 | Сообщение # 54
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Smartaros, чего ты хочешь? тот код что в теме норм, проблема там у тебя, но я же не телепат

 

SmartarosДата: Вторник, 14 Августа 2012, 17:46:01 | Сообщение # 55
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
а что у меня код другой? что ты там видишь то и у меня

Добавлено (14 Августа 2012, 17:46:01)
---------------------------------------------
ну и?

 

kapa6acvlkДата: Вторник, 14 Августа 2012, 18:27:11 | Сообщение # 56
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
Я пока подзабил на эту тему =)) Немного расслабился, занимался всякой фигней, писал арканоид :D
У меня просто даже догадок нет, в чем может быть причина.



Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич
 

SmartarosДата: Вторник, 14 Августа 2012, 19:06:21 | Сообщение # 57
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
а почему бы не дизейблить триггер до урона, наносить его от лица героя, и потом вновь включать?
 

HexingДата: Вторник, 14 Августа 2012, 20:10:58 | Сообщение # 58
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Quote (Smartaros)
а почему бы не дизейблить триггер до урона, наносить его от лица героя, и потом вновь включать?

используй переменную логического типа


 

SmartarosДата: Вторник, 14 Августа 2012, 20:54:34 | Сообщение # 59
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
а по-конкретней?
 

kapa6acvlkДата: Вторник, 14 Августа 2012, 20:55:27 | Сообщение # 60
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
Quote (Hexing)
используй переменную логического типа

поставил проверку по GetEventDamageSource() все работает как надо, только утекает где-то. Надо теперь утечку искать. Склояюсь к том, что утекает boolexpr



Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич
 

HexingДата: Вторник, 14 Августа 2012, 20:56:21 | Сообщение # 61
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Smartaros, перед нанесением урона твоя переменная = Истина
нанести урон
в триггере урона условие
если твоя переменная = Ложь
после нанесения урона твоя переменная = Ложь


 

kapa6acvlkДата: Вторник, 14 Августа 2012, 21:49:47 | Сообщение # 62
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
Hexing, не понимаю ход твоих мыслей, относительно кода. Дублирую код еще раз, вылетает сволоч, пишет переполнение стека. Если убрать строку call IssueTargetOrder(d, "frostnova", c), то вылета не будет. Но вылетает не из-за строки, если вместо нее поставить call UnitDamageTarget(d, c, 1.0, true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS) эффект тот же.

Code
function DestroyPasSpell takes nothing returns nothing
     local trigger t = GetTriggeringTrigger()
     local unit c = LoadUnitHandle(udg_HashDMG,GetHandleId(t),1)
     local trigger d = LoadTriggerHandle(udg_HashDMG,GetHandleId(c),1)
     //унитчожаем триггер на получение урона
     call TriggerRemoveAction(d,LoadTriggerActionHandle(udg_HashDMG,GetHandleId(c),2))
     call TriggerRemoveCondition(d,LoadTriggerConditionHandle(udg_HashDMG,GetHandleId(c),3))
     call DestroyBoolExpr(LoadBooleanExprHandle(udg_HashDMG,GetHandleId(c),4))
     call DestroyTrigger(d)
     //уничтожаем этот триггер
     call TriggerRemoveAction(t,LoadTriggerActionHandle(udg_HashDMG,GetHandleId(t),0))
     call DestroyTrigger(t)
     call FlushChildHashtable(udg_HashDMG, GetHandleId(t))
     call FlushChildHashtable(udg_HashDMG, GetHandleId(c))
     set t = null
     set c = null
     set d = null
endfunction

//проверка на имение абилы, и расчет шанса
function PasSpell_Conditions takes nothing returns boolean
     return GetUnitAbilityLevel(GetEventDamageSource(), 'AHwe') > 0 and not(IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE)) and 100>GetRandomInt(1,100) and GetEventDamageSource() == LoadUnitHandle(udg_HashDMG,GetHandleId(GetTriggerUnit()),5)
endfunction

//действия при выпадении шанса
function PasSpell_Actions takes nothing returns nothing
     local unit u = GetEventDamageSource()
     local unit c = GetTriggerUnit()
     local unit d = CreateUnit(GetOwningPlayer(u),'u000',GetUnitX(c),GetUnitY(c),0.)
     call UnitAddAbility(d,'A000')
     call IssueTargetOrder(d, "frostnova", c)
     call UnitApplyTimedLife(d, 'BTLF', 1.00)
     set udg_i = udg_i +1
     call BJDebugMsg(I2S(udg_i))
     set u = null
     set c = null
     set d = null
endfunction

function UnitAttack takes nothing returns nothing
     local unit u = GetTriggerUnit()
     local unit c = GetEventTargetUnit()
     local trigger t = null
     local triggeraction tra = null
     local triggercondition trc = null
     local boolexpr b = null
     if(not(LoadBoolean(udg_HashDMG,GetHandleId(c),0)))then
         //создаем триггер на получение урона
         set t = CreateTrigger()
         set tra = TriggerAddAction(t, function PasSpell_Actions)
         set b = Condition(function PasSpell_Conditions)
         set trc = TriggerAddCondition(t, b)
         call TriggerRegisterUnitEvent(t, c, EVENT_UNIT_DAMAGED)
         call SaveBoolean(udg_HashDMG,GetHandleId(c),0,true)
         call SaveTriggerHandle(udg_HashDMG,GetHandleId(c),1,t)
         call SaveTriggerActionHandle(udg_HashDMG,GetHandleId(c),2,tra)
         call SaveTriggerConditionHandle(udg_HashDMG,GetHandleId(c),3,trc)
         call SaveBooleanExprHandle(udg_HashDMG,GetHandleId(c),4,b)
         call SaveUnitHandle(udg_HashDMG,GetHandleId(c),5,u)
         //триггер на уничтожения трггера получения урона при смерти юнита
         set t = CreateTrigger()
         set tra = TriggerAddAction(t, function DestroyPasSpell)
         call TriggerRegisterUnitEvent(t, c, EVENT_UNIT_DEATH)
         call SaveTriggerActionHandle(udg_HashDMG,GetHandleId(t),0,tra)
         call SaveUnitHandle(udg_HashDMG,GetHandleId(t),1,c)
         set t = null
         set tra = null
         set trc = null
         set b = null
     endif
     set c = null
     set u = null
endfunction

//проверка на прокачиваемую абилу
function Trig_LearningSkill_Conditions takes nothing returns boolean
     return GetLearnedSkill() == 'AHwe' and GetUnitAbilityLevel(GetLearningUnit(),'AHwe')==1
endfunction

//создаем новый триггер, конкретно на нашего юнита
function Trig_LearningSkill_Actions takes nothing returns nothing
     local trigger t = CreateTrigger()
     call TriggerRegisterUnitEvent( t, GetLearningUnit(), EVENT_UNIT_TARGET_IN_RANGE )
     call TriggerAddAction( t, function UnitAttack )
     set t = null
endfunction

//===========================================================================
function InitTrig_LearningSkill takes nothing returns nothing
     set gg_trg_LearningSkill = CreateTrigger(  )
     call TriggerRegisterAnyUnitEventBJ( gg_trg_LearningSkill, EVENT_PLAYER_HERO_SKILL )
     call TriggerAddCondition( gg_trg_LearningSkill, Condition( function Trig_LearningSkill_Conditions ) )
     call TriggerAddAction( gg_trg_LearningSkill, function Trig_LearningSkill_Actions )
endfunction



Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич
 

HexingДата: Среда, 15 Августа 2012, 08:39:27 | Сообщение # 63
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
kapa6acvlk, перечитал я весь ваш код, короче скажу одно - локальные триггеры - это зло, используйте один триггер и проверку в группе ли юнит, вы проигрываете и по времени выполнения, и по памяти, кстати гдето ктото говорил что в триггерах событие не уничтожается, что приводит к утечке даже при полном уничтожении триггера, вообщем по делу: ваша чудная функция DestroyPasSpell ни в одном месте не вызывается, а значит триггер зацикливается:
наносится урон - срабатывает триггер - наносится урон - срабатывает триггер, тут даже дело не в переменной, тут вы с кодом намудрили, вы триггер нихрена не уничтожаете, тобишь функцию в хэш сохранили, а вызывать кто будет?
исправлять код не буду, т.к. в нём трудно ориентироваться, но думаю не помешало бы переписать его, когда закончу все мои другие долги, могу помочь closedeyes


 

kapa6acvlkДата: Среда, 15 Августа 2012, 12:06:31 | Сообщение # 64
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
Quote (Hexing)
триггерах событие не уничтожается

Не было подтверждено, судья по тестам, событие уничтожается само, если связанный с ним триггер и боевая единица более не существуют.
Quote (Hexing)
ваша чудная функция DestroyPasSpell ни в одном месте не вызывается

Смотрим код, находим:
Code
         set tra = TriggerAddAction(t, function DestroyPasSpell)
          call TriggerRegisterUnitEvent(t, c, EVENT_UNIT_DEATH)

Функция вызывается нормально в случае гибели юнита.
Quote (Hexing)
триггер зацикливается

Триггер не может зациклится, ибо в триггере стоит проверка, кто именно нанес урон. Триггер срабатывает только на определенного юнита:

Сложилось впечатление, что ты код вообще не смотрел, коменты не читал, как мне кажется в коде ход моих мыслей должен быть понятен.



Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич
 

HexingДата: Среда, 15 Августа 2012, 13:25:58 | Сообщение # 65
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Quote (kapa6acvlk)
Сложилось впечатление, что ты код вообще не смотрел, коменты не читал, как мне кажется в коде ход моих мыслей должен быть понятен.

ах, либо я действительно ничего не понял, либо я ничего не понял, в любом случае имхо код ужасный разбирайтесь сами


 

SmartarosДата: Среда, 15 Августа 2012, 13:47:43 | Сообщение # 66
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
чем он ужасный? я нубок и то норм ориентируюсь...
 

kapa6acvlkДата: Среда, 15 Августа 2012, 14:33:56 | Сообщение # 67
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
Quote (Hexing)
имхо код ужасный

Ужасный он, только тем, что ключи для сохранения в хеш используются числа, и в них можно путаться, а так я не вижу в нем ничего заумного. Может он в каком-то месте туп, но я не программист, мне сложно об этом рассуждать и склад ума у меня не программерский (математически-логический).



Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич
 

HexingДата: Среда, 15 Августа 2012, 16:26:43 | Сообщение # 68
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Quote (kapa6acvlk)
Ужасный он, только тем, что ключи для сохранения в хеш используются числа, и в них можно путаться, а так я не вижу в нем ничего заумного. Может он в каком-то месте туп, но я не программист, мне сложно об этом рассуждать и склад ума у меня не программерский (математически-логический).

я просто говорю что он не читабелен


 

kapa6acvlkДата: Среда, 15 Августа 2012, 18:43:04 | Сообщение # 69
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
Quote (Hexing)
я просто говорю что он не читабелен

Он не более нечитабелен чем этот:




Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич
 

HexingДата: Среда, 15 Августа 2012, 18:49:08 | Сообщение # 70
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Quote (kapa6acvlk)
Он не более нечитабелен чем этот:

сложен != не читабелен, но ваш код можно заметно упростить, в отличии от моего, которой сделан как можно более упрощённо


 

kapa6acvlkДата: Среда, 15 Августа 2012, 21:02:43 | Сообщение # 71
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
Quote (Hexing)
код можно заметно упростить

Жду ваших предложений, подкрепленных фактами.

По поводу статьи
Кстати по поводу твоего примера, группа targets объевлена но не уничтожена, сравнение found == true не нужно, ибо found булин. Исправь в статье.



Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич
 

HexingДата: Среда, 15 Августа 2012, 21:26:12 | Сообщение # 72
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Quote (kapa6acvlk)
По поводу статьи
Кстати по поводу твоего примера, группа targets объевлена но не уничтожена, сравнение found == true не нужно, ибо found булин. Исправь в статье.

я до кучи геморился со статьёй, исправлять её могу только модеры, мне приходилось два раза давать исправленный текст модератору
ведь пишешь всё это в блакнотике, сам путаешь уже что удалил а что нет, а на счёт found - надо, это плохая привычка if(bool)
а с группой - чёрт с ней


 

kapa6acvlkДата: Среда, 15 Августа 2012, 23:45:15 | Сообщение # 73
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
Quote (Hexing)
это плохая привычка if(bool)

Почему? Всегда все норм работает, зачем сравнивать true == true?

Smartaros, Уж не знаю почему, но убрав проверку, вылета нет. По всей видимости, если какие-то огранечения на использование boolexpr либо TriggerCondition, вот карта наработка с этот системой: http://rghost.ru/39806031 Я ждал до 100000 срабатываний триггера, что в простой игре невозможно. Для теста введи 1. Создадутся юниты, и герои прокачают абилу. Код отдельно выкладывать не буду, думаю в карте посмотришь.



Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич


Сообщение отредактировал kapa6acvlk - Среда, 15 Августа 2012, 23:45:32
 

ExtrematorДата: Четверг, 16 Августа 2012, 01:52:40 | Сообщение # 74
10 уровень
Группа: Проверенные
Сообщений: 3199
Награды: 0
Репутация: 1018
Блокировки:
неужели так и не решили эту проблему? =_=

обычно что бы наносить чистый урон который ничем не будет увеличен, я, обычно, наношу его от лица особого даммика
а во всех триггерах с событием получения урона стоит условие "тип юнита наносящего урон не равно Dammy p_dmg"
 

SmartarosДата: Четверг, 16 Августа 2012, 03:37:32 | Сообщение # 75
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
ты не понял проблему, игра вылетает при условии, а если наносить урон от героя, то может нанестись многократно
 

Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Ошибка в триггере, бесконечно наносится урон
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz