Renendaru
(Evol)ution is nothing without love.
- Reaction score
- 309
Just use a dummy ability like slow or rejuvenation to simulate the buff... I had to do that for my Corpse system.
library ExpireBuff initializer Init requires KT, DummyCaster
globals
private constant integer BUFF_ABILITY = 039;A009039;
private constant string ORDER_STRING = "channel"
endglobals
struct Expire
integer buffid
unit target
// unit source
// real damage
private static method remove takes nothing returns boolean
local Expire e = KT_GetData()
call UnitRemoveAbility(e.target, e.buffid)
return true
endmethod
static method create takes integer buffid, integer level, real duration, unit target returns Expire
local Expire this = Expire.allocate()
set .buffid = buffid
set .target = target
// if GetUnitAbilityLevel(DUMMY, abilid) <= 0 then
// call UnitAddAbility(DUMMY, .abilid)
// call SetUnitAbilityLevel(.target, BUFF_ABILITY, level)
// else
// call SetUnitAbilityLevel(.target, .abilid, level)
// endif
call SetUnitAbilityLevel(DUMMY,BUFF_ABILITY, level)
call SetUnitX(DUMMY, GetUnitX(.target))
call SetUnitX(DUMMY, GetUnitX(.target))
call SetUnitOwner(DUMMY, DUMMY_OWNER, false)
call SetUnitOwner(DUMMY, GetOwningPlayer(target), false)
call IssueTargetOrder(DUMMY, ORDER_STRING, .target)
call KT_Add(function Expire.remove, this, duration)
return this
endmethod
endstruct
function AddExpiringBuff takes integer abilid, integer level, real duration, unit target returns boolean
local Expire e
local boolean b = false
if target != null and abilid != 0 and level != 0 then
set e = Expire.create(abilid, level, duration, target)
set b = true
elseif target == null then
debug call BJDebugMsg(" You must target a valid widget! ")
elseif abilid == 0 then
debug call BJDebugMsg(" You must specify a valid ability ID! ")
elseif level == 0 then
debug call BJDebugMsg(" You must Specify a valid spell-level! ")
endif
return b
endfunction
private function Init takes nothing returns nothing
call UnitAddAbility(DUMMY, BUFF_ABILITY)
endfunction
endlibrary
Ok, well since this is a system, I just want to make it as easy as possible for then user, so I'm wondering if there's any way of simply just specify the buff, and not an ability with the buff in it, and you can still add it to a unit ? :S
Like, somehow in-game add a buff to be applied by an ability ? :S
EDIT: Ok, so I made a custom ability "Buff Addon", and I simply wanna know:
Is it possible to somehow get the ID of the buff a specific spell uses on a specific level ?
Like, I made that spell and it has mutliple levels, and to make it easier to use it, I want people to simply specify the buffID of the buff they want to apply, and (Since the spell has multiple levels) it sets the spell to the level which contains that buff, and then casts it one the unit
(It would be really cool if this was possible, but I highly doubt it, unfortunately...)
And, I might as well ask this question...
Is it somehow possible to be able to do the whole concept of my first question, but in another way ?
I think there's a way with some vague SLK thing in vJass...
In other words, no.
library ExpireBuff initializer Init requires KT, DummyCaster
globals
private integer array Id
private integer Index
private constant integer BUFF_ABILITY = 039;BUFF039;
private constant string ORDER_STRING = "channel"
endglobals
struct Expire
integer buffid
unit target
// unit source
// real damage
private static method remove takes nothing returns boolean
local thistype this = KT_GetData()
call UnitRemoveAbility( this.target, this.buffid )
return true
endmethod
static method create takes integer buffid, integer level, real duration, unit target returns Expire
local thistype this = thistype.allocate()
set .buffid = buffid
set .target = target
// if GetUnitAbilityLevel(DUMMY, abilid) <= 0 then
// call UnitAddAbility(DUMMY, .abilid)
// call SetUnitAbilityLevel(.target, BUFF_ABILITY, level)
// else
// call SetUnitAbilityLevel(.target, .abilid, level)
// endif
call SetUnitAbilityLevel(DUMMY,BUFF_ABILITY, level)
call SetUnitX(DUMMY, GetUnitX(.target))
call SetUnitX(DUMMY, GetUnitX(.target))
call IssueTargetOrder(DUMMY, ORDER_STRING, .target)
call KT_Add(function thistype.remove, this, duration)
return this
endmethod
endstruct
function AddExpiringBuff takes integer abilid, integer level, real duration, unit target returns nothing
call Expire.create(abilid, level, duration, target)
endfunction
private function Init takes nothing returns nothing
local unit u = CreateUnit(Player(15), DUMMY_TYPE, 0., 0., 0.)
local integer i = 1
call UnitAddAbility(DUMMY, BUFF_ABILITY)
loop
call SetUnitAbilityLevel(DUMMY, BUFF_ABILITY, i)
if GetUnitAbilityLevel(DUMMY, BUFF_ABILITY) == i then
call IssueTargetOrder(DUMMY, ORDER_STRING, u)
//set Id<i> =
else
return
endif
set i = i + 1
endloop
endfunction
endlibrary</i>