- Joined
- Aug 7, 2004
- Messages
- 875
Alright, I can't seem to pickup the limitations of a struct nor its behavior, its just weird.
I created this simple wire system from point a to b, my intentions was to create a tripwire spell.
The creation of the struct works fine, however, what doesn't is the initiation of a trip event. Whenever a unit trips a wire, it always output the x,y coordinates of the last created wire...
Can someone help me with this?
If you want to test this out yourself, you can just use a Footman to do the job then cast defend skill.
I created this simple wire system from point a to b, my intentions was to create a tripwire spell.
JASS:
library Wire initializer init
globals
constant real WIRE_GAP = 30.0
constant string WIRE_FX = "LEAS"
private real bj_lastX
private real bj_lastY
private wire bj_lastCreatedWire
private wire array bj_wireDump
private integer bj_wireIndex = 0
private constant integer bj_MAXINSTANCE = 8190
private hashtable WIRE_HASH = InitHashtable()
endglobals
struct wire
real array x[bj_MAXINSTANCE]
real array y[bj_MAXINSTANCE]
rect array r[bj_MAXINSTANCE]
real length
trigger t
lightning e
method GetTrigger takes nothing returns trigger
return .t
endmethod
method GetX takes integer i returns real
return .x[i]
endmethod
method GetY takes integer i returns real
return .y[i]
endmethod
method GetLength takes nothing returns real
return .length
endmethod
method GetE takes nothing returns lightning
return .e
endmethod
static method create takes real l, real startx, real starty, real endx, real endy, real z1, real z2, string fx returns wire
local wire w = wire.allocate()
local integer i = 0
local real a = bj_RADTODEG * Atan2(endy - starty, endx - startx)
local real ax = startx
local real ay = starty
set w.t = CreateTrigger()
set w.length = l
call BJDebugMsg(R2S(w.length))
loop
exitwhen i == R2I(w.length/WIRE_GAP)
set w.x[i] = ax
set w.y[i] = ay
call PingMinimap(ax,ay,2.)
set w.r[i] = Rect(ax-WIRE_GAP,ay-WIRE_GAP,ax+WIRE_GAP,ay+WIRE_GAP)
call TriggerRegisterEnterRectSimple(w.t,w.r[i])
set ax = ax + WIRE_GAP * Cos(a * bj_DEGTORAD)
set ay = ay + WIRE_GAP * Sin(a * bj_DEGTORAD)
set i = i + 1
endloop
set w.e = AddLightningEx(fx,true,startx,starty,z1,endx,endy,z2)
return w
endmethod
method onDestroy takes nothing returns nothing
call DestroyTrigger(.t)
call DestroyLightning(.e)
endmethod
endstruct
private function explode takes nothing returns nothing
local integer i = 0
local integer index = LoadInteger(WIRE_HASH,GetHandleId(GetTriggeringTrigger()),StringHash("wireindex"))
local real x
local real y
loop
exitwhen i == R2I(bj_wireDump[index].GetLength()/WIRE_GAP)
set x = bj_wireDump[index].GetX(i)
set y = bj_wireDump[index].GetY(i)
call PingMinimap(x,y,2.)
set i = i + 1
endloop
call bj_wireDump[index].destroy()
call BJDebugMsg(I2S(index))
endfunction
private function condition takes nothing returns boolean
local wire w
local unit a = GetTriggerUnit()
if bj_wireIndex < bj_MAXINSTANCE then
if GetIssuedOrderId() == OrderId("defend") then
set bj_lastX = GetUnitX(a)
set bj_lastY = GetUnitY(a)
endif
if GetIssuedOrderId() == OrderId("undefend") then
set w = wire.create(SquareRoot((GetUnitX(a)-bj_lastX) * (GetUnitX(a)-bj_lastX) + (GetUnitY(a)-bj_lastY) * (GetUnitY(a)-bj_lastY)),bj_lastX,bj_lastY,GetUnitX(a),GetUnitY(a),10.,10.,WIRE_FX)
set bj_lastCreatedWire = w
set bj_wireDump[bj_wireIndex] = w
set bj_wireIndex = bj_wireIndex + 1
call TriggerAddAction(w.GetTrigger(),function explode)
call SaveInteger(WIRE_HASH,GetHandleId(w.GetTrigger()),StringHash("wireindex"),bj_wireIndex)
call BJDebugMsg(I2S(bj_wireIndex))
endif
endif
return true
endfunction
private function init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_ISSUED_ORDER )
call TriggerAddCondition(t,Condition(function condition))
set t = null
endfunction
endlibrary
The creation of the struct works fine, however, what doesn't is the initiation of a trip event. Whenever a unit trips a wire, it always output the x,y coordinates of the last created wire...
Can someone help me with this?

If you want to test this out yourself, you can just use a Footman to do the job then cast defend skill.