LearningCode
New Member
- Reaction score
- 24
Yea, there's this spell where the hero creates a projectile and fires it forward.
Kinda' like shockwave, just that it deals damage based on how much "Rage" the caster has.
So, I made it in JASS.
The problem is that the spell frequently travels in the wrong direction or spawn wrongly (Instead of spawning at the caster, the dummy spawns at the caster with a polar offset, which is random, too).
I've tried to alleviate the spawning wrongly by pausing the caster -Failed-
Meh, here's the code, it's killing me to figure this out -___-
Kinda' like shockwave, just that it deals damage based on how much "Rage" the caster has.
So, I made it in JASS.
The problem is that the spell frequently travels in the wrong direction or spawn wrongly (Instead of spawning at the caster, the dummy spawns at the caster with a polar offset, which is random, too).
I've tried to alleviate the spawning wrongly by pausing the caster -Failed-
Meh, here's the code, it's killing me to figure this out -___-
JASS:
scope CFCast initializer CFInit
globals
private constant integer CFraw = 039;A02B039;
private constant integer Rageraw = 039;A02C039;
private constant integer Dummy = 039;h00A039;
private constant integer tickAmount = 20
group Fordamage = CreateGroup()
endglobals
private struct CF
private static CF data = 0
private static CF data2 = 0
unit caster
real casterMAXHP
real casterHP
real casterX
real casterY
integer casterSTR
integer CFLevel
integer RageLevel
unit dummy
real dummyX
real dummyY
integer ticks = 0
real radian
real distance
real damage
group injured = CreateGroup()
static method CFDamage takes nothing returns boolean
local CF cf = CF.data2
local unit u = GetFilterUnit()
local sound s = gg_snd_CF
local location l = GetUnitLoc(u)
if IsUnitEnemy(u, GetOwningPlayer(cf.caster)) == true and IsUnitInGroup(u, cf.injured) == false then
call PlaySoundAtPointBJ(s, 100.00, l, GetUnitFlyHeight(u))
call DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThiefBlood.mdl", u, "chest"))
call UnitDamageTarget(cf.caster, u, cf.damage, false, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_MIND, null)
call GroupAddUnit(cf.injured, u)
endif
set u = null
set s = null
call RemoveLocation(l)
set l = null
return false
endmethod
private method periodic takes nothing returns nothing
local CF cf = CF.data
if cf.ticks < tickAmount then
set cf.dummyX = cf.casterX + (cf.ticks * cf.distance) * Cos(cf.radian)
set cf.dummyY = cf.casterY + (cf.ticks * cf.distance) * Sin(cf.radian)
call SetUnitX(cf.dummy, cf.dummyX)
call SetUnitY(cf.dummy, cf.dummyY)
set cf.ticks = cf.ticks + 1
set CF.data2 = cf
call GroupEnumUnitsInRange(Fordamage, cf.dummyX, cf.dummyY, 200.00, function CF.CFDamage)
else
call PauseUnit(cf.caster, false)
call cf.stopPeriodic()
call cf.destroy()
endif
endmethod
implement T32x
static method CFEffect takes nothing returns nothing
local CF cf = CF.create()
local real X = GetSpellTargetX()
local real Y = GetSpellTargetY()
set cf.caster = GetTriggerUnit()
call PauseUnit(cf.caster, true)
set cf.casterMAXHP = GetUnitState(cf.caster, UNIT_STATE_MAX_LIFE)
set cf.casterHP = GetUnitState(cf.caster, UNIT_STATE_LIFE)
set cf.casterMAXHP = cf.casterMAXHP / 20
set cf.casterHP = cf.casterHP - cf.casterMAXHP
call SetUnitState(cf.caster, UNIT_STATE_LIFE, cf.casterHP)
set cf.CFLevel = GetUnitAbilityLevel(cf.caster, CFraw)
set cf.RageLevel = GetUnitAbilityLevel(cf.caster, Rageraw)
set cf.casterSTR = GetHeroStr(cf.caster, true)
if ModuloInteger(cf.CFLevel, 2) == 0 then
set cf.damage = ((cf.CFLevel * 10) + (cf.casterSTR * (cf.CFLevel * 0.25))) * (cf.RageLevel * 0.1)
else
set cf.damage = ((cf.CFLevel * 10) + (cf.casterSTR * ((cf.CFLevel + 1) * 0.25))) * (cf.RageLevel * 0.1)
endif
set cf.radian = Atan2(Y - cf.casterY, X - cf.casterX)
set cf.distance = 500 / tickAmount
set cf.casterX = GetUnitX(cf.caster)
set cf.casterY = GetUnitY(cf.caster)
set cf.dummyX = GetUnitX(cf.caster)
set cf.dummyY = GetUnitY(cf.caster)
set cf.dummy = CreateUnit(GetOwningPlayer(cf.caster), Dummy, cf.dummyX, cf.dummyY, cf.radian)
set CF.data = cf
call cf.startPeriodic()
endmethod
method onDestroy takes nothing returns nothing
set .caster = null
call KillUnit(.dummy)
call RemoveUnit(.dummy)
set .dummy = null
call GroupClear(.injured)
call DestroyGroup(.injured)
set .injured = null
set .ticks = 0
set .radian = 0
endmethod
endstruct
private function CFCond takes nothing returns boolean
return GetSpellAbilityId() == CFraw
endfunction
private function CFInit takes nothing returns nothing
local trigger t = CreateTrigger()
local integer i = 0
loop
exitwhen i == 7
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
set i = i+1
endloop
call TriggerAddCondition(t, Condition(function CFCond))
call TriggerAddAction(t, function CF.CFEffect)
endfunction
endscope