Discussion Possible Chain System..

13lade619

is now a game developer :)
Reaction score
399
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.
*Add duration to existing chain.
*Destroy existing chain.

Planned Framework:

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

Linked List
> for the chain of units
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
I made this for BlackRose, but it is the time to post it up. :D
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 = "modelPath"
//|  
//+--------------------------------------------------------------+
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 <= 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 <= 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 > 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 < 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


coolxz.jpg
 

Chaos_Knight

New Member
Reaction score
39
@Blade

I think that a great idea. Maybe add a function, that makes it possible to bind a unit to a point.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top