jig7c
Stop reading me...-statement
- Reaction score
- 123
Hello,
I'm using emjlr3's Jump system (posted below) and my spell, (also posted below)
the problem is, when my hero jumps, 1) it kills the hero... 2) every thing on the map takes damage... even if it is on the other side of the map
can someone figure out what the problem is.. i'm pretty sure my spell is coded correctly...
jump spell template...
my spell
I'm using emjlr3's Jump system (posted below) and my spell, (also posted below)
the problem is, when my hero jumps, 1) it kills the hero... 2) every thing on the map takes damage... even if it is on the other side of the map
can someone figure out what the problem is.. i'm pretty sure my spell is coded correctly...
jump spell template...
JASS:
//***************************************************************************
//* *
//* Jumping Spell Template v3 *
//* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ **URL in the works *
//* Parabola function by Shadow1500 *
//* System by emjlr3 *
//* *
//* Requires: *
//* ¯¯¯¯¯¯¯¯¯ *
//* *
//* - A vJASS Preprocessor *
//* *
//***************************************************************************
library JST initializer InitJST
globals
// Speed at which unit's periodic movement is completed (.01-.04 recommended)
private constant real Interval = .025
// Value which represents the arc of the jump movement (1.-2.), closer to 2. for a flatter arc
private constant real Arc = 1.3
// Rawcode of the Crow Form ability in your map. This need only be changed if you have edited this ability
// in which case, create a new, unedited copy and use it here
private constant integer CrowForm = 039;Amrf039;
// Rawcode of peasant unit in your map. This need only be changed if you have edited this unit
// in which case, create a new, unedited copy and ise it here
private constant integer Peasant = 039;n001039;
endglobals
//=====No touching past this point=====\\
globals
private real Game_MaxX
private real Game_MinX
private real Game_MaxY
private real Game_MinY
private constant real Runs = 1./Interval
private constant integer HalfRuns = R2I(Runs/2.)
private location L
private sound S = CreateSoundFromLabel( "InterfaceError",false,false,false,10,10)
endglobals
private function Parabola takes real dist, real maxdist returns real
local real t = (dist*2)/maxdist-1
return (-t*t+1)*(maxdist/Arc)
endfunction
private function InitJST takes nothing returns nothing
set Game_MaxX = GetRectMaxX(bj_mapInitialPlayableArea)-50.
set Game_MinX = GetRectMinX(bj_mapInitialPlayableArea)+50.
set Game_MaxY = GetRectMaxY(bj_mapInitialPlayableArea)-50.
set Game_MinY = GetRectMinY(bj_mapInitialPlayableArea)+50.
endfunction
public function CheckLocPathing takes location l returns boolean
local unit u = CreateUnitAtLoc( Player(13), Peasant, l, 0. )
local real x = GetUnitX(u) - GetLocationX(l)
local real y = GetUnitY(u) - GetLocationY(l)
local boolean b = false
if x < 1. and x > -1. and y < 1. and y > -1. then
set b = true
endif
call ShowUnit(u,false)
call KillUnit(u)
call RemoveLocation(l)
set u = null
return b
endfunction
private function SafeX takes real x returns real
if x<Game_MinX then
return Game_MinX
endif
if x>Game_MaxX then
return Game_MaxX
endif
return x
endfunction
private function SafeY takes real y returns real
if y<Game_MinY then
return Game_MinY
endif
if y>Game_MaxY then
return Game_MaxY
endif
return y
endfunction
private struct dat
unit u
real area
real damage
real maxdist
real movedist
real cos
real sin
real diff
real start_z
string sfx
integer i = 0
endstruct
globals
private timer T = CreateTimer()
private dat array D
private integer Total = 0
endglobals
//Spell:
private function Filt takes nothing returns boolean
return IsUnitEnemy(GetFilterUnit(),bj_groupEnumOwningPlayer) and IsUnitType(GetFilterUnit(),UNIT_TYPE_FLYING)!=true
endfunction
private function Damage takes unit u, real dam, real x, real y, real area returns nothing
local group g = CreateGroup()
local unit v
set bj_groupEnumOwningPlayer = GetOwningPlayer(u)
call GroupEnumUnitsInRange(g, x, y, area, Condition(function Filt))
loop
set v = FirstOfGroup(g)
exitwhen v == null
call GroupRemoveUnit(g,v)
call UnitDamageTarget(u,v,dam,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,null)
endloop
call DestroyGroup(g)
set g = null
endfunction
private function Movement takes nothing returns nothing
local dat d
local integer i = 1
local real dist
local real height
local real x
local real y
loop
exitwhen i>Total
set d = D<i>
set d.i = d.i + 1
set dist = d.i*d.movedist
set L = GetUnitLoc(d.u)
set height = GetLocationZ(L)
if height<d.start_z then
set height = (d.start_z-height)+Parabola(dist,d.maxdist)
elseif height>d.start_z then
if d.start_z+Parabola(dist,d.maxdist)<=height then
set height = 0.
else
set height = Parabola(dist,d.maxdist)-(height-d.start_z)
endif
else
set height = Parabola(dist,d.maxdist)
endif
call RemoveLocation(L)
call SetUnitX(d.u,SafeX(GetUnitX(d.u)+d.movedist*d.cos))
call SetUnitY(d.u,SafeY(GetUnitY(d.u)+d.movedist*d.sin))
call SetUnitFlyHeight(d.u,height,0.)
debug call DisplayTextToPlayer(Player(0),0.,0.,"ZLoc = "+R2S(GetLocationZ(GetUnitLoc(d.u)))+" : FlyHeight = "+R2S(GetUnitFlyHeight(d.u)))
if d.i == HalfRuns then
call SetUnitTimeScale(d.u, 1.)
elseif height<=1. then
call PauseUnit( d.u,false )
call SetUnitPathing( d.u, true )
call SetUnitFlyHeight(d.u,GetUnitDefaultFlyHeight(d.u),0.)
set x = GetUnitX(d.u) + d.diff * d.cos
set y = GetUnitY(d.u) + d.diff * d.sin
call DestroyEffect(AddSpecialEffect(d.sfx, x,y))
call Damage(d.u, d.area, x, y, d.damage)
call d.destroy()
set D<i> = D[Total]
set Total = Total - 1
set i = i - 1
if Total==0 then
call PauseTimer(T)
endif
endif
set i = i + 1
endloop
endfunction
//===========================================================================
public function Cast takes unit u, real damage, real area, real diff, string anim, string sfx returns boolean
local dat d
local real ux
local real uy
local location l
local real ang
local real x
local real y
if u==null or damage<0. or area<0. then
if GetLocalPlayer()==GetOwningPlayer(u) then
call ClearTextMessages()
call BJDebugMsg("|c00FF0000JST Error: Invalid inputs in function Cast.")
call StartSound(S)
endif
return false
endif
set d = dat.create()
set ux = GetUnitX(u)
set uy = GetUnitY(u)
set l = GetSpellTargetLoc()
set ang = Atan2((GetLocationY(l)-uy),(GetLocationX(l)-ux))
set x = GetLocationX(l) - diff * Cos(ang)
set y = GetLocationY(l) - diff * Sin(ang)
set d.u = u
set d.damage = damage
set d.area = area
set d.sfx = sfx
set d.maxdist = SquareRoot((ux-x)*(ux-x) + (uy-y)*(uy-y))
set d.cos = Cos(ang)
set d.sin = Sin(ang)
set d.movedist = d.maxdist/Runs
set d.diff = diff
set L = GetUnitLoc(d.u)
set d.start_z = GetLocationZ(L)
call RemoveLocation(L)
call PauseUnit( u,true )
call SetUnitPathing( u, false )
call UnitAddAbility( u,CrowForm )
call UnitRemoveAbility( u,CrowForm )
call SetUnitAnimation(u, anim)
call SetUnitTimeScale(u, .30)
set Total = Total + 1
if Total == 1 then
call TimerStart(T,Interval,true,function Movement)
endif
set D[Total] = d
call RemoveLocation(l)
set l = null
return true
endfunction
function CastWrap takes unit u, location loc, real damage, real area, string anim, string sfx returns boolean
local dat d
local real ux
local real uy
local location l
local real ang
local real x
local real y
local real diff = 30.
if u==null or damage<0. or area<0. then
if GetLocalPlayer()==GetOwningPlayer(u) then
call ClearTextMessages()
call BJDebugMsg("|c00FF0000JST Error: Invalid inputs in function Cast.")
call StartSound(S)
endif
return false
endif
set d = dat.create()
set ux = GetUnitX(u)
set uy = GetUnitY(u)
set l = loc
set ang = Atan2((GetLocationY(l)-uy),(GetLocationX(l)-ux))
set x = GetLocationX(l) - diff * Cos(ang)
set y = GetLocationY(l) - diff * Sin(ang)
set d.u = u
set d.damage = damage
set d.area = area
set d.sfx = sfx
set d.maxdist = SquareRoot((ux-x)*(ux-x) + (uy-y)*(uy-y))
set d.cos = Cos(ang)
set d.sin = Sin(ang)
set d.movedist = d.maxdist/Runs
set d.diff = diff
set L = GetUnitLoc(d.u)
set d.start_z = GetLocationZ(L)
call RemoveLocation(L)
call PauseUnit( u,true )
call SetUnitPathing( u, false )
call UnitAddAbility( u,CrowForm )
call UnitRemoveAbility( u,CrowForm )
call SetUnitAnimation(u, anim)
call SetUnitTimeScale(u, .30)
set Total = Total + 1
if Total == 1 then
call TimerStart(T,Interval,true,function Movement)
endif
set D[Total] = d
call RemoveLocation(l)
set l = null
return true
endfunction
endlibrary</i></i>
my spell
JASS:
scope Jump initializer Init
private function Conditions takes nothing returns boolean
return ( GetSpellAbilityId() == 039;A007039; )
endfunction
private function Distance takes location locA, location locB returns real
local real dx = GetLocationX(locB) - GetLocationX(locA)
local real dy = GetLocationY(locB) - GetLocationY(locA)
return SquareRoot(dx * dx + dy * dy)
endfunction
private function Actions takes nothing returns nothing
local unit u = GetTriggerUnit()
local location l = GetUnitLoc(u)
local location k = GetSpellTargetLoc()
local real dmg
local string s
local real d
call SetUnitInvulnerable ( u, true )
set d = Distance(l, k)
set dmg = ( d * I2R(GetUnitLevel(u)) )
call CastWrap( u, k, dmg, 200.00, "slam", "Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl" )
call SetUnitInvulnerable (u, false)
call TriggerSleepAction( 2 )
set s = R2S(dmg)
call CreateTextTagCrit (s, l)
call RemoveLocation(l)
call RemoveLocation(k)
set s = null
set u = null
endfunction
//===========================================================================
private function Init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( t, Condition( function Conditions ) )
call TriggerAddAction( t, function Actions )
endfunction
endscope