Ok, I just changed what you said, and that didn't do anything actually...
But anyways, thanks

:S
And, just to clarify what I'm actually doing, I'm making 4-in-a-row.
So I want a square checked pattern, where I will use trackables to detect when a player clicks a square, and then create a Cross or Circle in that square...
That's why I'm using rects
These are both of the scripts I'm using for this:
[jass="Code !]scope TerrainPattern initializer Create_Checked_Pattern
globals
constant real CENTER_X = 0
constant real CENTER_Y = 0
private constant real SQUARE_WIDTH = 8192.
private constant real SQUARE_HEIGHT = 8192.
private constant real COLUMNS = 20.
private constant real ROWS = 20.
private constant integer BORDER_RES = 200
private constant string SFX_PATH = "Abilities\\Spells\\Human\\SpellSteal\\SpellStealMissile.mdl"
constant real BOX_HEIGHT = SQUARE_HEIGHT / ROWS
constant real BOX_WIDTH = SQUARE_WIDTH / COLUMNS
endglobals
globals
rect array BoxCol
rect Board = Rect( CENTER_X - ( SQUARE_WIDTH / 2 ), CENTER_Y - ( SQUARE_HEIGHT / 2 ), CENTER_X + ( SQUARE_WIDTH / 2 ), CENTER_Y + ( SQUARE_WIDTH / 2 ) )
endglobals
private function Create_Checked_Pattern takes nothing returns nothing
local real posx
local real posy
local real x
local real y
local integer ic
local integer ir
local integer i = 0
loop
exitwhen i >= 12
call FogModifierStart( CreateFogModifierRect( Player(i), FOG_OF_WAR_VISIBLE, bj_mapInitialPlayableArea, true, true ) )
set i = i + 1
endloop
set i = 1
set posx = CENTER_X - ( SQUARE_WIDTH / 2 )
set posy = CENTER_Y + ( SQUARE_HEIGHT / 2 )
set ic = 0
loop
exitwhen ( ic == COLUMNS + 1 )
set x = posx + ( ic * BOX_WIDTH )
set y = posy
set ir = 0
loop
exitwhen ( ir == BORDER_RES + 1 )
set y = ( posy - ( ir * ( SQUARE_HEIGHT / BORDER_RES ) ) )
call AddSpecialEffect( SFX_PATH, x, y )
set ir = ir + 1
endloop
set ic = ic + 1
call DisplayTextToPlayer( Player( 0 ), 0., 0., R2S( ic ) )
endloop
set ir = 0
loop
exitwhen ( ir == ROWS + 1 )
set x = posx
set y = posy - ( ir * BOX_HEIGHT )
set ic = 0
loop
exitwhen ( ic == BORDER_RES + 1 )
set x = ( posx + ( ic * ( SQUARE_WIDTH / BORDER_RES ) ) )
call AddSpecialEffect( SFX_PATH, x, y )
set ic = ic + 1
endloop
set ir = ir + 1
call DisplayTextToPlayer( Player( 0 ), 0., 0., R2S( ir ) )
endloop
call DisplayTextToPlayer( Player( 0 ), 0., 0., "Starting !" )
set ic = 0
set ir = 0
set i = 0
loop
exitwhen ic == COLUMNS
set x = CENTER_X + ic * BOX_WIDTH
set ir = 0
loop
exitwhen ir == ROWS
set i = i + 1
set y = CENTER_Y + ir * BOX_HEIGHT
set BoxCol[i] = Rect( x, y, x + BOX_WIDTH, y + BOX_HEIGHT )
call BoxData.create( BoxCol[i] )
set ir = ir + 1
endloop
set ic = ic + 1
endloop
call BJDebugMsg( I2S( i ) )
endfunction
endscope[/code]
This is the script which atm creates 20 columns, but only 15 rows ?!
And it should also create rects inside all of those squares it creates, but it doesn't ever get there, because the entire thread is broken when the last row (the 15th) is created...
And here's the code which should keep track of each region, and create the trackables for them:
[jass="Code 2 !"]library Boxes/* initializer Init*/ requires TrackMapSystem
globals
private constant real HEIGHT_SPACE = 0.1
private constant real WIDTH_SPACE = 0.1
endglobals
struct BoxData
private rect rct
private TrackMap track1
private TrackMap track2
private trigger t
private real maxx
private real minx
private real maxy
private real miny
private player owner = null
static method create takes rect r returns thistype
local thistype this = thistype.allocate()
local integer i = 0
set this.rct = r
set this.maxx = GetRectMaxX( r )
set this.minx = GetRectMinX( r )
set this.maxy = GetRectMaxY( r )
set this.miny = GetRectMinY( r )
set this.track1 = TrackMap.create( r, 0, 147.18, true )
set this.track2 = TrackMap.create( r, 1, 147.18, false )
set this.t = CreateTrigger()
call TriggerAddCondition( this.t, Condition( function thistype.onClick ) )
call this.track1.registerClick( this.t )
call this.track2.registerClick( this.t )
return this
endmethod
static method createCross takes real x, real y returns boolean
local real width = BOX_WIDTH - ( BOX_WIDTH * WIDTH_SPACE )
local real height = BOX_HEIGHT - ( BOX_HEIGHT * HEIGHT_SPACE )
return false
endmethod
static method onClick takes nothing returns boolean
call BJDebugMsg( "Tracked !" )
return false
endmethod
endstruct
/*static if DEBUG_MODE then
private function Init takes nothing returns nothing
call BoxData.create( gg_rct_TrackRect )
endfunction
endif*/
endlibrary[/code]
And here are the other two scripts needed to create the trackables (Called TrackMaps

)
[jass="Code 3 !"]library TrackMapSystem initializer InitSystem uses Event
//=====================================================================================
// ||
// TrackMapSystem ||
// ||
// created by Lord_Executor alias Executor alias Executor1 ||
// ||
// Credits ||
// ||
// Vexorian [JNGP,Dummy.mdx] ||
// tamisrah [Advice] ||
// Azelier [Ideas] ||
// Jesus4Lyf [Event] ||
// ||
//=====================================================================================
//=====================================================================================
// ||
// This system allows you the fast and effective set up of TrackMaps which means ||
// filling an area with trackable objects which will callback to cursor actions. ||
// ||
// I create those trackables without a visible model, which allows them to be ||
// invisible ingame but still able to determine move and click of the cursor. ||
// ||
// There are several problems with this system because normal orders on TrackMapped ||
// ground won't be handled normal anymore. But you should try for yourself. ||
// ||
//=====================================================================================
globals
//May be modified:
private constant real TIMER_INTERVAL = 0.05
private constant integer LOOP_BREAK_VALUE = 2500
// You should know what you do if you want to modify these:
private constant string MODEL_SMALL = "Doodads\\Terrain\\InvisiblePlatformSmall\\InvisiblePlatformSmall.mdl"
private constant string MODEL_NORMAL = "Doodads\\Terrain\\InvisiblePlatform\\InvisiblePlatform.mdl"
private constant real RADIUS_NORMAL = 73.59
// Usuable Constants
constant real MOUSEPOSITION_HIGH_PRECISION = RADIUS_NORMAL
constant real MOUSEPOSITION_LESS_PRECISION = RADIUS_NORMAL * 2
//System Vars (do not modify)
private hashtable Hash = null
private constant key SLOT_TRACKDATA
private constant key SLOT_STRUCT
private real array TMpx
private real array TMpy
private boolean clicked = false
private integer TMlasttm = 0
private integer TMlastplayer = -1
endglobals
private function InitSystem takes nothing returns nothing
set Hash = InitHashtable()
endfunction
private function SetTriggerData takes trigger t, integer i returns nothing
loop
exitwhen i <= 0
call TriggerExecute(t)
set i = i - 1
endloop
endfunction
private function DestroyTriggerDelayed takes trigger t returns nothing
call TriggerSleepAction(3.0)
call DestroyTrigger(t)
endfunction
private struct trackdata
readonly real x
readonly real y
static method create takes real x, real y returns thistype
local thistype this = thistype.allocate()
set .x = x
set .y = y
return this
endmethod
endstruct
private struct cache
public real res
public string mod
public boolean timed
public real x_MIN
public real y_MIN
public real x_MAX
public real y_MAX
static method create takes nothing returns thistype
return thistype.allocate()
endmethod
endstruct
struct TrackMap
readonly trigger TrigTrack
readonly trigger TrigClick
readonly integer p
readonly rect r
readonly boolean active
private static boolexpr TrackHandle
private static boolexpr ClickHandle
private static Event anyClick
private static Event anyTrack
private Event onClick
private Event onTrack
static method registerAnyClick takes trigger t returns nothing
call .anyClick.register(t)
endmethod
static method registerAnyTrack takes trigger t returns nothing
call .anyTrack.register(t)
endmethod
static method registerAnyChange takes trigger t returns nothing
call .anyClick.register(t)
call .anyTrack.register(t)
endmethod
method registerClick takes trigger t returns nothing
call .onClick.register(t)
endmethod
method registerTrack takes trigger t returns nothing
call .onTrack.register(t)
endmethod
method registerChange takes trigger t returns nothing
call .onClick.register(t)
call .onTrack.register(t)
endmethod
private static method TrackHandleEx takes nothing returns boolean
local thistype map = GetTriggerExecCount(GetTriggeringTrigger())
local trackdata d = LoadInteger(Hash,GetHandleId(GetTriggeringTrackable()),SLOT_TRACKDATA)
set TMlasttm = map
set TMpx[map.p] = d.x
set TMpy[map.p] = d.y
set TMlastplayer = map.p
set clicked = false
call map.onTrack.fire()
call .anyTrack.fire()
return false
endmethod
private static method ClickHandleEx takes nothing returns boolean
local thistype map = GetTriggerExecCount(GetTriggeringTrigger())
local trackdata d = LoadInteger(Hash,GetHandleId(GetTriggeringTrackable()),SLOT_TRACKDATA)
set TMlasttm = map
set TMpx[map.p] = d.x
set TMpy[map.p] = d.y
set TMlastplayer = map.p
set clicked = true
call map.onClick.fire()
call .anyClick.fire()
return false
endmethod
static method create takes rect r,integer p, real resolution, boolean timed returns thistype
local thistype this = thistype.allocate()
local string mod = ""
local cache c = cache.create()
if resolution <= RADIUS_NORMAL then
set mod = MODEL_SMALL
else
set mod = MODEL_NORMAL
endif
set .p = p
set .r = r
set c.res = resolution
set c.mod = mod
set c.x_MIN = GetRectMinX(.r)
set c.y_MIN = GetRectMinY(.r)
set c.x_MAX = GetRectMaxX(.r)
set c.y_MAX = GetRectMaxY(.r)
set c.timed = timed
set .onClick = Event.create()
set .onTrack = Event.create()
set .TrigTrack = CreateTrigger()
set .TrigClick = CreateTrigger()
call SetTriggerData.execute(.TrigTrack,this)
call SetTriggerData.execute(.TrigClick,this)
call TriggerAddCondition(.TrigTrack,thistype.TrackHandle)
call TriggerAddCondition(.TrigClick,thistype.ClickHandle)
if timed then
call DynamicTrackMapGenerator.create(this,c)
else
call .generatefield(c,0)
endif
return this
endmethod
method generatefield takes cache c, integer i returns boolean
local integer j = 0
local trackable track = null
local real x = 0.
local real y = 0.
local string mod = c.mod
if GetPlayerId(GetLocalPlayer()) != .p then
set mod = ""
endif
loop
set j = 0
set x = c.x_MIN + i * c.res
loop
set y = c.y_MIN + j * c.res
set track = CreateTrackable(mod,x,y,0.)
call SaveInteger(Hash,GetHandleId(track),SLOT_TRACKDATA,trackdata.create(x,y))
call TriggerRegisterTrackableTrackEvent(.TrigTrack, track)
call TriggerRegisterTrackableHitEvent(.TrigClick, track)
set j = j + 1
exitwhen y >= c.y_MAX
endloop
set i = i + 1
if x >= c.x_MAX then
// completely done.
call c.destroy()
return true
endif
// wait for next interval to proceed
exitwhen c.timed
if (i * j >= LOOP_BREAK_VALUE) then
// recall the function in another thread to avoid a loop break.
call .generatefield.execute(c,i)
return false
endif
endloop
return false
endmethod
method onDestroy takes nothing returns nothing
call TriggerClearActions(.TrigTrack)
call TriggerClearActions(.TrigClick)
call DisableTrigger(.TrigTrack)
call DisableTrigger(.TrigClick)
call DestroyTriggerDelayed.execute(.TrigTrack)
call DestroyTriggerDelayed.execute(.TrigClick)
set .TrigTrack = null
set .TrigClick = null
endmethod
private static method onInit takes nothing returns nothing
set .anyClick = Event.create()
set .anyTrack = Event.create()
set .ClickHandle = Condition( function thistype.ClickHandleEx)
set .TrackHandle = Condition( function thistype.TrackHandleEx)
endmethod
method stop takes nothing returns nothing
if not .active then
return
endif
set .active = false
if .TrigTrack != null then
call DisableTrigger(.TrigTrack)
endif
if .TrigClick != null then
call DisableTrigger(.TrigClick)
endif
endmethod
method resume takes nothing returns nothing
if .active then
return
endif
set .active = true
if .TrigTrack != null then
call EnableTrigger(.TrigTrack)
endif
if .TrigClick != null then
call EnableTrigger(.TrigClick)
endif
endmethod
endstruct
struct DynamicTrackMapGenerator
private integer i = -1
private TrackMap m
private cache c
static method create takes TrackMap m, cache c returns thistype
local thistype this = thistype.allocate()
local timer t = CreateTimer()
set .m = m
set .c = c
call SaveInteger(Hash, GetHandleId(t),SLOT_STRUCT,this)
call TimerStart(t,TIMER_INTERVAL,true, function thistype.callback)
return this
endmethod
static method callback takes nothing returns nothing
local timer t = GetExpiredTimer()
local thistype this = LoadInteger(Hash,GetHandleId(t),SLOT_STRUCT)
set .i = .i + 1
if .m.generatefield(.c,.i) then
call RemoveSavedInteger(Hash,GetHandleId(t),SLOT_STRUCT)
call DestroyTimer(t)
call .destroy()
endif
endmethod
endstruct
// Usuable Functions
function SetUpTrackMap takes rect area, player p, boolean veryprecise returns TrackMap
if veryprecise then
return TrackMap.create(area ,GetPlayerId(p),MOUSEPOSITION_HIGH_PRECISION,true)
else
return TrackMap.create(area ,GetPlayerId(p),MOUSEPOSITION_LESS_PRECISION,true)
endif
endfunction
function SetUpTrackMapEx takes rect area, player p, real precision, boolean timed returns TrackMap
return TrackMap.create(area,GetPlayerId(p),precision,timed)
endfunction
function TriggerRegisterAnyMouseEvent takes trigger t returns nothing
call TrackMap.registerAnyChange(t)
endfunction
function TriggerRegisterAnyClickEvent takes trigger t returns nothing
call TrackMap.registerAnyClick(t)
endfunction
function TriggerRegisterAnyTrackEvent takes trigger t returns nothing
call TrackMap.registerAnyTrack(t)
endfunction
function TriggerRegisterMouseEvent takes trigger t, TrackMap tm returns nothing
call tm.registerChange(t)
endfunction
function TriggerRegisterClickEvent takes trigger t, TrackMap tm returns nothing
call tm.registerClick(t)
endfunction
function TriggerRegisterTrackEvent takes trigger t, TrackMap tm returns nothing
call tm.registerTrack(t)
endfunction
function Clicked takes nothing returns boolean
return clicked
endfunction
function Tracked takes nothing returns boolean
return not clicked
endfunction
function GetMousePosX takes integer p returns real
return TMpx
endfunction
function GetMousePosY takes integer p returns real
return TMpy
endfunction
function GetTriggerMousePosX takes nothing returns real
return TMpx[TMlastplayer]
endfunction
function GetTriggerMousePosY takes nothing returns real
return TMpy[TMlastplayer]
endfunction
function GetTriggerTrackMap takes nothing returns TrackMap
return TMlasttm
endfunction
function GetMouseUsingPlayer takes nothing returns player
return Player(TMlastplayer)
endfunction
function GetMouseUsingPlayerId takes nothing returns integer
return TMlastplayer
endfunction
endlibrary[/code]
[jass="Event !"]//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~ Event ~~ By Jesus4Lyf ~~ Version 1.04 ~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// What is Event?
// - Event simulates Warcraft III events. They can be created,
// registered for, fired and also destroyed.
// - Event, therefore, can also be used like a trigger "group".
// - This was created when there was an influx of event style systems
// emerging that could really benefit from a standardised custom
// events snippet. Many users were trying to achieve the same thing
// and making the same kind of errors. This snippet aims to solve that.
//
// Functions:
// - Event.create() --> Creates a new Event.
// - .destroy() --> Destroys an Event.
// - .fire() --> Fires all triggers which have been
// registered on this Event.
// - .register(trigger) --> Registers another trigger on this Event.
// - .unregister(trigger) --> Unregisters a trigger from this Event.
//
// Details:
// - Event is extremely efficient and lightweight.
// - It is safe to use with dynamic triggers.
// - Internally, it is just a linked list. Very simple.
//
// How to import:
// - Create a trigger named Event.
// - Convert it to custom text and replace the whole trigger text with this.
//
// Thanks:
// - Builder Bob for the trigger destroy detection method.
// - Azlier for inspiring this by ripping off my dodgier code.
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
library Event
///////////////
// EventRegs //
////////////////////////////////////////////////////////////////////////////
// For reading this far, you can learn one thing more.
// Unlike normal Warcraft III events, you can attach to Event registries.
//
// Event Registries are registrations of one trigger on one event.
// These cannot be created or destroyed, just attached to.
//
// It is VERY efficient for loading and saving data.
//
// Functions:
// - set eventReg.data = someStruct --> Store data.
// - eventReg.data --> Retreive data.
// - Event.getTriggeringEventReg() --> Get the triggering EventReg.
// - eventReg.destroy() --> Undo this registration.
//
private keyword destroyNode
struct EventReg extends array
integer data
method clear takes nothing returns nothing
set this.data=0
endmethod
method destroy takes nothing returns nothing
call Event(this).destroyNode()
endmethod
endstruct
private module Stack
static thistype top=0
static method increment takes nothing returns nothing
set thistype.top=thistype(thistype.top+1)
endmethod
static method decrement takes nothing returns nothing
set thistype.top=thistype(thistype.top-1)
endmethod
endmodule
private struct EventStack extends array
implement Stack
Event current
endstruct
struct Event
private trigger trig
private thistype next
private thistype prev
static method getTriggeringEventReg takes nothing returns EventReg
return EventStack.top.current
endmethod
static method create takes nothing returns Event
local Event this=Event.allocate()
set this.next=this
set this.prev=this
return this
endmethod
private static trigger currentTrigger
method fire takes nothing returns nothing
local thistype curr=this.next
call EventStack.increment()
loop
exitwhen curr==this
set thistype.currentTrigger=curr.trig
if IsTriggerEnabled(thistype.currentTrigger) then
set EventStack.top.current=curr
if TriggerEvaluate(thistype.currentTrigger) then
call TriggerExecute(thistype.currentTrigger)
endif
else
call EnableTrigger(thistype.currentTrigger) // Was trigger destroyed?
if IsTriggerEnabled(thistype.currentTrigger) then
call DisableTrigger(thistype.currentTrigger)
else // If trigger destroyed...
set curr.next.prev=curr.prev
set curr.prev.next=curr.next
call curr.deallocate()
endif
endif
set curr=curr.next
endloop
call EventStack.decrement()
endmethod
method register takes trigger t returns EventReg
local Event new=Event.allocate()
set new.prev=this.prev
set this.prev.next=new
set this.prev=new
set new.next=this
set new.trig=t
call EventReg(new).clear()
return new
endmethod
method destroyNode takes nothing returns nothing // called on EventReg
set this.prev.next=this.next
set this.next.prev=this.prev
call this.deallocate()
endmethod
method unregister takes trigger t returns nothing
local thistype curr=this.next
loop
exitwhen curr==this
if curr.trig==t then
set curr.next.prev=curr.prev
set curr.prev.next=curr.next
call curr.deallocate()
return
endif
set curr=curr.next
endloop
endmethod
method destroy takes nothing returns nothing
local thistype curr=this.next
loop
call curr.deallocate()
exitwhen curr==this
set curr=curr.next
endloop
endmethod
method chainDestroy takes nothing returns nothing
call this.destroy() // backwards compatability.
endmethod
endstruct
/////////////////////////////////////////////////////
// Demonstration Functions & Alternative Interface //
////////////////////////////////////////////////////////////////////////////
// What this would look like in normal WC3 style JASS (should all inline).
//
function CreateEvent takes nothing returns Event
return Event.create()
endfunction
function DestroyEvent takes Event whichEvent returns nothing
call whichEvent.chainDestroy()
endfunction
function FireEvent takes Event whichEvent returns nothing
call whichEvent.fire()
endfunction
function TriggerRegisterEvent takes trigger whichTrigger, Event whichEvent returns EventReg
return whichEvent.register(whichTrigger)
endfunction
// And for EventRegs...
function SetEventRegData takes EventReg whichEventReg, integer data returns nothing
set whichEventReg.data=data
endfunction
function GetEventRegData takes EventReg whichEventReg returns integer
return whichEventReg.data
endfunction
function GetTriggeringEventReg takes nothing returns integer
return Event.getTriggeringEventReg()
endfunction
endlibrary[/code]
So... Any ideas to why the thread is broken on the creation of the 15th row ? :S
Because your guess is as good as mine at this point XD