diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Prefabs/RocketBall.sbc b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Prefabs/RocketBall.sbc
new file mode 100644
index 000000000..88a166f42
--- /dev/null
+++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Prefabs/RocketBall.sbc
@@ -0,0 +1,2345 @@
+
+
+
+
+
+ Aristeas
+
+
+
+ 108055600967661582
+ CastShadows InScene
+ 108055600967661582
+
+
+
+
+
+ 0.01681527
+ -0.689737439
+ 0.0471778736
+ 0.722325265
+
+
+
+
+
+
+ MyModStorageComponent
+
+
+
+ -
+ ba5bfb16-27fe-4f83-8e1b-9fe04ed919d8
+
+
+
+
+
+
+
+
+ Large
+
+
+ LargeBlockSmallGenerator
+ 127494882478367085
+
+ Weldless
+ 144115188075855874
+
+
+
+ MyInventoryBase
+
+ true
+
+ 0
+ 1
+ 9223372036854.775807
+ 2147483647
+
+ CanReceive
+ false
+
+
+
+ MyTimerComponent
+
+ true
+ 0
+ 0
+ false
+ false
+ Frame100
+ 0
+ 900
+ false
+
+
+
+
+ false
+ true
+ true
+ true
+ 1
+ true
+ 1
+
+
+ LargeBlockBeacon
+ 117397356654221988
+
+
+
+ Weldless
+ 144115188075855874
+ false
+ true
+ true
+ true
+ 1
+ true
+ 200000
+ THE BALL
+
+
+ LargeBlockCockpitSeat
+ 117809699502817722
+
+
+
+ 144115188075855874
+
+
+
+ MyInventoryBase
+
+ true
+
+ 0
+ 1
+ 9223372036854.775807
+ 2147483647
+
+ CanReceive CanSend
+ false
+
+
+
+ MyMultiTextPanelComponent
+
+
+
+ 0
+
+ 1
+ NONE
+
+ 4294967295
+ 255
+ 255
+ 255
+ 255
+ 255
+ 255
+ 255
+
+
+ 4278190080
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 255
+
+ 0
+ SCRIPT
+ TSS_ArtificialHorizon
+ 2
+ true
+
+ 4288108544
+ 0
+ 88
+ 151
+ 0
+ 88
+ 151
+ 255
+
+
+ 4294962611
+ 179
+ 237
+ 255
+ 179
+ 237
+ 255
+ 255
+
+
+ 0
+
+
+
+ 0
+
+ 1
+ NONE
+
+ 4294967295
+ 255
+ 255
+ 255
+ 255
+ 255
+ 255
+ 255
+
+
+ 4278190080
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 255
+
+ 0
+ SCRIPT
+ TSS_EnergyHydrogen
+ 2
+ true
+
+ 4288108544
+ 0
+ 88
+ 151
+ 0
+ 88
+ 151
+ 255
+
+
+ 4294962611
+ 179
+ 237
+ 255
+ 179
+ 237
+ 255
+ 255
+
+
+ 0
+
+
+
+ 0
+
+ 1
+ NONE
+
+ 4294967295
+ 255
+ 255
+ 255
+ 255
+ 255
+ 255
+ 255
+
+
+ 4278190080
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 255
+
+ 0
+ SCRIPT
+ TSS_Gravity
+ 2
+ true
+
+ 4288108544
+ 0
+ 88
+ 151
+ 0
+ 88
+ 151
+ 255
+
+
+ 4294962611
+ 179
+ 237
+ 255
+ 179
+ 237
+ 255
+ 255
+
+
+ 0
+
+
+
+ 0
+
+ 1
+ NONE
+
+ 4294967295
+ 255
+ 255
+ 255
+ 255
+ 255
+ 255
+ 255
+
+
+ 4278190080
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 255
+
+ 0
+
+ 2
+
+ 4288108544
+ 0
+ 88
+ 151
+ 0
+ 88
+ 151
+ 255
+
+
+ 4294962611
+ 179
+ 237
+ 255
+ 179
+ 237
+ 255
+ 255
+
+
+ 0
+
+
+
+ 0
+
+ 1
+ NONE
+
+ 4294967295
+ 255
+ 255
+ 255
+ 255
+ 255
+ 255
+ 255
+
+
+ 4278190080
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 255
+
+ 0
+ SCRIPT
+ TSS_ClockAnalog
+ 2
+ true
+
+ 4288108544
+ 0
+ 88
+ 151
+ 0
+ 88
+ 151
+ 255
+
+
+ 4294962611
+ 179
+ 237
+ 255
+ 179
+ 237
+ 255
+ 255
+
+
+ 0
+
+
+
+ 0
+
+ 1
+ NONE
+
+ 4294967295
+ 255
+ 255
+ 255
+ 255
+ 255
+ 255
+ 255
+
+
+ 4278190080
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 255
+
+ 0
+
+ 2
+
+ 4288108544
+ 0
+ 88
+ 151
+ 0
+ 88
+ 151
+ 255
+
+
+ 4294962611
+ 179
+ 237
+ 255
+ 179
+ 237
+ 255
+ 255
+
+
+ 0
+
+
+
+
+
+
+
+ false
+ true
+ true
+ true
+ 1
+ false
+
+ Character
+
+
+
+
+
+
+ Character
+
+
+
+
+
+ Character
+
+
+
+
+
+
+
+
+
+ 0.322268754
+ 0.740566134
+ 0.339292675
+ -0.4822708
+
+
+
+ false
+ 0
+
+
+ 0
+ false
+ 0
+
+ 954916
+
+
+ LargeBlockGyro
+ 91430459503144092
+
+
+
+ 144115188075855874
+ false
+ true
+ true
+ true
+ 1
+ true
+ 0.01
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ AQD_LG_IonThrusterS_Armored
+ 91904584980615575
+
+
+
+ Weldless
+
+
+
+ MyTimerComponent
+
+ true
+ 0
+ 0
+ true
+ false
+ Frame100
+ 0
+ 100
+ false
+
+
+
+ MyModStorageComponent
+
+
+
+ -
+ 74de02b3-27f9-4960-b1c4-27351f2b06d1
+ [FlameColors]
+0.27/0.41/0.65/0.75
+0.27/0.41/0.65/0.75
+False
+Linked
+True
+
+
+
+
+
+
+
+
+ false
+ true
+ true
+ true
+ 14
+ true
+
+
+ AQD_LG_IonThrusterS_Armored
+ 131191130628960182
+
+
+
+ Weldless
+
+
+
+ MyTimerComponent
+
+ true
+ 0
+ 0
+ true
+ false
+ Frame100
+ 0
+ 100
+ false
+
+
+
+ MyModStorageComponent
+
+
+
+ -
+ 74de02b3-27f9-4960-b1c4-27351f2b06d1
+ [FlameColors]
+0.27/0.41/0.65/0.75
+0.27/0.41/0.65/0.75
+False
+Linked
+True
+
+
+
+
+
+
+
+
+ false
+ true
+ true
+ true
+ 13
+ true
+
+
+ AQD_LG_IonThrusterS_Armored
+ 120284295702293143
+
+
+
+ Weldless
+
+
+
+ MyTimerComponent
+
+ true
+ 0
+ 0
+ true
+ false
+ Frame100
+ 0
+ 100
+ false
+
+
+
+ MyModStorageComponent
+
+
+
+ -
+ 74de02b3-27f9-4960-b1c4-27351f2b06d1
+ [FlameColors]
+0.27/0.41/0.65/0.75
+0.27/0.41/0.65/0.75
+False
+Linked
+True
+
+
+
+
+
+
+
+
+ false
+ true
+ true
+ true
+ 10
+ true
+
+
+ AQD_LG_IonThrusterS_Armored
+ 97962770887056127
+
+
+
+ Weldless
+
+
+
+ MyTimerComponent
+
+ true
+ 0
+ 0
+ true
+ false
+ Frame100
+ 0
+ 100
+ false
+
+
+
+ MyModStorageComponent
+
+
+
+ -
+ 74de02b3-27f9-4960-b1c4-27351f2b06d1
+ [FlameColors]
+0.27/0.41/0.65/0.75
+0.27/0.41/0.65/0.75
+False
+Linked
+True
+
+
+
+
+
+
+
+
+ false
+ true
+ true
+ true
+ 9
+ true
+
+
+ AQD_LG_IonThrusterS_Armored
+ 91747736122410389
+
+
+
+ Weldless
+
+
+
+ MyTimerComponent
+
+ true
+ 0
+ 0
+ true
+ false
+ Frame100
+ 0
+ 100
+ false
+
+
+
+ MyModStorageComponent
+
+
+
+ -
+ 74de02b3-27f9-4960-b1c4-27351f2b06d1
+ [FlameColors]
+0.27/0.41/0.65/0.75
+0.27/0.41/0.65/0.75
+False
+Linked
+True
+
+
+
+
+
+
+
+
+ false
+ true
+ true
+ true
+ 12
+ true
+
+
+ AQD_LG_IonThrusterS_Armored
+ 112660050684883642
+
+
+
+ Weldless
+
+
+
+ MyTimerComponent
+
+ true
+ 0
+ 0
+ true
+ false
+ Frame100
+ 0
+ 100
+ false
+
+
+
+ MyModStorageComponent
+
+
+
+ -
+ 74de02b3-27f9-4960-b1c4-27351f2b06d1
+ [FlameColors]
+0.27/0.41/0.65/0.75
+0.27/0.41/0.65/0.75
+False
+Linked
+True
+
+
+
+
+
+
+
+
+ false
+ true
+ true
+ true
+ 11
+ true
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Base
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlopedCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorInvCorner2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorCorner
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorCorner2Tip
+
+
+
+ Neon_Colorable_Lights
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorBlock
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ LargeBlockArmorSlope2Tip
+
+
+
+ Weldless
+
+
+ THE BALL
+ false
+ false
+ false
+ false
+ 0
+
+
+
+
+ None
+ 0
+ 76561198274566684
+ 0
+
+
+
\ No newline at end of file
diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Prefabs/RocketBall.sbcB5 b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Prefabs/RocketBall.sbcB5
new file mode 100644
index 000000000..1fd0eaee0
Binary files /dev/null and b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Prefabs/RocketBall.sbcB5 differ
diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/RocketCore/RocketCoreGamemode.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/RocketCore/RocketCoreGamemode.cs
new file mode 100644
index 000000000..9b32138bf
--- /dev/null
+++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/RocketCore/RocketCoreGamemode.cs
@@ -0,0 +1,305 @@
+using SC.SUGMA.API;
+using SC.SUGMA.GameState;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using RichHudFramework;
+using VRage.Game.ModAPI;
+using SC.SUGMA.Utilities;
+using Sandbox.ModAPI;
+using Sandbox.Game.Entities;
+using Sandbox.Game;
+using VRageMath;
+using VRage.ModAPI;
+
+namespace SC.SUGMA.GameModes.RocketCore
+{
+ internal class RocketCoreGamemode : GamemodeBase
+ {
+ public static double MatchDuration = 20;
+
+ ///
+ /// Lists currently tracked factions.
+ ///
+ public readonly List TrackedFactions = new List();
+ public List InFactions { get; private set; } = new List();
+ protected IMyFaction _winningFaction;
+
+ public PointTracker PointTracker;
+
+ protected ShareTrackApi ShareTrackApi => SUGMA_SessionComponent.I.ShareTrackApi;
+ public MatchTimer MatchTimer => SUGMA_SessionComponent.I.GetComponent("MatchTimer");
+ public Dictionary FactionGoals = new Dictionary();
+ private bool _waitingForBallSpawn = false;
+ public override string ReadableName { get; internal set; } = "RocketCore";
+
+ public IMyCubeGrid BallEntity = null;
+
+ public override string Description { get; internal set; } =
+ "Score by pushing the ball into the enemy team's goal! Grids are made invincible.";
+
+ public RocketCoreGamemode()
+ {
+ ArgumentParser += new ArgumentParser(
+ new ArgumentParser.ArgumentDefinition(
+ time => double.TryParse(time, out MatchDuration),
+ "t",
+ "match-time",
+ "Match time, in minutes.")
+ );
+ }
+
+ public override void Close()
+ {
+ StopRound();
+ }
+
+ public override void UpdateActive()
+ {
+ if (PointTracker == null || MatchTimer == null ||
+ TrackedFactions == null) // ten billion nullchecks of aristeas
+ return;
+
+ if (MatchTimer.IsMatchEnded && MyAPIGateway.Session.IsServer)
+ StopRound();
+
+ if (_waitingForBallSpawn)
+ return;
+
+ foreach (var zoneSet in FactionGoals)
+ {
+ if (zoneSet.Value.ContainedGrids.Count <= 0)
+ continue;
+ // Goal was made
+ PointTracker.AddFactionPoints(zoneSet.Key, -1);
+ SUGMA_SessionComponent.I.GetComponent("rocHud")?.GoalScored(zoneSet.Key);
+
+ if (_winningFaction != null)
+ break;
+
+ SpawnBall();
+ Log.Info($"Goal was scored against {zoneSet.Key.Name}! New points: {PointTracker.GetFactionPoints(zoneSet.Key)}");
+
+ _waitingForBallSpawn = true;
+ }
+ }
+
+ public override void StartRound(string[] arguments = null)
+ {
+ _waitingForBallSpawn = false;
+ _winningFaction = null;
+ PointTracker = new PointTracker(3, 0);
+ PointTracker.OnFactionWin += OnFactionLose;
+
+ SUGMA_SessionComponent.I.UnregisterComponent("ROCPointTracker");
+ if (!MyAPIGateway.Utilities.IsDedicated)
+ SUGMA_SessionComponent.I.UnregisterComponent("rocHud");
+
+ foreach (var grid in ShareTrackApi.GetTrackedGrids())
+ {
+ var faction = PlayerTracker.I.GetGridFaction(grid);
+ if (faction == null || !ShareTrackApi.IsGridAlive(grid))
+ continue;
+
+ if (!TrackedFactions.Contains(faction))
+ TrackedFactions.Add(faction);
+
+ List subGrids = new List();
+ grid.GetGridGroup(GridLinkTypeEnum.Physical).GetGrids(subGrids);
+ foreach (var subGrid in subGrids)
+ {
+ ((MyCubeGrid)subGrid).Immune = true;
+ ((MyCubeGrid)subGrid).DestructibleBlocks = false;
+ }
+ }
+
+ if (TrackedFactions.Count <= 1)
+ {
+ MyAPIGateway.Utilities.ShowNotification("There aren't any combatants, idiot!", 10000, "Red");
+ StopRound();
+ return;
+ }
+
+ SUGMA_SessionComponent.I.RegisterComponent("ROCPointTracker", PointTracker);
+
+ var factionNames = new List();
+ var factionSpawns = SUtils.GetFactionSpawns();
+ foreach (var faction in TrackedFactions)
+ {
+ factionNames.Add($"|{faction.Tag}|");
+ foreach (var compareFaction in TrackedFactions)
+ {
+ if (faction == compareFaction)
+ continue;
+
+ MyAPIGateway.Session.Factions.DeclareWar(faction.FactionId, compareFaction.FactionId);
+ //MyAPIGateway.Utilities.ShowMessage("ROC", $"Declared war between {factionKvp.Key.Name} and {faction.Name}");
+ }
+
+ if (factionSpawns.ContainsKey(faction))
+ {
+ var zone = new SphereZone(
+ factionSpawns[faction].GetPosition() - factionSpawns[faction].GetPosition().Normalized() * 2500,
+ 750)
+ {
+ SphereDrawColor = faction.CustomColor.ColorMaskToRgb().SetAlphaPct(0.25f),
+ GridFilter = Array.Empty()
+ };
+ FactionGoals[faction] = zone;
+ SUGMA_SessionComponent.I.RegisterComponent($"RocZone{faction.FactionId}", zone);
+ }
+ }
+
+ InFactions = new List(TrackedFactions);
+
+ base.StartRound(arguments);
+ MyAPIGateway.Utilities.ShowNotification("Combatants: " + string.Join(" vs ", factionNames), 10000, "Red");
+ MatchTimer.Start(MatchDuration);
+
+ if (!MyAPIGateway.Utilities.IsDedicated)
+ SUGMA_SessionComponent.I.RegisterComponent("rocHud", new RocketCoreHud(this));
+
+ SpawnBall();
+
+ Log.Info("Started a ROC match." +
+ $"\n- Combatants: {string.Join(" vs ", factionNames)}");
+ }
+
+ private void OnFactionLose(IMyFaction loser)
+ {
+ foreach (var grid in ShareTrackApi.GetTrackedGrids())
+ {
+ var faction = PlayerTracker.I.GetGridFaction(grid);
+ if (faction == null || !ShareTrackApi.IsGridAlive(grid) || faction != loser) continue;
+
+ List subGrids = new List();
+ grid.GetGridGroup(GridLinkTypeEnum.Physical).GetGrids(subGrids);
+ foreach (var subGrid in subGrids)
+ {
+ ((MyCubeGrid)subGrid).Immune = false;
+ ((MyCubeGrid)subGrid).DestructibleBlocks = true;
+ }
+
+ FactionGoals[loser].IsVisible = false;
+ InFactions.Remove(loser);
+ }
+
+ if (InFactions.Count > 1) return;
+
+ _winningFaction = InFactions[0];
+ StopRound();
+ }
+
+ public override void StopRound()
+ {
+ BallEntity?.Close();
+ bool setWinnerFromArgs = false;
+ foreach (var arg in Arguments)
+ {
+ if (arg.StartsWith("win"))
+ {
+ long factionId;
+ long.TryParse(arg.Remove(0, 3), out factionId);
+
+ _winningFaction = MyAPIGateway.Session.Factions.TryGetFactionById(factionId);
+ setWinnerFromArgs = true;
+ Log.Info($"Winner in arguments found: {factionId} ({_winningFaction?.Name})");
+ break;
+ }
+ }
+
+ if (!setWinnerFromArgs && MyAPIGateway.Session.IsServer)
+ {
+ Arguments = Arguments.Concat(new[] { $"win{_winningFaction?.FactionId ?? -1}" }).ToArray();
+ }
+
+ SUGMA_SessionComponent.I.GetComponent("rocHud")?.MatchEnded(_winningFaction);
+
+ foreach (var factionKvp in TrackedFactions)
+ {
+ foreach (var faction in TrackedFactions)
+ {
+ if (faction == factionKvp)
+ continue;
+
+ MyAPIGateway.Session.Factions.SendPeaceRequest(factionKvp.FactionId, faction.FactionId);
+ MyAPIGateway.Session.Factions.AcceptPeace(faction.FactionId, factionKvp.FactionId);
+ }
+ }
+
+ // Reset destructibility
+ foreach (var grid in ShareTrackApi.GetTrackedGrids())
+ {
+ List subGrids = new List();
+ grid.GetGridGroup(GridLinkTypeEnum.Physical).GetGrids(subGrids);
+ foreach (var subGrid in subGrids)
+ {
+ ((MyCubeGrid)subGrid).Immune = false;
+ ((MyCubeGrid)subGrid).DestructibleBlocks = true;
+ }
+ }
+
+ foreach (var zone in FactionGoals)
+ SUGMA_SessionComponent.I.UnregisterComponent(zone.Value.ComponentId);
+
+ MatchTimer?.Stop();
+ SUGMA_SessionComponent.I.UnregisterComponent("PointTracker");
+
+ base.StopRound();
+ InFactions.Clear();
+ TrackedFactions.Clear();
+ FactionGoals.Clear();
+ PointTracker = null;
+ }
+
+ protected void SpawnBall()
+ {
+ if (!MyAPIGateway.Session.IsServer)
+ return;
+
+ BallEntity?.Close();
+ MyVisualScriptLogicProvider.PrefabSpawned += PrefabSpawned;
+ MyVisualScriptLogicProvider.SpawnPrefab("THE BALL", SUtils.RandVector().Normalized() * 250, Vector3D.Forward, Vector3D.Up, entityName: "SugmaTheBall");
+ }
+
+ private void PrefabSpawned(string entityName)
+ {
+ try
+ {
+ IMyEntity ballEnt;
+ if (!MyAPIGateway.Entities.TryGetEntityByName(entityName, out ballEnt))
+ throw new Exception("Could not find ball entity!");
+
+ BallEntity = (IMyCubeGrid) ballEnt;
+ SUGMA_SessionComponent.I.ShareTrackApi.TrackGrid(BallEntity);
+
+ MyVisualScriptLogicProvider.PrefabSpawned -= PrefabSpawned;
+ Log.Info("RocketCoreGamemode spawned ball entity " + entityName + " at " + BallEntity.GetPosition());
+
+ var array = new[]
+ {
+ BallEntity
+ };
+
+ foreach (var zone in FactionGoals)
+ zone.Value.GridFilter = array;
+ _waitingForBallSpawn = false;
+ }
+ catch (Exception ex)
+ {
+ Log.Exception(ex, typeof(RocketCoreGamemode));
+ }
+ }
+
+ internal override void DisplayWinMessage()
+ {
+ if (_winningFaction == null)
+ {
+ MyAPIGateway.Utilities.ShowNotification("YOU ARE ALL LOSERS.", 10000, "Red");
+ return;
+ }
+
+ MyAPIGateway.Utilities.ShowNotification($"A WINNER IS [{_winningFaction?.Name}]!", 10000);
+ }
+ }
+}
diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/RocketCore/RocketCoreHud.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/RocketCore/RocketCoreHud.cs
new file mode 100644
index 000000000..3b4270e2d
--- /dev/null
+++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/RocketCore/RocketCoreHud.cs
@@ -0,0 +1,172 @@
+using RichHudFramework.Client;
+using RichHudFramework.UI;
+using RichHudFramework.UI.Client;
+using Sandbox.Game.Entities;
+using SC.SUGMA.GameModes.Elimination;
+using SC.SUGMA.GameState;
+using SC.SUGMA.Utilities;
+using System;
+using System.Collections.Generic;
+using Sandbox.ModAPI;
+using VRage.Game.ModAPI;
+using VRageMath;
+
+namespace SC.SUGMA.GameModes.RocketCore
+{
+ internal class RocketCoreHud : ComponentBase
+ {
+ private int _closeTime = -1;
+ private readonly RocketCoreGamemode _gamemode;
+ public RocHud_Window Window;
+
+ public MySoundPair CaptureSound = new MySoundPair("SUGMA_CaptureSound_TF2");
+ private List _zoneGpses = new List();
+
+ public RocketCoreHud(RocketCoreGamemode gamemode)
+ {
+ _gamemode = gamemode;
+ }
+
+ public override void Init(string id)
+ {
+ base.Init(id);
+
+ if (!RichHudClient.Registered)
+ throw new Exception("RichHudAPI was not initialized in time!");
+
+ Window = new RocHud_Window(HudMain.HighDpiRoot, _gamemode);
+ foreach (var zone in _gamemode.FactionGoals)
+ {
+ var gps = MyAPIGateway.Session.GPS.Create($"{zone.Key.Name} Goal", "", zone.Value.Sphere.Center, true,
+ false);
+ MyAPIGateway.Session.GPS.AddLocalGps(gps);
+ _zoneGpses.Add(gps);
+ }
+ }
+
+ public override void Close()
+ {
+ HudMain.HighDpiRoot.RemoveChild(Window);
+ foreach (var gps in _zoneGpses)
+ MyAPIGateway.Session.GPS.RemoveLocalGps(gps);
+ }
+
+ public override void UpdateTick()
+ {
+ Window.Update();
+ if (_closeTime > 0)
+ _closeTime--;
+
+ if (_closeTime == 0) SUGMA_SessionComponent.I.UnregisterComponent(ComponentId);
+ }
+
+ public void MatchEnded(IMyFaction winner)
+ {
+ Window.MatchEnded(winner);
+ _closeTime = HudConstants.MatchResultsVisibleTicks;
+ }
+
+ public void GoalScored(IMyFaction faction)
+ {
+ MyAPIGateway.Utilities.ShowNotification($"Goal was scored against {faction.Name}!", 10000);
+ SUtils.PlaySound(CaptureSound);
+ }
+ }
+
+ internal class RocHud_Window : HudElementBase
+ {
+ private readonly RocketCoreGamemode _gamemode;
+
+ private bool _matchEnded;
+ private readonly MatchTimer _timer;
+ private readonly LabelBox _timerLabel;
+
+ private readonly Dictionary _factionLabels = new Dictionary();
+
+ public RocHud_Window(HudParentBase parent, RocketCoreGamemode gamemode) : base(parent)
+ {
+ _gamemode = gamemode;
+ _timer = gamemode.MatchTimer;
+
+ if (_gamemode == null)
+ throw new Exception("Null gamemode!");
+ if (_timer == null)
+ throw new Exception("Null match timer!");
+
+ Size = new Vector2(100, 24);
+
+ Offset = new Vector2(0, 515); // Regardless of screen size, this is out of 1920x1080
+
+ _timerLabel = new LabelBox(this)
+ {
+ ParentAlignment = ParentAlignments.Inner | ParentAlignments.Top,
+ Height = 24,
+ DimAlignment = DimAlignments.Height,
+ Text = "20:00",
+ TextPadding = new Vector2(2.5f, 0),
+ FitToTextElement = false,
+ Color = HudConstants.HudBackgroundColor
+ };
+
+ var idx = 0;
+ foreach (var faction in _gamemode.TrackedFactions)
+ {
+ _factionLabels[faction] = new LabelBox(this)
+ {
+ Format = GlyphFormat.White.WithColor(faction.CustomColor.ColorMaskToRgb()).WithSize(2)
+ .WithAlignment(TextAlignment.Center),
+ ParentAlignment =
+ ParentAlignments.InnerV |
+ (idx % 2 == 0 ? ParentAlignments.Right : ParentAlignments.Left) |
+ ParentAlignments.Top,
+ Color = HudConstants.HudBackgroundColor,
+ Offset = new Vector2(0, (int)-Math.Floor(idx / 2f) * (24 + 5)),
+ Text = $"{_gamemode.PointTracker.StartingPoints} GOALS LEFT"
+ };
+ idx++;
+ }
+
+ _gamemode.PointTracker.OnPointsUpdated += OnPointsUpdated;
+ }
+
+ private void OnPointsUpdated(IMyFaction faction, int points)
+ {
+ if (!_factionLabels.ContainsKey(faction))
+ return;
+
+ _factionLabels[faction].Text = $"{points} GOAL{(points == 1 ? "" : "S")} LEFT";
+ }
+
+ public void Update()
+ {
+ if (_matchEnded)
+ return;
+
+ _timerLabel.Text = _timer.RemainingTimeString();
+ }
+
+ public void MatchEnded(IMyFaction winner)
+ {
+ _matchEnded = true;
+ var winnerPoints = 0;
+
+ _timerLabel?.Unregister();
+ foreach (var label in _factionLabels)
+ label.Value.Unregister();
+
+ var winnerLabel = new LabelBox(_timerLabel)
+ {
+ Text = winner != null
+ ? $"A WINNER IS {winner.Name}."
+ : "YOU ARE ALL LOSERS",
+ ParentAlignment = ParentAlignments.Bottom,
+ Height = EliminationHud_TeamBanner.BaseHeight,
+ TextPadding = new Vector2(2.5f, 0),
+ Color = HudConstants.HudBackgroundColor
+ };
+
+ winnerLabel.TextBoard.SetFormatting(GlyphFormat.White.WithColor(Color.Red).WithSize(3)
+ .WithAlignment(TextAlignment.Center));
+ }
+ }
+}
diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/TeamDeathMatch/TeamDeathmatchGamemode.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/TeamDeathMatch/TeamDeathmatchGamemode.cs
index 1c006051f..8ab8ffdbc 100644
--- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/TeamDeathMatch/TeamDeathmatchGamemode.cs
+++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameModes/TeamDeathMatch/TeamDeathmatchGamemode.cs
@@ -139,7 +139,7 @@ public override void StopRound()
if (!setWinnerFromArgs && MyAPIGateway.Session.IsServer)
{
if (WinningFaction == null)
- WinningFaction = PointTracker.FactionPoints.MaxBy(f => f.Value).Key;
+ WinningFaction = PointTracker.GetHighestPoints();
Arguments = Arguments.Concat(new[] { $"win{WinningFaction?.FactionId ?? -1}" }).ToArray();
}
diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameState/PointTracker.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameState/PointTracker.cs
index d20ed34a5..f984cf3bb 100644
--- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameState/PointTracker.cs
+++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/GameState/PointTracker.cs
@@ -2,11 +2,9 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
-using Sandbox.Game.Multiplayer;
using Sandbox.ModAPI;
using SC.SUGMA.HeartNetworking;
using SC.SUGMA.HeartNetworking.Custom;
-using SC.SUGMA.Utilities;
using VRage.Game.ModAPI;
namespace SC.SUGMA.GameState
@@ -14,10 +12,10 @@ namespace SC.SUGMA.GameState
internal class PointTracker : ComponentBase
{
private bool _pointsUpdated;
- public int StartingPoints;
- public int VictoryPoints = 3;
+ public readonly int StartingPoints;
+ public readonly int VictoryPoints;
- public Dictionary FactionPoints { get; internal set; } = new Dictionary();
+ protected Dictionary FactionPoints = new Dictionary();
public Action OnPointsUpdated = null;
private void OnFactionCreated(long factionId)
@@ -49,7 +47,7 @@ public override void UpdateTick()
{
if (_pointsUpdated && MyAPIGateway.Session.IsServer)
{
- HeartNetwork.I.SendToEveryone(new PointsPacket(this));
+ HeartNetwork.I.SendToEveryone((PointsPacket) this);
_pointsUpdated = false;
}
}
@@ -70,6 +68,11 @@ public int GetFactionPoints(long factionId)
return GetFactionPoints(MyAPIGateway.Session.Factions.TryGetFactionById(factionId));
}
+ public IMyFaction GetHighestPoints()
+ {
+ return FactionPoints.MaxBy(f => f.Value).Key;
+ }
+
public void SetFactionPoints(IMyFaction faction, int value)
{
if (!MyAPIGateway.Session.IsServer || !FactionPoints.ContainsKey(faction))
@@ -137,5 +140,7 @@ public override string ToString()
sb.Append($"{faction.Key.Name}: {faction.Value}pts\n");
return sb.ToString();
}
+
+ public static explicit operator PointsPacket(PointTracker tracker) => new PointsPacket(tracker.ComponentId, tracker.FactionPoints);
}
}
\ No newline at end of file
diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/HeartNetworking/Custom/PointsPacket.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/HeartNetworking/Custom/PointsPacket.cs
index 7e6c18d1d..d798e645d 100644
--- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/HeartNetworking/Custom/PointsPacket.cs
+++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/HeartNetworking/Custom/PointsPacket.cs
@@ -17,11 +17,11 @@ private PointsPacket()
{
}
- public PointsPacket(PointTracker pointTracker)
+ public PointsPacket(string componentId, Dictionary points)
{
- _senderObjectId = pointTracker.ComponentId;
+ _senderObjectId = componentId;
_points = new Dictionary();
- foreach (var factionKvp in pointTracker.FactionPoints)
+ foreach (var factionKvp in points)
_points.Add(factionKvp.Key.FactionId, factionKvp.Value);
//string data = "";
diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/SUGMA_SessionComponent.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/SUGMA_SessionComponent.cs
index e863fb505..24e477159 100644
--- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/SUGMA_SessionComponent.cs
+++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/SUGMA_SessionComponent.cs
@@ -11,14 +11,11 @@
using SC.SUGMA.GameModes.Elimination;
using SC.SUGMA.GameModes.TeamDeathmatch;
using SC.SUGMA.GameModes.KOTH;
+using SC.SUGMA.GameModes.RocketCore;
using SC.SUGMA.GameState;
using SC.SUGMA.HeartNetworking;
using SC.SUGMA.HeartNetworking.Custom;
-using SC.SUGMA.Utilities;
using VRage.Game.Components;
-using VRage.Scripting;
-using Sandbox.Game;
-using VRageMath;
namespace SC.SUGMA
{
@@ -38,6 +35,7 @@ internal class SUGMA_SessionComponent : MySessionComponentBase
["dom"] = new DominationGamemode(),
["tdm"] = new TeamDeathmatchGamemode(),
["koth"] = new KOTHGamemode(),
+ ["roc"] = new RocketCoreGamemode(),
};
///
diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/Utilities/SUtils.cs b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/Utilities/SUtils.cs
index aec9bd4a1..b19f1603b 100644
--- a/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/Utilities/SUtils.cs
+++ b/Gamemode Mods/StarCore SUGMA Gamemodes/Data/Scripts/SUGMA/Utilities/SUtils.cs
@@ -43,6 +43,9 @@ public static void SetDamageEnabled(bool value)
public static void SetWorldPermissionsForMatch(bool matchActive)
{
+ if (MyAPIGateway.Session == null)
+ return;
+
MyAPIGateway.Utilities.ShowMessage("SUGMA",
$"Match global permissions {(matchActive ? "enabled" : "disabled")}.");
diff --git a/Gamemode Mods/StarCore SUGMA Gamemodes/StarCore SUGMA Gamemodes.csproj.DotSettings b/Gamemode Mods/StarCore SUGMA Gamemodes/StarCore SUGMA Gamemodes.csproj.DotSettings
index 07eaf28c4..53b65eeda 100644
--- a/Gamemode Mods/StarCore SUGMA Gamemodes/StarCore SUGMA Gamemodes.csproj.DotSettings
+++ b/Gamemode Mods/StarCore SUGMA Gamemodes/StarCore SUGMA Gamemodes.csproj.DotSettings
@@ -2,4 +2,4 @@
True
True
True
- True
\ No newline at end of file
+ False
\ No newline at end of file
diff --git a/Gamemode Mods/Starcore_Pointslist/Data/Scripts/Additions/PointAdditions.cs b/Gamemode Mods/Starcore_Pointslist/Data/Scripts/Additions/PointAdditions.cs
index c53295d6c..bf6810159 100644
--- a/Gamemode Mods/Starcore_Pointslist/Data/Scripts/Additions/PointAdditions.cs
+++ b/Gamemode Mods/Starcore_Pointslist/Data/Scripts/Additions/PointAdditions.cs
@@ -11,19 +11,19 @@ namespace ShipPoints
[MySessionComponentDescriptor(MyUpdateOrder.NoUpdate)]
internal class PointAdditions : MySessionComponentBase
{
- /* Hey, modder!
- *
- * To assign a block points, add a new line to the below Dictionary in the following format:
- * ["subtypeid"] = numPoints,
- *
- * To assign a block a climbing cost, add to the ClimbingCostRename function towards the bottom of the file in the following format:
- * case "BlockDisplayName1":
- * case "BlockDisplayName2":
- * blockDisplayName = "groupDisplayName";
- * costMultiplier = costMultiplerPercent;
- * break;
- */
-
+ /* Hey, modder!
+ *
+ * To assign a block points, add a new line to the below Dictionary in the following format:
+ * ["subtypeid"] = numPoints,
+ *
+ * To assign a block a climbing cost, add to the ClimbingCostRename function towards the bottom of the file in the following format:
+ * case "BlockDisplayName1":
+ * case "BlockDisplayName2":
+ * blockDisplayName = "groupDisplayName";
+ * costMultiplier = costMultiplerPercent;
+ * break;
+ */
+
readonly Dictionary PointValues = new Dictionary
{
["LargeBlockBatteryBlock"] = 14,
@@ -177,10 +177,10 @@ internal class PointAdditions : MySessionComponentBase
["AQD_LG_HydroThrusterL_ArmoredSlope"] = 50,
["AQD_LG_HydroThrusterL_Armored"] = 50,
["LargeBlockLargeHydrogenThrustIndustrial"] = 50,
- ["LargeBlockSmallHydrogenThrust"] = 15,
- ["AQD_LG_HydroThrusterS_ArmoredSlope"] = 15,
- ["AQD_LG_HydroThrusterS_Armored"] = 15,
- ["LargeBlockSmallHydrogenThrustIndustrial"] = 15,
+ ["LargeBlockSmallHydrogenThrust"] = 10,
+ ["AQD_LG_HydroThrusterS_ArmoredSlope"] = 10,
+ ["AQD_LG_HydroThrusterS_Armored"] = 10,
+ ["LargeBlockSmallHydrogenThrustIndustrial"] = 10,
["HugeHydrogenThruster"] = 200,
["LargeBlockLargeThrust"] = 20,
@@ -555,7 +555,7 @@ internal class PointAdditions : MySessionComponentBase
["Hellfire_Laser_Block"] = 666,
- ["Cat_StarcoreUlitity"] = 21,
+ ["Cat_StarcoreUlitity"] = 21,
["LargeBlockRemoteControl"] = 100,
["SmallBlockRemoteControl"] = 50,
["LargeProgrammableBlock"] = 50,
@@ -586,8 +586,8 @@ internal class PointAdditions : MySessionComponentBase
["Starcore_RWR_Projectiles"] = 5,
["SC_Flare"] = 50,
["SI_Field_Gen"] = 50,
- ["FieldGen_Core"] = 50,
- ["FieldGen_Capacity_Upgrade"] = 50,
+ ["FieldGen_Core"] = 50,
+ ["FieldGen_Capacity_Upgrade"] = 50,
["SELtdLargeNanobotBuildAndRepairSystem"] = 50,
["PM_LG_BLASTPLATE_BLASTPLATE"] = 100,
["REINFORCED_BLASTPLATE"] = 105,
@@ -607,9 +607,9 @@ internal class PointAdditions : MySessionComponentBase
["BlinkDriveLarge"] = 500,
["SCSmallJumpDrive"] = 250,
- ["Cat_BadModder"] = 22,
+ ["Cat_BadModder"] = 22,
["APE_Strong"] = 200,
- ["GoalieCasemate"] = 175,
+ ["GoalieCasemate"] = 100,
["Reaver_Coilgun"] = 115,
["Assault_Coil_Turret"] = 115,
["Priest_Block"] = 100,
@@ -641,7 +641,7 @@ internal class PointAdditions : MySessionComponentBase
["Thagomizer_Angled"] = 635,
["Thagomizer_Angled_Flipped"] = 635,
- ["Cat_Strikecraft"] = 23,
+ ["Cat_Strikecraft"] = 23,
["HeavyFighterBay"] = 230,
["longsword"] = 625,
["TaiidanSingleHangar"] = 100,
@@ -709,9 +709,9 @@ internal class PointAdditions : MySessionComponentBase
["Barbette1x1"] = 4,
["Barbette3x3"] = 36,
["Barbette5x5"] = 100,
- ["FAM2BrowningTurret"] = 35,
- ["OerlikonDual"] = 35,
- ["OerlikonMain"] = 35,
+ ["FAM2BrowningTurret"] = 35,
+ ["OerlikonDual"] = 35,
+ ["OerlikonMain"] = 35,
@@ -758,7 +758,7 @@ internal class PointAdditions : MySessionComponentBase
["Caster_Accelerator_0"] = 10,
["Caster_Accelerator_90"] = 40,
["Caster_Feeder"] = 10,
- ["Caster_FocusLens"] = 250,
+ ["Caster_FocusLens"] = 50,
["Caster_Reactor"] = 125,
["Heat_Heatsink"] = 10,
["Heat_FlatRadiator"] = 10,
@@ -943,7 +943,7 @@ private static MyTuple ClimbingCostRename(string blockDisplayName
break;
case "[FLAW] Goalkeeper Casemate Flak Battery":
blockDisplayName = "[FLAW] Goalkeeper Flakwall";
- costMultiplier = 0.119f;
+ costMultiplier = 0f;
break;
case "Shield Controller":
case "Shield Controller Table":
@@ -951,7 +951,7 @@ private static MyTuple ClimbingCostRename(string blockDisplayName
costMultiplier = 9999999f;
break;
case "Structural Integrity Field Generator":
- case "[SI] Generator Core":
+ case "[SI] Generator Core":
blockDisplayName = "Defensive Generator";
costMultiplier = 9999999f;
break;
diff --git a/Gamemode Mods/Starcore_Sharetrack/Data/Scripts/ShipPoints/BuildingBlockPoints.cs b/Gamemode Mods/Starcore_Sharetrack/Data/Scripts/ShipPoints/BuildingBlockPoints.cs
index 4d9f0eb99..0cf0a2668 100644
--- a/Gamemode Mods/Starcore_Sharetrack/Data/Scripts/ShipPoints/BuildingBlockPoints.cs
+++ b/Gamemode Mods/Starcore_Sharetrack/Data/Scripts/ShipPoints/BuildingBlockPoints.cs
@@ -2,6 +2,7 @@
using Sandbox.Game.Gui;
using Sandbox.ModAPI;
using StarCore.ShareTrack.API;
+using VRage.Input;
using VRageMath;
using VRageRender;
@@ -19,14 +20,26 @@ public BuildingBlockPoints()
_pointsMessage = new HudAPIv2.HUDMessage(scale: 1f, font: "BI_SEOutlined", Message: new StringBuilder(""),
origin: new Vector2D(-0.969, 0.57), blend: MyBillboard.BlendTypeEnum.PostPP);
};
+
+
}
private int _ticks;
public void Update()
{
+ if (MyAPIGateway.Input.WasKeyPress(MyKeys.D0))
+ UpdateHud(null);
+
if (_ticks++ % 10 != 0)
return;
+ if (MyAPIGateway.Session.ControlledObject is IMyShipController)
+ {
+ UpdateHud(null);
+ LastHeldSubtype = null;
+ return;
+ }
+
if (LastHeldSubtype != MyHud.BlockInfo?.DefinitionId.SubtypeName)
{
LastHeldSubtype = MyHud.BlockInfo?.DefinitionId.SubtypeName;
diff --git a/Utility Mods/Cast Spectator - StarCore/Data/Scripts/CastSpectator/CastSpectator.cs b/Utility Mods/Cast Spectator - StarCore/Data/Scripts/CastSpectator/CastSpectator.cs
index 06505e23f..ddccc3169 100644
--- a/Utility Mods/Cast Spectator - StarCore/Data/Scripts/CastSpectator/CastSpectator.cs
+++ b/Utility Mods/Cast Spectator - StarCore/Data/Scripts/CastSpectator/CastSpectator.cs
@@ -123,6 +123,9 @@ public class CastSpectator : MySessionComponentBase
public float InQuint(float t) => t * t * t * t * t;
public float OutQuint(float t) => 1 - InQuint(1 - t);
+ private MatrixD freeModeMatrix = MatrixD.Identity;
+ private bool freeModeInitialized = false;
+
private bool HideHud
{
get
@@ -221,9 +224,11 @@ public override void UpdateAfterSimulation()
{
Clear();
}
-
+ // Keep current position, just look at target
+ Vector3D targetPos = tempHIt.HitEntity.WorldVolume.Center;
+ m_specCam.SetTarget(targetPos, m_specCam.Orientation.Up); // Use current Up vector
SetTarget(tempHIt.HitEntity);
- SetMode(1);
+ ObsCameraState.lockmode = CameraMode.Follow; // Default to Follow
}
}
}
@@ -242,6 +247,7 @@ public override void UpdateAfterSimulation()
{
case CameraMode.Free:
ObsCameraState.lockmode = CameraMode.Follow;
+ InitializeFollowFromFree(); // Preserve Free mode state
break;
case CameraMode.Follow:
ObsCameraState.lockmode = CameraMode.Orbit;
@@ -252,6 +258,7 @@ public override void UpdateAfterSimulation()
break;
case CameraMode.Track:
ObsCameraState.lockmode = CameraMode.Free;
+ InitializeFreeMode();
break;
}
}
@@ -264,10 +271,15 @@ public override void UpdateAfterSimulation()
if (m_Pref.FreeMode.IsKeybindPressed())
{
ObsCameraState.lockmode = CameraMode.Free;
+ InitializeFreeMode();
}
if (m_Pref.FollowMode.IsKeybindPressed())
{
+ if (ObsCameraState.lockmode == CameraMode.Free)
+ {
+ InitializeFollowFromFree();
+ }
ObsCameraState.lockmode = CameraMode.Follow;
}
@@ -533,22 +545,69 @@ public override void UpdateAfterSimulation()
switch (ObsCameraState.lockmode)
{
case CameraMode.Free:
- Vector3D WorldMoveFree = mi.X * m_playerCamera.WorldMatrix.Right
- + mi.Y * m_playerCamera.WorldMatrix.Up
- + mi.Z * m_playerCamera.WorldMatrix.Backward;
- m_specCam.Position = ObsCameraState.lockEntity.WorldVolume.Center + ObsCameraState.localVector + WorldMoveFree;
+ {
+ if (!freeModeInitialized)
+ {
+ InitializeFreeMode();
+ }
+
+ // Apply smoothed movement
+ Vector3D freeMovement = mi.X * freeModeMatrix.Right
+ + mi.Y * freeModeMatrix.Up
+ + mi.Z * freeModeMatrix.Backward;
+ freeModeMatrix.Translation += freeMovement;
+
+ // Apply smoothed rotation
+ if (mouse.Y != 0)
+ {
+ Vector3D newRight, newForward;
+ MyUtils.VectorPlaneRotation(freeModeMatrix.Right, freeModeMatrix.Forward, out newRight, out newForward, -mouse.Y);
+ freeModeMatrix.Right = newRight;
+ freeModeMatrix.Forward = newForward;
+ }
+ if (mouse.X != 0)
+ {
+ Vector3D newUp, newForward;
+ MyUtils.VectorPlaneRotation(freeModeMatrix.Up, freeModeMatrix.Forward, out newUp, out newForward, mouse.X);
+ freeModeMatrix.Up = newUp;
+ freeModeMatrix.Forward = newForward;
+ }
+ if (ri != 0)
+ {
+ Vector3D newUp, newRight;
+ MyUtils.VectorPlaneRotation(freeModeMatrix.Up, freeModeMatrix.Right, out newUp, out newRight, ri);
+ freeModeMatrix.Up = newUp;
+ freeModeMatrix.Right = newRight;
+ }
+
+ // Set camera position and orientation
+ Vector3D basePos = ObsCameraState.lockEntity?.WorldVolume.Center ?? Vector3D.Zero;
+ m_specCam.Position = basePos + freeModeMatrix.Translation;
+ m_specCam.SetTarget(m_specCam.Position + freeModeMatrix.Forward, freeModeMatrix.Up);
+ }
break;
+
case CameraMode.Follow:
- Vector3D WorldMoveFollow = mi.X * ObsCameraState.localMatrix.Right
- + mi.Y * ObsCameraState.localMatrix.Up
- + mi.Z * ObsCameraState.localMatrix.Backward;
- var move = ObsCameraState.localMatrix.Translation + WorldMoveFollow;
- ObsCameraState.localMatrix.Translation = move;
- var fworldmatrix = ObsCameraState.lockEntity.WorldMatrix;
- var targetm = LocalToWorld(ObsCameraState.localMatrix, fworldmatrix);
- m_specCam.Position = targetm.Translation;
- m_specCam.SetTarget(m_specCam.Position + targetm.Forward, targetm.Up);
+ {
+ if (ObsCameraState.localMatrix == MatrixD.Identity && ObsCameraState.lockEntity != null)
+ {
+ // Fallback initialization if localMatrix wasn’t set (e.g., no prior mode)
+ Vector3D offset = m_specCam.Position - ObsCameraState.lockEntity.WorldVolume.Center;
+ MatrixD worldMatrix = m_specCam.Orientation;
+ worldMatrix.Translation = offset;
+ ObsCameraState.localMatrix = WorldToLocalNI(worldMatrix, ObsCameraState.lockEntity.WorldMatrixNormalizedInv);
+ }
+ Vector3D WorldMoveFollow = mi.X * ObsCameraState.localMatrix.Right
+ + mi.Y * ObsCameraState.localMatrix.Up
+ + mi.Z * ObsCameraState.localMatrix.Backward;
+ var move = ObsCameraState.localMatrix.Translation + WorldMoveFollow;
+ ObsCameraState.localMatrix.Translation = move;
+ var fworldmatrix = ObsCameraState.lockEntity.WorldMatrix;
+ var targetm = LocalToWorld(ObsCameraState.localMatrix, fworldmatrix);
+ m_specCam.Position = targetm.Translation;
+ m_specCam.SetTarget(m_specCam.Position + targetm.Forward, targetm.Up);
+ }
break;
case CameraMode.Orbit:
var lookAt = ObsCameraState.lockEntity.WorldVolume.Center;
@@ -586,14 +645,16 @@ public override void UpdateAfterSimulation()
}
- var reconstruct = ObsCameraState.lastOrientation = m_specCam.Orientation;
- reconstruct.Translation = m_specCam.Position;
- ObsCameraState.localMatrix = WorldToLocalNI(reconstruct, ObsCameraState.lockEntity.WorldMatrixNormalizedInv);
-
- ObsCameraState.localVector = m_specCam.Position - ObsCameraState.lockEntity.WorldVolume.Center;
- if (ObsCameraState.lockmode != CameraMode.Orbit)
+ if (ObsCameraState.lockmode != CameraMode.Free)
{
- ObsCameraState.localDistance = ObsCameraState.localVector.Length();
+ var reconstruct = ObsCameraState.lastOrientation = m_specCam.Orientation;
+ reconstruct.Translation = m_specCam.Position;
+ ObsCameraState.localMatrix = WorldToLocalNI(reconstruct, ObsCameraState.lockEntity.WorldMatrixNormalizedInv);
+ ObsCameraState.localVector = m_specCam.Position - ObsCameraState.lockEntity.WorldVolume.Center;
+ if (ObsCameraState.lockmode != CameraMode.Orbit)
+ {
+ ObsCameraState.localDistance = ObsCameraState.localVector.Length();
+ }
}
}
@@ -637,7 +698,7 @@ public override void UpdateAfterSimulation()
if (m_FindAndMoveState == FindAndMoveState.GoToMove)
{
- Clear();
+ // Don’t Clear() immediately to preserve mode state until animation ends
origStart = m_specCam.Position;
origFor = m_specCam.Orientation.Forward;
origUp = m_specCam.Orientation.Up;
@@ -655,7 +716,6 @@ public override void UpdateAfterSimulation()
if (m_FindAndMoveState == FindAndMoveState.InMove)
{
bool complete = false;
-
if (moveGrid == null || moveGrid.Physics == null || MyAPIGateway.Session.IsCameraControlledObject)
{
m_FindAndMoveState = FindAndMoveState.GoToIdle;
@@ -665,9 +725,7 @@ public override void UpdateAfterSimulation()
Vector3D currentStartPosition = m_specCam.Position;
Vector3D focusCentralPosition = moveGrid.WorldAABB.Center;
Vector3D direction = Vector3D.Normalize(focusCentralPosition - currentStartPosition);
- double pullbackDist = moveGrid.PositionComp.WorldVolume.Radius;
- pullbackDist *= 1.5;
-
+ double pullbackDist = moveGrid.PositionComp.WorldVolume.Radius * 1.5;
double travelDist = (focusCentralPosition - currentStartPosition).Length() - pullbackDist;
Vector3D endPosition = currentStartPosition + (direction * travelDist);
@@ -681,6 +739,7 @@ public override void UpdateAfterSimulation()
var realRatio = (double)viewAnimFrame / maxViewAnimFrame;
var easingRatio = OutQuint((float)realRatio);
m_specCam.Position = Vector3D.Lerp(origStart, endPosition, easingRatio);
+ // Remove SetTarget during animation to preserve orientation
viewAnimFrame += 1;
}
else
@@ -690,11 +749,37 @@ public override void UpdateAfterSimulation()
if (complete)
{
+ // Set final animation position, keep existing orientation
+ m_specCam.Position = endPosition;
+
+ // Lock onto the grid, preserving current mode and orientation
+ if (ObsCameraState.lockEntity != null)
+ {
+ Clear(); // Clear previous lock
+ }
SetTarget(moveGrid);
+ ObsCameraState.islocked = true;
+
+ // Update mode-specific state with current orientation
+ switch (ObsCameraState.lockmode)
+ {
+ case CameraMode.Free:
+ freeModeMatrix = m_specCam.Orientation; // Use current orientation
+ freeModeMatrix.Translation = m_specCam.Position - moveGrid.WorldVolume.Center;
+ freeModeInitialized = true;
+ break;
+ case CameraMode.Follow:
+ case CameraMode.Orbit:
+ case CameraMode.Track:
+ MatrixD worldMatrix = m_specCam.Orientation; // Preserve current orientation
+ worldMatrix.Translation = m_specCam.Position;
+ ObsCameraState.localMatrix = WorldToLocalNI(worldMatrix, moveGrid.WorldMatrixNormalizedInv);
+ break;
+ }
+
m_FindAndMoveState = FindAndMoveState.GoToIdle;
}
}
-
if (m_FindAndMoveState == FindAndMoveState.InMoveLookback)
{
bool complete = false;
@@ -713,7 +798,7 @@ public override void UpdateAfterSimulation()
var moveRatio = (double)viewAnimFrame / maxViewAnimFrame;
var moveEaseRatio = OutQuint((float)moveRatio);
- var rotateRatio = (double)rotationAnimFrame/ maxRotationAnimFrame;
+ var rotateRatio = (double)rotationAnimFrame / maxRotationAnimFrame;
var rotateEaseRatio = OutQuint((float)rotateRatio);
if (viewAnimFrame < maxViewAnimFrame + 1)
@@ -726,7 +811,7 @@ public override void UpdateAfterSimulation()
var lerpedRotation = MathHelper.Lerp(0, Math.PI, rotateEaseRatio);
MatrixD rotMat = MatrixD.CreateFromAxisAngle(origUp, lerpedRotation);
var finalFor = Vector3D.Rotate(origFor, rotMat);
- m_specCam.SetTarget(m_specCam.Position + finalFor, m_specCam.Orientation.Up);
+ m_specCam.SetTarget(m_specCam.Position + finalFor, m_specCam.Orientation.Up); // Keep spin animation
}
if (moveRatio > 0.1)
@@ -743,17 +828,42 @@ public override void UpdateAfterSimulation()
if (complete)
{
+ // Set final position, preserve orientation with spin applied
+ m_specCam.Position = endPosition;
+
+ // Lock onto the grid, preserving current mode and orientation
+ if (ObsCameraState.lockEntity != null)
+ {
+ Clear(); // Clear previous lock
+ }
SetTarget(moveGrid);
+ ObsCameraState.islocked = true;
+
+ // Update mode-specific state with current orientation
+ switch (ObsCameraState.lockmode)
+ {
+ case CameraMode.Free:
+ freeModeMatrix = m_specCam.Orientation; // Use current orientation (post-spin)
+ freeModeMatrix.Translation = m_specCam.Position - moveGrid.WorldVolume.Center;
+ freeModeInitialized = true;
+ break;
+ case CameraMode.Follow:
+ case CameraMode.Orbit:
+ case CameraMode.Track:
+ MatrixD worldMatrix = m_specCam.Orientation; // Preserve current orientation (post-spin)
+ worldMatrix.Translation = m_specCam.Position;
+ ObsCameraState.localMatrix = WorldToLocalNI(worldMatrix, moveGrid.WorldMatrixNormalizedInv);
+ break;
+ }
+
m_FindAndMoveState = FindAndMoveState.GoToIdle;
}
}
-
if (m_FindAndMoveState == FindAndMoveState.GoToIdle)
{
- moveGrid = null;
+ moveGrid = null; // Clear animation state
viewAnimFrame = 0;
rotationAnimFrame = 0;
-
origStart = Vector3D.Zero;
origFor = Vector3D.Zero;
origUp = Vector3D.Zero;
@@ -792,9 +902,10 @@ private void UpdateLockEntity(IMyEntity lockEntity)
ObsCameraState.lockEntity = lockEntity;
ObsCameraState.islocked = true;
+ // Only set a default mode if none exists
if (ObsCameraState.lockmode == CameraMode.None)
{
- SetMode(1);
+ ObsCameraState.lockmode = CameraMode.Follow; // Default to Follow only if no mode is set
}
if (ObsCameraState.lockmode == CameraMode.Track)
@@ -804,6 +915,7 @@ private void UpdateLockEntity(IMyEntity lockEntity)
if (ObsCameraState.lockEntity != null && m_specCam != null)
{
+ // Use current spectator camera state
var reconstruct = m_specCam.Orientation;
reconstruct.Translation = m_specCam.Position;
ObsCameraState.localMatrix = WorldToLocalNI(reconstruct, ObsCameraState.lockEntity.WorldMatrixNormalizedInv);
@@ -902,31 +1014,34 @@ private void onRegistered()
private void UpdateMenu()
{
- LockTargetInput.Text = "Lock Target - " + m_Pref.ToggleLock.ToString();
- NextModeInput.Text = "Next Mode - " + m_Pref.SwitchMode.ToString();
- FindAndMoveInput.Text = "Find and Move - " + m_Pref.FindAndMove.ToString();
- FindAndMoveSpinInput.Text = "Find and Move Spin - " + m_Pref.FindAndMoveSpin.ToString();
- ModeFreeInput.Text = "Mode Free - " + m_Pref.FreeMode.ToString();
- ModeFollowInput.Text = "Mode Follow - " + m_Pref.FollowMode.ToString();
- ModeOrbitInput.Text = "Mode Orbit - " + m_Pref.OrbitMode.ToString();
- ModeTrackInput.Text = "Mode Track - " + m_Pref.TrackMode.ToString();
-
- CameraSmoothKeybind.Text = "Toggle Smooth Camera - " + m_Pref.ToggleSmoothCamera.ToString();
- CameraSmoothOnOff.Text = m_SmoothCamera ? "Smooth Camera On" : "Smooth Camera Off";
- CameraSmoothRate.Text = string.Format("Camera Smooth Rate {0:N0}", SmoothSenseToValue(m_Pref.SmoothCameraLERP).ToString());
-
- CameraSmoothRate.InitialPercent = m_Pref.SmoothCameraLERP;
-
- // Remove updates for Cycle Player Up and Cycle Player Down
- // CyclePlayerUp.Text = "Cycle Player Up - " + m_Pref.CyclePlayerUp.ToString();
- // CyclePlayerDown.Text = "Cycle Player Down - " + m_Pref.CyclePlayerDown.ToString();
-
- PeriodicSwitchInput.Text = "Periodic Switch - " + m_Pref.PeriodicSwitch.ToString();
- PeriodicSwitchIntervalSlider.Text = "Switch Interval: " + m_PeriodicSwitchInterval + "s";
- PeriodicSwitchIntervalSlider.InitialPercent = m_PeriodicSwitchInterval / 30f;
- PeriodicSwitchRandomToggle.Text = m_PeriodicSwitchRandom ? "Random Switch: On" : "Random Switch: Off";
-
- HideHudOnOff.Text = m_Pref.HideHud ? "Hud Hidden" : "HUD Always Visible";
+ if (TextHUD == null || !m_init) return; // Skip if HUD isn’t initialized
+
+ if (LockTargetInput != null) LockTargetInput.Text = "Lock Target - " + m_Pref.ToggleLock.ToString();
+ if (NextModeInput != null) NextModeInput.Text = "Next Mode - " + m_Pref.SwitchMode.ToString();
+ if (FindAndMoveInput != null) FindAndMoveInput.Text = "Find and Move - " + m_Pref.FindAndMove.ToString();
+ if (FindAndMoveSpinInput != null) FindAndMoveSpinInput.Text = "Find and Move Spin - " + m_Pref.FindAndMoveSpin.ToString();
+ if (ModeFreeInput != null) ModeFreeInput.Text = "Mode Free - " + m_Pref.FreeMode.ToString();
+ if (ModeFollowInput != null) ModeFollowInput.Text = "Mode Follow - " + m_Pref.FollowMode.ToString();
+ if (ModeOrbitInput != null) ModeOrbitInput.Text = "Mode Orbit - " + m_Pref.OrbitMode.ToString();
+ if (ModeTrackInput != null) ModeTrackInput.Text = "Mode Track - " + m_Pref.TrackMode.ToString();
+
+ if (CameraSmoothKeybind != null) CameraSmoothKeybind.Text = "Toggle Smooth Camera - " + m_Pref.ToggleSmoothCamera.ToString();
+ if (CameraSmoothOnOff != null) CameraSmoothOnOff.Text = m_SmoothCamera ? "Smooth Camera On" : "Smooth Camera Off";
+ if (CameraSmoothRate != null)
+ {
+ CameraSmoothRate.Text = string.Format("Camera Smooth Rate {0:N0}", SmoothSenseToValue(m_Pref.SmoothCameraLERP));
+ CameraSmoothRate.InitialPercent = m_Pref.SmoothCameraLERP;
+ }
+
+ if (PeriodicSwitchInput != null) PeriodicSwitchInput.Text = "Periodic Switch - " + m_Pref.PeriodicSwitch.ToString();
+ if (PeriodicSwitchIntervalSlider != null)
+ {
+ PeriodicSwitchIntervalSlider.Text = "Switch Interval: " + m_PeriodicSwitchInterval + "s";
+ PeriodicSwitchIntervalSlider.InitialPercent = m_PeriodicSwitchInterval / 30f;
+ }
+ if (PeriodicSwitchRandomToggle != null) PeriodicSwitchRandomToggle.Text = m_PeriodicSwitchRandom ? "Random Switch: On" : "Random Switch: Off";
+
+ if (HideHudOnOff != null) HideHudOnOff.Text = m_Pref.HideHud ? "Hud Hidden" : "HUD Always Visible";
}
private void ToggleHideHud()
@@ -1145,6 +1260,40 @@ private MatrixD LocalToWorld(MatrixD local, MatrixD worldMatrix)
return local * worldMatrix;
}
+ private void InitializeFreeMode()
+ {
+ if (m_specCam != null)
+ {
+ // Capture current orientation (rotation only)
+ freeModeMatrix = m_specCam.Orientation;
+ // Set translation as offset from target (if locked) or absolute position
+ if (ObsCameraState.lockEntity != null)
+ {
+ Vector3D targetPos = ObsCameraState.lockEntity.WorldVolume.Center;
+ freeModeMatrix.Translation = m_specCam.Position - targetPos;
+ }
+ else
+ {
+ freeModeMatrix.Translation = m_specCam.Position; // Absolute position if no target
+ }
+ freeModeInitialized = true;
+ }
+ }
+
+ private void InitializeFollowFromFree()
+ {
+ if (m_specCam != null && ObsCameraState.lockEntity != null)
+ {
+ // Convert freeModeMatrix (world relative to target) to localMatrix (relative to entity's world matrix)
+ Vector3D worldPosition = ObsCameraState.lockEntity.WorldVolume.Center + freeModeMatrix.Translation;
+ MatrixD worldMatrix = freeModeMatrix;
+ worldMatrix.Translation = worldPosition;
+ ObsCameraState.localMatrix = WorldToLocalNI(worldMatrix, ObsCameraState.lockEntity.WorldMatrixNormalizedInv);
+ // Reset free mode state
+ freeModeInitialized = false;
+ }
+ }
+
public IMyGridGroupData GetConeFocus()
{
IMyCamera camera = MyAPIGateway.Session.Camera;
diff --git a/Utility Mods/MoA Fusion Systems/Data/CubeBlocks/Caster_FocusLens.sbc b/Utility Mods/MoA Fusion Systems/Data/CubeBlocks/Caster_FocusLens.sbc
index a3e9a7f41..2c9907de0 100644
--- a/Utility Mods/MoA Fusion Systems/Data/CubeBlocks/Caster_FocusLens.sbc
+++ b/Utility Mods/MoA Fusion Systems/Data/CubeBlocks/Caster_FocusLens.sbc
@@ -35,7 +35,7 @@
Caster_FocusLens
Thrust
- 34560000
+ 144000000
0.200
0.000002
1
diff --git a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionThruster/FusionThrusterLogic.cs b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionThruster/FusionThrusterLogic.cs
index 10f34ad4f..9bc48d2c4 100644
--- a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionThruster/FusionThrusterLogic.cs
+++ b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/FusionThruster/FusionThrusterLogic.cs
@@ -31,7 +31,7 @@ public class FusionThrusterLogic : FusionPart
internal static readonly Dictionary DriveSettings = new Dictionary
{
- ["Caster_FocusLens"] = new DriveSetting(4.00f, 1.5f, 34.56f*2*1000000),
+ ["Caster_FocusLens"] = new DriveSetting(1.00f, 1.5f, 144000000),
};
public override void UpdatePower(float powerGeneration, float newtonsPerFusionPower, int numberThrusters)
diff --git a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/S_FusionSystem.cs b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/S_FusionSystem.cs
index 970752c53..f949a9a41 100644
--- a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/S_FusionSystem.cs
+++ b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/FusionParts/S_FusionSystem.cs
@@ -13,7 +13,7 @@ namespace Epstein_Fusion_DS.
internal class SFusionSystem
{
public const float MegawattsPerFusionPower = 32;
- public const float NewtonsPerFusionPower = 1500000;
+ public const float NewtonsPerFusionPower = 24000000;
public const float HydrogenPerFusionPower = 42;
public readonly IMyCubeGrid Grid;
diff --git a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/HeatParts/Definitions/HeatPartDefinitions.cs b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/HeatParts/Definitions/HeatPartDefinitions.cs
index 756f74ef0..98126b302 100644
--- a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/HeatParts/Definitions/HeatPartDefinitions.cs
+++ b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/HeatParts/Definitions/HeatPartDefinitions.cs
@@ -114,11 +114,6 @@ public static bool HasDefinition(string subtypeId) =>
if (!CheckGridIntersect(radiatorBlock, pos, Vector3I.Up))
occlusionModifier += 1f / checkPositions.Length;
- if (!CheckGridIntersect(radiatorBlock, Vector3I.Zero, Vector3I.Up))
- occlusionModifier += 1 / 2f;
- if (!CheckGridIntersect(radiatorBlock, Vector3I.Right, Vector3I.Up))
- occlusionModifier += 1 / 2f;
-
return occlusionModifier;
}
}
diff --git a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/S_FusionPlayerHud.cs b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/S_FusionPlayerHud.cs
index 76f6d0a24..9b0e58c75 100644
--- a/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/S_FusionPlayerHud.cs
+++ b/Utility Mods/MoA Fusion Systems/Data/Scripts/ModularAssemblies/S_FusionPlayerHud.cs
@@ -79,7 +79,7 @@ public override void UpdateAfterSimulation()
MyVisualScriptLogicProvider.AddQuestlogDetailLocal(
$"[({system.PhysicalAssemblyId})] Thrusters: {system.Thrusters.Count} | Reactors: {system.Reactors.Count} | Loops: {system.Arms.Count} | Heat: -{HeatManager.I.GetGridHeatDissipation(system.Grid):N0} +{HeatManager.I.GetGridHeatGeneration(system.Grid):N0} ({HeatManager.I.GetGridHeatLevel(system.Grid)*100:F1}%)\n" +
- $" Stored: {system.PowerStored:N0}/{system.MaxPowerStored:N0} | Generation: {system.PowerGeneration:N1}/{system.MaxPowerGeneration:N1}",
+ $" Stored: {system.PowerStored:N0}/{system.MaxPowerStored:N0} | Generation: {system.PowerGeneration*60:N1}/{system.MaxPowerGeneration*60:N1}",
false, false);
displayedCount++;
}
diff --git a/Utility Mods/SCDefenseBlocks/Data/Scripts/OneFuckingFolderDeeper/FieldGenerator/FieldGenerator_Core.cs b/Utility Mods/SCDefenseBlocks/Data/Scripts/OneFuckingFolderDeeper/FieldGenerator/FieldGenerator_Core.cs
index 121d6d26a..ef8d5ffff 100644
--- a/Utility Mods/SCDefenseBlocks/Data/Scripts/OneFuckingFolderDeeper/FieldGenerator/FieldGenerator_Core.cs
+++ b/Utility Mods/SCDefenseBlocks/Data/Scripts/OneFuckingFolderDeeper/FieldGenerator/FieldGenerator_Core.cs
@@ -20,6 +20,7 @@
using VRageMath;
using static Draygo.API.HudAPIv2;
using static VRageRender.MyBillboard;
+using static VRage.Game.MyObjectBuilder_BehaviorTreeDecoratorNode;
namespace Starcore.FieldGenerator
@@ -53,8 +54,7 @@ public class FieldGenerator : MyGameLogicComponent, IMyEventProxy
#region Sync Properties
public MySync SiegeMode;
public MySync SiegeCooldownActive;
- public MySync SlowdownActive;
- public MySync GridStopped;
+ public MySync _slowdownComplete;
public MySync SiegeElapsedTime;
public MySync SiegeCooldownTime;
@@ -136,7 +136,6 @@ public override void UpdateOnceBeforeFrame()
if (!IsDedicated)
{
- GridStopped.ValueChanged += OnGridStopValueChange;
Block.IsWorkingChanged += Block_IsWorkingChanged;
}
@@ -165,40 +164,26 @@ public override void UpdateAfterSimulation()
}
}
- if (SiegeMode.Value && !GridStopped.Value)
+ if (Block.IsWorking)
{
- if (Block.CubeGrid.Physics.LinearVelocity != Vector3D.Zero)
+ UpdateSiegeState();
+ }
+ else if (!Block.IsWorking)
+ {
+ if (SiegeMode.Value)
{
- SiegeEmergencyStop();
- _stopTickCounter++;
+ EndSiegeState(true);
+ SiegeMode.Value = false;
}
- else
- GridStopped.Value = true;
}
- }
-
- if (!IsDedicated)
- {
- if (SiegeMode.Value && !GridStopped.Value && !SlowdownActive.Value && IsClientInShip())
- {
- BlockSoundPair = new MySoundPair("FieldGen_Brake");
- BlockSoundEmitter.SetPosition(Block.Position);
- BlockSoundEmitter?.PlaySound(BlockSoundPair, false, false, true, true, false, null, true);
- SlowdownActive.Value = true;
- }
- }
+ }
if (MyAPIGateway.Session.GameplayFrameCounter % 60 == 0)
{
if (Block.IsWorking)
{
if (IsServer)
- {
- if (GridStopped.Value || SiegeCooldownActive.Value)
- {
- UpdateSiegeState();
- }
-
+ {
if (!Config.SimplifiedMode)
{
if (_lowStability && Stability.Value < 100)
@@ -247,13 +232,7 @@ public override void UpdateAfterSimulation()
{
if (FieldPower.Value > 0)
FieldPower.Value = 0;
-
- if (SiegeMode.Value)
- {
- CancelSiegeMode();
- SiegeMode.Value = false;
- }
-
+
HandleResistence();
}
else
@@ -299,7 +278,6 @@ public override void Close()
if (!IsDedicated)
{
- GridStopped.ValueChanged -= OnGridStopValueChange;
Block.IsWorkingChanged -= Block_IsWorkingChanged;
}
@@ -389,7 +367,7 @@ private void HandleResistence()
return;
}
- if (SiegeMode.Value && GridStopped.Value)
+ if (SiegeMode.Value)
{
MyVisualScriptLogicProvider.SetGridGeneralDamageModifier(Block.CubeGrid.Name, (1 - Config.SiegeModeResistence));
return;
@@ -414,6 +392,13 @@ private void SiegeMode_ValueChanged(MySync obj)
if (IsServer)
HandleResistence();
+
+ if (!IsDedicated && obj.Value && IsClientInShip())
+ {
+ BlockSoundPair = new MySoundPair("FieldGen_Brake");
+ BlockSoundEmitter.SetPosition(Block.Position);
+ BlockSoundEmitter?.PlaySound(BlockSoundPair, false, false, true, true, false, null, true);
+ }
}
private void FieldPower_ValueChanged(MySync obj)
@@ -433,13 +418,7 @@ private void Stability_ValueChanged(MySync obj)
if (IsServer)
HandleZeroStability();
}
-
- private void OnGridStopValueChange(MySync obj)
- {
- if (obj?.Value ?? false)
- Block.CubeGrid.Physics.LinearVelocity = Vector3.Zero;
- }
-
+
private void Block_IsWorkingChanged(IMyCubeBlock block)
{
if (IsClientInShip())
@@ -467,43 +446,56 @@ private void UpdateSiegeState()
{
if (SiegeMode.Value && !SiegeCooldownActive.Value)
{
- if (SiegeElapsedTime.Value + 1 <= Config.MaxSiegeTime)
- {
- SiegeElapsedTime.Value++; ;
- SiegeBlockEnabler(Block.CubeGrid.GetFatBlocks(), false);
-
+ if (!_slowdownComplete.Value)
+ {
+ SiegeSlowdown();
+ _stopTickCounter++;
+ return;
+ }
+ else if (_slowdownComplete.Value)
+ {
if (Block.CubeGrid.Physics.LinearVelocity != Vector3D.Zero)
{
Block.CubeGrid.Physics.LinearVelocity = Vector3.Zero;
- if (IsServer && !GridStopped.Value)
- GridStopped.Value = true;
}
- }
- else
- {
- EndSiegeMode();
- SiegeMode.Value = false;
- return;
- }
+ }
}
- if (!SiegeMode.Value && !SiegeCooldownActive.Value && SiegeElapsedTime.Value > 0)
+ if (MyAPIGateway.Session.GameplayFrameCounter % 60 == 0)
{
- EndSiegeMode();
- return;
- }
+ if (SiegeMode.Value && !SiegeCooldownActive.Value)
+ {
+ if (SiegeElapsedTime.Value + 1 <= Config.MaxSiegeTime)
+ {
+ SiegeElapsedTime.Value++; ;
+ SiegeBlockEnabler(Block.CubeGrid.GetFatBlocks(), false);
+ }
+ else
+ {
+ EndSiegeState();
+ SiegeMode.Value = false;
+ return;
+ }
+ }
- if (SiegeCooldownActive.Value)
- {
- if (SiegeCooldownTime.Value > 0)
+ if (!SiegeMode.Value && !SiegeCooldownActive.Value && SiegeElapsedTime.Value > 0)
{
- SiegeCooldownTime.Value--;
+ EndSiegeState();
+ return;
}
- else
+
+ if (SiegeCooldownActive.Value)
{
- SiegeCooldownActive.Value = false;
+ if (SiegeCooldownTime.Value > 0)
+ {
+ SiegeCooldownTime.Value--;
+ }
+ else
+ {
+ SiegeCooldownActive.Value = false;
+ }
}
- }
+ }
}
private void SiegeBlockEnabler(IEnumerable allFunctionalBlocks, bool enabled)
@@ -528,7 +520,7 @@ private void SiegeBlockEnabler(IEnumerable allFunctionalBloc
}
}
- private void SiegeEmergencyStop()
+ private void SiegeSlowdown()
{
if (Block.CubeGrid.Physics == null)
return;
@@ -568,11 +560,10 @@ private void SiegeEmergencyStop()
if (Block.CubeGrid.Physics.LinearVelocity.LengthSquared() < 25f || elapsed >= 10f) // 5 m/s squared = 25
{
Block.CubeGrid.Physics.LinearVelocity = Vector3D.Zero;
- GridStopped.Value = true;
- SlowdownActive.Value = false;
+ _slowdownComplete.Value = true;
_stopTickCounter = -1;
angularAxis1 = null;
- angularAxis2 = null;
+ angularAxis2 = null;
return;
}
}
@@ -587,27 +578,13 @@ Vector3 GetRandomUnitVector()
return Vector3.Normalize(v);
}
- private void EndSiegeMode()
+ private void EndSiegeState(bool cancel = false)
{
- if (IsServer && GridStopped.Value)
- GridStopped.Value = false;
-
- SiegeBlockEnabler(Block.CubeGrid.GetFatBlocks(), true);
-
- SiegeCooldownTime.Value = Math.Max(SiegeElapsedTime.Value * 2, Config.MinSiegeTime);
- SiegeElapsedTime.Value = 0;
- SiegeCooldownActive.Value = true;
- }
-
- private void CancelSiegeMode()
- {
- if (IsServer && GridStopped.Value)
- GridStopped.Value = false;
-
SiegeBlockEnabler(Block.CubeGrid.GetFatBlocks(), true);
- SiegeCooldownTime.Value = 0;
+ SiegeCooldownTime.Value = cancel ? 0 : Math.Max(SiegeElapsedTime.Value * 2, Config.MinSiegeTime);
SiegeElapsedTime.Value = 0;
+ SiegeCooldownActive.Value = cancel ? false : true;
}
#endregion
@@ -888,7 +865,7 @@ private void UpdateHUD()
GeneratorHUDContent.Append(GenerateBar("Stability:", Stability.Value, 100, true));
}
- if (SiegeMode.Value && !GridStopped.Value)
+ if (SiegeMode.Value && !_slowdownComplete.Value)
{
GeneratorHUDContent.Append($"\nSiege Mode Actived | Emergency Braking Applied");
}
diff --git a/Utility Mods/SCDefenseBlocks/Data/Scripts/OneFuckingFolderDeeper/FieldGenerator/FieldGenerator_TerminalControls.cs b/Utility Mods/SCDefenseBlocks/Data/Scripts/OneFuckingFolderDeeper/FieldGenerator/FieldGenerator_TerminalControls.cs
index 50a852471..4655b00df 100644
--- a/Utility Mods/SCDefenseBlocks/Data/Scripts/OneFuckingFolderDeeper/FieldGenerator/FieldGenerator_TerminalControls.cs
+++ b/Utility Mods/SCDefenseBlocks/Data/Scripts/OneFuckingFolderDeeper/FieldGenerator/FieldGenerator_TerminalControls.cs
@@ -48,7 +48,7 @@ static bool CooldownEnabler(IMyTerminalBlock b)
var logic = GetLogic(b);
if (logic != null)
{
- return !logic.SiegeCooldownActive && !logic.SlowdownActive;
+ return logic.SiegeMode.Value ? logic._slowdownComplete.Value : !logic.SiegeCooldownActive.Value;
}
return false;
}
diff --git a/Utility Mods/SC_Season_4_Adjustments/Data/Scripts/CoreParts/BoostedThrustAndFlame/BoostedThrustAndFlame.cs b/Utility Mods/SC_Season_4_Adjustments/Data/Scripts/CoreParts/BoostedThrustAndFlame/BoostedThrustAndFlame.cs
index ab8f091ca..8a5052318 100644
--- a/Utility Mods/SC_Season_4_Adjustments/Data/Scripts/CoreParts/BoostedThrustAndFlame/BoostedThrustAndFlame.cs
+++ b/Utility Mods/SC_Season_4_Adjustments/Data/Scripts/CoreParts/BoostedThrustAndFlame/BoostedThrustAndFlame.cs
@@ -24,7 +24,7 @@ public override void LoadData()
if (thruster != null)
{
thruster.ForceMagnitude *= 4.0f; //S3 was 3.5
- thruster.MaxPowerConsumption *= 3.0f; //S3 was 3.5
+ thruster.MaxPowerConsumption *= 2f; //S3 was 3.5
thruster.FlameDamage *= 5f;
//thruster.FlameDamageLengthScale *= 1.5f;
thruster.FlameLengthScale *= 2.0f;
diff --git a/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Audio.sbc b/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Audio.sbc
index 2ab6d2563..129bd91fa 100644
--- a/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Audio.sbc
+++ b/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Audio.sbc
@@ -662,7 +662,7 @@
10
HeavyFight
3
- 2
+ 1
false
diff --git a/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/CoreParts/Goncol_Ammo.cs b/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/CoreParts/Goncol_Ammo.cs
index eb32766c8..3d6e96152 100644
--- a/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/CoreParts/Goncol_Ammo.cs
+++ b/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/CoreParts/Goncol_Ammo.cs
@@ -127,7 +127,7 @@ partial class Parts
},
Shields = new ShieldDef
{
- Modifier = 1200f, // Multiplier for damage against shields.
+ Modifier = 3600f, // Multiplier for damage against shields.
Type = Heal, // Damage vs healing against shields; Default, Heal
BypassModifier = 0.25f, // If greater than zero, the percentage of damage that will penetrate the shield.
},
diff --git a/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/CoreParts/Heavy_MAC_Ammo.cs b/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/CoreParts/Heavy_MAC_Ammo.cs
index c7df8faf3..e014a7d61 100644
--- a/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/CoreParts/Heavy_MAC_Ammo.cs
+++ b/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/CoreParts/Heavy_MAC_Ammo.cs
@@ -571,7 +571,7 @@ partial class Parts
{
Enable = true,
Radius = 1f, // Radius of AOE effect, in meters.
- Damage = 1f,
+ Damage = 100f,
Depth = 1f, // Max depth of AOE effect, in meters. 0=disabled, and AOE effect will reach to a depth of the radius value
MaxAbsorb = 0f, // Soft cutoff for damage, except for pooled falloff. If pooled falloff, limits max damage per block.
Falloff = Pooled, //.NoFalloff applies the same damage to all blocks in radius
diff --git a/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/CoreParts/Nariman_Turret_Ammo.cs b/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/CoreParts/Nariman_Turret_Ammo.cs
index e3f100930..935bf9ade 100644
--- a/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/CoreParts/Nariman_Turret_Ammo.cs
+++ b/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/CoreParts/Nariman_Turret_Ammo.cs
@@ -297,7 +297,7 @@ partial class Parts
},
AmmoGraphics = new GraphicDef
{
- ModelName = "\\Models\\Ammo\\Expanse-Torpedo",
+ ModelName = "\\Models\\Ammo\\Expanse-Torpedo-Smol",
VisualProbability = 1f,
ShieldHitDraw = false,
Particles = new AmmoParticleDef
diff --git a/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/selfrepair/selfrepair.cs b/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/selfrepair/selfrepair.cs
index 00dbdc145..a4c5881cb 100644
--- a/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/selfrepair/selfrepair.cs
+++ b/Weapon Mods/Anomaly_Solaris_Hypernautics/Data/Scripts/selfrepair/selfrepair.cs
@@ -68,7 +68,7 @@ private void DoRepair()
// If the grid has an owner, proceed with repair and ownership change.
- float repairAmount = 8; //about 3.5% per triggertick at 14, 2% per trigger at 8, tested in game.
+ float repairAmount = 14; //about 3.5% per triggertick at 14, 2% per trigger at 8, tested in game.
slimBlock.IncreaseMountLevel(repairAmount, 0L, null, 0f, false, MyOwnershipShareModeEnum.Faction);
// Try casting to MyCubeBlock and change the owner.
diff --git a/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Nyx.cs b/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Nyx.cs
index b107d336f..a287ad63d 100644
--- a/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Nyx.cs
+++ b/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Nyx.cs
@@ -56,7 +56,7 @@ partial class Parts {
TopTargets = 8, // Maximum number of targets to randomize between; 0 = unlimited.
CycleTargets = 0, // Number of targets to "cycle" per acquire attempt.
TopBlocks = 8, // Maximum number of blocks to randomize between; 0 = unlimited.
- CycleBlocks = 3, // Number of blocks to "cycle" per acquire attempt.
+ CycleBlocks = 0, // Number of blocks to "cycle" per acquire attempt.
StopTrackingSpeed = 0, // Do not track threats traveling faster than this speed; 0 = unlimited.
},
HardPoint = new HardPointDef
@@ -185,7 +185,7 @@ partial class Parts {
},
},
Ammos = new[] {
- HAS_Nyx_Ammo, // Must list all primary, shrapnel, and pattern ammos.
+ HAS_Nyx_Ammo, HAS_Nyx_Ammo_Fake, // Must list all primary, shrapnel, and pattern ammos.
},
//Animations = SA_HMI_ERGaussRF_Animation,
//Upgrades = UpgradeModules,
diff --git a/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Nyx_ammo.cs b/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Nyx_ammo.cs
index 1b5758606..4ecc41acc 100644
--- a/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Nyx_ammo.cs
+++ b/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Nyx_ammo.cs
@@ -36,8 +36,8 @@ partial class Parts
AmmoMagazine = "NyxAmmoMag", // SubtypeId of physical ammo magazine. Use "Energy" for weapons without physical ammo.
AmmoRound = "Nyx Beam", // Name of ammo in terminal, should be different for each ammo type used by the same weapon. Is used by Shrapnel.
HybridRound = true, // Use both a physical ammo magazine and energy per shot.
- EnergyCost = 0.125f, //100MW Scaler for energy per shot (EnergyCost * BaseDamage * (RateOfFire / 3600) * BarrelsPerShot * TrajectilesPerBarrel). Uses EffectStrength instead of BaseDamage if EWAR.
- BaseDamage = 1600f, // Direct damage; one steel plate is worth 100.
+ EnergyCost = 0.0125f, //100MW Scaler for energy per shot (EnergyCost * BaseDamage * (RateOfFire / 3600) * BarrelsPerShot * TrajectilesPerBarrel). Uses EffectStrength instead of BaseDamage if EWAR.
+ BaseDamage = 16000f, // Direct damage; one steel plate is worth 100.
Mass = 0f, // In kilograms; how much force the impact will apply to the target.
Health = 0, // How much damage the projectile can take from other projectiles (base of 1 per hit) before dying; 0 disables this and makes the projectile untargetable.
BackKickForce = 0f, // Recoil. This is applied to the Parent Grid.
@@ -51,7 +51,7 @@ partial class Parts
Shape = new ShapeDef // Defines the collision shape of the projectile, defaults to LineShape and uses the visual Line Length if set to 0.
{
Shape = LineShape, // LineShape or SphereShape. Do not use SphereShape for fast moving projectiles if you care about precision.
- Diameter = 20, // Diameter is minimum length of LineShape or minimum diameter of SphereShape.
+ Diameter = 2, // Diameter is minimum length of LineShape or minimum diameter of SphereShape.
},
ObjectsHit = new ObjectsHitDef
{
@@ -87,7 +87,7 @@ partial class Parts
Pattern = new PatternDef
{
Patterns = new[] { // If enabled, set of multiple ammos to fire in order instead of the main ammo.
- "",
+ "Nyx Beam Fake", "Nyx Beam Fake", "Nyx Beam Fake", "Nyx Beam Fake", "Nyx Beam Fake", "Nyx Beam Fake", "Nyx Beam Fake", "Nyx Beam Fake", "Nyx Beam Fake",
},
Mode = Never, // Select when to activate this pattern, options: Never, Weapon, Fragment, Both
TriggerChance = 1f, // This is %
@@ -419,6 +419,395 @@ partial class Parts
}, // Don't edit below this line
};
+ private AmmoDef HAS_Nyx_Ammo_Fake => new AmmoDef // Your ID, for slotting into the Weapon CS
+ {
+ AmmoMagazine = "", // SubtypeId of physical ammo magazine. Use "Energy" for weapons without physical ammo.
+ AmmoRound = "Nyx Beam Fake", // Name of ammo in terminal, should be different for each ammo type used by the same weapon. Is used by Shrapnel.
+ HybridRound = false, // Use both a physical ammo magazine and energy per shot.
+ EnergyCost = 0f, //100MW Scaler for energy per shot (EnergyCost * BaseDamage * (RateOfFire / 3600) * BarrelsPerShot * TrajectilesPerBarrel). Uses EffectStrength instead of BaseDamage if EWAR.
+ BaseDamage = 0f, // Direct damage; one steel plate is worth 100.
+ Mass = 0f, // In kilograms; how much force the impact will apply to the target.
+ Health = 0, // How much damage the projectile can take from other projectiles (base of 1 per hit) before dying; 0 disables this and makes the projectile untargetable.
+ BackKickForce = 0f, // Recoil. This is applied to the Parent Grid.
+ DecayPerShot = 0f, // Damage to the firing weapon itself.
+ HardPointUsable = false, // Whether this is a primary ammo type fired directly by the turret. Set to false if this is a shrapnel ammoType and you don't want the turret to be able to select it directly.
+ EnergyMagazineSize = 0, // For energy weapons, how many shots to fire before reloading.
+ IgnoreWater = false, // Whether the projectile should be able to penetrate water when using WaterMod.
+ IgnoreVoxels = false, // Whether the projectile should be able to penetrate voxels.
+ Synchronize = false, // For future use
+
+ Shape = new ShapeDef // Defines the collision shape of the projectile, defaults to LineShape and uses the visual Line Length if set to 0.
+ {
+ Shape = LineShape, // LineShape or SphereShape. Do not use SphereShape for fast moving projectiles if you care about precision.
+ Diameter = 1, // Diameter is minimum length of LineShape or minimum diameter of SphereShape.
+ },
+ ObjectsHit = new ObjectsHitDef
+ {
+ MaxObjectsHit = 0, // Limits the number of entities (grids, players, projectiles) the projectile can penetrate; 0 = unlimited.
+ CountBlocks = false, // Counts individual blocks, not just entities hit.
+ },
+ Fragment = new FragmentDef // Formerly known as Shrapnel. Spawns specified ammo fragments on projectile death (via hit or detonation).
+ {
+ AmmoRound = "", // AmmoRound field of the ammo to spawn.
+ Fragments = 0, // Number of projectiles to spawn.
+ Degrees = 5, // Cone in which to randomize direction of spawned projectiles.
+ Reverse = false, // Spawn projectiles backward instead of forward.
+ DropVelocity = false, // fragments will not inherit velocity from parent.
+ Offset = 0f, // Offsets the fragment spawn by this amount, in meters (positive forward, negative for backwards), value is read from parent ammo type.
+ Radial = 0f, // Determines starting angle for Degrees of spread above. IE, 0 degrees and 90 radial goes perpendicular to travel path
+ MaxChildren = 0, // number of maximum branches for fragments from the roots point of view, 0 is unlimited
+ IgnoreArming = true, // If true, ignore ArmOnHit or MinArmingTime in EndOfLife definitions
+ AdvOffset = Vector(x: 0, y: 0, z: 0), // advanced offsets the fragment by xyz coordinates relative to parent, value is read from fragment ammo type.
+ TimedSpawns = new TimedSpawnDef // disables FragOnEnd in favor of info specified below
+ {
+ Enable = false, // Enables TimedSpawns mechanism
+ Interval = 0, // Time between spawning fragments, in ticks, 0 means every tick, 1 means every other
+ StartTime = 0, // Time delay to start spawning fragments, in ticks, of total projectile life
+ MaxSpawns = 1, // Max number of fragment children to spawn
+ Proximity = 1000, // Starting distance from target bounding sphere to start spawning fragments, 0 disables this feature. No spawning outside this distance
+ ParentDies = true, // Parent dies once after it spawns its last child.
+ PointAtTarget = true, // Start fragment direction pointing at Target
+ PointType = Predict, // Point accuracy, Direct, Lead (always fire), Predict (only fire if it can hit)
+ GroupSize = 5, // Number of spawns in each group
+ GroupDelay = 120, // Delay between each group.
+ },
+ },
+ Pattern = new PatternDef
+ {
+ Patterns = new[] { // If enabled, set of multiple ammos to fire in order instead of the main ammo.
+ "",
+ },
+ Mode = Never, // Select when to activate this pattern, options: Never, Weapon, Fragment, Both
+ TriggerChance = 1f, // This is %
+ Random = false, // This randomizes the number spawned at once, NOT the list order.
+ RandomMin = 1,
+ RandomMax = 1,
+ SkipParent = false, // Skip the Ammo itself, in the list
+ PatternSteps = 1, // Number of Ammos activated per round, will progress in order and loop. Ignored if Random = true.
+ },
+ DamageScales = new DamageScaleDef
+ {
+ MaxIntegrity = 0f, // Blocks with integrity higher than this value will be immune to damage from this projectile; 0 = disabled.
+ DamageVoxels = false, // Whether to damage voxels.
+ SelfDamage = false, // Whether to damage the weapon's own grid.
+ HealthHitModifier = 0.5, // How much Health to subtract from another projectile on hit; defaults to 1 if zero or less.
+ VoxelHitModifier = 1, // Voxel damage multiplier; defaults to 1 if zero or less.
+ Characters = -1f, // Character damage multiplier; defaults to 1 if zero or less.
+ // For the following modifier values: -1 = disabled (higher performance), 0 = no damage, 0.01f = 1% damage, 2 = 200% damage.
+ FallOff = new FallOffDef
+ {
+ Distance = 0f, // Distance at which damage begins falling off.
+ MinMultipler = 1f, // Value from 0.0001f to 1f where 0.1f would be a min damage of 10% of base damage.
+ },
+ Grids = new GridSizeDef
+ {
+ Large = -1f, // Multiplier for damage against large grids.
+ Small = -1f, // Multiplier for damage against small grids.
+ },
+ Armor = new ArmorDef
+ {
+ Armor = -1f, // Multiplier for damage against all armor. This is multiplied with the specific armor type multiplier (light, heavy).
+ Light = -1f, // Multiplier for damage against light armor.
+ Heavy = -1f, // Multiplier for damage against heavy armor.
+ NonArmor = -1f, // Multiplier for damage against every else.
+ },
+ Shields = new ShieldDef
+ {
+ Modifier = -1f, // Multiplier for damage against shields.
+ Type = Default, // Damage vs healing against shields; Default, Heal
+ BypassModifier = -1f, // If greater than zero, the percentage of damage that will penetrate the shield.
+ },
+ Deform = new DeformDef
+ {
+ DeformType = NoDeform,
+ DeformDelay = 30,
+ },
+ DamageType = new DamageTypes // Damage type of each element of the projectile's damage; Kinetic, Energy
+ {
+ Base = Energy, // Base Damage uses this
+ AreaEffect = Energy,
+ Detonation = Energy,
+ Shield = Energy, // Damage against shields is currently all of one type per projectile. Shield Bypass Weapons, always Deal Energy regardless of this line
+ },
+ Custom = new CustomScalesDef
+ {
+ SkipOthers = NoSkip, // Controls how projectile interacts with other blocks in relation to those defined here, NoSkip, Exclusive, Inclusive.
+ Types = new[] // List of blocks to apply custom damage multipliers to.
+ {
+ new CustomBlocksDef
+ {
+ SubTypeId = "Test1",
+ Modifier = -1f,
+ },
+ new CustomBlocksDef
+ {
+ SubTypeId = "Test2",
+ Modifier = -1f,
+ },
+ },
+ },
+ },
+ AreaOfDamage = new AreaOfDamageDef
+ {
+ ByBlockHit = new ByBlockHitDef
+ {
+ Enable = false,
+ Radius = 5f, // Meters
+ Damage = 5f,
+ Depth = 1f, // Max depth of AOE effect, in meters. 0=disabled, and AOE effect will reach to a depth of the radius value
+ MaxAbsorb = 0f, // Soft cutoff for damage, except for pooled falloff. If pooled falloff, limits max damage per block.
+ Falloff = Pooled, //.NoFalloff applies the same damage to all blocks in radius
+ //.Linear drops evenly by distance from center out to max radius
+ //.Curve drops off damage sharply as it approaches the max radius
+ //.InvCurve drops off sharply from the middle and tapers to max radius
+ //.Squeeze does little damage to the middle, but rapidly increases damage toward max radius
+ //.Pooled damage behaves in a pooled manner that once exhausted damage ceases.
+ //.Exponential drops off exponentially. Does not scale to max radius
+ Shape = Diamond, // Round or Diamond shape. Diamond is more performance friendly.
+ },
+ EndOfLife = new EndOfLifeDef
+ {
+ Enable = false,
+ Radius = 1f, // Radius of AOE effect, in meters.
+ Damage = 0f,
+ Depth = 1f, // Max depth of AOE effect, in meters. 0=disabled, and AOE effect will reach to a depth of the radius value
+ MaxAbsorb = 0f, // Soft cutoff for damage, except for pooled falloff. If pooled falloff, limits max damage per block.
+ Falloff = Exponential, //.NoFalloff applies the same damage to all blocks in radius
+ //.Linear drops evenly by distance from center out to max radius
+ //.Curve drops off damage sharply as it approaches the max radius
+ //.InvCurve drops off sharply from the middle and tapers to max radius
+ //.Squeeze does little damage to the middle, but rapidly increases damage toward max radius
+ //.Pooled damage behaves in a pooled manner that once exhausted damage ceases.
+ //.Exponential drops off exponentially. Does not scale to max radius
+ ArmOnlyOnHit = false, // Detonation only is available, After it hits something, when this is true. IE, if shot down, it won't explode.
+ MinArmingTime = 100, // In ticks, before the Ammo is allowed to explode, detonate or similar; This affects shrapnel spawning.
+ NoVisuals = false,
+ NoSound = false,
+ ParticleScale = 1,
+ CustomParticle = "particleName", // Particle SubtypeID, from your Particle SBC
+ CustomSound = "soundName", // SubtypeID from your Audio SBC, not a filename
+ Shape = Diamond, // Round or Diamond shape. Diamond is more performance friendly.
+ },
+ },
+ Ewar = new EwarDef
+ {
+ Enable = false, // Enables EWAR effects AND DISABLES BASE DAMAGE AND AOE DAMAGE!!
+ Type = EnergySink, // EnergySink, Emp, Offense, Nav, Dot, AntiSmart, JumpNull, Anchor, Tractor, Pull, Push,
+ Mode = Effect, // Effect , Field
+ Strength = 100f,
+ Radius = 5f, // Meters
+ Duration = 100, // In Ticks
+ StackDuration = true, // Combined Durations
+ Depletable = true,
+ MaxStacks = 10, // Max Debuffs at once
+ NoHitParticle = false,
+ /*
+ EnergySink : Targets & Shutdowns Power Supplies, such as Batteries & Reactor
+ Emp : Targets & Shutdown any Block capable of being powered
+ Offense : Targets & Shutdowns Weaponry
+ Nav : Targets & Shutdown Gyros or Locks them down
+ Dot : Deals Damage to Blocks in radius
+ AntiSmart : Effects & Scrambles the Targeting List of Affected Missiles
+ JumpNull : Shutdown & Stops any Active Jumps, or JumpDrive Units in radius
+ Tractor : Affects target with Physics
+ Pull : Affects target with Physics
+ Push : Affects target with Physics
+ Anchor : Targets & Shutdowns Thrusters
+
+ */
+ Force = new PushPullDef
+ {
+ ForceFrom = ProjectileLastPosition, // ProjectileLastPosition, ProjectileOrigin, HitPosition, TargetCenter, TargetCenterOfMass
+ ForceTo = HitPosition, // ProjectileLastPosition, ProjectileOrigin, HitPosition, TargetCenter, TargetCenterOfMass
+ Position = TargetCenterOfMass, // ProjectileLastPosition, ProjectileOrigin, HitPosition, TargetCenter, TargetCenterOfMass
+ DisableRelativeMass = false,
+ TractorRange = 0,
+ ShooterFeelsForce = false,
+ },
+ Field = new FieldDef
+ {
+ Interval = 0, // Time between each pulse, in game ticks (60 == 1 second).
+ PulseChance = 0, // Chance from 0 - 100 that an entity in the field will be hit by any given pulse.
+ GrowTime = 0, // How many ticks it should take the field to grow to full size.
+ HideModel = false, // Hide the default bubble, or other model if specified.
+ ShowParticle = true, // Show Block damage effect.
+ TriggerRange = 250f, //range at which fields are triggered
+ Particle = new ParticleDef // Particle effect to generate at the field's position.
+ {
+ Name = "", // SubtypeId of field particle effect.
+ Extras = new ParticleOptionDef
+ {
+ Scale = 1, // Scale of effect.
+ },
+ },
+ },
+ },
+ Beams = new BeamDef
+ {
+ Enable = false, // Enable beam behaviour. Please have 3600 RPM, when this Setting is enabled. Please do not fire Beams into Voxels.
+ VirtualBeams = false, // Only one damaging beam, but with the effectiveness of the visual beams combined (better performance).
+ ConvergeBeams = false, // When using virtual beams, converge the visual beams to the location of the real beam.
+ RotateRealBeam = false, // The real beam is rotated between all visual beams, instead of centered between them.
+ OneParticle = false, // Only spawn one particle hit per beam weapon.
+ },
+ Trajectory = new TrajectoryDef
+ {
+ Guidance = None, // None, Remote, TravelTo, Smart, DetectTravelTo, DetectSmart, DetectFixed
+ TargetLossDegree = 0f, // Degrees, Is pointed forward
+ TargetLossTime = 0, // 0 is disabled, Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
+ MaxLifeTime = 0, // 0 is disabled, Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..). Please have a value for this, It stops Bad things.
+ AccelPerSec = 0f, // Meters Per Second. This is the spawning Speed of the Projectile, and used by turning.
+ DesiredSpeed = 4000, // voxel phasing if you go above 5100
+ MaxTrajectory = 4500f, // Max Distance the projectile or beam can Travel.
+ DeaccelTime = 0, // 0 is disabled, a value causes the projectile to come to rest, spawn a field and remain for a time (Measured in game ticks, 60 = 1 second)
+ GravityMultiplier = 20f, // Gravity multiplier, influences the trajectory of the projectile, value greater than 0 to enable. Natural Gravity Only.
+ SpeedVariance = Random(start: 0, end: 0), // subtracts value from DesiredSpeed. Be warned, you can make your projectile go backwards.
+ RangeVariance = Random(start: 0, end: 0), // subtracts value from MaxTrajectory
+ MaxTrajectoryTime = 0, // How long the weapon must fire before it reaches MaxTrajectory.
+ Smarts = new SmartsDef
+ {
+ Inaccuracy = 1f, // 0 is perfect, hit accuracy will be a random num of meters between 0 and this value.
+ Aggressiveness = 3f, // controls how responsive tracking is.
+ MaxLateralThrust = 0.5, // controls how sharp the trajectile may turn
+ TrackingDelay = 0, // Measured in Shape diameter units traveled.
+ MaxChaseTime = 0, // Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
+ OverideTarget = false, // when set to true ammo picks its own target, does not use hardpoint's.
+ MaxTargets = 0, // Number of targets allowed before ending, 0 = unlimited
+ NoTargetExpire = false, // Expire without ever having a target at TargetLossTime
+ Roam = false, // Roam current area after target loss
+ KeepAliveAfterTargetLoss = false, // Whether to stop early death of projectile on target loss
+ OffsetRatio = 0.05f, // The ratio to offset the random direction (0 to 1)
+ OffsetTime = 60, // how often to offset degree, measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..)
+ },
+ Mines = new MinesDef // Note: This is being investigated. Please report to Github, any issues.
+ {
+ DetectRadius = 0,
+ DeCloakRadius = 0,
+ FieldTime = 0,
+ Cloak = false,
+ Persist = false,
+ },
+ },
+ AmmoGraphics = new GraphicDef
+ {
+ ModelName = "", // Model Path goes here. "\\Models\\Ammo\\Starcore_Arrow_Missile_Large"
+ VisualProbability = 1f, // %
+ ShieldHitDraw = true,
+ Particles = new AmmoParticleDef
+ {
+ Ammo = new ParticleDef
+ {
+ Name = "", //ShipWelderArc
+ Offset = Vector(x: 0, y: 0, z: 0),
+ Extras = new ParticleOptionDef
+ {
+ Scale = 1,
+ },
+ },
+ Hit = new ParticleDef
+ {
+ Name = "",
+ ApplyToShield = true,
+ Offset = Vector(x: 0, y: 0, z: 0),
+ Extras = new ParticleOptionDef
+ {
+ Scale = 1,
+ HitPlayChance = 1f,
+ },
+ },
+ Eject = new ParticleDef
+ {
+ Name = "",
+ ApplyToShield = true,
+ Offset = Vector(x: 0, y: 0, z: 0),
+ Extras = new ParticleOptionDef
+ {
+ Scale = 1,
+ HitPlayChance = 1f,
+ },
+ },
+ },
+ Lines = new LineDef
+ {
+ ColorVariance = Random(start: -10f, end: 10f), // multiply the color by random values within range.
+ WidthVariance = Random(start: 0f, end: 0f), // adds random value to default width (negatives shrinks width)
+ Tracer = new TracerBaseDef
+ {
+ Enable = true,
+ Length = 10f, //
+ Width = 0.25f, //
+ Color = Color(red: 3, green: 10, blue: 50f, alpha: 1), // RBG 255 is Neon Glowing, 100 is Quite Bright.
+ VisualFadeStart = 0, // Number of ticks the weapon has been firing before projectiles begin to fade their color
+ VisualFadeEnd = 0, // How many ticks after fade began before it will be invisible.
+ Textures = new[] {// WeaponLaser, ProjectileTrailLine, WarpBubble, etc..
+ "WeaponLaser", // Please always have this Line set, if this Section is enabled.
+ },
+ TextureMode = Normal, // Normal, Cycle, Chaos, Wave
+ Segmentation = new SegmentDef
+ {
+ Enable = false, // If true Tracer TextureMode is ignored
+ Textures = new[] {
+ "", // Please always have this Line set, if this Section is enabled.
+ },
+ SegmentLength = 0f, // Uses the values below.
+ SegmentGap = 0f, // Uses Tracer textures and values
+ Speed = 1f, // meters per second
+ Color = Color(red: 1, green: 2, blue: 2.5f, alpha: 1),
+ WidthMultiplier = 1f,
+ Reverse = false,
+ UseLineVariance = true,
+ WidthVariance = Random(start: 0f, end: 0f),
+ ColorVariance = Random(start: 0f, end: 0f)
+ }
+ },
+ Trail = new TrailDef
+ {
+ Enable = true,
+ Textures = new[] {
+ "WeaponLaser", // Please always have this Line set, if this Section is enabled.
+ },
+ TextureMode = Normal,
+ DecayTime = 12, // In Ticks. 1 = 1 Additional Tracer generated per motion, 33 is 33 lines drawn per projectile. Keep this number low.
+ Color = Color(red: 3, green: 10, blue: 50, alpha: 1),
+ Back = false,
+ CustomWidth = 0.25f,
+ UseWidthVariance = false,
+ UseColorFade = false,
+ },
+ OffsetEffect = new OffsetEffectDef
+ {
+ MaxOffset = 0,// 0 offset value disables this effect
+ MinLength = 0.2f,
+ MaxLength = 3,
+ },
+ },
+ },
+ AmmoAudio = new AmmoAudioDef
+ {
+ TravelSound = "", // SubtypeID for your Sound File. Travel, is sound generated around your Projectile in flight
+ HitSound = "",
+ ShieldHitSound = "",
+ PlayerHitSound = "",
+ VoxelHitSound = "",
+ FloatingHitSound = "",
+ HitPlayChance = 0.5f,
+ HitPlayShield = true,
+ },
+ Ejection = new EjectionDef // Optional Component, allows generation of Particle or Item (Typically magazine), on firing, to simulate Tank shell ejection
+ {
+ Type = Particle, // Particle or Item (Inventory Component)
+ Speed = 100f, // Speed inventory is ejected from in dummy direction
+ SpawnChance = 0.5f, // chance of triggering effect (0 - 1)
+ CompDef = new ComponentDef
+ {
+ ItemName = "", //InventoryComponent name
+ ItemLifeTime = 0, // how long item should exist in world
+ Delay = 0, // delay in ticks after shot before ejected
+ }
+ }, // Don't edit below this line
+ };
+
+
}
}
diff --git a/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Vulcan.cs b/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Vulcan.cs
index ff49f5072..47319bc74 100644
--- a/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Vulcan.cs
+++ b/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Vulcan.cs
@@ -56,9 +56,9 @@ partial class Parts {
HardPoint = new HardPointDef
{
PartName = "R.A.C.-5 Avenger", // Name of the weapon in terminal, should be unique for each weapon definition that shares a SubtypeId (i.e. multiweapons).
- DeviateShotAngle = 0.57f, // Projectile inaccuracy in degrees.
+ DeviateShotAngle = 0.52f, //0.57f //Projectile inaccuracy in degrees.
AimingTolerance = 1f, // How many degrees off target a turret can fire at. 0 - 180 firing angle.
- AimLeadingPrediction = Basic, // Level of turret aim prediction; Off, Basic, Accurate, Advanced
+ AimLeadingPrediction = Accurate, // Level of turret aim prediction; Off, Basic, Accurate, Advanced
DelayCeaseFire = 0, // Measured in game ticks (6 = 100ms, 60 = 1 second, etc..). Length of time the weapon continues firing after trigger is released.
AddToleranceToTracking = false, // Allows turret to track to the edge of the AimingTolerance cone instead of dead centre.
CanShootSubmerged = false, // Whether the weapon can be fired underwater when using WaterMod.
diff --git a/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Vulcan_Ammo.cs b/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Vulcan_Ammo.cs
index 489d7b5e9..c43ae332f 100644
--- a/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Vulcan_Ammo.cs
+++ b/Weapon Mods/Heavy-Assault-Systems/Data/Scripts/CoreParts/Vulcan_Ammo.cs
@@ -95,8 +95,8 @@ partial class Parts
// For the following modifier values: -1 = disabled (higher performance), 0 = no damage, 0.01f = 1% damage, 2 = 200% damage.
FallOff = new FallOffDef
{
- Distance = 4000f, // Distance at which damage begins falling off.
- MinMultipler = 0.5f, // Value from 0.0001f to 1f where 0.1f would be a min damage of 10% of base damage.
+ Distance = 0f, //4000f// Distance at which damage begins falling off.
+ MinMultipler = 1f, //0.5f // Value from 0.0001f to 1f where 0.1f would be a min damage of 10% of base damage.
},
Grids = new GridSizeDef
{
diff --git a/Weapon Mods/Invalids Vanilla Lobotomizer/Data/CubeBlocks_Weapons_IVL.sbc b/Weapon Mods/Invalids Vanilla Lobotomizer/Data/CubeBlocks_Weapons_IVL.sbc
index 9221c72d3..a95913d6d 100644
--- a/Weapon Mods/Invalids Vanilla Lobotomizer/Data/CubeBlocks_Weapons_IVL.sbc
+++ b/Weapon Mods/Invalids Vanilla Lobotomizer/Data/CubeBlocks_Weapons_IVL.sbc
@@ -545,9 +545,9 @@
[FLAW] Railgun 2.0
Textures\GUI\Icons\Cubes\RailGun.dds
- 10km range Railgun. 5000m/s velocity
+ 11km range Railgun. 6000m/s velocity
24Mw Passive Draw, 300Mw Recharge
- Falloff After 6km.
+ Falloff After 10km.
Deals Kinetic Damage.
Large
diff --git a/Weapon Mods/Invalids Vanilla Lobotomizer/Data/Scripts/CoreParts/AmmoTypes.cs b/Weapon Mods/Invalids Vanilla Lobotomizer/Data/Scripts/CoreParts/AmmoTypes.cs
index 82da8fb0a..0d5aa9cd5 100644
--- a/Weapon Mods/Invalids Vanilla Lobotomizer/Data/Scripts/CoreParts/AmmoTypes.cs
+++ b/Weapon Mods/Invalids Vanilla Lobotomizer/Data/Scripts/CoreParts/AmmoTypes.cs
@@ -2293,8 +2293,8 @@ partial class Parts
AmmoMagazine = "LargeRailgunAmmo", // SubtypeId of physical ammo magazine. Use "Energy" for weapons without physical ammo.
AmmoRound = "Large Railgun Slug", // Name of ammo in terminal, should be different for each ammo type used by the same weapon. Is used by Shrapnel.
HybridRound = true, // Use both a physical ammo magazine and energy per shot.
- EnergyCost = 0.2858f, // Scaler for energy per shot (EnergyCost * BaseDamage * (RateOfFire / 3600) * BarrelsPerShot * TrajectilesPerBarrel). Uses EffectStrength instead of BaseDamage if EWAR.
- BaseDamage = 126000f, // Direct damage; one steel plate is worth 100.
+ EnergyCost = 0.2143f, // Scaler for energy per shot (EnergyCost * BaseDamage * (RateOfFire / 3600) * BarrelsPerShot * TrajectilesPerBarrel). Uses EffectStrength instead of BaseDamage if EWAR.
+ BaseDamage = 126000f, //holy number, not to be changed //Direct damage; one steel plate is worth 100.
Mass = 277f, // In kilograms; how much force the impact will apply to the target.
Health = 0, // How much damage the projectile can take from other projectiles (base of 1 per hit) before dying; 0 disables this and makes the projectile untargetable.
BackKickForce = 0f, // Recoil. This is applied to the Parent Grid. 21777000f
@@ -2358,7 +2358,7 @@ partial class Parts
// For the following modifier values: -1 = disabled (higher performance), 0 = no damage, 0.01f = 1% damage, 2 = 200% damage.
FallOff = new FallOffDef
{
- Distance = 6000f, // Distance at which damage begins falling off.
+ Distance = 10000f, // Distance at which damage begins falling off.
MinMultipler = 0.75f, // Value from 0.0001f to 1f where 0.1f would be a min damage of 10% of base damage.
},
Grids = new GridSizeDef
@@ -2409,10 +2409,10 @@ partial class Parts
ByBlockHit = new ByBlockHitDef
{
Enable = true,
- Radius = 3f, // Meters
- Damage = 10000f, // Damages 4 blocks
+ Radius = 3.5f, // Meters
+ Damage = 20000f, // Damages 4 blocks
Depth = 1f, // Max depth of AOE effect, in meters. 0=disabled, and AOE effect will reach to a depth of the radius value
- MaxAbsorb = 2500f, // Soft cutoff for damage, except for pooled falloff. If pooled falloff, limits max damage per block.
+ MaxAbsorb = 5000f, // Soft cutoff for damage, except for pooled falloff. If pooled falloff, limits max damage per block.
Falloff = Pooled, //.NoFalloff applies the same damage to all blocks in radius
//.Linear drops evenly by distance from center out to max radius
//.Curve drops off damage sharply as it approaches the max radius
@@ -2514,8 +2514,8 @@ partial class Parts
TargetLossTime = 0, // 0 is disabled, Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
MaxLifeTime = 120, //120 is required for sound. 0 is disabled, Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..). time begins at 0 and time must EXCEED this value to trigger "time > maxValue". Please have a value for this, It stops Bad things.
AccelPerSec = 0f, // Meters Per Second. This is the spawning Speed of the Projectile, and used by turning.
- DesiredSpeed = 5000, // voxel phasing if you go above 5100
- MaxTrajectory = 10000f, //**MUST** be double of speed for sound to work good.// Max Distance the projectile or beam can Travel.
+ DesiredSpeed = 6000, // voxel phasing if you go above 5100
+ MaxTrajectory = 12500f, //**MUST** be double of speed for sound to work good.// Max Distance the projectile or beam can Travel.
DeaccelTime = 0, // 0 is disabled, a value causes the projectile to come to rest overtime, (Measured in game ticks, 60 = 1 second)
GravityMultiplier = 0f, // Gravity multiplier, influences the trajectory of the projectile, value greater than 0 to enable. Natural Gravity Only.
SpeedVariance = Random(start: 0, end: 0), // subtracts value from DesiredSpeed. Be warned, you can make your projectile go backwards.
diff --git a/Weapon Mods/Invalids Vanilla Lobotomizer/Data/Scripts/CoreParts/Railguns.cs b/Weapon Mods/Invalids Vanilla Lobotomizer/Data/Scripts/CoreParts/Railguns.cs
index 7fb8a06cc..10341b779 100644
--- a/Weapon Mods/Invalids Vanilla Lobotomizer/Data/Scripts/CoreParts/Railguns.cs
+++ b/Weapon Mods/Invalids Vanilla Lobotomizer/Data/Scripts/CoreParts/Railguns.cs
@@ -49,7 +49,7 @@ partial class Parts {
LockedSmartOnly = false, // Only fire at smart projectiles that are locked on to parent grid.
MinimumDiameter = 0, // Minimum radius of threat to engage.
MaximumDiameter = 0, // Maximum radius of threat to engage; 0 = unlimited.
- MaxTargetDistance = 8000, // Maximum distance at which targets will be automatically shot at; 0 = unlimited.
+ MaxTargetDistance = 11000, // Maximum distance at which targets will be automatically shot at; 0 = unlimited.
MinTargetDistance = 0, // Minimum distance at which targets will be automatically shot at.
TopTargets = 2, // Maximum number of targets to randomize between; 0 = unlimited.
TopBlocks = 4, // Maximum number of blocks to randomize between; 0 = unlimited.
diff --git a/Weapon Mods/Military Industrial Complex/Data/Scripts/CoreParts/MetalStorm.cs b/Weapon Mods/Military Industrial Complex/Data/Scripts/CoreParts/MetalStorm.cs
index 2de6ce02a..ca3edb9f5 100644
--- a/Weapon Mods/Military Industrial Complex/Data/Scripts/CoreParts/MetalStorm.cs
+++ b/Weapon Mods/Military Industrial Complex/Data/Scripts/CoreParts/MetalStorm.cs
@@ -79,7 +79,7 @@ partial class Parts {
LockedSmartOnly = false, // Only fire at smart projectiles that are locked on to parent grid.
MinimumDiameter = 0, // Minimum radius of threat to engage.
MaximumDiameter = 0, // Maximum radius of threat to engage; 0 = unlimited.
- MaxTargetDistance = 40000, // Maximum distance at which targets will be automatically shot at; 0 = unlimited.
+ MaxTargetDistance = 3000, // Maximum distance at which targets will be automatically shot at; 0 = unlimited.
MinTargetDistance = 0, // Minimum distance at which targets will be automatically shot at.
TopTargets = 4, // Maximum number of targets to randomize between; 0 = unlimited.
TopBlocks = 8, // Maximum number of blocks to randomize between; 0 = unlimited.
diff --git a/Weapon Mods/Military Industrial Complex/Data/Scripts/CoreParts/MetalStormAmmo.cs b/Weapon Mods/Military Industrial Complex/Data/Scripts/CoreParts/MetalStormAmmo.cs
index 48aa6a611..2b204591a 100644
--- a/Weapon Mods/Military Industrial Complex/Data/Scripts/CoreParts/MetalStormAmmo.cs
+++ b/Weapon Mods/Military Industrial Complex/Data/Scripts/CoreParts/MetalStormAmmo.cs
@@ -139,7 +139,7 @@ partial class Parts
DeaccelTime = 0, // 0 is disabled, a value causes the projectile to come to rest overtime, (Measured in game ticks, 60 = 1 second)
GravityMultiplier = 0f, // Gravity multiplier, influences the trajectory of the projectile, value greater than 0 to enable. Natural Gravity Only.
SpeedVariance = Random(start: 0, end: 0), // subtracts value from DesiredSpeed. Be warned, you can make your projectile go backwards.
- RangeVariance = Random(start: 0, end: 0), // subtracts value from MaxTrajectory
+ RangeVariance = Random(start: 0, end: 75), // subtracts value from MaxTrajectory
MaxTrajectoryTime = 0, // How long the weapon must fire before it reaches MaxTrajectory.
},
AmmoGraphics = new GraphicDef
diff --git a/Weapon Mods/Military Industrial Complex/Data/Scripts/CoreParts/script/Structure.cs b/Weapon Mods/Military Industrial Complex/Data/Scripts/CoreParts/script/Structure.cs
index b6fa49f76..ed5efbe33 100644
--- a/Weapon Mods/Military Industrial Complex/Data/Scripts/CoreParts/script/Structure.cs
+++ b/Weapon Mods/Military Industrial Complex/Data/Scripts/CoreParts/script/Structure.cs
@@ -525,7 +525,6 @@ public struct UiDef
[ProtoMember(5)] internal bool AlternateUi;
[ProtoMember(6)] internal bool DisableStatus;
[ProtoMember(7)] internal float RateOfFireMin;
- [ProtoMember(8)] internal bool DisableSupportingPD;
}
diff --git a/Weapon Mods/REEECore/Data/ERPPC_Audio.sbc b/Weapon Mods/REEECore/Data/ERPPC_Audio.sbc
index 692107da3..1e521325a 100644
--- a/Weapon Mods/REEECore/Data/ERPPC_Audio.sbc
+++ b/Weapon Mods/REEECore/Data/ERPPC_Audio.sbc
@@ -205,16 +205,16 @@
ERPPCImpact
WEP_EXPL
- 5000
+ 4000
-
-
-
+
+
+
1
HeavyFight
3
- 1.5
+ 1
false
10
@@ -230,11 +230,11 @@
ERPPCImpactDist1
WEP_EXPL
- 5000
+ 4000
10
HeavyFight
3
- 2
+ 1
false
50
@@ -249,11 +249,11 @@
ERPPCImpactDist2
WEP_EXPL
- 5000
+ 4000
10
HeavyFight
3
- 2
+ 1
false
50
@@ -268,11 +268,11 @@
ERPPCImpactDist3
WEP_EXPL
- 5000
+ 4000
10
HeavyFight
3
- 1.5
+ 1
false
50
diff --git a/Weapon Mods/REEECore/Data/Scripts/CoreParts/ERPPC.cs b/Weapon Mods/REEECore/Data/Scripts/CoreParts/ERPPC.cs
index 07c589d84..648c2cc4e 100644
--- a/Weapon Mods/REEECore/Data/Scripts/CoreParts/ERPPC.cs
+++ b/Weapon Mods/REEECore/Data/Scripts/CoreParts/ERPPC.cs
@@ -49,7 +49,7 @@ partial class Parts {
LockedSmartOnly = false, // Only fire at smart projectiles that are locked on to parent grid.
MinimumDiameter = 0, // Minimum radius of threat to engage.
MaximumDiameter = 0, // Maximum radius of threat to engage; 0 = unlimited.
- MaxTargetDistance = 8000, // Maximum distance at which targets will be automatically shot at; 0 = unlimited.
+ MaxTargetDistance = 7000, // Maximum distance at which targets will be automatically shot at; 0 = unlimited.
MinTargetDistance = 0, // Minimum distance at which targets will be automatically shot at.
TopTargets = 4, // Maximum number of targets to randomize between; 0 = unlimited.
TopBlocks = 8, // Maximum number of blocks to randomize between; 0 = unlimited.
@@ -151,12 +151,12 @@ partial class Parts {
BarrelsPerShot = 1, // How many muzzles will fire a projectile per fire event.
TrajectilesPerBarrel = 1, // Number of projectiles per muzzle per fire event.
SkipBarrels = 0, // Number of muzzles to skip after each fire event.
- ReloadTime = 480, // Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
+ ReloadTime = 240, // Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
MagsToLoad = 1, // Number of physical magazines to consume on reload.
DelayUntilFire = 0, // How long the weapon waits before shooting after being told to fire. Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
- HeatPerShot = 30, // Heat generated per shot.
- MaxHeat = 50, // Max heat before weapon enters cooldown (70% of max heat).
- Cooldown = 0f, // Percentage of max heat to be under to start firing again after overheat; accepts 0 - 0.95
+ HeatPerShot = 50, // Heat generated per shot.
+ MaxHeat = 90, // Max heat before weapon enters cooldown (70% of max heat).
+ Cooldown = 10f, // Percentage of max heat to be under to start firing again after overheat; accepts 0 - 0.95
HeatSinkRate = 5, // Amount of heat lost per second.
DegradeRof = false, // Progressively lower rate of fire when over 80% heat threshold (80% of max heat).
ShotsInBurst = 1, // Use this if you don't want the weapon to fire an entire physical magazine in one go. Should not be more than your magazine capacity.
diff --git a/Weapon Mods/REEECore/Data/Scripts/CoreParts/ERPPC_ammo.cs b/Weapon Mods/REEECore/Data/Scripts/CoreParts/ERPPC_ammo.cs
index 6b1ae7a09..83de45c6d 100644
--- a/Weapon Mods/REEECore/Data/Scripts/CoreParts/ERPPC_ammo.cs
+++ b/Weapon Mods/REEECore/Data/Scripts/CoreParts/ERPPC_ammo.cs
@@ -34,7 +34,7 @@ partial class Parts
AmmoMagazine = "ERPPCAmmo", // SubtypeId of physical ammo magazine. Use "Energy" for weapons without physical ammo.
AmmoRound = "ERPPC Main", // Name of ammo in terminal, should be different for each ammo type used by the same weapon.
HybridRound = true, // Use both a physical ammo magazine and energy per shot.
- EnergyCost = 2f, // Scaler for energy per shot (EnergyCost * BaseDamage * (RateOfFire / 3600) * BarrelsPerShot * TrajectilesPerBarrel). Uses EffectStrength instead of BaseDamage if EWAR.
+ EnergyCost = 1.44f, // Scaler for energy per shot (EnergyCost * BaseDamage * (RateOfFire / 3600) * BarrelsPerShot * TrajectilesPerBarrel). Uses EffectStrength instead of BaseDamage if EWAR.
BaseDamage = 5000f, // Direct damage; one steel plate is worth 100.
Mass = 50f, // In kilograms; how much force the impact will apply to the target.
Health = 0, // How much damage the projectile can take from other projectiles (base of 1 per hit) before dying; 0 disables this and makes the projectile untargetable.
@@ -105,7 +105,7 @@ partial class Parts
// For the following modifier values: -1 = disabled (higher performance), 0 = no damage, 0.01f = 1% damage, 2 = 200% damage.
FallOff = new FallOffDef
{
- Distance = 3000f, // Distance at which damage begins falling off.
+ Distance = 4000f, // Distance at which damage begins falling off.
MinMultipler = 0.6f, // Value from 0.0001f to 1f where 0.1f would be a min damage of 10% of base damage.
},
Grids = new GridSizeDef
@@ -118,7 +118,7 @@ partial class Parts
Armor = -1f, // Multiplier for damage against all armor. This is multiplied with the specific armor type multiplier (light, heavy).
Light = -1f, // Multiplier for damage against light armor.
Heavy = -1f, // Multiplier for damage against heavy armor.
- NonArmor = 0.75f, // Multiplier for damage against every else.
+ NonArmor = -1f, // Multiplier for damage against every else.
},
Shields = new ShieldDef
{
@@ -173,7 +173,7 @@ partial class Parts
Enable = true,
Radius = 9f, // Radius of AOE effect, in meters.
Damage = 30000f,
- Depth = 3f, // Max depth of AOE effect, in meters. 0=disabled, and AOE effect will reach to a depth of the radius value
+ Depth = 4f, // Max depth of AOE effect, in meters. 0=disabled, and AOE effect will reach to a depth of the radius value
MaxAbsorb = 0f, // Soft cutoff for damage, except for pooled falloff. If pooled falloff, limits max damage per block.
Falloff = Linear, //.NoFalloff applies the same damage to all blocks in radius
//.Linear drops evenly by distance from center out to max radius
@@ -186,7 +186,7 @@ partial class Parts
MinArmingTime = 0, // In ticks, before the Ammo is allowed to explode, detonate or similar; This affects shrapnel spawning.
NoVisuals = false,
NoSound = false,
- ParticleScale = 0.33f,
+ ParticleScale = 0.3f,
CustomParticle = "Starcore_PPC_WarpField", // Particle SubtypeID, from your Particle SBC
CustomSound = "ERPPCImpact", // SubtypeID from your Audio SBC, not a filename
Shape = Diamond, // Round or Diamond shape. Diamond is more performance friendly.
@@ -204,7 +204,7 @@ partial class Parts
//FieldTime = 0, // 0 is disabled, a value causes the projectile to come to rest, spawn a field and remain for a time (Measured in game ticks, 60 = 1 second)
GravityMultiplier = 1f, // Gravity multiplier, influences the trajectory of the projectile, value greater than 0 to enable. Natural Gravity Only.
SpeedVariance = Random(start: 0, end: 0), // subtracts value from DesiredSpeed. Be warned, you can make your projectile go backwards.
- RangeVariance = Random(start: 0, end: 0), // subtracts value from MaxTrajectory
+ RangeVariance = Random(start: 800, end: 900), //hehehe //subtracts value from MaxTrajectory
MaxTrajectoryTime = 0, // How long the weapon must fire before it reaches MaxTrajectory.
},
diff --git a/Weapon Mods/Starcore_Serpent_Arms_Heavy_Metal/Data/Scripts/CoreParts/Charon.cs b/Weapon Mods/Starcore_Serpent_Arms_Heavy_Metal/Data/Scripts/CoreParts/Charon.cs
index 3a9db9986..67801cacd 100644
--- a/Weapon Mods/Starcore_Serpent_Arms_Heavy_Metal/Data/Scripts/CoreParts/Charon.cs
+++ b/Weapon Mods/Starcore_Serpent_Arms_Heavy_Metal/Data/Scripts/CoreParts/Charon.cs
@@ -44,7 +44,7 @@ partial class Parts {
Grids, Neutrals, // Types of threat to engage: Grids, Projectiles, Characters, Meteors, Neutrals
},
SubSystems = new[] {
- Offense, Utility, Power, Production, Thrust, Jumping, Steering, Any, // Subsystem targeting priority: Offense, Utility, Power, Production, Thrust, Jumping, Steering, Any
+ Offense, Utility, Thrust, Power, Production, Jumping, Steering, Any, // Subsystem targeting priority: Offense, Utility, Power, Production, Thrust, Jumping, Steering, Any
},
ClosestFirst = false, // Tries to pick closest targets first (blocks on grids, projectiles, etc...).
IgnoreDumbProjectiles = false, // Don't fire at non-smart projectiles.
@@ -53,12 +53,12 @@ partial class Parts {
MaximumDiameter = 0, // Maximum radius of threat to engage; 0 = unlimited.
MaxTargetDistance = 2750f, // Maximum distance at which targets will be automatically shot at; 0 = unlimited.
MinTargetDistance = 0, // Minimum distance at which targets will be automatically shot at.
- TopTargets = 8, // Maximum number of targets to randomize between; 0 = unlimited.
- TopBlocks = 16, // Maximum number of blocks to randomize between; 0 = unlimited.
- CycleBlocks = 3, // Number of blocks to "cycle" per acquire attempt.
+ TopTargets = 4, // Maximum number of targets to randomize between; 0 = unlimited.
+ TopBlocks = 8, // Maximum number of blocks to randomize between; 0 = unlimited.
+ CycleBlocks = 0, // Number of blocks to "cycle" per acquire attempt.
StopTrackingSpeed = 0, // Do not track threats traveling faster than this speed; 0 = unlimited.
UniqueTargetPerWeapon = false, // only applies to multi-weapon blocks
- MaxTrackingTime = 180, // After this time has been reached the weapon will stop tracking existing target and scan for a new one
+ MaxTrackingTime = 0, // After this time has been reached the weapon will stop tracking existing target and scan for a new one
ShootBlanks = false, // Do not generate projectiles when shooting
FocusOnly = false, // This weapon can only track focus targets.
EvictUniqueTargets = false, // if this is set it will evict any weapons set to UniqueTargetPerWeapon unless they to have this set
@@ -68,7 +68,7 @@ partial class Parts {
PartName = "Charon", // Name of the weapon in terminal, should be unique for each weapon definition that shares a SubtypeId (i.e. multiweapons).
DeviateShotAngle = 0.50f, // Projectile inaccuracy in degrees.
AimingTolerance = 5f, // How many degrees off target a turret can fire at. 0 - 180 firing angle.
- AimLeadingPrediction = Basic, // Level of turret aim prediction; Off, Basic, Accurate, Advanced
+ AimLeadingPrediction = Accurate, // Level of turret aim prediction; Off, Basic, Accurate, Advanced
DelayCeaseFire = 0, // Measured in game ticks (6 = 100ms, 60 = 1 second, etc..). Length of time the weapon continues firing after trigger is released.
AddToleranceToTracking = false, // Allows turret to track to the edge of the AimingTolerance cone instead of dead centre.
CanShootSubmerged = false, // Whether the weapon can be fired underwater when using WaterMod.
@@ -101,7 +101,7 @@ partial class Parts {
HomeAzimuth = 0, // Default resting rotation angle
HomeElevation = 0, // Default resting elevation
InventorySize = 1f, // Inventory capacity in kL.
- IdlePower = 150f, // Constant base power draw in MW.
+ IdlePower = 50f, // Constant base power draw in MW.
FixedOffset = false, // Deprecated.
Offset = Vector(x: 0, y: 0, z: 0), // Offsets the aiming/firing line of the weapon, in metres.
Type = BlockWeapon, // What type of weapon this is; BlockWeapon, HandWeapon, Phantom
@@ -135,13 +135,13 @@ partial class Parts {
MagsToLoad = 1, // Number of physical magazines to consume on reload.
DelayUntilFire = 90, // How long the weapon waits before shooting after being told to fire. Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
HeatPerShot = 2, // Heat generated per shot.
- MaxHeat = 480, // Max heat before weapon enters cooldown (70% of max heat).
+ MaxHeat = 240, // Max heat before weapon enters cooldown (70% of max heat).
Cooldown = 0f, // Percentage of max heat to be under to start firing again after overheat; accepts 0 - 0.95
- HeatSinkRate = 8, // Amount of heat lost per second.
+ HeatSinkRate = 14, // Amount of heat lost per second.
DegradeRof = false, // Progressively lower rate of fire when over 80% heat threshold (80% of max heat).
ShotsInBurst = 0, // Use this if you don't want the weapon to fire an entire physical magazine in one go. Should not be more than your magazine capacity.
DelayAfterBurst = 0, // How long to spend "reloading" after each burst. Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
- FireFull = false, // Whether the weapon should fire the full magazine (or the full burst instead if ShotsInBurst > 0), even if the target is lost or the player stops firing prematurely.
+ FireFull = false, //probably should be set to true //Whether the weapon should fire the full magazine (or the full burst instead if ShotsInBurst > 0), even if the target is lost or the player stops firing prematurely.
GiveUpAfter = false, // Whether the weapon should drop its current target and reacquire a new target after finishing its magazine or burst.
BarrelSpinRate = 0, // Visual only, 0 disables and uses RateOfFire.
DeterministicSpin = false, // Spin barrel position will always be relative to initial / starting positions (spin will not be as smooth).
diff --git a/Weapon Mods/Starcore_Serpent_Arms_Heavy_Metal/Data/Scripts/CoreParts/Charon_Ammo.cs b/Weapon Mods/Starcore_Serpent_Arms_Heavy_Metal/Data/Scripts/CoreParts/Charon_Ammo.cs
index 37e4349c1..402813dec 100644
--- a/Weapon Mods/Starcore_Serpent_Arms_Heavy_Metal/Data/Scripts/CoreParts/Charon_Ammo.cs
+++ b/Weapon Mods/Starcore_Serpent_Arms_Heavy_Metal/Data/Scripts/CoreParts/Charon_Ammo.cs
@@ -44,7 +44,7 @@ partial class Parts
AmmoMagazine = "K_GaussPrototypeBlitzCase", // SubtypeId of physical ammo magazine. Use "Energy" for weapons without physical ammo.
AmmoRound = "Charon_Shot", // Name of ammo in terminal, should be different for each ammo type used by the same weapon. Is used by Shrapnel.
HybridRound = true, // Use both a physical ammo magazine and energy per shot.
- EnergyCost = 0.063f, // ~600MW / Scaler for energy per shot (EnergyCost * BaseDamage * (RateOfFire / 3600) * BarrelsPerShot * TrajectilesPerBarrel). Uses EffectStrength instead of BaseDamage if EWAR.
+ EnergyCost = 0.0315f, // ~300MW / Scaler for energy per shot (EnergyCost * BaseDamage * (RateOfFire / 3600) * BarrelsPerShot * TrajectilesPerBarrel). Uses EffectStrength instead of BaseDamage if EWAR.
BaseDamage = 33000f, // Direct damage; one steel plate is worth 100.
Mass = 15f, // In kilograms; how much force the impact will apply to the target.
Health = 0, // How much damage the projectile can take from other projectiles (base of 1 per hit) before dying; 0 disables this and makes the projectile untargetable.
@@ -116,8 +116,8 @@ partial class Parts
// For the following modifier values: -1 = disabled (higher performance), 0 = no damage, 0.01f = 1% damage, 2 = 200% damage.
FallOff = new FallOffDef
{
- Distance = 2000f, // Distance at which damage begins falling off.
- MinMultipler = 0.5f, // Value from 0.0001f to 1f where 0.1f would be a min damage of 10% of base damage.
+ Distance = 0f, // Distance at which damage begins falling off.
+ MinMultipler = 1f, // Value from 0.0001f to 1f where 0.1f would be a min damage of 10% of base damage.
},
Grids = new GridSizeDef
{
diff --git a/Weapon Mods/Starcore_Serpent_Arms_Heavy_Metal/Data/Scripts/CoreParts/Hydra_12GA_Ammo.cs b/Weapon Mods/Starcore_Serpent_Arms_Heavy_Metal/Data/Scripts/CoreParts/Hydra_12GA_Ammo.cs
index e3f4eff23..ac541e10e 100644
--- a/Weapon Mods/Starcore_Serpent_Arms_Heavy_Metal/Data/Scripts/CoreParts/Hydra_12GA_Ammo.cs
+++ b/Weapon Mods/Starcore_Serpent_Arms_Heavy_Metal/Data/Scripts/CoreParts/Hydra_12GA_Ammo.cs
@@ -693,7 +693,7 @@ partial class Parts
},
AmmoGraphics = new GraphicDef
{
- ModelName = "K_SA_GaussProjectile", // Model Path goes here. "\\Models\\Ammo\\Starcore_Arrow_Missile_Large"
+ ModelName = "", // Model Path goes here. "\\Models\\Ammo\\Starcore_Arrow_Missile_Large"
VisualProbability = 1f, // %
ShieldHitDraw = false,
Particles = new AmmoParticleDef
@@ -709,7 +709,7 @@ partial class Parts
},
Hit = new ParticleDef
{
- Name = "K_SA_GaussFire",
+ Name = "",
ApplyToShield = true,
Offset = Vector(x: 0, y: 0, z: 0),
Extras = new ParticleOptionDef
diff --git a/Weapon Mods/TIOStarcore/Data/SBC CubeBlocks/GoalkeeperFlakwallCubeblock.sbc b/Weapon Mods/TIOStarcore/Data/SBC CubeBlocks/GoalkeeperFlakwallCubeblock.sbc
index a8215e0fd..028154c48 100644
--- a/Weapon Mods/TIOStarcore/Data/SBC CubeBlocks/GoalkeeperFlakwallCubeblock.sbc
+++ b/Weapon Mods/TIOStarcore/Data/SBC CubeBlocks/GoalkeeperFlakwallCubeblock.sbc
@@ -9,8 +9,8 @@
[FLAW] Goalkeeper Casemate Flak Battery
- [1600 Targeting Range]
- [1200 Flak Range]
+ [2000m Targeting Range]
+ [1200m Flak Range]
[Clouds of small pre-cast fragments are lethal to missiles, biologicals, below average sized meteors, and small grids.]
[Targets Missiles, deals 160 AMS Damage Per Second]
@@ -19,8 +19,8 @@
Large
true
TriangleMesh
-
-
+
+
Models\HSR\K_HSR_Damnation_Large.mwm
diff --git a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Fixed Guns/FixedgunRLXammo.cs b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Fixed Guns/FixedgunRLXammo.cs
index 0553e31a5..84615e511 100644
--- a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Fixed Guns/FixedgunRLXammo.cs
+++ b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Fixed Guns/FixedgunRLXammo.cs
@@ -47,8 +47,8 @@ partial class Parts
EnergyCost = 0.017f, //195 Scaler for energy per shot (EnergyCost * BaseDamage * (RateOfFire / 3600) * BarrelsPerShot * TrajectilesPerBarrel). Uses EffectStrength instead of BaseDamage if EWAR.
BaseDamage = 10000f, // Direct damage; one steel plate is worth 100.
Mass = 500f, // In kilograms; how much force the impact will apply to the target.
- Health = 12, // How much damage the projectile can take from other projectiles (base of 1 per hit) before dying; 0 disables this and makes the projectile untargetable.
- BackKickForce = 7771000f, // Recoil. This is applied to the Parent Grid.
+ Health = 50, // How much damage the projectile can take from other projectiles (base of 1 per hit) before dying; 0 disables this and makes the projectile untargetable.
+ BackKickForce = 5777100f, // Recoil. This is applied to the Parent Grid.
DecayPerShot = 0f, // Damage to the firing weapon itself.
//float.MaxValue will drop the weapon to the first build state and destroy all components used for construction
//If greater than cube integrity it will remove the cube upon firing, without causing deformation (makes it look like the whole "block" flew away)
@@ -539,7 +539,7 @@ partial class Parts
},
Shields = new ShieldDef
{
- Modifier = 4f, // Multiplier for damage against shields.
+ Modifier = 6f, // Multiplier for damage against shields.
Type = Default, // Damage vs healing against shields; Default, Heal
BypassModifier = -1.3f, // If greater than zero, the percentage of damage that will penetrate the shield.
},
diff --git a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Fixed Guns/LBX_ammo.cs b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Fixed Guns/LBX_ammo.cs
index 3b2b42d11..9bb782e1d 100644
--- a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Fixed Guns/LBX_ammo.cs
+++ b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Fixed Guns/LBX_ammo.cs
@@ -1939,7 +1939,7 @@ partial class Parts
Fragment = new FragmentDef // Formerly known as Shrapnel. Spawns specified ammo fragments on projectile death (via hit or detonation).
{
AmmoRound = "LBXCluster_Fragment", // AmmoRound field of the ammo to spawn.
- Fragments = 4, // Number of projectiles to spawn.
+ Fragments = 6, // Number of projectiles to spawn.
Degrees = 9f, // Cone in which to randomize direction of spawned projectiles.
Reverse = false, // Spawn projectiles backward instead of forward.
DropVelocity = true, // fragments will not inherit velocity from parent.
@@ -1959,8 +1959,8 @@ partial class Parts
PointAtTarget = false, // Start fragment direction pointing at Target
PointType = Lead, // Point accuracy, Direct (straight forward), Lead (always fire), Predict (only fire if it can hit)
DirectAimCone = 15f, //Aim cone used for Direct fire, in degrees
- GroupSize = 4, // Number of spawns in each group
- GroupDelay = 4, //5 Delay between each group.
+ GroupSize = 6, // Number of spawns in each group
+ GroupDelay = 3, //5 Delay between each group.
},
},
Pattern = new PatternDef
diff --git a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Flak MachineGuns LightCannons/GoalieAmmotypes.cs b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Flak MachineGuns LightCannons/GoalieAmmotypes.cs
index aa44fa4c4..09734263e 100644
--- a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Flak MachineGuns LightCannons/GoalieAmmotypes.cs
+++ b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Flak MachineGuns LightCannons/GoalieAmmotypes.cs
@@ -239,7 +239,7 @@ partial class Parts
WidthVariance = Random(start: 0f, end: 0f), // adds random value to default width (negatives shrinks width)
Tracer = new TracerBaseDef
{
- Enable = false, //doesn't need to be true I think. thanks darth for the tip.
+ Enable = true, //doesn't need to be true I think. thanks darth for the tip.
Length = 10f, //
Width = 1f, //
Color = Color(red: 0f, green: 0f, blue: 0f, alpha: 0f), // RBG 255 is Neon Glowing, 100 is Quite Bright.
@@ -489,7 +489,7 @@ partial class Parts
WidthVariance = Random(start: 0f, end: 0f), // adds random value to default width (negatives shrinks width)
Tracer = new TracerBaseDef
{
- Enable = false,
+ Enable = true,
Length = 10f, //
Width = 1f, //
Color = Color(red: 0f, green: 0f, blue: 0f, alpha: 0f), // RBG 255 is Neon Glowing, 100 is Quite Bright.
@@ -723,7 +723,7 @@ partial class Parts
WidthVariance = Random(start: 0f, end: 0f), // adds random value to default width (negatives shrinks width)
Tracer = new TracerBaseDef
{
- Enable = false,
+ Enable = true,
Length = 10f, //
Width = 1f, //
Color = Color(red: 0f, green: 0f, blue: 0f, alpha: 0f), // RBG 255 is Neon Glowing, 100 is Quite Bright.
@@ -971,7 +971,7 @@ partial class Parts
WidthVariance = Random(start: 0f, end: 0f), // adds random value to default width (negatives shrinks width)
Tracer = new TracerBaseDef
{
- Enable = false,
+ Enable = true,
Length = 10f, //
Width = 1f, //
Color = Color(red: 0f, green: 0f, blue: 0f, alpha: 0f), // RBG 255 is Neon Glowing, 100 is Quite Bright.
@@ -1163,7 +1163,7 @@ partial class Parts
WidthVariance = Random(start: 0f, end: 0f), // adds random value to default width (negatives shrinks width)
Tracer = new TracerBaseDef
{
- Enable = false,
+ Enable = true,
Length = 0.001f, //
Width = 1f, //
Color = Color(red: 1f, green: 1f, blue: 0f, alpha: 0f), // RBG 255 is Neon Glowing, 100 is Quite Bright.
diff --git a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Flak MachineGuns LightCannons/GoalieMultiTurretParts.cs b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Flak MachineGuns LightCannons/GoalieMultiTurretParts.cs
index 7ff0c5ae1..398761d1b 100644
--- a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Flak MachineGuns LightCannons/GoalieMultiTurretParts.cs
+++ b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Flak MachineGuns LightCannons/GoalieMultiTurretParts.cs
@@ -53,7 +53,7 @@ partial class Parts {
Projectiles, Meteors, Neutrals, // Types of threat to engage: Grids, Projectiles, Characters, Meteors, Neutrals
},
SubSystems = new[] {
- Offense, Thrust, Utility, Power, Production, Any, // Subsystem targeting priority: Offense, Utility, Power, Production, Thrust, Jumping, Steering, Any
+ Any, // Subsystem targeting priority: Offense, Utility, Power, Production, Thrust, Jumping, Steering, Any
},
ClosestFirst = false, // Tries to pick closest targets first (blocks on grids, projectiles, etc...).
IgnoreDumbProjectiles = false, // Don't fire at non-smart projectiles.
@@ -147,7 +147,7 @@ partial class Parts {
},
Other = new OtherDef
{
- ConstructPartCap = 0, // Maximum number of blocks with this weapon on a grid; 0 = unlimited.
+ ConstructPartCap = 4, // Maximum number of blocks with this weapon on a grid; 0 = unlimited.
RotateBarrelAxis = 0, // For spinning barrels, which axis to spin the barrel around; 0 = none.
EnergyPriority = 0, // Deprecated.
MuzzleCheck = false, // Whether the weapon should check LOS from each individual muzzle in addition to the scope.
@@ -266,7 +266,7 @@ partial class Parts {
Projectiles, Meteors, Neutrals,// Types of threat to engage: Grids, Projectiles, Characters, Meteors, Neutrals
},
SubSystems = new[] {
- Offense, Thrust, Utility, Power, Production, Any, // Subsystem targeting priority: Offense, Utility, Power, Production, Thrust, Jumping, Steering, Any
+ Any, // Subsystem targeting priority: Offense, Utility, Power, Production, Thrust, Jumping, Steering, Any
},
ClosestFirst = false, // Tries to pick closest targets first (blocks on grids, projectiles, etc...).
IgnoreDumbProjectiles = false, // Don't fire at non-smart projectiles.
@@ -387,7 +387,7 @@ partial class Parts {
DegradeRof = false, // Progressively lower rate of fire when over 80% heat threshold (80% of max heat).
ShotsInBurst = 2, // Use this if you don't want the weapon to fire an entire physical magazine in one go. Should not be more than your magazine capacity.
DelayAfterBurst = 29, // How long to spend "reloading" after each burst. Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
- FireFull = true, // Whether the weapon should fire the full magazine (or the full burst instead if ShotsInBurst > 0), even if the target is lost or the player stops firing prematurely.
+ FireFull = true, //doesnt work currently because of the burst needed for the cadence //Whether the weapon should fire the full magazine (or the full burst instead if ShotsInBurst > 0), even if the target is lost or the player stops firing prematurely.
GiveUpAfter = false, // Whether the weapon should drop its current target and reacquire a new target after finishing its magazine or burst.
BarrelSpinRate = 0, // Visual only, 0 disables and uses RateOfFire.
DeterministicSpin = false, // Spin barrel position will always be relative to initial / starting positions (spin will not be as smooth).
@@ -480,7 +480,7 @@ partial class Parts {
Projectiles, Meteors, Neutrals,// Types of threat to engage: Grids, Projectiles, Characters, Meteors, Neutrals
},
SubSystems = new[] {
- Offense, Thrust, Utility, Power, Production, Any, // Subsystem targeting priority: Offense, Utility, Power, Production, Thrust, Jumping, Steering, Any
+ Any, // Subsystem targeting priority: Offense, Utility, Power, Production, Thrust, Jumping, Steering, Any
},
ClosestFirst = false, // Tries to pick closest targets first (blocks on grids, projectiles, etc...).
IgnoreDumbProjectiles = false, // Don't fire at non-smart projectiles.
diff --git a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Magnetic Weapons/ReaverWeaponParts.cs b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Magnetic Weapons/ReaverWeaponParts.cs
index 9758d29f4..6a99203c9 100644
--- a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Magnetic Weapons/ReaverWeaponParts.cs
+++ b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Magnetic Weapons/ReaverWeaponParts.cs
@@ -127,7 +127,7 @@ partial class Parts {
HomeAzimuth = 0, // Default resting rotation angle
HomeElevation = 0, // Default resting elevation
InventorySize = 1f, // Inventory capacity in kL.
- IdlePower = 0.001f, //fix for animation??? Constant base power draw in MW.
+ IdlePower = 0f, //fix for animation??? Constant base power draw in MW.
FixedOffset = false, // Deprecated.
Offset = Vector(x: 0, y: 0, z: 0), // Offsets the aiming/firing line of the weapon, in metres.
Type = BlockWeapon, // What type of weapon this is; BlockWeapon, HandWeapon, Phantom
@@ -159,7 +159,7 @@ partial class Parts {
BarrelsPerShot = 2, // How many muzzles will fire a projectile per fire event.
TrajectilesPerBarrel = 1, // Number of projectiles per muzzle per fire event.
SkipBarrels = 0, // Number of muzzles to skip after each fire event.
- ReloadTime = 600, // Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
+ ReloadTime = 300, // Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
MagsToLoad = 1, //20 Number of physical magazines to consume on reload.
DelayUntilFire = 0, // How long the weapon waits before shooting after being told to fire. Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
HeatPerShot = 1, // Heat generated per shot.
@@ -343,7 +343,7 @@ partial class Parts {
HomeAzimuth = 0, // Default resting rotation angle
HomeElevation = 0, // Default resting elevation
InventorySize = 1f, // Inventory capacity in kL.
- IdlePower = 0.0001f, // Constant base power draw in MW.
+ IdlePower = 0f, // Constant base power draw in MW.
FixedOffset = false, // Deprecated.
Offset = Vector(x: 0, y: 0, z: 0), // Offsets the aiming/firing line of the weapon, in metres.
Type = BlockWeapon, // What type of weapon this is; BlockWeapon, HandWeapon, Phantom
@@ -375,7 +375,7 @@ partial class Parts {
BarrelsPerShot = 2, // How many muzzles will fire a projectile per fire event.
TrajectilesPerBarrel = 1, // Number of projectiles per muzzle per fire event.
SkipBarrels = 0, // Number of muzzles to skip after each fire event.
- ReloadTime = 600, // Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
+ ReloadTime = 300, // Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
MagsToLoad = 1, //20 Number of physical magazines to consume on reload.
DelayUntilFire = 0, // How long the weapon waits before shooting after being told to fire. Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
HeatPerShot = 1, // Heat generated per shot.
diff --git a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Plasma Weapons/X-4PlasAmmo.cs b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Plasma Weapons/X-4PlasAmmo.cs
index d42e3b61a..1ee6a1ef0 100644
--- a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Plasma Weapons/X-4PlasAmmo.cs
+++ b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/Plasma Weapons/X-4PlasAmmo.cs
@@ -42,7 +42,7 @@ partial class Parts
AmmoMagazine = "PlasAmmo", // SubtypeId of physical ammo magazine. Use "Energy" for weapons without physical ammo.
AmmoRound = "Plasma-X", // Name of ammo in terminal, should be different for each ammo type used by the same weapon.
HybridRound = true, // Use both a physical ammo magazine and energy per shot.
- EnergyCost = 0.823f, //120MW@0.823 //58MW@0.4 // Scaler for energy per shot (EnergyCost * BaseDamage * (RateOfFire / 3600) * BarrelsPerShot * TrajectilesPerBarrel). Uses EffectStrength instead of BaseDamage if EWAR.
+ EnergyCost = 0.4f, //120MW@0.823 //58MW@0.4 // Scaler for energy per shot (EnergyCost * BaseDamage * (RateOfFire / 3600) * BarrelsPerShot * TrajectilesPerBarrel). Uses EffectStrength instead of BaseDamage if EWAR.
BaseDamage = 5000f, // Direct damage; one steel plate is worth 100.
Mass = 100f, // In kilograms; how much force the impact will apply to the target.
Health = 0, // How much damage the projectile can take from other projectiles (base of 1 per hit) before dying; 0 disables this and makes the projectile untargetable.
diff --git a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/TypeCannons/Standard_Type_HE_Ammo.cs b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/TypeCannons/Standard_Type_HE_Ammo.cs
index 28f74ded6..040a54e83 100644
--- a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/TypeCannons/Standard_Type_HE_Ammo.cs
+++ b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/TypeCannons/Standard_Type_HE_Ammo.cs
@@ -127,13 +127,13 @@ partial class Parts
Armor = new ArmorDef
{
Armor = -1f, // Multiplier for damage against all armor. This is multiplied with the specific armor type multiplier (light, heavy).
- Light = 0.7f, // Multiplier for damage against light armor.
+ Light = -1f, // Multiplier for damage against light armor.
Heavy = -1f, // Multiplier for damage against heavy armor.
- NonArmor = 0.30f, // Multiplier for damage against every else.
+ NonArmor = 0.4f, // Multiplier for damage against every else.
},
Shields = new ShieldDef
{
- Modifier = 2.1f, // Multiplier for damage against shields.
+ Modifier = 2.5f, // Multiplier for damage against shields.
Type = Default, // Damage vs healing against shields; Default, Heal
BypassModifier = -1.25f, // If greater than zero, the percentage of damage that will penetrate the shield.
},
@@ -184,7 +184,7 @@ partial class Parts
{
Enable = true,
Radius = 11.25f, // Meters
- Damage = 10000f,
+ Damage = 12500f,
Depth = 3.1f,
MaxAbsorb = 0f,
Falloff = Curve, //.NoFalloff applies the same damage to all blocks in radius
diff --git a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/TypeCannons/Type18 Heavy Turret.cs b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/TypeCannons/Type18 Heavy Turret.cs
index 896921a11..b61a304c5 100644
--- a/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/TypeCannons/Type18 Heavy Turret.cs
+++ b/Weapon Mods/TIOStarcore/Data/Scripts/CoreParts/TypeCannons/Type18 Heavy Turret.cs
@@ -125,7 +125,7 @@ partial class Parts {
BarrelsPerShot = 1, // How many muzzles will fire a projectile per fire event.
TrajectilesPerBarrel = 1, // Number of projectiles per muzzle per fire event.
SkipBarrels = 0, // Number of muzzles to skip after each fire event.
- ReloadTime = 1200, //20 seconds //Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
+ ReloadTime = 360, //20 seconds //Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
MagsToLoad = 8, // Number of physical magazines to consume on reload.
DelayUntilFire = 45, // How long the weapon waits before shooting after being told to fire. Measured in game ticks (6 = 100ms, 60 = 1 seconds, etc..).
HeatPerShot = 10, // Heat generated per shot.