| 11-17-2009, 07:13 PM | #1 | |
I made a (lil) library to do some stuff with Shapes (enum units in shapes/...) Due to my jh throwing pjass-errors all the time so I post it here to have some review/comment whatever V1.01:// library TShape // // This is an useful lib to handle shapes (linked lists filled with points) //!========================================================================= //!========================================================================= //! novjass //! NEVER EVERY TOUCH ONE OF THESE GLOBALS! NEVER! globals private location TSHAPE_HELPLOC=Location(0.0,0.0) //Location, used to determines a Points z-value private Shape TRAINGLE_SHAPE=Shape.create() //Used to get a Triangles max/min values private hashtable LL_HASHTABLE=InitHashtable() //Hashtable to store all lightnings private real MOVESHAPE_ANGLE //angle moved private location MOVESHAPE_CENTER=Location(0.0,0.0) //center around which the shape is moved private TriList GROUPUNITSINSHAPE_TRILIST //Trilist for GroupUnitsInShape() private group GROUPUNITSINSHAPE_GROUP=CreateGroup() //Group for GroupUnitsInShape() endglobals struct Point //my version of blizz location Point next //next Point is Shape Point prev //previous Point in Shape real x //s.e. real y //s.e. real z //s.e. static method create takes real x, real y returns thistype //s.e. method move takes real x, real y returns nothing //s.e. method remove takes nothing returns nothing //destroys the point struct ISPoint //The Point at the intersection of the graph from p1 to p2 and from p3 to p4, is 0 if the graphes don not intersect Point array cP[4] //The Points which determine the graphs real x //s.e. real y //s.e. real z //s.e. static method create takes Point p1, Point p2, Point p3, Point p4 returns thistype //s.e. method isOnStraight takes Point p1, Point p2 returns boolean //weather the point is on the graph determined by p1 and p2 method isBetween takes Point p1, Point p2 returns boolean //weather the point is between p1 and p2 (not on the graph) method isOnCurve takes Point p1, Point p2 returns boolean //weather the point is on the graph from p1 to p2 and between p1 and p2 method remove takes nothing returns nothing //destroys the point struct Triangle //s.e. Point A //s.e. Point B //s.e. Point C //s.e. Triangle next //the next Triangle in the TriList Trinagle prev //the previous Triangle in the TriList real a2 //the square-length of [BC] real b2 //the square-length of [AC] real c2 //the square-length of [AB] real cx //the x-coordinate of the circumcircle real cy //the y-coordiante of the circumcircle real cdist2 //the square-radius of the circumcircle real minX //s.e. real maxX //s.e. real minY //s.e. real maxY //s.e. static method create takes Point A, Point B, Point C returns thistype //creates a Traingle out of the three Points method containsCoords takes Point p returns boolean //weather the triangle contains the point or not method remove takes nothing returns nothing //destroys the Triangle function interface TriList_FUNC takes Triangle t returns nothing //An interface for the structs for-method struct TriList //A Linked List for Triangles Traingle start //s.e. Triangle end //s.e. integer length //s.e. static method create takes nothing returns thistype //s.e. method isInTriList takes TriList comp returns boolean //weather a triangle is in the list or not method for takes TriList_FUNC func returns nothing //calls the TriList_FUNC for every stored triangle method addTriangle takes Triangle t returns nothing //s.e. method addTriList takes TriList n returns nothing //s.e. method clear takes nothing returns nothing //s.e. method remove takes nothing returns nothing //destoys the list function interface Struct_FUNC takes Point t returns nothing //An interface for the structs for-method struct Shape //A Struct represented by a Linked List containing Points Point start //s.e. Point end //s.e. integer order //the number of points in the Shape, the point in place[order] is the start-point static method create takes nothing returns thistype //s.e. method isInShape takes Shape comp returns boolean //weather a Point is in the Shape method for takes Shape_FUNC func returns nothing //calls the Shape_FUNC for every stored Point method addPoint takes Point t returns nothing //s.e. method addShape takes Shape n returns nothing //s.e. method clear takes nothing returns nothing //s.e. method remove takes nothing returns nothing //destroys the Shape function interface LightList_FUNC takes lightning l returns nothing //An interface fo the structs for-method struct LightList //A struct that stores all lightnings which are created via PrintShapeWithLightnings() in an hashtable integer length //s.e. real height //height of the lightnings above the ground string lightningid //the lightningcode of the created lightnings boolean visible //weather the lightnings are visible or not static method create takes nothing returns thistype //creates a new LightList method addLightning takes lightning l returns nothing //adds a lightning to the end of the LightList method operator [] takes integer i returns lightning //returns the lightning in position i method for takes LightList_FUNC f returns nothing //calls the LightList_FUNC for every stored lightning method clear takes nothing returns nothing //s.e. method remove takes nothing returns nothing //s.e. function Loc2Point takes location l returns Point //convertes a location into a Point function Point2Loc takes Point p returns location //convertes a Point into a location function ISPoint2Point takes ISPoint isp returns Point //convertes an intersection-Point into a Point function GetDist2 takes real x1, real y1, real x2, real y2 returns real //Returns the square-distance between (x1,y1) and (x2,y2) function Trangle2Shape takes Traingle t returns Shape //convertes a Triangle into a Shape function Shape2Triangle takes Shape s return Traingle //convertes a Shape to a Triangle, when the Shape contains 3 Points, else it will return 0 function IsPointInTriList takes TriList trilist, Point p returns boolean //weather a Point is in the TriList or not function TriListContainsCoordiantes takes TriList trilist, real x, real y returns boolean //weather the coordinates are in the TriList function GetShapeMinX takes Shape s returns real //returns the Shapes minX-value function GetShapeMaxX takes Shape s returns real //returns the Shapes maxX-value function GetShapeMinY takes Shape s returns real //returns the Shapes minY-value function GetShapeMaxY takes Shape s returns real //returns the Shapes maxY-value function ShapeGetRect takes Shape s returns rect //returns a rect around the shape function Shape2TriList takes Shape s returns TriList //convertes a Shape to a TriList function IsPointInShape takes Shape s, Point p returns boolean //weather a point is in the Shape or not function ShapeContainsCoordinates takes Shape s, real x, real y returns boolean //weather the coordinates are in the Shape function GroupUnitsInShape takes group g, Shape s, filter f returns nothing //Adds all units matching 'filter' in Shape s in group g function MoveShape takes Shape s, real angleinc_rad, real centerx, real centery returns nothing //Moves the shape angelinc_rad radians around (centerx,centery) function PrintShapeWithLightnings takes Shape s, string lightningcode, boolean visible, real height returns LightList //Paints a shape with lightnings on the ground function UpdateLightList takes Shape s, LightList ll returns nothing //updates an existing LightList by moving it to the current position of the shape //! novjass //!========================================================================= //!========================================================================= // //================================================ //!GIVE CREDITS TO TOT IF YOU USE IT //================================================ //!DO NOT CHANGE UNLESS YOU KNOW WHAT YOU'RE DOING library TShape globals private location TSHAPE_HELPLOC =Location(0.0,0.0) private Shape TRAINGLE_SHAPE=Shape.create() private hashtable LL_HASHTABLE=InitHashtable() private real MOVESHAPE_ANGLE private location MOVESHAPE_CENTER=Location(0.0,0.0) private TriList GROUPUNITSINSHAPE_TRILIST private group GROUPUNITSINSHAPE_GROUP=CreateGroup() endglobals // STRUCTS struct Point Point next Point prev real x real y real z static method create takes real x, real y returns thistype local thistype this=thistype.allocate() set .x=x set .y=y set .z=GetLocationZ(MoveLocation(TSHAPE_HELPLOC,.x,.y)) return this endmethod method move takes real x, real y returns nothing set .x=x set .y=y set .z=GetLocationZ(MoveLocation(TSHAPE_HELPLOC,.x,.y)) endmethod method remove takes nothing returns nothing set .next=0 set .prev=0 set .x=0.0 set .y=0.0 set .z=0.0 call this.destroy() endmethod endstruct struct ISPoint Point array cP[4] real x real y real z static method create takes Point p1, Point p2, Point p3, Point p4 returns thistype local thistype this=thistype.allocate() // Intersection Helpers local real u local real v set .cP[0]=p1 set .cP[1]=p2 set .cP[2]=p3 set .cP[3]=p4 // Calculating the ISPoint if .cP[0].x!=.cP[1].x and .cP[2].x!=.cP[3].x and .cP[0].y!=.cP[1].y and .cP[2].y!=.cP[3].y then set u=(.cP[0].y-.cP[1].y)/(.cP[0].x-.cP[1].x) set v=(.cP[2].y-.cP[3].y)/(.cP[2].x-.cP[3].x) if u!=v and (.cP[0].y-.cP[2].y!=.cP[1].y-.cP[3].y or .cP[0].x-.cP[2].x!=.cP[1].x-.cP[3].x) then set .x=(u*.cP[1].x-v*.cP[3].x+.cP[3].y-.cP[1].y)/(u-v) set .y=u*(x-.cP[1].x)+.cP[1].y set .z=GetLocationZ(MoveLocation(TSHAPE_HELPLOC,.x,.y)) else return 0 endif else return 0 endif return this endmethod method isOnStraight takes Point p1, Point p2 returns boolean return .y==(p1.y-p2.y)/(p1.x-p2.x)*(.x-p2.x)+p2.y endmethod method isBetween takes Point p1, Point p2 returns boolean local real lx=p1.x local real rx=p2.x local real ly=p1.y local real uy=p2.y local real temp if lx>rx then set temp=lx set lx=rx set rx=lx endif if ly>uy then set temp=ly set ly=uy set uy=temp endif set temp=0.0 return .x>=lx and .x<=rx and .y>=ly and .y<=uy endmethod method isOnCurve takes Point p1, Point p2 returns boolean return .isOnStraight(p1,p2) and .isBetween(p1,p2) endmethod method remove takes nothing returns nothing // call .cP[0].remove() // call .cP[1].remove() // call .cP[2].remove() // call .cP[3].remove() set .cP[0]=0 set .cP[1]=0 set .cP[2]=0 set .cP[3]=0 set .x=0.0 set .y=0.0 set .z=0.0 call .destroy() endmethod endstruct struct Triangle Point A Point B Point C Triangle next Trinagle prev real a2 real b2 real c2 real cx real cy real cdist2 real minX real maxX real minY real maxY static method create takes Point A, Point B, Point C returns thistype local thistype this=thistype.allocate() local real u local real v local real w local real h set .A=A set .B=B set .C=C set .a2=(.B.x-.C.x)*(.B.x-.C.x)+(.B.y-.C.y)*(.B.y-.C.y) set .b2=(.A.x-.C.x)*(.A.x-.C.x)+(.A.y-.C.y)*(.A.y-.C.y) set .c2=(.B.x-.A.x)*(.B.x-.A.x)+(.B.y-.A.y)*(.B.y-.A.y) // geting the center of the circumcircle set u=(.b2+.c2-.a2)/(2*SquareRoot(.b2*.c2)) set u=SquareRoot(1-u)*u set v=(.a2+.c2-.b2)/(2*SquareRoot(.a2*.c2)) set v=SquareRoot(1-v)*v set w=(.a2+.b2-.c2)/(2*SquareRoot(.a2*.b2)) set w=SquareRoot(1-w)*w set h=u+v+w set u=u/h set v=v/h set w=w/h set .cx=u*.A.x+v*.B.x+w*.C.x set .cy=u*.A.y+v*.B.y+w*.C.y set .cdist2=GetDistance(.cx,.cy,.A.x,.A.y) call TRAINGLE_SHAPE.clear() call TRAINGLE_SHAPE.addPoint(.A) call TRAINGLE_SHAPE.addPoint(.B) call TRAINGLE_SHAPE.addPoint(.C) set .minX=GetShapeMinX(TRAINGLE_SHAPE) set .maxX=GetShapeMaxX(TRAINGLE_SHAPE) set .minY=GetShapeMinY(TRAINGLE_SHAPE) set .maxY=GetShapeMaxY(TRAINGLE_SHAPE) set u=0.0 set v=0.0 set w=0.0 set h=0.0 return this endmethod method containsCoords takes Point p returns boolean local ISPoint isp if p.x>=.minX and p.x<=.maxX and p.y>=.minY and p.y<=.maxY then set isp=ISPoint.create(p,.A,.B,.C) if isp==0 or (.cdist2<GetDist2(isp.x,isp.y,.cx,.cy) and GetDist2(isp.x,isp.y,.A.x,.A.y)<GetDist2(p.x,p.y,.A.x,.A.y)) then call isp.remove() set isp=0 return false endif call isp.remove() set isp=0 return true endif return false endmethod method remove takes nothing returns nothing set .A=0 set .B=0 set .C=0 set .a2=0.0 set .b2=0.0 set .c2=0.0 set .next=0 set .prev=0 set .cx=0.0 set .cy=0.0 set .cdist2=0.0 set .maxX=0.0 set .minX=0.0 set .maxY=0.0 set .minY=0.0 call .destroy() endmethod endstruct //! textmacro LinkedList takes NAME, TYPE, LENGTH, NULL function interface $NAME$_FUNC takes $TYPE$ t returns nothing struct $NAME$ $TYPE$ start $TYPE$ end integer $LENGTH$ static method create takes nothing returns thistype local thistype this=thistype.allocate() set .start=$NULL$ set .end=$NULL$ set .$LENGTH$=0 return this endmethod method isIn$NAME$ takes $TYPE$ comp returns boolean local $TYPE$ t=.start loop exitwhen t==0 if t==comp then set t=0 return t endif set t=t.next endloop set t=0 return false endmethod method for takes $NAME$_FUNC func returns nothing local $TYPE$ t=.start loop exitwhen t==0 call func.execute(t) set t=t.next endloop set t=0 endmethod method add$TYPE$ takes $TYPE$ t returns nothing if .start==$NULL$ then set .start=t set .end=t else set t.prev=.end set .end.next=t set .end=t endif set .$LENGTH$=.$LENGTH$+1 endmethod method add$NAME$ takes $NAME$ n returns nothing local $TYPE$ t=n.start loop exitwhen t==$NULL$ call this.add$TYPE$(t) set t=t.next endloop set t=0 endmethod method clear takes nothing returns nothing local $TYPE$ t=.start local $TYPE$ h loop exitwhen t==$NULL$ set h=t.next // call t.remove() set t=$NULL$ set t=h endloop set t=$NULL$ set h=$NULL$ set .$LENGTH$=0 endmethod method remove takes nothing returns nothing call this.clear() call this.destroy() endmethod endstruct //! endtextmacro //! runtextmacro LinkedList("Shape","Point","order","0") //! runtextmacro LinkedList("TriList","Triangle","length","0") function interface LightList_FUNC takes lightning l returns nothing struct LightList integer length real height string lightningid boolean visible static method create takes nothing returns thistype local thistype this=thistype.allocate() set .length=0 set .height=0 set .lightningid=0 set .visible=false endmethod method addLightning takes lightning l returns nothing call SaveLightningHandle(LL_HASHTABLE, integer(this),.length,l) set .length=.length+1 endmethod method operator [] takes integer i returns lightning return LoadLightningHandle(LL_HASHTABLE, integer(this),i) endmethod method for takes LightList_FUNC f returns nothing local integer i=0 loop exitwhen i==.length call f.execute(this[i]) set i=i+1 endloop set i=0 endmethod method clear takes nothing returns nothing call FlushChildHashtable(LL_HASHTABLE,integer(this)) set .length=0 set .height=0.0 set .lightningid="" set .visible=false endmethod method remove takes nothing returns nothing call .clear() call this.destroy() endmethod endstruct // FUNCTIONS // Helper Funcs function Loc2Point takes location l returns Point return Point.create(GetLocationX(l),GetLocationY(l)) endfunction function Point2Loc takes Point p returns location return Location(p.x,p.y) endfunction function ISPoint2Point takes ISPoint isp returns Point return Point(isp.x,isp.y) endfunction function GetDist2 takes real x1, real y1, real x2, real y2 returns real return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2) endfunction function Trangle2Shape takes Triangle t returns Shape local Shape s=Shape.create() call s.addPoint(t.A) call s.addPoint(t.B) call s.addPoint(t.C) endfunction function Shape2Triangle takes Shape s returns Traingle if s.order==3 then return Triangle.create(s.start,s.start.next,s.start.next.next) endif return 0 endfunction function IsPointInTriList takes TriList trilist, Point p returns boolean local Triangle t=trilist.start loop exitwhen t==0 if t.containsCoords(p) then set t=0 return true endif set t=t.next endloop set t=0 return false endfunction function TriListContainsCoordiantes takes TriList trilist, real x, real y returns boolean local Point p=Point.create(x,y) local boolean ret=IsPointInTriList(trilist,p) call p.remove() set p=0 return ret endfunction //! textmacro GetShape takes WHAT, W, OPERATOR function GetShape$WHAT$ takes Shape s returns real local Point p=s.start local real ret=p.$W$ loop exitwhen p==0 if p.$W$ $OPERATOR$ ret then set ret=p.$W$ endif set p=p.next endloop set p=0 return ret endfunction //! endtextmacro //!runtextmacro GetShape("MinX","x","<") //!runtextmacro GetShape("MaxX","x",">") //!runtextmacro GetShape("MinY","y","<") //!runtextmacro GetShape("MaxY","y",">") function ShapeGetRect takes Shape s returns rect local Point p=s.start local real minx=p.x local real miny=p.y local real maxx=p.x local real maxy=p.y loop exitwhen p==0 if p.x<minx then set minx=p.x endif if p.x>maxx then set maxx=p.x endif if p.y<miny then set miny=p.y endif if p.y>maxy then set maxy=p.y endif set p=p.next endloop set p=0 return Rect(minx,miny,maxx,maxy) endfunction // Main Funcs //! textmacro S2TL_IPIS takes HEADER, IPIS function $HEADER$ // main stroage arrays // local Point array ShapePoints local ISPoint array ISPoints static if IPIS then local boolean isInside=false else local TriList trilist=TriList.create() endif // helpers local Point p=shape.start local Point q local Point r local Point s local ISPoint isp local integer ISPcount=0 local integer i local integer j // traingle helpers local ISPoint array atp local integer atpIndex local integer atpIndexMax local Point tc1 local Point tc2 static if $IPIS$ then local Triangle triangle endif loop exitwhen p==0 if p.next==0 then set q=shape.start else set q=p.next endif // creating ShapePoints set r=p loop exitwhen r==0 if r.next==0 then set s=shape.start else set s=r.next endif set isp=ISPoint.create(p,q,r,s) if isp!=0 then set ISPoints[ISPcount]=isp set ISPcount=ISPcount+1 else call isp.remove() endif set r=r.next endloop // creating/checking the triangles set atpIndex=0 set j=0 loop exitwhen j==ISPcount set isp=ISPoints[j] if isp.isOnCurve(p,q) then set atp[atpIndex]=isp set atpIndex=atpIndex+1 if atpIndex>atpIndexMax then set atpIndexMax=atpIndex+1 endif endif set j=j+1 endloop if atpIndex==0 then set tc1=q else set j=0 set isp=atp[0] loop exitwhen j==atpIndex if GetDist2(atp[j].x,atp[j].y,p.x,p.y)<GetDist2(atp[j].x,atp[j].y,isp.x,isp.y) then set isp=atp[j] endif set j=j+1 endloop set tc1=ISPoint2Point(isp) endif // get the second point if p==shape.start then set q=shape.end else set q=p.prev endif set atpIndex=0 set j=0 loop exitwhen j==ISPcount set isp=ISPoints[j] if isp.isOnCurve(p,q) then set atp[atpIndex]=isp set atpIndex=atpIndex+1 if atpIndex>atpIndexMax then set atpIndexMax=atpIndex+1 endif endif set j=j+1 endloop if atpIndex==0 then set tc2=q else set j=0 set isp=atp[0] loop exitwhen j==atpIndex if GetDist2(atp[j].x,atp[j].y,p.x,p.y)<GetDist2(atp[j].x,atp[j].y,isp.x,isp.y) then set isp=atp[j] endif set j=j+1 endloop set tc2=ISPoint2Point(isp) endif static if $IPIS$ then // check the triangle set triangle=Triangle.create(tc2,p,tc1) if triangle.containsCoords(point) then set isInside=true endif call triangle.remove() else // create and add the triangle call trilist.addTriangle(Triangle.create(tc2,p,tc1)) endif set p=p.next endloop // nulling/destroying everything set i=0 loop if i<ISPcount then call ISPoints[i].remove() set ISPoints[i]=0 endif if i<atpIndexMax then set atp[i]=0 endif set i=i+1 endloop set i=0 set j=0 set p=0 set q=0 set r=0 set s=0 set ISPcount=0 set i=0 set j=0 set atpIndex=0 set atpIndexMax=0 set tc1=0 set tc2=0 static if $IPIS$ then set triangle=0 return isInside else return trilist endif endfunction //! endtextmacro //! runtextmacro S2TL_IPIS("Shape2TriList takes Shape shape returns TriList","false") //! runtextmacro S2TL_IPIS("IsPointInShape takes Shape shape, Point point returns boolean","true") function ShapeContainsCoordinates takes Shape s, real x, real y returns boolean local Point p=Point.create(x,y) local boolean ret=IsPointInShape(s,p) call p.remove() set p=0 return ret endfunction private function GUIS_Unit takes nothing returns nothing local unit u=GetEnumUnit() if TriListContainsCoordiantes(GROUPUNITSINSHAPE_TRILIST,GetUnitX(u),GetUnitY(u)) then call GroupAddUnit(GROUPUNITSINSHAPE_GROUP,u) endif set u=null endfunction function GroupUnitsInShape takes group g, Shape s, boolexpr filter returns nothing local group temp=CreateGroup() local rect r=ShapeGetRect(s) call GroupEnumUnitsInRect(temp,r,filter) set GROUPUNITSINSHAPE_TRILIST=Shape2TriList(s) call GroupClear(GROUPUNITSINSHAPE_GROUP) call ForGroup(temp,function GUIS_Unit) call GROUPUNITSINSHAPE_TRILIST.remove() call GroupAddGroup(g,GROUPUNITSINSHAPE_GROUP) call GroupClear(GROUPUNITSINSHAPE_GROUP) call DestroyGroup(temp) call RemoveRect(r) set temp=null set r=null endfunction private function MoveShapePoint takes Point p returns nothing local real dist=SquareRoot(GetDist2(p.x,p.y,GetLocationX(MOVESHAPE_CENTER),GetLocationY(MOVESHAPE_CENTERY))) local location l1=Point2Loc(p) local real angle=AngleBetweenPoints(l1,MOVESHAPE_CENTER) call p.move(dist*Cos(angle+MOVESHAPE_ANGLE),dist*Sin(angle+MOVESHAPE_ANGLE)) call RemoveLocation(l1) set l1=null set dist=0.0 set angle=0.0 endfunction function MoveShape takes Shape s, real angleinc_rad, real centerx, real centery returns nothing set MOVESHAPE_ANGLE=angleinc_rad call MoveLocation(MOVESHAPE_CENTER,centerx,centery) call s.for(MoveShapePoint) endfunction function PrintShapeWithLightnings takes Shape s, string lightningcode, boolean visible, real height returns LightList local Point p=s.start local Point q local LightList ll=LightList.create() local lightning l loop exitwhen p==0 if p.next==0 then set q=s.start else set q=p.next endif set l=AddLightning(lightningcode,visible,p.x,p.y,q.x,q.y) call MoveLightning(l,visible,p.x,p.y,p.z+height,q.x,q.y,q.z+height) call ll.addLightning(l) set p=p.next endloop set ll.lightningid=lightningcode set ll.height=height set ll.visible=visible set q=0 set p=0 set l=0 return ll endfunction function UpdateLightList takes Shape s, LightList ll returns nothing local Point p=s.start local Point q local lightning l local string lightningcode=ll.lightningid local real height=ll.height local boolean visible=ll.visible call ll.clear() loop exitwhen p==0 if p.next==0 then set q=s.start else set q=p.next endif set l=AddLightning(lightningcode,visible,p.x,p.y,q.x,q.y) call MoveLightning(l,visible,p.x,p.y,p.z+height,q.x,q.y,q.z+height) call ll.addLightning(l) set p=p.next endloop set ll.lightningid=lightningcode set ll.height=height set ll.visible=visible set q=0 set p=0 set l=0 endfunction endlibrary
|
| 11-17-2009, 07:16 PM | #2 |
//! novjass O_o |
| 11-18-2009, 05:49 AM | #3 | |
Quote:
yea...need some kind of non-green comment to make it better readable |
| 11-18-2009, 07:36 AM | #4 |
updated to v1.01: - Added MoveShape(...), PrintShapeWithLightnings(...) and UpdateShape(...) functions - Added a move-method to the Point-struct - Improved the Shape2TriList function - Added the LightList-struct to store all lightning created eith PrintShapeWithLightnings(...) bye |
| 11-18-2009, 10:26 AM | #5 |
Last time I checked you couldn't create structs in variable declarations. |
| 11-18-2009, 11:01 AM | #6 | |
Quote:
as I said, it compiled till the pjass-error occures. Probably it works wit jh 0.A.2.7. |
