# 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``````

#### 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.
• The Helper:
Is that going to be a full game now tom?
• The Helper:
what is this Ghan? https://enterprise.ghannet.com/ you are totally holding out on us my friend
• Ghan:
Not mine, I just ran the server. They let the domain expire but it was a cool project so I kept it alive there.
• Ghan:
Used to be enterpriserpg.com I think.
• The Helper:
If you go to the world editor tutorials site and click the starcraft link it takes you there
• Ghan:
lol
• Ghan:
I forgot about that alias name. (The full URL still went to the correct site.) That should be fixed.
• Ghan:
Silkroad Forums site really needs help.
• Ghan:
Its software has been out of support since 2017.
• Ghan:
The woes of using custom styles....
• The Helper:
does anyone still use silk road forums?
• Ghan:
It's about as active as here I'd say. Not much going on.
• Wizard:
I think it doesn't help that the silk road game isn't as popular any more I think. The only MMO I play these days is FFXIV like most other people I know.
• The Helper:
I checked a status page for players and it says the game has 500 daily players.
• The Helper:
I cannot believe that site is still going I wonder if Ryoko is involved with it at all would love to talk to him again and see what he is up to
• The Helper:
my oldest daughter failed her driving test today for her license she is 22 and yes I have been driving her everywhere her whole life
• The Helper:
Now they are blaming me on Facebook for her failure LOL I am accepting it because it is my failure I am her driving teacher even though she had certified driving instruction from the best place in town I for some reason cannot teach her how to drive this is frustrating
• jonas:
I didn't get my license until I was 25
+1
• The Helper:
Back in the old days when I was getting a license people were getting them at 16 yrs old and many were getting hardships so they could get them earlier. Almost nobody did not drive when they were able. Nowadays though....
• Ghan:
Why drive when there's Uber Eats?
+2
• The Helper:
I hope Varine is OK have not heard from him in a while.
+1
• Ghan:
Diablo 2 Resurrected launching in 9 days.
• The Helper:
Just got a new to me computer hope it will run it
• jonas:
I would buy if it had better modding support than D2, like a small lua script engine or much less hardcoded stuff