Tom_Kazansky
--- wraith it ! ---
- Reaction score
- 157
JASS:
interface CustomProjectileInfc
method CheckReflect takes nothing returns boolean defaults false
method onProjectileHit takes nothing returns nothing defaults nothing
endinterface
struct CustomProjectile extends CustomProjectileInfc
//..... other struct members
string nameFunc = ""
boolean malfunc = false
boolean p_evaded = false
integer indexOfProjectile
static method EvadeProjectiles takes unit u returns nothing
local integer inx = GetUnitId(u)
local integer i = 1
local thistype this
loop
exitwhen i > UnitData[inx].projectilesCount
set this = UnitData[inx].data[StringHash("ProjectileNumber"+I2S(i))]
set .p_evaded = true
set .malfunc = true
call BJDebugMsg(.nameFunc)
call UnitData[inx].data.flush(StringHash("ProjectileNumber"+I2S(i)))
set i = i + 1
endloop
set UnitData[inx].projectilesCount = 0
endmethod
private method IncomingProjectileRegister takes nothing returns nothing
local integer inx=GetUnitId(.target)
set UnitData[inx].projectilesCount = UnitData[inx].projectilesCount+1
set .indexOfProjectile=UnitData[inx].projectilesCount
set UnitData[inx].data[StringHash("ProjectileNumber"+I2S(UnitData[inx].projectilesCount))]=this
endmethod
private method IncomingProjectileUnRegister takes nothing returns nothing
local integer inx=GetUnitId(.target)
local thistype d = UnitData[inx].data[StringHash("ProjectileNumber"+I2S(UnitData[inx].projectilesCount))]
set d.indexOfProjectile=.indexOfProjectile
set UnitData[inx].data[StringHash("ProjectileNumber"+I2S(.indexOfProjectile))]=UnitData[inx].data[StringHash("ProjectileNumber"+I2S(UnitData[inx].projectilesCount))]
call UnitData[inx].data.flush(StringHash("ProjectileNumber"+I2S(UnitData[inx].projectilesCount)))
set UnitData[inx].projectilesCount=UnitData[inx].projectilesCount-1
endmethod
// other methods....
endstruct
struct StormBolt extends CustomProjectile
unit c
unit a
real dmg
real stun
boolean canblock=true
boolean canreflect=true
method CheckReflect takes nothing returns boolean
local boolean ok = false
if .canreflect and CanUnitReflectSpell(.c,.a,0) then
set ok = true
set TEMPUNIT = .c
set .c = .a
set .a = TEMPUNIT
set .canreflect=false
endif
return ok
endmethod
method onProjectileHit takes nothing returns nothing
if .canblock and CanUnitResistSpell(.c,.a,0) then
return
endif
call UnitDamageUnit(.c,.a,.dmg,4,false,true)
call UnitBuff.Add( .c, .a, tj_BuffId_Stun, 1, "" , .stun )
endmethod
static method Cast takes unit c, unit a, integer lvl returns nothing
local integer inx1 = GetUnitId(c)
local integer inx2 = GetUnitId(a)
local thistype this
if IsSpellMissed(c,a,0,0,0) then
call .UnitToPoint( c, GetUnitX(a), GetUnitY(a), "Abilities\\Spells\\Human\\StormBolt\\StormBoltMissile.mdx", 0., 1000.,UnitData[inx1].unitConst.scale, 160 )
return
endif
set this = StormBolt.create()
set .c = c
set .a = a
set .dmg = 50 * lvl + (0.75+0.25*lvl) * GetHeroAttribute(inx1,0)
set .stun = 2.
set .nameFunc = "Storm Bolt"
call .UnitToUnitEx( c, a, "Abilities\\Spells\\Human\\StormBolt\\StormBoltMissile.mdx", "", 0., 1000. ,UnitData[inx1].unitConst.scale, 160 )
endmethod
endstruct
UnitData[inx].data is a Table (Vex's)
so, the thing is: I have the CustomProjectile struct, and some of my spell and even Attack have structs that extend it.
the IncomingProjectileRegister and IncomingProjectileUnRegister functions "save" the projectile's data to unit's table for later use, like EvadeProjectiles function
when a unit uses teleport or other projectile-evading skills, the EvadeProjectiles is called, even though the debug displayed the right .nameFunc ( "Storm Bolt" the spell Storm Bolt - see the Storm Bolt struct above - and "Attack" for attack's projectile) I still feel uneasy... :banghead:
I wonder if it's ok to call EvadeProjectiles like that, because, you know, the projectile's data type could be different (Storm Bolt projectile, Attack projectile,...) and I use
JASS:
local thistype this
p.s: my first time using interface