|
|
|
|
Ошибка в триггере, бесконечно наносится урон
|
|
Smartaros | Дата: Понедельник, 06 Августа 2012, 13:40:55 | Сообщение # 26 |
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
| равкод я проверял, все правильно
|
|
|
|
kapa6acvlk | Дата: Понедельник, 06 Августа 2012, 14:48:17 | Сообщение # 27 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| А ты убрал из проверки расчет шанса, у тебя может шанс не выпадает??
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
|
|
|
|
Smartaros | Дата: Понедельник, 06 Августа 2012, 16:10:55 | Сообщение # 28 |
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
| я для проверки перед действием на создание юнита ставил действие текстовое сообщение, оно норм выпадает
|
|
|
|
kapa6acvlk | Дата: Понедельник, 06 Августа 2012, 16:51:12 | Сообщение # 29 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| Взял код из поста выше, создал новую карту, вставил, настроил юнита и абилу в коде, протестит все ОК. http://rghost.ru/39605391
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
|
|
|
|
Smartaros | Дата: Понедельник, 06 Августа 2012, 21:29:54 | Сообщение # 30 |
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
| аааа, черт.....писал равкод с капсом и с шифтом, вместо K написалось k, все работает, спасибо Добавлено (06 Августа 2012, 21:29:54) --------------------------------------------- кстати, а если я в действиях тригерно нанесу урон, то он может нанестись многократно? или ты это учел?
|
|
|
|
kapa6acvlk | Дата: Вторник, 07 Августа 2012, 13:22:38 | Сообщение # 31 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| если от имени дамика, то ничего страшного не произойдет, а если от имени героя, то хз, я как-то не задумывался, скорее всего тоже ничего не произойдет, т.к. к тому времени триггер уже будет уничтожен.
Обрати внимание Smartaros, Используй данную наработку только для воинов ближнего боя, с дальним боем будут проблемы. Т.к. если у юнита большая скорость атаки, он успевает стрельнуть несколько раз, до того момента, как снаряд попадет в цель, из-за этого созданный триггер постоянно уничтожается раньше, чем успевает сработать, и естественно ничего не работает. Печально, но для дальнего боя я пока ничего не придумал, а то, что придумал, работает криво
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
Сообщение отредактировал kapa6acvlk - Вторник, 07 Августа 2012, 13:23:35 |
|
|
|
Borodach | Дата: Вторник, 07 Августа 2012, 14:57:25 | Сообщение # 32 |
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
| Smartaros, Могу скинуть работающий триггер, только объясни суть
Karamba
|
|
|
|
kapa6acvlk | Дата: Вторник, 07 Августа 2012, 15:11:32 | Сообщение # 33 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| Borodach, Цель, динамически создать триггер на отлов урона, и при атаке, нанести урон атакованному юниту, создать дамика, скастовать скилл. Добавление каждого унита в существующий триггер не предлагай.
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
Сообщение отредактировал kapa6acvlk - Вторник, 07 Августа 2012, 15:11:42 |
|
|
|
Smartaros | Дата: Вторник, 07 Августа 2012, 18:12:10 | Сообщение # 34 |
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
| для рейндж героев можно сделать проверку, при начале атаке создавать даммика, и проверять жив ли он, если жив то удалять его и далее по действиям, то есть для каждого выстрела будет свой локальный дамми, как бы первый снаряд не будет перебивать последующий
|
|
|
|
kapa6acvlk | Дата: Вторник, 07 Августа 2012, 20:53:09 | Сообщение # 35 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| Smartaros, не понял. Триггер разрушается перед созданием нового, всегда. Хоть есть дамми, хоть нет, если убрать разрушение триггера, то можно будет вызывать всеми любимый баг со стопом. Поясни, я просто видимо не въезжаю в твою мысль.
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
|
|
|
|
Borodach | Дата: Вторник, 07 Августа 2012, 21:04:22 | Сообщение # 36 |
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
| Code globals group GDT = CreateGroup() trigger TDT = CreateTrigger() endglobals
define { SPELL = 'AEev' //ид спела у героя DUMMY = 'n000' //ид дамми юнита SPELL_D = 'Aslo' //ид спела у дамми юнита ORDER = "slow" // приказ способности у дамми CHANCE = 12 //шанс CHANCE_LVL = 3 // прирост шанса на уровень DAMAGE = 5 // дополнительный урон DAMAGE_LVL = 5 //прирост урона на уровень }
function Trig_DealingDamage_Conditions takes nothing returns boolean return GetUnitAbilityLevel(GetAttacker(),SPELL) > 0 endfunction
function BDealingDamage takes nothing returns nothing local unit u=GetEventDamageSource() local unit ut=GetTriggerUnit() local unit d local real dm=GetEventDamage() local integer lvl=GetUnitAbilityLevel(u,SPELL) if dm>0. and GetUnitAbilityLevel(u,SPELL)>0 then call DisableTrigger(GetTriggeringTrigger()) call UnitDamageTarget(u,ut,DAMAGE+DAMAGE_LVL*lvl,true,false,ATTACK_TYPE_HERO,DAMAGE_TYPE_NORMAL,null) call EnableTrigger(GetTriggeringTrigger()) if GetRandomInt(1,100)<=CHANCE+CHANCE_LVL*lvl then set d=CreateUnit(GetOwningPlayer(u),DUMMY,GetWidgetX(ut),GetWidgetY(ut),0.) call UnitApplyTimedLife(d,'BTLF',6.3) call UnitAddAbility(d,SPELL_D) call SetUnitAbilityLevel(d,SPELL_D,lvl) call IssueTargetOrder(d,ORDER,ut) endif call BJDebugMsg(I2S(R2I((GetEventDamage())))) endif
set u=null set ut=null set d=null endfunction
function Trig_DealingDamage_Actions takes nothing returns nothing local unit u=GetTriggerUnit() if IsUnitInGroup(u,GDT)==false then call TriggerRegisterUnitEvent(TDT,u,EVENT_UNIT_DAMAGED) call GroupAddUnit(GDT,u) endif set u=null endfunction
//=========================================================================== function InitTrig_DealingDamage takes nothing returns nothing set gg_trg_DealingDamage=CreateTrigger() call TriggerRegisterAnyUnitEventBJ(gg_trg_DealingDamage,EVENT_PLAYER_UNIT_ATTACKED) call TriggerAddCondition(gg_trg_DealingDamage,Condition(function Trig_DealingDamage_Conditions)) call TriggerAddAction(gg_trg_DealingDamage,function Trig_DealingDamage_Actions) call TriggerAddAction(TDT,function BDealingDamage) endfunction Наносит дополнительный урон (при нанесении урона) и с шансом накладывает замедление (может быть любой целевой спел)
Karamba
Сообщение отредактировал Borodach - Вторник, 07 Августа 2012, 21:32:13 |
|
|
|
Smartaros | Дата: Вторник, 07 Августа 2012, 21:24:42 | Сообщение # 37 |
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
| не могу текстом обьяснить xD
|
|
|
|
kapa6acvlk | Дата: Вторник, 07 Августа 2012, 21:35:13 | Сообщение # 38 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| Borodach, Quote (kapa6acvlk) Добавление каждого унита в существующий триггер не предлагай.
Не читаешь мои посты принципиально?, если так, то все было бы очень просто Да и на одном, всем известном, сайте есть наработка этого-же только на гуи
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
Сообщение отредактировал kapa6acvlk - Вторник, 07 Августа 2012, 21:36:33 |
|
|
|
Borodach | Дата: Вторник, 07 Августа 2012, 21:37:28 | Сообщение # 39 |
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
| kapa6acvlk, Не понимаю , работает же, какая разница?
Karamba
|
|
|
|
kapa6acvlk | Дата: Вторник, 07 Августа 2012, 22:08:44 | Сообщение # 40 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| Borodach, атака любого юнита на карте будет вызывать срабатывание триггера, это нормально?
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
|
|
|
|
Borodach | Дата: Вторник, 07 Августа 2012, 22:13:06 | Сообщение # 41 |
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
| kapa6acvlk, условие стоит, на наличие способности.
Karamba
|
|
|
|
kapa6acvlk | Дата: Вторник, 07 Августа 2012, 23:37:52 | Сообщение # 42 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| Переписал все сначала, получилось следующее. Триггер создается на конкретного юнита, которого атакует конкретный герой имеющий конкретную абилу, а не на всех подряд юнитов. При смерти юнита, триггер уничтожается. Работает как для ближнего, так и для дальнего боя. Бага со стопом соответственно нет. 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 GetRandomInt(1,100)<=6+4*GetUnitAbilityLevel(GetEventDamageSource(), 'AHwe') 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', 2.00) set u = null set c = null set d = null endfunction
function UnitAttack takes nothing returns nothing 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) //триггер на уничтожения трггера получения урона при смерти юнита 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 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
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
Сообщение отредактировал kapa6acvlk - Среда, 08 Августа 2012, 00:06:07 |
|
|
|
Smartaros | Дата: Среда, 08 Августа 2012, 16:24:38 | Сообщение # 43 |
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
| ща буду тестить на долгое время игры
|
|
|
|
kapa6acvlk | Дата: Среда, 08 Августа 2012, 16:47:00 | Сообщение # 44 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| Smartaros, Я тестил, все было ОК. Все созданные триггером объекты уничтожаются при смерти юнита, для которого они были созданы. Насчет мифа о том, что события вызывают утечки, миф не подтвержден (по крйней мере для call TriggerRegisterUnitEvent(t, c, EVENT_UNIT_DAMAGED)). Сам тестил его, пришел к выводу, если триггер с этим событием полностью разрушен, а юнит был удален из карты, то событие удаляется автоматически, игрой.
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
|
|
|
|
Smartaros | Дата: Среда, 08 Августа 2012, 21:25:33 | Сообщение # 45 |
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
| а сколько по времени ты тестил? я не пойму, либо у меня карта замусорена лагающими тригами, либо этот засоряет, у меня игра вылетела минут через 10, причем лагов вообще не было, все летало и бац...
|
|
|
|
kapa6acvlk | Дата: Четверг, 09 Августа 2012, 00:35:00 | Сообщение # 46 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| Smartaros, попробую еще раз запустить. Добавлено (09 Августа 2012, 00:35:00) --------------------------------------------- Smartaros, как я понял, вылет вызывает приказ даммику, используй систему приведенную Borodach. А я пойду думать, че с этим делать.
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
|
|
|
|
Smartaros | Дата: Четверг, 09 Августа 2012, 00:58:21 | Сообщение # 47 |
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
| почему приказ вызывает вылет??ммм
|
|
|
|
kapa6acvlk | Дата: Четверг, 09 Августа 2012, 02:15:16 | Сообщение # 48 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| Smartaros, хз, скорее не сам приказ, а то что за ним следует, но если его запретить, то вылета не наблюдается, ну по крайней мере на карте с 1000 юнитов вышибало в первые пол секунды, а с закрытым приказом они рубили пару минут, потом я вышел.
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
|
|
|
|
Smartaros | Дата: Четверг, 09 Августа 2012, 02:50:42 | Сообщение # 49 |
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
| а этот глюк только с целевым приказом, или с любым? что если приказывать юзать бесцельный спелл, или через другую функцию, которая требует 6-значное число?
|
|
|
|
kapa6acvlk | Дата: Четверг, 09 Августа 2012, 10:30:39 | Сообщение # 50 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| дело не в приказе. вылет происходит, когда дамми наносит урон. если приказ убрать, а вместо него поставить триггерное нанесение урона, будет тоже самое. может т не урон виноват опять же, надо думать дальше.
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
|
|
|
|
|
|
|
|
|
|
|