Rllulium
New Member
- Reaction score
- 10
I've been coding away trying to improve most of the JASS that I have written in my map, but I feel like I have some to a point where I the code I am writing almost has gotten out of hand; that I do not fully hold a grasp of how to improve it further. So, I figured I'd stop by my favorite helpdesk and ask for some pointers on the latest iteration of my everchanging Projectile library:
And No, we don't celebrate on Christmas Day in Sweden.
JASS:
//=============================================================================================================================
// Projectile Struct
//
// local projectile StructName = projectile.create()
// set StructName.variable = value
// call StructName.go()
//
// For Usage in "impact" function:
// PJ_last.variable
//=============================================================================================================================
library PJ uses Damage, ParabolicMovement, T32, Angle
globals
public projectile last
endglobals
struct projectile
unit caster = GetSpellAbilityUnit() //Owner of dummy
unit target //The unit struck by the projectile. Do not touch!
unit proj //Dummy
integer projId //Dummy Id
real speed = 1000 //Units traveled per second
real range = 600 //Max range
real dist = 0 //Do not touch!
real angle = .pointAngle() //Traveling angle
real radius = 100 //HitBox
real finalRadius = 100 //NYI
real height = 50 //Initial height or dummy
real maxHeight = 50 //Max height. If not defined, this will be set to .height automaticlly
boolean pierce = false //Line missile or not
boolean end = false //Do not touch!
group struck = CreateGroup() //Do not touch!
string impact //Fires on impact.
method targetCheck takes unit target returns boolean //TO DO: Add "Allowed Targets" functionality
return IsUnitEnemy(target,GetOwningPlayer(.caster)) == true and GetUnitState(target,UNIT_STATE_LIFE) > 0
endmethod
static method getTargets takes nothing returns boolean
if last.targetCheck(GetFilterUnit()) then
if IsUnitInGroup(GetFilterUnit(),last.struck) == false then
set last.target = GetFilterUnit()
call ExecuteFunc(last.impact)
call GroupAddUnit(last.struck,GetFilterUnit())
endif
if last.pierce == false then
set last.end = true
endif
endif
return false
endmethod
method move takes nothing returns nothing
call SetUnitX(.proj,GetUnitX(.proj)+.speed*Sin(.angle))
call SetUnitY(.proj,GetUnitY(.proj)+.speed*Cos(.angle))
if .maxHeight != 0 then
call SetUnitFlyHeight(.proj,.height+ParabolaZ(.maxHeight,.range,.dist),0)
endif
set .dist = .dist + .speed
endmethod
private method periodic takes nothing returns nothing
set last = this
call GroupEnumUnitsInRange(FilterGroup,GetUnitX(.proj),GetUnitY(.proj),.radius,Filter(function projectile.getTargets))
if .dist >= .range or .end then
call KillUnit(.proj)
call GroupRemoveGroup(.struck,.struck)
call .stopPeriodic()
call .destroy()
else
call .move()
endif
endmethod
method go takes nothing returns nothing
if .maxHeight == 50 then
set .maxHeight = .height
endif
set maxHeight = .maxHeight - .height
set .speed = .speed /32.00
set .proj = CreateUnit(GetOwningPlayer(.caster),.projId,GetUnitX(.caster),GetUnitY(.caster),.angle)
call SetUnitFlyHeight(.proj,.height,0)
call .startPeriodic()
endmethod
implement T32x
implement angleMethods
endstruct
endlibrary
And No, we don't celebrate on Christmas Day in Sweden.