Сейчас 10:13:58 Пятница, 22 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
Ошибка в триггере, бесконечно наносится урон
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, Используй данную наработку только для воинов ближнего боя, с дальним боем будут проблемы. Т.к. если у юнита большая скорость атаки, он успевает стрельнуть несколько раз, до того момента, как снаряд попадет в цель, из-за этого созданный триггер постоянно уничтожается раньше, чем успевает сработать, и естественно ничего не работает. Печально, но для дальнего боя я пока ничего не придумал, а то, что придумал, работает криво :D



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


Сообщение отредактировал 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)
Добавление каждого унита в существующий триггер не предлагай.


Не читаешь мои посты принципиально?, если так, то все было бы очень просто :D
Да и на одном, всем известном, сайте есть наработка этого-же только на гуи



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


Сообщение отредактировал 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
Блокировки:
дело не в приказе. вылет происходит, когда дамми наносит урон. если приказ убрать, а вместо него поставить триггерное нанесение урона, будет тоже самое. может т не урон виноват опять же, надо думать дальше.


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

  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск:

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