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.