[TeamTalk 325]: [861] trunk/usarsim: Import from USARSim.
tk@edam.speech.cs.cmu.edu
tk at edam.speech.cs.cmu.edu
Mon Oct 29 14:21:45 EDT 2007
An HTML attachment was scrubbed...
URL: http://mailman.srv.cs.cmu.edu/pipermail/teamtalk-developers/attachments/20071029/6ef222c7/attachment-0001.html
-------------- next part --------------
Modified: trunk/usarsim/System/USARBot.ini
===================================================================
--- trunk/usarsim/System/USARBot.ini 2007-10-26 04:16:10 UTC (rev 860)
+++ trunk/usarsim/System/USARBot.ini 2007-10-29 18:21:44 UTC (rev 861)
@@ -186,7 +186,7 @@
JointParts=(PartName="LeftRWheel",PartClass=class'USARModels.P2ATTire',DrawScale3D=(X=1.0,Y=0.55,Z=1.0),bSteeringLocked=True,bSuspensionLocked=true,Parent="",JointClass=class'KCarWheelJoint',ParentPos=(Y=-0.20399979,X=-0.13199987,Z=0.13104749),ParentAxis=(Z=1.0),ParentAxis2=(Y=1.0),SelfPos=(Z=-0.0),SelfAxis=(Z=1.0),SelfAxis2=(Y=1.0))
MisPkgs=(PkgName="CameraPanTilt",Location=(Y=0.0,X=0.12799986,Z=-0.21599978),PkgClass=Class'USARMisPkg.CameraPanTilt')
Cameras=(ItemClass=class'USARBot.RobotCamera',ItemName="Camera",Parent="CameraPanTilt_Link2",Position=(Y=0.0,X=0.06,Z=-0.0088),Direction=(Y=0.0,Z=0.0,X=0.0))
-HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="Headlight",Parent="CameraPanTilt_Link2",Position=(Y=0.0,X=0.079999916,Z=0.06399993),Direction=(Y=0.0,Z=0.0,X=0.0),LightGlow=True)
+HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="Headlight",Parent="CameraPanTilt_Link2",Position=(Y=0.0,X=0.079999916,Z=0.06399993),Direction=(Y=0.0,Z=0.0,X=0.0))
Sensors=(ItemClass=class'USARBot.SonarSensor',ItemName="F1",Position=(X=0.14499985,Y=-0.12999986,Z=-0.0),Direction=(Y=0.0,Z=-1.5707964,X=0.0))
Sensors=(ItemClass=class'USARBot.SonarSensor',ItemName="F2",Position=(X=0.1849998,Y=-0.114999875,Z=-0.0),Direction=(Y=0.0,Z=-0.87264335,X=0.0))
Sensors=(ItemClass=class'USARBot.SonarSensor',ItemName="F3",Position=(X=0.21999978,Y=-0.079999916,Z=-0.0),Direction=(Y=0.0,Z=-0.52356684,X=0.0))
@@ -226,7 +226,7 @@
MisPkgs=(PkgName="CameraPanTilt",Location=(Y=0.0,X=0.12799986,Z=-0.21599978),PkgClass=Class'USARMisPkg.CameraPanTilt')
Cameras=(ItemClass=class'USARBot.RobotCamera',ItemName="Camera",Parent="CameraPanTilt_Link2",Position=(Y=-0.04,X=0.06,Z=-0.0088),Direction=(Y=0.0,Z=0.0,X=0.0)) ; Left Eye
Cameras=(ItemClass=class'USARBot.RobotCamera',ItemName="Camera",Parent="CameraPanTilt_Link2",Position=(Y=0.04,X=0.06,Z=-0.0088),Direction=(Y=0.0,Z=0.0,X=0.0)) ; Right Eye
-HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="Headlight",Parent="CameraPanTilt_Link2",Position=(Y=0.0,X=0.079999916,Z=0.06399993),Direction=(Y=0.0,Z=0.0,X=0.0),LightGlow=True)
+HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="Headlight",Parent="CameraPanTilt_Link2",Position=(Y=0.0,X=0.079999916,Z=0.06399993),Direction=(Y=0.0,Z=0.0,X=0.0))
Sensors=(ItemClass=class'USARBot.SonarSensor',ItemName="F1",Position=(X=0.14499985,Y=-0.12999986,Z=-0.0),Direction=(Y=0.0,Z=-1.5707964,X=0.0))
Sensors=(ItemClass=class'USARBot.SonarSensor',ItemName="F2",Position=(X=0.1849998,Y=-0.114999875,Z=-0.0),Direction=(Y=0.0,Z=-0.87264335,X=0.0))
Sensors=(ItemClass=class'USARBot.SonarSensor',ItemName="F3",Position=(X=0.21999978,Y=-0.079999916,Z=-0.0),Direction=(Y=0.0,Z=-0.52356684,X=0.0))
@@ -263,7 +263,7 @@
JointParts=(PartName="RearWheel",PartClass=class'USARModels.P2DXSmallTire',DrawScale3D=(X=1.0,Y=0.5,Z=1.0),bSteeringLocked=False,bSuspensionLocked=true,Parent="",JointClass=class'KCarWheelJoint',ParentPos=(Y=0.0,X=-0.1919998,Z=0.167857),ParentAxis=(Z=1.0),ParentAxis2=(Y=1.0),SelfPos=(Z=-0.0),SelfAxis=(Z=1.0),SelfAxis2=(Y=1.0))
MisPkgs=(PkgName="CameraPanTilt",Location=(Y=0.0,X=0.039999958,Z=-0.21599978),PkgClass=Class'USARMisPkg.CameraPanTilt')
Cameras=(ItemClass=class'USARBot.RobotCamera',ItemName="Camera",Parent="CameraPanTilt_Link2",Position=(Y=0.0,X=0.06,Z=-0.0088),Direction=(Y=0.0,Z=0.0,X=0.0))
-HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="HeadLight",Parent="CameraTilt_Link2",Position=(Y=0.0,X=0.079999916,Z=0.06399993),Direction=(Y=0.0,Z=0.0,X=0.0),LightGlow=True)
+HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="HeadLight",Parent="CameraTilt_Link2",Position=(Y=0.0,X=0.079999916,Z=0.06399993),Direction=(Y=0.0,Z=0.0,X=0.0))
Sensors=(ItemClass=class'USARBot.SonarSensor',ItemName="F1",Position=(X=0.114999875,Y=-0.12999986,Z=-0.0),Direction=(Y=0.0,Z=-1.5707964,X=0.0))
Sensors=(ItemClass=class'USARBot.SonarSensor',ItemName="F2",Position=(X=0.15499984,Y=-0.114999875,Z=-0.0),Direction=(Y=0.0,Z=-0.87264335,X=0.0))
Sensors=(ItemClass=class'USARBot.SonarSensor',ItemName="F3",Position=(X=0.1899998,Y=-0.079999916,Z=-0.0),Direction=(Y=0.0,Z=-0.52356684,X=0.0))
@@ -298,7 +298,7 @@
JointParts=(PartName="LeftRWheel",PartClass=class'USARModels.AtrvLTire',DrawScale3D=(X=1.0,Y=1.0,Z=1.0),bSteeringLocked=True,bSuspensionLocked=true,Parent="",JointClass=class'KCarWheelJoint',ParentPos=(Y=-0.2559997,X=-0.1939998,Z=0.1919998),ParentAxis=(Z=1.0),ParentAxis2=(Y=1.0),SelfPos=(Z=-0.0),SelfAxis=(Z=1.0),SelfAxis2=(Y=1.0))
MisPkgs=(PkgName="CameraPanTilt",Location=(Y=0.0,X=0.124,Z=-0.14),PkgClass=Class'USARMisPkg.CameraPanTilt')
Cameras=(ItemClass=class'USARBot.RobotCamera',ItemName="Camera",Parent="CameraPanTilt_Link2",Position=(Y=0.0,X=0.06,Z=-0.0088),Direction=(Y=0.0,Z=0.0,X=0.0))
-HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="HeadLight1",Parent="CameraPanTilt_Link2",Position=(Y=0.0,X=0.079999916,Z=0.06399993),Direction=(Y=0.0,Z=0.0,X=0.0),LightGlow=True)
+HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="HeadLight1",Parent="CameraPanTilt_Link2",Position=(Y=0.0,X=0.079999916,Z=0.06399993),Direction=(Y=0.0,Z=0.0,X=0.0))
Sensors=(ItemClass=class'USARBot.SonarSensor',ItemName="S1",Position=(X=0.33495012,Y=-0.104390375,Z=-0.0),Direction=(Y=0.0,Z=-0.52356684,X=0.0))
Sensors=(ItemClass=class'USARBot.SonarSensor',ItemName="S2",Position=(X=0.34040916,Y=-0.049910426,Z=-0.0),Direction=(Y=0.0,Z=-0.26183134,X=0.0))
Sensors=(ItemClass=class'USARBot.SonarSensor',ItemName="S3",Position=(X=0.3470606,Y=0.0,Z=-0.0),Direction=(Y=0.0,Z=0.0,X=0.0))
@@ -430,6 +430,28 @@
Effecters=(ItemClass=class'USARBot.RFIDReleaser',ItemName="Gun",Position=(X=0.0,Y=0.0,Z=0.0095238),Direction=(x=0.0,y=0.0,z=0.0))
Sensors=(ItemClass=class'USARBot.GroundTruth',ItemName="GroundTruth",Position=(X=0.0,Y=0.0,Z=-0.0),Direction=(Y=0.0,Z=0.0,X=0.0))
+[USARBot.UnitLoader]
+bDebug=False
+Weight=50
+Payload=25
+ChassisMass=100.000000
+MaxTorque=32000.0
+MotorTorque=2400.0
+bMountByUU=False
+JointParts=(PartName="RightFWheel",PartClass=class'USARModels.UnitLoaderTireRight',DrawScale3D=(X=1,Y=1,Z=1),bSuspensionLocked=true,Parent="",JointClass=class'KCarWheelJoint',ParentPos=(Y=0.30,X=0.30,Z=0.2),ParentAxis=(Z=1.0),ParentAxis2=(Y=1.0),SelfPos=(Z=-0.0),SelfAxis=(Z=1.0),SelfAxis2=(Y=1.0))
+JointParts=(PartName="LeftFWheel",PartClass=class'USARModels.UnitLoaderTireLeft',DrawScale3D=(X=1,Y=1,Z=1),bSuspensionLocked=true,Parent="",JointClass=class'KCarWheelJoint',ParentPos=(Y=-0.30,X=0.30,Z=0.2),ParentAxis=(Z=1.0),ParentAxis2=(Y=1.0),SelfPos=(Z=-0.0),SelfAxis=(Z=1.0),SelfAxis2=(Y=1.0))
+JointParts=(PartName="RightRWheel",PartClass=class'USARModels.UnitLoaderTireRight',DrawScale3D=(X=1,Y=1,Z=1),bSuspensionLocked=true,Parent="",JointClass=class'KCarWheelJoint',ParentPos=(Y=0.30,X=-0.30,Z=0.2),ParentAxis=(Z=1.0),ParentAxis2=(Y=1.0),SelfPos=(Z=-0.0),SelfAxis=(Z=1.0),SelfAxis2=(Y=1.0))
+JointParts=(PartName="LeftRWheel",PartClass=class'USARModels.UnitLoaderTireLeft',DrawScale3D=(X=1,Y=1,Z=1),bSuspensionLocked=true,Parent="",JointClass=class'KCarWheelJoint',ParentPos=(Y=-0.30,X=-0.30,Z=0.2),ParentAxis=(Z=1.0),ParentAxis2=(Y=1.0),SelfPos=(Z=-0.0),SelfAxis=(Z=1.0),SelfAxis2=(Y=1.0))
+JointParts=(PartName="Light",PartClass=class'USARModels.SpinLight',DrawScale3D=(X=1,Y=1,Z=1),Parent="",JointClass=class'USARBot.KSpinHinge',ParentPos=(Y=0.0,X=0.45,Z=-1.33),ParentAxis=(Z=1.0),ParentAxis2=(Y=1.0),SelfPos=(Z=-0.0),SelfAxis=(Z=1.0),SelfAxis2=(Y=1.0))
+MisPkgs=(PkgName="UnitLoaderTop",Location=(Y=0,X=-0.17,Z=-0.32),PkgClass=Class'USARMisPkg.UnitLoaderTop')
+MisPkgs=(PkgName="CameraPanTilt",Location=(Y=0,X=0.6,Z=-.55),PkgClass=Class'USARMisPkg.CameraPanTilt')
+Cameras=(ItemClass=class'USARBot.RobotCamera',ItemName="Camera",Parent="CameraPanTilt_Link2",Position=(Y=0.0,X=0.06,Z=-0.0088),Direction=(Y=0.0,Z=0.0,X=0.0))
+Sensors=(ItemClass=class'USARBot.GroundTruth',ItemName="GroundTruth",Position=(X=0.0,Y=0.0,Z=-0.0),Direction=(Y=0.0,Z=0.0,X=0.0))
+Sensors=(ItemClass=class'USARBot.INSSensor',ItemName="INS",Position=(X=0.0,Y=0.0,Z=-0.0),Direction=(x=0.0,y=0.0,z=0.0))
+Sensors=(ItemClass=class'USARModels.SICKLMS',ItemName="Scanner1",Position=(X=0.875,Y=0.0,Z=0.1),Direction=(Y=0.0,Z=0.0,X=0.0))
+Sensors=(ItemClass=class'USARModels.SICKLMS',ItemName="Scanner2",Position=(X=-0.75,Y=0.0,Z=-0.3),Direction=(Y=0.0,Z=3.145,X=0.0))
+Effecters=(ItemClass=class'USARBot.Roller',ItemName="Roller",Parent="UnitLoaderTop_Link1",Position=(Y=0.0,X=0.0,Z=-0.1),Direction=(Y=0.0,Z=0.0,X=0.0))
+
[USARBot.Hummer]
bDebug=False
Weight=50
@@ -445,7 +467,7 @@
MisPkgs=(PkgName="CameraPanTilt",Location=(Y=0.00857142,X=0.7857136,Z=-1.047237),PkgClass=Class'USARMisPkg.CameraPanTilt')
Cameras=(ItemClass=class'USARBot.RobotCamera',ItemName="Camera",Parent="CameraPanTilt_Link2",Position=(Y=0.0,X=0.06,Z=-0.0088),Direction=(Y=0.0,Z=0.0,X=0.0))
Sensors=(ItemClass=class'USARModels.SICKLMS',ItemName="Scanner1",Position=(X=1.8133314,Y=0.00857142,Z=-0.5523804),Direction=(Y=0.0,Z=0.0,X=0.0))
-HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="HeadLight",Parent="",Position=(Y=0.00857142,X=1.7238077,Z=-0.7485706),Direction=(Y=-0.479369,Z=0.0,X=0.0),LightGlow=True)
+HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="HeadLight",Parent="",Position=(Y=0.00857142,X=1.7238077,Z=-0.7485706),Direction=(Y=-0.479369,Z=0.0,X=0.0))
Sensors=(ItemClass=class'USARBot.GroundTruth',ItemName="GroundTruth",Position=(X=0.0,Y=0.0,Z=-0.0),Direction=(Y=0.0,Z=0.0,X=0.0))
[USARBot.SnowStorm]
@@ -466,7 +488,7 @@
Sensors=(ItemClass=class'USARBot.GPSSensor',ItemName="GPS",Position=(X=0.0,Y=0.0,Z=-1.0),Direction=(x=0.0,y=0.0,z=0.0))
Sensors=(ItemClass=class'USARBot.INSSensor',ItemName="Compass",Position=(X=0.0,Y=0.0,Z=-0.0),Direction=(X=0.0,Z=1.5664821,Y=0.0))
Sensors=(ItemClass=class'USARModels.SICKLMS',ItemName="Scanner1",Position=(X=1.8133314,Y=0.00857142,Z=-0.5523804),Direction=(Y=0.0,Z=0.0,X=0.0))
-HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="HeadLight",Parent="",Position=(Y=0.00857142,X=1.7238077,Z=-0.7485706),Direction=(Y=-0.479369,Z=0.0,X=0.0),LightGlow=True)
+HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="HeadLight",Parent="",Position=(Y=0.00857142,X=1.7238077,Z=-0.7485706),Direction=(Y=-0.479369,Z=0.0,X=0.0))
[USARBot.Sedan]
bDebug=False
@@ -510,7 +532,7 @@
MisPkgs=(PkgName="CameraPanTilt",Location=(Y=0.0,X=0.83809435,Z=-0.420571),PkgClass=Class'USARMisPkg.UnderwaterCameraPanTilt')
Cameras=(ItemClass=class'USARBot.RobotCamera',ItemName="Camera",Parent="CameraPanTilt_Link2",Position=(Y=0.0,X=0.06,Z=-0.0088),Direction=(Y=0.0,Z=0.0,X=0.0))
Sensors=(ItemClass=class'USARModels.Pinger',ItemName="Scanner1",Position=(X=-0.9904752,Y=0.0,Z=0.42476144),Direction=(Y=-1.5707964,Z=0.0,X=0.0))
-HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="HeadLight",Parent="",Position=(Y=0.0,X=2.0857122,Z=-0.0),Direction=(Y=0.0,Z=0.0,X=0.0),LightGlow=True)
+HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="HeadLight",Parent="",Position=(Y=0.0,X=2.0857122,Z=-0.0),Direction=(Y=0.0,Z=0.0,X=0.0))
Sensors=(ItemClass=class'USARBot.GroundTruth',ItemName="GroundTruth",Position=(X=0.0,Y=0.0,Z=-0.0),Direction=(Y=0.0,Z=0.0,X=0.0))
[USARBot.AirRobot]
@@ -573,7 +595,7 @@
Sensors=(ItemClass=Class'USARBot.AccelerationSensor',Parent=,ItemName="ACC",Position=(X=0.0,Y=0.0,Z=-0.0),direction=(Y=0.0,Z=0.0,X=0.0))
Sensors=(ItemClass=Class'USARBot.BallHSensor',Parent="HC",ItemName="BHS",Position=(X=0.076000005,Y=0.0,Z=0.016),direction=(Y=0.0,Z=0.0,X=0.0))
Cameras=(ItemClass=Class'USARBot.AIBOCamera',Parent="HC",ItemName="Camera",Position=(X=0.076000005,Y=0.0,Z=0.016),direction=(Y=0.0,Z=0.0,X=0.0))
-Headlights=(ItemClass=None,Parent=,ItemName=,Position=(X=0.0,Y=0.0,Z=-0.0),direction=(Y=0.0,Z=0.0,X=0.0),LightGlow=True)
+Headlights=(ItemClass=None,Parent=,ItemName=,Position=(X=0.0,Y=0.0,Z=-0.0),direction=(Y=0.0,Z=0.0,X=0.0))
[USARBot.QRIO]
msgTimer=0.2
@@ -629,7 +651,7 @@
JointParts=(PartName="RRTrack",PartClass=class'USARModels.SoryuTrack',DrawScale3D=(X=1.0,Y=1.0,Z=1.0),bSteeringLocked=True,bSuspensionLocked=true,Parent="RearCarPitch",JointClass=class'KCarWheelJoint',ParentPos=(Y=0.054287,X=0.12143,Z=0.0),ParentAxis=(Z=1.0),ParentAxis2=(Y=1.0),SelfPos=(Z=-0.0),SelfAxis=(Z=1.0),SelfAxis2=(Y=1.0))
JointParts=(PartName="LRTrack",PartClass=class'USARModels.SoryuTrack',DrawScale3D=(X=1.0,Y=1.0,Z=1.0),bSteeringLocked=True,bSuspensionLocked=true,Parent="RearCarPitch",JointClass=class'KCarWheelJoint',ParentPos=(Y=-0.054287,X=0.12143,Z=0.0),ParentAxis=(Z=1.0),ParentAxis2=(Y=1.0),SelfPos=(Z=-0.0),SelfAxis=(Z=1.0),SelfAxis2=(Y=1.0))
Cameras=(ItemClass=class'USARBot.RobotCamera',ItemName="Camera",Parent="FrontCarPitch",Position=(Y=0.0,X=0.15715,Z=0),Direction=(Y=0.0,Z=0.0,X=0.0))
-HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="Headlight",Parent="FrontCarPitch",Position=(Y=0.0,X=0.15715,Z=0.0),Direction=(Y=-0.5,Z=0.0,X=0.0),LightGlow=True)
+HeadLights=(ItemClass=class'USARBot.USARHeadLight',ItemName="Headlight",Parent="FrontCarPitch",Position=(Y=0.0,X=0.15715,Z=0.0),Direction=(Y=-0.5,Z=0.0,X=0.0))
[USARBot.Kurt2D]
bDebug=False
Modified: trunk/usarsim/System/USARMisPkg.ini
===================================================================
--- trunk/usarsim/System/USARMisPkg.ini 2007-10-26 04:16:10 UTC (rev 860)
+++ trunk/usarsim/System/USARMisPkg.ini 2007-10-29 18:21:44 UTC (rev 861)
@@ -60,6 +60,12 @@
Links=(LinkNumber=3,LinkClass=Class'USARMisPkg.TeleMaxAuxWheel',DrawScale3D=(X=1.0,Y=1.0,Z=1.0),ParentLinkNumber=1,ParentMount="C",SelfMount="A")
Links=(LinkNumber=4,LinkClass=Class'USARMisPkg.TeleMaxAuxWheel',DrawScale3D=(X=1.0,Y=1.0,Z=1.0),ParentLinkNumber=1,ParentMount="D",SelfMount="A")
+;--------------------------------------------------------------------------------------------------------------
+; Table Mission Package for the UnitLoader
+;--------------------------------------------------------------------------------------------------------------
+[USARMisPkg.UnitLoaderTop]
+Links=(LinkNumber=1,LinkClass=Class'USARMisPkg.UnitLoaderTable',DrawScale3D=(X=1.0,Y=1.0,Z=1.0),ParentLinkNumber=-1,ParentMount="B",SelfMount="A")
+
;--------------------------------------------------------------------------------------------------------------
; Camera Pan/Tilt mission package used for the AirRobot
;--------------------------------------------------------------------------------------------------------------
@@ -284,6 +290,20 @@
MaxRange=0
;--------------------------------------------------------------------------------------------------------------
+; UnitLoader Links used for the USARMisPkg.UnitLoader mission package
+;--------------------------------------------------------------------------------------------------------------
+[USARMisPkg.UnitLoaderTable]
+MountPoints=(Name="A",JointType="Scissor",Location=(X=0,Y=0,Z=-0.15),Orientation=(X=0.0,Y=-1.5707963267948966192313216916398,Z=0.0))
+MountPoints=(Name="B",JointType="Scissor",Location=(X=0,Y=0,Z=-1.15),Orientation=(X=0.0,Y=-1.5707963267948966192313216916398,Z=0.0))
+; max translation speed in m/s
+MaxSpeed=0.5
+MaxTorque=300
+; MinRange should always be zero - for prismatic joints
+; MaxRange defines how far along the Z-Axis the part can move - for prismatic joints
+MinRange=0
+MaxRange=0.8
+
+;--------------------------------------------------------------------------------------------------------------
; Camera Links used for the USARMisPkg.AirRobotCameraPanTilt mission package
;--------------------------------------------------------------------------------------------------------------
[USARMisPkg.AirRobotCameraBase]
Modified: trunk/usarsim/USARBot/Classes/Effecter.uc
===================================================================
--- trunk/usarsim/USARBot/Classes/Effecter.uc 2007-10-26 04:16:10 UTC (rev 860)
+++ trunk/usarsim/USARBot/Classes/Effecter.uc 2007-10-29 18:21:44 UTC (rev 861)
@@ -1,43 +1,50 @@
-class Effecter extends Item abstract;
-
-function String GetConfHead()
-{
- local string outstring;
-
- outstring="CONF {Type "$ItemType$"}";
-
- return outstring;
-}
-
-function String GetConfData()
-{
- return "{Name "$ItemName$"}";
-}
-
-function string GetGeoHead()
-{
- local string outstring;
-
- outstring="GEO {Type "$ItemType$"}";
-
- return outstring;
-}
-
-function string GetGeoData()
-{
- local string outstring;
-
- if (converter==None)
- outstring="{Name "$ItemName$" Location "$(Location-Base.Location)$" Orientation "$(Rotation-Base.Rotation)$" Mount "$ItemMount$"}";
- else
- outstring="{Name "$ItemName$" Location "$(converter.Str_LengthVectorFromUU(Location-Base.Location))
- $" Orientation "$(converter.Str_RotatorFromUU(Rotation-Base.Rotation))
- $" Mount "$ItemMount$"}";
- return outstring;
-}
-
-defaultproperties
-{
- ItemType="Effecter"
- bHidden=true
+class Effecter extends Item abstract;
+
+var String confType;
+var float minVal;
+var float maxVal;
+
+function String GetConfHead()
+{
+ local string outstring;
+
+ outstring="CONF {Type "$ItemType$"}";
+
+ return outstring;
+}
+
+function String GetConfData()
+{
+ if(confType=="")
+ return "{Name "$ItemName$"}";
+ else
+ return "{Name "$ItemName$"} {Cmd \""$confType$"\"} {MaxVal "$maxVal$"} {MinVal "$minVal$"}";
+}
+
+function string GetGeoHead()
+{
+ local string outstring;
+
+ outstring="GEO {Type "$ItemType$"}";
+
+ return outstring;
+}
+
+function string GetGeoData()
+{
+ local string outstring;
+
+ if (converter==None)
+ outstring="{Name "$ItemName$" Location "$(Location-Base.Location)$" Orientation "$(Rotation-Base.Rotation)$" Mount "$ItemMount$"}";
+ else
+ outstring="{Name "$ItemName$" Location "$(converter.Str_LengthVectorFromUU(Location-Base.Location))
+ $" Orientation "$(converter.Str_RotatorFromUU(Rotation-Base.Rotation))
+ $" Mount "$ItemMount$"}";
+ return outstring;
+}
+
+defaultproperties
+{
+ ItemType="Effecter"
+ bHidden=true
}
\ No newline at end of file
Modified: trunk/usarsim/USARBot/Classes/KRobot.uc
===================================================================
--- trunk/usarsim/USARBot/Classes/KRobot.uc 2007-10-26 04:16:10 UTC (rev 860)
+++ trunk/usarsim/USARBot/Classes/KRobot.uc 2007-10-29 18:21:44 UTC (rev 861)
@@ -1,2707 +1,2707 @@
-class KRobot extends KVehicle config(USARBot) abstract;
-
-////////////////////////////////////////////////
-// PHYSICAL ROBOT
-////////////////////////////////////////////////
-
-// Part Definiens
-struct JointPart {
- // Part
- var() name PartName;
- var() class<KActor> PartClass;
- var() vector DrawScale3D;
-
- // Joint
- var() class<KConstraint> JointClass;
- var() bool bSteeringLocked;
- var() bool bSuspensionLocked;
- var() float BrakeTorque;
- var() name Parent;
- var() vector ParentPos;
- //var() rotator ParentRot;
- var() vector ParentAxis;
- var() vector ParentAxis2;
- var() vector SelfPos;
- var() vector SelfAxis;
- var() vector SelfAxis2;
-};
-var config array<JointPart> JointParts;
-
-// Mission Package Data Structure
-struct MisPkg
-{
- var() name PkgName;
- var() vector Location;
- var() class<MisPkgInfo> PkgClass;
-};
-var config array<MisPkg> MisPkgs;
-
-var array<MisPkgInfo> allMisPkgs; // Holds information about all the mission packages
-var array<MisPkgLinkInfo> allMisPkgsLinks; // Holds information about all the mission packages' links
-
-// Joint Control
-struct JointControl {
- var byte state; // Control state:
- // 0: no commands;
- // 1: new command;
- // 2: finished;
- var float steer; // Steer angle
- var byte order; // Specify the followed value.
- var float value; // Control value:
- // order = 0 , value=absolute angle;
- // order = 1 , value=absolute speed;
- // order = 2 , value=absolute torque;
- // order = 10 , value=relative angle;
- // order = 11 , value=relative speed;
- // order = 12 , value=relative torque;
-
- var byte lastCommandId; // There are new commands if lastCommandId != RS_JointsCommandId
-
- //Variables used only by order = 0 control:
- var float angle; // the desired spining angle. used for order=0 control.
- var int startAng; // the start angle. used for compare spined angle.
-};
-var array<JointControl> JointsControl;
-
-struct RobotSkin
-{
- var string Name;
- var texture Skin;
- var string Comment;
-};
-var config array<RobotSkin> RobotSkins;
-
-//=======================
-// Networking RobotState
-//=======================
-//
-// Replication variables used to update Robot State on clients
-
-var KRBVec RS_ChassisPosition;
-var Quat RS_ChassisQuaternion;
-var KRBVec RS_ChassisLinVel;
-var KRBVec RS_ChassisAngVel;
-
-// dynamic array canot be replicated. So we must use static array here.
-// Here, to make the client and server have the same state, we directly
-// replicate the RigidBodyState. In the KCar class, it replicates the
-// RigidBodyState related to the chassis. I don't know why they use relative
-// state. I had tried to use relative state. But it involves vector and
-// quaternion calculation. We need to calculate the relative pos and relative
-// quat. For relative pos, it's just subtract part's (wheel's) pos from chassis
-// pos. For relative quat, we need to use the third axis, that's
-// Joints[i].KPriAxis1 Cross Joints[i].KSecAxis1), to calculate the relative
-// quat. However, I cannot figure out the correct calculating method for general
-// case, such as connect the y axis of the part to the x axis of the chassis
-// through a joint. ANYWAY, the simplest, most stable and straightforward method
-// is replicating all the (absolute) RigidBodyState. If the server is correct,
-// then the client should also be correct. The only weakness of this method is we
-// need to replicate more data.
-
-var KRBVec RS_PartsPos[32];
-var Quat RS_PartsQuat[32];
-var vector RS_PartsLinVel[32];
-var vector RS_PartsAngVel[32];
-
-var float RS_JointsSteer[32];
-var byte RS_JointsOrder[32];
-var float RS_JointsValue[32];
-var byte RS_JointsCommandId[32];
-
-// It denotes new replicated robot state. VehicleStateReceived will
-// load on client side these new params and set bNewRobotState to true.
-// Should be a boolean but it's a byte that increments at each replication,
-// otherwise replication mechanism would not work becasue bool var would be
-// always true on server (read the code for further details).
-// (using struct wuold be a possible solution to replication, but it's not necessary)
-var byte RS_RobotUpdateId;
-
-//Used to change the robot skin
-var string RS_skinName;
-var byte RS_skinUpdateId;
-
-// -- End Replication variables
-
-// if CacheRobotUpdateId on client is different from RS_RobotUpdateId received from server
-// then ther's a new robot state to be loaded. At this point CacheRobotUpdateId is set
-// equal to RS_RobotUpdateId and bNewRobotState is set to true.
-var byte CacheRobotUpdateId;
-
-var byte CacheSkinUpdateId;
-
-// New RB params were loaded from replication and we must notify
-// Karma to update RB state on client side
-var bool bNewRobotState;
-
-var bool bNewCommand; //only used on server in ProcessCarInput()
-var float NextNetUpdateTime; // Next time we should force an update of vehicles state.
-var float MaxNetUpdateInterval;
-
-// Parts that build a robot (every part has a part a parent and a joint)
-var array<KActor> Parts;
-var array<Actor> Parents;
-var array<KConstraint> Joints;
-
-//========================
-// KCarWheelJoint settings
-//========================
-
-// Steering
-var float SteerPropGap;
-var float SteerTorque;
-var float SteerSpeed;
-
-// KCarWheelSuspension setting
-var float SuspStiffness;
-var float SuspDamping;
-var float SuspHighLimit;
-var float SuspLowLimit;
-var float SuspRef;
-
-// The Max torque for all the joints
-var config float MaxTorque;
-var config float SafeForce;
-var config float ProtectTime;
-
-// KDHinge Joint settings
-var config float HingePropGap;
-
-// KCarWheelJoint defalut working torque
-var config float MotorTorque;
-var config float MotorSpeed;
-var float uuMotorSpeed;
-var config float maxSpinSpeed;
-
-//========================
-// KTire settings
-//========================
-
-var float TireRollFriction;
-var float TireLateralFriction;
-var float TireRollSlip;
-var float TireLateralSlip;
-var float TireMinSlip;
-var float TireSlipRate;
-var float TireSoftness;
-var float TireAdhesion;
-var float TireRestitution;
-//========================
-
-// Robot parameters
-var config float Payload;
-var config float Weight;
-var KRigidBodyState ChassisState;
-var KRigidBodyState TeleportLocation; //!< Used to move the robot with MoveRobot() function.
-var config float ChassisMass;
-var config InterpCurve TorqueCurve; // Engine RPM in, Torque out.
-var float HitSoundThreshold;
-var float WheelRadius;
-var vector Dimensions;
-
-// Flip
-var config float FlipTorque;
-var config float FlipTime;
-var float FlipTimeLeft;
-
-//===============================
-// Items mounted on the robot
-//===============================
-
-// Item mount structure
-struct sItem {
- var class<Actor> ItemClass;
- var name Parent;
- var string ItemName;
- var vector Position;
- var vector Direction;
- var rotator uuDirection;
-};
-
-struct lightItem extends sItem
-{
- var bool LightGlow;
-};
-
-// Sensors
-var config array<sItem> Sensors;
-var config float msgTimer; // Timer used for sending out sensor data
-var array<Sensor> SensorList;
-var array<byte> ProcessedSensors;
-// Effecters
-var config array<sItem> Effecters;
-var array<Effecter> EffecterList;
-
-// Battery
-var config int batteryLife;
-var int startTime;
-var int myLife;
-
-// Headlight
-var config array<lightItem> HeadLights;
-var array<USARHeadlight> HeadlightList;
-var bool bHeadlightOn;
-var byte HeadlightItensity;
-
-// Camera
-var config array<sItem> Cameras;
-var array<RobotCamera> CamList;
-var RobotCamera myCamera;
-var float PanSpeed, TiltSpeed;
-
-// DrawHud Variables (to determine how many screens, which camera, etc...)
-var int viewportMode; // 0 is single view, 1 is dualviewhorizontal, 2 is dualviewvertical, and 3 is quad view
-var int CamsToView[4]; // Store the camera indexes of the camera view to be displayed on the viewport
-var bool bDrawHud;
-
-//=========================
-// Others
-//=========================
-
-// Variables used for programming
-var string RobotName;
-var config bool bDebug;
-var int CurrentPart;
-var config bool bDisplayTeamBeacon;
-var float lastTime, previousTime;
-var vector lastLocation, previousLocation;
-var bool bRobotBuilt;
-var name fpsLogger;
-var config string ConverterClass;
-var USARConverter converter;
-var USARUtils utils;
-var USARDraw Draw;
-var config bool bMountByUU;
-var config float logging_period;
-var config bool bBarCode;
-var float old_time;
-var FileLog PosLog;
-var FileLog CollLog;
-var KSimParams oldKSP, newKSP;
-var name tmpName; // Used to convert string to name
-
-//var bool bstats; //used for bump/touch events.
-//var int bump_touch_cnt;
-
-// MultiView Addon
-var int ViewNum; //Viewport number (assigned by Register()) used by DrawHUD to render the scene
-var MultiView ViewManager; //the actual ViewManager actor (a bot)
-
-//#############################################################################
-// KROBOT CODE
-//#############################################################################
-
-replication
-{
- // We replicate the robot state.
-
- reliable if(Role == ROLE_Authority)
- RS_ChassisPosition, RS_ChassisQuaternion, RS_ChassisLinVel, RS_ChassisAngVel,
- RS_PartsPos, RS_PartsQuat, RS_PartsLinVel, RS_PartsAngVel,RS_RobotUpdateId;
-
- reliable if(Role == ROLE_Authority)
- RS_JointsSteer, RS_JointsOrder, RS_JointsValue, RS_JointsCommandId;
-
- reliable if(Role == ROLE_Authority)
- FlipTimeLeft, bHeadlightOn, RobotName;
-
- reliable if(Role == ROLE_Authority)
- RS_skinName, RS_skinUpdateId, ViewManager, ViewNum;
-}
-
-simulated event PreBeginPlay()
-{
- local class<USARConverter> cClass;
- local int i,j;
-
- Super.PreBeginPlay();
- utils = New class'USARUtils';
- draw = New class'USARDraw';
- bNoTeamBeacon=!bDisplayTeamBeacon;
- cClass = class<USARConverter>(DynamicLoadObject(ConverterClass, class'Class'));
- converter = new cClass;
- ConvertParam(converter);
- if (MotorTorque>MaxTorque)
- MotorTorque = MaxTorque;
-
- // Set up the mission package information (allocate space)
- for(i=0; i<MisPkgs.length; i++)
- {
- allMisPkgs[i] = New MisPkgs[i].PkgClass;
-
- for(j=0; j<allMisPkgs[i].Links.length; j++)
- {
- allMisPkgsLinks[i*allMisPkgs[i].Links.length+j] = New allMisPkgs[i].Links[j].LinkClass;
- }
- }
-
- //Adjust Karma params
- KGetSimParams(oldKSP);
- newKSP = oldKSP;
-
- newKSP.Epsilon = 0.03;
- newKSP.GammaPerSec = 0.5;
-// newKSP.ContactSoftness = 0.001;
- newKSP.MaxPenetration = 1;
- newKSP.PenetrationScale = 5;
-
- KSetSimParams(newKSP);
-}
-
-simulated function ConvertParam(USARConverter converter)
-{
- local int i;
-
- if (converter==None) {
- uuMotorSpeed = MotorSpeed;
- } else {
- uuMotorSpeed = converter.SpinSpeedToUU(MotorSpeed);
- }
- if (!bMountByUU && converter!=None) {
- for (i=0;i<JointParts.length;i++) {
- JointParts[i].ParentPos = converter.LengthVectorToUU(JointParts[i].ParentPos);
- JointParts[i].SelfPos = converter.LengthVectorToUU(JointParts[i].SelfPos);
- }
- for (i=0;i<Headlights.length;i++) {
- HeadLights[i].Position = converter.LengthVectorToUU(HeadLights[i].Position);
- HeadLights[i].uuDirection = converter.RotatorToUU(HeadLights[i].Direction);
- }
- for (i=0;i<Cameras.length;i++) {
- Cameras[i].Position = converter.LengthVectorToUU(Cameras[i].Position);
- Cameras[i].uuDirection = converter.RotatorToUU(Cameras[i].Direction);
- }
- for (i=0;i<Sensors.length;i++) {
- Sensors[i].Position = converter.LengthVectorToUU(Sensors[i].Position);
- Sensors[i].uuDirection = converter.RotatorToUU(Sensors[i].Direction);
- }
- for (i=0;i<Effecters.length;i++) {
- Effecters[i].Position = converter.LengthVectorToUU(Effecters[i].Position);
- Effecters[i].uuDirection = converter.RotatorToUU(Effecters[i].Direction);
- }
- } else {
- for (i=0;i<Headlights.length;i++) {
- HeadLights[i].uuDirection.Roll = int(HeadLights[i].Direction.X);
- HeadLights[i].uuDirection.Pitch = int(HeadLights[i].Direction.Y);
- HeadLights[i].uuDirection.Yaw = int(HeadLights[i].Direction.Z);
- }
- for (i=0;i<Cameras.length;i++) {
- Cameras[i].uuDirection.Roll = int(Cameras[i].Direction.X);
- Cameras[i].uuDirection.Pitch = int(Cameras[i].Direction.Y);
- Cameras[i].uuDirection.Yaw = int(Cameras[i].Direction.Z);
- }
- for (i=0;i<Sensors.length;i++) {
- Sensors[i].uuDirection.Roll = int(Sensors[i].Direction.X);
- Sensors[i].uuDirection.Pitch = int(Sensors[i].Direction.Y);
- Sensors[i].uuDirection.Yaw = int(Sensors[i].Direction.Z);
- }
- for (i=0;i<Effecters.length;i++) {
- Effecters[i].uuDirection.Roll = int(Effecters[i].Direction.X);
- Effecters[i].uuDirection.Pitch = int(Effecters[i].Direction.Y);
- Effecters[i].uuDirection.Yaw = int(Effecters[i].Direction.Z);
- }
- }
-}
-
-// Register to the game
-function Register()
-{
- local USARDeathMatch UsarGame;
- local int Index;
-
- UsarGame = USARDeathMatch(Level.Game);
- Index = UsarGame.Vehicles.length;
- UsarGame.Vehicles.Insert(Index,1);
- UsarGame.Vehicles[Index]=self;
-
- //bstats = UsarGame.bstats;
-
- old_time = startTime;
-
- if(myCamera != none)
- {
- foreach AllActors(class'MultiView', ViewManager) break;
- }
- if(ViewManager != None)
- ViewNum = ViewManager.RegisterView();
- else
- ViewNum = -1;
-}
-
-// Unregister from the game
-function Unregister()
-{
- local USARDeathMatch UsarGame;
- local int i;
-
- UsarGame = USARDeathMatch(Level.Game);
- for (i=0;i<UsarGame.Vehicles.length;i++) {
- if (UsarGame.Vehicles[i]==self) {
- UsarGame.Vehicles.Remove(i,1);
- break;
- }
- }
- if(ViewManager != None)
- {
- ViewManager.DeleteView(ViewNum);
- }
-}
-
-// When new information is received, see if its new. If so, pass bits off the the wheels.
-// Each part will then update its rigid body position via the KUpdateState event.
-// JTODO: This is where clever unpacking would happen.
-simulated event VehicleStateReceived()
-{
- local KTire Tire;
- local KDPart Part;
- local int i;
- local bool UpdateParts;
-
- /*
- KGetRigidBodyState(ChassisState);
- log("State<<"@ChassisState.Position.X at ChassisState.Position.Y@ChassisState.Position.Z);
- log(" "@ChassisState.Quaternion.X at ChassisState.Quaternion.Y@ChassisState.Quaternion.Z at ChassisState.Quaternion.W);
- log(" "@ChassisState.LinVel.X at ChassisState.LinVel.Y@ChassisState.LinVel.Z);
- log(" "@ChassisState.AngVel.X at ChassisState.AngVel.Y@ChassisState.AngVel.Z@">>");
-
- log("Receive<<"@RS_ChassisPosition.X at RS_ChassisPosition.Y@RS_ChassisPosition.Z);
- log(" "@RS_ChassisQuaternion.X at RS_ChassisQuaternion.Y@RS_ChassisQuaternion.Z);
- log(" "@RS_ChassisLinVel.X at RS_ChassisLinVel.Y@RS_ChassisLinVel.Z);
- log(" "@RS_ChassisAngVel.X at RS_ChassisAngVel.Y@RS_ChassisAngVel.Z@">>");
- */
-
- // Don't do anything if vehicle isn't started up.
- if(!bRobotBuilt) {
- if(Parts.length == 0)
- return;
- for (i=0; i<Parts.length; i++)
- if (Parts[i] == None) return;
- bRobotBuilt = true;
- }
-
- //Serves a skin update request
- if(cacheSkinUpdateId != RS_skinUpdateId)
- {
- SetSkin(RS_skinName);
- cacheSkinUpdateId = RS_skinUpdateId;
- }
-
- ///////////////////////////
- // Update root chassis info
- ///////////////////////////
- if (CacheRobotUpdateId != RS_RobotUpdateId)
- {
- ChassisState.Position = RS_ChassisPosition;
- ChassisState.Quaternion = RS_ChassisQuaternion;
- ChassisState.LinVel = RS_ChassisLinVel;
- ChassisState.AngVel = RS_ChassisAngVel;
- UpdateParts = true;
- CacheRobotUpdateId = RS_RobotUpdateId;
- bNewRobotState = true;
- }
-
- // Figure out new state of parts
- for (i=0;i<Parts.length;i++) {
-
- ///////////////////////////
- // Update Parts
- ///////////////////////////
- if (UpdateParts)
- {
- if (Parts[i].IsA('KTire'))
- {
- Tire = KTire(Parts[i]);
- Tire.KGetRigidBodyState(Tire.ReceiveState);
-
- Tire.ReceiveState.Position = RS_PartsPos[i];
- Tire.ReceiveState.Quaternion = RS_PartsQuat[i];
- Tire.ReceiveState.LinVel = KRBVecFromVector(RS_PartsLinVel[i]);
- Tire.ReceiveState.AngVel = KRBVecFromVector(RS_PartsAngVel[i]);
- Tire.bReceiveStateNew = true;
- }
- else if (Parts[i].IsA('KDPart'))
- {
- Part = KDPart(Parts[i]);
- Part.KGetRigidBodyState(Part.ReceiveState);
-
- Part.ReceiveState.Position = RS_PartsPos[i];
- Part.ReceiveState.Quaternion = RS_PartsQuat[i];
- Part.ReceiveState.LinVel = KRBVecFromVector(RS_PartsLinVel[i]);
- Part.ReceiveState.AngVel = KRBVecFromVector(RS_PartsAngVel[i]);
- Part.bReceiveStateNew = true;
- }
- }
-
- ///////////////////////////
- // Update Commands
- ///////////////////////////
- if (JointsControl[i].lastCommandId!=RS_JointsCommandId[i]) {
- JointsControl[i].steer = RS_JointsSteer[i];
- JointsControl[i].order = RS_JointsOrder[i];
- JointsControl[i].value = RS_JointsValue[i];
- JointsControl[i].state = 1;
- JointsControl[i].lastCommandId = RS_JointsCommandId[i];
- }
- }
-}
-
-// This only update the chassis. The parts update themselves.
-simulated event bool KUpdateState(out KRigidBodyState newState)
-{
- // This should never get called on the server - but just in case!
- if(Role == ROLE_Authority)
- {
- if(!bNewRobotState)
- return false;
- else
- {
- // bNewRobotState will be true on server only if we're trying
- // to teleport the robot from one location to another.
- newState = TeleportLocation;
- bNewRobotState = false;
- return true;
- }
- }
- // Apply received data as new position of car chassis.
- newState = ChassisState;
- bNewRobotState = false;
- return true;
-}
-
-// Pack current state of whole car into the state struct, to be sent to the client.
-// Should only get called on the server.
-function PackState()
-{
- local KRigidBodyState RBState;
- local int i;
- local bool UpdateParts;
-
- if(!KIsAwake() && !bNewCommand)
- return; // Never send updates if physics is at rest
-
- if(Level.TimeSeconds > NextNetUpdateTime)
- {
- ///////////////////////////
- // Pack Chassis state
- ///////////////////////////
- KGetRigidBodyState(RBState);
- RS_ChassisPosition = RBState.Position;
- RS_ChassisQuaternion = RBState.Quaternion;
- RS_ChassisLinVel = RBState.LinVel;
- RS_ChassisAngVel = RBState.AngVel;
- UpdateParts = true;
- RS_RobotUpdateId += 1;
- NextNetUpdateTime = Level.TimeSeconds + MaxNetUpdateInterval;
- }
-
- // Get each part's state.
- for (i=0;i<Parts.length;i++) {
- ///////////////////////////
- // Pack Parts State
- ///////////////////////////
- if(UpdateParts)
- {
- Parts[i].KGetRigidBodyState(RBState);
- RS_PartsPos[i] = RBState.Position;
- RS_PartsQuat[i] = RBState.Quaternion;
- RS_PartsLinVel[i] = KRBVecToVector(RBState.LinVel);
- RS_PartsAngVel[i] = KRBVecToVector(RBState.AngVel);
- }
- ///////////////////////////
- // Pack Commands State
- ///////////////////////////
-
- if (JointsControl[i].state==1)
- {
- RS_JointsCommandId[i]+=1;
- RS_JointsSteer[i] = JointsControl[i].steer;
- RS_JointsOrder[i] = JointsControl[i].order;
- RS_JointsValue[i] = JointsControl[i].value;
- }
- }
-}
-
-function RobotCamera GetCamera(String name)
-{
- local int i;
-
- for (i=0;i<CamList.length;i++)
- if (CamList[i].ItemName==name)
- return CamList[i];
-
- return myCamera;
-}
-
-simulated function Actor FindPart(name PartName)
-{
- local int i;
-
- if (PartName == '' || PartName == 'None') return self;
-
- for (i=0;i<JointParts.length;i++) {
- if (JointParts[i].PartName == PartName) {
- return Parts[i];
- }
- }
- return None;
-}
-
-simulated function int FindLinkParent(MisPkgInfo Package, int ParentLinkNumber)
-{
- local int i;
-
- for(i=0; i<Package.Links.length; i++)
- {
- if(Package.Links[i].LinkNumber == ParentLinkNumber)
- {
- return i;
- }
- }
- return -1;
-}
-
-simulated function MisPkgLinkInfo getMisPkgLinkInfo(int PartNumber, string MisPkgName)
-{
- local int i,j;
-
- if(MisPkgName == "")
- {
- for(i=0; i<allMisPkgs.Length; i++)
- {
- for(j=0; j<allMisPkgs[i].Links.Length; j++)
- {
- if(allMisPkgs[i].Links[j].LinkNumber == PartNumber)
- {
- return allMisPkgsLinks[i*allMisPkgs[i].Links.length+j];
- }
- }
- }
- }
- else
- {
- for(i=0; i<MisPkgs.Length; i++)
- {
- if(string(MisPkgs[i].PkgName) == MisPkgName)
- {
- for(j=0; j<allMisPkgs[i].Links.Length; j++)
- {
- if(allMisPkgs[i].Links[j].LinkNumber == PartNumber)
- {
- return allMisPkgsLinks[i*allMisPkgs[i].Links.length+j];
- }
- }
-
- break;
- }
- }
- }
-
- return None;
-}
-
-simulated function int FindMisPkgLinkIndex(Name LinkName)
-{
- local int i;
-
- for(i=0; i<Joints.Length; i++)
- {
- if(JointParts[i].PartName == LinkName)
- {
- return i;
- }
- }
- return -1;
-}
-
-simulated function name getMisPkgPartName_str(string PkgName, int LinkNumber)
-{
- tmpName = '';
-
- if(LinkNumber >= 0)
- {
- SetPropertyText("tmpName", PkgName $ "_Link" $ string(LinkNumber));
- }
-
- return tmpName;
-}
-
-simulated function name getMisPkgPartName(Name PkgName, int LinkNumber)
-{
- tmpName = '';
-
- if(LinkNumber >= 0)
- {
- SetPropertyText("tmpName", string(PkgName) $ "_Link" $ string(LinkNumber));
- }
-
- return tmpName;
-}
-
-simulated function int getLinkNumber(string strLink)
-{
- return int(Right(strLink, Len(strLink) - (InStr(strLink, "Link") + 4)));
-}
-
-simulated function string getMisPkgName(string strLink)
-{
- return Left(strLink, InStr(strLink, "_Link"));
-}
-
-simulated function PostNetBeginPlay()
-{
- local int i, j;
- local Actor Parent;
- local vector RotX, RotY, RotZ, offset;
- local sItem headlight;
-
- Super.PostNetBeginPlay();
-
- // Turn the information about the mission packages into joint parts
- for(i=0; i<allMisPkgs.Length; i++)
- {
- for(j=0; j<allMisPkgs[i].Links.length; j++)
- {
- JointParts.Insert(JointParts.length, 1); // Make space in the dynamic array to add a part from the mission package
- JointParts[JointParts.length - 1].PartName = getMisPkgPartName(MisPkgs[i].PkgName, allMisPkgs[i].Links[j].LinkNumber);
- JointParts[JointParts.length - 1].PartClass = allMisPkgsLinks[i*allMisPkgs[i].Links.length+j].ModelClass;
- JointParts[JointParts.length - 1].DrawScale3D = allMisPkgs[i].Links[j].DrawScale3D;
- JointParts[JointParts.length - 1].bSteeringLocked = true;
- JointParts[JointParts.length - 1].bSuspensionLocked = true;
- JointParts[JointParts.length - 1].BrakeTorque = 0;
- JointParts[JointParts.length - 1].Parent = getMisPkgPartName(MisPkgs[i].PkgName, allMisPkgs[i].Links[j].ParentLinkNumber);
-
- if(Caps(allMisPkgsLinks[i*allMisPkgs[i].Links.length+j].getMountPointJointType(allMisPkgs[i].Links[j].SelfMount)) == "REVOLUTE")
- {
- JointParts[JointParts.length - 1].JointClass = class'USARBot.KDHinge';
-
- if(j == 0)
- JointParts[JointParts.length - 1].ParentPos = converter.LengthVectorToUU(MisPkgs[i].Location);
- else
- JointParts[JointParts.length - 1].ParentPos = converter.LengthVectorToUU(allMisPkgsLinks[i*allMisPkgs[i].Links.length+FindLinkParent(allMisPkgs[i], allMisPkgs[i].Links[j].ParentLinkNumber)].getMountPointLocation(allMisPkgs[i].Links[j].ParentMount) * allMisPkgs[i].Links[FindLinkParent(allMisPkgs[i], allMisPkgs[i].Links[j].ParentLinkNumber)].DrawScale3D);
-
- JointParts[JointParts.length - 1].ParentAxis = (Vect(0,0,-1) >> converter.RotatorToUU(allMisPkgsLinks[i*allMisPkgs[i].Links.length+j].getMountPointOrientation(allMisPkgs[i].Links[j].SelfMount))) * Vect(-1,-1,-1);
- JointParts[JointParts.length - 1].SelfAxis = JointParts[JointParts.length - 1].ParentAxis;
- JointParts[JointParts.length - 1].ParentAxis2 = (Vect(0,1,0) >> converter.RotatorToUU(allMisPkgsLinks[i*allMisPkgs[i].Links.length+j].getMountPointOrientation(allMisPkgs[i].Links[j].SelfMount))) * Vect(-1,-1,-1);
- JointParts[JointParts.length - 1].SelfAxis2 = JointParts[JointParts.length - 1].ParentAxis2;
-
- JointParts[JointParts.length - 1].SelfPos = converter.LengthVectorToUU(allMisPkgsLinks[i*allMisPkgs[i].Links.length+j].getMountPointLocation(allMisPkgs[i].Links[j].SelfMount) * allMisPkgs[i].Links[j].DrawScale3D);
- }
- else if(Caps(allMisPkgsLinks[i*allMisPkgs[i].Links.length+j].getMountPointJointType(allMisPkgs[i].Links[j].SelfMount)) == "PRISMATIC")
- {
- JointParts[JointParts.length - 1].JointClass = class'USARBot.KSlider';
-
- if(j == 0)
- JointParts[JointParts.length - 1].ParentPos = converter.LengthVectorToUU(MisPkgs[i].Location - (allMisPkgsLinks[i*allMisPkgs[i].Links.length+j].getMountPointLocation(allMisPkgs[i].Links[j].SelfMount) * allMisPkgs[i].Links[j].DrawScale3D));
- else
- JointParts[JointParts.length - 1].ParentPos = converter.LengthVectorToUU((allMisPkgsLinks[i*allMisPkgs[i].Links.length+FindLinkParent(allMisPkgs[i], allMisPkgs[i].Links[j].ParentLinkNumber)].getMountPointLocation(allMisPkgs[i].Links[j].ParentMount) * allMisPkgs[i].Links[FindLinkParent(allMisPkgs[i], allMisPkgs[i].Links[j].ParentLinkNumber)].DrawScale3D) - (allMisPkgsLinks[i*allMisPkgs[i].Links.length+j].getMountPointLocation(allMisPkgs[i].Links[j].SelfMount) * allMisPkgs[i].Links[j].DrawScale3D));
-
- JointParts[JointParts.length - 1].ParentAxis = (Vect(0,1,0) >> converter.RotatorToUU(allMisPkgsLinks[i*allMisPkgs[i].Links.length+j].getMountPointOrientation(allMisPkgs[i].Links[j].SelfMount))) * Vect(-1,-1,-1);
- JointParts[JointParts.length - 1].SelfAxis = JointParts[JointParts.length - 1].ParentAxis;
- JointParts[JointParts.length - 1].ParentAxis2 = (Vect(1,0,0) >> converter.RotatorToUU(allMisPkgsLinks[i*allMisPkgs[i].Links.length+j].getMountPointOrientation(allMisPkgs[i].Links[j].SelfMount))) * Vect(-1,-1,-1);
- JointParts[JointParts.length - 1].SelfAxis2 = JointParts[JointParts.length - 1].ParentAxis2;
-
- JointParts[JointParts.length - 1].SelfPos = converter.LengthVectorToUU(-allMisPkgsLinks[i*allMisPkgs[i].Links.length+j].MaxRange * (Vect(0,0,-1) >> converter.RotatorToUU(allMisPkgsLinks[i*allMisPkgs[i].Links.length+j].getMountPointOrientation(allMisPkgs[i].Links[j].SelfMount))));
- }
- }
- }
-
- ////////////////////////////////
- // Create physical robot
- ////////////////////////////////
- for (CurrentPart=0;CurrentPart<JointParts.length;CurrentPart++) {
- // Find parent
- Parent = FindPart(JointParts[CurrentPart].Parent);
- if (Parent==None) continue;
- Parents[CurrentPart] = Parent;
- if (bDebug) log("<"@Parent at Parent.Location@Parent.Rotation@">");
- GetAxes(Parent.Rotation,RotX,RotY,RotZ);
-
- //Spawn Joint (any KConstraint class)
- Joints[CurrentPart] = spawn(JointParts[CurrentPart].JointClass,Parent);
-
- if (Joints[CurrentPart].IsA('KSlider')) {
- KSlider(Joints[CurrentPart]).init1(Parent,JointParts[CurrentPart].ParentPos,JointParts[CurrentPart].ParentAxis,JointParts[CurrentPart].ParentAxis2,
- JointParts[CurrentPart].SelfPos,JointParts[CurrentPart].SelfAxis,JointParts[CurrentPart].SelfAxis2);
- offset = JointParts[CurrentPart].ParentPos - JointParts[CurrentPart].SelfPos;
- Parts[CurrentPart] = spawn(JointParts[CurrentPart].PartClass, KSlider(Joints[CurrentPart]).Part2,, Parent.Location + offset.X*RotX + offset.Y*RotY + offset.Z*RotZ,Parent.Rotation);
- Parts[CurrentPart].SetDrawScale3D(JointParts[CurrentPart].DrawScale3D);
- log("Init"@Joints[CurrentPart]);
- KSlider(Joints[CurrentPart]).init2(JointParts[CurrentPart].ParentPos,JointParts[CurrentPart].ParentAxis,JointParts[CurrentPart].ParentAxis2,
- Parts[CurrentPart],JointParts[CurrentPart].SelfPos,JointParts[CurrentPart].SelfAxis,JointParts[CurrentPart].SelfAxis2);
- } else {
- //Spawn Part
- offset = JointParts[CurrentPart].ParentPos - JointParts[CurrentPart].SelfPos;
- Parts[CurrentPart] = spawn(JointParts[CurrentPart].PartClass, Parent,, Parent.Location + offset.X*RotX + offset.Y*RotY + offset.Z*RotZ,Parent.Rotation);
- Parts[CurrentPart].SetDrawScale3D(JointParts[CurrentPart].DrawScale3D);
-
- //Set primary constraint params
- Joints[CurrentPart].KConstraintActor1 = Parent;
- Joints[CurrentPart].KPos1 = JointParts[CurrentPart].ParentPos/50;
- Joints[CurrentPart].KPriAxis1 = JointParts[CurrentPart].ParentAxis;
- if (VSize(JointParts[CurrentPart].ParentAxis2)>0)
- Joints[CurrentPart].KSecAxis1 = JointParts[CurrentPart].ParentAxis2;
-
- //Set secondary constraint params
- Joints[CurrentPart].KConstraintActor2 = Parts[CurrentPart];
- Joints[CurrentPart].KPos2 = JointParts[CurrentPart].SelfPos/50;
- Joints[CurrentPart].KPriAxis2 = JointParts[CurrentPart].SelfAxis;
- if (VSize(JointParts[CurrentPart].SelfAxis2)>0)
- Joints[CurrentPart].KSecAxis2 = JointParts[CurrentPart].SelfAxis2;
-
- Joints[CurrentPart].SetPhysics(PHYS_Karma);
- }
-
- if (ClassIsChildOf(JointParts[CurrentPart].PartClass,class'KTire') &&
- Joints[CurrentPart].IsA('KCarWheelJoint')) {
- (KTire(Parts[CurrentPart])).WheelJoint = KCarWheelJoint(Joints[CurrentPart]);
- (KTire(Parts[CurrentPart])).WheelJoint.KUpdateConstraintParams();
- if (Joints[CurrentPart].IsA('KSCarWheelJoint')) {
- KSCarWheelJoint(Joints[CurrentPart]).KForceThreshold = SafeForce;
- KSCarWheelJoint(Joints[CurrentPart]).StallTime = ProtectTime;
- }
- } else if (ClassIsChildOf(JointParts[CurrentPart].PartClass,class'USARBot.KDPart'))
- (KDPart(Parts[CurrentPart])).setJoint(Joints[CurrentPart]);
-
- if(Role != ROLE_Authority)
- KarmaParams(Parts[CurrentPart].KParams).bDestroyOnSimError = False;
- }
- if (bDebug) {
- //DumpPackages();
- DumpJoints();
- }
-
- // Initially make sure parameters are sync'ed with Karma
- KVehicleUpdateParams();
-
- // For KImpact event
- KSetImpactThreshold(HitSoundThreshold);
-
- // If this is not 'authority' version - don't destroy it if there is a problem.
- // The network should sort things out.
- if(Role != ROLE_Authority)
- KarmaParams(KParams).bDestroyOnSimError = False;
-
- // init the array size
- JointsControl.length = JointParts.length;
-
- /////////////////////////////////
- // Mount Items
- /////////////////////////////////
-
- // Mount headlights
- for (i=0;i<Headlights.length;i++)
- {
- headlight=Headlights[i]; //spawn won't take variables from lightItem, so temp sItem needs to be used
-
- Parent = FindPart(headlight.Parent);
- if (Parent!=None)
- {
- GetAxes(Parent.Rotation,RotX,RotY,RotZ);
- HeadlightList[i] = USARHeadlight(spawn(headlight.ItemClass,
- Parent,,
- Parent.Location + headlight.Position.X * RotX + headlight.Position.Y * RotY + headlight.Position.Z * RotZ,));
- HeadlightList[i].SetBase(Parent);
- HeadlightList[i].SetRelativeRotation(headlight.uuDirection);
- if(HeadLights[i].LightGlow)HeadlightList[i].spawnGlow();
- }
- }
-
- // Mount cameras
- for (i=0;i<Cameras.length;i++)
- {
- if(i < 4)
- CamsToView[i] = i;
-
- Parent = FindPart(Cameras[i].Parent);
- if (Parent==None) continue;
- GetAxes(Parent.Rotation,RotX,RotY,RotZ);
- CamList[i] = RobotCamera(spawn(Cameras[i].ItemClass, Parent,,
- Parent.Location + Cameras[i].Position.X * RotX + Cameras[i].Position.Y * RotY + Cameras[i].Position.Z * RotZ,
- ));
- CamList[i].init(Cameras[i].ItemName,Parent,Cameras[i].Position,Cameras[i].uuDirection,self,Cameras[i].Parent);
- }
- if (CamList.length>0)
- {
- if(CamList.Length == 1)
- viewportMode = 0;
- else
- viewportMode = 1;
-
- myCamera = CamList[0];
- }
-
- // Mount sensors
- for (i=0;i<Sensors.length;i++) {
- Parent = FindPart(Sensors[i].Parent);
- if (Parent==None) continue;
- GetAxes(Parent.Rotation,RotX,RotY,RotZ);
- SensorList[i] = Sensor(spawn(Sensors[i].ItemClass,
- Parent,,
- Parent.Location + Sensors[i].Position.X * RotX + Sensors[i].Position.Y * RotY + Sensors[i].Position.Z * RotZ,
- ));
- SensorList[i].init(Sensors[i].ItemName,Parent,Sensors[i].Position,Sensors[i].uuDirection,self,Sensors[i].Parent);
- ProcessedSensors[i]=0;
- }
-
- // Mount Effecters
- for (i=0;i<Effecters.length;i++) {
- Parent = FindPart(Effecters[i].Parent);
- if (Parent==None) continue;
- GetAxes(Parent.Rotation,RotX,RotY,RotZ);
- EffecterList[i] = Effecter(spawn(Effecters[i].ItemClass,
- Parent,,
- Parent.Location + Effecters[i].Position.X * RotX + Effecters[i].Position.Y * RotY + Effecters[i].Position.Z * RotZ,
- ));
- EffecterList[i].init(Effecters[i].ItemName,Parent,Effecters[i].Position,Effecters[i].uuDirection,self,Effecters[i].Parent);
- }
-
- Register();
- SetTimer(msgTimer,true);
- startTime = Level.TimeSeconds;
- lastTime = Level.TimeSeconds;
- lastLocation = Location;
-
- //If there's an FPSLogger triggers it
- fpsLogger = 'FPSLog';
- TriggerEvent(fpsLogger, self, None);
-
-}
-
-simulated function SetSkin(string skinName)
-{
- local int i;
- local texture skinTexture;
-
- for(i = 0; i < RobotSkins.Length; i++)
- if(skinName ~= RobotSkins[i].Name)
- {
- skinTexture = RobotSkins[i].Skin;
- break;
- }
- if((i > 0) && (i == RobotSkins.Length))
- skinTexture = RobotSkins[0].Skin; //i>0 assure [0] element existence
-
- if(skinTexture != none)
- {
- Skins[0] = skinTexture;
- for (i = 0; i < Parts.Length; i++)
- {
- Parts[i].Skins[0] = skinTexture;
- }
- }
-
- if(Role == ROLE_Authority)
- {
- RS_skinName = skinName;
- RS_skinUpdateId++;
- }
-}
-
-// dump joints
-function DumpJoints() {
- local int i;
-
- for (i=0;i<Joints.length;i++)
- log(i@"Name"@JointParts[i].PartName@"Part"@Parts[i]@"Joint"@Joints[i]);
-}
-
-simulated event Destroyed()
-{
- local int i;
-
- // Destory mounted items
- for (i=0;i<SensorList.length;i++) SensorList[i].Destroy();
- for (i=0;i<EffecterList.length;i++) EffecterList[i].Destroy();
- for (i=0;i<CamList.length;i++) CamList[i].Destroy();
-
- for (i=0;i<HeadlightList.length;i++) {
- if(HeadlightList[i].bGlowOn) HeadlightList[i].HeadlightGlow.Destroy();
- HeadlightList[i].Destroy(); }
-
- // Destory physical robot
- for (i=0;i<Parts.length;i++) {
- if (Parts[i]!=none) {
- Joints[i].Destroy();
- Parts[i].Destroy();
- }
- }
-
- // Destroy information about mission packages
- while(allMisPkgs.Length!=0)
- {
- allMisPkgs[allMisPkgs.Length-1].Delete();
- allMisPkgs.Remove(allMisPkgs.Length-1, 1);
- }
-
- // Destroy information about mission packages' links
- while(allMisPkgsLinks.Length!=0)
- {
- allMisPkgsLinks[allMisPkgsLinks.Length-1].Delete();
- allMisPkgsLinks.Remove(allMisPkgsLinks.Length-1, 1);
- }
-
- Unregister();
- converter = None;
- utils = None;
- Draw = None;
- UntriggerEvent(fpsLogger, self, None);
- KSetSimParams(oldKSP);
- if (CollLog!=None)
- CollLog.CloseLog();
- if (PosLog!=None)
- PosLog.CloseLog();
- Super.Destroyed();
-}
-
-// For drawing the camera viewports, possible noise, and the bar code
-simulated function DrawHud(Canvas C)
-{
- // If we are using the camera view (bDrawHud is set in ViewTestPlayerController.uc)
- if(bDrawHud)
- {
- // If the robot does not have any more battery
- if (myLife==batteryLife)
- {
- Draw.NoPower(C, ERenderStyle.STY_Particle, 0, 0, C.SizeX, C.SizeY, C.SizeX/2-80, C.SizeY/2);
- }
- // Here, we draw the viewports
- else
- {
- Draw.KRobotCameras(C, viewportMode, CamsToView, ERenderStyle.STY_Particle, CamList, USARRemoteBot(Controller).ShowCamName, USARRemoteBot(Controller).ShowCamTime, Level.TimeSeconds-startTime);
- super.DrawHud(C);
- }
- }
-
- if (bBarCode)
- Draw.BarCode(C, RobotName, 0, C.SizeY-2);
-
-}
-
-// Call this if you change any parameters (tire, suspension etc.) and they
-// will be passed down to each wheel/joint.
-simulated event KVehicleUpdateParams()
-{
- local KTire Part;
- local KCarWheelJoint WheelJ;
- local KDHinge HingeJ;
- local int i;
- local MisPkgLinkInfo aMisPkgLink;
-
- Super.KVehicleUpdateParams();
-
- for (i=0;i<Parts.length;i++)
- {
- if (Joints[i].IsA('KCarWheelJoint'))
- {
- WheelJ=KCarWheelJoint(Joints[i]);
- WheelJ.bKSteeringLocked = JointParts[i].bSteeringLocked;
-
- WheelJ.KProportionalGap = SteerPropGap;
- WheelJ.KMaxSteerTorque = SteerTorque;
- WheelJ.KMaxSteerSpeed = SteerSpeed;
- WheelJ.KBraking = JointParts[i].BrakeTorque;
-
- if (JointParts[i].bSuspensionLocked) {
- WheelJ.KSuspHighLimit = 0.001;
- WheelJ.KSuspLowLimit = -0.001;
- WheelJ.KSuspStiffness = 200.0;
- WheelJ.KSuspDamping = 100.0;
- }
- else {
- WheelJ.KSuspHighLimit = SuspHighLimit;
- WheelJ.KSuspLowLimit = SuspLowLimit;
- WheelJ.KSuspStiffness = SuspStiffness;
- WheelJ.KSuspDamping = SuspDamping;
- }
- // Sync params with Karma.
- WheelJ.KUpdateConstraintParams();
- }
- else if(Joints[i].IsA('KDHinge'))
- {
- HingeJ = KDHinge(Joints[i]);
-
- aMisPkgLink = getMisPkgLinkInfo(getLinkNumber(string(JointParts[i].PartName)), getMisPkgName(string(JointParts[i].PartName)));
- if(aMisPkgLink != None)
- {
- HingeJ.KMaxTorque = aMisPkgLink.MaxTorque;
- HingeJ.KDesiredAngVel = converter.SpinSpeedToUU(aMisPkgLink.MaxSpeed);
- }
- else
- {
- HingeJ.KMaxTorque = MotorTorque;
- HingeJ.KDesiredAngVel = uuMotorSpeed;
- }
-
- HingeJ.KProportionalGap = HingePropGap;
- HingeJ.KHingeType = HT_CONTROLLED;
- // Sync params with Karma.
- if (Joints[i].IsA('KSlider'))
- KSlider(Joints[i]).UpdateConstraint();
- else
- HingeJ.KUpdateConstraintParams();
- }
-
- if (Parts[i].IsA('KTire'))
- {
- Part=KTire(Parts[i]);
- Part.RollFriction = TireRollFriction;
- Part.LateralFriction = TireLateralFriction;
- Part.RollSlip = TireRollSlip;
- Part.LateralSlip = TireLateralSlip;
- Part.MinSlip = TireMinSlip;
- Part.SlipRate = TireSlipRate;
- Part.Softness = TireSoftness;
- Part.Adhesion = TireAdhesion;
- Part.Restitution = TireRestitution;
- }
- }
-
- KSetMass(ChassisMass);
-}
-
-// Possibly apply force to flip robot over.
-simulated event KApplyForce(out vector Force, out vector Torque)
-{
- local float torqueScale;
- local vector worldForward, worldUp, worldRight, torqueAxis;
-
- if(FlipTimeLeft == 0)
- return;
-
- worldForward = vect(-1, 0, 0) >> Rotation;
- worldUp = vect(0, 0, 1) >> Rotation;
- worldRight = vect(0, 1, 0) >> Rotation;
-
- torqueAxis = Normal(worldUp Cross vect(0, 0, 1));
-
- // Torque scaled by how far over we are.
- // This will be between 0 and PI - so convert to between 0 and 1.
- torqueScale = Acos(worldUp Dot vect(0, 0, 1))/3.1416;
-
- Torque = FlipTorque * torqueScale * torqueAxis;
-}
-
-function StartFlip(Pawn Pusher)
-{
- //local vector toPusher, worldUp;
-
- // if we are already flipping the car - dont do it again!
- if(FlipTimeLeft > 0)
- return;
-
- FlipTimeLeft = FlipTime; // Start the flip on the server
- USARRemoteBot(Controller).Flip = false;
-}
-
-//given a name and return the correspond jointpart's id
-function int FindJointPartId(string jname)
-{
- local int i;
-
- for (i=0;i<JointParts.length;i++)
- if (string(JointParts[i].PartName) == jname) return i;
- return -1;
-}
-
-// Get all the children IDs of a part
-function array<int> FindChildren(int idx)
-{
- local array<int> res;
- local int i;
- local name myName,pName;
-
- //invalid idx is treated as the robot platform (hard mount).
- if (idx<0 || idx>=JointParts.length)
- myName='None';
- //iterate JointParts to find all the children
- myName = JointParts[idx].PartName;
- for (i=0;i<JointParts.length;i++) {
- pName = JointParts[i].Parent;
- if (pName=='') pName='None';
@@ Diff output truncated at 60000 characters. @@
More information about the TeamTalk-developers
mailing list