From 7e41d22d605336dd1f2b3e38bde32d8ed2e4ee32 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Sat, 2 Feb 2019 18:17:50 +0100 Subject: [PATCH] sat dock functionality, gunbase for carl gustav, replaced mirv missile --- assets/hbm/lang/de_DE.lang | 8 +- assets/hbm/lang/en_US.lang | 8 +- assets/hbm/models/minerRocket.obj | 406 ++++++++++++++++++ assets/hbm/textures/blocks/sat_dock.png | Bin 0 -> 212 bytes .../items/missile_nuclear_cluster.png | Bin 300 -> 335 bytes assets/hbm/textures/items/sat_miner.png | Bin 0 -> 309 bytes assets/hbm/textures/items/warhead_mirv.png | Bin 256 -> 261 bytes assets/hbm/textures/items/warhead_nuclear.png | Bin 276 -> 264 bytes assets/hbm/textures/models/CapeNostalgia.png | Bin 0 -> 38250 bytes assets/hbm/textures/models/minerRocket.png | Bin 0 -> 3430 bytes com/hbm/blocks/ModBlocks.java | 6 +- com/hbm/blocks/bomb/BlockTaint.java | 2 - com/hbm/blocks/bomb/LaunchPad.java | 2 +- com/hbm/blocks/machine/MachineSatDock.java | 78 ++++ com/hbm/blocks/test/TestEventTester.java | 12 +- com/hbm/entity/missile/EntityCarrier.java | 2 + com/hbm/entity/missile/EntityMinerRocket.java | 96 +++++ com/hbm/entity/missile/EntityMissileMirv.java | 14 +- .../entity/projectile/EntityBulletBase.java | 17 +- com/hbm/handler/BulletConfigFactory.java | 143 +++++- com/hbm/handler/BulletConfigSyncingUtil.java | 26 +- com/hbm/handler/BulletConfiguration.java | 1 + com/hbm/handler/GUIHandler.java | 18 + com/hbm/handler/GunConfigFactory.java | 34 +- com/hbm/handler/GunConfiguration.java | 5 + com/hbm/inventory/MachineRecipes.java | 28 +- .../inventory/container/ContainerSatDock.java | 98 +++++ com/hbm/inventory/gui/GUISatDock.java | 55 +++ .../inventory/gui/GUIScreenSatInterface.java | 5 +- com/hbm/items/ModItems.java | 10 +- com/hbm/items/gear/ArmorModel.java | 11 +- com/hbm/items/tool/ItemAssemblyTemplate.java | 3 + com/hbm/items/weapon/ItemGunBase.java | 2 +- com/hbm/lib/HbmWorldGen.java | 10 + com/hbm/lib/Library.java | 1 + com/hbm/main/ClientProxy.java | 1 + com/hbm/main/CraftingManager.java | 2 + com/hbm/main/MainRegistry.java | 26 +- com/hbm/main/ModEventHandler.java | 14 +- com/hbm/main/ResourceManager.java | 4 +- com/hbm/packet/AuxButtonPacket.java | 4 - com/hbm/render/entity/RenderMinerRocket.java | 33 ++ com/hbm/render/entity/RenderMissileMirv.java | 4 +- .../tileentity/RenderLaunchPadTier1.java | 4 +- com/hbm/saveddata/RadiationSavedData.java | 2 - com/hbm/saveddata/SatelliteSaveStructure.java | 4 +- .../tileentity/bomb/TileEntityNukeN45.java | 2 +- .../TileEntityMachineReactorSmall.java | 2 +- .../machine/TileEntityMachineSatDock.java | 382 +++++++++++++++- 49 files changed, 1499 insertions(+), 86 deletions(-) create mode 100644 assets/hbm/models/minerRocket.obj create mode 100644 assets/hbm/textures/blocks/sat_dock.png create mode 100644 assets/hbm/textures/items/sat_miner.png create mode 100644 assets/hbm/textures/models/CapeNostalgia.png create mode 100644 assets/hbm/textures/models/minerRocket.png create mode 100644 com/hbm/entity/missile/EntityMinerRocket.java create mode 100644 com/hbm/inventory/container/ContainerSatDock.java create mode 100644 com/hbm/inventory/gui/GUISatDock.java create mode 100644 com/hbm/render/entity/RenderMinerRocket.java diff --git a/assets/hbm/lang/de_DE.lang b/assets/hbm/lang/de_DE.lang index e21b80de4..ac278810d 100644 --- a/assets/hbm/lang/de_DE.lang +++ b/assets/hbm/lang/de_DE.lang @@ -357,6 +357,8 @@ tile.machine_turbine.name=Dampfturbine container.machineTurbine=Dampfturbine tile.launch_pad.name=Raketenabschussrampe container.launchPad=Raketenabschussrampe +tile.sat_dock.name=Frachtlandeplattform +container.satDock=Frachtlandeplattform tile.book_guide.name=Hbm's Nuclear Tech Mod Handbuch [LEGACY] tile.machine_schrabidium_transmutator.name=Schrabidium-Transmutationsgerät container.machine_schrabidium_transmutator=Schrabidium-Transmutationsgerät @@ -1574,7 +1576,7 @@ item.missile_inferno.name=Inferno Missile G.R.N. Mk.II item.missile_rain.name=Schüttbombenregen item.missile_drill.name=Der Betonbrecher item.missile_nuclear.name=Atomrakete -item.missile_nuclear_cluster.name=Atomare MIRV-Rakete +item.missile_nuclear_cluster.name=H-Rakete item.missile_endo.name=Endothermische Rakete item.missile_exo.name=Exothermische Rakete item.missile_doomsday.name=Doomsday Rakete @@ -1591,6 +1593,7 @@ item.sat_radar.name=Radar-Überwachungssatellit item.sat_laser.name=Orbitaler Todesstrahl item.sat_foeq.name=PEAF - Mk.I FOEQ Dunasonde mit experimenter nuklearer Schubdüse item.sat_resonator.name=Xenium-Resonator-Satellit +item.sat_miner.name=Asteroiden-Förderschiff item.sat_chip.name=Satelliten-ID-Chip item.sat_interface.name=Satelliten-Kontrollinterface tile.sat_mapper.name=Oberflächen-Abtastungssatellit (Dekoblock) @@ -1662,7 +1665,7 @@ item.warhead_buster_medium.name=Mittlerer bunkerbrechender Sprengkopf item.warhead_buster_large.name=Großer bunkerbrechender Sprengkopf item.warhead_nuclear.name=Atomsprengkopf item.warhead_mirvlet.name=MIRV -item.warhead_mirv.name=Achtfacher MIRV-Sprengkopf +item.warhead_mirv.name=H-Gefechtskopf item.warhead_thermo_endo.name=Endothermischer Sprengkopf item.warhead_thermo_exo.name=Exothermischer Sprengkopf item.fuel_tank_small.name=Kleiner Treibstofftank @@ -1744,6 +1747,7 @@ item.cape_lpkukin.name=LPkukins Cape item.cape_vertice.name=Lord Vertices Cape item.cape_codered_.name=codered_s Cape item.cape_ayy.name=Ayys Cape +item.cape_nostalgia.name=DrNostalgias Cape tile.machine_converter_he_rf.name=HE zu RF Konverter tile.machine_converter_rf_he.name=RF zu HE Konverter diff --git a/assets/hbm/lang/en_US.lang b/assets/hbm/lang/en_US.lang index 8246cadd9..a5ecc252d 100644 --- a/assets/hbm/lang/en_US.lang +++ b/assets/hbm/lang/en_US.lang @@ -357,6 +357,8 @@ tile.machine_turbine.name=Steam Turbine container.machineTurbine=Steam Turbine tile.launch_pad.name=Missile Launch Pad container.launchPad=Missile Launch Pad +tile.sat_dock.name=Cargo Landing Pad +container.satDock=Cargo Landing Pad tile.book_guide.name=Hbm's Nuclear Tech Mod Manual [LEGACY] tile.machine_schrabidium_transmutator.name=Schrabidium Transmutation Device container.machine_schrabidium_transmutator=Schrabidium Transmutation Device @@ -1574,7 +1576,7 @@ item.missile_inferno.name=Inferno Missile G.R.N. Mk.II item.missile_rain.name=Bomblet Rain item.missile_drill.name=The Concrete Cracker item.missile_nuclear.name=Nuclear Missile -item.missile_nuclear_cluster.name=Nuclear MIRV Missile +item.missile_nuclear_cluster.name=Thermonuclear Missile item.missile_endo.name=Endothermic Missile item.missile_exo.name=Exothermic Missile item.missile_doomsday.name=Doomsday Missile @@ -1591,6 +1593,7 @@ item.sat_radar.name=Radar Survey Satellite item.sat_laser.name=Orbital Death Ray item.sat_foeq.name=PEAF - Mk.I FOEQ Duna Probe with experimental Nuclear Propulsion item.sat_resonator.name=Xenium Resonator Satellite +item.sat_miner.name=Asteroid Mining Ship item.sat_chip.name=Satellite ID-Chip item.sat_interface.name=Satellite Control Interface tile.sat_mapper.name=Surface Mapping Satellite (Deco Block) @@ -1662,7 +1665,7 @@ item.warhead_buster_medium.name=Medium Bunker Buster Warhead item.warhead_buster_large.name=Large Bunker Buster Warhead item.warhead_nuclear.name=Nuclear Warhead item.warhead_mirvlet.name=MIRV -item.warhead_mirv.name=Eightfold MIRV Warhead +item.warhead_mirv.name=Thermonuclear Warhead item.warhead_thermo_endo.name=Endothermic Warhead item.warhead_thermo_exo.name=Exothermic Warhead item.fuel_tank_small.name=Small Fuel Tank @@ -1744,6 +1747,7 @@ item.cape_lpkukin.name=LPkukin's Cape item.cape_vertice.name=Lord Vertice's Cape item.cape_codered_.name=codered_'s Cape item.cape_ayy.name=Ayy's Cape +item.cape_nostalgia.name=DrNostalgia's Cape tile.machine_converter_he_rf.name=HE to RF Converter tile.machine_converter_rf_he.name=RF to HE Converter diff --git a/assets/hbm/models/minerRocket.obj b/assets/hbm/models/minerRocket.obj new file mode 100644 index 000000000..50bcca439 --- /dev/null +++ b/assets/hbm/models/minerRocket.obj @@ -0,0 +1,406 @@ +# Blender v2.76 (sub 0) OBJ File: 'miner_rocket.blend' +# www.blender.org +o Cylinder +v 0.000000 0.375000 -0.500000 +v 0.000000 2.000000 -0.500000 +v 0.353553 0.375000 -0.353553 +v 0.353553 2.000000 -0.353553 +v 0.500000 0.375000 0.000000 +v 0.500000 2.000000 0.000000 +v 0.353553 0.375000 0.353553 +v 0.353553 2.000000 0.353553 +v -0.000000 0.375000 0.500000 +v -0.000000 2.000000 0.500000 +v -0.353553 0.375000 0.353553 +v -0.353553 2.000000 0.353553 +v -0.500000 0.375000 -0.000000 +v -0.500000 2.000000 -0.000000 +v -0.353553 0.375000 -0.353553 +v -0.353553 2.000000 -0.353553 +v -0.000000 0.375000 -0.250000 +v 0.176777 0.375000 -0.176777 +v 0.250000 0.375000 0.000000 +v 0.176777 0.375000 0.176777 +v -0.000000 0.375000 0.250000 +v -0.176777 0.375000 0.176777 +v -0.250000 0.375000 -0.000000 +v -0.176777 0.375000 -0.176777 +v 0.000000 0.250000 -0.375000 +v 0.265165 0.250000 -0.265165 +v 0.375000 0.250000 0.000000 +v 0.265165 0.250000 0.265165 +v 0.000000 0.250000 0.375000 +v -0.265165 0.250000 0.265165 +v -0.375000 0.250000 -0.000000 +v -0.265165 0.250000 -0.265165 +v 0.265165 2.500000 -0.265165 +v -0.000000 2.500000 -0.375000 +v 0.375000 2.500000 0.000000 +v 0.265165 2.500000 0.265165 +v -0.000000 2.500000 0.375000 +v -0.265165 2.500000 0.265165 +v -0.375000 2.500000 -0.000000 +v -0.265165 2.500000 -0.265165 +v -0.000000 2.750000 0.000000 +v 0.000000 0.000000 -0.468750 +v 0.331456 0.000000 -0.331456 +v 0.468750 0.000000 0.000000 +v 0.331456 0.000000 0.331456 +v 0.000000 0.000000 0.468750 +v -0.331456 0.000000 0.331456 +v -0.468750 0.000000 -0.000000 +v -0.331456 0.000000 -0.331456 +v 0.000000 0.000000 -0.304688 +v 0.215447 0.000000 -0.215447 +v 0.304688 0.000000 0.000000 +v 0.215447 0.000000 0.215447 +v 0.000000 0.000000 0.304688 +v -0.215447 0.000000 0.215447 +v -0.304687 0.000000 -0.000000 +v -0.215447 0.000000 -0.215447 +v 0.000000 0.250000 -0.152344 +v 0.107723 0.250000 -0.107723 +v 0.152344 0.250000 0.000000 +v 0.107723 0.250000 0.107723 +v 0.000000 0.250000 0.152344 +v -0.107723 0.250000 0.107723 +v -0.152344 0.250000 -0.000000 +v -0.107723 0.250000 -0.107723 +v 0.353553 0.500000 -0.353553 +v 0.353553 0.500000 0.353553 +v -0.353553 0.500000 0.353553 +v -0.353553 0.500000 -0.353553 +v 0.353553 1.000000 -0.353553 +v 0.353553 1.000000 0.353553 +v -0.353553 1.000000 0.353553 +v -0.353553 1.000000 -0.353553 +v 0.662913 0.750000 -0.662913 +v 0.662913 0.750000 0.662913 +v -0.662913 0.750000 0.662912 +v -0.662913 0.750000 -0.662912 +v 0.662913 0.500000 -0.662913 +v 0.662913 0.500000 0.662913 +v -0.662913 0.500000 0.662912 +v -0.662913 0.500000 -0.662912 +vt 0.490000 0.400000 +vt 0.410000 0.400000 +vt 0.410000 0.060000 +vt 0.330000 0.400000 +vt 0.330000 0.060000 +vt 0.250000 0.400000 +vt 0.250000 0.060000 +vt 0.170000 0.400000 +vt 0.170000 0.060000 +vt 0.090000 0.400000 +vt 0.090000 0.060000 +vt 0.010000 0.400000 +vt 0.010000 0.060000 +vt 0.650000 0.400000 +vt 0.640000 0.500000 +vt 0.580000 0.500000 +vt 0.570000 0.400000 +vt 0.490000 0.060000 +vt 0.570000 0.060000 +vt 0.270000 0.020000 +vt 0.310000 0.020000 +vt 0.343594 0.631484 +vt 0.365646 0.659507 +vt 0.312157 0.681663 +vt 0.030000 0.020000 +vt 0.070000 0.020000 +vt 0.190000 0.020000 +vt 0.230000 0.020000 +vt 0.650000 0.060000 +vt 0.590000 0.020000 +vt 0.350000 0.020000 +vt 0.390000 0.020000 +vt 0.110000 0.020000 +vt 0.150000 0.020000 +vt 0.510000 0.020000 +vt 0.550000 0.020000 +vt 0.430000 0.020000 +vt 0.470000 0.020000 +vt 0.223638 0.849765 +vt 0.251662 0.827713 +vt 0.273817 0.881202 +vt 0.477578 0.954950 +vt 0.441919 0.969721 +vt 0.419867 0.941698 +vt 0.561875 0.751440 +vt 0.533852 0.773492 +vt 0.511696 0.720003 +vt 0.238409 0.715781 +vt 0.273817 0.720003 +vt 0.251662 0.773492 +vt 0.343594 0.969721 +vt 0.307935 0.954950 +vt 0.312157 0.919542 +vt 0.547105 0.885424 +vt 0.511696 0.881202 +vt 0.533852 0.827713 +vt 0.477579 0.646255 +vt 0.473356 0.681663 +vt 0.419867 0.659507 +vt 0.240000 0.500000 +vt 0.210000 0.600000 +vt 0.180000 0.500000 +vt 0.400000 0.500000 +vt 0.340000 0.500000 +vt 0.160000 0.500000 +vt 0.560000 0.500000 +vt 0.500000 0.500000 +vt 0.480000 0.500000 +vt 0.320000 0.500000 +vt 0.260000 0.500000 +vt 0.080000 0.500000 +vt 0.020000 0.500000 +vt 0.530000 0.600000 +vt 0.370000 0.600000 +vt 0.610000 0.600000 +vt 0.130000 0.600000 +vt 0.100000 0.500000 +vt 0.290000 0.600000 +vt 0.450000 0.600000 +vt 0.420000 0.500000 +vt 0.050000 0.600000 +vt 0.459618 0.867464 +vt 0.487313 0.800603 +vt 0.325895 0.733741 +vt 0.349297 0.757143 +vt 0.331295 0.800603 +vt 0.459618 0.733741 +vt 0.392757 0.706046 +vt 0.298200 0.800603 +vt 0.325895 0.867464 +vt 0.473356 0.919542 +vt 0.392757 0.895159 +vt 0.890000 0.750000 +vt 0.820000 0.790000 +vt 0.800000 0.770000 +vt 0.349297 0.844063 +vt 0.392757 0.862064 +vt 0.436217 0.844063 +vt 0.454218 0.800603 +vt 0.436217 0.757143 +vt 0.392757 0.739141 +vt 0.820000 0.810000 +vt 0.780000 0.830000 +vt 0.760000 0.790000 +vt 0.690000 0.780000 +vt 0.760000 0.810000 +vt 0.770000 0.900000 +vt 0.800000 0.830000 +vt 0.890000 0.820000 +vt 0.810000 0.700000 +vt 0.780000 0.770000 +vt 0.740000 0.700000 +vt 0.740000 0.900000 +vt 0.690000 0.850000 +vt 0.890000 0.850000 +vt 0.840000 0.900000 +vt 0.770000 0.480000 +vt 0.880000 0.480000 +vt 0.880000 0.540000 +vt 0.770000 0.600000 +vt 0.307935 0.646255 +vt 0.630000 0.020000 +vt 0.238409 0.885424 +vt 0.547105 0.715781 +vt 0.223638 0.751440 +vt 0.365646 0.941698 +vt 0.561875 0.849765 +vt 0.441919 0.631484 +vt 0.840000 0.700000 +vt 0.690000 0.820000 +vt 0.810000 0.900000 +vt 0.890000 0.780000 +vt 0.770000 0.700000 +vt 0.690000 0.750000 +vn 0.382700 0.000000 -0.923900 +vn 0.923900 0.000000 -0.382700 +vn 0.923900 0.000000 0.382700 +vn 0.382700 0.000000 0.923900 +vn -0.382700 0.000000 0.923900 +vn -0.923900 0.000000 0.382700 +vn -0.900200 0.225000 -0.372900 +vn -0.382700 0.000000 -0.923900 +vn -0.923900 0.000000 -0.382700 +vn 0.000000 -1.000000 -0.000000 +vn -0.281100 0.678600 -0.678600 +vn -0.678600 0.678600 0.281100 +vn 0.281100 0.678600 0.678600 +vn 0.678600 0.678600 -0.281100 +vn -0.678600 0.678600 -0.281100 +vn -0.281100 0.678600 0.678600 +vn 0.678600 0.678600 0.281100 +vn 0.281100 0.678600 -0.678600 +vn 0.223900 0.810900 0.540600 +vn 0.900200 0.225000 -0.372900 +vn -0.372900 0.225000 0.900200 +vn -0.372900 0.225000 -0.900200 +vn 0.372900 0.225000 -0.900200 +vn 0.900200 0.225000 0.372900 +vn -0.900200 0.225000 0.372900 +vn 0.372900 0.225000 0.900200 +vn -0.223900 0.810900 -0.540600 +vn 0.540600 0.810900 -0.223900 +vn -0.540600 0.810900 -0.223900 +vn -0.223900 0.810900 0.540600 +vn 0.540600 0.810900 0.223900 +vn 0.223900 0.810900 -0.540600 +vn -0.540600 0.810900 0.223900 +vn 0.873000 0.327400 0.361600 +vn 0.361600 0.327400 -0.873000 +vn -0.361600 0.327400 -0.873000 +vn -0.873000 0.327400 0.361600 +vn 0.361600 0.327400 0.873000 +vn 0.873000 0.327400 -0.361600 +vn -0.873000 0.327400 -0.361600 +vn -0.361600 0.327400 0.873000 +vn -0.805100 -0.490600 0.333500 +vn 0.805100 -0.490600 0.333500 +vn 0.333500 -0.490600 -0.805100 +vn -0.805100 -0.490600 -0.333500 +vn -0.333500 -0.490600 0.805100 +vn 0.333500 -0.490600 0.805100 +vn 0.805100 -0.490600 -0.333500 +vn -0.333500 -0.490600 -0.805100 +vn 0.707100 0.000000 -0.707100 +vn 0.707100 0.000000 0.707100 +vn -0.707100 0.000000 0.707100 +vn -0.707100 0.000000 -0.707100 +s off +f 2/1/1 4/2/1 3/3/1 +f 4/2/2 6/4/2 5/5/2 +f 6/4/3 8/6/3 7/7/3 +f 8/6/4 10/8/4 9/9/4 +f 10/8/5 12/10/5 11/11/5 +f 12/10/6 14/12/6 13/13/6 +f 14/14/7 39/15/7 40/16/7 +f 16/17/8 2/1/8 1/18/8 +f 14/14/9 16/17/9 15/19/9 +f 7/7/10 20/20/10 19/21/10 +f 17/22/11 25/23/11 32/24/11 +f 13/13/10 23/25/10 22/26/10 +f 9/9/10 21/27/10 20/28/10 +f 13/29/10 15/19/10 24/30/10 +f 5/5/10 19/31/10 18/32/10 +f 11/11/10 22/33/10 21/34/10 +f 1/18/10 17/35/10 24/36/10 +f 3/3/10 18/37/10 17/38/10 +f 23/39/12 31/40/12 30/41/12 +f 20/42/13 21/43/13 29/44/13 +f 19/45/14 27/46/14 26/47/14 +f 24/48/15 32/49/15 31/50/15 +f 21/51/16 22/52/16 30/53/16 +f 20/54/17 28/55/17 27/56/17 +f 18/57/18 26/58/18 25/59/18 +f 36/60/19 41/61/19 37/62/19 +f 4/2/20 33/63/20 35/64/20 +f 12/10/21 10/8/21 37/65/21 +f 16/17/22 40/66/22 34/67/22 +f 4/2/23 2/1/23 34/68/23 +f 6/4/24 35/69/24 36/70/24 +f 12/10/25 38/71/25 39/72/25 +f 8/6/26 36/60/26 37/62/26 +f 40/66/27 41/73/27 34/67/27 +f 33/63/28 41/74/28 35/64/28 +f 39/15/29 41/75/29 40/16/29 +f 37/65/30 41/76/30 38/77/30 +f 35/69/31 41/78/31 36/70/31 +f 34/68/32 41/79/32 33/80/32 +f 39/72/33 38/71/33 41/81/33 +f 28/55/34 45/82/34 44/83/34 +f 49/84/10 57/85/10 56/86/10 +f 26/58/35 43/87/35 42/88/35 +f 25/23/36 42/88/36 49/84/36 +f 31/40/37 48/89/37 47/90/37 +f 28/91/38 29/44/38 46/92/38 +f 27/46/39 44/83/39 43/87/39 +f 31/50/40 32/49/40 49/84/40 +f 30/53/41 47/90/41 46/92/41 +f 52/93/42 60/94/42 59/95/42 +f 47/90/10 55/96/10 54/97/10 +f 45/82/10 53/98/10 52/99/10 +f 43/87/10 51/100/10 50/101/10 +f 49/84/10 42/88/10 50/101/10 +f 48/89/10 56/86/10 55/96/10 +f 46/92/10 54/97/10 53/98/10 +f 44/83/10 52/99/10 51/100/10 +f 61/102/10 63/103/10 65/104/10 +f 57/105/43 65/104/43 64/106/43 +f 55/107/44 63/103/44 62/108/44 +f 53/109/45 61/102/45 60/94/45 +f 51/110/46 59/95/46 58/111/46 +f 50/112/47 58/111/47 65/104/47 +f 55/113/48 56/114/48 64/106/48 +f 53/115/49 54/116/49 62/108/49 +f 69/117/50 81/118/50 77/119/50 +f 74/119/51 70/120/51 66/117/51 +f 75/119/52 71/120/52 67/117/52 +f 68/117/53 80/118/53 76/119/53 +f 1/18/1 2/1/1 3/3/1 +f 3/3/2 4/2/2 5/5/2 +f 5/5/3 6/4/3 7/7/3 +f 7/7/4 8/6/4 9/9/4 +f 9/9/5 10/8/5 11/11/5 +f 11/11/6 12/10/6 13/13/6 +f 16/17/7 14/14/7 40/16/7 +f 15/19/8 16/17/8 1/18/8 +f 13/29/9 14/14/9 15/19/9 +f 5/5/10 7/7/10 19/21/10 +f 24/121/11 17/22/11 32/24/11 +f 11/11/10 13/13/10 22/26/10 +f 7/7/10 9/9/10 20/28/10 +f 23/122/10 13/29/10 24/30/10 +f 3/3/10 5/5/10 18/32/10 +f 9/9/10 11/11/10 21/34/10 +f 15/19/10 1/18/10 24/36/10 +f 1/18/10 3/3/10 17/38/10 +f 22/123/12 23/39/12 30/41/12 +f 28/91/13 20/42/13 29/44/13 +f 18/124/14 19/45/14 26/47/14 +f 23/125/15 24/48/15 31/50/15 +f 29/126/16 21/51/16 30/53/16 +f 19/127/17 20/54/17 27/56/17 +f 17/128/18 18/57/18 25/59/18 +f 6/4/20 4/2/20 35/64/20 +f 38/77/21 12/10/21 37/65/21 +f 2/1/22 16/17/22 34/67/22 +f 33/80/23 4/2/23 34/68/23 +f 8/6/24 6/4/24 36/70/24 +f 14/12/25 12/10/25 39/72/25 +f 10/8/26 8/6/26 37/62/26 +f 27/56/34 28/55/34 44/83/34 +f 48/89/10 49/84/10 56/86/10 +f 25/59/35 26/58/35 42/88/35 +f 32/24/36 25/23/36 49/84/36 +f 30/41/37 31/40/37 47/90/37 +f 45/82/38 28/91/38 46/92/38 +f 26/47/39 27/46/39 43/87/39 +f 48/89/40 31/50/40 49/84/40 +f 29/126/41 30/53/41 46/92/41 +f 51/129/42 52/93/42 59/95/42 +f 46/92/10 47/90/10 54/97/10 +f 44/83/10 45/82/10 52/99/10 +f 42/88/10 43/87/10 50/101/10 +f 57/85/10 49/84/10 50/101/10 +f 47/90/10 48/89/10 55/96/10 +f 45/82/10 46/92/10 53/98/10 +f 43/87/10 44/83/10 51/100/10 +f 65/104/10 58/111/10 59/95/10 +f 59/95/10 60/94/10 65/104/10 +f 61/102/10 62/108/10 63/103/10 +f 63/103/10 64/106/10 65/104/10 +f 65/104/10 60/94/10 61/102/10 +f 56/130/43 57/105/43 64/106/43 +f 54/131/44 55/107/44 62/108/44 +f 52/132/45 53/109/45 60/94/45 +f 50/133/46 51/110/46 58/111/46 +f 57/134/47 50/112/47 65/104/47 +f 63/103/48 55/113/48 64/106/48 +f 61/102/49 53/115/49 62/108/49 +f 73/120/50 69/117/50 77/119/50 +f 78/118/51 74/119/51 66/117/51 +f 79/118/52 75/119/52 67/117/52 +f 72/120/53 68/117/53 76/119/53 diff --git a/assets/hbm/textures/blocks/sat_dock.png b/assets/hbm/textures/blocks/sat_dock.png new file mode 100644 index 0000000000000000000000000000000000000000..4bcfe359e70c4366832399e121943167cb4a8af4 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfKc&o{ z$KJeqTBg(YZiZxmdK II;Vst0MM#YAOHXW literal 0 HcmV?d00001 diff --git a/assets/hbm/textures/items/missile_nuclear_cluster.png b/assets/hbm/textures/items/missile_nuclear_cluster.png index 192f1c593a8e3066713315667c328cccdd47186a..2cc900dc51fde7f1e17fa15f69d14f7dcce8c989 100644 GIT binary patch delta 293 zcmV+=0owko0?z`FGk*aFNkl%M{a<74>XKeEaMpL^9fa6t9 zmk$8EzXkl`U2-n40JzVu+3!C9xV^c;IX8I|R{2KWdxa2`t$!t!nvOW1p=5JlfEL4|aIxqz6!8kB>mNRc8rjqsgv z5kp+KPP45Fb%LKFwy=zn$U(nZW?0_-KRd96TA@uK{{hA8;*E}0sIKePpm6Kr^Qi&g z`EUSWe{<(onVC{b5=fw?Y5sIGi;!~;FUKPQyOaPZ%aV?tXL|Fn)ZC>+jFE91`8Wds zt&U@6a`!2UKq;lgIB^M(a}KYk(^NmY15gwN_xunY$lc}cf@x1?P8J)czvBxa_nssI>UD1-ph^UfxV!#N=P@&E1E~00000NkvXX Hu0mjfmB4+; diff --git a/assets/hbm/textures/items/sat_miner.png b/assets/hbm/textures/items/sat_miner.png new file mode 100644 index 0000000000000000000000000000000000000000..bebbd59b54916ab6e694f20a1102b795c860257b GIT binary patch literal 309 zcmV-50m}Y~P)1p=5JjIuK)5iG3cFVC6Qr9Wrx4@<0pDSaTbJ<_1U^A3 z6XgymQn=VIO@g#w2ywG6!Y0Pr6$*OI!v8bFpWTIlj4lOLb$Om+j6qdLG0k&zIlx+r zF$QaGr`Cz8x;|Pk0l>@a9RREK&aKuvcdqps;G1WYJ+sLkKP1F;%y@b}kc{U5e1CnC zjFbN*=u2yWdm|b*r61c{rg;xiw(>BP0;hS1W!>E z?mR(RmciQSEBMAih=>!B=%qr(3L@f~rU4*LQ>v2nZ?db_3M#$=#W6-u%E{ODW})QZ5uDq2w&fsHzIUX{{q)+$fYRBE)e_ znx^!Tcn!W$r-f#9k;k`)kR%CsS{Y36X3(tOL48uRXVFU_B2v_K&3wQ6oWQ5UA|GY| zu)3T9Sl_O{8EmIB05;=E*g$I?6-9wD=JmEb9RaY`QkEs{HG0nz=uErsln3h$*u*+> Tl3*?;00000NkvXXu0mjfwHIKP delta 212 zcmV;_04x860)PULG=H~AL_t(IjkS_54#F@Lhd&6(DoT(@Dr-pIb&yC-z!^9Jk}EC2 z)FLrs3xZY^F_>A$fMw6MX?}mcJ{WUEB#KD<^kzELWY*)3_Z}eTc|I8>K~g|OqP4a; z8)N8VF&=|gcf9w65Pla>N}-hMP0*?!BGDKFz+!Wwsw&E|L``d*eRqc1srk O0000-)XV|oi&a4a5uvVY4(rS31U{|y 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 literal 0 HcmV?d00001 diff --git a/assets/hbm/textures/models/minerRocket.png b/assets/hbm/textures/models/minerRocket.png new file mode 100644 index 0000000000000000000000000000000000000000..13158fcc68911d5ab41e3c07d23f5adb9603c967 GIT binary patch literal 3430 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 literal 0 HcmV?d00001 diff --git a/com/hbm/blocks/ModBlocks.java b/com/hbm/blocks/ModBlocks.java index a73abc508..dbde356b4 100644 --- a/com/hbm/blocks/ModBlocks.java +++ b/com/hbm/blocks/ModBlocks.java @@ -232,7 +232,7 @@ public class ModBlocks { public static Block sat_resonator; public static Block sat_dock; - public static final int guiID_dock = 46; + public static final int guiID_dock = 80; public static Block crate_iron; public static final int guiID_crate_iron = 46; @@ -969,7 +969,7 @@ public class ModBlocks { sat_foeq = new DecoBlock(Material.iron).setBlockName("sat_foeq").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":sat_foeq"); sat_resonator = new DecoBlock(Material.iron).setBlockName("sat_resonator").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":sat_resonator"); - sat_dock = new MachineSatDock(Material.iron).setBlockName("sat_dock").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":sat_dock"); + sat_dock = new MachineSatDock(Material.iron).setBlockName("sat_dock").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":sat_dock"); turret_light = new TurretLight(Material.iron).setBlockName("turret_light").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.weaponTab).setBlockTextureName(RefStrings.MODID + ":turret_light"); turret_heavy = new TurretHeavy(Material.iron).setBlockName("turret_heavy").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.weaponTab).setBlockTextureName(RefStrings.MODID + ":turret_heavy"); @@ -1436,7 +1436,6 @@ public class ModBlocks { GameRegistry.registerBlock(machine_combine_factory, machine_combine_factory.getUnlocalizedName()); GameRegistry.registerBlock(machine_teleporter, machine_teleporter.getUnlocalizedName()); GameRegistry.registerBlock(machine_satlinker, machine_satlinker.getUnlocalizedName()); - GameRegistry.registerBlock(sat_dock, sat_dock.getUnlocalizedName()); GameRegistry.registerBlock(machine_telelinker, machine_telelinker.getUnlocalizedName()); GameRegistry.registerBlock(machine_keyforge, machine_keyforge.getUnlocalizedName()); GameRegistry.registerBlock(machine_forcefield, machine_forcefield.getUnlocalizedName()); @@ -1510,6 +1509,7 @@ public class ModBlocks { //Missile Blocks GameRegistry.registerBlock(launch_pad, launch_pad.getUnlocalizedName()); + GameRegistry.registerBlock(sat_dock, sat_dock.getUnlocalizedName()); GameRegistry.registerBlock(machine_radar, machine_radar.getUnlocalizedName()); //Guide diff --git a/com/hbm/blocks/bomb/BlockTaint.java b/com/hbm/blocks/bomb/BlockTaint.java index c5cbc19cf..9e32edc7e 100644 --- a/com/hbm/blocks/bomb/BlockTaint.java +++ b/com/hbm/blocks/bomb/BlockTaint.java @@ -190,8 +190,6 @@ public class BlockTaint extends Block/*Container*/ { if(entity instanceof EntityCreeper) { EntityTaintedCreeper creep = new EntityTaintedCreeper(world); creep.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch); - - System.out.println(entity.getClass().toString()); if(!world.isRemote) { entity.setDead(); diff --git a/com/hbm/blocks/bomb/LaunchPad.java b/com/hbm/blocks/bomb/LaunchPad.java index a42ca0a71..6cc164d06 100644 --- a/com/hbm/blocks/bomb/LaunchPad.java +++ b/com/hbm/blocks/bomb/LaunchPad.java @@ -453,7 +453,7 @@ public class LaunchPad extends BlockContainer implements IBomb { { EntityCarrier missile = new EntityCarrier(p_149695_1_); missile.posX = x + 0.5F; - missile.posY = y + 0.5F; + missile.posY = y + 1F; missile.posZ = z + 0.5F; if(entity.slots[1] != null) diff --git a/com/hbm/blocks/machine/MachineSatDock.java b/com/hbm/blocks/machine/MachineSatDock.java index 643613f5d..da0bd1864 100644 --- a/com/hbm/blocks/machine/MachineSatDock.java +++ b/com/hbm/blocks/machine/MachineSatDock.java @@ -1,9 +1,21 @@ package com.hbm.blocks.machine; +import java.util.Random; + +import com.hbm.blocks.ModBlocks; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.machine.TileEntityMachineBattery; import com.hbm.tileentity.machine.TileEntityMachineSatDock; +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.IBlockAccess; @@ -11,6 +23,9 @@ import net.minecraft.world.World; public class MachineSatDock extends BlockContainer { + private final Random field_149933_a = new Random(); + private Random rand; + public MachineSatDock(Material p_i45386_1_) { super(p_i45386_1_); } @@ -48,5 +63,68 @@ public class MachineSatDock extends BlockContainer { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 12*f, 1.0F); return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) + { + return true; + } else if(!player.isSneaking()) + { + TileEntityMachineSatDock entity = (TileEntityMachineSatDock) world.getTileEntity(x, y, z); + if(entity != null) + { + FMLNetworkHandler.openGui(player, MainRegistry.instance, ModBlocks.guiID_dock, world, x, y, z); + } + return true; + } else { + return false; + } + } + + @Override + public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) + { + IInventory tileentityfurnace = (IInventory) p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_); + + if (tileentityfurnace != null) { + for (int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) { + ItemStack itemstack = tileentityfurnace.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.field_149933_a.nextFloat() * 0.8F + 0.1F; + float f1 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; + float f2 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.field_149933_a.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, + p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.field_149933_a.nextGaussian() * f3; + entityitem.motionY = (float) this.field_149933_a.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.field_149933_a.nextGaussian() * f3; + p_149749_1_.spawnEntityInWorld(entityitem); + } + } + } + + p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_); + } + + super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); + } } diff --git a/com/hbm/blocks/test/TestEventTester.java b/com/hbm/blocks/test/TestEventTester.java index 559a317f5..ef44a897d 100644 --- a/com/hbm/blocks/test/TestEventTester.java +++ b/com/hbm/blocks/test/TestEventTester.java @@ -11,6 +11,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.entity.effect.EntityBlackHole; import com.hbm.entity.effect.EntityCloudFleija; import com.hbm.entity.effect.EntityCloudFleijaRainbow; +import com.hbm.entity.missile.EntityMinerRocket; import com.hbm.entity.projectile.EntityBurningFOEQ; import com.hbm.entity.projectile.EntityMeteor; import com.hbm.explosion.ExplosionLarge; @@ -358,10 +359,19 @@ public class TestEventTester extends Block { if(!worldObj.isRemote) worldObj.spawnEntityInWorld(foeq);*/ - if(!worldObj.isRemote) { + /*if(!worldObj.isRemote) { worldObj.setBlockToAir(par2, par3, par4); ExplosionLarge.jolt(worldObj, par2 - 0.5, par3 - 0.5, par4 - 0.5, 5, 200, 0.25); ExplosionLarge.explode(worldObj, par2 + 0.5, par3 + 0.5, par4 + 0.5, 5, false, false, false); + }*/ + + if(!worldObj.isRemote) { + EntityMinerRocket rocket = new EntityMinerRocket(worldObj); + rocket.posX = par2 + 0.5; + rocket.posY = 100; + rocket.posZ = par4 + 0.5; + + worldObj.spawnEntityInWorld(rocket); } /*if(!worldObj.isRemote) { diff --git a/com/hbm/entity/missile/EntityCarrier.java b/com/hbm/entity/missile/EntityCarrier.java index 2bbc8758f..81b50e04c 100644 --- a/com/hbm/entity/missile/EntityCarrier.java +++ b/com/hbm/entity/missile/EntityCarrier.java @@ -149,6 +149,8 @@ public class EntityCarrier extends EntityThrowable { data.satellites.add(new SatelliteSaveStructure(freq, SatelliteType.RELAY, this.dimension)); if(payload.getItem() == ModItems.sat_resonator) data.satellites.add(new SatelliteSaveStructure(freq, SatelliteType.RESONATOR, this.dimension)); + if(payload.getItem() == ModItems.sat_miner) + data.satellites.add(new SatelliteSaveStructure(freq, SatelliteType.MINER, this.dimension)); data.markDirty(); } diff --git a/com/hbm/entity/missile/EntityMinerRocket.java b/com/hbm/entity/missile/EntityMinerRocket.java new file mode 100644 index 000000000..530bdf03b --- /dev/null +++ b/com/hbm/entity/missile/EntityMinerRocket.java @@ -0,0 +1,96 @@ +package com.hbm.entity.missile; + +import com.hbm.blocks.ModBlocks; +import com.hbm.entity.particle.EntityGasFlameFX; +import com.hbm.explosion.ExplosionLarge; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +public class EntityMinerRocket extends Entity { + + //0 landing, 1 unloading, 2 lifting + public int timer = 0; + + public EntityMinerRocket(World p_i1582_1_) { + super(p_i1582_1_); + this.ignoreFrustumCheck = true; + this.setSize(1F, 3F); + } + + @Override + protected void entityInit() { + this.dataWatcher.addObject(16, Integer.valueOf(0)); + } + + @Override + public void onUpdate() { + + if(dataWatcher.getWatchableObjectInt(16) == 0) + motionY = -0.75; + if(dataWatcher.getWatchableObjectInt(16) == 1) + motionY = 0; + if(dataWatcher.getWatchableObjectInt(16) == 2) + motionY = 1; + + motionX = 0; + motionZ = 0; + + this.setPositionAndRotation(posX + motionX, posY + motionY, posZ + motionZ, 0.0F, 0.0F); + + + if(dataWatcher.getWatchableObjectInt(16) == 0 && worldObj.getBlock((int)(posX - 0.5), (int)(posY - 0.5), (int)(posZ - 0.5)) == ModBlocks.sat_dock) { + dataWatcher.updateObject(16, 1); + motionY = 0; + posY = (int)posY; + } else if(worldObj.getBlock((int)(posX - 0.5), (int)(posY + 1), (int)(posZ - 0.5)).getMaterial() != Material.air && !worldObj.isRemote && dataWatcher.getWatchableObjectInt(16) != 1) { + this.setDead(); + ExplosionLarge.explodeFire(worldObj, posX - 0.5, posY, posZ - 0.5, 10F, true, false, true); + //worldObj.setBlock((int)(posX - 0.5), (int)(posY + 0.5), (int)(posZ - 0.5), Blocks.dirt); + } + + if(dataWatcher.getWatchableObjectInt(16) == 1) { + + if(ticksExisted % 2 == 0) + ExplosionLarge.spawnShock(worldObj, posX, posY, posZ, 1 + rand.nextInt(3), 1 + rand.nextGaussian()); + + timer++; + + if(timer > 100) { + dataWatcher.updateObject(16, 2); + } + } + + if(dataWatcher.getWatchableObjectInt(16) != 1) { + + if(ticksExisted % 2 == 0) { + EntityGasFlameFX fx = new EntityGasFlameFX(worldObj); + fx.posY = posY - 0.5D; + fx.posX = posX; + fx.posZ = posZ; + fx.motionY = -1D; + + worldObj.spawnEntityInWorld(fx); + } + } + + if(dataWatcher.getWatchableObjectInt(16) == 2 && posY > 300) + this.setDead(); + } + + @Override + protected void readEntityFromNBT(NBTTagCompound nbt) { + dataWatcher.updateObject(16, nbt.getInteger("mode")); + timer = nbt.getInteger("timer"); + } + + @Override + protected void writeEntityToNBT(NBTTagCompound nbt) { + nbt.setInteger("mode", dataWatcher.getWatchableObjectInt(16)); + nbt.setInteger("timer", timer); + } + +} diff --git a/com/hbm/entity/missile/EntityMissileMirv.java b/com/hbm/entity/missile/EntityMissileMirv.java index e09497bb1..2884f030f 100644 --- a/com/hbm/entity/missile/EntityMissileMirv.java +++ b/com/hbm/entity/missile/EntityMissileMirv.java @@ -24,26 +24,19 @@ public class EntityMissileMirv extends EntityMissileBaseAdvanced { public EntityMissileMirv(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); - this.isCluster = true; } @Override public void onImpact() { - worldObj.spawnEntityInWorld(EntityNukeExplosionMK4.statFac(worldObj, MainRegistry.missileRadius, posX, posY, posZ)); + worldObj.spawnEntityInWorld(EntityNukeExplosionMK4.statFac(worldObj, MainRegistry.missileRadius * 2, posX, posY, posZ)); - EntityNukeCloudSmall entity2 = new EntityNukeCloudSmall(this.worldObj, 1000, MainRegistry.missileRadius * 0.005F); + EntityNukeCloudSmall entity2 = new EntityNukeCloudSmall(this.worldObj, 1000, MainRegistry.missileRadius * 2 * 0.005F); entity2.posX = this.posX; entity2.posY = this.posY - 9; entity2.posZ = this.posZ; this.worldObj.spawnEntityInWorld(entity2); } - - @Override - public void cluster() { - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 15.0F, true); - ExplosionChaos.mirv(this.worldObj,this.posX, this.posY, this.posZ); - } @Override public List getDebris() { @@ -53,7 +46,6 @@ public class EntityMissileMirv extends EntityMissileBaseAdvanced { list.add(new ItemStack(ModItems.plate_steel, 20)); list.add(new ItemStack(ModItems.plate_aluminium, 12)); list.add(new ItemStack(ModItems.thruster_large, 1)); - list.add(new ItemStack(ModItems.warhead_mirvlet, 8)); list.add(new ItemStack(ModItems.circuit_targeting_tier5, 1)); return list; @@ -61,7 +53,7 @@ public class EntityMissileMirv extends EntityMissileBaseAdvanced { @Override public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_generic_large); + return new ItemStack(ModItems.warhead_mirv); } @Override diff --git a/com/hbm/entity/projectile/EntityBulletBase.java b/com/hbm/entity/projectile/EntityBulletBase.java index 1ed47d231..d2ae56262 100644 --- a/com/hbm/entity/projectile/EntityBulletBase.java +++ b/com/hbm/entity/projectile/EntityBulletBase.java @@ -9,7 +9,9 @@ import com.hbm.entity.effect.EntityEMPBlast; import com.hbm.entity.logic.EntityNukeExplosionMK3; import com.hbm.entity.logic.EntityNukeExplosionMK4; import com.hbm.entity.particle.EntityBSmokeFX; +import com.hbm.entity.particle.EntityTSmokeFX; import com.hbm.explosion.ExplosionChaos; +import com.hbm.explosion.ExplosionLarge; import com.hbm.explosion.ExplosionNukeGeneric; import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.handler.BulletConfiguration; @@ -220,9 +222,11 @@ public class EntityBulletBase extends Entity implements IProjectile { } if(!config.doesPenetrate) - onEntityImpact(victim); + if(!worldObj.isRemote) + onEntityImpact(victim); else - onEntityHurt(victim); + if(!worldObj.isRemote) + onEntityHurt(victim); //handle block collision } else if(worldObj.getBlock(movement.blockX, movement.blockY, movement.blockZ).getMaterial() != Material.air) { @@ -279,7 +283,8 @@ public class EntityBulletBase extends Entity implements IProjectile { worldObj.playSoundAtEntity(this, "hbm:weapon.gBounce", 1.0F, 1.0F); } else { - onBlockImpact(movement.blockX, movement.blockY, movement.blockZ); + if(!worldObj.isRemote) + onBlockImpact(movement.blockX, movement.blockY, movement.blockZ); } this.posX += (movement.hitVec.xCoord - this.posX) * 0.6; @@ -306,6 +311,9 @@ public class EntityBulletBase extends Entity implements IProjectile { this.posZ += this.motionZ * this.config.velocity; this.setPosition(this.posX, this.posY, this.posZ); } + + if(this.config.style == BulletConfiguration.STYLE_ROCKET && !worldObj.isRemote) + this.worldObj.spawnEntityInWorld(new EntityTSmokeFX(worldObj, this.posX, this.posY, this.posZ, 0, 0, 0)); float f2; this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); @@ -368,6 +376,9 @@ public class EntityBulletBase extends Entity implements IProjectile { if(config.explosive > 0 && !worldObj.isRemote) worldObj.newExplosion(this, posX, posY, posZ, config.explosive, config.incendiary > 0, true); + if(config.shrapnel > 0 && !worldObj.isRemote) + ExplosionLarge.spawnShrapnels(worldObj, posX, posY, posZ, config.shrapnel); + if(config.rainbow > 0 && !worldObj.isRemote) { this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, "random.explode", 100.0f, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); diff --git a/com/hbm/handler/BulletConfigFactory.java b/com/hbm/handler/BulletConfigFactory.java index 82c9ea459..06b104742 100644 --- a/com/hbm/handler/BulletConfigFactory.java +++ b/com/hbm/handler/BulletConfigFactory.java @@ -31,13 +31,6 @@ public class BulletConfigFactory { bullet.bounceMod = 0.8; bullet.doesPenetrate = true; bullet.doesBreakGlass = true; - bullet.incendiary = 0; - bullet.emp = 0; - bullet.rainbow = 0; - bullet.nuke = 0; - bullet.boxcar = false; - bullet.boat = false; - bullet.destroysBlocks = false; bullet.style = 0; bullet.plink = 1; @@ -64,16 +57,9 @@ public class BulletConfigFactory { bullet.bounceMod = 0.8; bullet.doesPenetrate = true; bullet.doesBreakGlass = true; - bullet.incendiary = 0; - bullet.emp = 0; - bullet.rainbow = 0; - bullet.nuke = 0; - bullet.boxcar = false; - bullet.boat = false; bullet.destroysBlocks = false; bullet.style = BulletConfiguration.STYLE_NORMAL; bullet.plink = BulletConfiguration.PLINK_BULLET; - bullet.instakill = false; return bullet; } @@ -95,16 +81,32 @@ public class BulletConfigFactory { bullet.bounceMod = 0.8; bullet.doesPenetrate = false; bullet.doesBreakGlass = true; - bullet.incendiary = 0; - bullet.emp = 0; - bullet.rainbow = 0; - bullet.nuke = 0; - bullet.boxcar = false; - bullet.boat = false; - bullet.destroysBlocks = false; bullet.style = BulletConfiguration.STYLE_PELLET; bullet.plink = BulletConfiguration.PLINK_BULLET; - bullet.instakill = false; + + return bullet; + } + + protected static BulletConfiguration standardRocketConfig() { + + BulletConfiguration bullet = new BulletConfiguration(); + + bullet.velocity = 2.0F; + bullet.spread = 0.005F; + bullet.bulletsMin = 1; + bullet.bulletsMax = 1; + bullet.gravity = 0.005D; + bullet.maxAge = 300; + bullet.doesRicochet = true; + bullet.ricochetAngle = 3; + bullet.HBRC = 0; + bullet.LBRC = 95; + bullet.bounceMod = 0.8; + bullet.doesPenetrate = false; + bullet.doesBreakGlass = false; + bullet.explosive = 5.0F; + bullet.style = BulletConfiguration.STYLE_ROCKET; + bullet.plink = BulletConfiguration.PLINK_GRENADE; return bullet; } @@ -278,5 +280,102 @@ public class BulletConfigFactory { return bullet; } + + /// 84mm Rockets /// + protected static BulletConfiguration getRocketConfig() { + + BulletConfiguration bullet = standardRocketConfig(); + + bullet.ammo = ModItems.ammo_rocket; + bullet.dmgMin = 10; + bullet.dmgMax = 15; + bullet.explosive = 3.5F; + bullet.trail = 0; + + return bullet; + } + + protected static BulletConfiguration getRocketHEConfig() { + + BulletConfiguration bullet = standardRocketConfig(); + + bullet.ammo = ModItems.ammo_rocket_he; + bullet.dmgMin = 10; + bullet.dmgMax = 15; + bullet.explosive = 6.5F; + bullet.trail = 1; + + return bullet; + } + + protected static BulletConfiguration getRocketIncendiaryConfig() { + + BulletConfiguration bullet = standardRocketConfig(); + + bullet.ammo = ModItems.ammo_rocket_incendiary; + bullet.dmgMin = 10; + bullet.dmgMax = 15; + bullet.explosive = 6.5F; + bullet.incendiary = 5; + bullet.trail = 2; + + return bullet; + } + + protected static BulletConfiguration getRocketEMPConfig() { + + BulletConfiguration bullet = standardRocketConfig(); + + bullet.ammo = ModItems.ammo_rocket_emp; + bullet.dmgMin = 10; + bullet.dmgMax = 15; + bullet.explosive = 2.5F; + bullet.emp = 10; + bullet.trail = 4; + + return bullet; + } + + protected static BulletConfiguration getRocketSleekConfig() { + + BulletConfiguration bullet = standardRocketConfig(); + + bullet.ammo = ModItems.ammo_rocket_sleek; + bullet.dmgMin = 10; + bullet.dmgMax = 15; + bullet.explosive = 10F; + bullet.trail = 6; + + return bullet; + } + + protected static BulletConfiguration getRocketShrapnelConfig() { + + BulletConfiguration bullet = standardRocketConfig(); + + bullet.ammo = ModItems.ammo_rocket_shrapnel; + bullet.dmgMin = 10; + bullet.dmgMax = 15; + bullet.explosive = 6.5F; + bullet.shrapnel = 25; + bullet.trail = 3; + + return bullet; + } + + protected static BulletConfiguration getRocketGlareConfig() { + + BulletConfiguration bullet = standardRocketConfig(); + + bullet.ammo = ModItems.ammo_rocket_glare; + bullet.velocity = 5.0F; + bullet.dmgMin = 10; + bullet.dmgMax = 15; + bullet.explosive = 6.5F; + bullet.incendiary = 5; + bullet.trail = 5; + + return bullet; + } } diff --git a/com/hbm/handler/BulletConfigSyncingUtil.java b/com/hbm/handler/BulletConfigSyncingUtil.java index dc86fc420..b5afa578b 100644 --- a/com/hbm/handler/BulletConfigSyncingUtil.java +++ b/com/hbm/handler/BulletConfigSyncingUtil.java @@ -28,11 +28,19 @@ public class BulletConfigSyncingUtil { public static final int IRON_REVOLVER = 0x01; public static final int STEEL_REVOLVER = 0x02; - public static final int G20_NORMAL = 0x03; - public static final int G20_SLUG = 0x04; - public static final int G20_FLECHETTE = 0x05; - public static final int G20_FIRE = 0x06; - public static final int G20_EXPLOSIVE = 0x07; + public static final int G20_NORMAL = 0x10; + public static final int G20_SLUG = 0x11; + public static final int G20_FLECHETTE = 0x12; + public static final int G20_FIRE = 0x13; + public static final int G20_EXPLOSIVE = 0x14; + + public static final int ROCKET_NORMAL = 0x20; + public static final int ROCKET_HE = 0x21; + public static final int ROCKET_INCENDIARY = 0x22; + public static final int ROCKET_SHRAPNEL = 0x23; + public static final int ROCKET_EMP = 0x24; + public static final int ROCKET_GLARE = 0x25; + public static final int ROCKET_SLEEK = 0x26; public static void loadConfigsForSync() { @@ -45,6 +53,14 @@ public class BulletConfigSyncingUtil { configSet.add(new ConfigKeyPair(BulletConfigFactory.get20GaugeFlechetteConfig(), G20_FLECHETTE)); configSet.add(new ConfigKeyPair(BulletConfigFactory.get20GaugeFireConfig(), G20_FIRE)); configSet.add(new ConfigKeyPair(BulletConfigFactory.get20GaugeExplosiveConfig(), G20_EXPLOSIVE)); + + configSet.add(new ConfigKeyPair(BulletConfigFactory.getRocketConfig(), ROCKET_NORMAL)); + configSet.add(new ConfigKeyPair(BulletConfigFactory.getRocketHEConfig(), ROCKET_HE)); + configSet.add(new ConfigKeyPair(BulletConfigFactory.getRocketIncendiaryConfig(), ROCKET_INCENDIARY)); + configSet.add(new ConfigKeyPair(BulletConfigFactory.getRocketShrapnelConfig(), ROCKET_SHRAPNEL)); + configSet.add(new ConfigKeyPair(BulletConfigFactory.getRocketEMPConfig(), ROCKET_EMP)); + configSet.add(new ConfigKeyPair(BulletConfigFactory.getRocketGlareConfig(), ROCKET_GLARE)); + configSet.add(new ConfigKeyPair(BulletConfigFactory.getRocketSleekConfig(), ROCKET_SLEEK)); } public static BulletConfiguration pullConfig(int key) { diff --git a/com/hbm/handler/BulletConfiguration.java b/com/hbm/handler/BulletConfiguration.java index 0036a86b5..4e350c580 100644 --- a/com/hbm/handler/BulletConfiguration.java +++ b/com/hbm/handler/BulletConfiguration.java @@ -54,6 +54,7 @@ public class BulletConfiguration { public float explosive; public int rainbow; public int nuke; + public int shrapnel; public boolean boxcar; public boolean boat; public boolean destroysBlocks; diff --git a/com/hbm/handler/GUIHandler.java b/com/hbm/handler/GUIHandler.java index 165b94396..96840d36e 100644 --- a/com/hbm/handler/GUIHandler.java +++ b/com/hbm/handler/GUIHandler.java @@ -713,6 +713,15 @@ public class GUIHandler implements IGuiHandler { } return null; } + + case ModBlocks.guiID_dock: + { + if(entity instanceof TileEntityMachineSatDock) + { + return new ContainerSatDock(player.inventory, (TileEntityMachineSatDock) entity); + } + return null; + } } } else { //CLIENTONLY CONTAINERS @@ -1426,6 +1435,15 @@ public class GUIHandler implements IGuiHandler { } return null; } + + case ModBlocks.guiID_dock: + { + if(entity instanceof TileEntityMachineSatDock) + { + return new GUISatDock(player.inventory, (TileEntityMachineSatDock) entity); + } + return null; + } } } else { //CLIENTONLY GUIS diff --git a/com/hbm/handler/GunConfigFactory.java b/com/hbm/handler/GunConfigFactory.java index 89aa26f45..e65d20b38 100644 --- a/com/hbm/handler/GunConfigFactory.java +++ b/com/hbm/handler/GunConfigFactory.java @@ -3,6 +3,7 @@ package com.hbm.handler; import java.util.ArrayList; import com.hbm.items.ModItems; +import com.hbm.render.misc.RenderScreenOverlay.Crosshair; public class GunConfigFactory { @@ -22,11 +23,11 @@ public class GunConfigFactory { config.ammoCap = 6; config.reloadType = GunConfiguration.RELOAD_FULL; config.allowsInfinity = true; + config.crosshair = Crosshair.L_CLASSIC; config.config = new ArrayList(); config.config.add(BulletConfigSyncingUtil.STEEL_REVOLVER); config.config.add(BulletConfigSyncingUtil.IRON_REVOLVER); - config.config.add(BulletConfigSyncingUtil.G20_NORMAL); return config; } @@ -47,6 +48,7 @@ public class GunConfigFactory { config.ammoCap = 6; config.reloadType = GunConfiguration.RELOAD_SINGLE; config.allowsInfinity = true; + config.crosshair = Crosshair.L_CIRCLE; config.config = new ArrayList(); config.config.add(BulletConfigSyncingUtil.G20_NORMAL); @@ -57,5 +59,35 @@ public class GunConfigFactory { return config; } + + public static GunConfiguration getGustavConfig() { + + GunConfiguration config = new GunConfiguration(); + + config.rateOfFire = 30; + config.gunMode = GunConfiguration.MODE_NORMAL; + config.firingMode = GunConfiguration.FIRE_MANUAL; + config.hasReloadAnim = false; + config.hasFiringAnim = false; + config.hasSpinup = false; + config.hasSpindown = false; + config.reloadDuration = 60; + config.firingDuration = 0; + config.ammoCap = 1; + config.reloadType = GunConfiguration.RELOAD_SINGLE; + config.allowsInfinity = true; + config.crosshair = Crosshair.L_CIRCUMFLEX; + + config.config = new ArrayList(); + config.config.add(BulletConfigSyncingUtil.ROCKET_NORMAL); + config.config.add(BulletConfigSyncingUtil.ROCKET_HE); + config.config.add(BulletConfigSyncingUtil.ROCKET_INCENDIARY); + config.config.add(BulletConfigSyncingUtil.ROCKET_SHRAPNEL); + config.config.add(BulletConfigSyncingUtil.ROCKET_EMP); + config.config.add(BulletConfigSyncingUtil.ROCKET_GLARE); + config.config.add(BulletConfigSyncingUtil.ROCKET_SLEEK); + + return config; + } } diff --git a/com/hbm/handler/GunConfiguration.java b/com/hbm/handler/GunConfiguration.java index a607b6805..61c02fb1d 100644 --- a/com/hbm/handler/GunConfiguration.java +++ b/com/hbm/handler/GunConfiguration.java @@ -2,6 +2,8 @@ package com.hbm.handler; import java.util.List; +import com.hbm.render.misc.RenderScreenOverlay.Crosshair; + public class GunConfiguration { /** @@ -44,6 +46,9 @@ public class GunConfiguration { //bullet configs for main and alt fire public List config; + //crosshair + public Crosshair crosshair; + public static final int MODE_NORMAL = 0; public static final int MODE_RELEASE = 1; public static final int MODE_BOTH = 1; diff --git a/com/hbm/inventory/MachineRecipes.java b/com/hbm/inventory/MachineRecipes.java index 2618edcd8..75fc22f1a 100644 --- a/com/hbm/inventory/MachineRecipes.java +++ b/com/hbm/inventory/MachineRecipes.java @@ -2411,10 +2411,13 @@ public class MachineRecipes { list.add(new ItemStack(Blocks.tnt, 2)); break; case W_MIRV: - list.add(new ItemStack(ModItems.warhead_generic_large, 1)); - list.add(new ItemStack(ModItems.plate_steel, 16)); - list.add(new ItemStack(ModBlocks.det_cord, 8)); - list.add(new ItemStack(ModItems.warhead_mirvlet, 8)); + list.add(new ItemStack(ModItems.plate_titanium, 20)); + list.add(new ItemStack(ModItems.plate_steel, 12)); + list.add(new ItemStack(ModItems.ingot_pu239, 1)); + list.add(new ItemStack(Blocks.tnt, 8)); + list.add(new ItemStack(ModItems.neutron_reflector, 6)); + list.add(new ItemStack(ModItems.lithium, 4)); + list.add(new ItemStack(ModItems.cell_deuterium, 6)); break; case W_ENDOTHERMIC: list.add(new ItemStack(ModBlocks.therm_endo, 2)); @@ -2543,6 +2546,20 @@ public class MachineRecipes { list.add(new ItemStack(ModItems.magnetron, 3)); list.add(ItemBattery.getEmptyBattery(ModItems.battery_lithium_cell_6)); break; + case SAT_MINER: + list.add(new ItemStack(ModItems.plate_saturnite, 24)); + list.add(new ItemStack(ModItems.plate_desh, 8)); + list.add(new ItemStack(ModItems.motor, 2)); + list.add(new ItemStack(ModItems.drill_titanium, 2)); + list.add(new ItemStack(ModItems.circuit_targeting_tier4, 2)); + list.add(new ItemStack(ModItems.fluid_barrel_full, 1, FluidType.KEROSENE.getID())); + list.add(new ItemStack(ModItems.thruster_small, 1)); + list.add(new ItemStack(ModItems.photo_panel, 12)); + list.add(new ItemStack(ModItems.centrifuge_element, 4)); + list.add(new ItemStack(ModItems.magnet_circular, 3)); + list.add(new ItemStack(ModItems.plate_polymer, 12)); + list.add(ItemBattery.getEmptyBattery(ModItems.battery_lithium_cell_6)); + break; case CHOPPER_HEAD: list.add(new ItemStack(ModBlocks.reinforced_glass, 2)); list.add(new ItemStack(ModBlocks.fwatz_computer, 1)); @@ -4103,6 +4120,9 @@ public class MachineRecipes { case SAT_FOEQ: output = new ItemStack(ModItems.sat_foeq, 1); break; + case SAT_MINER: + output = new ItemStack(ModItems.sat_miner, 1); + break; case CHOPPER_HEAD: output = new ItemStack(ModItems.chopper_head, 1); break; diff --git a/com/hbm/inventory/container/ContainerSatDock.java b/com/hbm/inventory/container/ContainerSatDock.java new file mode 100644 index 000000000..5e2accc48 --- /dev/null +++ b/com/hbm/inventory/container/ContainerSatDock.java @@ -0,0 +1,98 @@ +package com.hbm.inventory.container; + +import com.hbm.tileentity.bomb.TileEntityNukeN45; +import com.hbm.tileentity.machine.TileEntityMachineSatDock; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerSatDock extends Container { + + private TileEntityMachineSatDock diFurnace; + + public ContainerSatDock(InventoryPlayer invPlayer, TileEntityMachineSatDock tedf) { + + diFurnace = tedf; + + //Storage + this.addSlotToContainer(new Slot(tedf, 0, 62, 17)); + this.addSlotToContainer(new Slot(tedf, 1, 80, 17)); + this.addSlotToContainer(new Slot(tedf, 2, 98, 17)); + this.addSlotToContainer(new Slot(tedf, 3, 116, 17)); + this.addSlotToContainer(new Slot(tedf, 4, 134, 17)); + this.addSlotToContainer(new Slot(tedf, 5, 62, 35)); + this.addSlotToContainer(new Slot(tedf, 6, 80, 35)); + this.addSlotToContainer(new Slot(tedf, 7, 98, 35)); + this.addSlotToContainer(new Slot(tedf, 8, 116, 35)); + this.addSlotToContainer(new Slot(tedf, 9, 134, 35)); + this.addSlotToContainer(new Slot(tedf, 10, 62, 53)); + this.addSlotToContainer(new Slot(tedf, 11, 80, 53)); + this.addSlotToContainer(new Slot(tedf, 12, 98, 53)); + this.addSlotToContainer(new Slot(tedf, 13, 116, 53)); + this.addSlotToContainer(new Slot(tedf, 14, 134, 53)); + //Chip + this.addSlotToContainer(new Slot(tedf, 15, 26, 35)); + + for(int i = 0; i < 3; i++) + { + for(int j = 0; j < 9; j++) + { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) + { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142)); + } + } + + @Override + public void addCraftingToCrafters(ICrafting crafting) { + super.addCraftingToCrafters(crafting); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) + { + ItemStack var3 = null; + Slot var4 = (Slot) this.inventorySlots.get(par2); + + if (var4 != null && var4.getHasStack()) + { + ItemStack var5 = var4.getStack(); + var3 = var5.copy(); + + if (par2 <= 15) { + if (!this.mergeItemStack(var5, 16, this.inventorySlots.size(), true)) + { + return null; + } + } + else if (!this.mergeItemStack(var5, 0, 15, false)) + { + return null; + } + + if (var5.stackSize == 0) + { + var4.putStack((ItemStack) null); + } + else + { + var4.onSlotChanged(); + } + } + + return var3; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return diFurnace.isUseableByPlayer(player); + } +} diff --git a/com/hbm/inventory/gui/GUISatDock.java b/com/hbm/inventory/gui/GUISatDock.java new file mode 100644 index 000000000..946e5e1ab --- /dev/null +++ b/com/hbm/inventory/gui/GUISatDock.java @@ -0,0 +1,55 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerNukeN45; +import com.hbm.inventory.container.ContainerSatDock; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.bomb.TileEntityNukeN45; +import com.hbm.tileentity.machine.TileEntityMachineSatDock; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; + +public class GUISatDock extends GuiInfoContainer { + + public static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_dock.png"); + private TileEntityMachineSatDock diFurnace; + + public GUISatDock(InventoryPlayer invPlayer, TileEntityMachineSatDock tedf) { + super(new ContainerSatDock(invPlayer, tedf)); + diFurnace = tedf; + + this.xSize = 176; + this.ySize = 168; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + String[] text = new String[] { "Requires linked miner sat chip.", + "Cargo ship will land periodically to", + "deliver resources." }; + this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36, 16, 16, guiLeft - 8, guiTop + 36 + 16, text); + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.diFurnace.hasCustomInventoryName() ? this.diFurnace.getInventoryName() : I18n.format(this.diFurnace.getInventoryName()); + + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + this.drawInfoPanel(guiLeft - 16, guiTop + 36, 16, 16, 2); + } +} diff --git a/com/hbm/inventory/gui/GUIScreenSatInterface.java b/com/hbm/inventory/gui/GUIScreenSatInterface.java index 7da383089..dfb99857c 100644 --- a/com/hbm/inventory/gui/GUIScreenSatInterface.java +++ b/com/hbm/inventory/gui/GUIScreenSatInterface.java @@ -132,10 +132,8 @@ public class GUIScreenSatInterface extends GuiScreen { drawNoService(); } else { switch(connectedSat.satelliteType) { - + case LASER: - drawMap(); break; - case MAPPER: drawMap(); break; @@ -147,6 +145,7 @@ public class GUIScreenSatInterface extends GuiScreen { case RELAY: case RESONATOR: + case MINER: drawNoService(); break; } } diff --git a/com/hbm/items/ModItems.java b/com/hbm/items/ModItems.java index 5ce34ca83..f09da1931 100644 --- a/com/hbm/items/ModItems.java +++ b/com/hbm/items/ModItems.java @@ -803,6 +803,7 @@ public class ModItems { public static Item sat_laser; public static Item sat_foeq; public static Item sat_resonator; + public static Item sat_miner; public static Item sat_chip; public static Item sat_interface; @@ -1303,6 +1304,7 @@ public class ModItems { public static Item cape_vertice; public static Item cape_codered_; public static Item cape_ayy; + public static Item cape_nostalgia; public static Item nuke_starter_kit; public static Item nuke_advanced_kit; @@ -1811,7 +1813,7 @@ public class ModItems { warhead_buster_medium = new Item().setUnlocalizedName("warhead_buster_medium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":warhead_buster_medium"); warhead_buster_large = new Item().setUnlocalizedName("warhead_buster_large").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":warhead_buster_large"); warhead_nuclear = new Item().setUnlocalizedName("warhead_nuclear").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":warhead_nuclear"); - warhead_mirvlet = new Item().setUnlocalizedName("warhead_mirvlet").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":warhead_mirvlet"); + warhead_mirvlet = new Item().setUnlocalizedName("warhead_mirvlet").setCreativeTab(null).setTextureName(RefStrings.MODID + ":warhead_mirvlet"); warhead_mirv = new Item().setUnlocalizedName("warhead_mirv").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":warhead_mirv"); warhead_thermo_endo = new Item().setUnlocalizedName("warhead_thermo_endo").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":warhead_thermo_endo"); warhead_thermo_exo = new Item().setUnlocalizedName("warhead_thermo_exo").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":warhead_thermo_exo"); @@ -2247,6 +2249,7 @@ public class ModItems { sat_laser = new ItemSatChip().setUnlocalizedName("sat_laser").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":sat_laser"); sat_foeq = new ItemSatChip().setUnlocalizedName("sat_foeq").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":sat_foeq"); sat_resonator = new ItemSatChip().setUnlocalizedName("sat_resonator").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":sat_resonator"); + sat_miner = new ItemSatChip().setUnlocalizedName("sat_miner").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":sat_miner"); sat_chip = new ItemSatChip().setUnlocalizedName("sat_chip").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":sat_chip"); sat_interface = new ItemSatInterface().setUnlocalizedName("sat_interface").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":sat_interface"); @@ -2293,7 +2296,7 @@ public class ModItems { ammo_grenade_toxic = new Item().setUnlocalizedName("ammo_grenade_toxic").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":ammo_grenade_toxic"); ammo_grenade_sleek = new Item().setUnlocalizedName("ammo_grenade_sleek").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":ammo_grenade_sleek"); - gun_rpg = new GunRpg().setUnlocalizedName("gun_rpg").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_rpg"); + gun_rpg = new ItemGunBase(GunConfigFactory.getGustavConfig()).setUnlocalizedName("gun_rpg").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_rpg"); gun_rpg_ammo = new Item().setUnlocalizedName("gun_rpg_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":gun_rpg_ammo_alt"); gun_stinger = new GunStinger().setUnlocalizedName("gun_stinger").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_stinger"); gun_skystinger = new GunStinger().setUnlocalizedName("gun_skystinger").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_skystinger"); @@ -2826,6 +2829,7 @@ public class ModItems { cape_vertice = new ArmorModel(MainRegistry.enumArmorMaterialEmerald, 9, 1).setUnlocalizedName("cape_vertice").setCreativeTab(MainRegistry.consumableTab).setMaxStackSize(1).setTextureName(RefStrings.MODID + ":cape_unknown"); cape_codered_ = new ArmorModel(MainRegistry.enumArmorMaterialEmerald, 9, 1).setUnlocalizedName("cape_codered_").setCreativeTab(MainRegistry.consumableTab).setMaxStackSize(1).setTextureName(RefStrings.MODID + ":cape_unknown"); cape_ayy = new ArmorModel(MainRegistry.enumArmorMaterialEmerald, 9, 1).setUnlocalizedName("cape_ayy").setCreativeTab(MainRegistry.consumableTab).setMaxStackSize(1).setTextureName(RefStrings.MODID + ":cape_unknown"); + cape_nostalgia = new ArmorModel(MainRegistry.enumArmorMaterialEmerald, 9, 1).setUnlocalizedName("cape_nostalgia").setCreativeTab(MainRegistry.consumableTab).setMaxStackSize(1).setTextureName(RefStrings.MODID + ":cape_unknown"); schrabidium_hammer = new WeaponSpecial(MainRegistry.enumToolMaterialHammer).setUnlocalizedName("schrabidium_hammer").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":schrabidium_hammer"); shimmer_sledge = new WeaponSpecial(MainRegistry.enumToolMaterialSledge).setUnlocalizedName("shimmer_sledge").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":shimmer_sledge_original"); @@ -3883,6 +3887,7 @@ public class ModItems { GameRegistry.registerItem(sat_laser, sat_laser.getUnlocalizedName()); GameRegistry.registerItem(sat_foeq, sat_foeq.getUnlocalizedName()); GameRegistry.registerItem(sat_resonator, sat_resonator.getUnlocalizedName()); + GameRegistry.registerItem(sat_miner, sat_miner.getUnlocalizedName()); GameRegistry.registerItem(sat_chip, sat_chip.getUnlocalizedName()); GameRegistry.registerItem(sat_interface, sat_interface.getUnlocalizedName()); @@ -4129,6 +4134,7 @@ public class ModItems { GameRegistry.registerItem(cape_vertice, cape_vertice.getUnlocalizedName()); GameRegistry.registerItem(cape_codered_, cape_codered_.getUnlocalizedName()); GameRegistry.registerItem(cape_ayy, cape_ayy.getUnlocalizedName()); + GameRegistry.registerItem(cape_nostalgia, cape_nostalgia.getUnlocalizedName()); //Tools GameRegistry.registerItem(schrabidium_sword, schrabidium_sword.getUnlocalizedName()); diff --git a/com/hbm/items/gear/ArmorModel.java b/com/hbm/items/gear/ArmorModel.java index 89d4f8b32..5f39f1672 100644 --- a/com/hbm/items/gear/ArmorModel.java +++ b/com/hbm/items/gear/ArmorModel.java @@ -102,6 +102,9 @@ public class ArmorModel extends ItemArmor { if (this == ModItems.cape_ayy) { return armorType == 1; } + if (this == ModItems.cape_nostalgia) { + return armorType == 1; + } return armorType == 0; } @@ -148,7 +151,7 @@ public class ArmorModel extends ItemArmor { return this.modelCloak; } } - if (this == ModItems.cape_hbm || this == ModItems.cape_dafnik || this == ModItems.cape_lpkukin || this == ModItems.cape_vertice || this == ModItems.cape_codered_ || this == ModItems.cape_ayy) { + if (this == ModItems.cape_hbm || this == ModItems.cape_dafnik || this == ModItems.cape_lpkukin || this == ModItems.cape_vertice || this == ModItems.cape_codered_ || this == ModItems.cape_ayy || this == ModItems.cape_nostalgia) { if (armorSlot == 1) { if (this.modelCloak == null) { this.modelCloak = new ModelCloak(); @@ -212,6 +215,9 @@ public class ArmorModel extends ItemArmor { if (stack.getItem() == ModItems.cape_ayy && entity instanceof EntityPlayer && ((EntityPlayer)entity).getUniqueID().toString().equals(Library.dxmaster769)) { return "hbm:textures/models/CapeAyy.png"; } + if (stack.getItem() == ModItems.cape_nostalgia && entity instanceof EntityPlayer && ((EntityPlayer)entity).getUniqueID().toString().equals(Library.nostalgia)) { + return "hbm:textures/models/CapeNostalgia.png"; + } return "hbm:textures/models/CapeUnknown.png"; } @@ -308,5 +314,8 @@ public class ArmorModel extends ItemArmor { if (itemstack.getItem() == ModItems.cape_ayy) { list.add("Only works for dxmaster769"); } + if (itemstack.getItem() == ModItems.cape_nostalgia) { + list.add("Only works for Dr_Nostalgia"); + } } } diff --git a/com/hbm/items/tool/ItemAssemblyTemplate.java b/com/hbm/items/tool/ItemAssemblyTemplate.java index 0f485f0a3..324c02d21 100644 --- a/com/hbm/items/tool/ItemAssemblyTemplate.java +++ b/com/hbm/items/tool/ItemAssemblyTemplate.java @@ -94,6 +94,7 @@ public class ItemAssemblyTemplate extends Item { SAT_LASER, SAT_RESONATOR, SAT_FOEQ, + SAT_MINER, CHOPPER_HEAD, CHOPPER_GUN, CHOPPER_BODY, @@ -491,6 +492,8 @@ public class ItemAssemblyTemplate extends Item { return 1000; case SAT_FOEQ: return 1200; + case SAT_MINER: + return 600; case CHOPPER_HEAD: return 300; case CHOPPER_GUN: diff --git a/com/hbm/items/weapon/ItemGunBase.java b/com/hbm/items/weapon/ItemGunBase.java index 71244542b..352e4d843 100644 --- a/com/hbm/items/weapon/ItemGunBase.java +++ b/com/hbm/items/weapon/ItemGunBase.java @@ -389,7 +389,7 @@ public class ItemGunBase extends Item implements IHoldableWeapon { @Override public Crosshair getCrosshair() { - return Crosshair.L_CLASSIC; + return mainConfig.crosshair; } } diff --git a/com/hbm/lib/HbmWorldGen.java b/com/hbm/lib/HbmWorldGen.java index 12411a4fb..9c44ce03f 100644 --- a/com/hbm/lib/HbmWorldGen.java +++ b/com/hbm/lib/HbmWorldGen.java @@ -63,6 +63,16 @@ public class HbmWorldGen implements IWorldGenerator { (new WorldGenMinable(ModBlocks.ore_uranium, 5)).generate(world, rand, randPosX, randPosY, randPosZ); } + for (int k = 0; k < MainRegistry.thoriumSpawn; k++) { + int randPosX = i + rand.nextInt(16); + // Max height of generation + int randPosY = rand.nextInt(30); + int randPosZ = j + rand.nextInt(16); + + // Ore, amount of ore in one stain + (new WorldGenMinable(ModBlocks.ore_thorium, 5)).generate(world, rand, randPosX, randPosY, randPosZ); + } + for (int k = 0; k < MainRegistry.titaniumSpawn; k++) { int randPosX = i + rand.nextInt(16); int randPosY = rand.nextInt(35); diff --git a/com/hbm/lib/Library.java b/com/hbm/lib/Library.java index 5de485585..22dc40e17 100644 --- a/com/hbm/lib/Library.java +++ b/com/hbm/lib/Library.java @@ -69,6 +69,7 @@ public class Library { public static String LordVertice = "a41df45e-13d8-4677-9398-090d3882b74f"; public static String CodeRed_ = "912ec334-e920-4dd7-8338-4d9b2d42e0a1"; public static String dxmaster769 = "62c168b2-d11d-4dbf-9168-c6cea3dcb20e"; + public static String nostalgia = "e82684a7-30f1-44d2-ab37-41b342be1bbd"; public static List superuser = new ArrayList(); diff --git a/com/hbm/main/ClientProxy.java b/com/hbm/main/ClientProxy.java index 06efb3a55..62c7795d6 100644 --- a/com/hbm/main/ClientProxy.java +++ b/com/hbm/main/ClientProxy.java @@ -345,6 +345,7 @@ public class ClientProxy extends ServerProxy RenderingRegistry.registerEntityRenderingHandler(EntityBomber.class, new RenderBomber()); RenderingRegistry.registerEntityRenderingHandler(EntityBurningFOEQ.class, new RenderFOEQ()); RenderingRegistry.registerEntityRenderingHandler(EntityFallingNuke.class, new RenderFallingNuke()); + RenderingRegistry.registerEntityRenderingHandler(EntityMinerRocket.class, new RenderMinerRocket()); RenderingRegistry.registerEntityRenderingHandler(EntityMissileTaint.class, new RenderMissileTaint()); RenderingRegistry.registerEntityRenderingHandler(EntityMissileMicro.class, new RenderMissileTaint()); diff --git a/com/hbm/main/CraftingManager.java b/com/hbm/main/CraftingManager.java index 77aa0dd1d..9a70b03ec 100644 --- a/com/hbm/main/CraftingManager.java +++ b/com/hbm/main/CraftingManager.java @@ -1051,6 +1051,7 @@ public class CraftingManager { //GameRegistry.addRecipe(new ItemStack(Item.getItemFromBlock(ModBlocks.nuke_custom), 1), new Object[] { "ADD", "HHF", "CDD", 'A', ModItems.wire_gold, 'H', ModItems.hull_small_steel, 'C', ModItems.circuit_gold, 'F', ModItems.fins_small_steel, 'D', new ItemStack(Items.dye, 1, 8) }); //GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(Item.getItemFromBlock(ModBlocks.launch_pad), 1), new Object[] { "PPP", "ICI", "CBC", 'P', "plateSteel", 'I', "ingotSteel", 'C', ModItems.circuit_gold, 'B', Item.getItemFromBlock(ModBlocks.machine_battery) })); + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModBlocks.sat_dock, 1), new Object[] { "SSS", "PCP", 'S', "ingotSteel", 'P', "ingotPolymer", 'C', ModBlocks.crate_iron })); GameRegistry.addRecipe(new ItemStack(Item.getItemFromBlock(ModBlocks.book_guide), 1), new Object[] { "IBI", "LBL", "IBI", 'B', Items.book, 'I', new ItemStack(Items.dye, 1, 0), 'L', new ItemStack(Items.dye, 1, 4) }); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(Item.getItemFromBlock(ModBlocks.rail_highspeed), 16), new Object[] { "S S", "SIS", "S S", 'S', "ingotSteel", 'I', "plateIron" })); @@ -1271,6 +1272,7 @@ public class CraftingManager { GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.cape_codered_, 1), new Object[] { "W W", "WIW", "WDW", 'W', new ItemStack(Item.getItemFromBlock(Blocks.wool), 1, 6), 'D', new ItemStack(Items.dye, 1, 5), 'I', "ingotAustralium" })); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.cape_vertice, 1), new Object[] { "W W", "WIW", "WDW", 'W', new ItemStack(Item.getItemFromBlock(Blocks.wool), 1, 13), 'D', new ItemStack(Items.dye, 1, 8), 'I', "ingotVerticium" })); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.cape_ayy, 1), new Object[] { "W W", "WIW", "WDW", 'W', new ItemStack(Item.getItemFromBlock(Blocks.wool), 1, 15), 'D', new ItemStack(Items.dye, 1, 8), 'I', "ingotReiium" })); + GameRegistry.addRecipe(new ItemStack(ModItems.cape_nostalgia, 1), new Object[] { "W W", "WIW", "WDW", 'W', new ItemStack(Item.getItemFromBlock(Blocks.wool), 1, 15), 'D', new ItemStack(Items.dye, 1, 6), 'I', ModItems.flame_pony }); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.igniter, 1), new Object[] { " W", "SC", "CE", 'S', "plateSteel", 'W', ModItems.wire_schrabidium, 'C', ModItems.circuit_schrabidium, 'E', ModItems.ingot_euphemium })); GameRegistry.addRecipe(new ItemStack(ModItems.euphemium_helmet, 1), new Object[] { "EEE", "E E", 'E', ModItems.plate_euphemium }); diff --git a/com/hbm/main/MainRegistry.java b/com/hbm/main/MainRegistry.java index 56bf667dc..1c45bdc53 100644 --- a/com/hbm/main/MainRegistry.java +++ b/com/hbm/main/MainRegistry.java @@ -121,6 +121,7 @@ import com.hbm.entity.missile.EntityBombletTheta; import com.hbm.entity.missile.EntityBooster; import com.hbm.entity.missile.EntityCarrier; import com.hbm.entity.missile.EntityMIRV; +import com.hbm.entity.missile.EntityMinerRocket; import com.hbm.entity.missile.EntityMissileAntiBallistic; import com.hbm.entity.missile.EntityMissileBHole; import com.hbm.entity.missile.EntityMissileBunkerBuster; @@ -497,8 +498,11 @@ public class MainRegistry public static boolean enableSpecialMeteors = true; public static boolean enableBomberShortMode = false; public static boolean enableVaults = true; - - public static int uraniumSpawn = 7; + public static boolean enableRads = true; + public static boolean enableCataclysm = true; + + public static int uraniumSpawn = 6; + public static int thoriumSpawn = 7; public static int titaniumSpawn = 8; public static int sulfurSpawn = 5; public static int aluminiumSpawn = 7; @@ -892,6 +896,7 @@ public class MainRegistry EntityRegistry.registerModEntity(EntityGrenadeIFNull.class, "entity_grenade_ironshod", 129, this, 250, 1, true); EntityRegistry.registerModEntity(EntityFallingNuke.class, "entity_falling_bomb", 130, this, 1000, 1, true); EntityRegistry.registerModEntity(EntityBulletBase.class, "entity_bullet_mk2", 131, this, 250, 1, true); + EntityRegistry.registerModEntity(EntityMinerRocket.class, "entity_miner_lander", 132, this, 1000, 1, true); EntityRegistry.registerGlobalEntityID(EntityNuclearCreeper.class, "entity_mob_nuclear_creeper", EntityRegistry.findGlobalUniqueEntityId(), 0x204131, 0x75CE00); EntityRegistry.registerGlobalEntityID(EntityTaintedCreeper.class, "entity_mob_tainted_creeper", EntityRegistry.findGlobalUniqueEntityId(), 0x813b9b, 0xd71fdd); @@ -1609,6 +1614,16 @@ public class MainRegistry HazmatRegistry.instance.registerHazmat(ModItems.steel_legs, 0.06F); HazmatRegistry.instance.registerHazmat(ModItems.steel_boots, 0.02F); + HazmatRegistry.instance.registerHazmat(Items.iron_helmet, 0.04F); + HazmatRegistry.instance.registerHazmat(Items.iron_chestplate, 0.08F); + HazmatRegistry.instance.registerHazmat(Items.iron_leggings, 0.06F); + HazmatRegistry.instance.registerHazmat(Items.iron_boots, 0.02F); + + HazmatRegistry.instance.registerHazmat(Items.golden_helmet, 0.04F); + HazmatRegistry.instance.registerHazmat(Items.golden_chestplate, 0.08F); + HazmatRegistry.instance.registerHazmat(Items.golden_leggings, 0.06F); + HazmatRegistry.instance.registerHazmat(Items.golden_boots, 0.02F); + HazmatRegistry.instance.registerHazmat(ModItems.alloy_helmet, 0.08F); HazmatRegistry.instance.registerHazmat(ModItems.alloy_plate, 0.16F); HazmatRegistry.instance.registerHazmat(ModItems.alloy_legs, 0.12F); @@ -1700,8 +1715,10 @@ public class MainRegistry enableSpecialMeteors = config.get(Configuration.CATEGORY_GENERAL, "1.13_enableSpecialMeteors", false).getBoolean(false); enableBomberShortMode = config.get(Configuration.CATEGORY_GENERAL, "1.14_enableBomberShortMode", false).getBoolean(false); enableVaults = config.get(Configuration.CATEGORY_GENERAL, "1.15_enableVaultSpawn", true).getBoolean(true); + enableRads = config.get(Configuration.CATEGORY_GENERAL, "1.16_enableNewRadiation", true).getBoolean(true); + enableCataclysm = config.get(Configuration.CATEGORY_GENERAL, "1.17_enableCataclysm", false).getBoolean(false); - Property PuraniumSpawn = config.get(Configuration.CATEGORY_GENERAL, "2.00_uraniumSpawnrate", 7); + Property PuraniumSpawn = config.get(Configuration.CATEGORY_GENERAL, "2.00_uraniumSpawnrate", 6); PuraniumSpawn.comment = "Ammount of uranium ore veins per chunk"; uraniumSpawn = PuraniumSpawn.getInt(); Property PtitaniumSpawn = config.get(Configuration.CATEGORY_GENERAL, "2.01_titaniumSpawnrate", 8); @@ -1731,6 +1748,9 @@ public class MainRegistry Property PberylliumSpawn = config.get(Configuration.CATEGORY_GENERAL, "2.09_berylliumSpawnrate", 6); PberylliumSpawn.comment = "Ammount of beryllium ore veins per chunk"; berylliumSpawn = PberylliumSpawn.getInt(); + Property PthoriumSpawn = config.get(Configuration.CATEGORY_GENERAL, "2.10_thoriumSpawnrate", 7); + PthoriumSpawn.comment = "Ammount of thorium ore veins per chunk"; + thoriumSpawn = PthoriumSpawn.getInt(); Property propGadget = config.get(Configuration.CATEGORY_GENERAL, "3.00_gadgetRadius", 150); propGadget.comment = "Radius of the Gadget"; diff --git a/com/hbm/main/ModEventHandler.java b/com/hbm/main/ModEventHandler.java index 3ae9c6f6d..3d907c3ec 100644 --- a/com/hbm/main/ModEventHandler.java +++ b/com/hbm/main/ModEventHandler.java @@ -66,11 +66,15 @@ public class ModEventHandler RadEntitySavedData eData = RadEntitySavedData.getData(event.entityLiving.worldObj); eData.setRadForEntity(event.entityLiving, 0); - if(event.entity.getUniqueID().toString().equals(Library.HbMinecraft)) { + if(MainRegistry.enableCataclysm) { EntityBurningFOEQ foeq = new EntityBurningFOEQ(event.entity.worldObj); foeq.setPositionAndRotation(event.entity.posX, 500, event.entity.posZ, 0.0F, 0.0F); event.entity.worldObj.spawnEntityInWorld(foeq); } + + if(event.entity.getUniqueID().toString().equals(Library.HbMinecraft)) { + + } } @SubscribeEvent @@ -137,7 +141,7 @@ public class ModEventHandler if(meteorShower > 0) { meteorShower--; - if(meteorShower == 0) + if(meteorShower == 0 && MainRegistry.enableDebugMode) MainRegistry.logger.info("Ended meteor shower."); } @@ -145,11 +149,13 @@ public class ModEventHandler meteorShower = (int)(MainRegistry.meteorShowerDuration * 0.75 + MainRegistry.meteorShowerDuration * 0.25 * event.world.rand.nextFloat()); - MainRegistry.logger.info("Started meteor shower! Duration: " + meteorShower); + + if(MainRegistry.enableDebugMode) + MainRegistry.logger.info("Started meteor shower! Duration: " + meteorShower); } } - if(event.world != null && !event.world.isRemote) { + if(event.world != null && !event.world.isRemote && MainRegistry.enableRads) { if(!event.world.loadedEntityList.isEmpty()) { RadiationSavedData data = RadiationSavedData.getData(event.world); diff --git a/com/hbm/main/ResourceManager.java b/com/hbm/main/ResourceManager.java index e23b99b77..8446204cc 100644 --- a/com/hbm/main/ResourceManager.java +++ b/com/hbm/main/ResourceManager.java @@ -297,6 +297,7 @@ public class ResourceManager { public static final IModelCustom missileTaint = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missileTaint.obj")); public static final IModelCustom missileCarrier = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missileCarrier.obj")); public static final IModelCustom missileBooster = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missileBooster.obj")); + public static final IModelCustom minerRocket = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/minerRocket.obj")); ////Texture Entities @@ -329,7 +330,7 @@ public class ResourceManager { public static final ResourceLocation missileHuge_CL_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missileHuge_CL.png"); public static final ResourceLocation missileHuge_BU_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missileHuge_BU.png"); public static final ResourceLocation missileNuclear_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missileNeon.png"); - public static final ResourceLocation missileMIRV_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missileMIRV.png"); + public static final ResourceLocation missileMIRV_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missileNeonH.png"); public static final ResourceLocation missileEndo_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missileEndo.png"); public static final ResourceLocation missileExo_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missileExo.png"); public static final ResourceLocation missileDoomsday_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missileDoomsday.png"); @@ -337,6 +338,7 @@ public class ResourceManager { public static final ResourceLocation missileMicro_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missileMicro.png"); public static final ResourceLocation missileCarrier_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missileCarrier.png"); public static final ResourceLocation missileBooster_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missileBooster.png"); + public static final ResourceLocation minerRocket_tex = new ResourceLocation(RefStrings.MODID, "textures/models/minerRocket.png"); public static final ResourceLocation missileMicroBHole_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missileMicroBHole.png"); public static final ResourceLocation missileMicroSchrab_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missileMicroSchrab.png"); public static final ResourceLocation missileMicroEMP_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missileMicroEMP.png"); diff --git a/com/hbm/packet/AuxButtonPacket.java b/com/hbm/packet/AuxButtonPacket.java index 41358b54d..434443a60 100644 --- a/com/hbm/packet/AuxButtonPacket.java +++ b/com/hbm/packet/AuxButtonPacket.java @@ -107,12 +107,10 @@ public class AuxButtonPacket implements IMessage { if(m.id == 0) { radio.isOn = (m.value == 1); - System.out.println("Radio is now " + radio.isOn); } if(m.id == 1) { radio.freq = ((double)m.value) / 10D; - System.out.println("Radio is now " + radio.freq); } } @@ -133,8 +131,6 @@ public class AuxButtonPacket implements IMessage { if (reac instanceof TileEntityMachineReactorSmall) { TileEntityMachineReactorSmall reactor = (TileEntityMachineReactorSmall)reac; - - System.out.println(m.id + "/" + m.value); if(m.id == 0) reactor.retracting = m.value == 0; diff --git a/com/hbm/render/entity/RenderMinerRocket.java b/com/hbm/render/entity/RenderMinerRocket.java new file mode 100644 index 000000000..dfae5a323 --- /dev/null +++ b/com/hbm/render/entity/RenderMinerRocket.java @@ -0,0 +1,33 @@ +package com.hbm.render.entity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.ResourceManager; + +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderMinerRocket extends Render { + + @Override + public void doRender(Entity p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, + float p_76986_9_) { + + GL11.glPushMatrix(); + GL11.glTranslatef((float)p_76986_2_, (float)p_76986_4_, (float)p_76986_6_); + //GL11.glRotated(180, 0, 0, 1); + GL11.glDisable(GL11.GL_CULL_FACE); + + bindTexture(ResourceManager.minerRocket_tex); + ResourceManager.minerRocket.renderAll(); + + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glPopMatrix(); + } + + @Override + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + return ResourceManager.minerRocket_tex; + } +} diff --git a/com/hbm/render/entity/RenderMissileMirv.java b/com/hbm/render/entity/RenderMissileMirv.java index 30d22a2bc..d12835304 100644 --- a/com/hbm/render/entity/RenderMissileMirv.java +++ b/com/hbm/render/entity/RenderMissileMirv.java @@ -22,10 +22,10 @@ public class RenderMissileMirv extends Render { GL11.glTranslatef((float)p_76986_2_, (float)p_76986_4_, (float)p_76986_6_); GL11.glRotatef(p_76986_1_.prevRotationYaw + (p_76986_1_.rotationYaw - p_76986_1_.prevRotationYaw) * p_76986_9_ - 90.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(p_76986_1_.prevRotationPitch + (p_76986_1_.rotationPitch - p_76986_1_.prevRotationPitch) * p_76986_9_, 0.0F, 0.0F, 1.0F); - GL11.glScalef(2F, 2F, 2F); + GL11.glScalef(1.5F, 1.5F, 1.5F); bindTexture(ResourceManager.missileMIRV_tex); - ResourceManager.missileMIRV.renderAll(); + ResourceManager.missileNuclear.renderAll(); GL11.glPopMatrix(); } diff --git a/com/hbm/render/tileentity/RenderLaunchPadTier1.java b/com/hbm/render/tileentity/RenderLaunchPadTier1.java index 660cc311f..9acfc2904 100644 --- a/com/hbm/render/tileentity/RenderLaunchPadTier1.java +++ b/com/hbm/render/tileentity/RenderLaunchPadTier1.java @@ -148,9 +148,9 @@ public class RenderLaunchPadTier1 extends TileEntitySpecialRenderer { } if(state == 16) { - GL11.glScalef(2F, 2F, 2F); + GL11.glScalef(1.5F, 1.5F, 1.5F); bindTexture(ResourceManager.missileMIRV_tex); - ResourceManager.missileMIRV.renderAll(); + ResourceManager.missileNuclear.renderAll(); } if(state == 17) { diff --git a/com/hbm/saveddata/RadiationSavedData.java b/com/hbm/saveddata/RadiationSavedData.java index a9964182a..6218cbe2e 100644 --- a/com/hbm/saveddata/RadiationSavedData.java +++ b/com/hbm/saveddata/RadiationSavedData.java @@ -204,8 +204,6 @@ public class RadiationSavedData extends WorldSavedData { } else { data.setRadForCoord(chunk.xPosition, chunk.zPosition, 0); } - - System.out.println(r); } } diff --git a/com/hbm/saveddata/SatelliteSaveStructure.java b/com/hbm/saveddata/SatelliteSaveStructure.java index 705fd5642..eac519be2 100644 --- a/com/hbm/saveddata/SatelliteSaveStructure.java +++ b/com/hbm/saveddata/SatelliteSaveStructure.java @@ -34,7 +34,9 @@ public class SatelliteSaveStructure { //Death ray LASER, //Allows use of AMS - RESONATOR; + RESONATOR, + //Farms ores for free + MINER; public static SatelliteType getEnum(int i) { if(i < SatelliteType.values().length) diff --git a/com/hbm/tileentity/bomb/TileEntityNukeN45.java b/com/hbm/tileentity/bomb/TileEntityNukeN45.java index cf90c8dea..aa5108bc2 100644 --- a/com/hbm/tileentity/bomb/TileEntityNukeN45.java +++ b/com/hbm/tileentity/bomb/TileEntityNukeN45.java @@ -243,7 +243,7 @@ public class TileEntityNukeN45 extends TileEntity implements ISidedInventory { if(!world.isRemote) { world.setBlockToAir(x, y, z); - System.out.println(type); + //System.out.println(type); switch(type) { case 1: diff --git a/com/hbm/tileentity/machine/TileEntityMachineReactorSmall.java b/com/hbm/tileentity/machine/TileEntityMachineReactorSmall.java index a7987049c..a68fd56b9 100644 --- a/com/hbm/tileentity/machine/TileEntityMachineReactorSmall.java +++ b/com/hbm/tileentity/machine/TileEntityMachineReactorSmall.java @@ -640,7 +640,7 @@ public class TileEntityMachineReactorSmall extends TileEntity // itemstack in slots[id] has to contain ItemFuelRod item private void onRunOut(int id) { - System.out.println("aaa"); + //System.out.println("aaa"); Item item = slots[id].getItem(); diff --git a/com/hbm/tileentity/machine/TileEntityMachineSatDock.java b/com/hbm/tileentity/machine/TileEntityMachineSatDock.java index 3ce084e4b..7c3645de1 100644 --- a/com/hbm/tileentity/machine/TileEntityMachineSatDock.java +++ b/com/hbm/tileentity/machine/TileEntityMachineSatDock.java @@ -1,11 +1,391 @@ package com.hbm.tileentity.machine; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import com.hbm.entity.missile.EntityMinerRocket; +import com.hbm.handler.FluidTypeHandler.FluidType; +import com.hbm.interfaces.IConsumer; +import com.hbm.interfaces.IFluidAcceptor; +import com.hbm.interfaces.IFluidContainer; +import com.hbm.inventory.FluidTank; +import com.hbm.inventory.MachineRecipes; +import com.hbm.inventory.MachineRecipes.GasCentOutput; +import com.hbm.items.ModItems; +import com.hbm.items.tool.ItemSatChip; +import com.hbm.lib.Library; +import com.hbm.packet.AuxElectricityPacket; +import com.hbm.packet.AuxGaugePacket; +import com.hbm.packet.LoopedSoundPacket; +import com.hbm.packet.PacketDispatcher; +import com.hbm.saveddata.SatelliteSaveStructure; +import com.hbm.saveddata.SatelliteSaveStructure.SatelliteType; +import com.hbm.saveddata.SatelliteSavedData; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; -public class TileEntityMachineSatDock extends TileEntity { +public class TileEntityMachineSatDock extends TileEntity implements ISidedInventory { + + private ItemStack slots[]; + + private static final int[] access = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }; + + private String customName; + + public TileEntityMachineSatDock() { + slots = new ItemStack[16]; + } + + @Override + public int getSizeInventory() { + return slots.length; + } + + @Override + public ItemStack getStackInSlot(int i) { + return slots[i]; + } + + @Override + public ItemStack getStackInSlotOnClosing(int i) { + if(slots[i] != null) + { + ItemStack itemStack = slots[i]; + slots[i] = null; + return itemStack; + } else { + return null; + } + } + + @Override + public void setInventorySlotContents(int i, ItemStack itemStack) { + slots[i] = itemStack; + if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) + { + itemStack.stackSize = getInventoryStackLimit(); + } + } + + @Override + public String getInventoryName() { + return this.hasCustomInventoryName() ? this.customName : "container.satDock"; + } + + @Override + public boolean hasCustomInventoryName() { + return this.customName != null && this.customName.length() > 0; + } + + public void setCustomName(String name) { + this.customName = name; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) + { + return false; + }else{ + return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=64; + } + } + + //You scrubs aren't needed for anything (right now) + @Override + public void openInventory() {} + @Override + public void closeInventory() {} + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemStack) { + if(i == 2 || i == 3 || i == 4 || i == 5) + { + return false; + } + + return true; + } + + @Override + public ItemStack decrStackSize(int i, int j) { + if(slots[i] != null) + { + if(slots[i].stackSize <= j) + { + ItemStack itemStack = slots[i]; + slots[i] = null; + return itemStack; + } + ItemStack itemStack1 = slots[i].splitStack(j); + if (slots[i].stackSize == 0) + { + slots[i] = null; + } + + return itemStack1; + } else { + return null; + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + NBTTagList list = nbt.getTagList("items", 10); + + slots = new ItemStack[getSizeInventory()]; + + for(int i = 0; i < list.tagCount(); i++) + { + NBTTagCompound nbt1 = list.getCompoundTagAt(i); + byte b0 = nbt1.getByte("slot"); + if(b0 >= 0 && b0 < slots.length) + { + slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); + } + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + NBTTagList list = new NBTTagList(); + + for(int i = 0; i < slots.length; i++) + { + if(slots[i] != null) + { + NBTTagCompound nbt1 = new NBTTagCompound(); + nbt1.setByte("slot", (byte)i); + slots[i].writeToNBT(nbt1); + list.appendTag(nbt1); + } + } + nbt.setTag("items", list); + } + + @Override + public int[] getAccessibleSlotsFromSide(int p_94128_1_) + { + return access; + } + + @Override + public boolean canInsertItem(int i, ItemStack itemStack, int j) { + return this.isItemValidForSlot(i, itemStack); + } + + @Override + public boolean canExtractItem(int i, ItemStack itemStack, int j) { + return true; + } + + SatelliteSavedData data = null; + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(data == null) + data = (SatelliteSavedData)worldObj.perWorldStorage.loadData(SatelliteSavedData.class, "satellites"); + + if(data == null) { + worldObj.perWorldStorage.setData("satellites", new SatelliteSavedData(worldObj)); + data = (SatelliteSavedData)worldObj.perWorldStorage.loadData(SatelliteSavedData.class, "satellites"); + } + data.markDirty(); + + if(data != null && slots[15] != null) { + int freq = ItemSatChip.getFreq(slots[15]); + + SatelliteSaveStructure sat = data.getSatFromFreq(freq); + + int delay = 10 * 60 * 1000; + + if(sat != null && sat.satelliteID == freq && sat.satelliteType.name().equals(SatelliteType.MINER.name())) { + if(sat.lastOp + delay < System.currentTimeMillis()) { + + EntityMinerRocket rocket = new EntityMinerRocket(worldObj); + rocket.posX = xCoord + 0.5; + rocket.posY = 300; + rocket.posZ = zCoord + 0.5; + worldObj.spawnEntityInWorld(rocket); + sat.lastOp = System.currentTimeMillis(); + data.markDirty(); + } + } + } + + List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, AxisAlignedBB.getBoundingBox(xCoord - 0.25 + 0.5, yCoord + 0.75, zCoord - 0.25 + 0.5, xCoord + 0.25 + 0.5, yCoord + 2, zCoord + 0.25 + 0.5)); + + for(Entity e : list) { + + if(e instanceof EntityMinerRocket) { + + EntityMinerRocket rocket = (EntityMinerRocket)e; + + if(rocket.getDataWatcher().getWatchableObjectInt(16) == 1 && rocket.timer == 50) { + unloadCargo(); + } + } + } + + ejectInto(xCoord + 2, yCoord, zCoord); + ejectInto(xCoord - 2, yCoord, zCoord); + ejectInto(xCoord, yCoord, zCoord + 2); + ejectInto(xCoord, yCoord, zCoord - 2); + } + } + + static Random rand = new Random(); + + private void unloadCargo() { + + int items = rand.nextInt(6) + 10; + + int randy = 0; + rand = new Random(); + + for(int i = 0; i < items; i++) { + + randy = (int) (rand.nextFloat() * 100); + + if(randy < 10) + addToInv(new ItemStack(ModItems.powder_aluminium, 3)); + else if(randy < 20) + addToInv(new ItemStack(ModItems.powder_iron, 3)); + else if(randy < 30) + addToInv(new ItemStack(ModItems.powder_titanium, 2)); + else if(randy < 45) + addToInv(new ItemStack(ModItems.powder_coal, 4)); + else if(randy < 50) + addToInv(new ItemStack(ModItems.powder_uranium, 2)); + else if(randy < 53) + addToInv(new ItemStack(ModItems.powder_plutonium, 1)); + else if(randy < 58) + addToInv(new ItemStack(ModItems.powder_thorium, 2)); + else if(randy < 60) + addToInv(new ItemStack(ModItems.powder_desh_mix, 3)); + else if(randy < 65) + addToInv(new ItemStack(ModItems.powder_diamond, 2)); + else if(randy < 75) + addToInv(new ItemStack(Items.redstone, 5)); + else if(randy < 77) + addToInv(new ItemStack(ModItems.powder_nitan_mix, 2)); + else if(randy < 80) + addToInv(new ItemStack(ModItems.powder_power, 2)); + else if(randy < 85) + addToInv(new ItemStack(ModItems.powder_copper, 5)); + else if(randy < 90) + addToInv(new ItemStack(ModItems.powder_lead, 3)); + else if(randy < 95) + addToInv(new ItemStack(ModItems.fluorite, 4)); + else if(randy < 99) + addToInv(new ItemStack(ModItems.powder_lapis, 4)); + else + addToInv(new ItemStack(ModItems.powder_combine_steel, 1)); + } + } + + private void addToInv(ItemStack stack) { + + for(int i = 0; i < 15; i++) { + + if(slots[i] != null && slots[i].getItem() == stack.getItem() && slots[i].getItemDamage() == stack.getItemDamage() && + slots[i].stackSize < slots[i].getMaxStackSize()) { + + slots[i].stackSize++; + + return; + } + } + + for(int i = 0; i < 15; i++) { + + if(slots[i] == null) { + slots[i] = new ItemStack(stack.getItem(), 1, stack.getItemDamage()); + return; + } + } + } + + private void ejectInto(int x, int y, int z) { + + TileEntity te = worldObj.getTileEntity(x, y, z); + + if(te instanceof IInventory) { + + IInventory chest = (IInventory)te; + + for(int i = 0; i < 15; i++) { + + if(slots[i] != null) { + + for(int j = 0; j < chest.getSizeInventory(); j++) { + + ItemStack sta = slots[i].copy(); + sta.stackSize = 1; + + if(chest.getStackInSlot(j) != null && chest.getStackInSlot(j).getItem() == slots[i].getItem() && + chest.getStackInSlot(j).getItemDamage() == slots[i].getItemDamage() && + chest.getStackInSlot(j).stackSize < chest.getStackInSlot(j).getMaxStackSize()) { + + slots[i].stackSize--; + + if(slots[i].stackSize <= 0) + slots[i] = null; + + chest.setInventorySlotContents(j, new ItemStack(chest.getStackInSlot(j).getItem(), chest.getStackInSlot(j).stackSize + 1, chest.getStackInSlot(j).getItemDamage())); + return; + } + } + } + } + + for(int i = 0; i < 15; i++) { + + if(slots[i] != null) { + + for(int j = 0; j < chest.getSizeInventory(); j++) { + + ItemStack sta = slots[i].copy(); + sta.stackSize = 1; + + if(chest.getStackInSlot(j) == null && chest.isItemValidForSlot(j, sta)) { + + slots[i].stackSize--; + + if(slots[i].stackSize <= 0) + slots[i] = null; + + chest.setInventorySlotContents(j, new ItemStack(sta.getItem(), 1, sta.getItemDamage())); + return; + } + } + } + } + } + } @Override public AxisAlignedBB getRenderBoundingBox() {