# DiscussionPossible Chain System..

##### is now a game developer :)
I was thinking of coding a chain system, like in the popular spell Meat Hook where you have a chain of units.

Planned functions:

Basic 'Meat Hook' type.
Chain 2 units together.
Chain 2 points together.
Chain Unit to point, or Chain point to unit.
*Destroy existing chain.

Planned Framework:

Hashtable
> stores SourceUnit and TargetUnit as keys.
> on Point chains, the target unit is an invisible dummy.

> for the chain of units

#### kingkingyyk3

##### Visitor (Welcome to the Jungle, Baby!)
I made this for BlackRose, but it is the time to post it up. JASS:
``````//+-------------------------------------------------------------+
//|                                           v1.02             |
//|    CHAIN by Kingkingyk3                                     |
//|                                                             |
//+-------------------------------------------------------------+
//|
//|   local Chain d = Chain.create()
//|   call d.AddChainEx( x1, y1, z1, x2, y2, z2, chainDist )
//|   call d.MoveChainEx( x1, y1, z1, x2, y2, z2, chainDist )
//|   call d.terminate()
//|
//|   set d.modelPath = &quot;modelPath&quot;
//|
//+--------------------------------------------------------------+
library Chain requires xefx

// x
// d - distance
// h - z1
// m - z2

struct Chain
xefx fx
private thistype prev
private thistype next
private integer count
string path
real scale
real gapSize

static method create takes nothing returns thistype
local thistype this = .allocate()
set this.prev = this
set this.next = this
return this
endmethod

method AddChainEx takes real x1, real y1, real z1, real x2, real y2, real z2, real gapSize returns nothing
local real dx = x2 - x1
local real dy = y2 - y1
local real angle
local real dist
local integer tick
local thistype new
local real range
local real x
local real y
local real height
local real heighti

if dx+dy == 0. or gapSize &lt;= 0. then
return
endif

set angle = Atan2(dy,dx)
set dist = SquareRoot(dx * dx + dy * dy)
set tick = R2I(dist / gapSize)
if tick == 0 then
return
endif
set height = z2
set heighti = (z2 - z1) / tick

set .count = tick

loop
exitwhen tick == 0
set new = thistype.create()

set this.prev.next = new
set new.prev = this.prev
set new.next = this
set this.prev = new

set .gapSize = gapSize

set range = gapSize * tick
set x = x1 + range * Cos(angle)
set y = y1 + range * Sin(angle)
set height = height - heighti

set new.fx = xefx.create(x,y,angle)
set new.fx.fxpath = .path
set new.fx.scale  = .scale
set new.fx.z = height

set tick = tick - 1
endloop
endmethod

method MoveChainEx takes real x1, real y1, real z1, real x2, real y2, real z2 returns nothing
local real dx = x2 - x1
local real dy = y2 - y1
local real angle
local real dist
local integer tick
local thistype origin = this
local real range
local real x
local real y
local integer extend
local thistype new
local real height
local real heighti

if dx+dy == 0. or gapSize &lt;= 0. then
return
endif

set angle = Atan2(dy,dx)
set dist = SquareRoot(dx * dx + dy * dy)
set tick = R2I(dist / gapSize)
if tick == 0 then
return
endif
set height = z2
set heighti = (z2 - z1) / tick

loop
set this = this.next
exitwhen this == origin
set tick = tick - 1
set range = origin.gapSize * tick

set x = x1 + range * Cos(angle)
set y = y1 + range * Sin(angle)
set height = height - heighti

set .fx.x = x
set .fx.y = y
set .fx.xyangle = angle
set .fx.z = height
set .fx.zangle = Atan2( z2-z1, dist )

endloop

if tick &gt; 0 then
loop
exitwhen tick == 0
set new = thistype.create()

set this.prev.next = new
set new.prev = this.prev
set new.next = this
set this.prev = new

set range = origin.gapSize * tick
set x = x1 + range * Cos(angle)
set y = y1 + range * Sin(angle)
set height = height - heighti

set new.fx = xefx.create(x,y,angle)
set new.fx.fxpath = .path
set new.fx.z = height

set tick = tick - 1
set .count = .count + 1
endloop
elseif tick &lt; 0 then
set tick = -tick
set this = origin
loop
set this = this.prev
exitwhen tick == 0
set this.next.prev = this.prev
set this.prev.next = this.next
call .fx.hiddenDestroy()
call .deallocate()
set origin.count = origin.count - 1
set tick = tick - 1
endloop
endif
endmethod

method terminate takes nothing returns nothing
local thistype origin = this
loop
set this = this.next
exitwhen this == origin
call .fx.destroy()
call .deallocate()
endloop
call .deallocate()
endmethod

method operator modelPath= takes string s returns nothing
local thistype origin = this
loop
set this = this.next
exitwhen this == origin
set .fx.fxpath = s
endloop
set .path = s
endmethod

method operator modelScale= takes real newScale returns nothing
local thistype origin = this
loop
set this = this.next
exitwhen this == origin
set this.fx.scale = newScale
endloop
set this.scale = newScale
endmethod
endstruct

endlibrary`````` • 1 person

#### Chaos_Knight

##### New Member

I think that a great idea. Maybe add a function, that makes it possible to bind a unit to a point.

#### BlackRose

##### Forum User

I think that a great idea. Maybe add a function, that makes it possible to bind a unit to a point.
Chain 2 units together.
Chain 2 points together.
Chain Unit to point, or Chain point to unit.
x

#### Chaos_Knight

##### New Member
._. Missed that.. General chit-chat
Help Users
• No one is chatting at the moment.