diff --git a/resources/DefaultInput.ini b/resources/DefaultInput.ini
index 776cbecd..b47c1e9b 100644
--- a/resources/DefaultInput.ini
+++ b/resources/DefaultInput.ini
@@ -27,4 +27,5 @@ M=SwitchToClient
P=SwitchToPlayer
K=TakeDamage,1500
F2=PerformanceTimingResetAllTimers
-F3=PerformanceTimingCreateExcelData
\ No newline at end of file
+F3=PerformanceTimingCreateExcelData
+F4=SwapToClassPick
\ No newline at end of file
diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd
index 004a11a7..bb629094 100644
--- a/resources/Schema/Components.xsd
+++ b/resources/Schema/Components.xsd
@@ -59,4 +59,5 @@
+
\ No newline at end of file
diff --git a/resources/Schema/Components/InputCmdButton.xml b/resources/Schema/Components/InputCmdButton.xml
new file mode 100644
index 00000000..58c3ba2c
--- /dev/null
+++ b/resources/Schema/Components/InputCmdButton.xml
@@ -0,0 +1,5 @@
+
+
+
+ 0.0
+
\ No newline at end of file
diff --git a/resources/Schema/Components/InputCmdButton.xsd b/resources/Schema/Components/InputCmdButton.xsd
new file mode 100644
index 00000000..f4dd8d3f
--- /dev/null
+++ b/resources/Schema/Components/InputCmdButton.xsd
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+ Used with a Button component, the button will send an inputCommand event instead of ButtonPressed/Released event.
+
+
+
+ The command name for the inputCommand.
+
+
+ The value in inputCommand.Value that will be sent on button press.
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/Schema/Entities/NewMapWSpectatorCam.xml b/resources/Schema/Entities/NewMapWSpectatorCam.xml
index bf1b4c2b..395eb1de 100644
--- a/resources/Schema/Entities/NewMapWSpectatorCam.xml
+++ b/resources/Schema/Entities/NewMapWSpectatorCam.xml
@@ -3,7 +3,6 @@
- 0.0
15
@@ -24,50 +23,6 @@
-
-
-
-
- Models/Props/Highground1.mesh
-
-
-
-
-
-
-
-
-
- Models/Props/Highground2.mesh
-
-
-
-
-
-
-
-
-
- Models/Props/Highground1.mesh
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Highground2.mesh
-
-
-
-
-
-
-
@@ -88,6 +43,50 @@
+
+
+
+
+ Models/Props/Highground1.mesh
+
+
+
+
+
+
+
+
+
+ Models/Props/Highground2.mesh
+
+
+
+
+
+
+
+
+
+ Models/Props/Highground1.mesh
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Highground2.mesh
+
+
+
+
+
+
+
@@ -286,8 +285,8 @@
-
+
@@ -300,8 +299,8 @@
-
+
@@ -314,8 +313,8 @@
-
+
@@ -328,8 +327,8 @@
-
+
@@ -432,8 +431,8 @@
-
+
@@ -446,8 +445,8 @@
-
+
@@ -460,8 +459,8 @@
-
+
@@ -500,8 +499,8 @@
-
+
@@ -527,8 +526,8 @@
-
+
@@ -566,6 +565,19 @@
+
+
+
+
+ Models/Props/Walls/SmallWall3.mesh
+
+
+
+
+
+
+
+
@@ -691,8 +703,8 @@
-
+
@@ -705,8 +717,8 @@
-
+
@@ -779,19 +791,6 @@
-
-
-
-
- Models/Props/Walls/SmallWall3.mesh
-
-
-
-
-
-
-
-
@@ -1042,8 +1041,8 @@
-
+
@@ -1512,8 +1511,8 @@
-
+
@@ -1744,8 +1743,8 @@
-
+
@@ -1822,8 +1821,8 @@
-
+
@@ -1836,8 +1835,8 @@
-
+
@@ -1857,8 +1856,8 @@
-
+
@@ -1871,8 +1870,8 @@
-
+
@@ -1898,8 +1897,8 @@
-
+
@@ -2017,8 +2016,8 @@
-
+
@@ -2137,8 +2136,8 @@
-
+
@@ -2177,8 +2176,8 @@
-
+
@@ -2217,8 +2216,8 @@
-
+
@@ -2238,8 +2237,8 @@
-
+
@@ -2252,8 +2251,8 @@
-
+
@@ -2407,8 +2406,8 @@
-
+
@@ -2436,8 +2435,8 @@
-
+
@@ -2451,8 +2450,8 @@
-
+
@@ -2465,8 +2464,8 @@
-
+
@@ -2478,8 +2477,8 @@
-
+
@@ -2494,8 +2493,8 @@
-
+
@@ -2508,8 +2507,8 @@
-
+
@@ -2616,8 +2615,8 @@
-
+
@@ -2877,8 +2876,8 @@
-
+
@@ -2891,8 +2890,8 @@
-
+
@@ -2917,8 +2916,8 @@
-
+
@@ -2933,8 +2932,8 @@
-
+
@@ -2947,8 +2946,8 @@
-
+
@@ -2975,8 +2974,8 @@
-
+
@@ -2989,8 +2988,8 @@
-
+
@@ -3016,8 +3015,8 @@
-
+
@@ -3031,8 +3030,8 @@
-
+
@@ -3046,8 +3045,8 @@
-
+
@@ -3061,8 +3060,8 @@
-
+
@@ -3083,1006 +3082,6 @@
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/ShinyStoneCrystalRed.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/ShinyStoneCrystalRed.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/ShinyStoneCrystalRed.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Walls/MediumWall1.mesh
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/BigStone.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/SmallStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/MediumStone2.mesh
-
-
-
-
-
-
-
-
-
-
-
@@ -4095,9 +3094,8 @@
Models/Props/PickUps/PickUpHolder.mesh
-
+
-
@@ -4109,9 +3107,9 @@
Models/Props/PickUps/PickUpHolder.mesh
-
+
+
-
@@ -4124,8 +3122,22 @@
-
+
+
+
+
+
+
+
+
+
+ Models/Props/PickUps/PickUpHolder.mesh
+
+
+
+
+
@@ -4161,9 +3173,9 @@
Models/Props/PickUps/PickUpHolder.mesh
-
+
+
-
@@ -4175,7 +3187,22 @@
Models/Props/PickUps/PickUpHolder.mesh
-
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/PickUps/PickUpHolder.mesh
+
+
+
+
@@ -4189,36 +3216,8 @@
-
-
-
-
-
-
-
-
-
- Models/Props/PickUps/PickUpHolder.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/PickUps/PickUpHolder.mesh
-
-
-
-
-
@@ -4230,6 +3229,34 @@
+
+
+
+
+ Models/Props/Stones/AssaultHolder.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/AssaultHolder.mesh
+
+
+
+
+
+
+
+
+
@@ -4347,22 +3374,8 @@
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/AssaultHolder.mesh
-
-
-
-
@@ -4375,8 +3388,29 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone1.mesh
+
+
+
+
+
@@ -4385,12 +3419,977 @@
- Models/Props/Stones/AssaultHolder.mesh
+ Models/Props/Stones/BigStone.mesh
-
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone1.mesh
+
+
+
+
-
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/ShinyStoneCrystalRed.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Walls/MediumWall1.mesh
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/ShinyStoneCrystalRed.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/BigStone.mesh
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/ShinyStoneCrystalRed.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/MediumStone2.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/SmallStone2.mesh
+
+
+
+
+
@@ -4402,6 +4401,32 @@
+
+
+
+
+ Models/Props/SciFiHolder1.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/SciFiHolder1.mesh
+
+
+
+
+
+
+
+
@@ -4467,32 +4492,6 @@
-
-
-
-
- Models/Props/SciFiHolder1.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/SciFiHolder1.mesh
-
-
-
-
-
-
-
-
@@ -4517,11 +4516,39 @@
- Models/Props/Stones/ShinyStoneCrystalRed.mesh
+ Models/Props/Stones/ShinyStoneCrystalBlue.mesh
-
-
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/ShinyStoneCrystalBlue.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/ShinyStoneCrystalBlue.mesh
+
+
+
+
+
@@ -4533,9 +4560,51 @@
Models/Props/Stones/ShinyStoneCrystalRed.mesh
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/ShinyStoneCrystalBlue.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/ShinyStoneCrystalBlue.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/ShinyStoneCrystalBlue.mesh
+
+
+
+
+
@@ -4553,34 +4622,6 @@
-
-
-
-
- Models/Props/Stones/ShinyStoneCrystalBlue.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/ShinyStoneCrystalBlue.mesh
-
-
-
-
-
-
-
-
-
@@ -4589,105 +4630,8 @@
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/ShinyStoneCrystalBlue.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/ShinyStoneCrystalBlue.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/ShinyStoneCrystalRed.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/ShinyStoneCrystalRed.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/ShinyStoneCrystalBlue.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/ShinyStoneCrystalBlue.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/Stones/ShinyStoneCrystalRed.mesh
-
-
-
-
-
+
@@ -4709,12 +4653,12 @@
- Models/Props/Stones/ShinyStoneCrystalBlue.mesh
+ Models/Props/Stones/ShinyStoneCrystalRed.mesh
-
-
-
+
+
+
@@ -4727,8 +4671,63 @@
-
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/ShinyStoneCrystalRed.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/ShinyStoneCrystalBlue.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/ShinyStoneCrystalRed.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/Stones/ShinyStoneCrystalRed.mesh
+
+
+
+
+
@@ -4741,8 +4740,8 @@
-
+
@@ -4751,192 +4750,22 @@
-
-
-
-
-
-
-
-
-
- Models/Props/CapturePoint/CapturePointBlue.mesh
-
-
-
-
-
-
-
-
-
-
-
-
- 4
-
-
- Models/Core/UnitCylinder.mesh
-
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/CapturePoint/CapturePointNeutral.mesh
-
-
-
-
-
-
-
-
-
- 3
-
-
- Models/Core/UnitCylinder.mesh
-
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/CapturePoint/CapturePointNeutral.mesh
-
-
-
-
-
-
-
-
-
- 2
-
-
- Models/Core/UnitCylinder.mesh
-
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/CapturePoint/CapturePointNeutral.mesh
-
-
-
-
-
-
-
-
-
- 1.5498908015879351
- 1
-
-
- Models/Core/UnitCylinder.mesh
-
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Props/CapturePoint/CapturePointRed.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Core/UnitCylinder.mesh
-
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ 10
+
+
+
+
+
+
+
@@ -4946,6 +4775,17 @@
+
+
+
+ 10
+
+
+
+
+
+
+
@@ -4980,28 +4820,6 @@
-
-
-
- 10
-
-
-
-
-
-
-
-
-
-
- 10
-
-
-
-
-
-
-
@@ -5015,76 +4833,6 @@
-
-
-
-
- Schema/Entities/PlayerRed.xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Models/Characters/Assault/AssaultTPose.mesh
- false
-
-
-
-
-
-
-
-
-
-
-
- Models/Characters/Assault/AssaultTPose.mesh
- false
-
-
-
-
-
-
-
-
-
-
-
- Models/Characters/Assault/AssaultTPose.mesh
- false
-
-
-
-
-
-
-
-
-
-
-
- Models/Characters/Assault/AssaultTPose.mesh
- false
-
-
-
-
-
-
-
-
-
@@ -5109,20 +4857,7 @@
false
-
-
-
-
-
-
-
-
-
- Models/Characters/Assault/AssaultTPose.mesh
- false
-
-
-
+
@@ -5148,7 +4883,271 @@
false
-
+
+
+
+
+
+
+
+
+
+ Models/Characters/Assault/AssaultTPose.mesh
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/CapturePoint/CapturePointNeutral.mesh
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+ Models/Core/UnitCylinder.mesh
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/CapturePoint/CapturePointRed.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Core/UnitCylinder.mesh
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/CapturePoint/CapturePointNeutral.mesh
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+ Models/Core/UnitCylinder.mesh
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/CapturePoint/CapturePointNeutral.mesh
+
+
+
+
+
+
+
+
+
+ 1.5498908015879351
+ 1
+
+
+
+ Models/Core/UnitCylinder.mesh
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Props/CapturePoint/CapturePointBlue.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+ Models/Core/UnitCylinder.mesh
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Schema/Entities/PlayerRed.xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Characters/Assault/AssaultTPose.mesh
+ false
+
+
+
+
+
+
+
+
+
+
+
+ Models/Characters/Assault/AssaultTPose.mesh
+ false
+
+
+
+
+
+
+
+
+
+
+
+ Models/Characters/Assault/AssaultTPose.mesh
+ false
+
+
+
+
+
+
+
+
+
+
+
+ Models/Characters/Assault/AssaultTPose.mesh
+ false
+
+
+
@@ -5163,6 +5162,7 @@
+
0.10000000149011612
@@ -5172,130 +5172,16 @@
-
+
-
-
- 0.10000000149011612
-
-
-
- Models/Props/PickUps/AmmoPickUp.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.10000000149011612
-
-
-
- Models/Props/PickUps/HealthPickUp.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.10000000149011612
-
-
-
- Models/Props/PickUps/HealthPickUp.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.10000000149011612
-
-
-
- Models/Props/PickUps/AmmoPickUp.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.10000000149011612
-
-
-
- Models/Props/PickUps/HealthPickUp.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.10000000149011612
-
-
-
- Models/Props/PickUps/AmmoPickUp.mesh
-
-
-
-
-
-
-
-
-
-
-
-
-
0.10000000149011612
@@ -5305,216 +5191,420 @@
-
+
+
+
+
+
+
+
+
+ 0.10000000149011612
+
+
+
+ Models/Props/PickUps/AmmoPickUp.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.10000000149011612
+
+
+
+ Models/Props/PickUps/AmmoPickUp.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.10000000149011612
+
+
+
+ Models/Props/PickUps/HealthPickUp.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.10000000149011612
+
+
+
+ Models/Props/PickUps/HealthPickUp.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.10000000149011612
+
+
+
+ Models/Props/PickUps/HealthPickUp.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.10000000149011612
+
+
+
+ Models/Props/PickUps/AmmoPickUp.mesh
+
+
+
+
+
+
-
+
-
+
+ 0.049999997019767761
+
+
-
-
+
-
+
-
+
+
-
+
-
-
- Fonts/DroidSans.ttf,64
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
+
-
- Textures/Core/UnitHexagon.png
-
-
-
-
+
-
+
-
- 2
-
-
-
-
-
- Textures/Core/UnitHexagon_Rotated.png
-
-
-
-
-
+
+
+
+
+
+
+
+
+ Textures/Core/UnitHexagon.png
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+ Textures/Core/UnitHexagon_Rotated.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/UnitHexagon.png
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+ Textures/Core/UnitHexagon_Rotated.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/UnitHexagon.png
+
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+ Textures/Core/UnitHexagon_Rotated.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/UnitHexagon.png
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ 0.10332605343919568
+
+
+
+ Textures/Core/UnitHexagon_Rotated.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/UnitHexagon.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/UnitHexagon_Rotated.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ Fonts/DroidSans.ttf,64
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
-
- Textures/Core/UnitHexagon.png
-
-
-
-
+
-
+
-
- 3
-
-
-
-
+
- Textures/Core/UnitHexagon_Rotated.png
+ Textures/Core/UnitHexagon.png
+
+ PickClass
+ 2
+
-
-
-
+
+
-
-
-
-
-
- Textures/Core/UnitHexagon.png
-
-
-
-
-
-
-
-
-
+
-
- 4
-
-
-
-
+
- Textures/Core/UnitHexagon_Rotated.png
+ Textures/Core/UnitRaptor.png
+
+ PickClass
+ 1
+
-
-
-
+
+
-
-
-
-
-
- Textures/Core/UnitHexagon.png
-
-
-
-
-
-
-
-
-
+
-
- 1
-
-
- 0.59265931447347009
-
-
+
- Textures/Core/UnitHexagon_Rotated.png
+ Textures/Test/aM4ME4GR.png
+
+ PickClass
+ 3
+
-
-
-
-
-
-
-
-
-
-
-
-
- Textures/Core/UnitHexagon.png
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Textures/Core/UnitHexagon_Rotated.png
-
-
-
-
-
-
+
+
diff --git a/resources/Schema/Entities/OverwatchCamera.xml b/resources/Schema/Entities/OverwatchCamera.xml
new file mode 100644
index 00000000..a2b774d3
--- /dev/null
+++ b/resources/Schema/Entities/OverwatchCamera.xml
@@ -0,0 +1,308 @@
+
+
+
+
+
+ 0.049999997019767761
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/UnitHexagon.png
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+ Textures/Core/UnitHexagon_Rotated.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/UnitHexagon.png
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+ Textures/Core/UnitHexagon_Rotated.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/UnitHexagon.png
+
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+ Textures/Core/UnitHexagon_Rotated.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/UnitHexagon.png
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ 0.10332605343919568
+
+
+
+ Textures/Core/UnitHexagon_Rotated.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/UnitHexagon.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/UnitHexagon_Rotated.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+ Fonts/DroidSans.ttf,64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/UnitHexagon.png
+
+
+
+ PickClass
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Core/UnitRaptor.png
+
+
+
+ PickClass
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ Textures/Test/aM4ME4GR.png
+
+
+
+ PickClass
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/Schema/Entities/SpectatorCamera.xml b/resources/Schema/Entities/SpectatorCamera.xml
deleted file mode 100644
index 5c3dc514..00000000
--- a/resources/Schema/Entities/SpectatorCamera.xml
+++ /dev/null
@@ -1,219 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Time to respawn: 0
- Fonts/DroidSans.ttf,64
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Textures/Core/UnitHexagon.png
-
-
-
-
-
-
-
-
-
-
-
- 2
-
-
-
-
-
- Textures/Core/UnitHexagon_Rotated.png
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Textures/Core/UnitHexagon.png
-
-
-
-
-
-
-
-
-
-
-
- 3
-
-
-
-
-
- Textures/Core/UnitHexagon_Rotated.png
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Textures/Core/UnitHexagon.png
-
-
-
-
-
-
-
-
-
-
-
- 4
-
-
-
-
-
- Textures/Core/UnitHexagon_Rotated.png
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Textures/Core/UnitHexagon.png
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
- 0.59265931447347009
-
-
-
- Textures/Core/UnitHexagon_Rotated.png
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Textures/Core/UnitHexagon.png
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Textures/Core/UnitHexagon_Rotated.png
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/resources/Schema/Types/Entity.xsd b/resources/Schema/Types/Entity.xsd
index 1d8ea8f3..21e517c0 100644
--- a/resources/Schema/Types/Entity.xsd
+++ b/resources/Schema/Types/Entity.xsd
@@ -62,6 +62,7 @@
+
diff --git a/src/Engine/GUI/ButtonSystem.cpp b/src/Engine/GUI/ButtonSystem.cpp
index 93ae1811..b28c0119 100644
--- a/src/Engine/GUI/ButtonSystem.cpp
+++ b/src/Engine/GUI/ButtonSystem.cpp
@@ -1,4 +1,5 @@
#include "GUI/ButtonSystem.h"
+#include "Input/EInputCommand.h"
ButtonSystem::ButtonSystem(SystemParams params, IRenderer* renderer)
: System(params)
@@ -37,10 +38,20 @@ bool ButtonSystem::OnMousePress(const Events::MousePress& e)
m_PickEntity = EntityWrapper(m_World, m_PickData.Entity);
//You have clicked on a button entity, send pressed event.
- Events::ButtonPressed ePressed;
- ePressed.Entity = m_PickEntity;
- ePressed.EntityName = m_PickEntity.Name();
- m_EventBroker->Publish(ePressed);
+ if (m_World->HasComponent(m_PickData.Entity, "InputCmdButton")) {
+ Events::InputCommand eInputCmd;
+ eInputCmd.PlayerID = LocalPlayer.ID;
+ eInputCmd.Player = LocalPlayer;
+ EntityWrapper button = EntityWrapper(m_World, m_PickData.Entity);
+ eInputCmd.Command = (std::string)button["InputCmdButton"]["Command"];
+ eInputCmd.Value = (float)button["InputCmdButton"]["PressValue"];
+ m_EventBroker->Publish(eInputCmd);
+ } else {
+ Events::ButtonPressed ePressed;
+ ePressed.Entity = m_PickEntity;
+ ePressed.EntityName = m_PickEntity.Name();
+ m_EventBroker->Publish(ePressed);
+ }
}
}
}
@@ -55,10 +66,20 @@ bool ButtonSystem::OnMouseRelease(const Events::MouseRelease& e)
if(m_PickData.Entity != EntityID_Invalid && m_PickData.World == m_World) {
EntityWrapper ent = EntityWrapper(m_World, m_PickData.Entity);
- Events::ButtonReleased eReleased;
- eReleased.EntityName = m_PickEntity.Name();
- eReleased.Entity = m_PickEntity;
- m_EventBroker->Publish(eReleased);
+ if (m_World->HasComponent(m_PickData.Entity, "InputCmdButton")) {
+ Events::InputCommand eInputCmd;
+ eInputCmd.PlayerID = LocalPlayer.ID;
+ eInputCmd.Player = LocalPlayer;
+ EntityWrapper button = EntityWrapper(m_World, m_PickData.Entity);
+ eInputCmd.Command = (std::string)button["InputCmdButton"]["Command"];
+ eInputCmd.Value = 0;
+ m_EventBroker->Publish(eInputCmd);
+ } else {
+ Events::ButtonReleased eReleased;
+ eReleased.EntityName = m_PickEntity.Name();
+ eReleased.Entity = m_PickEntity;
+ m_EventBroker->Publish(eReleased);
+ }
if(m_World->HasComponent(m_PickData.Entity, "Button")) {
if (ent == m_PickEntity) {
diff --git a/src/Game/Systems/PlayerSpawnSystem.cpp b/src/Game/Systems/PlayerSpawnSystem.cpp
index fbda849d..39fa1606 100644
--- a/src/Game/Systems/PlayerSpawnSystem.cpp
+++ b/src/Game/Systems/PlayerSpawnSystem.cpp
@@ -105,7 +105,7 @@ void PlayerSpawnSystem::Update(double dt)
bool PlayerSpawnSystem::OnInputCommand(Events::InputCommand& e)
{
- if (e.Command != "PickTeam") {
+ if (e.Command != "PickTeam" && e.Command != "SwapToClassPick") {
return false;
}
@@ -113,11 +113,12 @@ bool PlayerSpawnSystem::OnInputCommand(Events::InputCommand& e)
return false;
}
- // A dead client should be able to swap to the spectator camera.
+ // A dead client should be able to swap to the overwatch camera.
if (IsClient && !LocalPlayer.Valid()) {
- // Set the spectator camera as active, if it exists.
- // Find the camera.
- EntityWrapper spectatorCam = m_World->GetFirstEntityByName("SpectatorCamera");
+ // Set the camera as active, if it exists.
+ // Find the respawn camera or class pick camera.
+ std::string camName = e.Command == "SwapToClassPick" ? "PickClassCamera" : "SpectatorCamera";
+ EntityWrapper spectatorCam = m_World->GetFirstEntityByName(camName);
if (spectatorCam.Valid() && spectatorCam.HasComponent("Camera")) {
Events::SetCamera eSetCamera;
eSetCamera.CameraEntity = spectatorCam;
@@ -135,10 +136,18 @@ bool PlayerSpawnSystem::OnInputCommand(Events::InputCommand& e)
auto iter = m_SpawnRequests.begin();
for (; iter != m_SpawnRequests.end(); ++iter) {
if (iter->PlayerID == e.PlayerID) {
+ // If player wants to switch class, remove their spawn request.
+ if (e.Command == "SwapToClassPick") {
+ m_SpawnRequests.erase(iter);
+ }
break;
}
}
+ if (e.Command == "SwapToClassPick") {
+ return true;
+ }
+
if (iter != m_SpawnRequests.end()) {
// If player is in queue to spawn, then change their team affiliation in the request.
iter->Team = (ComponentInfo::EnumType)e.Value;