diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/cfgEventSpawns.xml b/Missions/DayZCommunityOfflineMode.ChernarusPlus/cfgEventSpawns.xml
index e63fead0..b870c81d 100644
--- a/Missions/DayZCommunityOfflineMode.ChernarusPlus/cfgEventSpawns.xml
+++ b/Missions/DayZCommunityOfflineMode.ChernarusPlus/cfgEventSpawns.xml
@@ -454,7 +454,7 @@
-
+
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/animals.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/animals.bin
new file mode 100644
index 00000000..b42b9938
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/animals.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/building.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/building.bin
new file mode 100644
index 00000000..f7eb2401
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/building.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_000.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_000.bin
new file mode 100644
index 00000000..1e0f8de5
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_000.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_001.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_001.bin
new file mode 100644
index 00000000..23f360c0
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_001.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_002.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_002.bin
new file mode 100644
index 00000000..2ad1e1b7
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_002.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_003.002 b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_003.002
new file mode 100644
index 00000000..0a6a084f
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_003.002 differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_003.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_003.bin
new file mode 100644
index 00000000..991c5452
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_003.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_004.002 b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_004.002
new file mode 100644
index 00000000..f7950406
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_004.002 differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_004.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_004.bin
new file mode 100644
index 00000000..51cf88bd
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_004.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_005.002 b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_005.002
new file mode 100644
index 00000000..5748d136
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_005.002 differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_005.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_005.bin
new file mode 100644
index 00000000..85d609e9
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_005.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_006.002 b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_006.002
new file mode 100644
index 00000000..f31e0c2f
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_006.002 differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_006.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_006.bin
new file mode 100644
index 00000000..d1ff58b6
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_006.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_007.002 b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_007.002
new file mode 100644
index 00000000..3c2998a8
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_007.002 differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_007.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_007.bin
new file mode 100644
index 00000000..290912d5
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_007.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_008.002 b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_008.002
new file mode 100644
index 00000000..73e1f567
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_008.002 differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_008.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_008.bin
new file mode 100644
index 00000000..7da0e8d2
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_008.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_009.002 b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_009.002
new file mode 100644
index 00000000..0813e812
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_009.002 differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_009.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_009.bin
new file mode 100644
index 00000000..3c209602
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_009.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_010.002 b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_010.002
new file mode 100644
index 00000000..d94e3614
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_010.002 differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_010.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_010.bin
new file mode 100644
index 00000000..f1055859
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_010.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_011.002 b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_011.002
new file mode 100644
index 00000000..a9677de4
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_011.002 differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_011.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_011.bin
new file mode 100644
index 00000000..fbb21e01
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/dynamic_011.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/events.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/events.bin
new file mode 100644
index 00000000..bbaf6468
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/events.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/types.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/types.bin
new file mode 100644
index 00000000..309b5e29
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/types.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/vehicles.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/vehicles.bin
new file mode 100644
index 00000000..ed64ff47
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/vehicles.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/zombies.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/zombies.bin
new file mode 100644
index 00000000..c8cdf1eb
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/data/zombies.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/spawnpoints.bin b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/spawnpoints.bin
new file mode 100644
index 00000000..d7a2ee73
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.ChernarusPlus/storage_-1/spawnpoints.bin differ
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/DayZCommunityOfflineMode.bat b/Missions/DayZCommunityOfflineMode.sakhal/DayZCommunityOfflineMode.bat
new file mode 100644
index 00000000..8a44abca
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/DayZCommunityOfflineMode.bat
@@ -0,0 +1,9 @@
+@echo off
+
+taskkill /F /IM DayZ_x64.exe /T
+
+RD /s /q "storage_-1" > nul 2>&1
+
+cd ../../
+
+start DayZ_x64.exe -mission=.\Missions\DayZCommunityOfflineMode.sakhal -nosplash -noPause -noBenchmark -filePatching -doLogs -scriptDebug=true
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/MapGroupCluster.xml b/Missions/DayZCommunityOfflineMode.sakhal/MapGroupCluster.xml
new file mode 100644
index 00000000..1ddc748a
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/MapGroupCluster.xml
@@ -0,0 +1,50004 @@
+
+
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/New Text Document.txt b/Missions/DayZCommunityOfflineMode.sakhal/New Text Document.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/areaflags.map b/Missions/DayZCommunityOfflineMode.sakhal/areaflags.map
new file mode 100644
index 00000000..4fde7513
Binary files /dev/null and b/Missions/DayZCommunityOfflineMode.sakhal/areaflags.map differ
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/cfgEconomyCore.xml b/Missions/DayZCommunityOfflineMode.sakhal/cfgEconomyCore.xml
new file mode 100644
index 00000000..b15dd4c5
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/cfgEconomyCore.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/cfgEventSpawns.xml b/Missions/DayZCommunityOfflineMode.sakhal/cfgEventSpawns.xml
new file mode 100644
index 00000000..b870c81d
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/cfgEventSpawns.xml
@@ -0,0 +1,1460 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/cfgLimitsDefinition.xml b/Missions/DayZCommunityOfflineMode.sakhal/cfgLimitsDefinition.xml
new file mode 100644
index 00000000..bb5569b8
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/cfgLimitsDefinition.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/cfgLimitsDefinitionUser.xml b/Missions/DayZCommunityOfflineMode.sakhal/cfgLimitsDefinitionUser.xml
new file mode 100644
index 00000000..f42f89ac
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/cfgLimitsDefinitionUser.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/cfgPlayerSpawnPoints.xml b/Missions/DayZCommunityOfflineMode.sakhal/cfgPlayerSpawnPoints.xml
new file mode 100644
index 00000000..bc09f129
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/cfgPlayerSpawnPoints.xml
@@ -0,0 +1,383 @@
+
+
+
+
+
+
+
+ 30.0
+ 70.0
+
+ 25.0
+ 70.0
+
+ 0.5
+ 2.0
+
+
+
+
+
+ 8
+
+ 40.0
+
+ 40.0
+
+ 0.5
+
+ 2.0
+
+ -45
+ 45
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/cfgRandomPresets.xml b/Missions/DayZCommunityOfflineMode.sakhal/cfgRandomPresets.xml
new file mode 100644
index 00000000..8358348c
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/cfgRandomPresets.xml
@@ -0,0 +1,721 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/cfgSpawnableTypes.xml b/Missions/DayZCommunityOfflineMode.sakhal/cfgSpawnableTypes.xml
new file mode 100644
index 00000000..befac166
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/cfgSpawnableTypes.xml
@@ -0,0 +1,3811 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/cfgeffectarea.json b/Missions/DayZCommunityOfflineMode.sakhal/cfgeffectarea.json
new file mode 100644
index 00000000..e3f44cfb
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/cfgeffectarea.json
@@ -0,0 +1,177 @@
+{
+ "Areas": [
+ { "AreaName": "Ship-SW",
+ "Type": "ContaminatedArea_Static",
+ "TriggerType": "ContaminatedTrigger",
+ "Data": {
+ "Pos": [ 13684, 0, 11073 ],
+ "Radius": 100,
+ "PosHeight": 22,
+ "NegHeight": 10,
+ "InnerRingCount": 1,
+ "InnerPartDist": 50,
+ "OuterRingToggle": 1,
+ "OuterPartDist": 50,
+ "OuterOffset": 0,
+ "VerticalLayers": 0,
+ "VerticalOffset": 0,
+ "ParticleName": "graphics/particles/contaminated_area_gas_bigass"
+ },
+ "PlayerData": {
+ "AroundPartName": "graphics/particles/contaminated_area_gas_around",
+ "TinyPartName": "graphics/particles/contaminated_area_gas_around_tiny",
+ "PPERequesterType": "PPERequester_ContaminatedAreaTint"
+ }
+ },
+ { "AreaName": "Ship-NE",
+ "Type": "ContaminatedArea_Static",
+ "TriggerType": "ContaminatedTrigger",
+ "Data": {
+ "Pos": [ 13881, 0, 11172 ],
+ "Radius": 100,
+ "PosHeight": 26,
+ "NegHeight": 10,
+ "InnerRingCount": 1,
+ "InnerPartDist": 50,
+ "OuterRingToggle": 1,
+ "OuterPartDist": 50,
+ "OuterOffset": 0,
+ "VerticalLayers": 0,
+ "VerticalOffset": 0,
+ "ParticleName": "graphics/particles/contaminated_area_gas_bigass"
+ },
+ "PlayerData": {
+ "AroundPartName": "graphics/particles/contaminated_area_gas_around",
+ "TinyPartName": "graphics/particles/contaminated_area_gas_around_tiny",
+ "PPERequesterType": "PPERequester_ContaminatedAreaTint"
+ }
+ },
+ { "AreaName": "Ship-Central",
+ "Type": "ContaminatedArea_Static",
+ "TriggerType": "ContaminatedTrigger",
+ "Data": {
+ "Pos": [ 13752, 0, 11164 ],
+ "Radius": 100,
+ "PosHeight": 22,
+ "NegHeight": 2,
+ "InnerRingCount": 1,
+ "InnerPartDist": 50,
+ "OuterRingToggle": 1,
+ "OuterPartDist": 60,
+ "OuterOffset": 0,
+ "VerticalLayers": 0,
+ "VerticalOffset": 0,
+ "ParticleName": "graphics/particles/contaminated_area_gas_bigass"
+ },
+ "PlayerData": {
+ "AroundPartName": "graphics/particles/contaminated_area_gas_around",
+ "TinyPartName": "graphics/particles/contaminated_area_gas_around_tiny",
+ "PPERequesterType": "PPERequester_ContaminatedAreaTint"
+ }
+ },
+ { "AreaName": "Pavlovo-North",
+ "Type": "ContaminatedArea_Static",
+ "TriggerType": "ContaminatedTrigger",
+ "Data": {
+ "Pos": [ 2043, 0, 3485 ],
+ "Radius": 150,
+ "PosHeight": 25,
+ "NegHeight": 20,
+ "InnerRingCount": 2,
+ "InnerPartDist": 50,
+ "OuterRingToggle": 1,
+ "OuterPartDist": 40,
+ "OuterOffset": 0,
+ "VerticalLayers": 0,
+ "VerticalOffset": 0,
+ "ParticleName": "graphics/particles/contaminated_area_gas_bigass"
+ },
+ "PlayerData": {
+ "AroundPartName": "graphics/particles/contaminated_area_gas_around",
+ "TinyPartName": "graphics/particles/contaminated_area_gas_around_tiny",
+ "PPERequesterType": "PPERequester_ContaminatedAreaTint"
+ }
+ },
+ { "AreaName": "Pavlovo-South",
+ "Type": "ContaminatedArea_Static",
+ "TriggerType": "ContaminatedTrigger",
+ "Data": {
+ "Pos": [ 2164, 0, 3335 ],
+ "Radius": 150,
+ "PosHeight": 11,
+ "NegHeight": 10,
+ "InnerRingCount": 2,
+ "InnerPartDist": 50,
+ "OuterRingToggle": 1,
+ "OuterPartDist": 40,
+ "OuterOffset": 0,
+ "VerticalLayers": 0,
+ "VerticalOffset": 0,
+ "ParticleName": "graphics/particles/contaminated_area_gas_bigass"
+ },
+ "PlayerData": {
+ "AroundPartName": "graphics/particles/contaminated_area_gas_around",
+ "TinyPartName": "graphics/particles/contaminated_area_gas_around_tiny",
+ "PPERequesterType": "PPERequester_ContaminatedAreaTint"
+ }
+ }
+ ],
+
+ "SafePositions":[
+ [434, 13624],
+ [360, 10986],
+ [1412, 13505],
+ [1290, 11773],
+ [5742, 8568],
+ [4191, 4620],
+ [4949, 6569],
+ [1018, 7138],
+ [5041, 2640],
+ [6895, 7915],
+ [6128, 8120],
+ [4422, 8117],
+ [2811, 10209],
+ [1954, 2417],
+ [3633, 8708],
+ [5222, 5737],
+ [3546, 2630],
+ [2373, 5516],
+ [2462, 6879],
+ [1653, 3600],
+ [11774, 14570],
+ [8228, 9345],
+ [11100, 13400],
+ [9333, 8697],
+ [11513, 12203],
+ [4955, 10603],
+ [5090, 15054],
+ [6513, 14579],
+ [3483, 14941],
+ [4016, 11194],
+ [7607, 12384],
+ [4307, 9528],
+ [3266, 12352],
+ [4432, 13285],
+ [5473, 12455],
+ [9731, 13685],
+ [2745, 7784],
+ [8492, 14128],
+ [3501, 13292],
+ [7912, 10943],
+ [4165, 10134],
+ [10536, 7871],
+ [1467, 14288],
+ [5479, 9709],
+ [9453, 11963],
+ [319, 9212],
+ [8009, 14843],
+ [7206, 7158],
+ [12303, 13598],
+ [3435, 5959],
+ [4060, 12050],
+ [6633, 2988],
+ [870, 2095],
+ [10286, 9071],
+ [10371, 5690]
+ ]
+}
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/cfgenvironment.xml b/Missions/DayZCommunityOfflineMode.sakhal/cfgenvironment.xml
new file mode 100644
index 00000000..3c087808
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/cfgenvironment.xml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/cfgeventgroups.xml b/Missions/DayZCommunityOfflineMode.sakhal/cfgeventgroups.xml
new file mode 100644
index 00000000..05f0e7b6
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/cfgeventgroups.xml
@@ -0,0 +1,1124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/cfggameplay.json b/Missions/DayZCommunityOfflineMode.sakhal/cfggameplay.json
new file mode 100644
index 00000000..95922f6b
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/cfggameplay.json
@@ -0,0 +1,100 @@
+{
+ "version": 120,
+ "GeneralData":
+ {
+ "disableBaseDamage": false,
+ "disableContainerDamage": false,
+ "disableRespawnDialog": false
+ },
+ "PlayerData":
+ {
+ "disablePersonalLight": false,
+ "StaminaData":
+ {
+ "sprintStaminaModifierErc": 1.0,
+ "sprintStaminaModifierCro": 1.0,
+ "staminaWeightLimitThreshold": 6000.0,
+ "staminaMax": 100.0,
+ "staminaKgToStaminaPercentPenalty": 1.75,
+ "staminaMinCap": 5.0,
+ "sprintSwimmingStaminaModifier": 1.0,
+ "sprintLadderStaminaModifier": 1.0,
+ "meleeStaminaModifier": 1.0,
+ "obstacleTraversalStaminaModifier": 1.0,
+ "holdBreathStaminaModifier": 1.0
+ },
+ "ShockHandlingData":
+ {
+ "shockRefillSpeedConscious": 5.0,
+ "shockRefillSpeedUnconscious": 1.0,
+ "allowRefillSpeedModifier": true
+ },
+ "MovementData":
+ {
+ "timeToStrafeJog": 0.1,
+ "rotationSpeedJog": 0.3,
+ "timeToSprint": 0.45,
+ "timeToStrafeSprint": 0.3,
+ "rotationSpeedSprint": 0.15,
+ "allowStaminaAffectInertia": true
+ },
+ "DrowningData":
+ {
+ "staminaDepletionSpeed": 10.0,
+ "healthDepletionSpeed": 10.0,
+ "shockDepletionSpeed": 10.0
+ }
+ },
+ "WorldsData":
+ {
+ "lightingConfig": 1,
+ "objectSpawnersArr": [],
+ "environmentMinTemps": [-3.0, -2.0, 0.0, 4.0, 9.0, 14.0, 18.0, 17.0, 12.0, 7.0, 4.0, 0.0],
+ "environmentMaxTemps": [3.0, 5.0, 7.0, 14.0, 19.0, 24.0, 26.0, 25.0, 21.0, 16.0, 10.0, 5.0],
+ "wetnessWeightModifiers": [1.0, 1.0, 1.33, 1.66, 2.0]
+ },
+ "BaseBuildingData":
+ {
+ "HologramData":
+ {
+ "disableIsCollidingBBoxCheck": false,
+ "disableIsCollidingPlayerCheck": false,
+ "disableIsClippingRoofCheck": false,
+ "disableIsBaseViableCheck": false,
+ "disableIsCollidingGPlotCheck": false,
+ "disableIsCollidingAngleCheck": false,
+ "disableIsPlacementPermittedCheck": false,
+ "disableHeightPlacementCheck": false,
+ "disableIsUnderwaterCheck": false,
+ "disableIsInTerrainCheck": false
+ },
+ "ConstructionData":
+ {
+ "disablePerformRoofCheck": false,
+ "disableIsCollidingCheck": false,
+ "disableDistanceCheck": false
+ }
+ },
+ "UIData":
+ {
+ "use3DMap": false,
+ "HitIndicationData":
+ {
+ "hitDirectionOverrideEnabled": false,
+ "hitDirectionBehaviour": 1,
+ "hitDirectionStyle": 0,
+ "hitDirectionIndicatorColorStr": "0xffbb0a1e",
+ "hitDirectionMaxDuration": 2.0,
+ "hitDirectionBreakPointRelative": 0.2,
+ "hitDirectionScatter": 10.0,
+ "hitIndicationPostProcessEnabled": true
+ }
+ },
+ "MapData":
+ {
+ "ignoreMapOwnership": false,
+ "ignoreNavItemsOwnership": false,
+ "displayPlayerPosition": false,
+ "displayNavInfo": true
+ }
+}
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/cfgignorelist.xml b/Missions/DayZCommunityOfflineMode.sakhal/cfgignorelist.xml
new file mode 100644
index 00000000..95d7d3f5
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/cfgignorelist.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/cfgundergroundtriggers.json b/Missions/DayZCommunityOfflineMode.sakhal/cfgundergroundtriggers.json
new file mode 100644
index 00000000..96e3518b
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/cfgundergroundtriggers.json
@@ -0,0 +1,6 @@
+{
+ "Triggers":
+ [
+
+ ]
+}
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/cfgweather.xml b/Missions/DayZCommunityOfflineMode.sakhal/cfgweather.xml
new file mode 100644
index 00000000..010bf501
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/cfgweather.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/BaseModuleInclude.c b/Missions/DayZCommunityOfflineMode.sakhal/core/BaseModuleInclude.c
new file mode 100644
index 00000000..e2c86c9d
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/BaseModuleInclude.c
@@ -0,0 +1,5 @@
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\ModuleManager.c"
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\StaticFunctions.c"
+
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\CommunityOfflineClient.c"
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\CommunityOfflineServer.c"
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/CommunityOfflineClient.c b/Missions/DayZCommunityOfflineMode.sakhal/core/CommunityOfflineClient.c
new file mode 100644
index 00000000..421eb19f
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/CommunityOfflineClient.c
@@ -0,0 +1,136 @@
+class CommunityOfflineClient extends MissionGameplay
+{
+ protected bool HIVE_ENABLED = true; //Local Hive / Economy / Infected spawn
+
+ protected bool m_loaded;
+
+ void CommunityOfflineClient()
+ {
+ m_loaded = false;
+
+ NewModuleManager();
+ }
+
+ override void OnInit()
+ {
+ super.OnInit();
+
+ InitHive();
+
+ SetupWeather();
+
+ SpawnPlayer();
+
+ GetDayZGame().SetMissionPath( "$saves:CommunityOfflineMode\\" ); // CameraToolsMenu
+ }
+
+ override void OnMissionStart()
+ {
+ super.OnMissionStart();
+
+ COM_GetModuleManager().OnInit();
+ COM_GetModuleManager().OnMissionStart();
+ }
+
+ override void OnMissionFinish()
+ {
+ COM_GetModuleManager().OnMissionFinish();
+
+ CloseAllMenus();
+
+ DestroyAllMenus();
+
+ if( GetHive() )
+ {
+ DestroyHive();
+ }
+
+ super.OnMissionFinish();
+ }
+
+ void OnMissionLoaded()
+ {
+ COM_GetModuleManager().OnMissionLoaded();
+ }
+
+ override void OnUpdate( float timeslice )
+ {
+ super.OnUpdate( timeslice );
+
+ COM_GetModuleManager().OnUpdate( timeslice );
+
+ if( !m_loaded && !GetDayZGame().IsLoading() )
+ {
+ m_loaded = true;
+ OnMissionLoaded();
+ }
+ }
+
+ void SpawnPlayer()
+ {
+// #ifndef MODULE_PERSISTENCY
+// GetGame().SelectPlayer( NULL, COM_CreateCustomDefaultCharacter() );
+// #endif
+
+// #ifdef DISABLE_PERSISTENCY
+ GetGame().SelectPlayer( NULL, COM_CreateCustomDefaultCharacter() );
+// #endif
+ }
+
+ void InitHive()
+ {
+ if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) return;
+
+ // RD /s /q "storage_-1" > nul 2>&1
+ if ( !HIVE_ENABLED ) return;
+
+ Hive oHive = GetHive();
+
+ if( !oHive )
+ {
+ oHive = CreateHive();
+ }
+
+ if( oHive )
+ {
+ oHive.InitOffline();
+ }
+
+ oHive.SetShardID("100");
+ oHive.SetEnviroment("stable");
+ }
+
+ static void SetupWeather()
+ {
+ Weather weather = g_Game.GetWeather();
+
+ weather.GetOvercast().SetLimits( 0.0 , 2.0 );
+ weather.GetRain().SetLimits( 0.0 , 2.0 );
+ weather.GetFog().SetLimits( 0.0 , 2.0 );
+
+ weather.GetOvercast().SetForecastChangeLimits( 0.0, 0.0 );
+ weather.GetRain().SetForecastChangeLimits( 0.0, 0.0 );
+ weather.GetFog().SetForecastChangeLimits( 0.0, 0.0 );
+
+ weather.GetOvercast().SetForecastTimeLimits( 1800 , 1800 );
+ weather.GetRain().SetForecastTimeLimits( 600 , 600 );
+ weather.GetFog().SetForecastTimeLimits( 600 , 600 );
+
+ weather.GetOvercast().Set( 0.0, 0, 0 );
+ weather.GetRain().Set( 0.0, 0, 0 );
+ weather.GetFog().Set( 0.0, 0, 0 );
+
+ weather.SetWindMaximumSpeed( 50 );
+ weather.SetWindFunctionParams( 0, 0, 1 );
+ }
+
+ override UIScriptedMenu CreateScriptedMenu(int id)
+ {
+ if(id == EditorMenu.MENU_ID)
+ {
+ return new EditorMenu();
+ }
+
+ return super.CreateScriptedMenu(id);
+ }
+}
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/CommunityOfflineServer.c b/Missions/DayZCommunityOfflineMode.sakhal/core/CommunityOfflineServer.c
new file mode 100644
index 00000000..c35f40e1
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/CommunityOfflineServer.c
@@ -0,0 +1,122 @@
+class CommunityOfflineServer : MissionServer
+{
+ protected bool m_loaded;
+
+ void CommunityOfflineServer()
+ {
+ Print( "CommunityOfflineServer::CommunityOfflineServer()" );
+ m_loaded = false;
+
+ COM_GetModuleManager();
+ }
+
+ void ~CommunityOfflineServer()
+ {
+ Print( "CommunityOfflineServer::~CommunityOfflineServer()" );
+ }
+
+ override void OnInit()
+ {
+ super.OnInit();
+
+ SetupWeather();
+
+ COM_GetModuleManager().OnInit();
+ }
+
+ override void OnMissionStart()
+ {
+ super.OnMissionStart();
+
+ COM_GetModuleManager().OnMissionStart();
+ }
+
+ override void OnMissionFinish()
+ {
+ COM_GetModuleManager().OnMissionFinish();
+
+ super.OnMissionFinish();
+ }
+
+ void OnMissionLoaded()
+ {
+ COM_GetModuleManager().OnMissionLoaded();
+ }
+
+
+ override void OnUpdate( float timeslice )
+ {
+ super.OnUpdate( timeslice );
+
+ COM_GetModuleManager().OnUpdate( timeslice );
+
+ if( !m_loaded && !GetDayZGame().IsLoading() )
+ {
+ m_loaded = true;
+ OnMissionLoaded();
+ }
+ }
+
+ override void OnMouseButtonRelease( int button )
+ {
+ super.OnMouseButtonRelease( button );
+
+ //COM_GetModuleManager().OnMouseButtonRelease( button );
+ }
+
+ override void OnMouseButtonPress( int button )
+ {
+ super.OnMouseButtonPress( button );
+
+ //COM_GetModuleManager().OnMouseButtonPress( button );
+ }
+
+ override void OnKeyPress( int key )
+ {
+ super.OnKeyPress(key);
+
+ //COM_GetModuleManager().OnKeyPress( key );
+ }
+
+ override void OnKeyRelease( int key )
+ {
+ super.OnKeyRelease( key );
+
+ //COM_GetModuleManager().OnKeyRelease( key );
+ }
+
+ static void SetupWeather()
+ {
+ //Offical DayZ SA weather code
+ Weather weather = g_Game.GetWeather();
+
+ weather.GetOvercast().SetLimits( 0.0 , 2.0 );
+ weather.GetRain().SetLimits( 0.0 , 2.0 );
+ weather.GetFog().SetLimits( 0.0 , 2.0 );
+
+ weather.GetOvercast().SetForecastChangeLimits( 0.0, 0.0 );
+ weather.GetRain().SetForecastChangeLimits( 0.0, 0.0 );
+ weather.GetFog().SetForecastChangeLimits( 0.0, 0.0 );
+
+ weather.GetOvercast().SetForecastTimeLimits( 1800 , 1800 );
+ weather.GetRain().SetForecastTimeLimits( 600 , 600 );
+ weather.GetFog().SetForecastTimeLimits( 600 , 600 );
+
+ weather.GetOvercast().Set( 0.0, 0, 0 );
+ weather.GetRain().Set( 0.0, 0, 0 );
+ weather.GetFog().Set( 0.0, 0, 0 );
+
+ weather.SetWindMaximumSpeed( 50 );
+ weather.SetWindFunctionParams( 0, 0, 1 );
+ }
+
+ override UIScriptedMenu CreateScriptedMenu(int id)
+ {
+ if(id == EditorMenu.MENU_ID)
+ {
+ return new EditorMenu();
+ }
+
+ return super.CreateScriptedMenu(id);
+ }
+}
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/KeyMouseBinding.c b/Missions/DayZCommunityOfflineMode.sakhal/core/KeyMouseBinding.c
new file mode 100644
index 00000000..0277ccbd
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/KeyMouseBinding.c
@@ -0,0 +1,74 @@
+class KeyMouseBinding
+{
+ protected typename m_Object;
+ protected ref array< string > m_KeyBinds;
+
+ protected string m_CallbackFunction;
+ protected string m_UAInputName;
+ protected string m_Description;
+
+ protected bool m_CanBeUsedInMenu;
+
+ protected int m_ActionType;
+
+ void KeyMouseBinding( typename object, string callback, string description, bool menu = false )
+ {
+ m_Object = object;
+ m_KeyBinds = new array< string >;
+
+ m_CallbackFunction = callback;
+ m_UAInputName = "UA" + object.ToString() + callback;
+
+ m_Description = description;
+
+ m_CanBeUsedInMenu = menu;
+
+ m_ActionType = KeyMouseActionType.PRESS;
+ }
+
+ bool CanBeUsedInMenu()
+ {
+ return m_CanBeUsedInMenu;
+ }
+
+ void AddBinding( string key, int action = 1)
+ {
+ m_KeyBinds.Insert( key );
+ m_ActionType = action;
+ }
+
+ array< string > GetBindings()
+ {
+ return m_KeyBinds;
+ }
+
+ void SetActionType( int type )
+ {
+ m_ActionType = type;
+ }
+
+ int GetActionType()
+ {
+ return m_ActionType;
+ }
+
+ typename GetObject()
+ {
+ return m_Object;
+ }
+
+ string GetCallBackFunction()
+ {
+ return m_CallbackFunction;
+ }
+
+ string GetUAInputName()
+ {
+ return m_UAInputName;
+ }
+
+ string GetDescription()
+ {
+ return m_Description;
+ }
+}
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/Module.c b/Missions/DayZCommunityOfflineMode.sakhal/core/Module.c
new file mode 100644
index 00000000..00c20730
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/Module.c
@@ -0,0 +1,142 @@
+/*
+ Extend this class for separate objects
+ Only override mouse and key functions for extra utility
+*/
+class Module
+{
+ protected bool m_Enabled;
+ protected bool m_PreventInput;
+ protected ref set< ref KeyMouseBinding > m_KeyBindings;
+
+ void Module()
+ {
+ m_Enabled = true;
+ m_PreventInput = false;
+ m_KeyBindings = new set< ref KeyMouseBinding >;
+ }
+
+ void ~Module()
+ {
+ }
+
+ void Init()
+ {
+ RegisterKeyMouseBindings();
+ }
+
+ void Toggle()
+ {
+ m_Enabled = !m_Enabled;
+ }
+
+ void PreventInput(bool prevent)
+ {
+ m_PreventInput = prevent;
+ }
+
+ string GetModuleName()
+ {
+ return ClassName();
+ }
+
+ typename GetModuleType()
+ {
+ return GetModuleName().ToType();
+ }
+
+ bool IsEnabled()
+ {
+ return m_Enabled;
+ }
+
+ bool IsPreventingInput()
+ {
+ return m_PreventInput;
+ }
+
+ void RegisterKeyMouseBindings()
+ {
+ }
+
+ void RegisterKeyMouseBinding( KeyMouseBinding binding )
+ {
+ m_KeyBindings.Insert( binding );
+
+ UAInput input = GetUApi().RegisterInput( binding.GetUAInputName(), binding.GetDescription(), "core" );
+
+ if ( input == NULL ) return;
+
+ input.AddAlternative();
+
+ auto bindings = binding.GetBindings();
+ for ( int i = 0; i < bindings.Count(); i++ )
+ {
+ input.BindCombo( bindings[i] );
+ }
+ }
+
+ set< ref KeyMouseBinding > GetBindings()
+ {
+ return m_KeyBindings;
+ }
+
+ // Override functions
+
+ void onUpdate( float timeslice )
+ {
+ }
+
+ /* Mouse Functions */
+
+ void onMouseMove()
+ {
+ }
+
+ void onMouseDragY ( int state )
+ {
+ }
+
+ void onMouseDragX ( int state )
+ {
+ }
+
+ void onMouseWheelUp( int state )
+ {
+ }
+
+ void onMouseWheelDown( int state )
+ {
+ }
+
+ void onMouseButtonPress( int button )
+ {
+ }
+
+ void onMouseButtonRelease( int button )
+ {
+ }
+
+ /* Key Functions */
+
+ void onKeyPress( int key )
+ {
+ }
+
+ void onKeyRelease( int key )
+ {
+ }
+
+ /* Mission Functions */
+
+ void onMissionStart()
+ {
+ }
+
+ void onMissionFinish()
+ {
+ }
+
+ void onMissionLoaded()
+ {
+ }
+}
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/ModuleManager.c b/Missions/DayZCommunityOfflineMode.sakhal/core/ModuleManager.c
new file mode 100644
index 00000000..4099abe3
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/ModuleManager.c
@@ -0,0 +1,241 @@
+#define COM_MODULES_OLDLOADING
+
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\Module.c"
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\KeyMouseBinding.c"
+
+#ifdef COM_MODULES_OLDLOADING
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\modules\\Admintool\\module.c"
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\modules\\CameraTool\\module.c"
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\modules\\ComEditor\\module.c"
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\modules\\ComKeyBinds\\module.c"
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\modules\\ComMenu\\module.c"
+//#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\modules\\Persistency\\module.c"
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\modules\\DebugMonitor\\module.c"
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\modules\\BarrelCrosshair\\module.c"
+#endif
+
+class KeyMouseActionType
+{
+ static int PRESS = 1;
+ static int RELEASE = 2;
+ static int HOLD = 4;
+ static int DOUBLECLICK = 8;
+ static int VALUE = 16;
+}
+
+class ModuleManager
+{
+ protected ref array< ref Module > m_Modules;
+
+ void ModuleManager()
+ {
+ RegisterModules();
+ }
+
+ void ~ModuleManager()
+ {
+ m_Modules.Clear();
+
+ delete m_Modules;
+ }
+
+ void RegisterModule( Module module )
+ {
+ m_Modules.Insert( module );
+ }
+
+ void RegisterModules()
+ {
+ m_Modules = new array< ref Module >;
+
+ #ifdef MODULE_COM_EDITOR
+ RegisterModule( new ObjectEditor );
+ #endif
+ #ifdef MODULE_CAMERA_TOOL
+ RegisterModule( new CameraTool );
+ #endif
+ #ifdef MODULE_COM_KEYBINDS
+ RegisterModule( new COMKeyBinds );
+ #endif
+ #ifdef MODULE_PERSISTENCY
+ RegisterModule( new PersistencyModule );
+ #endif
+ #ifdef MODULE_DEBUG_MONITOR
+ RegisterModule( new CustomDebugMonitor );
+ #endif
+ }
+
+ void ReloadSettings()
+ {
+ for ( int i = 0; i < m_Modules.Count(); ++i)
+ {
+ // m_Modules.Get(i).ReloadSettings();
+ }
+ }
+
+ array< ref Module > GetModules()
+ {
+ return m_Modules;
+ }
+
+ void OnInit()
+ {
+ for ( int i = 0; i < m_Modules.Count(); ++i)
+ {
+ m_Modules.Get(i).Init();
+ }
+
+ GetUApi().UpdateControls();
+ }
+
+ void OnMissionStart()
+ {
+ for ( int i = 0; i < m_Modules.Count(); ++i)
+ {
+ m_Modules.Get(i).onMissionStart();
+ }
+ }
+
+ void OnMissionFinish()
+ {
+ for ( int i = 0; i < m_Modules.Count(); ++i)
+ {
+ m_Modules.Get(i).onMissionFinish();
+ }
+ }
+
+ void OnMissionLoaded()
+ {
+ for ( int i = 0; i < m_Modules.Count(); ++i)
+ {
+ m_Modules.Get(i).onMissionLoaded();
+ }
+ }
+
+ void OnUpdate( float timeslice )
+ {
+ //if ( GetGame().IsServer() && GetGame().IsMultiplayer() ) return;
+
+ bool inputIsFocused = false;
+
+ Widget focusedWidget = GetFocus();
+ if ( focusedWidget && focusedWidget.ClassName().Contains( "EditBoxWidget" ) )
+ {
+ inputIsFocused = true;
+ }
+
+ for ( int i = 0; i < m_Modules.Count(); ++i)
+ {
+ Module module = m_Modules.Get(i);
+
+ if ( !module.IsPreventingInput() )
+ {
+ auto bindings = module.GetBindings();
+
+ for ( int nBinding = 0; nBinding < bindings.Count(); ++nBinding )
+ {
+ auto k_m_Binding = bindings[ nBinding ];
+
+ if ( !k_m_Binding.CanBeUsedInMenu() && GetGame().GetUIManager().GetMenu())
+ {
+ continue;
+ }
+
+ if ( inputIsFocused )
+ {
+ continue;
+ }
+
+ UAInput input = GetUApi().GetInputByName( k_m_Binding.GetUAInputName() );
+
+ //COM_Message( k_m_Binding.GetUAInputName() + " -> " + input.LocalPress() );
+
+ //input.ForceEnable( true );
+
+ int action = k_m_Binding.GetActionType();
+
+ if ( action & KeyMouseActionType.PRESS && input.LocalPress() )
+ {
+ GetGame().GameScript.CallFunction( GetModule( k_m_Binding.GetObject() ), k_m_Binding.GetCallBackFunction(), NULL, 0 );
+ }
+
+ if ( action & KeyMouseActionType.RELEASE && input.LocalRelease() )
+ {
+ GetGame().GameScript.CallFunction( GetModule( k_m_Binding.GetObject() ), k_m_Binding.GetCallBackFunction(), NULL, 0 );
+ }
+
+ if ( action & KeyMouseActionType.HOLD && input.LocalHold() )
+ {
+ GetGame().GameScript.CallFunction( GetModule( k_m_Binding.GetObject() ), k_m_Binding.GetCallBackFunction(), NULL, 0 );
+ }
+
+ if ( action & KeyMouseActionType.DOUBLECLICK && input.LocalDoubleClick() )
+ {
+ GetGame().GameScript.CallFunction( GetModule( k_m_Binding.GetObject() ), k_m_Binding.GetCallBackFunction(), NULL, 0 );
+ }
+
+ if ( action & KeyMouseActionType.VALUE && input.LocalValue() != 0 )
+ {
+ GetGame().GameScript.CallFunction( GetModule( k_m_Binding.GetObject() ), k_m_Binding.GetCallBackFunction(), NULL, input.LocalValue() );
+ }
+ }
+ }
+
+ module.onUpdate( timeslice );
+ }
+ }
+
+ Module GetModule( typename module_Type )
+ {
+ for ( int i = 0; i < m_Modules.Count(); ++i )
+ {
+ Module module = m_Modules.Get(i);
+
+ if ( module.GetModuleType() == module_Type)
+ {
+ return module;
+ }
+ }
+
+ return NULL;
+ }
+
+ Module GetModuleByName( string module_name )
+ {
+ for ( int i = 0; i < m_Modules.Count(); ++i )
+ {
+ Module module = m_Modules.Get( i );
+
+ if (module.GetModuleName() == module_name)
+ {
+ return module;
+ }
+ }
+
+ return NULL;
+ }
+}
+
+ref ModuleManager g_com_ModuleManager;
+
+ModuleManager COM_GetModuleManager()
+{
+ if( !g_com_ModuleManager )
+ {
+ g_com_ModuleManager = new ref ModuleManager();
+ }
+
+ return g_com_ModuleManager;
+}
+
+ModuleManager NewModuleManager()
+{
+ if ( g_com_ModuleManager )
+ {
+ delete g_com_ModuleManager;
+ }
+
+ g_com_ModuleManager = new ref ModuleManager();
+
+ return g_com_ModuleManager;
+}
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/StaticFunctions.c b/Missions/DayZCommunityOfflineMode.sakhal/core/StaticFunctions.c
new file mode 100644
index 00000000..ff5f4121
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/StaticFunctions.c
@@ -0,0 +1,395 @@
+static string COM_FormatFloat( float value, int decimals )
+{
+ if ( !value.ToString().Contains(".") ) return value.ToString();
+
+ string result = "";
+ array output = new array;
+
+ value.ToString().Split(".", output);
+
+ if ( output.Count() == 0 ) return value.ToString();
+
+ if ( decimals == 0 ) return output.Get(0);
+
+ string right = output.Get(1).Substring(0, decimals);
+ result = output.Get(0) + "." + right;
+ return result;
+}
+
+static string COM_VectorToString( vector vec )
+{
+ string result = vec.ToString();
+ result.Replace( "<", "" );
+ result.Replace( ">", "" );
+ result.Replace( ",", "" );
+
+ return result;
+}
+
+static string COM_VectorToString( vector vec, int decimals )
+{
+ string result = "";
+ result = COM_FormatFloat(vec[0], decimals) + "|" + COM_FormatFloat(vec[1], decimals) + "|" + COM_FormatFloat(vec[2], decimals);
+
+ return result;
+}
+
+static TStringArray COM_GetChildrenFromBaseClass( string strConfigName, string strBaseClass )
+{
+ string child_name = "";
+ int count = GetGame().ConfigGetChildrenCount ( strConfigName );
+ TStringArray class_names = new TStringArray;
+
+ for (int p = 0; p < count; p++)
+ {
+ GetGame().ConfigGetChildName ( strConfigName, p, child_name );
+
+ if ( GetGame().IsKindOf(child_name, strBaseClass ) && ( child_name != strBaseClass ) )
+ {
+ class_names.Insert(child_name);
+ }
+ }
+
+ return class_names;
+}
+
+static TVectorArray COM_GetSpawnPoints()
+{
+ return { "15135.1 0 13901.1", "15017.8 0 13892.4", "14887.1 0 14547.9", "14749.7 0 13248.7",
+ "14697.6 0 13418.4", "14537.3 0 14755.7", "14415.3 0 14025.2", "14338.0 0 12859.5",
+ "14263.8 0 12748.7", "14172.2 0 12304.9", "14071.4 0 12033.3", "14054.9 0 11341.3",
+ "14017.8 0 2959.1", "13905.5 0 12489.7", "13852.4 0 11686.0", "13846.6 0 12050.0",
+ "13676.0 0 12262.1", "13617.4 0 12759.8", "13610.1 0 11223.6", "13594.3 0 4064.0",
+ "13587.8 0 6026.5", "13571.1 0 3056.8", "13552.6 0 4653.7", "13529.9 0 3968.3",
+ "13520.8 0 4223.7", "13504.0 0 5004.5", "13476.7 0 6136.3", "13441.6 0 5262.2",
+ "13426.6 0 5747.3", "13416.8 0 11840.4", "13400.8 0 4120.7", "13395.8 0 5902.8",
+ "13385.0 0 3946.6", "13374.4 0 6454.3", "13367.1 0 10837.1", "13366.3 0 4906.0",
+ "13337.1 0 5120.8", "13326.7 0 5489.1", "13312.7 0 6771.1", "13288.7 0 11415.1",
+ "13261.6 0 11785.2", "13171.6 0 6534.8", "13159.8 0 5401.7", "13155.2 0 5475.2",
+ "13084.9 0 7938.6", "13056.8 0 4848.5", "13048.1 0 8357.6", "13048.1 0 3867.7",
+ "12991.7 0 7287.1", "12983.0 0 5539.1", "12978.9 0 9727.8", "12950.2 0 5226.7",
+ "12942.1 0 8393.1", "12891.5 0 3673.9", "12628.7 0 10495.2", "12574.3 0 3592.8",
+ "12566.3 0 6682.6", "12465.2 0 8009.0", "12354.5 0 3480.0", "13262.8 0 7225.8" };
+}
+
+static set< Object > COM_GetObjectsAt( vector from, vector to, Object ignore = NULL, float radius = 0.5, Object with = NULL )
+{
+ vector contact_pos;
+ vector contact_dir;
+ int contact_component;
+
+ set< Object > geom = new set< Object >;
+ set< Object > view = new set< Object >;
+
+ DayZPhysics.RaycastRV( from, to, contact_pos, contact_dir, contact_component, geom, with, ignore, false, false, ObjIntersectGeom, radius );
+ DayZPhysics.RaycastRV( from, to, contact_pos, contact_dir, contact_component, view, with, ignore, false, false, ObjIntersectView, radius );
+
+ if ( geom.Count() > 0 )
+ {
+ return geom;
+ }
+ if ( view.Count() > 0 )
+ {
+ return view;
+ }
+ return NULL;
+}
+
+static Object COM_GetPointerObject( Object ignore = NULL, float radius = 0.5, Object with = NULL )
+{
+ vector dir = GetGame().GetPointerDirection();
+
+ vector from = GetGame().GetCurrentCameraPosition();
+
+ vector to = from + ( dir * 10000 );
+
+ auto objs = COM_GetObjectsAt( from, to, ignore, radius, with );
+
+ if( objs.Count() > 0 )
+ {
+ return objs[ 0 ];
+ }
+
+ return NULL;
+}
+
+static Object COM_GetCursorObject()
+{
+ vector rayStart = GetGame().GetCurrentCameraPosition();
+ vector rayEnd = rayStart + GetGame().GetCurrentCameraDirection() * 10000;
+
+ auto objs = COM_GetObjectsAt( rayStart, rayEnd );
+
+ if( objs.Count() > 0 )
+ {
+ return objs[ 0 ];
+ }
+
+ return NULL;
+}
+
+static vector COM_GetPointerPos()
+{
+ if ( !COM_GetPB() )
+ {
+ return "0 0 0";
+ }
+
+ vector dir = GetGame().GetPointerDirection();
+
+ vector from = GetGame().GetCurrentCameraPosition();
+
+ vector to = from + ( dir * 10000 );
+
+ vector rayStart = from;
+ vector rayEnd = to;
+ vector hitPos;
+ vector hitNormal;
+ int hitComponentIndex;
+ DayZPhysics.RaycastRV(rayStart, rayEnd, hitPos, hitNormal, hitComponentIndex, NULL, NULL, COM_GetPB());
+
+ return hitPos;
+}
+
+static vector COM_GetCursorPos()
+{
+ if ( !COM_GetPB() )
+ {
+ return "0 0 0";
+ }
+
+ vector rayStart = GetGame().GetCurrentCameraPosition();
+ vector rayEnd = rayStart + GetGame().GetCurrentCameraDirection() * 10000;
+ vector hitPos;
+ vector hitNormal;
+ int hitComponentIndex;
+ DayZPhysics.RaycastRV(rayStart, rayEnd, hitPos, hitNormal, hitComponentIndex, NULL, NULL, COM_GetPB());
+
+ return hitPos;
+}
+
+static void COM_Message( string txt )
+{
+ COM_GetMission().OnEvent(ChatMessageEventTypeID, new ChatMessageEventParams(CCDirect, "", txt, ""));
+}
+
+static Weapon COM_GetWeaponInHands()
+{
+ Weapon weapon_in_hands;
+ if( COM_GetPB() && COM_GetPB().GetItemInHands() ) Class.CastTo(weapon_in_hands, COM_GetPB().GetItemInHands());
+
+ return weapon_in_hands;
+}
+
+static MissionBase COM_GetMission()
+{
+ return MissionBase.Cast( GetGame().GetMission() );
+}
+
+static CommunityOfflineClient COM_GetClientMission()
+{
+ return CommunityOfflineClient.Cast( GetGame().GetMission() );
+}
+
+static CommunityOfflineServer COM_GetServerMission()
+{
+ return CommunityOfflineServer.Cast( GetGame().GetMission() );
+}
+
+static PlayerBase COM_GetPB()
+{
+ return PlayerBase.Cast( GetGame().GetPlayer() );
+}
+
+static bool COM_SHIFT()
+{
+ return( ( KeyState( KeyCode.KC_LSHIFT ) > 0 ) || ( KeyState( KeyCode.KC_RSHIFT ) > 0 ) );
+}
+
+static bool COM_CTRL()
+{
+ return( ( KeyState( KeyCode.KC_LCONTROL ) > 0 ) || ( KeyState( KeyCode.KC_RCONTROL ) > 0 ) );
+}
+
+static bool COM_ALT()
+{
+ return( ( KeyState( KeyCode.KC_LMENU ) > 0 ) || ( KeyState( KeyCode.KC_RMENU ) > 0 ) );
+}
+
+static bool COM_WINKEY()
+{
+ return( ( KeyState( KeyCode.KC_LWIN ) > 0 ) || ( KeyState( KeyCode.KC_RWIN ) > 0 ) );
+}
+
+/*
+static Weapon_Base COM_CreateWeapon( PlayerBase oPlayer )
+{
+ Weapon_Base oWpn = Weapon_Base.Cast(oPlayer.GetInventory().CreateInInventory( "M4A1_Black" ));
+ oWpn.GetInventory().CreateAttachment( "M4_Suppressor" );
+ oWpn.GetInventory().CreateAttachment( "M4_RISHndgrd_Black" );
+ oWpn.GetInventory().CreateAttachment( "M4_MPBttstck_Black" );
+ oWpn.GetInventory().CreateAttachment( "ACOGOptic" );
+
+ return oWpn;
+}
+*/
+
+static Weapon_Base COM_CreateWeapon( PlayerBase oPlayer, string sWeapon )
+{
+ Weapon_Base oWpn = Weapon_Base.Cast(oPlayer.GetInventory().CreateInInventory( sWeapon ));
+ oWpn.GetInventory().CreateAttachment( "PistolSuppressor" );
+ EntityAI optic = oWpn.GetInventory().CreateAttachment( "ReflexOptic" );
+ optic.GetInventory().CreateAttachment("Battery9V");
+
+ return oWpn;
+}
+
+static PlayerBase COM_CreateCustomDefaultCharacter()
+{
+ PlayerBase oPlayer = PlayerBase.Cast( GetGame().CreatePlayer( NULL, GetGame().CreateRandomPlayer(), COM_GetSpawnPoints().GetRandomElement(), 0, "NONE") );
+
+ oPlayer.GetInventory().CreateInInventory( "MilitaryBeret_UN" );
+ oPlayer.GetInventory().CreateInInventory( "M65Jacket_Black" );
+ oPlayer.GetInventory().CreateInInventory( "TacticalGloves_Black" );
+ oPlayer.GetInventory().CreateInInventory( "HunterPants_Autumn" );
+ oPlayer.GetInventory().CreateInInventory( "MilitaryBoots_Black" );
+ oPlayer.GetInventory().CreateInInventory( "AliceBag_Camo" );
+ oPlayer.GetInventory().CreateInInventory( "Shovel" );
+
+ Weapon_Base oWpn = COM_CreateWeapon( oPlayer, "UMP45" );
+ oPlayer.PredictiveTakeEntityToHands( oWpn );
+
+ Magazine oMag = Magazine.Cast( oPlayer.GetInventory().CreateInInventory( "Mag_UMP_25Rnd" ) );
+ oPlayer.GetDayZPlayerInventory().PostWeaponEvent( new WeaponEventAttachMagazine( oPlayer, oMag ) );
+
+ oPlayer.GetInventory().CreateInInventory( "Mag_UMP_25Rnd" );
+
+ oPlayer.SetQuickBarEntityShortcut( oWpn, 0, true );
+ oPlayer.SetQuickBarEntityShortcut( oMag, 1, true );
+
+ return oPlayer;
+}
+
+static string COM_FileAttributeToString( FileAttr attr )
+{
+ string fileType = "";
+ if ( attr & FileAttr.DIRECTORY )
+ {
+ fileType = fileType + "DIRECTORY";
+ }
+ if ( attr & FileAttr.HIDDEN )
+ {
+ fileType = fileType + "HIDDEN";
+ }
+ if ( attr & FileAttr.READONLY )
+ {
+ fileType = fileType + "READONLY";
+ }
+ if ( attr & FileAttr.INVALID )
+ {
+ fileType = fileType + "INVALID";
+ }
+ return fileType;
+}
+
+static vector COM_SnapToGround(vector pos)
+{
+ float pos_x = pos[0];
+ float pos_z = pos[2];
+ float pos_y = GetGame().SurfaceY( pos_x, pos_z );
+ vector tmp_pos = Vector( pos_x, pos_y, pos_z );
+ tmp_pos[1] = tmp_pos[1] + pos[1];
+
+ return tmp_pos;
+}
+
+static bool m_COM_GodMode; // move these to player saves? Edit: Jacob says "yes"
+static bool m_COM_OldAiming;
+static bool COM_bc_Visible;
+
+static void COM_SnapToGroundNew( Object object )
+{
+ vector pos = object.GetPosition();
+ pos[1] = GetGame().SurfaceY(pos[0], pos[2]);
+
+ vector clippingInfo[2];
+ vector objectBBOX[2];
+
+ object.GetCollisionBox( objectBBOX );
+ object.ClippingInfo( clippingInfo );
+
+ //float clipY = objectBBOX[1][1] / 2.0//- clippingInfo[0][1];
+ //pos[1] = pos[1] + objectBBOX[1][1] - clipY;
+ pos[1] = pos[1] + clippingInfo[1][1] / 2.0;//objectBBOX[0][1] - clipY
+
+ object.SetPosition(pos);
+
+ COM_ForceTargetCollisionUpdate( object );
+}
+
+static void COM_ForceTargetCollisionUpdate( Object oObj )
+{
+ if ( !oObj ) return;
+
+ vector roll = oObj.GetOrientation();
+ roll [ 2 ] = roll [ 2 ] - 1;
+ oObj.SetOrientation( roll );
+ roll [ 2 ] = roll [ 2 ] + 1;
+ oObj.SetOrientation( roll );
+}
+
+static void COM_ToggleCursor()
+{
+ if ( GetGame().GetInput().HasGameFocus( INPUT_DEVICE_MOUSE ) )
+ {
+ GetGame().GetInput().ChangeGameFocus( 1 );
+ GetGame().GetUIManager().ShowUICursor( true );
+ }
+ else
+ {
+ GetGame().GetUIManager().ShowUICursor( false );
+ GetGame().GetInput().ResetGameFocus();
+ }
+}
+
+/*
+ Token types:
+ 0 - error, no token
+ 1 - defined token (special characters etc. . / * )
+ 2 - quoted string. Quotes are removed -> TODO
+ 3 - alphabetic string
+ 4 - number
+ 5 - end of line -> TODO
+*/
+static bool COM_CheckStringType( string str, int type )
+{
+ for(int i = 0; i class_names = new array;
+
+ for ( int p = 0; p < count; p++ )
+ {
+ GetGame().ConfigGetChildName( strConfigName, p, child_name );
+
+ if( ( minScope != -1 ) && ( GetGame().ConfigGetInt( strConfigName + " " + child_name + " scope" ) < minScope ) ) continue;
+
+ if ( GetGame().IsKindOf( child_name, strBaseClass ) && ( child_name != strBaseClass ) )
+ {
+ class_names.Insert( child_name );
+ }
+ }
+
+ return class_names.GetRandomElement();
+}
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/AdminTool/gui/PositionMenu.c b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/AdminTool/gui/PositionMenu.c
new file mode 100644
index 00000000..e0ae3c88
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/AdminTool/gui/PositionMenu.c
@@ -0,0 +1,292 @@
+class PositionMenu extends PopupMenu
+{
+ protected TextListboxWidget m_LstPositionList;
+ protected EditBoxWidget m_TxtSelectedX;
+ protected EditBoxWidget m_TxtSelectedY;
+ protected EditBoxWidget m_TxtCurrentX;
+ protected EditBoxWidget m_TxtCurrentY;
+ protected ButtonWidget m_TeleportButton;
+ protected ButtonWidget m_CancelButton;
+
+ autoptr map< string, vector > Positions = new map< string, vector >;
+
+ protected bool m_bOverCurrentPos;
+
+ void PositionMenu()
+ {
+ m_bOverCurrentPos = false;
+
+ Positions.Insert( "Altar", "8090.49 0 9326.95" );
+ Positions.Insert( "Balota", "4393.72 0 2412.05" );
+ Positions.Insert( "Balota Airstrip", "5025.65 0 2363.44" );
+ Positions.Insert( "Bashnya", "4156.51 0 11747.29" );
+ Positions.Insert( "Bay Mutnaya", "5634.24 0 1947.33" );
+ Positions.Insert( "Bay Tikhaya", "1190.83 0 2194.76" );
+ Positions.Insert( "Bay Zelenaya", "11140.75 0 3090.17" );
+ Positions.Insert( "Belaya Polana", "14148.24 0 15004.23" );
+ Positions.Insert( "Berezhki", "15152.52 0 13815.69" );
+ Positions.Insert( "Berezino", "11856.29 0 8991.54" );
+ Positions.Insert( "Berezino Lumberyard", "12661.27 0 9590.91" );
+ Positions.Insert( "Berezino Shipyard", "13178.96 0 10213.62" );
+ Positions.Insert( "Black Forest", "9083.59 0 7555.09" );
+ Positions.Insert( "Black Lake", "13360.76 0 11902.36" );
+ Positions.Insert( "Black Mtn", "10246.34 0 11984.03" );
+ Positions.Insert( "Bogatyrka", "1504.85 0 8940.5" );
+ Positions.Insert( "Bor", "3317.02 0 4014.26" );
+ Positions.Insert( "Cap Golova", "8350.07 0 2443.64" );
+ Positions.Insert( "Cernaya Polana", "12199.96 0 13666.45" );
+ Positions.Insert( "Chernogorsk", "6572.9 0 2447.53" );
+ Positions.Insert( "Chernogorsk Factory", "6406.17 0 2710.03" );
+ Positions.Insert( "Chyornaya Bay", "7706.96 0 3087.25" );
+ Positions.Insert( "Crown Castle", "1430 0 9218.07" );
+ Positions.Insert( "Deep Lake", "1853.38 0 14860.82" );
+ Positions.Insert( "Devil's Castle", "6909.76 0 11371.53" );
+ Positions.Insert( "Dichina Military", "4622.19 0 8283.76" );
+ Positions.Insert( "Dobroe", "13096.32 0 14953.18" );
+ Positions.Insert( "Dolina", "11327.42 0 6645.57" );
+ Positions.Insert( "Drakon Island", "11185.96 0 2491.77" );
+ Positions.Insert( "Drozhino", "3446.32 0 4929.12" );
+ Positions.Insert( "Dubky", "6653.59 0 3674.47" );
+ Positions.Insert( "Dubrovka", "10397.6 0 9795.56" );
+ Positions.Insert( "Dubrovka Vyshnaya", "9952.95 0 10392.8" );
+ Positions.Insert( "Electrozavodsk", "10502.8 0 2336.88" );
+ Positions.Insert( "Electrozavodsk Power", "10358.14 0 2593.85" );
+ Positions.Insert( "Electrozavodsk Shipyard", "9961.48 0 1788.85" );
+ Positions.Insert( "Gnome Castle", "7410.93 0 9114.04" );
+ Positions.Insert( "Gorka", "9646.16 0 8810.25" );
+ Positions.Insert( "Green Mtn", "3744.3 0 6013.15" );
+ Positions.Insert( "Grishino", "6018.26 0 10256.4" );
+ Positions.Insert( "Grozovoy Pass", "3237.3 0 15293.46" );
+ Positions.Insert( "Guba", "14609.06 0 13283.4" );
+ Positions.Insert( "Guglovo", "8411.8 0 6687.87" );
+ Positions.Insert( "Gvozdno", "8706.38 0 11895.07" );
+ Positions.Insert( "Kabanino", "5298.35 0 8563.76" );
+ Positions.Insert( "Kamenka", "1892.27 0 2155.87" );
+ Positions.Insert( "Kamensk", "6633.17 0 14466.59" );
+ Positions.Insert( "Kamyshovo", "12170.79 0 3447.95" );
+ Positions.Insert( "Karmanovka", "12519.8 0 14679.5" );
+ Positions.Insert( "Khelm", "12286.8 0 10794.4" );
+ Positions.Insert( "Klen Mtn", "11491.72 0 11331.18" );
+ Positions.Insert( "Komarovo", "3619.86 0 2342.53" );
+ Positions.Insert( "Kozlova Mtn", "8826.96 0 2858.41" );
+ Positions.Insert( "Kozlovka", "4451.57 0 4577.18" );
+ Positions.Insert( "Krasnoe", "6486.37 0 14981.87" );
+ Positions.Insert( "Krasnostav", "11228.8 0 12223.2" );
+ Positions.Insert( "Krasnostav Airstrip", "12016.22 0 12490.07" );
+ Positions.Insert( "Krutoy Cap", "13624.71 0 3892.25" );
+ Positions.Insert( "Kumyrna", "8403.05 0 6030.65" );
+ Positions.Insert( "Lopatino", "2749.87 0 9991.8" );
+ Positions.Insert( "Mamino", "7981.69 0 13057.3" );
+ Positions.Insert( "Map Edge NE", "15321.19 0 15327.49" );
+ Positions.Insert( "Map Edge NW", "44.12 0 15330.89" );
+ Positions.Insert( "Map Edge SW", "19.82 0 1584.2" );
+ Positions.Insert( "Mogilevka", "7502.8 0 5237.32" );
+ Positions.Insert( "Msta", "11258.3 0 5511.28" );
+ Positions.Insert( "Myshkino", "2056.57 0 7425.29" );
+ Positions.Insert( "Myshkino Military", "1266.66 0 7225.99" );
+ Positions.Insert( "Myshkino Trainyard", "885.72 0 7696.21" );
+ Positions.Insert( "Nadezhdino", "5821.39 0 4764.33" );
+ Positions.Insert( "Nagornoe", "9333.93 0 14666.87" );
+ Positions.Insert( "Nizhnoye", "12895.4 0 8040.79" );
+ Positions.Insert( "Novaya Petrovka", "3471.91 0 12988.1" );
+ Positions.Insert( "Novaya Trainyard", "3526.6 0 12579.7" );
+ Positions.Insert( "Novodmitrovsk", "11595 0 14696.5" );
+ Positions.Insert( "Novoselky", "6052.29 0 3285.59" );
+ Positions.Insert( "Novy Sobor", "7159.26 0 7688.51" );
+ Positions.Insert( "NW Airfield ATC", "4618.3 0 10439.17" );
+ Positions.Insert( "NW Airfield Range", "5373.21 0 9979.8" );
+ Positions.Insert( "NW Airfield South", "4520.11 0 9421.26" );
+ Positions.Insert( "NW Airfield Tents", "4163.31 0 11014.24" );
+ Positions.Insert( "Olha", "13320.9 0 12893.05" );
+ Positions.Insert( "Oreshka Pass", "9877.39 0 6009.26" );
+ Positions.Insert( "Orlovets", "12136.28 0 7281.89" );
+ Positions.Insert( "Orlovets Factory", "11489.7 0 7592.98" );
+ Positions.Insert( "Otmel Island", "11642.89 0 3095.52" );
+ Positions.Insert( "Pavlovo", "1626.37 0 3846.56" );
+ Positions.Insert( "Pavlovo Military", "2101.77 0 3290.93" );
+ Positions.Insert( "Pogorevka", "4376.71 0 6413.21" );
+ Positions.Insert( "Polana", "10678.7 0 8090.18" );
+ Positions.Insert( "Polesovo", "5817 0 13490" );
+ Positions.Insert( "Prigorodki", "7984.89 0 3302.17" );
+ Positions.Insert( "Prud Lake", "6627.34 0 9288.07" );
+ Positions.Insert( "Pulkovo", "4902.36 0 5650.65" );
+ Positions.Insert( "Pusta", "9176.44 0 3858.71" );
+ Positions.Insert( "Pustoshka", "2992.21 0 7805.54" );
+ Positions.Insert( "Ratnoe", "6305.55 0 12708.4" );
+ Positions.Insert( "Rify", "13783.18 0 11233" );
+ Positions.Insert( "Rog Castle", "11255 0 4293.29" );
+ Positions.Insert( "Rogovo", "4731 0 6775.61" );
+ Positions.Insert( "Romashka", "8148.5 0 11015.2" );
+ Positions.Insert( "Schadenfreude Island", "24000 0 0" );
+ Positions.Insert( "Severograd", "7893.4 0 12576.3" );
+ Positions.Insert( "Shakhovka", "9670.8 0 6495.85" );
+ Positions.Insert( "Silence Lake", "1203.95 0 6507.42" );
+ Positions.Insert( "Sinystok", "1447.49 0 11924.24" );
+ Positions.Insert( "Skalisty Castle", "13493.95 0 3254.96" );
+ Positions.Insert( "Skalisty Island", "13661.17 0 2960.38" );
+ Positions.Insert( "Skvsch Biathlon Arena", "488.57 0 11118.7" );
+ Positions.Insert( "Smirnovo", "11629.3 0 15023.1" );
+ Positions.Insert( "Solnichniy", "13469.1 0 6239" );
+ Positions.Insert( "Solnichniy Factory", "13069.59 0 7161.34" );
+ Positions.Insert( "Sosnovka", "2512.53 0 6371.41" );
+ Positions.Insert( "Sosnovy Pass", "2736.13 0 6757.38" );
+ Positions.Insert( "Staroye", "10164.18 0 5460.93" );
+ Positions.Insert( "Stary Sobor", "6072.64 0 7748.56" );
+ Positions.Insert( "Stary Yar", "4935.61 0 15068" );
+ Positions.Insert( "Storozh Island (Prison)", "2611.2 0 1306.15" );
+ Positions.Insert( "Svergino", "9533.2 0 13728.4" );
+ Positions.Insert( "Svetlojarsk", "13931.93 0 13231.39" );
+ Positions.Insert( "Three Crosses Gas", "312.94 0 9362.44" );
+ Positions.Insert( "Three Valleys", "12842.1 0 5500.33" );
+ Positions.Insert( "Tisy", "3413.75 0 14810.27" );
+ Positions.Insert( "Tisy Military", "1681.3 0 14116.6" );
+ Positions.Insert( "Topolka Dam", "10280.5 0 3507.5" );
+ Positions.Insert( "Topolniki", "2821.19 0 12366.5" );
+ Positions.Insert( "Troitskoe", "7559.44 0 13515.9" );
+ Positions.Insert( "Troitskoe Military", "7866.4 0 14676.1" );
+ Positions.Insert( "Tulga", "12808.7 0 4457.13" );
+ Positions.Insert( "Turovo", "13576.5 0 14128.6" );
+ Positions.Insert( "Vavilovo", "2211.83 0 11016.4" );
+ Positions.Insert( "Veresnik Mtn", "4439.42 0 8078.14" );
+ Positions.Insert( "Vybor", "3800 0 8844.25" );
+ Positions.Insert( "Vyshnoye", "6532.61 0 6090.53" );
+ Positions.Insert( "Vysotovo", "5616.26 0 2561.77" );
+ Positions.Insert( "Willow Lake", "13254.2 0 11607.8" );
+ Positions.Insert( "Zabolotye", "1156.26 0 10006.2" );
+ Positions.Insert( "Zaprudnoe", "4927.47 0 13027.2" );
+ Positions.Insert( "Zelenogorsk", "2713.4 0 5391.75" );
+ Positions.Insert( "Zelenogorsk Trainyard", "2490.65 0 5151.76" );
+ Positions.Insert( "Zub Castle", "6541.79 0 5591.69" );
+ Positions.Insert( "Zvir", "477.35 0 5202.98" );
+ }
+
+ void ~PositionMenu()
+ {
+ }
+
+ override void Init()
+ {
+ m_LstPositionList = TextListboxWidget.Cast( layoutRoot.FindAnyWidget("tls_ppp_pm_positions_list") );
+ m_TxtSelectedX = EditBoxWidget.Cast( layoutRoot.FindAnyWidget("pnl_ppp_pm_selected_x_value") );
+ m_TxtSelectedY = EditBoxWidget.Cast( layoutRoot.FindAnyWidget("pnl_ppp_pm_selected_y_value") );
+ m_TxtCurrentX = EditBoxWidget.Cast( layoutRoot.FindAnyWidget("pnl_ppp_pm_current_x_value") );
+ m_TxtCurrentY = EditBoxWidget.Cast( layoutRoot.FindAnyWidget("pnl_ppp_pm_current_y_value") );
+ m_TeleportButton = ButtonWidget.Cast( layoutRoot.FindAnyWidget("btn_ppp_pm_teleport") );
+ m_CancelButton = ButtonWidget.Cast( layoutRoot.FindAnyWidget("btn_ppp_pm_cancel") );
+
+ for ( int nPosition = 0; nPosition < Positions.Count(); nPosition++ )
+ {
+ m_LstPositionList.AddItem( Positions.GetKey( nPosition ), NULL, 0 );
+ }
+ }
+
+ override void OnShow()
+ {
+ vector player_pos = COM_GetPB().GetPosition();
+
+ m_TxtCurrentX.SetText( player_pos[0].ToString() );
+ m_TxtCurrentY.SetText( player_pos[2].ToString() );
+ }
+
+ override void OnHide()
+ {
+
+ }
+
+ override bool OnMouseEnter(Widget w, int x, int y)
+ {
+ if ( w == m_TxtCurrentX || w == m_TxtCurrentY )
+ {
+ m_bOverCurrentPos = true;
+ }
+
+ return false;
+ }
+
+ override bool OnMouseLeave( Widget w, Widget enterW, int x, int y )
+ {
+ if ( w == m_TxtCurrentX || w == m_TxtCurrentY )
+ {
+ m_bOverCurrentPos = false;
+ }
+
+ return false;
+ }
+
+ override bool OnKeyPress( Widget w, int x, int y, int key )
+ {
+ if ( m_bOverCurrentPos )
+ {
+ m_TxtSelectedX.SetText( "" );
+ m_TxtSelectedY.SetText( "" );
+ }
+
+ return false;
+ }
+
+ override bool OnClick( Widget w, int x, int y, int button )
+ {
+ if ( w == m_TeleportButton )
+ {
+ float pos_x = 0;
+ float pos_y = 0;
+
+ if( ( m_TxtSelectedX.GetText() != "" ) && ( m_TxtSelectedY.GetText() != "" ) )
+ {
+ pos_x = m_TxtSelectedX.GetText().ToFloat();
+ pos_y = m_TxtSelectedY.GetText().ToFloat();
+ }
+ else if( ( m_TxtCurrentX.GetText() != "" ) && ( m_TxtCurrentY.GetText() != "" ) )
+ {
+ pos_x = m_TxtCurrentX.GetText().ToFloat();
+ pos_y = m_TxtCurrentY.GetText().ToFloat();
+ }
+ else
+ {
+ PlayerBase oPlayer = COM_GetPB();
+ oPlayer.MessageStatus( "Invalid teleportation position!" );
+
+ return true;
+ }
+
+ vector vPlayerPos;
+ vPlayerPos[0] = pos_x;
+ vPlayerPos[2] = pos_y;
+
+ vPlayerPos = COM_SnapToGround( vPlayerPos );
+
+ COM_GetPB().SetPosition( vPlayerPos );
+
+ return true;
+ }
+
+ return false;
+ }
+
+ override bool OnItemSelected( Widget w, int x, int y, int row, int column, int oldRow, int oldColumn )
+ {
+ vector position = "0 0 0";
+
+ if( !Positions.Find( GetCurrentPositionName(), position ) )
+ {
+ position = "0 0 0";
+ }
+
+ m_TxtSelectedX.SetText( position[0].ToString() );
+ m_TxtSelectedY.SetText( position[2].ToString() );
+
+ return true;
+ }
+
+ string GetCurrentPositionName()
+ {
+ if ( m_LstPositionList.GetSelectedRow() != -1 )
+ {
+ string position_name;
+ m_LstPositionList.GetItemText( m_LstPositionList.GetSelectedRow(), 0, position_name );
+ return position_name;
+ }
+
+ return "";
+ }
+}
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/AdminTool/gui/layouts/PositionMenu.layout b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/AdminTool/gui/layouts/PositionMenu.layout
new file mode 100644
index 00000000..84c2ca89
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/AdminTool/gui/layouts/PositionMenu.layout
@@ -0,0 +1,195 @@
+PanelWidgetClass PositionMenu
+{
+ visible 0
+ color 0 0 0 0
+ position 0.0425 0.09
+ size 250 450
+ halign right_ref
+ valign top_ref
+ hexactpos 0
+ vexactpos 0
+ hexactsize 1
+ vexactsize 1
+ scriptclass "PositionMenu"
+ style EditorPanel
+ {
+ PanelWidgetClass Background
+ {
+ visible 1
+ color 0 0 0 0.45
+ position 0 0
+ size 500 450
+ hexactpos 1
+ vexactpos 1
+ hexactsize 0
+ vexactsize 1
+ style rover_sim_colorable
+ }
+
+ PanelWidgetClass pnl_ppp_pm_title
+ {
+ visible 1
+ color 0 0 0 0.7843
+ position 0 0
+ size 1 25
+ hexactpos 1
+ vexactpos 1
+ hexactsize 0
+ vexactsize 1
+ style rover_sim_colorable
+ {
+ TextWidgetClass txt_ppp_pm_title_text
+ {
+ position 0 0
+ size 1 0.6
+ halign center_ref
+ valign center_ref
+ hexactpos 0
+ vexactpos 0
+ hexactsize 0
+ vexactsize 0
+ style Normal
+ text "Teleportation"
+ font "gui/fonts/Metron-Bold58"
+ "exact text" 1
+ "exact text size" 20
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+
+ TextListboxWidgetClass tls_ppp_pm_positions_list
+ {
+ visible 1
+ position 0.02 30
+ size 0.96 235
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ vexactsize 1
+ style Editor
+ lines 20
+ font "gui/fonts/Metron14"
+ }
+
+ TextWidgetClass txt_ppp_pm_selected_position
+ {
+ position 6.0025 274.99689
+ size 267 17
+ hexactpos 1
+ vexactpos 1
+ hexactsize 1
+ vexactsize 1
+ text "Teleportation target position:"
+ }
+
+ TextWidgetClass pnl_ppp_pm_selected_x
+ {
+ position 14.0025 298.99689
+ size 16 17
+ hexactpos 1
+ vexactpos 1
+ hexactsize 1
+ vexactsize 1
+ text "X:"
+ }
+
+ TextWidgetClass pnl_ppp_pm_selected_y
+ {
+ position 14.0025 322.99689
+ size 267 17
+ hexactpos 1
+ vexactpos 1
+ hexactsize 1
+ vexactsize 1
+ text "Y:"
+ }
+
+ EditBoxWidgetClass pnl_ppp_pm_selected_x_value
+ {
+ position 30 299
+ size 267 17
+ hexactpos 1
+ vexactpos 1
+ hexactsize 1
+ vexactsize 1
+ }
+
+ EditBoxWidgetClass pnl_ppp_pm_selected_y_value
+ {
+ position 30 323
+ size 267 17
+ hexactpos 1
+ vexactpos 1
+ hexactsize 1
+ vexactsize 1
+ }
+
+ TextWidgetClass txt_ppp_pm_current_position
+ {
+ position 6.0025 358.99689
+ size 267 17
+ hexactpos 1
+ vexactpos 1
+ hexactsize 1
+ vexactsize 1
+ text "Your position:"
+ }
+
+ TextWidgetClass pnl_ppp_pm_current_x
+ {
+ position 14.0025 382.99689
+ size 267 17
+ hexactpos 1
+ vexactpos 1
+ hexactsize 1
+ vexactsize 1
+ text "X:"
+ }
+
+ TextWidgetClass pnl_ppp_pm_current_y
+ {
+ position 14.0025 406.99689
+ size 267 17
+ hexactpos 1
+ vexactpos 1
+ hexactsize 1
+ vexactsize 1
+ text "Y:"
+ }
+
+ EditBoxWidgetClass pnl_ppp_pm_current_x_value
+ {
+ position 30 382.99689
+ size 267 17
+ hexactpos 1
+ vexactpos 1
+ hexactsize 1
+ vexactsize 1
+ }
+
+ EditBoxWidgetClass pnl_ppp_pm_current_y_value
+ {
+ position 30 406.99689
+ size 267 17
+ hexactpos 1
+ vexactpos 1
+ hexactsize 1
+ vexactsize 1
+ }
+
+ ButtonWidgetClass btn_ppp_pm_teleport
+ {
+ position 5 5
+ size 80 20
+ halign right_ref
+ valign bottom_ref
+ hexactpos 1
+ vexactpos 1
+ hexactsize 1
+ vexactsize 1
+ text "Teleport"
+ }
+ }
+}
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/AdminTool/module.c b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/AdminTool/module.c
new file mode 100644
index 00000000..dccb379f
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/AdminTool/module.c
@@ -0,0 +1,9 @@
+/*
+ Define used for optional compilations
+*/
+#define MODULE_ADMIN_TOOL
+
+/*
+ Include of all .c files that belong to this module
+*/
+//#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\modules\\Admintool\\gui\\PositionMenu.c"
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/BarrelCrosshair/CustomFirstPersonCamera.c b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/BarrelCrosshair/CustomFirstPersonCamera.c
new file mode 100644
index 00000000..805a1564
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/BarrelCrosshair/CustomFirstPersonCamera.c
@@ -0,0 +1,11 @@
+modded class DayZPlayerCamera1stPerson
+{
+ void DayZPlayerCamera1stPerson( DayZPlayer pPlayer, HumanInputController pInput )
+ {
+ m_iBoneIndex = pPlayer.GetBoneIndexByName("Face_Forehead");
+ if (m_iBoneIndex == -1)
+ {
+ Print("modded DayZPlayerCamera1stPerson: main bone not found");
+ }
+ }
+}
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/BarrelCrosshair/gui/BarrelCrosshair.c b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/BarrelCrosshair/gui/BarrelCrosshair.c
new file mode 100644
index 00000000..60a7a2e1
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/BarrelCrosshair/gui/BarrelCrosshair.c
@@ -0,0 +1,107 @@
+class BarrelCrosshair extends ScriptedWidgetEventHandler
+{
+ protected Widget m_root;
+
+ private Weapon m_Weapon;
+ private vector m_Position;
+ private PlayerBase m_Player;
+
+ float distance = 0;
+
+ void BarrelCrosshair()
+ {
+ m_Player = NULL;
+ m_Weapon = NULL;
+
+ GetGame().GetUpdateQueue(CALL_CATEGORY_GUI).Insert(this.Update);
+ }
+
+ void ~BarrelCrosshair()
+ {
+ GetGame().GetUpdateQueue(CALL_CATEGORY_GUI).Remove(this.Update);
+ }
+
+ void OnWidgetScriptInit(Widget w)
+ {
+ m_root = w;
+ m_root.SetHandler(this);
+ m_root.Update();
+ }
+
+ private void Update()
+ {
+ if(!m_Player) Class.CastTo(m_Player, COM_GetPB());
+
+ if ( COM_bc_Visible )
+ {
+ if( m_Player && m_Player.IsPlayerSelected() && !m_Player.IsInIronsights() && !GetGame().IsInventoryOpen() )
+ {
+ float sx, sy;
+
+ GetCrosshairPosition();
+ vector screenSpace = GetGame().GetScreenPos(m_Position);
+
+ m_root.GetSize(sx, sy);
+ screenSpace[0] = screenSpace[0] - sx/2.0;
+ screenSpace[1] = screenSpace[1] - sy/2.0;
+
+ /*
+ float size = 0.005 - distance/100000.0;
+ if ( size < 0.002 ) size = 0.002;
+ m_root.SetSize(size, size);
+ */
+
+ m_root.SetPos(screenSpace[0], screenSpace[1]);
+ // m_root.SetAlpha(alpha);
+
+ m_root.Show(true);
+
+ return;
+ }
+ }
+
+ if ( m_root.IsVisible() )
+ {
+ m_root.Show(false);
+ m_Position = vector.Zero;
+ }
+ }
+
+ Weapon COM_GetWeaponInHands()
+ {
+ Weapon weapon_in_hands;
+ PlayerBase player = PlayerBase.Cast(COM_GetPB());
+ if( player && player.GetItemInHands() ) Class.CastTo(weapon_in_hands, player.GetItemInHands());
+
+ return weapon_in_hands;
+ }
+
+ private void GetCrosshairPosition()
+ {
+ ItemBase itemInHands;
+ itemInHands = m_Player.GetItemInHands();
+ if( itemInHands && itemInHands.IsWeapon() )
+ {
+ if( Class.CastTo(m_Weapon, itemInHands) )
+ {
+ vector usti_hlavne_position = GetGame().ObjectGetSelectionPosition( m_Weapon, "usti hlavne" );
+ vector konec_hlavne_position = GetGame().ObjectGetSelectionPosition( m_Weapon, "konec hlavne" );
+
+ vector end_point = m_Weapon.ModelToWorld(usti_hlavne_position);
+ vector begin_point = m_Weapon.ModelToWorld(konec_hlavne_position);
+
+ vector contact_dir;
+ int contact_component;
+
+ vector aim_point = end_point - begin_point;
+ aim_point = aim_point.Normalized() * 9999;
+ aim_point = aim_point + end_point;
+
+ if (DayZPhysics.RaycastRV(begin_point, aim_point, m_Position, contact_dir, contact_component, null, null, null, false, false, ObjIntersectFire))
+ {
+ distance = vector.Distance(begin_point, m_Position);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/BarrelCrosshair/gui/layouts/BarrelCrosshair.layout b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/BarrelCrosshair/gui/layouts/BarrelCrosshair.layout
new file mode 100644
index 00000000..33a2cce5
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/BarrelCrosshair/gui/layouts/BarrelCrosshair.layout
@@ -0,0 +1,39 @@
+FrameWidgetClass BarrelCrosshairFrame
+{
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 0
+ vexactpos 0
+ hexactsize 0
+ vexactsize 0
+ {
+ ImageWidgetClass BarrelCrosshair {
+ visible 1
+ disabled 0
+ clipchildren 1
+ inheritalpha 1
+ ignorepointer 0
+ keepsafezone 0
+ position 0 0
+ size 0.004 0.004
+ color 1 0 0 0.7843
+ hexactpos 1
+ vexactpos 1
+ hexactsize 0
+ vexactsize 0
+ fixaspect fixwidth
+ draggable 0
+ scriptclass "BarrelCrosshair"
+ image0 "set:dayz_crosshairs image:dot_8x8"
+ mode blend
+ "src alpha" 1
+ "no wrap" 0
+ stretch 1
+ "flip u" 0
+ "flip v" 0
+ filter 1
+ nocache 0
+ }
+ }
+}
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/BarrelCrosshair/module.c b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/BarrelCrosshair/module.c
new file mode 100644
index 00000000..31fa0d67
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/BarrelCrosshair/module.c
@@ -0,0 +1,13 @@
+/*
+ Define used for optional compilations
+*/
+#define MODULE_BARREL_CROSSHAIR
+
+/*
+ Include of all .c files that belong to this module
+*/
+
+#ifdef COM_MODULES_OLDLOADING
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\modules\\BarrelCrosshair\\gui\\BarrelCrosshair.c"
+#endif
+
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/CameraTool.c b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/CameraTool.c
new file mode 100644
index 00000000..68553886
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/CameraTool.c
@@ -0,0 +1,748 @@
+class CameraTool extends Module
+{
+ protected Camera m_oCamera; // active static camera "staticcamera"
+
+ protected ref array m_cKeyframes = new array;
+
+ protected vector velocity; // canera velocity
+
+ protected float yawVelocity;
+ protected float pitchVelocity;
+
+ protected float m_CamFOV = 1.0; // default FOV
+ protected float m_TargetFOV = 1.0;
+ protected float m_TargetRoll;
+ protected float m_DistanceToObject;
+ protected bool m_FollowTarget = false;
+ protected bool m_FreezePlayer = false;
+ protected bool m_OrbitalCam = false;
+ protected bool m_FreezeCam = false;
+
+ protected bool m_FreezeMouse = false;
+
+ static float CAMERA_FOV = 1.0;
+ static float CAMERA_TARGETFOV = 1.0;
+ static float CAMERA_FOV_SPEED_MODIFIER = 5.0;
+ static float CAMERA_SPEED = 5.0;
+ static float CAMERA_VELDRAG = 0.9; // 0.9 - 1.0 0.9 == no smoothing
+ static float CAMERA_MSENS = 0.8; // acceleration
+ static float CAMERA_SMOOTH = 0.65; // drag
+
+ static bool CAMERA_DOF = false;
+ static bool CAMERA_AFOCUS = true;
+ static float CAMERA_BLUR = 0.0; // modified via ui
+ static float CAMERA_FLENGTH = 50.0; // modified via ui
+ static float CAMERA_FNEAR = 50.0; // modified via ui
+ static float CAMERA_FDIST = 0.0;
+ static float CAMERA_DOFFSET = 0.0;
+
+ static float CAMERA_SMOOTH_BLUR = 0.0;
+
+ static float EXPOSURE = 0.0;
+ static float CHROMABERX = 0.0; // these need to go somewhere else. not where this object is GC'd
+ static float CHROMABERY = 0.0;
+ static float HUESHIFT = 0.0;
+
+ static float ROTBLUR = 0.0;
+ static float MINDEPTH = 2.5;
+ static float MAXDEPTH = 4.5;
+
+ static float RADBLURX = 0.0;
+ static float RADBLURY = 0.0;
+ static float RADBLUROFFX = 0.0;
+ static float RADBLUROFFY = 0.0;
+
+ static float VIGNETTE = 0.0;
+ static float VARGB[4] = { 0, 0, 0, 0 };
+
+ static float CARGB[4] = { 0, 0, 0, 1 }; // color overlay
+
+ static int VIEWDISTANCE = 1600; // move later
+
+ protected vector m_CamOffset;
+
+ protected Object m_Target;
+ protected vector m_TargetPos; // Static position
+
+ protected float m_CurrentSmoothBlur;
+
+ void CameraTool()
+ {
+ }
+
+ void ~CameraTool()
+ {
+ }
+
+ override void Init()
+ {
+ super.Init();
+ }
+
+ override void onUpdate( float timeslice )
+ {
+ float speed = 0.2;
+ m_CurrentSmoothBlur = Math.Lerp( m_CurrentSmoothBlur, CAMERA_SMOOTH_BLUR, speed );
+ PPEffects.SetBlur( m_CurrentSmoothBlur );
+
+ UpdateCamera( timeslice );
+ }
+
+ override void RegisterKeyMouseBindings()
+ {
+ KeyMouseBinding toggleCamera = new KeyMouseBinding( GetModuleType(), "ToggleCamera" , "Toggle camera." );
+ KeyMouseBinding freezeCamera = new KeyMouseBinding( GetModuleType(), "FreezeCamera" , "Freezes camera." );
+ KeyMouseBinding freezePlayer = new KeyMouseBinding( GetModuleType(), "FreezePlayer" , "Freezes player.", true);
+ KeyMouseBinding followTarget = new KeyMouseBinding( GetModuleType(), "FollowTarget" , "Follows target.", true );
+ KeyMouseBinding toggleOrbit = new KeyMouseBinding( GetModuleType(), "ToggleOrbital", "Toggle orbital mode", true );
+ KeyMouseBinding targetCamera = new KeyMouseBinding( GetModuleType(), "TargetCamera" , "Targets objects or positions", true );
+ KeyMouseBinding zoomCamera = new KeyMouseBinding( GetModuleType(), "ZoomCamera" , "Zooms camera" );
+ KeyMouseBinding incCamSpeed = new KeyMouseBinding( GetModuleType(), "IncCamSpeed" , "Increase camera speed" );
+ KeyMouseBinding decCamSpeed = new KeyMouseBinding( GetModuleType(), "DecCamSpeed" , "Decrease camera speed" );
+
+ KeyMouseBinding release = new KeyMouseBinding( GetModuleType(), "Release" , "Release mouse", true);
+
+ toggleCamera.AddBinding( "kInsert" );
+ freezeCamera.AddBinding( "kBackslash" );
+ freezePlayer.AddBinding( "kCapital" );
+ followTarget.AddBinding( "kLBracket" );
+ toggleOrbit .AddBinding( "kRBracket" );
+
+ targetCamera.AddBinding( "mBMiddle" );
+
+ zoomCamera.AddBinding( "mBRight", KeyMouseActionType.HOLD );
+ zoomCamera.AddBinding( "kLControl", KeyMouseActionType.HOLD );
+
+ incCamSpeed.AddBinding( "mWheelUp" );
+ decCamSpeed.AddBinding( "mWheelDown" );
+
+ release.AddBinding( "mBRight", KeyMouseActionType.RELEASE );
+
+// zoomCamera .AddBinding( MouseState.WHEEL, 0 );
+
+ RegisterKeyMouseBinding( toggleCamera );
+ RegisterKeyMouseBinding( freezeCamera );
+ RegisterKeyMouseBinding( freezePlayer );
+ RegisterKeyMouseBinding( followTarget );
+ RegisterKeyMouseBinding( toggleOrbit );
+ RegisterKeyMouseBinding( targetCamera );
+ RegisterKeyMouseBinding( zoomCamera );
+ RegisterKeyMouseBinding( incCamSpeed );
+ RegisterKeyMouseBinding( decCamSpeed );
+ RegisterKeyMouseBinding( release );
+ }
+
+ Camera GetCamera()
+ {
+ return m_oCamera;
+ }
+
+ void EnableCamera( bool staticCam = false )
+ {
+ if ( m_oCamera )
+ {
+ return;
+ }
+
+ vector position = "0 0 0";
+
+ if ( COM_GetPB() )
+ {
+ position = COM_GetPB().GetPosition();
+ position[ 1 ] = position[ 1 ] + 2;
+ }
+
+ m_oCamera = Camera.Cast(g_Game.CreateObject( "staticcamera", position, false ));
+ m_oCamera.SetActive( true );
+
+ if ( !staticCam )
+ {
+ SetFreezePlayer( true );
+ }
+
+ m_DistanceToObject = 0.0;
+ }
+
+ void DisableCamera()
+ {
+ if ( m_oCamera )
+ {
+ //Close menu to give back control to player
+ if( GetGame().GetUIManager().GetMenu() && ( GetGame().GetUIManager().GetMenu().GetID() == 133742 ) )
+ {
+ GetGame().GetUIManager().Back();
+ }
+
+ SetFreezePlayer( false );
+ SetFreezeMouse( false );
+
+ vector position;
+
+ if( COM_CTRL() || COM_SHIFT() ) // Extra
+ {
+ position = m_oCamera.GetPosition();
+ position[ 1 ] = GetGame().SurfaceY( position[ 0 ], position[ 2 ] );
+ }
+ else
+ {
+ position = COM_GetCursorPos();
+ }
+
+ if ( COM_GetPB() )
+ {
+ COM_GetPB().SetPosition( position );
+ }
+
+ m_oCamera.SetActive( false );
+
+ GetGame().SelectPlayer( NULL, COM_GetPB() );
+
+ GetGame().ObjectDelete( m_oCamera );
+
+ m_oCamera = NULL;
+
+ m_CamFOV = 1.0;
+ m_TargetFOV = 1.0;
+ m_TargetRoll = 0;
+
+ m_FollowTarget = false;
+ m_OrbitalCam = false;
+
+ m_Target = NULL;
+ m_TargetPos = vector.Zero;
+
+ PPEffects.ResetDOFOverride();
+ }
+ }
+
+ void ToggleCamera()
+ {
+ if ( m_oCamera )
+ {
+ DisableCamera();
+ }
+ else
+ {
+ EnableCamera();
+ }
+ }
+
+ void TargetCamera()
+ {
+ if ( m_oCamera )
+ {
+ if ( GetGame().GetUIManager().IsCursorVisible() )
+ {
+ return;
+ }
+
+ if ( m_Target || m_TargetPos != vector.Zero )
+ {
+ // Stop targetting
+ m_Target = NULL;
+ m_TargetPos = vector.Zero;
+
+ SetFreezeMouse(false);
+
+ return;
+ }
+
+ vector dir = GetGame().GetPointerDirection();
+ vector from = GetGame().GetCurrentCameraPosition();
+ vector to = from + ( dir * 1000 );
+
+ set< Object > objects = COM_GetObjectsAt(from, to);
+
+ if ( objects )
+ {
+ if ( objects.Count() > 0)
+ {
+ Object object = objects.Get(0);
+ if ( object.IsInherited( EntityAI ) && !object.IsBuilding() )
+ {
+ m_Target = object;
+ return;
+ }
+ }
+ }
+ m_TargetPos = COM_GetCursorPos();
+ }
+ }
+
+ void SetTarget(Object oObject)
+ {
+ if (oObject)
+ {
+ m_Target = oObject;
+ m_TargetPos = oObject.GetPosition();
+ } else
+ {
+ m_Target = NULL;
+ }
+ }
+
+ void UpdateCamera( float timeslice)
+ {
+ if ( m_oCamera )
+ {
+
+ if ( m_CamFOV != m_TargetFOV )
+ {
+ m_CamFOV = Math.Lerp( m_CamFOV, m_TargetFOV, timeslice*CAMERA_FOV_SPEED_MODIFIER );
+ m_oCamera.SetFOV( m_CamFOV );
+ }
+
+ vector oldOrient = m_oCamera.GetOrientation();
+ if ( oldOrient[2] != m_TargetRoll )
+ {
+ //oldOrient[2] = Math.Lerp( oldOrient[2], m_TargetRoll, timeslice*CAMERA_FOV_SPEED_MODIFIER );
+ //m_oCamera.SetOrientation( oldOrient );
+ }
+
+ // Camera movement
+ Input input = GetGame().GetInput();
+
+ if ( !m_FreezeCam )
+ {
+
+ float forward = KeyState(KeyCode.KC_W) - KeyState(KeyCode.KC_S); // -1, 0, 1
+ float strafe = KeyState(KeyCode.KC_D) - KeyState(KeyCode.KC_A);
+ float altitude = KeyState(KeyCode.KC_Q) - KeyState(KeyCode.KC_Z); // change to hardcode keys? these actions can be rebinded via vanilla keybind menu
+
+ if( KeyState(KeyCode.KC_LSHIFT) )
+ {
+ forward *= 10.0;
+ strafe *= 10.0;
+ altitude *= 10.0;
+ }
+ float cam_speed = CAMERA_SPEED;
+ float drag = CAMERA_VELDRAG;
+
+ if ( CAMERA_VELDRAG == 0.9 )
+ {
+ cam_speed *= 15.0;
+ drag = 0;
+ }
+
+ vector up = vector.Up;
+ vector direction = m_oCamera.GetDirection();
+ vector directionAside = vector.Up * direction;
+
+ up = up * altitude * cam_speed * timeslice;
+ direction = direction * forward * cam_speed * timeslice;
+ directionAside = directionAside * strafe * cam_speed * timeslice;
+
+ velocity = velocity * drag;
+ velocity = ( velocity + direction + directionAside + up );
+
+ vector oldPos = m_oCamera.GetPosition();
+ vector newPos = oldPos + velocity;
+
+ float surfaceY = GetGame().SurfaceY( newPos[0], newPos[2] ) + 0.25;
+ if ( newPos[1] < surfaceY )
+ {
+ newPos[1] = surfaceY;
+ }
+
+ m_oCamera.SetPosition(newPos);
+ }
+
+ if ( !m_FreezeMouse )
+ {
+ float yawDiff = input.LocalValue("UAAimLeft") - input.LocalValue("UAAimRight");
+ float pitchDiff = input.LocalValue("UAAimDown") - input.LocalValue("UAAimUp");
+
+ yawVelocity = yawVelocity + yawDiff * CAMERA_MSENS;
+ pitchVelocity = pitchVelocity + pitchDiff * CAMERA_MSENS; // 0.8
+
+ vector newOrient = oldOrient;
+
+ newOrient[0] = oldOrient[0] - Math.RAD2DEG * yawVelocity * timeslice;
+ newOrient[1] = oldOrient[1] - Math.RAD2DEG * pitchVelocity * timeslice;
+
+ yawVelocity *= CAMERA_SMOOTH; // drag 0.9
+ pitchVelocity *= CAMERA_SMOOTH;
+
+ if( newOrient[1] < -89 )
+ newOrient[1] = -89;
+ if( newOrient[1] > 89 )
+ newOrient[1] = 89;
+
+ m_oCamera.SetOrientation( newOrient );
+ }
+
+ // Camera targetting
+ float dist = 0.0;
+ vector from = GetGame().GetCurrentCameraPosition();
+
+ if ( m_Target )
+ {
+ vector targetPos;
+
+ if ( m_Target.IsInherited( SurvivorBase ) )
+ {
+ targetPos = GetTargetCenter();
+ }
+ else
+ {
+ vector pos = m_Target.GetPosition();
+ pos[1] = GetGame().SurfaceY(pos[0], pos[2]);
+
+ vector clippingInfo;
+ vector objectBBOX;
+
+ m_Target.GetCollisionBox(objectBBOX);
+
+ pos[1] = (pos[1] - objectBBOX[1] + clippingInfo[1] - objectBBOX[1]) + 1.5;
+
+ targetPos = pos;
+ }
+
+ if ( m_OrbitalCam )
+ {
+ m_oCamera.LookAt( targetPos );
+ }
+
+ dist = vector.Distance( from, targetPos );
+
+ if ( m_FollowTarget )
+ {
+ if ( m_DistanceToObject == 0.0 )
+ {
+ m_DistanceToObject = vector.Distance(GetTargetCenter(), m_oCamera.GetPosition());
+ m_CamOffset = vector.Direction( GetTargetCenter() , m_oCamera.GetPosition() );
+ m_CamOffset.Normalize();
+ }
+
+ if ( m_OrbitalCam )
+ {
+ direction = vector.Direction( GetTargetCenter() , m_oCamera.GetPosition() );
+ direction.Normalize();
+ newPos = GetTargetCenter() + ( direction * m_DistanceToObject );
+ }
+ else
+ {
+ newPos = GetTargetCenter() + ( m_CamOffset * m_DistanceToObject );
+ }
+
+ m_oCamera.SetPosition( newPos );
+ dist = m_DistanceToObject;
+ }
+ }
+ else if ( m_TargetPos != vector.Zero )
+ {
+ // m_oCamera.LookAt( m_TargetPos ); // auto orbital
+ vector lookDir = m_TargetPos - m_oCamera.GetPosition();
+ float roll = m_oCamera.GetOrientation()[2];
+ m_oCamera.SetDirection( lookDir );
+
+ vector newRoll = m_oCamera.GetOrientation();
+ newRoll[2] = roll;
+ m_oCamera.SetOrientation(newRoll);
+ dist = vector.Distance( from, m_TargetPos );
+ }
+
+ if ( CAMERA_DOF ) // DOF enabled
+ {
+ if ( CAMERA_AFOCUS && !m_Target ) //auto focus
+ {
+ vector to = from + (GetGame().GetCurrentCameraDirection() * 9999);
+ vector contact_pos;
+
+ DayZPhysics.RaycastRV( from, to, contact_pos, NULL, NULL, NULL , NULL, NULL, false, false, ObjIntersectIFire);
+ dist = vector.Distance( from, contact_pos );
+ }
+ if ( dist > 0 ) CAMERA_FDIST = dist;
+
+ m_oCamera.SetFocus(CAMERA_FDIST, CAMERA_BLUR);
+ //m_oCamera.SetNearPlane(CAMERA_FNEAR);
+ // PPEffects.OverrideDOF(true, CAMERA_FDIST, CAMERA_FLENGTH, CAMERA_FNEAR, CAMERA_BLUR, CAMERA_DOFFSET); broken :(
+ }
+ }
+ }
+
+ void IncCamSpeed()
+ {
+ if ( m_oCamera )
+ {
+ if ( GetGame().GetUIManager().IsCursorVisible() )
+ {
+ return;
+ }
+ CAMERA_SPEED *= 1.2;
+ }
+ }
+
+ void DecCamSpeed()
+ {
+ if ( m_oCamera )
+ {
+ if ( GetGame().GetUIManager().IsCursorVisible() )
+ {
+ return;
+ }
+
+ CAMERA_SPEED *= 0.8;
+ if ( CAMERA_SPEED < 0.001 )
+ {
+ CAMERA_SPEED = 0.001;
+ }
+ }
+ }
+
+ void CameraSpeed()
+ {
+ if ( m_oCamera )
+ {
+ if ( GetGame().GetUIManager().IsCursorVisible() )
+ {
+ return;
+ }
+ int i = GetMouseState( MouseState.WHEEL );
+
+ if ( COM_ALT() )
+ {
+ vector ori = m_oCamera.GetOrientation();
+ ori[2] = ori[2] - i*5;
+ m_oCamera.SetOrientation( ori );
+ //m_TargetRoll = ori[2] - i*5; // redo this
+ //COM_Message(m_TargetRoll.ToString());
+ }
+ else
+ {
+ float value = 1.2;
+ if ( i < 0 )
+ {
+ value = 0.8;
+ }
+
+ CAMERA_SPEED *= value;
+ if ( CAMERA_SPEED < 0.001 )
+ {
+ CAMERA_SPEED = 0.001;
+ }
+ }
+ }
+ }
+
+ void Release()
+ {
+ if ( m_oCamera )
+ {
+ if ( !m_OrbitalCam )
+ {
+ SetFreezeMouse( false );
+ }
+ }
+ }
+
+ void ZoomCamera()
+ {
+ if ( m_oCamera )
+ {
+ if ( GetGame().GetUIManager().IsCursorVisible() )
+ {
+ return;
+ }
+
+ int i = GetMouseState(MouseState.Y);
+
+ if ( i != 0 )
+ {
+ SetFreezeMouse(true);
+ m_TargetFOV+=i*0.000006; // zoom speed
+
+ if ( m_TargetFOV < 0.01 )
+ {
+ m_TargetFOV = 0.01;
+ }
+ //m_oCamera.SetFOV(m_CamFOV);
+ }
+ }
+
+ /*
+ if ( m_oCamera )
+ {
+ if ( GetGame().GetUIManager().IsCursorVisible() )
+ {
+ return;
+ }
+
+ int i = GetMouseState( MouseState.WHEEL );
+
+ ObjectEditor objEditor = COM_GetModuleManager().GetModule( ObjectEditor );
+
+ if ( objEditor.m_SelectedObject )
+ {
+ return;
+ }
+
+ if ( COM_CTRL() )
+ {
+ vector ori = m_oCamera.GetOrientation();
+ m_TargetRoll = ori[2] - Math.RAD2DEG * i*0.09;
+ }
+ else
+ {
+ m_TargetFOV-=i*0.09; // invert
+ if ( m_TargetFOV < 0.01 )
+ {
+ m_TargetFOV = 0.01;
+ }
+ }
+ //m_oCamera.SetFOV(m_CamFOV);
+ }
+ */
+ }
+
+ void FreezeCamera()
+ {
+ if ( m_oCamera )
+ {
+ SetFreezeCam(!m_FreezeCam);
+ }
+ }
+
+ void FollowTarget()
+ {
+ if ( m_oCamera )
+ {
+ if ( m_Target || m_TargetPos != vector.Zero )
+ {
+ m_FollowTarget = !m_FollowTarget;
+ SetFreezeMouse( m_FollowTarget );
+ SetFreezeCam( m_FollowTarget );
+
+ if ( !m_FollowTarget )
+ {
+ m_DistanceToObject = 0.0;
+ m_CamOffset = vector.Zero;
+ }
+ }
+ }
+ }
+
+ void FreezePlayer()
+ {
+ if ( m_oCamera )
+ {
+ SetFreezePlayer( !m_FreezePlayer );
+ }
+ }
+
+ void ToggleOrbital()
+ {
+ if ( m_oCamera )
+ {
+ if ( m_Target || m_TargetPos != vector.Zero )
+ {
+ m_OrbitalCam = !m_OrbitalCam;
+ SetFreezeMouse(m_OrbitalCam);
+ if (! m_OrbitalCam )
+ {
+ SetFreezeCam(false);
+ }
+ }
+ }
+ }
+
+ override void onKeyRelease( int key ) // Fix
+ {
+ switch( key )
+ {
+ case KeyCode.KC_W:
+ case KeyCode.KC_A:
+ case KeyCode.KC_S:
+ case KeyCode.KC_D:
+ case KeyCode.KC_Q:
+ case KeyCode.KC_Z:
+ {
+ if ( m_oCamera )
+ {
+ if ( m_Target )
+ {
+ m_CamOffset = vector.Direction( GetTargetCenter() , m_oCamera.GetPosition() );
+ m_CamOffset.Normalize();
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ override void onMouseButtonRelease( int button )
+ {
+ if ( m_oCamera )
+ {
+ if ( button == MouseState.RIGHT )
+ {
+ if ( !m_OrbitalCam )
+ {
+ SetFreezeMouse( false );
+ }
+ }
+ }
+ }
+
+ override void onMouseButtonPress( int button )
+ {
+ }
+
+ bool IsUsingCamera()
+ {
+ return m_oCamera != NULL;
+ }
+
+ vector GetTargetCenter()
+ {
+ vector targetPosition;
+
+ if ( m_Target.IsInherited( SurvivorBase ))
+ {
+ targetPosition = m_Target.GetPosition();
+ targetPosition[1] = targetPosition[1] + 1.5;
+ }
+ else
+ {
+ targetPosition = m_Target.GetPosition();
+ targetPosition[1] = GetGame().SurfaceY(targetPosition[0], targetPosition[2]);
+
+ vector clippingInfo;
+ vector objectBBOX;
+
+ m_Target.GetCollisionBox(objectBBOX);
+
+ targetPosition[1] = (targetPosition[1] - objectBBOX[1] + clippingInfo[1] - objectBBOX[1]) + 1.5;
+ }
+
+ return targetPosition;
+ }
+
+ Object GetTargetObject()
+ {
+ return m_Target;
+ }
+
+ vector GetTargetPos()
+ {
+ return m_TargetPos;
+ }
+
+ void SetFreezePlayer( bool freeze )
+ {
+ m_FreezePlayer = freeze;
+ COM_GetPB().GetInputController().OverrideMovementSpeed( freeze, 0 );
+ COM_GetPB().GetInputController().OverrideAimChangeX( freeze, 0 );
+ COM_GetPB().GetInputController().OverrideAimChangeY( freeze, 0 );
+ }
+
+ void SetFreezeCam( bool freeze )
+ {
+ m_FreezeCam = freeze;
+ }
+
+ void SetFreezeMouse( bool freeze )
+ {
+ m_FreezeMouse = freeze;
+ }
+};
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/WidgetStore.c b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/WidgetStore.c
new file mode 100644
index 00000000..04a006e1
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/WidgetStore.c
@@ -0,0 +1,184 @@
+class WidgetStore
+{
+ private Widget layoutRoot;
+
+ private ref array< TextWidget > textWidgets;
+ private ref array< ButtonWidget > buttonWidgets;
+ private ref array< EditBoxWidget > editBoxWidgets;
+ private ref array< SliderWidget > sliderWidgets;
+ private ref array< TextListboxWidget > textListBoxWidgets;
+
+ private ref array< Widget > allWidgets;
+
+ void WidgetStore( Widget root )
+ {
+ layoutRoot = root;
+
+ textWidgets = new array< TextWidget >;
+ buttonWidgets = new array < ButtonWidget >;
+ editBoxWidgets = new array < EditBoxWidget >;
+ sliderWidgets = new array < SliderWidget >;
+ textListBoxWidgets = new array < TextListboxWidget >;
+ allWidgets = new array < Widget >;
+
+ Init();
+ }
+
+ void ~WidgetStore()
+ {
+ }
+
+ void Init()
+ {
+ SearchChildren( layoutRoot ); //recursion
+
+ Print( "WidgetStore Init - Testing widget loading count: " + allWidgets.Count() );
+ }
+
+ void SearchChildren( Widget widget )
+ {
+ Widget child = widget.GetChildren();
+ while ( child )
+ {
+ //Print( child.GetName() );
+ allWidgets.Insert( child );
+ AddWidget( child );
+ SearchSibling( child );
+ child = child.GetChildren();
+ }
+ }
+
+ void SearchSibling( Widget widget )
+ {
+ Widget sibling = widget.GetSibling();
+ while ( sibling )
+ {
+ //Print( sibling.GetName() );
+ allWidgets.Insert( sibling );
+ AddWidget( sibling );
+ SearchChildren( sibling );
+ sibling = sibling.GetSibling();
+ }
+ }
+
+ void FindDuplicates() //debugging
+ {
+ int duplicates = 0;
+ foreach( Widget widget : allWidgets )
+ {
+ string name = widget.GetName();
+
+ int count = 0;
+ foreach ( Widget check : allWidgets )
+ {
+ if ( name == check.GetName() )
+ {
+ count++;
+ }
+ if ( count > 1 )
+ {
+ Print( "Found duplicate: " + name );
+ duplicates++;
+ break;
+ }
+ }
+ }
+ Print( "Duplicates: " + duplicates );
+ }
+
+ void AddWidget( Widget widget )
+ {
+ if ( widget.IsInherited( TextWidget ) )
+ {
+ textWidgets.Insert( TextWidget.Cast(widget) );
+ }
+ if ( widget.IsInherited( ButtonWidget ) )
+ {
+ buttonWidgets.Insert( ButtonWidget.Cast(widget) );
+ }
+ if ( widget.IsInherited( EditBoxWidget ) )
+ {
+ editBoxWidgets.Insert( EditBoxWidget.Cast(widget) );
+ }
+ if ( widget.IsInherited( SliderWidget ) )
+ {
+ sliderWidgets.Insert( SliderWidget.Cast(widget) );
+ }
+ if ( widget.IsInherited( TextListboxWidget ))
+ {
+ textListBoxWidgets.Insert( TextListboxWidget.Cast(widget) );
+ }
+ }
+
+ Widget GetWidget( string name )
+ {
+ foreach( Widget widget : allWidgets )
+ {
+ if ( widget.GetName() == name )
+ {
+ return widget;
+ }
+ }
+ return null;
+ }
+
+ TextWidget GetTextWidget( string name )
+ {
+ foreach( Widget widget : textWidgets )
+ {
+ if ( widget.GetName() == name )
+ {
+ return TextWidget.Cast(widget);
+ }
+ }
+ return null;
+ }
+
+ ButtonWidget GetButtonWidget( string name )
+ {
+ foreach( Widget widget : buttonWidgets )
+ {
+ if ( widget.GetName() == name )
+ {
+ return ButtonWidget.Cast(widget);
+ }
+ }
+ return null;
+ }
+
+ EditBoxWidget GetEditBoxWidget( string name )
+ {
+ foreach( Widget widget : editBoxWidgets )
+ {
+ if ( widget.GetName() == name )
+ {
+ return EditBoxWidget.Cast(widget);
+ }
+ }
+ return null;
+ }
+
+ SliderWidget GetSliderWidget( string name )
+ {
+ foreach( Widget widget : sliderWidgets )
+ {
+ if ( widget.GetName() == name )
+ {
+ return SliderWidget.Cast(widget);
+ }
+ }
+ return null;
+ }
+
+ TextListboxWidget GetListboxWidget( string name )
+ {
+ foreach( Widget widget : textListBoxWidgets )
+ {
+ if ( widget.GetName() == name )
+ {
+ return TextListboxWidget.Cast(widget);
+ }
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/cKeyframe.c b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/cKeyframe.c
new file mode 100644
index 00000000..6b023a3b
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/cKeyframe.c
@@ -0,0 +1,9 @@
+class cKeyframe
+{
+ vector position;
+ vector orientation;
+
+ float fov;
+}
+
+// static proto native void InterpolateTo(Camera targetCamera, float time, int type);
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/gui/CameraSettings.c b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/gui/CameraSettings.c
new file mode 100644
index 00000000..a03ccf7d
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/gui/CameraSettings.c
@@ -0,0 +1,459 @@
+class CameraSettings extends PopupMenu
+{
+
+ private SliderWidget m_SldCamBlur;
+ private TextWidget m_TxtCamBlur;
+
+ private SliderWidget m_SldCamDist;
+ private TextWidget m_TxtCamDist;
+
+ private SliderWidget m_SldCamFLen;
+ private TextWidget m_TxtCamFlen;
+
+ private SliderWidget m_SldCamFnear;
+ private TextWidget m_TxtCamFnear;
+
+ private SliderWidget m_SldCamExp;
+ private TextWidget m_TxtCamExp;
+
+ private ButtonWidget m_btn_rot;
+ private ButtonWidget m_btn_phi
+
+ static Widget CAMERA_ROT;
+ static Widget CAMERA_PHI;
+
+ private SliderWidget m_SldChromX;
+ private SliderWidget m_SldChromY;
+
+ private TextWidget m_TxtChromX;
+ private TextWidget m_TxtChromY;
+
+ private ref WidgetStore widgetStore;
+
+ void CameraSettings()
+ {
+ }
+
+ void ~CameraSettings()
+ {
+ }
+
+ override void Init()
+ {
+ widgetStore = new WidgetStore( layoutRoot );
+
+ m_SldCamBlur = SliderWidget.Cast( layoutRoot.FindAnyWidget("camera_slider_blur") );
+ m_TxtCamBlur = TextWidget.Cast( layoutRoot.FindAnyWidget("camera_slider_blur_value") );
+
+ m_SldCamDist = SliderWidget.Cast( layoutRoot.FindAnyWidget("camera_slider_dist") );
+ m_TxtCamDist = TextWidget.Cast( layoutRoot.FindAnyWidget("camera_slider_dist_value") );
+
+ m_SldCamFLen = SliderWidget.Cast( layoutRoot.FindAnyWidget("camera_slider_flen" ) );
+ m_TxtCamFlen = TextWidget.Cast( layoutRoot.FindAnyWidget("camera_slider_flen_value") );
+
+ m_SldCamFnear = SliderWidget.Cast( layoutRoot.FindAnyWidget("camera_slider_fnear") );
+ m_TxtCamFnear = TextWidget.Cast( layoutRoot.FindAnyWidget("camera_slider_fnear_value") );
+
+ m_SldCamExp = SliderWidget.Cast(layoutRoot.FindAnyWidget("camera_slider_exp"));
+ m_TxtCamExp = TextWidget.Cast(layoutRoot.FindAnyWidget("camera_slider_exp_value"));
+
+ m_btn_rot = ButtonWidget.Cast( layoutRoot.FindAnyWidget("camera_btn_rot"));
+ m_btn_phi = ButtonWidget.Cast( layoutRoot.FindAnyWidget("camera_btn_phi"));
+
+ m_TxtChromX = TextWidget.Cast(layoutRoot.FindAnyWidget("camera_slider_chrom_value_x"));
+ m_TxtChromY = TextWidget.Cast(layoutRoot.FindAnyWidget("camera_slider_chrom_value_y"));
+
+ CAMERA_ROT = GetGame().GetWorkspace().CreateWidgets( "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\modules\\CameraTool\\gui\\layouts\\CameraROT.layout" );
+ CAMERA_PHI = GetGame().GetWorkspace().CreateWidgets( "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\modules\\CameraTool\\gui\\layouts\\CameraPHI.layout" );
+ }
+
+
+ override void OnShow()
+ {
+ super.OnShow();
+
+ GetGame().GetUpdateQueue(CALL_CATEGORY_GUI).Insert( this.Update );
+
+ UpdateEditBox();
+ }
+
+ override void OnHide()
+ {
+ super.OnHide();
+
+ }
+
+ override void Update()
+ {
+ UpdateSliders();
+ }
+
+ void UpdateEditBox()
+ {
+ widgetStore.GetEditBoxWidget("camera_input_chrom_x").SetText( CameraTool.CHROMABERX.ToString());
+ widgetStore.GetEditBoxWidget("camera_input_chrom_y").SetText( CameraTool.CHROMABERY.ToString());
+ }
+
+ override bool OnMouseLeave(Widget w, Widget enterW, int x, int y)
+ {
+ SetFocus( layoutRoot );
+ return false;
+ }
+
+ override bool OnClick(Widget w, int x, int y, int button)
+ {
+ if ( w.GetName() == "close_button" )
+ {
+ GetLayoutRoot().Show( false );
+ OnHide();
+ }
+
+ if ( w.GetName() == "camera_toggle" )
+ {
+ CameraTool cmt = CameraTool.Cast(COM_GetModuleManager().GetModule( CameraTool ));
+ GetGame().GetCallQueue( CALL_CATEGORY_GAMEPLAY ).Call( cmt.ToggleCamera ); // Fix crash
+ }
+
+ Widget effectsFrame = widgetStore.GetWidget( "camera_effects_frame" );
+ Widget settingsFrame = widgetStore.GetWidget( "camera_settings_frame" );
+
+ if ( w.GetName() == "camera_slider_tab_effects" )
+ {
+ if ( !effectsFrame.IsVisible() )
+ {
+ effectsFrame.Show(!effectsFrame.IsVisible());
+ settingsFrame.Show(!effectsFrame.IsVisible());
+ }
+ }
+ if ( w.GetName() == "camera_slider_tab_settings" )
+ {
+ if ( !settingsFrame.IsVisible() )
+ {
+ settingsFrame.Show(!settingsFrame.IsVisible());
+ effectsFrame.Show(!settingsFrame.IsVisible());
+ }
+ }
+
+ if ( w == m_btn_rot )
+ {
+ CAMERA_ROT.Show( !CAMERA_ROT.IsVisible() );
+ }
+
+ if ( w == m_btn_phi )
+ {
+ CAMERA_PHI.Show( !CAMERA_PHI.IsVisible() );
+ }
+
+ if ( w.GetName() == "camera_fov_speed_btn_inc" )
+ {
+ CameraTool.CAMERA_FOV_SPEED_MODIFIER += 1;
+ }
+
+ if ( w.GetName() == "camera_fov_speed_btn_dec" )
+ {
+ CameraTool.CAMERA_FOV_SPEED_MODIFIER -= 1;
+ if ( CameraTool.CAMERA_FOV_SPEED_MODIFIER < 0 ) CameraTool.CAMERA_FOV_SPEED_MODIFIER = 0;
+ }
+
+ if ( w.GetName() == "camera_smooth_btn_inc" )
+ {
+ CameraTool.CAMERA_SMOOTH += 0.025;
+ CameraTool.CAMERA_SMOOTH = Math.Clamp(CameraTool.CAMERA_SMOOTH, 0.0, 1.0); // ugh
+ }
+
+ if ( w.GetName() == "camera_smooth_btn_dec" )
+ {
+ CameraTool.CAMERA_SMOOTH -= 0.025;
+ CameraTool.CAMERA_SMOOTH = Math.Clamp(CameraTool.CAMERA_SMOOTH, 0.0, 1.0);
+ }
+
+ if ( w.GetName() == "camera_msens_btn_inc" )
+ {
+ CameraTool.CAMERA_MSENS += 0.05;
+ CameraTool.CAMERA_MSENS = Math.Clamp(CameraTool.CAMERA_MSENS, 0.0, 1.5);
+ }
+
+ if ( w.GetName() == "camera_msens_btn_dec" )
+ {
+ CameraTool.CAMERA_MSENS -= 0.05;
+ CameraTool.CAMERA_MSENS = Math.Clamp(CameraTool.CAMERA_MSENS, 0.0, 1.5);
+ }
+ if ( w.GetName() == "camera_msmooth_btn_inc" )
+ {
+ CameraTool.CAMERA_VELDRAG += 0.01; // percent
+ CameraTool.CAMERA_VELDRAG = Math.Clamp(CameraTool.CAMERA_VELDRAG, 0.9, 1.0);
+ }
+ if ( w.GetName() == "camera_msmooth_btn_dec" )
+ {
+ CameraTool.CAMERA_VELDRAG -= 0.01;
+ CameraTool.CAMERA_VELDRAG = Math.Clamp(CameraTool.CAMERA_VELDRAG, 0.9, 1.0); // 10 clicks
+ }
+
+ return false;
+ }
+
+ override bool OnChange( Widget w, int x, int y, bool finished )
+ {
+ Material chromAber = GetGame().GetWorld().GetMaterial("graphics/materials/postprocess/chromaber");
+ Material matColors = GetGame().GetWorld().GetMaterial("graphics/materials/postprocess/glow");
+ Material rotBlur = GetGame().GetWorld().GetMaterial("graphics/materials/postprocess/rotblur");
+ Material radBlur = GetGame().GetWorld().GetMaterial("graphics/materials/postprocess/radialblur");
+
+ SliderWidget changeSlider = widgetStore.GetSliderWidget( w.GetName() );
+ EditBoxWidget editBox = widgetStore.GetEditBoxWidget( w.GetName() );
+
+ if ( editBox )
+ {
+ string text = editBox.GetText();
+ float value = text.ToFloat();
+
+ if ( editBox.GetName() == "camera_input_chrom_x" )
+ {
+ CameraTool.CHROMABERX = value;
+ chromAber.SetParam( "PowerX", CameraTool.CHROMABERX );
+ }
+
+ if ( editBox.GetName() == "camera_input_chrom_y" )
+ {
+ CameraTool.CHROMABERY = value;
+ chromAber.SetParam( "PowerY", CameraTool.CHROMABERY );
+ }
+ return false;
+ }
+ /*
+ switch ( changeSlider.GetName() )
+ {
+ case
+ }
+ */
+
+ if ( w == m_SldCamBlur )
+ {
+ CameraTool.CAMERA_BLUR = m_SldCamBlur.GetCurrent() * 0.01; // percent
+
+ if ( m_SldCamBlur.GetCurrent() == 0 )
+ {
+ CameraTool.CAMERA_DOF = false;
+ PPEffects.ResetDOFOverride();
+ }
+ else
+ {
+ CameraTool.CAMERA_DOF = true;
+ }
+ }
+ else if ( w == m_SldCamDist )
+ {
+ if ( m_SldCamDist.GetCurrent() == 0 )
+ {
+ CameraTool.CAMERA_AFOCUS = true;
+ }
+ else
+ {
+ CameraTool.CAMERA_AFOCUS = false;
+ CameraTool.CAMERA_FDIST = m_SldCamDist.GetCurrent() * 15;
+ }
+ }
+ else if ( w == m_SldCamFLen )
+ {
+ CameraTool.CAMERA_FLENGTH = (m_SldCamFLen.GetCurrent() * 2.0);
+ }
+ else if ( w == m_SldCamFnear )
+ {
+ CameraTool.CAMERA_FNEAR = (m_SldCamFnear.GetCurrent() * 2.0);
+ }
+ else if ( w == m_SldCamExp )
+ {
+ CameraTool.EXPOSURE = (m_SldCamExp.GetCurrent() * 0.1) - 5.0;
+ GetGame().SetEVUser( CameraTool.EXPOSURE );
+ //PPEffects.SetBlur( exposure );
+
+ //float color[4];
+ //matColors.SetParam("LensDistort", CameraTool.EXPOSURE );
+ //GetPlayer().MessageStatus( CameraTool.EXPOSURE.ToString() );
+ //matColors.SetParam("PowerX", exposure);
+ // matColors.SetParam("PowerY", exposure);
+ }
+ else if ( changeSlider.GetName() == "camera_slider_hue" )
+ {
+ CameraTool.HUESHIFT = (changeSlider.GetCurrent() * 0.1) - 5.0;
+ matColors.SetParam( "Saturation", CameraTool.HUESHIFT );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_rotblur_power" )
+ {
+ CameraTool.ROTBLUR = 0.5 * (changeSlider.GetCurrent() * 0.01);
+ rotBlur.SetParam( "Power", CameraTool.ROTBLUR );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_rotblur_mindepth" )
+ {
+ CameraTool.MINDEPTH = 2.5 * (changeSlider.GetCurrent() * 0.01);
+ rotBlur.SetParam( "MinDepth", CameraTool.MINDEPTH );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_rotblur_maxdepth" )
+ {
+ CameraTool.MAXDEPTH = (changeSlider.GetCurrent() * 0.1);
+ rotBlur.SetParam( "MaxDepth", CameraTool.MAXDEPTH );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_radblur_x" )
+ {
+ CameraTool.RADBLURX = (changeSlider.GetCurrent() * 0.01);
+ radBlur.SetParam( "PowerX", CameraTool.RADBLURX );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_radblur_y" )
+ {
+ CameraTool.RADBLURY = (changeSlider.GetCurrent() * 0.01);
+ radBlur.SetParam( "PowerY", CameraTool.RADBLURY );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_radblur_offsetx" )
+ {
+ CameraTool.RADBLUROFFX = (changeSlider.GetCurrent() * 0.01);
+ radBlur.SetParam( "OffsetX", CameraTool.RADBLUROFFX );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_radblur_offsety" )
+ {
+ CameraTool.RADBLUROFFY = (changeSlider.GetCurrent() * 0.01);
+ radBlur.SetParam( "OffsetY", CameraTool.RADBLUROFFY );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_vign" )
+ {
+ CameraTool.VIGNETTE = (changeSlider.GetCurrent() * 0.02);
+ matColors.SetParam( "Vignette", CameraTool.VIGNETTE );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_vign_r" )
+ {
+ CameraTool.VARGB[0] = ((changeSlider.GetCurrent() * 0.1) - 5.0);
+ matColors.SetParam("VignetteColor", CameraTool.VARGB );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_vign_g" )
+ {
+ CameraTool.VARGB[1] = ((changeSlider.GetCurrent() * 0.1) - 5.0);
+ matColors.SetParam("VignetteColor", CameraTool.VARGB );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_vign_b" )
+ {
+ CameraTool.VARGB[2] = ((changeSlider.GetCurrent() * 0.1) - 5.0);
+ matColors.SetParam("VignetteColor", CameraTool.VARGB );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_color_r" )
+ {
+ CameraTool.CARGB[0] = ((changeSlider.GetCurrent() * 0.1) - 5.0);
+ matColors.SetParam("OverlayColor", CameraTool.CARGB );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_color_g" )
+ {
+ CameraTool.CARGB[1] = ((changeSlider.GetCurrent() * 0.1) - 5.0);
+ matColors.SetParam("OverlayColor", CameraTool.CARGB );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_color_b" )
+ {
+ CameraTool.CARGB[2] = ((changeSlider.GetCurrent() * 0.1) - 5.0);
+ matColors.SetParam("OverlayColor", CameraTool.CARGB );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_color_a" )
+ {
+ CameraTool.CARGB[3] = ((changeSlider.GetCurrent() * 0.05) - 4.0);
+ matColors.SetParam("OverlayFactor", CameraTool.CARGB[3] );
+ }
+ else if ( changeSlider.GetName() == "camera_slider_view" )
+ {
+ CameraTool.VIEWDISTANCE = 100*changeSlider.GetCurrent();
+ GetGame().GetWorld().SetPreferredViewDistance(CameraTool.VIEWDISTANCE);
+ }
+ return false;
+ }
+
+ override bool OnMouseWheel( Widget w, int x, int y, int wheel )
+ {
+ SliderWidget slider = widgetStore.GetSliderWidget( w.GetName() );
+
+ if ( slider )
+ {
+ bool up = wheel < 0;
+ int value = 1;
+
+ if ( up ) value = -1;
+
+ float current = slider.GetCurrent();
+ slider.SetCurrent( current + value );
+
+ OnChange( slider, x, y, false );
+ }
+ return false;
+ }
+
+ void UpdateSliders()
+ {
+ string cameraTarget = "None";
+
+ Object targetObject = CameraTool.Cast(COM_GetModuleManager().GetModule(CameraTool)).GetTargetObject();
+
+ if ( targetObject )
+ {
+ cameraTarget = targetObject.GetType();
+ }
+
+ vector targetPos = CameraTool.Cast(COM_GetModuleManager().GetModule(CameraTool)).GetTargetPos();
+ if ( targetPos != vector.Zero )
+ {
+ cameraTarget = COM_VectorToString( targetPos, 1 );
+ }
+
+ widgetStore.GetTextWidget("camera_target_txt").SetText("Target: " + cameraTarget );
+
+ m_TxtCamBlur.SetText((CameraTool.CAMERA_BLUR * 100.0).ToString() + "%");
+
+ string autoF = "";
+ if ( CameraTool.CAMERA_AFOCUS )
+ {
+ autoF = " (AUTO)";
+ }
+ m_TxtCamDist.SetText(CameraTool.CAMERA_FDIST.ToString()+"m" + autoF);
+ m_TxtCamFlen.SetText(CameraTool.CAMERA_FLENGTH.ToString());
+ m_TxtCamFnear.SetText(CameraTool.CAMERA_FNEAR.ToString());
+ m_TxtCamExp.SetText( CameraTool.EXPOSURE.ToString() );
+
+ widgetStore.GetTextWidget("camera_slider_hue_value").SetText( CameraTool.HUESHIFT.ToString() ); // make script param that updates child textwidget of slider based on vvariable?
+ widgetStore.GetTextWidget("camera_slider_rotblur_power_value").SetText( CameraTool.ROTBLUR.ToString() );
+ widgetStore.GetTextWidget("camera_slider_rotblur_mindepth_value").SetText( CameraTool.MINDEPTH.ToString() );
+ widgetStore.GetTextWidget("camera_slider_rotblur_maxdepth_value").SetText( CameraTool.MAXDEPTH.ToString() );
+ widgetStore.GetTextWidget("camera_slider_radblur_value_x").SetText( CameraTool.RADBLURX.ToString() );
+ widgetStore.GetTextWidget("camera_slider_radblur_value_y").SetText( CameraTool.RADBLURY.ToString() );
+ widgetStore.GetTextWidget("camera_slider_radblur_value_offsetx").SetText( CameraTool.RADBLUROFFX.ToString() );
+ widgetStore.GetTextWidget("camera_slider_radblur_value_offsety").SetText( CameraTool.RADBLUROFFY.ToString() );
+ widgetStore.GetTextWidget("camera_slider_vign_value").SetText( CameraTool.VIGNETTE.ToString() );
+ widgetStore.GetTextWidget("camera_slider_vign_value_r").SetText( CameraTool.VARGB[0].ToString() );
+ widgetStore.GetTextWidget("camera_slider_vign_value_g").SetText( CameraTool.VARGB[1].ToString() );
+ widgetStore.GetTextWidget("camera_slider_vign_value_b").SetText( CameraTool.VARGB[2].ToString() );
+ widgetStore.GetTextWidget("camera_slider_color_value_r").SetText( CameraTool.CARGB[0].ToString() );
+ widgetStore.GetTextWidget("camera_slider_color_value_g").SetText( CameraTool.CARGB[1].ToString() );
+ widgetStore.GetTextWidget("camera_slider_color_value_b").SetText( CameraTool.CARGB[2].ToString() );
+ widgetStore.GetTextWidget("camera_slider_color_value_a").SetText( CameraTool.CARGB[3].ToString() );
+ widgetStore.GetTextWidget("camera_slider_view_value").SetText( CameraTool.VIEWDISTANCE.ToString() );
+
+ // get child and update text?
+
+ // Set slider current to value
+ widgetStore.GetSliderWidget("camera_slider_hue").SetCurrent( (CameraTool.HUESHIFT + 5.0) / 0.1); // this could probably be moved to a proper system
+ widgetStore.GetSliderWidget("camera_slider_rotblur_power").SetCurrent( (CameraTool.ROTBLUR / 0.5) / 0.01);
+ widgetStore.GetSliderWidget("camera_slider_rotblur_mindepth").SetCurrent( (CameraTool.MINDEPTH / 0.01) / 2.5);
+ widgetStore.GetSliderWidget("camera_slider_rotblur_maxdepth").SetCurrent( CameraTool.MAXDEPTH / 0.1);
+ widgetStore.GetSliderWidget("camera_slider_radblur_x").SetCurrent( CameraTool.RADBLURX / 0.01);
+ widgetStore.GetSliderWidget("camera_slider_radblur_y").SetCurrent( CameraTool.RADBLURY / 0.01);
+ widgetStore.GetSliderWidget("camera_slider_radblur_offsetx").SetCurrent( CameraTool.RADBLUROFFX / 0.01);
+ widgetStore.GetSliderWidget("camera_slider_radblur_offsety").SetCurrent( CameraTool.RADBLUROFFY / 0.01);
+ widgetStore.GetSliderWidget("camera_slider_view").SetCurrent( CameraTool.VIEWDISTANCE / 100.0);
+
+ // fk me ok im lazy. cbf doing this for all the sliders.
+
+ TextWidget speedTxt = TextWidget.Cast(layoutRoot.FindAnyWidget( "camera_fov_speed_text" ));
+ speedTxt.SetText("FOV Smooth: " + CameraTool.CAMERA_FOV_SPEED_MODIFIER );
+
+ TextWidget smoothTxt = TextWidget.Cast(layoutRoot.FindAnyWidget( "camera_smooth_text" ));
+ smoothTxt.SetText("Cam Smooth: " + CameraTool.CAMERA_SMOOTH );
+
+ TextWidget sensTxt = TextWidget.Cast(layoutRoot.FindAnyWidget( "camera_msens_text" ));
+ sensTxt.SetText("Cam Sens: " + CameraTool.CAMERA_MSENS );
+
+ TextWidget flySpeed = TextWidget.Cast(layoutRoot.FindAnyWidget("camera_msmooth_text"));
+ flySpeed.SetText("Fly smooth: " + (CameraTool.CAMERA_VELDRAG - 0.9) / 0.1);
+ }
+}
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/gui/layouts/CameraPHI.layout b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/gui/layouts/CameraPHI.layout
new file mode 100644
index 00000000..960ae707
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/gui/layouts/CameraPHI.layout
@@ -0,0 +1,61 @@
+PanelWidgetClass CameraPHI
+{
+ ignorepointer 1
+ visible 0
+ position 0 0
+ size 1 1
+ halign left_ref
+ valign top_ref
+ hexactpos 0
+ vexactpos 0
+ hexactsize 0
+ vexactsize 0
+ style Editor
+ {
+ PanelWidgetClass line_horizontal_bottom
+ {
+ ignorepointer 1
+ color 1 1 1 1
+ visible 1
+ position 0 0.618
+ size 1 1
+ vexactsize 1
+ style EditorPanel
+ }
+
+ PanelWidgetClass line_horizontal_top
+ {
+ ignorepointer 1
+ color 1 1 1 1
+ visible 1
+ position 0 0.618
+ valign bottom_ref
+ size 1 1
+ vexactsize 1
+ style EditorPanel
+ }
+
+ PanelWidgetClass line_vertical_left
+ {
+ ignorepointer 1
+ color 1 1 1 1
+ visible 1
+ position 0.618 0
+ size 1 1
+ hexactsize 1
+ style EditorPanel
+ }
+
+ PanelWidgetClass line_vertical_right
+ {
+ ignorepointer 1
+ color 1 1 1 1
+ visible 1
+ position 0.618 0
+ halign right_ref
+ size 1 1
+ hexactsize 1
+ style EditorPanel
+ }
+ }
+}
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/gui/layouts/CameraROT.layout b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/gui/layouts/CameraROT.layout
new file mode 100644
index 00000000..815d67b6
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/gui/layouts/CameraROT.layout
@@ -0,0 +1,54 @@
+PanelWidgetClass CameraROT
+{
+ ignorepointer 1
+ visible 0
+ position 0 0
+ size 1 1
+ halign left_ref
+ valign top_ref
+ hexactpos 0
+ vexactpos 0
+ hexactsize 0
+ vexactsize 0
+ style Editor
+ {
+ PanelWidgetClass line_horizontal_top
+ {
+ color 1 1 1 1
+ visible 1
+ position 0 0.3333
+ size 1 1
+ vexactsize 1
+ style EditorPanel
+ }
+ PanelWidgetClass line_horizontal_bottom
+ {
+ color 1 1 1 1
+ visible 1
+ position 0 0.3333
+ size 1 1
+ vexactsize 1
+ valign bottom_ref
+ style EditorPanel
+ }
+ PanelWidgetClass line_vertical_left
+ {
+ color 1 1 1 1
+ visible 1
+ position 0.3333 0
+ size 1 1
+ hexactsize 1
+ style EditorPanel
+ }
+ PanelWidgetClass line_vertical_right
+ {
+ color 1 1 1 1
+ visible 1
+ position 0.3333 0
+ size 1 1
+ hexactsize 1
+ halign right_ref
+ style EditorPanel
+ }
+ }
+}
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/gui/layouts/CameraSettings.layout b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/gui/layouts/CameraSettings.layout
new file mode 100644
index 00000000..d544a097
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/gui/layouts/CameraSettings.layout
@@ -0,0 +1,1466 @@
+PanelWidgetClass CameraMenu
+{
+ visible 0
+ position 0.045 0.45
+ color 0 0 0 0
+ size 400 300
+ halign right_ref
+ valign top_ref
+ hexactpos 0
+ vexactpos 0
+ hexactsize 1
+ vexactsize 1
+ scriptclass "CameraSettings"
+ style EditorPanel
+ {
+ PanelWidgetClass Background
+ {
+ visible 1
+ color 0 0 0.1 0.7
+ position 0 0
+ size 1 1
+ hexactpos 1
+ vexactpos 1
+ hexactsize 0
+ vexactsize 0
+ style DayZDefaultPanelTop
+ {
+ PanelWidgetClass TitleBar
+ {
+ color 0 0 0 0.7843
+ position 0 0
+ size 1 0.1
+ hexactpos 1
+ vexactpos 1
+ hexactsize 0
+ vexactsize 0
+ style DayZDefaultPanelTop
+ {
+ TextWidgetClass TitleBarText
+ {
+ visible 1
+ position 0.01 0
+ size 0.8 0.8
+ valign center_ref
+ text "Camera Settings"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 20
+ }
+
+ ButtonWidgetClass close_button
+ {
+ color 1 0 0 1
+ position 0 0
+ size 25 25
+ halign right_ref
+ valign center_ref
+ hexactsize 1
+ vexactsize 1
+ {
+ ImageWidgetClass close_button_image
+ {
+ ignorepointer 1
+ position 0 0
+ size 25 25
+ halign right_ref
+ valign center_ref
+ hexactsize 1
+ vexactsize 1
+ image0 "set:dayz_gui image:icon_x"
+ mode additive
+ "src alpha" 1
+ }
+ }
+ }
+ }
+ }
+
+ ButtonWidgetClass camera_slider_tab_settings
+ {
+ color 1 1 1 1
+ position 0.575 0.115
+ size 80 20
+ halign left_ref
+ valign top_ref
+ hexactsize 1
+ vexactsize 1
+ style Default
+ {
+ TextWidgetClass camera_slider_tab_settings_txt
+ {
+ visible 1
+ ignorepointer 1
+ text "Settings"
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+
+ ButtonWidgetClass camera_slider_tab_effects
+ {
+ color 1 1 1 1
+ position 0.775 0.115
+ size 80 20
+ halign left_ref
+ valign top_ref
+ hexactsize 1
+ vexactsize 1
+ style Default
+ {
+ TextWidgetClass camera_slider_tab_effects_txt
+ {
+ visible 1
+ ignorepointer 1
+ text "Effects"
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+
+ TextWidgetClass camera_target_txt
+ {
+ ignorepointer 1
+ color 1 1 1 1
+ position 0.02 0.115
+ size 200 20
+ hexactsize 1
+ vexactsize 1
+ text "Target: "
+ "text halign" left
+ "text valign" center
+ }
+
+ FrameWidgetClass camera_effects_frame
+ {
+ ignorepointer 1
+ visible 0
+ {
+ PanelWidgetClass camera_sliders_effects
+ {
+ position 0 0.175
+ size 1 0.825
+ hexactpos 0
+ vexactpos 0
+ hexactsize 0
+ vexactsize 0
+ {
+ TextWidgetClass camera_slider_chrom_text
+ {
+ position 0.025 0.05
+ size 1 20
+ hexactsize 0
+ vexactsize 1
+ valign top_ref
+ halign left_ref
+ text "Chromatic Abb:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ {
+ EditBoxWidgetClass camera_input_chrom_x
+ {
+ visible 1
+ color 1 1 1 1
+ position 0.25 0
+ size 0.35 1
+ hexactpos 0
+ vexactpos 0
+ hexactsize 0
+ vexactsize 0
+ text "0.0"
+ style Editor
+ "exact text" 1"
+ }
+ EditBoxWidgetClass camera_input_chrom_y
+ {
+ visible 1
+ color 1 1 1 1
+ position 0.6 0
+ size 0.35 1
+ hexactpos 0
+ vexactpos 0
+ hexactsize 0
+ vexactsize 0
+ text "0.0"
+ style Editor
+ "exact text" 1"
+ }
+ }
+ }
+
+ TextWidgetClass camera_slider_hue_text
+ {
+ position 0.025 0.15
+ size 1 20
+ valign top_ref
+ halign left_ref
+ vexactsize 1
+ text "Hue:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ {
+ SliderWidgetClass camera_slider_hue
+ {
+ position 0.25 0
+ size 0.7 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_hue_value
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ }
+ }
+
+ TextWidgetClass camera_slider_rotblur_text
+ {
+ position 0.025 0.25
+ size 1 20
+ valign top_ref
+ halign left_ref
+ vexactsize 1
+ text "Rotation Blur:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ {
+ SliderWidgetClass camera_slider_rotblur_power
+ {
+ position 0.25 0
+ size 0.2 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_rotblur_power_value
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ SliderWidgetClass camera_slider_rotblur_mindepth
+ {
+ position 0.5 0
+ size 0.2 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_rotblur_mindepth_value
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ SliderWidgetClass camera_slider_rotblur_maxdepth
+ {
+ position 0.75 0
+ size 0.2 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_rotblur_maxdepth_value
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ }
+ }
+
+ TextWidgetClass camera_slider_radblur_text
+ {
+ position 0.025 0.35
+ size 1 20
+ valign top_ref
+ halign left_ref
+ vexactsize 1
+ text "Radial Blur:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ {
+ SliderWidgetClass camera_slider_radblur_x
+ {
+ position 0.25 0
+ size 0.175 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_radblur_value_x
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ SliderWidgetClass camera_slider_radblur_y
+ {
+ position 0.425 0
+ size 0.175 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_radblur_value_y
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ SliderWidgetClass camera_slider_radblur_offsetx
+ {
+ position 0.6 0
+ size 0.175 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_radblur_value_offsetx
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ SliderWidgetClass camera_slider_radblur_offsety
+ {
+ position 0.775 0
+ size 0.175 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_radblur_value_offsety
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ }
+ }
+
+ TextWidgetClass camera_slider_vign_txt
+ {
+ position 0.025 0.45
+ size 1 20
+ valign top_ref
+ halign left_ref
+ vexactsize 1
+ text "Vignette:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ {
+ SliderWidgetClass camera_slider_vign
+ {
+ position 0.25 0
+ size 0.175 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_vign_value
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ SliderWidgetClass camera_slider_vign_r
+ {
+ position 0.425 0
+ size 0.175 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_vign_value_r
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ SliderWidgetClass camera_slider_vign_g
+ {
+ position 0.6 0
+ size 0.175 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_vign_value_g
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ SliderWidgetClass camera_slider_vign_b
+ {
+ position 0.775 0
+ size 0.175 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_vign_value_b
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ }
+ }
+
+ TextWidgetClass camera_slider_color_txt
+ {
+ position 0.025 0.55
+ size 1 20
+ valign top_ref
+ halign left_ref
+ vexactsize 1
+ text "Overlay Color:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ {
+ SliderWidgetClass camera_slider_color_a
+ {
+ position 0.25 0
+ size 0.175 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_color_value_a
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ SliderWidgetClass camera_slider_color_r
+ {
+ position 0.425 0
+ size 0.175 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_color_value_r
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ SliderWidgetClass camera_slider_color_g
+ {
+ position 0.6 0
+ size 0.175 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_color_value_g
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ SliderWidgetClass camera_slider_color_b
+ {
+ position 0.775 0
+ size 0.175 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_color_value_b
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ }
+ }
+
+ TextWidgetClass camera_slider_view_txt
+ {
+ position 0.025 0.65
+ size 1 20
+ valign top_ref
+ halign left_ref
+ vexactsize 1
+ text "View Dist:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ {
+ SliderWidgetClass camera_slider_view
+ {
+ position 0.25 0
+ size 0.7 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_view_value
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ FrameWidgetClass camera_settings_frame
+ {
+ visible 1
+ ignorepointer 1
+ {
+ PanelWidgetClass camera_sliders
+ {
+ position 0 0.175
+ size 1 0.5
+ hexactpos 0
+ vexactpos 0
+ hexactsize 0
+ vexactsize 0
+ {
+ TextWidgetClass camera_slider_blur_text
+ {
+ position 0.025 0.05
+ size 1 20
+ hexactsize 0
+ vexactsize 1
+ valign top_ref
+ halign left_ref
+ text "Blur strength:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ {
+ SliderWidgetClass camera_slider_blur
+ {
+ position 0.25 0
+ size 0.7 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_blur_value
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ }
+ }
+
+ TextWidgetClass camera_slider_dist_text
+ {
+ position 0.025 0.25
+ size 1 20
+ valign top_ref
+ halign left_ref
+ vexactsize 1
+ text "Focus Distance:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ {
+ SliderWidgetClass camera_slider_dist
+ {
+ position 0.25 0
+ size 0.7 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_dist_value
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ }
+ }
+
+ TextWidgetClass camera_slider_flen_text
+ {
+ visible 0
+ position 0.025 0.45
+ size 1 20
+ valign top_ref
+ halign left_ref
+ vexactsize 1
+ text "Focal Length:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ {
+ SliderWidgetClass camera_slider_flen
+ {
+ position 0.25 0
+ size 0.7 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_flen_value
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ }
+ }
+
+ TextWidgetClass camera_slider_fnear_text
+ {
+ visible 0
+ position 0.025 0.65
+ size 1 20
+ valign top_ref
+ halign left_ref
+ vexactsize 1
+ text "Focal Near:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ {
+ SliderWidgetClass camera_slider_fnear
+ {
+ position 0.25 0
+ size 0.7 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_fnear_value
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ }
+ }
+
+ TextWidgetClass camera_slider_exp_txt
+ {
+ position 0.025 0.45
+ size 1 20
+ valign top_ref
+ halign left_ref
+ vexactsize 1
+ text "Exposure:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ {
+ SliderWidgetClass camera_slider_exp
+ {
+ position 0.25 0
+ size 0.7 1
+ hexactpos 0
+ vexactpos 1
+ hexactsize 0
+ hexactsize 0
+ "fill in" 1
+ "listen to input" 1
+ style Editor
+ {
+ TextWidgetClass camera_slider_exp_value
+ {
+ ignorepointer 1
+ size 1 1
+ halign center_ref
+ valign center_ref
+ hexactpos 1
+ vexactpos 1
+ hexactpos 0
+ vexactpos 0
+ text "0.0"
+ font "gui/fonts/Metron"
+ "exact text" 1
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ PanelWidgetClass camera_options_pnl
+ {
+ position 0 0.675
+ color 1 1 1 0
+ size 1 0.4
+ valign top_ref
+ halign left_ref
+ style EditorPanel
+ {
+ TextWidgetClass camera_smooth_text
+ {
+ position 0.025 0.35
+ size 1 20
+ valign top_ref
+ halign left_ref
+ vexactsize 1
+ text "Cam Smooth:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ }
+
+ ButtonWidgetClass camera_smooth_btn_dec
+ {
+ position 0.3 0.3
+ size 25 25
+ vexactsize 1
+ hexactpos 0
+ hexactsize 1
+ style Default
+ {
+ TextWidgetClass camera_smooth_btn_dec_txt
+ {
+ ignorepointer 1
+ position 0 0
+ color 1 0 0 1
+ size 25 25
+ hexactsize 1
+ vexactsize 1
+ hexactpos 1
+ vexactpos 1
+ valign top_ref
+ halign left_ref
+ text "-"
+ font "gui/fonts/Metron-Bold58"
+ "exact text" 1
+ "exact text size" 16
+ "text halign" center
+ "text valign" center
+ }
+
+ }
+ }
+
+ ButtonWidgetClass camera_smooth_btn_inc
+ {
+ position 0.375 0.3
+ size 25 25
+ vexactsize 1
+ hexactpos 0
+ hexactsize 1
+ style Default
+ {
+ TextWidgetClass camera_smooth_btn_inc_txt
+ {
+ ignorepointer 1
+ position 0 0
+ color 0 1 0 1
+ size 25 25
+ hexactsize 1
+ vexactsize 1
+ hexactpos 1
+ vexactpos 1
+ valign top_ref
+ halign left_ref
+ text "+"
+ font "gui/fonts/Metron-Bold58"
+ "exact text" 1
+ "exact text size" 16
+ "text halign" center
+ "text valign" center
+ }
+
+ }
+ }
+
+ TextWidgetClass camera_msens_text
+ {
+ position 0.025 0.125
+ size 1 20
+ valign top_ref
+ halign left_ref
+ vexactsize 1
+ text "Cam Sens:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ }
+
+ ButtonWidgetClass camera_msens_btn_dec
+ {
+ position 0.3 0.1
+ size 25 25
+ vexactsize 1
+ hexactpos 0
+ hexactsize 1
+ style Default
+ {
+ TextWidgetClass camera_msens_btn_dec_txt
+ {
+ ignorepointer 1
+ position 0 0
+ color 1 0 0 1
+ size 25 25
+ hexactsize 1
+ vexactsize 1
+ hexactpos 1
+ vexactpos 1
+ valign top_ref
+ halign left_ref
+ text "-"
+ font "gui/fonts/Metron-Bold58"
+ "exact text" 1
+ "exact text size" 16
+ "text halign" center
+ "text valign" center
+ }
+
+ }
+ }
+
+ ButtonWidgetClass camera_msens_btn_inc
+ {
+ position 0.375 0.1
+ size 25 25
+ vexactsize 1
+ hexactpos 0
+ hexactsize 1
+ style Default
+ {
+ TextWidgetClass camera_msens_btn_inc_txt
+ {
+ ignorepointer 1
+ position 0 0
+ color 0 1 0 1
+ size 25 25
+ hexactsize 1
+ vexactsize 1
+ hexactpos 1
+ vexactpos 1
+ valign top_ref
+ halign left_ref
+ text "+"
+ font "gui/fonts/Metron-Bold58"
+ "exact text" 1
+ "exact text size" 16
+ "text halign" center
+ "text valign" center
+ }
+
+ }
+ }
+
+ TextWidgetClass camera_fov_speed_text
+ {
+ position 0.5 0.125
+ size 1 20
+ valign top_ref
+ halign left_ref
+ vexactsize 1
+ text "FOV Smooth:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ }
+ ButtonWidgetClass camera_fov_speed_btn_inc
+ {
+ position 0.825 0.1
+ size 25 25
+ vexactsize 1
+ hexactpos 0
+ hexactsize 1
+ style Default
+ {
+ TextWidgetClass camera_fov_speed_btn_inc_txt
+ {
+ ignorepointer 1
+ position 0 0
+ color 0 1 0 1
+ size 25 25
+ hexactsize 1
+ vexactsize 1
+ hexactpos 1
+ vexactpos 1
+ valign top_ref
+ halign left_ref
+ text "+"
+ font "gui/fonts/Metron-Bold58"
+ "exact text" 1
+ "exact text size" 16
+ "text halign" center
+ "text valign" center
+ }
+
+ }
+ }
+
+ ButtonWidgetClass camera_fov_speed_btn_dec
+ {
+ position 0.75 0.1
+ size 25 25
+ vexactsize 1
+ hexactpos 0
+ hexactsize 1
+ style Default
+ {
+ TextWidgetClass camera_fov_speed_btn_dec_txt
+ {
+ ignorepointer 1
+ position 0 0
+ color 1 0 0 1
+ size 25 25
+ hexactsize 1
+ vexactsize 1
+ hexactpos 1
+ vexactpos 1
+ valign top_ref
+ halign left_ref
+ text "-"
+ font "gui/fonts/Metron-Bold58"
+ "exact text" 1
+ "exact text size" 16
+ "text halign" center
+ "text valign" center
+ }
+
+ }
+ }
+
+ TextWidgetClass camera_msmooth_text
+ {
+ position 0.5 0.35
+ size 1 20
+ valign top_ref
+ halign left_ref
+ vexactsize 1
+ text "Fly smooth:"
+ font "gui/fonts/MetronBook16"
+ "text halign" left
+ "exact text" 1
+ "exact text size" 14
+ }
+
+ ButtonWidgetClass camera_msmooth_btn_dec
+ {
+ position 0.75 0.3
+ size 25 25
+ vexactsize 1
+ hexactpos 0
+ hexactsize 1
+ style Default
+ {
+ TextWidgetClass camera_msmooth_btn_dec_txt
+ {
+ ignorepointer 1
+ position 0 0
+ color 1 0 0 1
+ size 25 25
+ hexactsize 1
+ vexactsize 1
+ hexactpos 1
+ vexactpos 1
+ valign top_ref
+ halign left_ref
+ text "-"
+ font "gui/fonts/Metron-Bold58"
+ "exact text" 1
+ "exact text size" 16
+ "text halign" center
+ "text valign" center
+ }
+
+ }
+ }
+
+ ButtonWidgetClass camera_msmooth_btn_inc
+ {
+ position 0.825 0.3
+ size 25 25
+ vexactsize 1
+ hexactpos 0
+ hexactsize 1
+ style Default
+ {
+ TextWidgetClass camera_msmooth_btn_inc_txt
+ {
+ ignorepointer 1
+ position 0 0
+ color 0 1 0 1
+ size 25 25
+ hexactsize 1
+ vexactsize 1
+ hexactpos 1
+ vexactpos 1
+ valign top_ref
+ halign left_ref
+ text "+"
+ font "gui/fonts/Metron-Bold58"
+ "exact text" 1
+ "exact text size" 16
+ "text halign" center
+ "text valign" center
+ }
+
+ }
+ }
+
+ ButtonWidgetClass camera_btn_rot
+ {
+ visible 1
+ size 100 25
+ color 1 1 1 1
+ position 0.025 0.55
+ valign top_ref
+ halign left_Ref
+ vexactsize 1
+ hexactsize 1
+ hexactpos 0
+ vexactpos 0
+ style Default
+ {
+ TextWidgetClass camera_btn_rot_text
+ {
+ ignorepointer 1
+ size 1 1
+ position 0 0
+ text "Rule of Thirds"
+ "exact text" 1
+ "exact text size" 14
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+
+ ButtonWidgetClass camera_btn_phi
+ {
+ visible 1
+ size 100 25
+ color 1 1 1 1
+ position 0.3 0.55
+ valign top_ref
+ halign left_Ref
+ vexactsize 1
+ hexactsize 1
+ hexactpos 0
+ vexactpos 0
+ style Default
+ {
+ TextWidgetClass camera_btn_phi_text
+ {
+ ignorepointer 1
+ size 1 1
+ position 0 0
+ text "PHI Grid"
+ "exact text" 1
+ "exact text size" 14
+ "text halign" center
+ "text valign" center
+ }
+ }
+ }
+
+ ButtonWidgetClass camera_toggle
+ {
+ visible 1
+ size 150 25
+ color 1 1 1 1
+ position 0.6 0.55
+ valign top_ref
+ halign left_Ref
+ vexactsize 1
+ hexactsize 1
+ hexactpos 0
+ vexactpos 0
+ style Default
+ {
+ TextWidgetClass camera_toggle_text
+ {
+ ignorepointer 1
+ size 1 1
+ position 0 0
+ text "Toggle Camera"
+ "exact text" 1
+ "exact text size" 16
+ "text halign" center
+ "text valign" center
+ font "gui/fonts/MetronBook-Bold28"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/module.c b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/module.c
new file mode 100644
index 00000000..f92b47dd
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/CameraTool/module.c
@@ -0,0 +1,24 @@
+#ifndef COM_MODULES_OLDLOADING
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\BaseModuleInclude.c"
+#endif
+
+/*
+ Define used for optional compilations
+*/
+#define MODULE_CAMERA_TOOL
+
+/*
+ Include of all .c files that belong to this module
+*/
+#ifdef COM_MODULES_OLDLOADING
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\modules\\CameraTool\\CameraTool.c"
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\modules\\CameraTool\\gui\\CameraSettings.c"
+#include "$CurrentDir:missions\\DayZCommunityOfflineMode.ChernarusPlus\\core\\modules\\CameraTool\\WidgetStore.c"
+#endif
+
+#ifndef COM_MODULES_OLDLOADING
+void RegisterModule()
+{
+ COM_GetModuleManager().RegisterModule( new CameraTool );
+}
+#endif
\ No newline at end of file
diff --git a/Missions/DayZCommunityOfflineMode.sakhal/core/modules/ComEditor/ObjectEditor.c b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/ComEditor/ObjectEditor.c
new file mode 100644
index 00000000..eb5f8f37
--- /dev/null
+++ b/Missions/DayZCommunityOfflineMode.sakhal/core/modules/ComEditor/ObjectEditor.c
@@ -0,0 +1,538 @@
+class ObjectEditor extends Module
+{
+ protected bool m_ObjectEditorActive = false;
+ protected bool m_IsDragging;
+ Object m_SelectedObject;
+ Object building;
+
+ // protected ref Scene active_Scene;
+ autoptr array