Terrabull
Veteran Member (Done that)
- Reaction score
- 38
I posted this in the thread for UAC, but apparently no one looks at that, so I decided to ask for help here.
I am using Romek's UAC system but it's not working any better than the Warcraft Engine, which is highly disappointing.
Summary:
There are three units, three auras, and one ability with three levels each level corresponding to one unit.
When a unit is damaged by one of the units, the aura that is associated with that unit is added to the damaged unit.
Using the periodic trigger the aura checks to see if the unit already has the ability or a higher level of the ability on it, if so, it does nothing. If it has a lower level ability, it raises the level of the ability.
Expected Results:
The damaged unit should get the proper aura from the attacking unit. This aura should never be duplicated, even if two different units w/ the aura-making ability are attacking the same unit.
Actual Results:
The damaged unit gets one buff for each unit attacking him.
Any help would be appreciated and +rep'd.
I am using Romek's UAC system but it's not working any better than the Warcraft Engine, which is highly disappointing.
Summary:
There are three units, three auras, and one ability with three levels each level corresponding to one unit.
When a unit is damaged by one of the units, the aura that is associated with that unit is added to the damaged unit.
Using the periodic trigger the aura checks to see if the unit already has the ability or a higher level of the ability on it, if so, it does nothing. If it has a lower level ability, it raises the level of the ability.
Expected Results:
The damaged unit should get the proper aura from the attacking unit. This aura should never be duplicated, even if two different units w/ the aura-making ability are attacking the same unit.
Actual Results:
The damaged unit gets one buff for each unit attacking him.
JASS:
scope Bal
private struct Ballista extends UAC
integer level
effect e = AddSpecialEffectTarget("Abilities\\Spells\\Orc\\EarthQuake\\EarthQuakeTarget.mdl", .main, "origin")
method unitPeriodic takes unit u returns nothing
if GetUnitAbilityLevel(u,039;A010039;) < 1 then
call UnitAddAbility(u,039;A010039;)
call SetUnitAbilityLevel(u,039;A010039;,1)
endif
endmethod
method unitLeave takes unit u returns nothing
// Reset the unit
if GetUnitAbilityLevel(u,039;B001039;) > 0 then
call UnitRemoveAbility(u,039;A010039;)
endif
endmethod
method mainDeath takes nothing returns nothing
call DestroyEffect(.e)
endmethod
method andFilterA takes unit whichUnit returns boolean
return IsUnitType(whichUnit,UNIT_TYPE_STRUCTURE) == false and IsUnitType(whichUnit,UNIT_TYPE_PEON) == false
endmethod
method andFilterB takes unit whichUnit returns boolean
return GetUnitAbilityLevel(whichUnit,039;A02R039;) < 1
endmethod
method onDestroy takes nothing returns nothing
call DestroyEffect(.e)
endmethod
endstruct
private struct Field extends UAC
integer level
effect e = AddSpecialEffectTarget("Abilities\\Spells\\Orc\\EarthQuake\\EarthQuakeTarget.mdl", .main, "origin")
method unitPeriodic takes unit u returns nothing
if GetUnitAbilityLevel(u,039;A010039;) < 1 then
call UnitAddAbility(u,039;A010039;)
call SetUnitAbilityLevel(u,039;A010039;,2)
elseif GetUnitAbilityLevel(u,039;A010039;) == 1 then
call SetUnitAbilityLevel(u,039;A010039;,2)
endif
endmethod
method unitLeave takes unit u returns nothing
// Reset the unit
if GetUnitAbilityLevel(u,039;B00F039;) > 0 then
call UnitRemoveAbility(u,039;A010039;)
endif
endmethod
method mainDeath takes nothing returns nothing
call DestroyEffect(.e)
endmethod
method andFilterA takes unit whichUnit returns boolean
return IsUnitType(whichUnit,UNIT_TYPE_STRUCTURE) == false and IsUnitType(whichUnit,UNIT_TYPE_PEON) == false
endmethod
method andFilterB takes unit whichUnit returns boolean
return GetUnitAbilityLevel(whichUnit,039;A02R039;) < 1
endmethod
method onDestroy takes nothing returns nothing
call DestroyEffect(.e)
endmethod
endstruct
private struct Mortar extends UAC
integer level
effect e = AddSpecialEffectTarget("Abilities\\Spells\\Orc\\EarthQuake\\EarthQuakeTarget.mdl", .main, "origin")
method unitPeriodic takes unit u returns nothing
if GetUnitAbilityLevel(u,039;A010039;) < 1 then
call UnitAddAbility(u,039;A010039;)
call SetUnitAbilityLevel(u,039;A010039;,3)
elseif GetUnitAbilityLevel(u,039;A010039;) < 3 then
call SetUnitAbilityLevel(u,039;A010039;,3)
endif
endmethod
method unitLeave takes unit u returns nothing
// Reset the unit
if GetUnitAbilityLevel(u,039;B00G039;) > 0 then
call UnitRemoveAbility(u,039;A010039;)
endif
endmethod
method mainDeath takes nothing returns nothing
call DestroyEffect(.e)
endmethod
method andFilterA takes unit whichUnit returns boolean
return IsUnitType(whichUnit,UNIT_TYPE_STRUCTURE) == false and IsUnitType(whichUnit,UNIT_TYPE_PEON) == false
endmethod
method andFilterB takes unit whichUnit returns boolean
return GetUnitAbilityLevel(whichUnit,039;A02R039;) < 1
endmethod
method onDestroy takes nothing returns nothing
call DestroyEffect(.e)
endmethod
endstruct
function Cond_Bal takes nothing returns boolean
// call DisplayTextToPlayer(GetLocalPlayer(),0,0,"Testing target.")
return (GetUnitTypeId(GetAttacker()) == 039;h01C039; or GetUnitTypeId(GetAttacker()) == 039;h02J039; or GetUnitTypeId(GetAttacker()) == 039;h069039;) and IsUnitType(GetTriggerUnit(),UNIT_TYPE_STRUCTURE) == false and IsUnitType(GetTriggerUnit(),UNIT_TYPE_PEON) == false and GetUnitAbilityLevel(GetTriggerUnit(),039;A02R039;) < 1
endfunction
function Trig_Bal takes nothing returns nothing
local unit tu = GetTriggerUnit()
// Retrieve the struct (if any) attached to the unit, for this aura.
local UAC d
set d = Ballista.get(tu)
if GetUnitTypeId(GetAttacker()) == 039;h02J039; then
set d = Field.get(tu)
elseif GetUnitTypeId(GetAttacker()) == 039;h069039; then
set d = Mortar.get(tu)
endif
if d == 0 then // Non existant
// Creating it.
if GetUnitTypeId(GetAttacker()) == 039;h02J039; then
set d = Field.create(tu,400.00)
elseif GetUnitTypeId(GetAttacker()) == 039;h069039; then
set d = Mortar.create(tu,400.00)
elseif GetUnitTypeId(GetAttacker()) == 039;h01C039; then
set d = Ballista.create(tu, 400.00)
endif
// Target stuff:
set d.allies = true
set d.enemies = false
set d.neutral = true
set d.visible = true
set d.requirement = null
set d.exception = UNIT_TYPE_STRUCTURE
call PolledWait(3.00)
if GetUnitState(tu,UNIT_STATE_LIFE) > 0 then
call d.destroy()
endif
endif
endfunction
//===========================================================================
function InitTrig_Ballista_Debuff takes nothing returns nothing
set gg_trg_Ballista_Debuff = CreateTrigger()
call TriggerRegisterComputerUnitEventDK(gg_trg_Ballista_Debuff,EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(gg_trg_Ballista_Debuff,Condition(function Cond_Bal))
call TriggerAddAction(gg_trg_Ballista_Debuff,function Trig_Bal)
endfunction
endscope
Any help would be appreciated and +rep'd.