From f02ca71a70e1cba549f142edb7318c8226c25027 Mon Sep 17 00:00:00 2001 From: Cr0s Date: Fri, 8 Aug 2014 15:29:16 +0400 Subject: [PATCH 1/5] Revert "Merging DarkholmeTenk & my branches back to main" --- .gitattributes | 22 - .gitignore | 2 + README.md | 4 +- .../client => client}/ClientProxy.java | 12 +- src/assets/warpdrive/lang/en_US.lang | 33 - .../warpdrive/lua/cloakingdevicecore/cloak1 | 43 - .../warpdrive/lua/cloakingdevicecore/cloak2 | 43 - .../warpdrive/lua/cloakingdevicecore/uncloak | 28 - src/assets/warpdrive/lua/mininglaser/mine | 119 -- src/assets/warpdrive/lua/mininglaser/stop | 48 - src/assets/warpdrive/lua/radar/ping | 42 - src/assets/warpdrive/lua/radar/scan | 101 -- .../warpdrive/lua/warpcontroller/startup | 483 ------- .../warpdrive/sound/{warp_4s.ogg => warp.ogg} | Bin src/assets/warpdrive/sound/warp_10s.ogg | Bin 269977 -> 0 bytes src/assets/warpdrive/sound/warp_30s.ogg | Bin 563717 -> 0 bytes .../warpdrive/textures/blocks/airBlock0.png | Bin 3010 -> 0 bytes .../warpdrive/textures/blocks/airBlock1.png | Bin 3008 -> 0 bytes .../warpdrive/textures/blocks/airBlock10.png | Bin 3007 -> 0 bytes .../warpdrive/textures/blocks/airBlock11.png | Bin 3016 -> 0 bytes .../warpdrive/textures/blocks/airBlock12.png | Bin 3014 -> 0 bytes .../warpdrive/textures/blocks/airBlock13.png | Bin 3011 -> 0 bytes .../warpdrive/textures/blocks/airBlock14.png | Bin 3014 -> 0 bytes .../warpdrive/textures/blocks/airBlock15.png | Bin 3010 -> 0 bytes .../warpdrive/textures/blocks/airBlock2.png | Bin 2999 -> 0 bytes .../warpdrive/textures/blocks/airBlock3.png | Bin 3009 -> 0 bytes .../warpdrive/textures/blocks/airBlock4.png | Bin 3008 -> 0 bytes .../warpdrive/textures/blocks/airBlock5.png | Bin 3001 -> 0 bytes .../warpdrive/textures/blocks/airBlock6.png | Bin 3001 -> 0 bytes .../warpdrive/textures/blocks/airBlock7.png | Bin 3007 -> 0 bytes .../warpdrive/textures/blocks/airBlock8.png | Bin 3008 -> 0 bytes .../warpdrive/textures/blocks/airBlock9.png | Bin 3009 -> 0 bytes .../textures/blocks/airgenTopActive.png | Bin 0 -> 2027 bytes .../warpdrive/textures/blocks/camOverlay.png | Bin 1306 -> 1301 bytes .../textures/blocks/cloakCoilTop.png | Bin 734 -> 0 bytes .../blocks/componentInterfaceComputer.psd | Bin 25298 -> 0 bytes .../blocks/contSideActive0.png.mcmeta | 5 - .../textures/blocks/coreSideHeated.png | Bin 1213 -> 0 bytes .../textures/blocks/coreSideHeated.png.mcmeta | 4 - .../warpdrive/textures/blocks/energy.png | Bin 0 -> 5892 bytes .../textures/blocks/energy_green.png | Bin 0 -> 5768 bytes .../warpdrive/textures/blocks/energy_grey.png | Bin 5692 -> 0 bytes .../textures/blocks/energy_orange.png | Bin 0 -> 5432 bytes .../warpdrive/textures/blocks/energy_red.png | Bin 0 -> 5816 bytes .../warpdrive/textures/blocks/energy_sy.png | Bin 0 -> 5662 bytes .../textures/blocks/energy_violet.png | Bin 0 -> 5834 bytes .../textures/blocks/energy_yellow.png | Bin 0 -> 5465 bytes .../textures/blocks/laserTreeFarmSide0.png | Bin 3153 -> 0 bytes .../textures/blocks/lasercamOverlay.png | Bin 1335 -> 1279 bytes .../textures/blocks/miningLaserSide0.png | Bin 0 -> 545 bytes .../textures/blocks/miningLaser_idle.png | Bin 477 -> 0 bytes .../blocks/miningLaser_miningLowPower.png | Bin 441 -> 0 bytes .../blocks/miningLaser_miningPowered.png | Bin 410 -> 0 bytes .../blocks/miningLaser_scanningLowPower.png | Bin 446 -> 0 bytes .../blocks/miningLaser_scanningPowered.png | Bin 423 -> 0 bytes .../textures/blocks/powerLaserActive.png | Bin 5043 -> 0 bytes .../blocks/powerLaserActive.png.mcmeta | 4 - .../textures/blocks/powerLaserActive.psd | Bin 129026 -> 0 bytes .../textures/blocks/powerLaserSides.png | Bin 3297 -> 0 bytes .../textures/blocks/powerLaserTopBottom.png | Bin 3155 -> 0 bytes .../textures/blocks/reactorMonitor.png | Bin 2915 -> 0 bytes .../textures/blocks/reactorMonitor.psd | Bin 23630 -> 0 bytes .../textures/blocks/reactorSide00.png | Bin 4460 -> 0 bytes .../textures/blocks/reactorSide00.png.mcmeta | 1 - .../textures/blocks/reactorSide01.png | Bin 4502 -> 0 bytes .../textures/blocks/reactorSide01.png.mcmeta | 1 - .../textures/blocks/reactorSide02.png | Bin 4499 -> 0 bytes .../textures/blocks/reactorSide02.png.mcmeta | 1 - .../textures/blocks/reactorSide03.png | Bin 4483 -> 0 bytes .../textures/blocks/reactorSide03.png.mcmeta | 1 - .../textures/blocks/reactorSide10.png | Bin 4475 -> 0 bytes .../textures/blocks/reactorSide10.png.mcmeta | 1 - .../textures/blocks/reactorSide11.png | Bin 4526 -> 0 bytes .../textures/blocks/reactorSide11.png.mcmeta | 1 - .../textures/blocks/reactorSide12.png | Bin 4515 -> 0 bytes .../textures/blocks/reactorSide12.png.mcmeta | 1 - .../textures/blocks/reactorSide13.png | Bin 4530 -> 0 bytes .../textures/blocks/reactorSide13.png.mcmeta | 1 - .../textures/blocks/reactorSide20.png | Bin 4492 -> 0 bytes .../textures/blocks/reactorSide20.png.mcmeta | 1 - .../textures/blocks/reactorSide21.png | Bin 4532 -> 0 bytes .../textures/blocks/reactorSide21.png.mcmeta | 1 - .../textures/blocks/reactorSide22.png | Bin 4513 -> 0 bytes .../textures/blocks/reactorSide22.png.mcmeta | 1 - .../textures/blocks/reactorSide23.png | Bin 4531 -> 0 bytes .../textures/blocks/reactorSide23.png.mcmeta | 1 - .../textures/blocks/reactorSide30.png | Bin 4492 -> 0 bytes .../textures/blocks/reactorSide30.png.mcmeta | 1 - .../textures/blocks/reactorSide31.png | Bin 4516 -> 0 bytes .../textures/blocks/reactorSide31.png.mcmeta | 1 - .../textures/blocks/reactorSide32.png | Bin 4516 -> 0 bytes .../textures/blocks/reactorSide32.png.mcmeta | 1 - .../textures/blocks/reactorSide33.png | Bin 4519 -> 0 bytes .../textures/blocks/reactorSide33.png.mcmeta | 1 - .../textures/blocks/reactorSideBase.psd | Bin 91230 -> 0 bytes .../warpdrive/textures/blocks/reactorTB.png | Bin 3704 -> 0 bytes .../textures/blocks/transporterBottom.png | Bin 2823 -> 0 bytes .../textures/blocks/transporterSide.png | Bin 3054 -> 0 bytes .../textures/blocks/transporterTop.png | Bin 2903 -> 0 bytes .../textures/items/componentEmptyCore.PSD | Bin 27718 -> 0 bytes .../textures/items/componentEmptyCore.png | Bin 3077 -> 0 bytes .../items/componentInterfaceComputer.png | Bin 3013 -> 0 bytes .../items/componentInterfaceComputer.psd | Bin 24864 -> 0 bytes .../items/componentInterfacePower.png | Bin 3249 -> 0 bytes .../items/componentInterfacePower.psd | Bin 26744 -> 0 bytes .../textures/items/componentLaserCore.png | Bin 3316 -> 0 bytes .../textures/items/componentLaserCore.psd | Bin 38463 -> 0 bytes .../textures/items/componentReactorCore.png | Bin 3356 -> 0 bytes .../textures/items/componentReactorCore.psd | Bin 41835 -> 0 bytes .../textures/items/componentTeleCore.png | Bin 3315 -> 0 bytes .../textures/items/componentTeleCore.psd | Bin 41849 -> 0 bytes .../textures/items/componentWarpCore.png | Bin 3401 -> 0 bytes .../textures/items/componentWarpCore.psd | Bin 36860 -> 0 bytes .../warpdrive/textures/items/reactorFocus.png | Bin 3079 -> 0 bytes .../warpdrive/textures/items/reactorFocus.psd | Bin 23650 -> 0 bytes src/cr0s/WarpDrive/BlockAir.java | 549 ++++---- .../{machines => }/BlockAirGenerator.java | 67 +- src/cr0s/WarpDrive/BlockCamera.java | 64 + src/cr0s/WarpDrive/BlockCloakingCoil.java | 72 + .../WarpDrive/BlockCloakingDeviceCore.java | 98 ++ src/cr0s/WarpDrive/BlockGas.java | 105 +- src/cr0s/WarpDrive/BlockIridium.java | 8 +- .../WarpDrive/{machines => }/BlockLaser.java | 33 +- src/cr0s/WarpDrive/BlockLaserCam.java | 64 + .../WarpDrive/{machines => }/BlockLift.java | 67 +- ...serTreeFarm.java => BlockMiningLaser.java} | 46 +- src/cr0s/WarpDrive/BlockMonitor.java | 112 ++ src/cr0s/WarpDrive/BlockParticleBooster.java | 118 ++ src/cr0s/WarpDrive/BlockProtocol.java | 117 ++ .../WarpDrive/{machines => }/BlockRadar.java | 83 +- .../{machines => }/BlockReactor.java | 83 +- src/cr0s/WarpDrive/BlockShipScanner.java | 106 ++ .../{machines => }/BlockWarpIsolation.java | 28 +- src/cr0s/WarpDrive/CamRegistry.java | 143 +- src/cr0s/WarpDrive/CamRegistryItem.java | 27 +- src/cr0s/WarpDrive/CameraOverlay.java | 81 +- src/cr0s/WarpDrive/ClientCameraUtils.java | 85 +- src/cr0s/WarpDrive/ClientProxy.java | 20 + src/cr0s/WarpDrive/CloakChunkWatcher.java | 23 +- src/cr0s/WarpDrive/CloakManager.java | 338 +++-- src/cr0s/WarpDrive/CloakedArea.java | 154 +-- src/cr0s/WarpDrive/CommonProxy.java | 11 +- src/cr0s/WarpDrive/DebugCommand.java | 150 --- src/cr0s/WarpDrive/EntityCamera.java | 280 ++-- src/cr0s/WarpDrive/EntityJump.java | 1123 +++++++--------- src/cr0s/WarpDrive/EntitySphereGen.java | 222 ++-- src/cr0s/WarpDrive/EntityStarCore.java | 73 +- src/cr0s/WarpDrive/FXBeam.java | 53 +- src/cr0s/WarpDrive/GenerateCommand.java | 110 +- src/cr0s/WarpDrive/GravityManager.java | 62 +- src/cr0s/WarpDrive/HyperSpaceGenerator.java | 2 +- src/cr0s/WarpDrive/HyperSpaceProvider.java | 12 +- .../WarpDrive/HyperSpaceWorldGenerator.java | 4 +- src/cr0s/WarpDrive/InvisibleCommand.java | 4 + src/cr0s/WarpDrive/JumpGatesRegistry.java | 118 +- src/cr0s/WarpDrive/JumpgateCommand.java | 33 - src/cr0s/WarpDrive/MetaRotations$1.java | 3 +- src/cr0s/WarpDrive/MetaRotations.java | 62 +- src/cr0s/WarpDrive/PacketHandler.java | 331 +++-- src/cr0s/WarpDrive/SoundHandler.java | 19 +- src/cr0s/WarpDrive/SpaceEventHandler.java | 328 ++--- src/cr0s/WarpDrive/SpaceGenerator.java | 5 +- src/cr0s/WarpDrive/SpaceProvider.java | 7 +- src/cr0s/WarpDrive/SpaceSkyRenderer.java | 4 +- src/cr0s/WarpDrive/SpaceTpCommand.java | 50 +- src/cr0s/WarpDrive/SpaceWorldGenerator.java | 516 ++++---- .../WarpDrive/TileEntityAirGenerator.java | 180 +++ src/cr0s/WarpDrive/TileEntityCamera.java | 167 +++ .../TileEntityCloakingDeviceCore.java | 480 +++++++ .../{machines => }/TileEntityLaser.java | 553 +++++--- src/cr0s/WarpDrive/TileEntityLift.java | 343 +++++ src/cr0s/WarpDrive/TileEntityMiningLaser.java | 700 ++++++++++ src/cr0s/WarpDrive/TileEntityMonitor.java | 151 +++ .../WarpDrive/TileEntityParticleBooster.java | 150 +++ src/cr0s/WarpDrive/TileEntityProtocol.java | 683 ++++++++++ src/cr0s/WarpDrive/TileEntityRadar.java | 256 ++++ src/cr0s/WarpDrive/TileEntityReactor.java | 1163 +++++++++++++++++ .../{machines => }/TileEntityShipScanner.java | 299 +++-- src/cr0s/WarpDrive/TransitionPlane.java | 104 -- src/cr0s/WarpDrive/Vector3.java | 68 +- src/cr0s/WarpDrive/WarpCoresRegistry.java | 125 +- src/cr0s/WarpDrive/WarpDrive.java | 820 +++--------- src/cr0s/WarpDrive/WarpDriveConfig.java | 830 ++++-------- src/cr0s/WarpDrive/WarpDriveCreativeTab.java | 31 - .../WarpDrive/WarpDrivePeripheralHandler.java | 18 - src/cr0s/WarpDrive/WorldGenSmallShip.java | 94 +- src/cr0s/WarpDrive/WorldGenStation.java | 3 +- src/cr0s/WarpDrive/WorldGenStructure.java | 16 +- src/cr0s/WarpDrive/api/IBreathingHelmet.java | 8 - .../client/WailaHandler.java-notcompiling | 48 - .../WarpDrive/item/ItemReactorLaserFocus.java | 134 -- .../WarpDrive/item/ItemWarpComponent.java | 124 -- src/cr0s/WarpDrive/machines/BlockCamera.java | 93 -- .../WarpDrive/machines/BlockCloakingCoil.java | 77 -- .../machines/BlockCloakingDeviceCore.java | 100 -- .../WarpDrive/machines/BlockLaserCam.java | 91 -- .../machines/BlockLaserReactorMonitor.java | 38 - .../WarpDrive/machines/BlockMiningLaser.java | 100 -- src/cr0s/WarpDrive/machines/BlockMonitor.java | 106 -- .../machines/BlockParticleBooster.java | 105 -- .../WarpDrive/machines/BlockPowerLaser.java | 86 -- .../WarpDrive/machines/BlockPowerReactor.java | 95 -- .../WarpDrive/machines/BlockProtocol.java | 111 -- .../WarpDrive/machines/BlockShipScanner.java | 96 -- .../WarpDrive/machines/BlockTransporter.java | 67 - .../machines/TileEntityAbstractLaser.java | 8 - .../machines/TileEntityAbstractMiner.java | 549 -------- .../machines/TileEntityAirGenerator.java | 98 -- .../WarpDrive/machines/TileEntityCamera.java | 136 -- .../TileEntityCloakingDeviceCore.java | 466 ------- .../TileEntityLaserReactorMonitor.java | 140 -- .../machines/TileEntityLaserTreeFarm.java | 384 ------ .../WarpDrive/machines/TileEntityLift.java | 173 --- .../machines/TileEntityMiningLaser.java | 795 ----------- .../WarpDrive/machines/TileEntityMonitor.java | 116 -- .../machines/TileEntityParticleBooster.java | 46 - .../machines/TileEntityPowerLaser.java | 215 --- .../machines/TileEntityPowerReactor.java | 599 --------- .../machines/TileEntityProtocol.java | 670 ---------- .../WarpDrive/machines/TileEntityRadar.java | 174 --- .../WarpDrive/machines/TileEntityReactor.java | 1082 --------------- .../machines/TileEntityTransporter.java | 435 ------ src/cr0s/WarpDrive/machines/WarpChunkTE.java | 177 --- src/cr0s/WarpDrive/machines/WarpEnergyTE.java | 167 --- src/cr0s/WarpDrive/machines/WarpTE.java | 51 - src/cr0s/serverMods/AntiFallDamage.java | 42 + src/cr0s/serverMods/CommonProxy.java | 9 + src/cr0s/serverMods/LoginHookClass.java | 135 ++ src/cr0s/serverMods/ServerMods.java | 47 + src/mcmod.info | 21 - 230 files changed, 9066 insertions(+), 13664 deletions(-) delete mode 100644 .gitattributes rename {src/cr0s/WarpDrive/client => client}/ClientProxy.java (74%) delete mode 100644 src/assets/warpdrive/lang/en_US.lang delete mode 100644 src/assets/warpdrive/lua/cloakingdevicecore/cloak1 delete mode 100644 src/assets/warpdrive/lua/cloakingdevicecore/cloak2 delete mode 100644 src/assets/warpdrive/lua/cloakingdevicecore/uncloak delete mode 100644 src/assets/warpdrive/lua/mininglaser/mine delete mode 100644 src/assets/warpdrive/lua/mininglaser/stop delete mode 100644 src/assets/warpdrive/lua/radar/ping delete mode 100644 src/assets/warpdrive/lua/radar/scan delete mode 100644 src/assets/warpdrive/lua/warpcontroller/startup rename src/assets/warpdrive/sound/{warp_4s.ogg => warp.ogg} (100%) delete mode 100644 src/assets/warpdrive/sound/warp_10s.ogg delete mode 100644 src/assets/warpdrive/sound/warp_30s.ogg delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock0.png delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock1.png delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock10.png delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock11.png delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock12.png delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock13.png delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock14.png delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock15.png delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock2.png delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock3.png delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock4.png delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock5.png delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock6.png delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock7.png delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock8.png delete mode 100644 src/assets/warpdrive/textures/blocks/airBlock9.png create mode 100644 src/assets/warpdrive/textures/blocks/airgenTopActive.png delete mode 100644 src/assets/warpdrive/textures/blocks/cloakCoilTop.png delete mode 100644 src/assets/warpdrive/textures/blocks/componentInterfaceComputer.psd delete mode 100644 src/assets/warpdrive/textures/blocks/contSideActive0.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/coreSideHeated.png delete mode 100644 src/assets/warpdrive/textures/blocks/coreSideHeated.png.mcmeta create mode 100644 src/assets/warpdrive/textures/blocks/energy.png create mode 100644 src/assets/warpdrive/textures/blocks/energy_green.png delete mode 100644 src/assets/warpdrive/textures/blocks/energy_grey.png create mode 100644 src/assets/warpdrive/textures/blocks/energy_orange.png create mode 100644 src/assets/warpdrive/textures/blocks/energy_red.png create mode 100644 src/assets/warpdrive/textures/blocks/energy_sy.png create mode 100644 src/assets/warpdrive/textures/blocks/energy_violet.png create mode 100644 src/assets/warpdrive/textures/blocks/energy_yellow.png delete mode 100644 src/assets/warpdrive/textures/blocks/laserTreeFarmSide0.png create mode 100644 src/assets/warpdrive/textures/blocks/miningLaserSide0.png delete mode 100644 src/assets/warpdrive/textures/blocks/miningLaser_idle.png delete mode 100644 src/assets/warpdrive/textures/blocks/miningLaser_miningLowPower.png delete mode 100644 src/assets/warpdrive/textures/blocks/miningLaser_miningPowered.png delete mode 100644 src/assets/warpdrive/textures/blocks/miningLaser_scanningLowPower.png delete mode 100644 src/assets/warpdrive/textures/blocks/miningLaser_scanningPowered.png delete mode 100644 src/assets/warpdrive/textures/blocks/powerLaserActive.png delete mode 100644 src/assets/warpdrive/textures/blocks/powerLaserActive.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/powerLaserActive.psd delete mode 100644 src/assets/warpdrive/textures/blocks/powerLaserSides.png delete mode 100644 src/assets/warpdrive/textures/blocks/powerLaserTopBottom.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorMonitor.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorMonitor.psd delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide00.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide00.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide01.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide01.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide02.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide02.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide03.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide03.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide10.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide10.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide11.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide11.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide12.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide12.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide13.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide13.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide20.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide20.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide21.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide21.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide22.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide22.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide23.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide23.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide30.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide30.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide31.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide31.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide32.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide32.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide33.png delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSide33.png.mcmeta delete mode 100644 src/assets/warpdrive/textures/blocks/reactorSideBase.psd delete mode 100644 src/assets/warpdrive/textures/blocks/reactorTB.png delete mode 100644 src/assets/warpdrive/textures/blocks/transporterBottom.png delete mode 100644 src/assets/warpdrive/textures/blocks/transporterSide.png delete mode 100644 src/assets/warpdrive/textures/blocks/transporterTop.png delete mode 100644 src/assets/warpdrive/textures/items/componentEmptyCore.PSD delete mode 100644 src/assets/warpdrive/textures/items/componentEmptyCore.png delete mode 100644 src/assets/warpdrive/textures/items/componentInterfaceComputer.png delete mode 100644 src/assets/warpdrive/textures/items/componentInterfaceComputer.psd delete mode 100644 src/assets/warpdrive/textures/items/componentInterfacePower.png delete mode 100644 src/assets/warpdrive/textures/items/componentInterfacePower.psd delete mode 100644 src/assets/warpdrive/textures/items/componentLaserCore.png delete mode 100644 src/assets/warpdrive/textures/items/componentLaserCore.psd delete mode 100644 src/assets/warpdrive/textures/items/componentReactorCore.png delete mode 100644 src/assets/warpdrive/textures/items/componentReactorCore.psd delete mode 100644 src/assets/warpdrive/textures/items/componentTeleCore.png delete mode 100644 src/assets/warpdrive/textures/items/componentTeleCore.psd delete mode 100644 src/assets/warpdrive/textures/items/componentWarpCore.png delete mode 100644 src/assets/warpdrive/textures/items/componentWarpCore.psd delete mode 100644 src/assets/warpdrive/textures/items/reactorFocus.png delete mode 100644 src/assets/warpdrive/textures/items/reactorFocus.psd rename src/cr0s/WarpDrive/{machines => }/BlockAirGenerator.java (67%) create mode 100644 src/cr0s/WarpDrive/BlockCamera.java create mode 100644 src/cr0s/WarpDrive/BlockCloakingCoil.java create mode 100644 src/cr0s/WarpDrive/BlockCloakingDeviceCore.java rename src/cr0s/WarpDrive/{machines => }/BlockLaser.java (60%) create mode 100644 src/cr0s/WarpDrive/BlockLaserCam.java rename src/cr0s/WarpDrive/{machines => }/BlockLift.java (65%) rename src/cr0s/WarpDrive/{machines/BlockLaserTreeFarm.java => BlockMiningLaser.java} (55%) create mode 100644 src/cr0s/WarpDrive/BlockMonitor.java create mode 100644 src/cr0s/WarpDrive/BlockParticleBooster.java create mode 100644 src/cr0s/WarpDrive/BlockProtocol.java rename src/cr0s/WarpDrive/{machines => }/BlockRadar.java (56%) rename src/cr0s/WarpDrive/{machines => }/BlockReactor.java (54%) create mode 100644 src/cr0s/WarpDrive/BlockShipScanner.java rename src/cr0s/WarpDrive/{machines => }/BlockWarpIsolation.java (62%) create mode 100644 src/cr0s/WarpDrive/ClientProxy.java delete mode 100644 src/cr0s/WarpDrive/DebugCommand.java delete mode 100644 src/cr0s/WarpDrive/JumpgateCommand.java create mode 100644 src/cr0s/WarpDrive/TileEntityAirGenerator.java create mode 100644 src/cr0s/WarpDrive/TileEntityCamera.java create mode 100644 src/cr0s/WarpDrive/TileEntityCloakingDeviceCore.java rename src/cr0s/WarpDrive/{machines => }/TileEntityLaser.java (50%) create mode 100644 src/cr0s/WarpDrive/TileEntityLift.java create mode 100644 src/cr0s/WarpDrive/TileEntityMiningLaser.java create mode 100644 src/cr0s/WarpDrive/TileEntityMonitor.java create mode 100644 src/cr0s/WarpDrive/TileEntityParticleBooster.java create mode 100644 src/cr0s/WarpDrive/TileEntityProtocol.java create mode 100644 src/cr0s/WarpDrive/TileEntityRadar.java create mode 100644 src/cr0s/WarpDrive/TileEntityReactor.java rename src/cr0s/WarpDrive/{machines => }/TileEntityShipScanner.java (71%) delete mode 100644 src/cr0s/WarpDrive/TransitionPlane.java delete mode 100644 src/cr0s/WarpDrive/WarpDriveCreativeTab.java delete mode 100644 src/cr0s/WarpDrive/WarpDrivePeripheralHandler.java delete mode 100644 src/cr0s/WarpDrive/api/IBreathingHelmet.java delete mode 100644 src/cr0s/WarpDrive/client/WailaHandler.java-notcompiling delete mode 100644 src/cr0s/WarpDrive/item/ItemReactorLaserFocus.java delete mode 100644 src/cr0s/WarpDrive/item/ItemWarpComponent.java delete mode 100644 src/cr0s/WarpDrive/machines/BlockCamera.java delete mode 100644 src/cr0s/WarpDrive/machines/BlockCloakingCoil.java delete mode 100644 src/cr0s/WarpDrive/machines/BlockCloakingDeviceCore.java delete mode 100644 src/cr0s/WarpDrive/machines/BlockLaserCam.java delete mode 100644 src/cr0s/WarpDrive/machines/BlockLaserReactorMonitor.java delete mode 100644 src/cr0s/WarpDrive/machines/BlockMiningLaser.java delete mode 100644 src/cr0s/WarpDrive/machines/BlockMonitor.java delete mode 100644 src/cr0s/WarpDrive/machines/BlockParticleBooster.java delete mode 100644 src/cr0s/WarpDrive/machines/BlockPowerLaser.java delete mode 100644 src/cr0s/WarpDrive/machines/BlockPowerReactor.java delete mode 100644 src/cr0s/WarpDrive/machines/BlockProtocol.java delete mode 100644 src/cr0s/WarpDrive/machines/BlockShipScanner.java delete mode 100644 src/cr0s/WarpDrive/machines/BlockTransporter.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityAbstractLaser.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityAbstractMiner.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityAirGenerator.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityCamera.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityCloakingDeviceCore.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityLaserReactorMonitor.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityLaserTreeFarm.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityLift.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityMiningLaser.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityMonitor.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityParticleBooster.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityPowerLaser.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityPowerReactor.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityProtocol.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityRadar.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityReactor.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityTransporter.java delete mode 100644 src/cr0s/WarpDrive/machines/WarpChunkTE.java delete mode 100644 src/cr0s/WarpDrive/machines/WarpEnergyTE.java delete mode 100644 src/cr0s/WarpDrive/machines/WarpTE.java create mode 100644 src/cr0s/serverMods/AntiFallDamage.java create mode 100644 src/cr0s/serverMods/CommonProxy.java create mode 100644 src/cr0s/serverMods/LoginHookClass.java create mode 100644 src/cr0s/serverMods/ServerMods.java delete mode 100644 src/mcmod.info diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 412eeda7..00000000 --- a/.gitattributes +++ /dev/null @@ -1,22 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# Custom for Visual Studio -*.cs diff=csharp -*.sln merge=union -*.csproj merge=union -*.vbproj merge=union -*.fsproj merge=union -*.dbproj merge=union - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore index 5ebd21a1..b18cea42 100644 --- a/.gitignore +++ b/.gitignore @@ -161,3 +161,5 @@ pip-log.txt # Mac crap .DS_Store +src/cr0s/WarpDrive/client/ClientProxy.java +src/cr0s/WarpDrive/client/ClientProxy.java diff --git a/README.md b/README.md index c1d72453..1140ec77 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,6 @@ WarpDrive A warp drive mod for minecraft -See mcmod.info for credits - Minecraft forum: http://www.minecraftforum.net/topic/1938578-164-warpdrive-mod-ships-space-lasers @@ -18,7 +16,7 @@ Installation ============ 1. Download fresh build: http://kubach.tk/1.6.4/WarpDrive.zip 2. Download fresh Core build: http://kubach.tk/1.6.4/WarpDriveCore.jar -3. Install last version of IC2, Applied Energistics and Computer Craft +3. Install last version of IC2 and Computer Craft Contact Us ============= diff --git a/src/cr0s/WarpDrive/client/ClientProxy.java b/client/ClientProxy.java similarity index 74% rename from src/cr0s/WarpDrive/client/ClientProxy.java rename to client/ClientProxy.java index 06db97fc..52e12840 100644 --- a/src/cr0s/WarpDrive/client/ClientProxy.java +++ b/client/ClientProxy.java @@ -5,16 +5,18 @@ import cpw.mods.fml.client.FMLClientHandler; import cr0s.WarpDrive.CommonProxy; import cr0s.WarpDrive.FXBeam; import cr0s.WarpDrive.Vector3; -import cr0s.WarpDrive.WarpDrive; -public class ClientProxy extends CommonProxy { +public class ClientProxy extends CommonProxy +{ @Override - public void registerRenderers() { + public void registerRenderers() + { } @Override - public void renderBeam(World world, Vector3 position, Vector3 target, float red, float green, float blue, int age, int energy) { - // WarpDrive.debugPrint("Rendering beam..."); + public void renderBeam(World world, Vector3 position, Vector3 target, float red, float green, float blue, int age, int energy) + { + System.out.println("Rendering beam..."); FMLClientHandler.instance().getClient().effectRenderer.addEffect(new FXBeam(world, position, target, red, green, blue, age, energy)); } } \ No newline at end of file diff --git a/src/assets/warpdrive/lang/en_US.lang b/src/assets/warpdrive/lang/en_US.lang deleted file mode 100644 index 192934fb..00000000 --- a/src/assets/warpdrive/lang/en_US.lang +++ /dev/null @@ -1,33 +0,0 @@ -item.warpdrive.crafting.Malformed.name=Bad Item -item.warpdrive.crafting.EmptyCore.name=Empty Core -item.warpdrive.crafting.TeleCore.name=Teleportation Core -item.warpdrive.crafting.WarpCore.name=Warp Core -item.warpdrive.crafting.LaserCore.name=Laser Core -item.warpdrive.crafting.ReactorCore.name=Reactor Core -item.warpdrive.crafting.InterfaceComputer.name=Computer Interface -item.warpdrive.crafting.InterfacePower.name=Power Interface - -tile.warpdrive.blocks.Air.name=Air Block -tile.warpdrive.blocks.Gas.name=Gas Block -tile.warpdrive.blocks.WarpIsolation.name=Warp-field Isolation Block -tile.warpdrive.blocks.IridiumBlock.name=Iridium Block -item.warpdrive.items.ReactorLaserFocus.name=Reactor Laser Focus -tile.warpdrive.power.Reactor.name=Enantiomorphic Reactor -tile.warpdrive.power.Laser.name=Aurbis Reactor Stabilisation Laser -tile.warpdrive.machines.WarpCore.name=Warp Drive Core -tile.warpdrive.machines.WarpProtocol.name=Warp Drive Controller -tile.warpdrive.machines.WarpRadar.name=Warp Radar -tile.warpdrive.machines.Laser.name=Laser -tile.warpdrive.machines.LaserCamera.name=Laser + Camera -tile.warpdrive.machines.LaserTreeFarm.name=Laser Tree Farm -tile.warpdrive.machines.CloakingCoil.name=Cloaking Coil -tile.warpdrive.machines.Camera.name=Camera -tile.warpdrive.machines.CloakingDeviceCore.name=Cloaking Device Core -tile.warpdrive.machines.ParticleBooster.name=Laser Particle Booster -tile.warpdrive.machines.Monitor.name=Monitor -tile.warpdrive.machines.MiningLaser.name=Mining Laser -tile.warpdrive.machines.LaserLift.name=Laser Lift -tile.warpdrive.machines.Transporter.name=Transporter -tile.warpdrive.machines.Scanner.name=Ship Scanner -tile.warpdrive.machines.AirGenerator.name=Air Generator -tile.warpdrive.machines.LaserReactorMonitor.name=Laser Reactor Monitor diff --git a/src/assets/warpdrive/lua/cloakingdevicecore/cloak1 b/src/assets/warpdrive/lua/cloakingdevicecore/cloak1 deleted file mode 100644 index 291b310c..00000000 --- a/src/assets/warpdrive/lua/cloakingdevicecore/cloak1 +++ /dev/null @@ -1,43 +0,0 @@ -if not term.isColor() then - print("Advanced computer required") - exit() -end - -Side = { "bottom", "top", "back", "left", "right" } -for i = 1,5 do - if peripheral.getType(Side[i]) == "cloakingdevicecore" then - warp = peripheral.wrap(Side[i]) - break - else - warp = nil - end -end - -if warp == nil then - term.setBackgroundColor(colors.red) - term.setTextColor(colors.white) - term.write("No cloak core detected") -else - warp.setFieldFrequency(1337) - warp.setFieldTier(0) - warp.enableCloakingField() - if warp.isAssemblyValid() then - term.setBackgroundColor(colors.lime) - term.setTextColor(colors.blue) - term.write("Tier 1 cloak enabled") - else - term.setBackgroundColor(colors.red) - term.setTextColor(colors.white) - term.write("Invalid assembly!") - term.setBackgroundColor(colors.black) - term.setTextColor(colors.white) - print() - print("In each of the 6 directions, you need to place exactly 2 Cloaking device coils, for a total of 12 coils.") - print("The 6 inner coils shall be exactly one block away from the core.") - print("The cloaking field will extend 5 blocks past the outer 6 coils.") - print("Power consumption scales with the amount of cloaked blocks.") - end -end -term.setBackgroundColor(colors.black) -term.setTextColor(colors.white) -print() diff --git a/src/assets/warpdrive/lua/cloakingdevicecore/cloak2 b/src/assets/warpdrive/lua/cloakingdevicecore/cloak2 deleted file mode 100644 index 7d5be518..00000000 --- a/src/assets/warpdrive/lua/cloakingdevicecore/cloak2 +++ /dev/null @@ -1,43 +0,0 @@ -if not term.isColor() then - print("Advanced computer required") - exit() -end - -Side = { "bottom", "top", "back", "left", "right" } -for i = 1,5 do - if peripheral.getType(Side[i]) == "cloakingdevicecore" then - warp = peripheral.wrap(Side[i]) - break - else - warp = nil - end -end - -if warp == nil then - term.setBackgroundColor(colors.red) - term.setTextColor(colors.white) - term.write("No cloak core detected") -else - warp.setFieldFrequency(1337) - warp.setFieldTier(2) - warp.enableCloakingField() - if warp.isAssemblyValid() then - term.setBackgroundColor(colors.lime) - term.setTextColor(colors.red) - term.write("Tier 2 cloak enabled") - else - term.setBackgroundColor(colors.red) - term.setTextColor(colors.white) - term.write("Invalid assembly!") - term.setBackgroundColor(colors.black) - term.setTextColor(colors.white) - print() - print("In each of the 6 directions, you need to place exactly 2 Cloaking device coils, for a total of 12 coils.") - print("The 6 inner coils shall be exactly one block away from the core.") - print("The cloaking field will extend 5 blocks past the outer 6 coils.") - print("Power consumption scales with the amount of cloaked blocks.") - end -end -term.setBackgroundColor(colors.black) -term.setTextColor(colors.white) -print() diff --git a/src/assets/warpdrive/lua/cloakingdevicecore/uncloak b/src/assets/warpdrive/lua/cloakingdevicecore/uncloak deleted file mode 100644 index 40ed58e3..00000000 --- a/src/assets/warpdrive/lua/cloakingdevicecore/uncloak +++ /dev/null @@ -1,28 +0,0 @@ -if not term.isColor() then - print("Advanced computer required") - exit() -end - -Side = { "bottom", "top", "back", "left", "right" } -for i = 1,5 do - if peripheral.getType(Side[i]) == "cloakingdevicecore" then - warp = peripheral.wrap(Side[i]) - break - else - warp = nil - end -end - -if warp == nil then - term.setBackgroundColor(colors.red) - term.setTextColor(colors.white) - term.write("No cloak core detected") -else - warp.disableCloakingField() - term.setBackgroundColor(colors.lightGray) - term.setTextColor(colors.black) - term.write("Cloak disabled") -end -term.setBackgroundColor(colors.black) -term.setTextColor(colors.white) -print() \ No newline at end of file diff --git a/src/assets/warpdrive/lua/mininglaser/mine b/src/assets/warpdrive/lua/mininglaser/mine deleted file mode 100644 index 68cea01f..00000000 --- a/src/assets/warpdrive/lua/mininglaser/mine +++ /dev/null @@ -1,119 +0,0 @@ -if not term.isColor() then - print("Advanced computer required") - exit() -end - -sides = peripheral.getNames() -mininglasers = {} -for key,side in pairs(sides) do - if peripheral.getType(side) == "mininglaser" then - print("Wrapping " .. side) - table.insert(mininglasers, peripheral.wrap(side)) - end -end - - -noExit = true -layerOffset = 1 -mineAll = true -useDeuterium = false -args = {...} -if #args > 0 then - if args[1] == "help" or args[1] == "?" then - print("Usage: mine ") - print() - print("Miner always mine below it, down to bedrock.") - print("Set layerOffset to define starting level.") - print("Power consumption will be much lower in space.") - print("Mining only ores is faster but more expensive...") - print("Use deuterium from ME system for silk touch.") - print("Mining laser can't go through forcefields.") - print("Mined chests will drop their contents.") - print() - noExit = false - else - layerOffset = tonumber( args[1] ) or 1 - end - - if #args > 1 then - if args[2] == "false" or args[2] == "0" then - mineAll = false - end - end - - if #args > 2 then - if args[3] == "true" or args[3] == "1" then - useDeuterium = true - end - end -end - -if #mininglasers == 0 then - term.setBackgroundColor(colors.red) - term.setTextColor(colors.white) - term.write("No mining laser detected") - - noExit = false -end -if noExit then - for key,mininglaser in pairs(mininglasers) do - if not mininglaser.isMining() then - mininglaser.offset(layerOffset) - if mineAll then - if useDeuterium then - mininglaser.quarry(useDeuterium) - else - mininglaser.quarry() - end - else - if useDeuterium then - mininglaser.mine(useDeuterium) - else - mininglaser.mine() - end - end - end - end - sleep(1) -end - -label = os.getComputerLabel() -if label then -else - label = "" .. os.getComputerID() -end - -term.setTextColor(colors.blue) -if noExit then - repeat - isMining = false - for key,mininglaser in pairs(mininglasers) do - status, energy, currentLayer, mined, total = mininglaser.state() - - term.setBackgroundColor(colors.black) - term.clear() - term.setBackgroundColor(colors.lime) - term.setCursorPos(1, 1) - term.write(label .. " - Mining laser " .. key .. " of " .. #mininglasers) - term.setBackgroundColor(colors.black) - term.setCursorPos(1, 3) - term.write("Status: " .. status .. " ") - term.setBackgroundColor(colors.black) - term.setCursorPos(1, 5) - term.write("Energy level is " .. energy .. " EU") - term.setCursorPos(1, 7) - term.write("Mined " .. mined .. " out of " .. total .. " blocks at layer " .. currentLayer .. " ") - - if mininglaser.isMining() then - sleep(1) - isMining = true - else - sleep(0.1) - end - end - until not isMining -end - -term.setBackgroundColor(colors.black) -term.setTextColor(colors.white) -print() diff --git a/src/assets/warpdrive/lua/mininglaser/stop b/src/assets/warpdrive/lua/mininglaser/stop deleted file mode 100644 index a7db2581..00000000 --- a/src/assets/warpdrive/lua/mininglaser/stop +++ /dev/null @@ -1,48 +0,0 @@ -if not term.isColor() then - print("Advanced computer required") - exit() -end - -sides = peripheral.getNames() -mininglasers = {} -for key,side in pairs(sides) do - if peripheral.getType(side) == "mininglaser" then - print("Wrapping " .. side) - table.insert(mininglasers, peripheral.wrap(side)) - end -end - -label = os.getComputerLabel() -if label then -else - label = "" .. os.getComputerID() -end -term.setBackgroundColor(colors.black) -term.clear() -term.setBackgroundColor(colors.lime) -term.setCursorPos(1, 1) -term.write(label) - -if #mininglasers == 0 then - term.setBackgroundColor(colors.red) - term.setTextColor(colors.white) - term.write("No mining laser detected") -else - for key,mininglaser in pairs(mininglasers) do - term.setCursorPos(1, 2 + key) - if not mininglaser.isMining() then - term.setBackgroundColor(colors.red) - term.setTextColor(colors.white) - term.write("Mining laser " .. key .. " of " .. #mininglasers .. " is already stopped") - else - mininglaser.stop() - term.setBackgroundColor(colors.lime) - term.setTextColor(colors.blue) - term.write("Mining laser " .. key .. " of " .. #mininglasers .. " has been stopped") - end - end -end - -term.setBackgroundColor(colors.black) -term.setTextColor(colors.white) -print() diff --git a/src/assets/warpdrive/lua/radar/ping b/src/assets/warpdrive/lua/radar/ping deleted file mode 100644 index c3dd4cf0..00000000 --- a/src/assets/warpdrive/lua/radar/ping +++ /dev/null @@ -1,42 +0,0 @@ -side = "bottom" - -local argv = { ... } -if #argv ~= 1 then - print("Usage: scan ") - return -end - -local radius = tonumber(argv[1]) - -if radius < 1 or radius > 9999 then - print("Radius must be between 1 and 9999") - return -end - -radar = peripheral.wrap(side) - -if radar.getEnergyLevel() < radius * radius then - print("Low energy level. Sasaj") - return -end -radar.scanRadius(radius) -sleep(2) - -print("Scanning...") - -local seconds = 2 -repeat - local count = radar.getResultsCount() - sleep(1) - seconds = seconds + 1 -until count ~= nil or seconds > 10 -print("took "..seconds.." seconds") - -if count ~= nil then - for i=0, count-1 do - freq, x, y, z = radar.getResult(i) - print("Shit: "..freq.." ("..x.. " " .. y .. " " .. z .. ")") - end -else - print("Nothing is found =(") -end diff --git a/src/assets/warpdrive/lua/radar/scan b/src/assets/warpdrive/lua/radar/scan deleted file mode 100644 index f8ad2805..00000000 --- a/src/assets/warpdrive/lua/radar/scan +++ /dev/null @@ -1,101 +0,0 @@ -radar = peripheral.wrap("bottom") -radius = 500 -scale = 50 - -w, h = term.getSize() - -term.clear() - -function colorScreen(color) - for a = 2,w-1 do - for b = 1,h do - paintutils.drawPixel(a,b,color) - end - end -end - -function textOut(x, y, text, fg, bg) - term.setCursorPos(x, y) - term.setTextColor(fg) - term.setBackgroundColor(bg) - term.write(text) - local xt,yt = term.getCursorPos() - term.setCursorPos(1, yt + 1) -end - -function translateXZ(oldX, oldZ, i) - local x = radarX - oldX - local z = radarZ - oldZ - - x = x / (radius / scale) - z = z / (radius / scale) - - x = x + (w / 2) - z = z + (h / 2) - - - x = math.floor(x); - z = math.floor(z); - - return x,z -end - -function drawContact(x, y, z, name, color) - local newX, newZ = translateXZ(x, z) - - paintutils.drawPixel(newX, newZ, color) - textOut(newX - 3, newZ + 1, "[" .. name .. "]", colors.white, colors.black) -end - -function scanAndDraw() - if (radar.getEnergyLevel() < radius*radius) then - hh = math.floor(h / 2); - hw = math.floor(w / 2); - - paintutils.drawLine(hw - 5, hh - 1, hw + 5, hh - 1, colors.red); - paintutils.drawLine(hw - 5, hh, hw + 5, hh, colors.red); - textOut(hw - 4, hh,"LOW POWER", colors.white, colors.red); - paintutils.drawLine(hw - 5, hh + 1, hw + 5, hh + 1, colors.red); - sleep(1); - - return 0; - end; - radar.scanRadius(radius); - sleep(2); - - redraw(); - - numResults = radar.getResultsCount(); - - if (numResults ~= 0) then - for i = 0, numResults-1 do - freq, cx, cy, cz = radar.getResult(i); - - drawContact(cx, cy, cz, freq, colors.red) - end - end - - drawContact(radarX, radarY, radarZ, "RAD", colors.yellow); -end - -function redraw() - --shell.run("clear") - colorScreen(colors.green) - - paintutils.drawLine(1, 1, w, 1, colors.black) - - textOut(h, 1, "= Q-Radar v0.1 =", colors.white, colors.black) - - textOut(w - 3, 1, "[X]", colors.white, colors.red) - - paintutils.drawLine(1, h, w, h, colors.black); - textOut(4, h, "Energy: " .. radar.getEnergyLevel() .. " Eu | Scan radius: " .. radius, colors.white, colors.black) -end - -mrun = true -while (mrun) do - radarX, radarY, radarZ = radar.pos(); - scanAndDraw(); -end - -term.clear(); diff --git a/src/assets/warpdrive/lua/warpcontroller/startup b/src/assets/warpdrive/lua/warpcontroller/startup deleted file mode 100644 index 4f2c0b3e..00000000 --- a/src/assets/warpdrive/lua/warpcontroller/startup +++ /dev/null @@ -1,483 +0,0 @@ -if not term.isColor() then - print("Advanced computer required") - exit() -end -print("loading...") - --- set alarm side if you need this -Alarm = "top" - -Style = { - CDeflt = colors.white, - BGDeflt = colors.blue, - CTitle = colors.black, - BGTitle = colors.cyan, - CWarn = colors.white, - BGWarn = colors.red -} - -function SetColorDeflt() - term.setBackgroundColor(Style.BGDeflt) - term.setTextColor(Style.CDeflt) -end - -function SetColorTitle() - term.setBackgroundColor(Style.BGTitle) - term.setTextColor(Style.CTitle) -end - -function SetColorWarn() - term.setBackgroundColor(Style.BGWarn) - term.setTextColor(Style.CWarn) -end - -function Clear() - term.clear() - term.setCursorPos(1,1) -end - -function Show(Text) - term.write(Text) - local xt,yt = term.getCursorPos() - term.setCursorPos(1, yt+1) -end - -function ShowTitle(Text) - SetColorTitle() - term.setCursorPos(12, 1) - Show(Text) - SetColorDeflt() -end - -function ShowMenu(Text) - term.write(Text) - local xt, yt = term.getCursorPos() - for i = xt, 51 do - term.write(" ") - end - term.setCursorPos(1, yt+1) -end - -function ShowWarning(Text) - SetColorWarn() - term.setCursorPos(10, 19) - term.write(" "..Text.." ") - SetColorDeflt() -end - -function SaveData() - local file = fs.open("shipdata.txt", "w") - file.writeLine(textutils.serialize(SData)) - file.close() -end - -function ReadData() - local file = fs.open("shipdata.txt", "r") - SData = textutils.unserialize(file.readAll()) - file.close() -end - -function Explode(d, p) - local t, ll - t = {} - ll = 0 - if(#p == 1) then return {p} end - while true do - l = string.find(p ,d, ll, true) - if l ~= nil then - table.insert(t, string.sub(p, ll, l-1)) - ll = l+1 - else - table.insert(t, string.sub(p, ll)) - break - end - end - return t -end - -function ShowDirection() - if SData.Direction == 1 then - Show(" Direction = Up") - elseif SData.Direction == 2 then - Show(" Direction = Down") - elseif SData.Direction == 0 then - Show(" Direction = Front") - elseif SData.Direction == 180 then - Show(" Direction = Back") - elseif SData.Direction == 90 then - Show(" Direction = Left") - elseif SData.Direction == 255 then - Show(" Direction = Right") - end -end - -function CalcRealDistance() - if IsInHyper then - RealDistance = SData.Distance * 100 - MinimumDistance = 1 - JumpCost = (1000 * Weight) + (1000 * SData.Distance) - else - if SData.Direction == 1 or SData.Direction == 2 then - MinimumDistance = GUp + GDown - RealDistance = SData.Distance + MinimumDistance - elseif SData.Direction == 0 or SData.Direction == 180 then - MinimumDistance = GFront + GBack - RealDistance = SData.Distance + MinimumDistance - elseif SData.Direction == 90 or SData.Direction == 255 then - MinimumDistance = GLeft + GRight - RealDistance = SData.Distance + MinimumDistance - end - MinimumDistance = MinimumDistance + 1 - JumpCost = (10 * Weight) + (100 * SData.Distance) - end -end - -function CalcNewCoords(cx, cy, cz) - local res = {x=cx, y=cy, z=cz} - if SData.Direction == 1 then - res.y = res.y + RealDistance - elseif SData.Direction == 2 then - res.y = res.y - RealDistance - end - local dx = warp.get_dx() - local dz = warp.get_dz() - if dx ~= 0 then - if SData.Direction == 0 then - res.x = res.x + (RealDistance * dx) - elseif SData.Direction == 180 then - res.x = res.x - (RealDistance * dx) - elseif SData.Direction == 90 then - res.z = res.z + (RealDistance * dx) - elseif SData.Direction == 255 then - res.z = res.z - (RealDistance * dx) - end - else - if SData.Direction == 0 then - res.z = res.z + (RealDistance * dz) - elseif SData.Direction == 180 then - res.z = res.z - (RealDistance * dz) - elseif SData.Direction == 90 then - res.x = res.x + (RealDistance * dz) - elseif SData.Direction == 255 then - res.x = res.x - (RealDistance * dz) - end - end - return res -end - -function ShowInfo() - ShowTitle(Title) - Show("Core:") - Show(" x, y, z = "..X..", "..Y..", "..Z) - local energy = warp.get_energy_level() - Show(" Energy = "..math.floor(energy / 1000000).." % ("..energy.."EU)") - Show(" Attached players = "..warp.get_attached_players()) - Show("Dimensions:") - Show(" Front, Right, Up = "..GFront..", "..GRight..", "..GUp) - Show(" Back, Left, Down = "..GBack..", "..GLeft..", "..GDown) - Show(" Size = "..Weight.." blocks") - Show("Warp data:") - ShowDirection() - local dest = CalcNewCoords(X, Y, Z) - Show(" Distance = "..RealDistance.." ("..JumpCost.."EU, "..math.floor(energy/JumpCost).." jumps)") - Show(" Dest.coordinates = "..dest.x..", "..dest.y..", "..dest.z) - if SData.Summon then - Show(" Summon after = Yes") - else - Show(" Summon after = No") - end -end - -function Confirm() - ShowWarning("Are you sure? (y/n)") - local event, keycode = os.pullEvent("key") - if keycode == 21 then - return true - else - return false - end -end - -function Warp() - rs.setOutput(Alarm, false) - sleep(1) - warp.set_direction(SData.Direction) - if IsInHyper then - warp.set_mode(2) - else - warp.set_mode(1) - end - warp.do_jump() -end - -function SetDistance() - Clear() - ShowTitle("<==== Set distance ====>") - SData.Distance = 0 - CalcRealDistance() - MaximumDistance = MinimumDistance + 127 - if IsInHyper then - term.write("Distance * 100 (min "..MinimumDistance..", max "..MaximumDistance.."): ") - else - term.write("Distance (min "..MinimumDistance..", max "..MaximumDistance.."): ") - end - sleep(0.3) - SData.Distance = tonumber(read()) - if SData.Distance == nil then SData.Distance = 1 end - if SData.Distance < MinimumDistance or SData.Distance > MaximumDistance then - SData.Distance = 1 - ShowWarning("Wrong distance. Try again.") - os.pullEvent("key") - CalcRealDistance() - else - if not IsInHyper then - SData.Distance = SData.Distance - RealDistance - end - warp.set_distance(SData.Distance) - CalcRealDistance() - end -end - -function SetDirection() - local drun = true - while(drun) do - Clear() - ShowTitle("<==== Set direction ====>") - ShowDirection() - term.setCursorPos(1, 16) - SetColorTitle() - ShowMenu("Use directional keys") - ShowMenu("W/S keys for Up/Down") - ShowMenu("Enter - confirm") - SetColorDeflt() - local event, keycode = os.pullEvent("key") - if keycode == 200 then - SData.Direction = 0 - elseif keycode == 17 then - SData.Direction = 1 - elseif keycode == 203 then - SData.Direction = 90 - elseif keycode == 205 then - SData.Direction = 255 - elseif keycode == 208 then - SData.Direction = 180 - elseif keycode == 31 then - SData.Direction = 2 - elseif keycode == 28 then - drun = false - end - end -end - -function SetDimensions() - Clear() - sleep(0.3) - ShowTitle("<==== Set dimensions ====>") - term.write(" Front ("..GFront..") : ") - GFront = tonumber(read()) - term.write(" Right ("..GRight..") : ") - GRight = tonumber(read()) - term.write(" Up ("..GUp..") : ") - GUp = tonumber(read()) - term.write(" Back ("..GBack..") : ") - GBack = tonumber(read()) - term.write(" Left ("..GLeft..") : ") - GLeft = tonumber(read()) - term.write(" Down ("..GDown..") : ") - GDown = tonumber(read()) - term.write("Setting dimensions...") - warp.dim_setp(GFront, GRight, GUp) - warp.dim_setn(GBack, GLeft, GDown) - Weight = warp.get_ship_size() -end - -function Summon() - Clear() - ShowTitle("<==== Summon players ====>") - local players = Explode(",", warp.get_attached_players()) - for i = 1, #players do - Show(i..". "..players[i]) - end - SetColorTitle() - ShowMenu("Enter player number") - ShowMenu("or press enter to summon everyone") - SetColorDeflt() - sleep(0.3) - term.write(":") - local input = read() - if input == "" then - warp.summon_all() - else - input = tonumber(input) - warp.summon(input - 1) - end -end - -function JumpToBeacon() - Clear() - ShowTitle("<==== Jump to beacon ====>") - sleep(0.3) - term.write("Enter beacon frequency: ") - local freq = tostring(read()) - rs.setOutput(Alarm, true) - if Confirm() then - rs.setOutput(Alarm, false) - warp.set_mode(4) - warp.set_beacon_frequency(freq) - warp.do_jump() - end - rs.setOutput(Alarm, false) -end - -function JumpToGate() - Clear() - ShowTitle("<==== Jump to JumpGate ====>") - sleep(0.3) - term.write("Enter jumpgate name: ") - local name = tostring(read()) - rs.setOutput(Alarm, true) - if Confirm() then - rs.setOutput(Alarm, false) - warp.set_mode(6) - warp.set_target_jumpgate(name) - warp.do_jump() - end - rs.setOutput(Alarm, false) -end - -function SetShipName() - Clear() - ShowTitle("<==== Set ship name ====>") - sleep(0.3) - term.write("Enter ship name: ") - SData.Shipname = tostring(read()) - os.setComputerLabel(SData.Shipname) - warp.set_core_frequency(SData.Shipname) - SaveData() - os.reboot() -end - -if fs.exists("shipdata.txt") then - ReadData() -else - SData = { - Summon = false, - Distance = 1, - Direction = 0, - Shipname = "" - } -end - -SetColorDeflt() - -Side = { "bottom", "top", "back", "left", "right" } -for i = 1,5 do - if peripheral.getType(Side[i]) == "warpcore" then - warp = peripheral.wrap(Side[i]) - break - else - warp = nil - end -end - -if warp == nil then - ShowWarning("No warpcore controller detected") - os.pullEvent("key") - os.reboot() -end - -if SData.Shipname == "" then - SetShipName() -end - -Title = "" - -if SData.Summon then - warp.summon_all() -end - -GFront, GRight, GUp = warp.dim_getp() -GBack, GLeft, GDown = warp.dim_getn() -IsInHyper = warp.is_in_hyperspace() -repeat - X = warp.get_x() - sleep(0.3) -until X ~= nil -Y = warp.get_y() -Z = warp.get_z() -repeat - isAttached = warp.isAttached() - sleep(0.3) -until isAttached ~= false - -repeat - Weight = warp.get_ship_size() - sleep(0.3) -until Weight ~= nil - -CalcRealDistance() - -warp.set_mode(1) - -mainloop = true -while(mainloop) do - Clear() - ShowInfo() - term.setCursorPos(1, 15) - SetColorTitle() - ShowMenu("D - Dimensions, M - Toggle summon, N - Ship name") - ShowMenu("S - Set Warp Data, J - Jump, G - Jump to JumpGate") - ShowMenu("B - Jump to Beacon, H - Jump to Hyperspace") - ShowMenu("C - Summon crew, X - Shutdown WarpCore and Exit") - SetColorDeflt() - local event, keycode = os.pullEvent("key") - if keycode == 31 then - SetDirection() - SetDistance() - SaveData() - elseif keycode == 50 then - if SData.Summon then - SData.Summon = false - else - SData.Summon = true - end - SaveData() - elseif keycode == 32 then - SetDimensions() - SaveData() - elseif keycode == 36 then - rs.setOutput(Alarm, true) - if Confirm() then - Warp() - end - rs.setOutput(Alarm, false) - elseif keycode == 46 then - Summon() - elseif keycode == 48 then - JumpToBeacon() - elseif keycode == 34 then - JumpToGate() - elseif keycode == 35 then - rs.setOutput(Alarm, true) - if Confirm() then - rs.setOutput(Alarm, false) - warp.set_mode(5) - warp.do_jump() - end - rs.setOutput(Alarm, false) - elseif keycode == 45 then - mainloop = false - elseif keycode == 49 then - SetShipName() - end -end - -if SData.Summon then - SData.Summon = false - SaveData() -end -Clear() -print("wish you good") -warp.set_mode(0) -sleep(0.5) -os.shutdown() \ No newline at end of file diff --git a/src/assets/warpdrive/sound/warp_4s.ogg b/src/assets/warpdrive/sound/warp.ogg similarity index 100% rename from src/assets/warpdrive/sound/warp_4s.ogg rename to src/assets/warpdrive/sound/warp.ogg diff --git a/src/assets/warpdrive/sound/warp_10s.ogg b/src/assets/warpdrive/sound/warp_10s.ogg deleted file mode 100644 index b3a47aa5cb57640cda5f634e1aafb1124a409ffe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269977 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 G) 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∈dBKcoF25aVMVb;kOt4r6`4HZ}AQajg+r8B}yY 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 TC4_{8NQvdOk&W*iD*pcf&a7Qb diff --git a/src/assets/warpdrive/sound/warp_30s.ogg b/src/assets/warpdrive/sound/warp_30s.ogg deleted file mode 100644 index 8d1029f31e46fe2598466bf7fa0f144325d156d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563717 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

eNg#V9sy_bfLVht`b^uRRKT;!Whs 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ʺp*LQW`BV`> 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≫(?347rg4ESR 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�w0zwaA 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 =6FQnA4QS`n3xE| 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 TT-& zu+{7f_p&&*AMWob_b*c2eyXHbQEgVX!kE0ii?wzQw$(o#i|-WsIW`*{$S5dy(mJ#` zM@n%6P_sNUyH{l`Dt$Q1<=cG2v*gNR44lu9AQjCeM¥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 Eg0iowyZ`_I diff --git a/src/assets/warpdrive/textures/blocks/airBlock1.png b/src/assets/warpdrive/textures/blocks/airBlock1.png deleted file mode 100644 index c30655337db1948af208c84757fc71903a7a7c9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3008 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 Bo$mku diff --git a/src/assets/warpdrive/textures/blocks/airBlock11.png b/src/assets/warpdrive/textures/blocks/airBlock11.png deleted file mode 100644 index 883c409445ddff0551f47911258f50b630f55327..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3016 zcmV;(3pezMP)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( 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 IM6N<$f^;#d`Tzg` diff --git a/src/assets/warpdrive/textures/blocks/airBlock13.png b/src/assets/warpdrive/textures/blocks/airBlock13.png deleted file mode 100644 index bcd62c55b4c1152d6b4a48ecd8a55f4f50a0886c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3011 zcmV;!3q16RP)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( 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 FV1m#9sS^MI diff --git a/src/assets/warpdrive/textures/blocks/airBlock14.png b/src/assets/warpdrive/textures/blocks/airBlock14.png deleted file mode 100644 index b2ce5ea2eddc03bf661f71bf276bdefaf024eba9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3014 zcmV;%3pw004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( 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 IM6N<$f-jAzumAu6 diff --git a/src/assets/warpdrive/textures/blocks/airBlock15.png b/src/assets/warpdrive/textures/blocks/airBlock15.png deleted file mode 100644 index 16773b6a0a6c5998eac7364a681acaa844438760..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3010 zcmV;z3qACSP)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( zX+uL$P-t&-Z*ypGa3D!TLm+T+Z)Rz1WdHz3$DNjUR8-d%htIutdZEoQ0#b(FyTAa_ zdy`&8VVD_UC<6{NG_fI~0ue<-nj%P0#DLLIBvwSR5EN9f2P6n6F&ITuEN@2Ei>|D^ z_ww@lRz|vC zuzLs)$;-`!o*{AqUjza0dRV*yaMRE;fKCVhpQKsoe1Yhg01=zBIT!&C1$=TK@rP|Ibo3vKKm@PqnO#LJhq6%Ij6Hz*<$V$@wQAMN5qJ)hzm2h zoGcOF60t^#FqJFfH{#e-4l@G)6iI9sa9D{VHW4w29}?su;^hF~NC{tY+*d5%WDCTX za!E_i;d2ub1#}&jF5T4HnnCyEWTkKf0>c0%E1Ah>(_PY1)0w;+02c53Su*0<(nUqK zG_|(0G&D0Z{i;y^b@OjZ+}lNZ8Th$p5Uu}MTtq^NHl*T1?CO*}7&0ztZsv2j*bmJyf3G7=Z`5B*PvzoDiKdLpOAxi2$L0#SX*@cY z_n(^h55xYX#km%V()bZjV~l{*bt*u9?FT3d5g^g~#a;iSZ@&02Abxq_DwB(I|L-^b zXThc7C4-yrInE_0gw7K3GZ**7&k~>k0Z0NWkO#^@9q0fwx1%qj zZ=)yBuQ3=54Wo^*!gyjLF-e%Um=erBOdIALW)L%unZshS@>qSW9o8Sq#0s#5*edK% z>{;v(b^`kbN5rY%%y90wC>#%$kE_5P!JWYk;U;klcqzOl-UjcFXXA75rT9jCH~u<) z0>40zCTJ7v2qAyk54cquI@7b&LHdZ`+zlTss6bJ7%PQ)z$cROu4wBhpu-r)01) zS~6}jY?%U?gEALn#wiFzo#H}aQ8rT=DHkadR18&{>P1bW7E`~Y4p3)hWn`DhhRJ5j z*2tcg9i<^OEt(fCg;q*CP8+7ZTcWhYX$fb^_9d-LhL+6BEtPYWVlfKTBusSTASKKb%HuWJzl+By+?gkLq)?+BTu761 zjmyXF)a;mc^>(B7bo*HQ1NNg1st!zt28YLv>W*y3CdWx9U8f|cqfXDAO`Q48?auQq zHZJR2&bcD49Ip>EY~kKEPV6Wm+eXFV)D)_R=tM0@&p?(!V*Qu1PXHG9o^ zTY0bZ?)4%01p8F`JoeS|<@=<@RE7GY07EYX@lwd>4oW|Yi!o+Su@M`;WuSK z8LKk71XR(_RKHM1xJ5XYX`fk>`6eqY>qNG6HZQwBM=xi4&Sb88?zd}EYguc1@>KIS z<&CX#T35dwS|7K*XM_5Nf(;WJJvJWRMA($P>8E^?{IdL4o5MGE7bq2MEEwP7v8AO@ zqL5!WvekBL-8R%V?zVyL=G&{be=K4bT`e{#t|)$A!YaA?jp;X)-+bB;zhj`(vULAW z%ue3U;av{94wp%n<(7@__S@Z2PA@Mif3+uO&y|X06?J#oSi8M;ejj_^(0<4Lt#wLu#dYrva1Y$6_o(k^&}yhSh&h;f@JVA>W8b%o zZ=0JGnu?n~9O4}sJsfnnx7n(>`H13?(iXTy*fM=I`sj`CT)*pTHEgYKqqP+u1IL8N zo_-(u{qS+0<2@%BCt82d{Gqm;(q7a7b>wu+b|!X?c13m#p7cK1({0<`{-e>4hfb-U zsyQuty7Ua;Ou?B?XLHZaol8GAb3Wnxcu!2v{R_`T4=x`(GvqLI{-*2AOSimk zUAw*F_TX^n@STz9kDQ z$NC=!KfXWC8h`dn#xL(D3Z9UkR7|Q&Hcy#Notk!^zVUSB(}`#4&lYA1f0h2V_PNgU zAAWQEt$#LRcH#y9#i!p(Udq2b^lI6wp1FXzN3T;~FU%Lck$-deE#qz9yYP3D3t8{6 z?<+s(e(3(_^YOu_)K8!O1p}D#{JO;G(*OVf32;bRa{vGi!~g&e!~vBn4jTXf0P{&i zK~y+Tos&xr!Y~X(n{W%n3W@t42*e7w1(ZBDkGc_T7-^KG{><1?%k?qOuXzg0{RE}- z%YZt3ug_P%w7{;eX90n}8*U3S7apa1{>07*qoM6N<$ Ef`kmGoB#j- diff --git a/src/assets/warpdrive/textures/blocks/airBlock2.png b/src/assets/warpdrive/textures/blocks/airBlock2.png deleted file mode 100644 index 8ba108ad99651036d023da2461880db3c7dc0f64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2999 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 diff --git a/src/assets/warpdrive/textures/blocks/airBlock3.png b/src/assets/warpdrive/textures/blocks/airBlock3.png deleted file mode 100644 index 36f4add09e1cf3c76f4b457716dbce8c6e4115f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3009 zcmV;y3qJITP)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( 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 BqnZE! diff --git a/src/assets/warpdrive/textures/blocks/airBlock8.png b/src/assets/warpdrive/textures/blocks/airBlock8.png deleted file mode 100644 index 1fd6407d3a08a7198e5dd3109c167b1295bb5fb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3008 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 D>!+Zy diff --git a/src/assets/warpdrive/textures/blocks/airgenTopActive.png b/src/assets/warpdrive/textures/blocks/airgenTopActive.png new file mode 100644 index 0000000000000000000000000000000000000000..e2520225a3a2589c580472ccbd64e5b079023a0c GIT binary patch literal 2027 zcmVe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00&b^L_t(Y$Gz6;k6d*f$MN^M zpSkSJ&dko}MIkv-#pN&5%nA7g1G>WTHeIL;3m^ zb;HE>3TV1c;O~7ey!6vj>{uYn&~7(r)_i0|;htkhNoSJOY6em0(rjAvLXlKjr|Zd> zZLmxb-}#_~qQJ|qIQ;6>h+I+Q^w}cq=xNNh!VGPhjf zN~P2$umq(3P^>=5t2s{{2j#XeXJW!zl430MJ}vG?Cey?%S{&l`aV$< zksbw66d4;IN0QcQ)LK}U#b7KTN@BkYKYOth2SJaxr=aTz?2e3WTL_|vswntfpSTy3 zP7e@<0=5;h+v*baBwWWqvcs8^N%0z=E*@fOMJAuBbER?weQ=hkv4C^eCYZlulS{NX zzcEJLN>fNRn7QvqoWE)y0)$c8xsHc-o z$@F4y9G_%DM3xmi&%$v+;ustkL=ohr?Gh6MWwy)`m@uN1G5jo;kQ2(Z;{N+=T&6Ab zM|ealV~YJO0-X5H-gtiVdwcoYPwwT1pW4eO9^T8hcwpN-hK34MjVg_5ht*{VK@g}L z-7n{XBIUSic9w3`qGPtG8Wj`;d_VrD9!RD?bMnZP$;+=e%*}`V@cG+W+PatXOEUXM zTfFgZp7{lZ${hTV&J+yTN_PeHA{J` zf%yA(ON4>IA3q%D%~M6THy!3y#*hk+kxZ)0Eze-`D7)=87d9vPXkif3^a%7>cDX^C zmh2%20>$Dm`}gOFGt-!+NnXq|HF+CtvxB|8#g)suShhuBLMDvDJr8!9ZKfutnVdSn z)<%cj-CbI(CgWq{sG7!=t5@koA!f%X=nAykA>-qd7>0rP-k(b(5;@lD$N6;WFy(TY zGm8Z(?lFQe;%fCMSB+^vq}_^f?1(4~85x;CPb4r+i;ij1^+Gb) z)U6&!vdl;GIo|nj0JG!s$zqDRl{}3`oq9Bj(Y>9Z8?w=vpm_MHf9*jOhQzVR;NTz= zrEzR4U~~N%)oK+@Q~3Jv<6K%?{Bj;7^!_ChMxd!6$qK$_VcWrf;Q{|o5B_mKFn0W# zJP5i)6jl9l`$29|4i?_sD|q)?pW!H4c=Vc{aR?IsVLIDsT9 zc%DbA)$0FuEZ@2xOiT@tPNzwwRchrViXxNFh-jKft=^xR>Bqn7Mpb~@}f z8(19=!!S5HJx!w)kN2l#!I}WZB5(WW+AfhM=2r`zswhL zdq=?E;N!(KJIy2`8HaOg8H`<>iD9_b+DE!@Cj&}@%asfsnLQ7ZsT6CgtJt=SEX#}z z7jc~sT~!zz9;Q?p<;f?Wz;$d4qy8Uw5Q3(GB+387e(-NR_#46+N2KzkS)u>{002ov JPDHLkV1fqN*y8{I literal 0 HcmV?d00001 diff --git a/src/assets/warpdrive/textures/blocks/camOverlay.png b/src/assets/warpdrive/textures/blocks/camOverlay.png index ca2926222ebe9d114646510ce381ed34fe4cd651..fe210b30323d3e708fd56b3f1e384ca40da77956 100644 GIT binary patch literal 1301 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5C#UOzX3iWu0Spj$SW#B7^CE9 z2#lN%(42O0JJ7d`B|(0{3=Yq3q=7g|-tI089jvk*Kn`btM`SSr1K$A zFY)wsWxvNR&!=M0EV@ArsAr<5i(^Q|t+#hCdL1zkaJV@0-+%Y+EvB6*q9Q$W=QQ7F zzk2kJ@8yt~9-wvvX!zB4@o@bgd7cLv->SG28W@;35ClZongSVQLAdl4=|}k?92?%u zW)*N?U}Qle67HV;UteX%IEM*Cem1 zq$SL2*n$3KV5ryH{A9tW+L-H#>kgl0_$oC=*^0ehu6VuY1=bn7@8`*1KRrMG+=S)x znQ9wy65HBWpKAzDuh_PA;SZ?``)^IQS(@%}FTLDn9n<&2-(S35%Xr}3@89pN#Q#?9 zxX62M>s3qpUTG!9TXG9_N1j@UkkYhbv{an^LB{Ts5rX{nH literal 1306 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6|H(?D8gCb z5n0T@z;^_M8K-LVNdpDhOFVsD+3&H*u*-97UlVL?Yi|?!Gll0t^lyXRt6( zi-F6e2JT(&e;$_i6`p?Y`_*j+pFMnat*24>*rD3@q6rGYo420-ugjDqj&KI1Id%>m zhEd!JYz!O>3JeVl3{2!OHXK--`Dk(GpF$7fJnbcrRN^>e^VO=*dEvL&qW{N~uU^1Y zzkmP#tf+hMpMO3cww)WlGYpQsJivXmim!g<>kC_1&oD3;Hzeo$?0VegFoO}l7nWGc z?hv?t{(1k_0~eio^m2k%zq4XFcbbre@USURo6f>)Oh)|bNj11%{;`-j;Ddw_GXr50 zP8Hw(Ev~b7!NJwJ&1Vl!jeXc;q39<5mT@;qEX{u!cblnw!vBhczoQqeyuI|E(cAm$ zmTV8*ef-(lIF^J%335^viY?I`ijtl0vRB@oB4O`%K<@xw^U5uaqRA#V44H3KAKUO; z&mm7-`FqyCe_yZs-+h~dIrKcku9sEc_03PT^-0QDo<70*=ih;It}C9*%nltKj>_%|MX{`Av~avK23ady4D+g}r`TTYIL~ zCi%4Sw;9iM?q8TWEqcv))!X-Z7EI9mcR}HGd~W)wmq&O0&j0!I-^SnXEB`rU)#_9N z)o)JwS$sS7-23=VcFXhXjT@ZO8N;Van*>kGKWoafZpYs&8-FJTy&q5Hs_z8r2^ppS zTxTQj%e_HnpF!Hza-B)TGrN2K^|$kKerDO*-ulWQborR2`@`e& zT$0`2Znx;#|LtFO?BNF;<&4wT?AJWszV<%rjLm;p87_aE*gSpS_AO1Ar^m9Yhe1zzT~#}z1~{=8^BVG!PC{xWt~$(6978@r;Pvr diff --git a/src/assets/warpdrive/textures/blocks/cloakCoilTop.png b/src/assets/warpdrive/textures/blocks/cloakCoilTop.png deleted file mode 100644 index 4ffa69b08b209cbe089f5e6a6386126e36ccd793..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 zcmV<40wMj0P)WFU8GbZ8()Nlj2>E@cM*00KfuL_t(I%QcfZjx0qK z0OKu{we$?bA`Gzck>LIp!NP_SpPuPjI`d^dj4y5wp-{-Lzx|%AHC`NwCZIT6oaKql-c-*MiJu?1CgX&&=;dUJL{bMv@LwZz$H-= zv;(y##}!B)9065>x7D!Cm`n01#(Gm6CsEEw0D4bc6s4YZP8pi78np*lMA;u-Sz0e_DYu2`?%vv!R;! zHjq!{wi%@G_nxFzS_tWI)&v_25}yKLxcT3h!7Zq==oK_RB=(hHSkM$kAqPQZ~ml4 z=lCq_S}}Fh8`C^9mt@`(fAWzdcl2U{%jb$>d4a(x&p3X-O_Rqmcp?B~) z6sPm$QvUpG+}6T*4D3oCk*wA@T1P$ys~cx;{M(%SnbZOPXvtqk1t$KuoJoUdFsaZ; z3ZP;feXv-kcB26gFC4AmWu8HV11SCLssR`f15Q8{f~2J|fSNE(6H_Vt2ZecI?C{?< Q(f|Me07*qoM6N<$g3?zyt^fc4 diff --git a/src/assets/warpdrive/textures/blocks/componentInterfaceComputer.psd b/src/assets/warpdrive/textures/blocks/componentInterfaceComputer.psd deleted file mode 100644 index 119bbf845523f7a0dee6b63529d85a5346095466..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25298 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 vyq+I^Qb&2!)QlNMrbP0l+XkKg0d+; diff --git a/src/assets/warpdrive/textures/blocks/coreSideHeated.png.mcmeta b/src/assets/warpdrive/textures/blocks/coreSideHeated.png.mcmeta deleted file mode 100644 index 37d84f6a..00000000 --- a/src/assets/warpdrive/textures/blocks/coreSideHeated.png.mcmeta +++ /dev/null @@ -1,4 +0,0 @@ -{ - "animation": { - } -} \ No newline at end of file diff --git a/src/assets/warpdrive/textures/blocks/energy.png b/src/assets/warpdrive/textures/blocks/energy.png new file mode 100644 index 0000000000000000000000000000000000000000..184f7faa7f670bab34c3d8b5763ecccfcb574e1c GIT binary patch literal 5892 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 diff --git a/src/assets/warpdrive/textures/blocks/energy_orange.png b/src/assets/warpdrive/textures/blocks/energy_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..313dbfa71825e8443d2e07faa59f9cd2c54a7195 GIT binary patch literal 5432 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

N4V#qTZqoBVWv9D?@s@MAapUc45H$UQ*p*| z{4$!Fpr?5q&;RDjIDVCeH$!Xc0xtS!D^5^BQ3R?mxVY!@?6~?#gd$ndz8TACrn~tP zG&Mm=&$H(8JgP8e-9=0gdEB)9^Bg?!GsY@M2%~`hmW_P(-sccfXh@-TDhi+g$CM>}!6GP;@q zpxNre&@#Awh0g41s_q06mESX6KaCsI&}4!z4rosF(3V-sNbwK}y$MYwu=E_ZSEMt$ zis9k_6=xiP{+9Iwk;nS}ov0nzRRE;)Jiq$o>nJD)p(2F}z*yzjyw?HhUXhfMr)Uq& zwbvz#e2Vs&c~M4QNO#l4xIvBS`WZ@%b3C(mA79#aEna9dUO7%nvY&=uMhZplvAt=W zphU5LhA8$CVm5qqHA%ypq3TZ3@Jl#B6{%>T#55(kW_N{_!w+qw(6ICze&`TIJ~0uN z-b|r(5-+H8;LZJPTK-K+jS-ryF2XqEI0TNmkT}_ftE#bbqe?S;S?0e}D2Tnasu|ABhCUN}A zY!Im_+@MA_(MioMAcam+Z{bfj|26;i+ZSl~B~nJ7LiHr)O7GzYRWfD=m-hY{$Hrbk zLEr{8a>-tl|4T%>c09?W&whoh*@^8JNt^AQF6;-uP*a#%8pp5V1~mYr(6GHCmYzeG z7P@ND-?EXaJIT=WK^(t=A2zV`9676xFm|!s8T`nhFZV}?uBNqgHLWFOMFUgpr4oI?BsW55@qmzc|9dQ_s?D^)Orj8%?ds#y|xhDEKHaeVw$Y_CWd`PAG35F?aX7kyBGCKF`L4w8B+s?@2wMO3Mw ztm)bo1I#pr=fNanb`pdx6=!^&jDpC;@he1eKyU6NxIv8>`z)F;$t8RF{zFf2*I(|S z?3@Rn<`(z>c7!4^)HJ4+!BA6V&4u*jE@44>8Oq9zYi0|u&yqA+h~pSl=r}=zD2_;I zSMyY#6RH0*PS+a=^grc#!>pBjc`r#Z$RFFc$kSTOEg|1rk zMfS#esPZD2jrmH?gMs2JYN-Ge$yk)swB80%y(gcyilKj;OMKW4GOrds)Aat<3B3oBI!p{%gHkX9qJeuihl5C0gA^*7u()IUcTf~~cmL2VPH$aA zwq-kC-F?gaO!vKiKZ{!bn6t%!`Ajg?G;6!J@%!<8|BL(8d8brod`8Rv#dQ4)mfp-* z<=Fp-aC!U3nW_y^aYm`R1NyUc`3WO4?;?dpM`k5a98#$M zflQ)<>()QO&-ULz82L2(5^hjKmlkWfw=rHhMo;rP#w$k|E)EdJ!R#LS^hJ;CS=h9i zUmw4p(eh#3poSOL@xulUzXX7#=V*8(w%v3Mr;kt2@XNF$`?>dP4>S1w6mD4MiN~Mi z-p4+R>sLq`t%R|Usb;ut&EN9Y;8VCkm12E}gqESdtXGA64hxNFZ=B0`!HU1VDfl6nhnP$P(3Ix;J{ zdFy@b{l^`Y8t3M(s$8;nZiDJ*GJzCA?3t(@N0kPSUnYoLyr4d7!^lS!2|l*`8@%%N zqrCOTaiZ8~X!<{9VKk`V1vT8D%BwHG!81?3$e}l96ZP+(ewy9izL|1kbpE1}Lc{iF zxUh2z0PUF-2wf)8Ws+@|eVew-3WCU;rjM>S50|qU9MH6O;KmY&$07*qoM6N<$ Ef?}T6K>z>% literal 0 HcmV?d00001 diff --git a/src/assets/warpdrive/textures/blocks/energy_violet.png b/src/assets/warpdrive/textures/blocks/energy_violet.png new file mode 100644 index 0000000000000000000000000000000000000000..31a99f6541cf9409c9aa2203870e2fe2fabdbaeb GIT binary patch literal 5834 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 diff --git a/src/assets/warpdrive/textures/blocks/lasercamOverlay.png b/src/assets/warpdrive/textures/blocks/lasercamOverlay.png index 6000e8abaf080f48c9f5a9667da3c69f32f8e47b..53745518e22cbe9deb11236b3b3a2261eef1bcbf 100644 GIT binary patch literal 1279 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6+K!Kb&Cub8Xj7G z5A^xpLzDN?LC(Gdafk?_X6h_e|Xl*FbOa? zfLz1EKrIF_CS?_$+4Fz0Gf%heep7~r*G&3%+E>@_T^Coq@9L!ee}j@AL_BhkIPquE z()#b&EJth+PQ-NNjn2c?Eyc(FM)NaFJH1V=L6Tty3yHpIc$4S*d57uQ!xJ%$$0o9X zslA-zdCzZq%Oj8LN<-)UeqH+YmH($RTOTh@&Nk?n=Z$bLwyo#QfK^)&f3YT9f=<|7ke`FuF_GK76^=SdGuUaQ}D5IA!Q7Zs}vGF4r+#@GCys zc}GvK^sRe$!#@3w`}O@$9+QCd9_QxO)(?K)_MSVHw~Qr0`R~DdvOUFYX*q0y-QLoN zQZ-D{nBD}w3vIOD$Kt`7kaIuTxM!oJs}>uZT^fVrvTJ`|{#R}JHu<30)9U2ud~6o` z^DdV&23`N+oc?m>cZOR6dUxwr{^orkwBUm3fg9EgD>HvZ?XS+cwg2mGfe&998Df~g zakXLRS$WoXdH#F*?Vq+O27KgM@Y^irRp#y+-!y+SXw7E4lJw@}{wr@%-lQjO{G{F{ zd4S!xW#e+j-SSsuf6e=UJ9#?K%F{jn9{A;UzrD=EYTUq?{$OYN@pliTxQ<>q&u3xn zocf(1DgEVE=9CYI+om&kFFTPuouT-<;g_vf%x*CEGc`+sWBE&og-0GtK$D*3E!F!Z|{2h-F9GTc<7UQW0P9}yWf>u{-e``3)ux;=gmG^lB&5W?N42g@qP8sRSJza z&i#?J-pFZqj5}a?d>A7Kg91YX0|OHSwHUZeI>2cf{qMu}>DMj3@0))={@}BRZ>IG$ z+8%S-{FTdK!pfVMp8uC(+{le^2c|*g3P&W?vKlZmurLTPIDmqc491Lyk6&8W+1UPm zJOR@NY$8(>j=X3xa9{m(mCgSD|5&2`NA!jUwAJ(T*JnlDJO29X-LUOQuErLO21i~V zFuq#FSHJT0g{`b-7#NHjYS;YidfeqOgAsqoFR_%}A<%#Q_3o_)?m6}7PYS=zKyuO5iOU^lsA%P7ME!aG$z~E3hYi<3(JKRz=b@i;X z+l{Rcvlap!e2ck^5jmRPc?aKSYM=1G;^5opMJsPFy=V0H-nu2*LvJ5{wl;Yh+e zX$!>`Zw^Jt&TrW(Z%>i1cRZkXfUSAumPXNJlN*N2H>!?pc&g`+C$9WGtM2#LEB|lb z=3ovz&v5Hy)o*?C6TkW--&meL!Taakfpe}ap3LM*V>r5Z(Q>5?DGzvBQ_dK6Ua8$R z(P)QY1FzG@FAVo5HQp@0|1L!S4bz$})fHa5=<-nPQ)Uqve_pz8zP0R*_rX2Eb^oGXzb&ivskL!FZTw}%a-I15GpA** zId6IUKF@*)nsxUTUdQF8pLuz7=kN7DfBsweJHPUuLsspXN}&49DL;#Er=EI0f3w~3 zyn5pXr*y{jsnRCN)ACQ6@|@f8H_OJ~iNWv36S=B8$$COYX+O`|2rRSv7Ue%_6L-P# zk40S@4(c;#+ghG8X;@}=ue$zrUdGQXd)r%I8H6q$({z8>KF`J3{q1#&uKi#BMaLda z=r3n{wr0QK`Sz{%S!Zne%gS*1V`KC5dE3hvSEO{klW3D<5PduC?cUQ$3=OgP(^>=5 aU-mOnQj&(DuU7$!GzL#sKbLh*2~7YGtgk!( diff --git a/src/assets/warpdrive/textures/blocks/miningLaserSide0.png b/src/assets/warpdrive/textures/blocks/miningLaserSide0.png new file mode 100644 index 0000000000000000000000000000000000000000..fad0939f59c8e69ecd192c5ea73bb98a8678fdaa GIT binary patch literal 545 zcmV++0^a?JP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00D_fL_t(I%Z-u2Zqq;zhQC>_ z*J)Y~6tz`VTIvdMtpI_d+>j7Y!!vL|;te?SJUjs9jF3>(Hc~H1)!4f`9O5MF*cHrW zz5CDn^UYYEot8S>-ezk!M8q*Do-?n05#t;PEJI|#qn$C+*>_^Rqby5ypX_3kbreO( z+37c&JK^=qbH<|)p;= zb<5TDSL*tjG)#KQ^F59ZKatx5oXc8?Hhav${zvkBe_d=0CNls~^&xCLOOH`guFbc|>afB4jdjXKf9>IF jG*N7fk^c_^wDbQ0SU0#r1Uzm@00000NkvXXu0mjfES%;W literal 0 HcmV?d00001 diff --git a/src/assets/warpdrive/textures/blocks/miningLaser_idle.png b/src/assets/warpdrive/textures/blocks/miningLaser_idle.png deleted file mode 100644 index 768a740f0125b82ff206ebc5aab23b9ce63543cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 477 zcmV<30V4j1P))7ADoGYN{t&|MT&_0?a~>}cS* zjfUg80Nl2Yqxb_cB1DqR0PLOScyHYtA=Um-q8IKUta#pyL>A)X=~(%jX$qrP7bj zcZ*b&01pNh2sm&^5_t%Ewh&4RVT_3#NMqn*-HO-&5r1*mZJWOwIFu0R9V)qen$;w` zZrE!CoxV0kNU6M7ORKjv=i#P&l?Vh)wApO%`u5JBoT$)L3rShgwlxuHO{bH@fsG7n ze7&-etz-r&hsiNaPCykPQ=k^Q2KE)~zhPek?Enqn!{Y+{Rj_aMnHS@mxWPQ^mL^TW zOIsQasAX|OkM&CKFjhg4J&IF>AP8|CM9>+jjwlS|jN-PQZ~6k!CF?NGA70TugQXu$ jX|3U(;J;zy{0J}rfuzd#e3x}G00000NkvXXu0mjfRS&wR diff --git a/src/assets/warpdrive/textures/blocks/miningLaser_miningPowered.png b/src/assets/warpdrive/textures/blocks/miningLaser_miningPowered.png deleted file mode 100644 index 2ed21e1157c38638f6a56cdc6ce08f3ca9344720..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmV;L0cHM)P)f;>-G6P+btfSv~|-g>lzm%mPCV4 zqXZ!ErvOFUwyUERHxQ3~argLQ=%cx-REBp!G!HOD3#}$z@V><;X>d{ zEbE!lK@)Xd$1bj}_f{^b8OJRVX-)N^%-+%qW}N^07*qoM6N<$ Ef=@=VAOHXW diff --git a/src/assets/warpdrive/textures/blocks/miningLaser_scanningLowPower.png b/src/assets/warpdrive/textures/blocks/miningLaser_scanningLowPower.png deleted file mode 100644 index 64ac3a9b44f529e7f990f9775e24a5b674823b68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 446 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 a1SIQ3yLxkV?p|+2fV#4_Qn`Xv(0>4m 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 VxaVQYx0|=pZ{NXP4_o8g{{i-^REPio diff --git a/src/assets/warpdrive/textures/blocks/powerLaserSides.png b/src/assets/warpdrive/textures/blocks/powerLaserSides.png deleted file mode 100644 index 8b3681137c0722c69277adf76c856b33d7e09db8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3297 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 diff --git a/src/assets/warpdrive/textures/blocks/powerLaserTopBottom.png b/src/assets/warpdrive/textures/blocks/powerLaserTopBottom.png deleted file mode 100644 index 175935b68166760d00d68eadf6a47b101f0bdf23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3155 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 N002ovPDHLkV1lMGa_Im7 diff --git a/src/assets/warpdrive/textures/blocks/reactorMonitor.psd b/src/assets/warpdrive/textures/blocks/reactorMonitor.psd deleted file mode 100644 index 65cf4f2b2aeb451465e9abe0c357df1fefc43c56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23630 zcmeHPcVHAn+n>Fj%cY0V;Ruk>QZ9|lk%T0dgv8`XNJ15b%iZR3M5sq7ZYi;TB3R0m6AWM!hf1EmCm$69UWH97NU+v!r`7hBug$s#@AAuA((sLuT}^ zZ@d#N)~Yk3$EGS06(%`dqb;0nrYok8tW-^}Ri&$=hi3^h8e|Q6lb*IJ#SMC$!6IwO zj8>|RRkRH9n4J(UCMwq2%;+2}5RX%oiRDH!El!P3j#DK{B;vHRcu7iXTAE~tI4Mz* zl#mGj(&8j3veYzL(onJEh|Us1F2k&@mX+rfII06GGrGoVHOUeZ>g(&{>yzV+W=(=5 zJv|+pNlJBG=()m)_*6 z$Y6;lZH!kL^$871Q-UNuF~MaS3T6N%GP#*nT8-vPqfwW|w7jgwXf;}Dj3%+XB27GC ztk$45)>{TvvnC^OROP3-C#aOH7WFBvvL#WJxKq#N-JcnwbH6= zXCPUYER{*54g+n}yiFL@+UjX{GvHQo6wgS&sCuAGx)1~8#lIW+YLyFolg+FneXLd` z&^lUA8>|-S07=^pP^)CsMzdaN%~G07I;~2H`#7P_pmy|}$=MYd32xPY+H2@mg~H`{ zhf$-~Cv+5T7HfVT1fnCbJ1l9boMxgE%4v(yW>(Spb%29Ax*aj7P{@i57OT>rqKopf zz@2!lRxQhursO6iCl=)7&J&Lw7TWZ$A+@sWa=wPq^H|9Gq(XN_8tp!HrG-ot2L!HEA z1wFMb*BPujEs0T+(rlqI@|n?2=sgEMV+ofbJt$MEaNK37@KivnGZNZx-EMgo)3)!l zyQ9n4_9%L1`}H-n;SN&?V}&T(xxB?#ZLL?D=^PD&z}+S{#$wwd-lmy}LZ|&NU~f^@ z{XOLGK3x6|^6okK{|9+@tg3311`VywN^pj$lW}jI#dKlY@#CCHyvEx<_E>Pu;vG+w zE^+$@v`ZwD8+Asr!lSfDci5DQgNk3e^@$r)S;qn5+ zH|dAVH$GlcKU`jb_$K{u`Nqdf>W9k<5Z|O9F5mcgN&Rqn0pgqV!{r+vFR33cFF<^g zez<(&<0bXOeccuD&^^^uy&FA1|pNE-yfQlYY2- zS@{Ny|)DM>zAihaIT)y$~lKSED0>n4zhs!rU zUQ$0?UV!)}{c!ol$4lym%L@?Sq))hn?p=zs0k$UA!yZILb}`Dx#>VrI;$4o+j>tfh zS!=MC+N>s<6_{MCQf9GMRKb=!qETe9(zL;*#{!(kce&1t=@3%3Lfe2fa?r>I;++|OoBXsXv-Djivaits^3GUOZn7Gj zjetg0nO#J=#-eZ$a>$~HD(56LmYY-q>J)wS2lHLEK}8>|I=%XPSKT}Q4?E$)b4ZqZo@ zzpO!*UG7pB*3l~13I;nHVeh9SD#|ov7H3r8JXVG~b{mz@)r=XhYAaz=XGhgmsB{d! z%&f{Dk1dcRRAn}r#=a`3%Xuf`D2B*_9hJgu_-xo6jQ0=+5grH9210jr(Y=V( ztAq|9DI^pr70c{77CHtA1T4|LPP7V9LUlDrbdd50hjMT>tXl2jBoSj1Aa&}b5)O`h z2Zz}F9cY9{mc7G+eG!X06xsidj9`IHL)#ok!5t39HwL>z!eLVsg9-=xjy3S0poj$l z;W$PzD;tc#<*?Ta=MYAovDOXe*cb&z9hi3P{3cl!+6>j6hwH&to5L|e+wdF?VV=RJ z!!sam91r$M8`KuBk*%^yKt|le!@(7E!1Rh)lf&q6Mw_V(i)SR;N}cm+eg(G9>=OkWK}ws|ID$6NX1qre7zpq0 zbSMiMWz4~nBE3coxBqtg*|5jC&BKL&-LLE$g?YN>UGFi6c2ST^kc&n4qHUL)y z&t?ec;mst^jI0pChIvs`SfVu;SrCkRc%I=Me&fbZ5c7{h_y@qKgFsiREG9)o0e%5M zu=`Jpw*fMiND71Lx6{lx{4B1pOf2@0-Agu1WirEqjVc4>WHo%J0P^!7udBD3Fdusz zSyhYkEIi~Q&EO#9yWqTr$qykqOg`{`_YE#&dc8mXt1Fc>))vwl`uRRj4%$cxOCVAQczV^*Y*WjVpt1Pbkf5_%ejvq%=%Jh-ot}g~Hoyu_SCJ@hSAs z^OePY%gC>eV&>$iBW|9%q?>2l2y-z!#n?;SysA|Q?S2%YE?>HN{hotY$$1Dhe(KSl zC>$>yAFa^Rs(1{j>$t0eOY_bdkNVKWK5BcM$*O zf*x*p_%WoMuBOd2e2qXn2BHjJd!V}wYAyNxhStz#6Rn4ZzgWz}0?smV4Vj3|w^8Jz zcoh0+Bx3)31aTq)5qsi#kWj9ED+w3_@9hYU?R|lXd&q;Fq-_$`Vjx)-EqN>;d3mK+ zWi!_?Dja;{A|VPvk*F)`h5DiaC=Ml|p=cP&M)~MIREjFmc=RArp&F!z-wE|-CYpoh zqlIV*dK#@p&!Wv}E831;MZ3|PXg_)%eTq?S>usSVUtYA3aq+E0B*9jCsa&Qh1C z7V1wHnQcb(7YcjXV}XYxz=O1_mp zpTCO#GXEX^3I2Kh?}9)<5WFOKTW~^fL2xr5G@yTgETA+%9WX6m zalqz)eF2{aoDaAu3=_r*GliAHDZ)9zmBQ`9L&C3xR|5kBqXW|eM+IsFX9unfd?oOM zz_WpWh{8pKL~_wYkxlfZ=mpWcqAx^OgMxx$g0h1q1X+Wg4B8s>UeLEezXwMI#|IY$ ztAl3+uL*7pJ`wy&NI*#ckerYQL#BtU2zf2!(~zG+143g$<)O;ZheOwd?hQQ?dOa*6 zOcGWarVm>b_EOk~VHd;s;W6R);p*^t;hVzW3qKdZj_4a9k5ENC60terP{jF2USw=! zQRI}!g^~Y`JQ~^DDZEokr!k!xI<4vSR;Q*Yc2rDMQIsxfan!3(r=$Mt+_Q5|XS(wf zows*B(fLM~?p?CG&|MaE+0o@xmp{9TyXJST?Ygwh@Fj z$nL|stGX}f{%ZFxd$4*8>QUZfMvqNBj`X-S~P$Ng9--N?Mb2GC3%@AbD2up5!YjgHz~~^(mjHMx-iIA4@%udMj;cnmKKI+NGiW zhE5*3cIX*tq_j-BNcurKH$69fR{ERif5_5gR@tkvUx&pFs~z^zu!|Y78Fa?xjB}aM znaa!!nN3;ZtjSr=Wi<`&Gh8`*4i<}wD~eYae_t}F#9XpZ!BX6(cuMj0$o?Y@BX^gg(xTF*O1~+KEt^{Q#wgyX zvQcYB{ZK9`pILsmBBEka#Y+{xRpwSMuKa5BfYG+m2gZbqnK)+am>XmB#x5J%G%jJ> zL*qUk-)+2h{GJK?31cQ~nQ;C7{QIB2|NO+%iSs9(ejxUNh6g@;u-k*W2j7|$GD$h< zwaMJcV<*2fxm8)J+^D=>RaCXMs#zshJ)^p;&Q>p1U!pVVW%PyW%<5&;7d4rhr!<#p zhS#j9`AI9+uGU_eQaI(=DK~0MYhS3f>&EJK=mq-8`n`s5L#^SUv6r#Ic-%DDG~d)T zRW|kMsmYCN3*5t0)v9`zBC)VCrr(SnrefIk8&-Q$F z;j@1}r+x184I?%*Zj9NuViRvu-KHNlkJ)_qdFk_8w{+XGaLcV13@ zo$2pff7kTxPy03d&mEX_;H&q>y?659sDnoj6(9QG{et)3JDhX)oewfUc=JQqhkHMg zezg1Jw2vE)q#oJzN$MxNj;0-L{B-E2dyb_a+jl(U_}eFjpVQhEIRq|sgb9S zpB{bs^D`6AG<~lA{Nfk7FRpx9_vOv6W`E87dcilL->mqy$G0258~ELhrnIKF&gPvx z@_ohkU!7B(yZj%^e_GGa`yuFu6&HG6*m^PP;+vNWE*<;v{vXd@HeJ5?)BK;qeqQ^_ zfL~t!HT%~i&EuNSUol^?w=BBa_38`PQm!4iUUvQ4-}JxTys_Z-uD`$dhxCube~$h0 z!p-_te(TCx18?oSU3~j%yWVamzcnJs+W>wU;1C+WK_k{uNbvhasN;fnX}l)JvY{@B zvVU&>8Hvb8!zRfUK>vb*35C?NL5Z?|h2|lVKp+SZhynscVS&QHuudT&QAnpQ5fPmt zBD#c$$l1qKEM2ZaU)heiem2S?&0IFcz6b}t6(@1igPG$52sMI%-i#SWwF z-@xyG%6^a<4qkHM#RLv;7$0mzu{c~FUl1S+q`ZZ&3dME`LlMQH*eni<%jXHWY*8`@ z!`PfY;Sz4nC}l+S)HzAK$fX;0=JxH^seFG`a*BEGaXG*LvWn)jS5%hNsEw~a5|j5- zr8@t>CTm*f6QjSUTV9*@-eN7y3xTIpD$6=m>7ooTZW2gZ<^lo0I!h zoi)#0Ca>tEvZP$;&%+MzV^R;C04FweR_BjSv(n$YT)49bv2GXaUm_8k)ES0`qw_m= zzWm|N*H0X~+#>)jk#>J_d#NFFZ;Wh8W3V**gszWNL`U zHBj*i1sVhy0pe5PB=jLDfZvTQ)8nA2qPn~CQ>XzB9Two5=P0*t&#_$gL!V>2^H3K) zcoe)0!=1vba_)9ez1;1fVm#ZyqMSCUc$V8XF$M{&LSRIkcLDrB6l9PZoEpsBf$Kyl zm+0maG;;AgV}Q@!*qCl+$Q) zrB+Ylzdz)hJp7bw-Ha0AM|Fc4hczyHr-Q+rgRw+gh*Be|r;(uFh&^G@$Ieo)GD41f zMxS4Tof9XKRx`-s_~xS$KzKk%tYUfI-4N!*HLHe|JPBUcQ@2w zG~p2ik%un^b-ebASAcQvh7;7o{~^>RK2e8tKO(;~>g4YmeI3_!Acfi;7elow z?AcH!k+do(S;vH3!IX1YXhWgwo4A7*+u5xhND7x^T9 z(3i(fyz|9@W5*AiKJwZAqwgOhrCRLQ?f9Sln*9$P>txiIDXruwiD$9`g{2nQ@SB7@ z&9F+6*SHCR^-FwujGH#&>MzJ4mSrgQstm_c`}CHqwV;*AZppX>xTUGLTqJI^2Z`J7 zNy1QakgX8KOtJPg5RR;+0HPEA`^eQS93Ab`TUo8etweS!i(8EGmELlZ7-|m^qwYcC z4sejI5SL7`_B9YrR!cF&TQ-ti&Bp!RKE0LQs%Ry$TaeziQ!O%_L6CA4xOZJ7rMM1( Yq{^aH+_vJq9 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 bFI+%U*Yr}!A^qapIs@dTm88lfO}_sJp{{WW diff --git a/src/assets/warpdrive/textures/blocks/reactorSide00.png.mcmeta b/src/assets/warpdrive/textures/blocks/reactorSide00.png.mcmeta deleted file mode 100644 index bd7117d0..00000000 --- a/src/assets/warpdrive/textures/blocks/reactorSide00.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "frames": [0,1,2,3,2,1] } } \ No newline at end of file diff --git a/src/assets/warpdrive/textures/blocks/reactorSide01.png b/src/assets/warpdrive/textures/blocks/reactorSide01.png deleted file mode 100644 index fc97cbf875b345246c8c5e5a23c67bf663edd48f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4502 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 diff --git a/src/assets/warpdrive/textures/blocks/reactorSide02.png.mcmeta b/src/assets/warpdrive/textures/blocks/reactorSide02.png.mcmeta deleted file mode 100644 index bd7117d0..00000000 --- a/src/assets/warpdrive/textures/blocks/reactorSide02.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "frames": [0,1,2,3,2,1] } } \ No newline at end of file diff --git a/src/assets/warpdrive/textures/blocks/reactorSide03.png b/src/assets/warpdrive/textures/blocks/reactorSide03.png deleted file mode 100644 index e2052b0817679cf4b9aa29c814191911998df4d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4483 zcmY*cWl+?CxBVeVEU|!emvl%=$I>C)C?zZ*jikWRDIrQPf(natE+XMlOLw!Bq=0}D z((w4tdvE5w5BHv#JNL^u=iZrn6ZD^{6NBhL000ncYN#0ABg=ij@Nw_6tCJhuJrHO3I3ZE!bL)1VVM)XygiEK5hw;TO) zLr^gS#Nh>y;@7`q^}S)o0?xx^W%<}pcg*bripo9H7pf3Q}a)obA0x5S;^1s2!Qf{^hG8-R8YlDyL4inL|o7!U|u&8_kcoRllbVl0!tQ}xuA*RP zP!6p~gcx}BcnAOr(<$%S9^V9xkW`I~NTeW1Yy@_H;NG#>+pphlj+T2V0>Dqdu<=`d zp?W%)3@*(5_S5479OoB=g|E+&oa(@ejX>efg4waxf3#68N^72<-`v=k)9O~XvKuf9 zy@ht#pv-PwU4+SApPjC@uW>|(JdaSvIbZD@I?*X+7=1?&ZNIpcs(#%>cz4Y>$=0oD z-)zoHv2H-_ouZPPd@NGTmZ1EOr|0p+-OIHV{wr+x6>*@(RURuOU7+;21NJ{{E>d$p z)Y=&U9JP3MOmX95!;;Dri@pz%PxLN7i5s1!!<)+o`R zbkOjla2YxtE_M)J+e$<$b98qqlPZH=!WevPc`726xnqZG7tR}uVY))h2KZi8OTi$HA0$8CF!EoJ`s++^b^ia zr7FxD^J$=yOO`0w9xHbSFQm#tdY_Wt1+#> zZb>+G7_AM!A&*c+5lG+!D6`lxDQTGNm_M7-C}m;b5F=Y4kR-s4Ht6JH%P7@u;QUT@ z(M@A7A{=L~!OuQJp880LG$bCT`BBWupL0su0vDdj$!%p8 z*~H+E`md~C*e3x*#Icl7z41_P+B_OO8Ypc5O?9?T3GHMOZLjeYN#VWh?Hq89r-?Z) zlJ^Z|`T*#I)(6fH^t?jGU&~6$mdglDj!g!QQ@_423awHz5j9%>N-&jKZc+x<-!q~& zf_{}LjVptedKxQy3A4CKz_sYo>C%IIF(|CHS#L$N5IWG-2lBJJ5tqllju7wWtR0?z zLZ;0dGCq`#j(88NoI;BI`ITahc+fXN`xxL`^gO`>Wa0WWD&ZLzqDAW`bo;C-B~GPh#-q862aA0CKr^R(JqHE^;E+IpR1-5u?Y{>+KX$;zp% zyQ_PUYpB~?!c!unBcszhJT&}icqT_YPfmDNWIJy=Z#HkG$<{K^k{?-${N|`xw_#ag zae!>~h_RHiC^k2-d|t0s39o!S(^A=jAVV}i%Xn5^FazzX`HSpFer=+y*_^}0R3Y7w zp>|MvYG_kWRo6jATSn;j(6={oc*Jq@B;|~jjA6bFJ`~cX(#yFc`3DN2JtvtvLQwNj z($P85b>yQ#o^BVoQQo9Flp5OX8+9C?l%O3sD3~QLm`9IZ>TBE3@;mi@{xf*u6rNX~ z*STMcsXmZ6a5;!u{5T}`k*B~y)OW0_53*{oIj%tX@xv3hm5MMuh+YJ=ahqMpK`7m< za<-X`u9&zOvsi@`uXuC1ap5fSfbm6$?~2N$N~X$k9#mLQs#-ux zoL9a~&{cLp^1Ik~1+<`(#n7}l++6dOHiMKPZ?zYDxsY!_G175#deOkps3jq*Px#X9zCHE{ZULDlY%<0E)!hlp}c>&+> z{!sk@CQUN`@Z;S+c_;bLcgW&cZ8HHz^R2cDSE)K#?;s3lo$?`HtSN4V?6*WDuluxK z`Mz0JRahHmu&!Igi;jWFjz%oEJwg-EW=!bb;_Uu&J#!(8l}5YESU9~rWkO;V1%^6{ zGJKAEF>sSU&U4^L&f@!qujSp%FGrmwoOZUB1q!T4GRv~IvPe9L=NB4?S4G783Dj8BX&jU^5ymKyD5&ppNu=tElniT$3&Shb$r z$oIEnOt4IJr=6x9uQadf&lIW>%685(uiT$kK6Cfp@5P?LzQJQBLC!W$O*2l&85^d~ z@a?IS^fI^K!Vd!kh$VJRaqM2f zQ+X+=H3grWoofVS^yMgL0rl;t+rcVoDxt9R>Al&J@$B)UtfQ=qAMS68Z+208wAC1N zCz`3fKTuTo#fj7&RR(QF#vKlJ_VKlYr~u~v z-ehsmFw_Nr;K%oOXcPck+}-020K9$z0K2vTAe{{W)SmBbdei^_w@On*$vAM~ckZx< zktS7d_^Ed_+@f&}Inkxv3)@VrzudA9`1QLBsqA|r8Ld_y zvhZ<`b|pImkRLf-nNH`#7&Q&1Fmj3dd@)#gSH-ZhxOl99C>xPFHJX}4=&7nabrqu{ zUTzOfnxO;8SfgQvATplAUNYs?-RW|M?KXcmx1`F-N_OV!>kHotd!SO>(oF@Yn1VIB z{SZx)a`j@EAl496DZYGVsL`6G#s-obq2aR)4TbOT?~5#s>*E()GpTmFj9b>Xv}iYB zZdPzAs;keo`WGO_v=4cTfj`SxZtT&hg$25O|BwoNxsmg!sVUa3uV>?>!X-jlK&7c$ z1-{Hk;E6s@&%nSyI-g85%r_+t%$(U$JpW2WK>@5-u)Y3JW&JdmvDkR$FI*EAez1FW< zQB{?Bc(N=iE^e|#PTxh5p~=uCtM?YerGUMf_&^!<S(eL?sc^P3|X~Bl6 zZ!@`{xG!H!ZC|)z`=~y}&Y%4AIwfp@jyA!x+{9z)msdmiWE%L9ue0nWb^iFb`a&mx zEsV53D_8!*0`a)p{^eyRbaqj*O0WKxT{Wl5Ufm(TlpEfzA*b`8s24+CzH}o{uNhPZ zx{rbEE#jlZTg6K${*#W7x<$h&RKBR!3!^FV#+0H$MUbrx&8G71%L>L|<7s+2EC=rH zC=(4_q{k|swt-Q!j-AL`ji+_F!H0u9+yP3KYLh-8+{w#PlKMEtSPdaezx-MJunlqW z<%HG`G}*JIP5+U(I8SWZ|2oG=W*6Gcenw)~{j3#8y_&c4kEx+vZHY<$sW)q7fu8)p z?1=_RzB*SJ>TD;K0Cff{oqcpSp8T1|xN$k8vF=ikppc~DNl!vIX_>X-^XuHBpvHjZ zElGp*;pM*d#a>54TU*;wQ_C6!y@USQ!BR#8LOY}TExqKo*LyPwt|;5B*6=&|!<8Qj zQ>gA8Qx~(v9lyZiE!}xbp5kv|H<#vQU7+bF>ujBkZnFdY7-unkFq3TBT$`nvFuDeb zG)=^3^*Y`fW>+Nw(QICP;4?cv+9b@&%j;^f-)2}25w!j`Hv6(Y@NeYy=*Luwn%cQ= z)pZvxIp@~J6c?NUtpL)5`&m16hihjE);2e5wk$F6cGE=prhu8{-xENyw|AOto%Md@ zW3R6DB!y1?yvPil#7JC=)n10)l+y%N8|^(#24rgbheLGs;K-wYf{yr(b23V zp3G@6D-xM}>-IN66@MMz$@#v&fB!y#V}Fj@@z<@-pUJ(KrWUPUK#1Nv>i8!h$CD~U z#!Q~(-=og>v;=|BhAdzCfNFpsYbd0yzMAWKIPE+ z2%eZhiXb_J{=-0U44j|YYdI>muwzOGJZr8bMpI7q_t6%%QWUix08)aaQa)u3j6g+S z0JsZGjY2hhwK9<_{@H>WT&T08`@Znp7{Tc0dUHO0R*X}~-f*6@mEi(%=JT+Kn)S5G z2mZ>3mp5;E@Ob6*{~rs*|0&tfGmnurz{pB1PBON5j<7y^@hVo0O-eZpkQ>9o^KqF= z9kX+lW{EmL-#z}6aN(BQzMgo)GU^@Z=M<7YR=_{#(qIbQqz zxIHP?pKVXhA-u3`>~RfA7I(ecN!8aeH8w2a`7)2?|ExbKT2BwfdpJgUZdd!?R{SrC z|LacmTX44v2rF4hL0(rrt-)P-F!*_zZ*fikQ3Q6BrCX=c`VP4J%LA@nygH(7>*_!8 zt4R;?wtwW84u82oMKrNRBL8JclWNy}6k{fhI7trB$EI=a5DB2eY%{_*G;# z{eVAVKKHJY9K{=L@o3^&l-dv?M0DfbexJjrEklw`*Mk0!;;VOw;A<$*{#`F2R)g#Q Qn+E_*)n_VI%C?dJ1?`i3g#Z8m diff --git a/src/assets/warpdrive/textures/blocks/reactorSide03.png.mcmeta b/src/assets/warpdrive/textures/blocks/reactorSide03.png.mcmeta deleted file mode 100644 index bd7117d0..00000000 --- a/src/assets/warpdrive/textures/blocks/reactorSide03.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "frames": [0,1,2,3,2,1] } } \ No newline at end of file diff --git a/src/assets/warpdrive/textures/blocks/reactorSide10.png b/src/assets/warpdrive/textures/blocks/reactorSide10.png deleted file mode 100644 index 77135a3e416b63e456a892ee98e45a5f255cf223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4475 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

)QO;x$d0Kk@K(99hVq=`C2 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 ChIkqP diff --git a/src/assets/warpdrive/textures/blocks/reactorSide11.png.mcmeta b/src/assets/warpdrive/textures/blocks/reactorSide11.png.mcmeta deleted file mode 100644 index bd7117d0..00000000 --- a/src/assets/warpdrive/textures/blocks/reactorSide11.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "frames": [0,1,2,3,2,1] } } \ No newline at end of file diff --git a/src/assets/warpdrive/textures/blocks/reactorSide12.png b/src/assets/warpdrive/textures/blocks/reactorSide12.png deleted file mode 100644 index 37c69f701483356bbb363f1a0a0e3af3ed191ce3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4515 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 KsnmdMLjMOdoRUQV diff --git a/src/assets/warpdrive/textures/blocks/reactorSide13.png.mcmeta b/src/assets/warpdrive/textures/blocks/reactorSide13.png.mcmeta deleted file mode 100644 index bd7117d0..00000000 --- a/src/assets/warpdrive/textures/blocks/reactorSide13.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "frames": [0,1,2,3,2,1] } } \ No newline at end of file diff --git a/src/assets/warpdrive/textures/blocks/reactorSide20.png b/src/assets/warpdrive/textures/blocks/reactorSide20.png deleted file mode 100644 index e89b36c40b10190a5d36837f218c3f54b04d7368..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4492 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 diff --git a/src/assets/warpdrive/textures/blocks/reactorSide22.png.mcmeta b/src/assets/warpdrive/textures/blocks/reactorSide22.png.mcmeta deleted file mode 100644 index bd7117d0..00000000 --- a/src/assets/warpdrive/textures/blocks/reactorSide22.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "frames": [0,1,2,3,2,1] } } \ No newline at end of file diff --git a/src/assets/warpdrive/textures/blocks/reactorSide23.png b/src/assets/warpdrive/textures/blocks/reactorSide23.png deleted file mode 100644 index a8106fd9a52300be9f4a7a50b57f31a721730536..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4531 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 O0UZrP^?Hay%zptLBzxun diff --git a/src/assets/warpdrive/textures/blocks/reactorSide23.png.mcmeta b/src/assets/warpdrive/textures/blocks/reactorSide23.png.mcmeta deleted file mode 100644 index bd7117d0..00000000 --- a/src/assets/warpdrive/textures/blocks/reactorSide23.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "frames": [0,1,2,3,2,1] } } \ No newline at end of file diff --git a/src/assets/warpdrive/textures/blocks/reactorSide30.png b/src/assets/warpdrive/textures/blocks/reactorSide30.png deleted file mode 100644 index 7df1259e61db9259b8f40926f8d5c1c431a9a69f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4492 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 diff --git a/src/assets/warpdrive/textures/blocks/reactorSide31.png.mcmeta b/src/assets/warpdrive/textures/blocks/reactorSide31.png.mcmeta deleted file mode 100644 index bd7117d0..00000000 --- a/src/assets/warpdrive/textures/blocks/reactorSide31.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "frames": [0,1,2,3,2,1] } } \ No newline at end of file diff --git a/src/assets/warpdrive/textures/blocks/reactorSide32.png b/src/assets/warpdrive/textures/blocks/reactorSide32.png deleted file mode 100644 index 2672a03fb55f9ccdb4fb922b639713e589af2b2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4516 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 Z0|2^W2Cm?kvg-f<002ovPDHLkV1f^ZIfVcK diff --git a/src/assets/warpdrive/textures/blocks/transporterSide.png b/src/assets/warpdrive/textures/blocks/transporterSide.png deleted file mode 100644 index 790cce4d97680c565264ca450cb427b0e2daf802..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3054 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 BUa|lH diff --git a/src/assets/warpdrive/textures/items/componentEmptyCore.PSD b/src/assets/warpdrive/textures/items/componentEmptyCore.PSD deleted file mode 100644 index fbadd94c86516ae9e522d47d0e4c35665291b7a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27718 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 Zlm|>Xw_t1Cy{2}HTy13$V9~H*^S?7WRPq1- diff --git a/src/assets/warpdrive/textures/items/componentEmptyCore.png b/src/assets/warpdrive/textures/items/componentEmptyCore.png deleted file mode 100644 index 6ed5d00a8116e8a6c30f79375d8c51882e79b520..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3077 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 Tf}-@e00000NkvXXu0mjfb)2v; diff --git a/src/assets/warpdrive/textures/items/componentInterfaceComputer.png b/src/assets/warpdrive/textures/items/componentInterfaceComputer.png deleted file mode 100644 index eed32561413127f94d292a76e9d2d99efd8c3ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3013 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 diff --git a/src/assets/warpdrive/textures/items/componentInterfacePower.png b/src/assets/warpdrive/textures/items/componentInterfacePower.png deleted file mode 100644 index d467253c14557a773363d9e2ec4997e705d70859..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3249 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 diff --git a/src/assets/warpdrive/textures/items/componentInterfacePower.psd b/src/assets/warpdrive/textures/items/componentInterfacePower.psd deleted file mode 100644 index eedee2672eb072730b572e50dc0fec68ab3c6956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26744 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 BR#pH2 diff --git a/src/assets/warpdrive/textures/items/componentReactorCore.png b/src/assets/warpdrive/textures/items/componentReactorCore.png deleted file mode 100644 index 25ac7675a8c53dcadf6fe2ffca2155154783abee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3356 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 A*Z=?k diff --git a/src/assets/warpdrive/textures/items/componentWarpCore.png b/src/assets/warpdrive/textures/items/componentWarpCore.png deleted file mode 100644 index 674ca427640b67beb16d368f18aeae1d93742fdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3401 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 diff --git a/src/assets/warpdrive/textures/items/componentWarpCore.psd b/src/assets/warpdrive/textures/items/componentWarpCore.psd deleted file mode 100644 index 8f25d07d0a2274ee4f6abbf9661af199fac8cca1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36860 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 L2bBld2KWB}UCsg- diff --git a/src/assets/warpdrive/textures/items/reactorFocus.png b/src/assets/warpdrive/textures/items/reactorFocus.png deleted file mode 100644 index 8059767da2f6424e8d0607d25591a0f3aa6ec280..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3079 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 VhmBiJu5thX002ovPDHLkV1f+`up|Hg diff --git a/src/assets/warpdrive/textures/items/reactorFocus.psd b/src/assets/warpdrive/textures/items/reactorFocus.psd deleted file mode 100644 index 4679fb301889d609b90c6143c8ba36e947b19073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23650 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 Ii8s*y0L`(Wv;Y7A diff --git a/src/cr0s/WarpDrive/BlockAir.java b/src/cr0s/WarpDrive/BlockAir.java index 8e12a2c7..1de83d80 100644 --- a/src/cr0s/WarpDrive/BlockAir.java +++ b/src/cr0s/WarpDrive/BlockAir.java @@ -1,345 +1,288 @@ package cr0s.WarpDrive; import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; public class BlockAir extends Block { - private final boolean TRANSPARENT_AIR = true; - private final boolean AIR_DEBUG = false; - private final int AIR_BLOCK_TICKS = 40; - private Icon[] iconBuffer; + private final boolean TRANSPARENT_AIR = true; - public BlockAir(int par1) { - super(par1, Material.air); - setHardness(0.0F); - setUnlocalizedName("warpdrive.blocks.Air"); - } + public BlockAir(int par1) + { + super(par1, Material.air); + } - @Override - public boolean isOpaqueCube() { - return false; - } + @Override + public boolean isOpaqueCube() + { + return false; + } - @Override - public boolean isAirBlock(World var1, int var2, int var3, int var4) { - return true; - } + @Override + public boolean isAirBlock(World var1, int var2, int var3, int var4) + { + return true; + } - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { - return null; - } + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) + { + return null; + } - @Override - public boolean isBlockReplaceable(World var1, int var2, int var3, int var4) { - return true; - } + @Override + public boolean isBlockReplaceable(World var1, int var2, int var3, int var4) + { + return true; + } - @Override - public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { - return true; - } + @Override + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) + { + return true; + } - @Override - public boolean canCollideCheck(int var1, boolean var2) { - return false; - } + @Override + public boolean canCollideCheck(int var1, boolean var2) + { + return false; + } - @Override - public int getRenderBlockPass() { - return TRANSPARENT_AIR ? 1 : 0; - } + @Override + public int getRenderBlockPass() + { + return TRANSPARENT_AIR ? 1 : 0; + } - @Override - public void registerIcons(IconRegister par1IconRegister) { - if (AIR_DEBUG) { - iconBuffer = new Icon[16]; - iconBuffer[ 0] = par1IconRegister.registerIcon("warpdrive:airBlock0"); - iconBuffer[ 1] = par1IconRegister.registerIcon("warpdrive:airBlock1"); - iconBuffer[ 2] = par1IconRegister.registerIcon("warpdrive:airBlock2"); - iconBuffer[ 3] = par1IconRegister.registerIcon("warpdrive:airBlock3"); - iconBuffer[ 4] = par1IconRegister.registerIcon("warpdrive:airBlock4"); - iconBuffer[ 5] = par1IconRegister.registerIcon("warpdrive:airBlock5"); - iconBuffer[ 6] = par1IconRegister.registerIcon("warpdrive:airBlock6"); - iconBuffer[ 7] = par1IconRegister.registerIcon("warpdrive:airBlock7"); - iconBuffer[ 8] = par1IconRegister.registerIcon("warpdrive:airBlock8"); - iconBuffer[ 9] = par1IconRegister.registerIcon("warpdrive:airBlock9"); - iconBuffer[10] = par1IconRegister.registerIcon("warpdrive:airBlock10"); - iconBuffer[11] = par1IconRegister.registerIcon("warpdrive:airBlock11"); - iconBuffer[12] = par1IconRegister.registerIcon("warpdrive:airBlock12"); - iconBuffer[13] = par1IconRegister.registerIcon("warpdrive:airBlock13"); - iconBuffer[14] = par1IconRegister.registerIcon("warpdrive:airBlock14"); - iconBuffer[15] = par1IconRegister.registerIcon("warpdrive:airBlock15"); - } else { - blockIcon = par1IconRegister.registerIcon("warpdrive:airBlock"); - } - } + @Override + public void registerIcons(IconRegister par1IconRegister) + { + this.blockIcon = par1IconRegister.registerIcon("warpdrive:airBlock"); + } - @Override - public Icon getIcon(int side, int metadata) { - if (AIR_DEBUG) { - return iconBuffer[metadata]; - } else { - return blockIcon; - } - } + @Override + public int getMobilityFlag() + { + return 1; + } - @Override - public int getMobilityFlag() { - return 1; - } + @Override + public int idDropped(int var1, Random var2, int var3) + { + return -1; + } - @Override - public int idDropped(int var1, Random var2, int var3) { - return -1; - } + /** + * Returns the quantity of items to drop on block destruction. + */ + @Override + public int quantityDropped(Random par1Random) + { + return 0; + } - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random par1Random) { - return 0; - } + /** + * How many world ticks before ticking + */ + @Override + public int tickRate(World par1World) + { + return 20; + } - /** - * How many world ticks before ticking - */ - @Override - public int tickRate(World par1World) { - return AIR_BLOCK_TICKS; - } + /** + * Ticks the block if it's been scheduled + */ + @Override + public void updateTick(World par1World, int x, int y, int z, Random par5Random) + { + int concentration = par1World.getBlockMetadata(x, y, z); + boolean isInSpaceWorld = par1World.provider.dimensionId == WarpDrive.instance.spaceDimID || par1World.provider.dimensionId == WarpDrive.instance.hyperSpaceDimID; - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World par1World, int x, int y, int z, Random par5Random) { - int concentration = par1World.getBlockMetadata(x, y, z); - boolean isInSpaceWorld = par1World.provider.dimensionId == WarpDriveConfig.G_SPACE_DIMENSION_ID || par1World.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID; + // Remove air block to vacuum block + if (concentration <= 0 || !isInSpaceWorld) + { + //System.out.println("Killing air block"); + par1World.setBlock(x, y, z, 0, 0, 2); // replace our air block to vacuum block + } + else + { + //System.out.println("Conc: current " + concentration + " new: " + (concentration - 1) + " to spread: " + (concentration - 2)); + // Try to spread the air + spreadAirBlock(par1World, x, y, z, concentration); + } - // Remove air block to vacuum block - if (concentration <= 0 || !isInSpaceWorld) { - par1World.setBlock(x, y, z, 0, 0, 3); // replace our air block to vacuum block - } else { - // Try to spread the air - spreadAirBlock(par1World, x, y, z, concentration); - } + par1World.scheduleBlockUpdate(x, y, z, this.blockID, 20); + } - par1World.scheduleBlockUpdate(x, y, z, this.blockID, AIR_BLOCK_TICKS); - } + @Override + public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) + { + if (par1IBlockAccess.getBlockId(par2, par3, par4) == this.blockID) + { + return false; + } + else + { + final int i = par1IBlockAccess.getBlockId(par2, par3, par4); + boolean var6 = false; - @Override - public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { - if (AIR_DEBUG) { - return side == 0; - } - - int sideBlockID = world.getBlockId(x, y, z); - if (sideBlockID == this.blockID) { - return false; - } - return world.isAirBlock(x, y, z); - } + if (Block.blocksList[i] != null) + { + var6 = !Block.blocksList[i].isOpaqueCube(); + } - private void spreadAirBlock(World worldObj, int x, int y, int z, int concentration) { - int air_count = 1; - int empty_count = 0; - int sum_concentration = concentration; + final boolean var7 = i == 0; - // Count air in adjacent blocks - int xp_blockId = worldObj.getBlockId(x + 1, y, z); - boolean xp_isAir = WarpDriveConfig.isAirBlock(worldObj, xp_blockId, x + 1, y, z);; - int xp_concentration = (xp_blockId != this.blockID) ? 0 : worldObj.getBlockMetadata(x + 1, y, z); - if (xp_isAir) { - air_count++; - if (xp_concentration > 0) { - sum_concentration += xp_concentration; - } else { - empty_count++; - } - } - int xn_blockId = worldObj.getBlockId(x - 1, y, z); - boolean xn_isAir = WarpDriveConfig.isAirBlock(worldObj, xn_blockId, x - 1, y, z); - int xn_concentration = (xn_blockId != this.blockID) ? 0 : worldObj.getBlockMetadata(x - 1, y, z); - if (xn_isAir) { - air_count++; - if (xn_concentration > 0) { - sum_concentration += xn_concentration; - } else { - empty_count++; - } - } - int yp_blockId = worldObj.getBlockId(x, y + 1, z); - boolean yp_isAir = WarpDriveConfig.isAirBlock(worldObj, yp_blockId, x, y + 1, z); - int yp_concentration = (yp_blockId != this.blockID) ? 0 : worldObj.getBlockMetadata(x, y + 1, z); - if (yp_isAir) { - air_count++; - if (yp_concentration > 0) { - sum_concentration += yp_concentration; - } else { - empty_count++; - } - } - int yn_blockId = worldObj.getBlockId(x, y - 1, z); - boolean yn_isAir = WarpDriveConfig.isAirBlock(worldObj, yn_blockId, x, y - 1, z); - int yn_concentration = (yn_blockId != this.blockID) ? 0 : worldObj.getBlockMetadata(x, y - 1, z); - if (yn_isAir) { - air_count++; - if (yn_concentration > 0) { - sum_concentration += yn_concentration; - } else { - empty_count++; - } - } - int zp_blockId = worldObj.getBlockId(x, y, z + 1); - boolean zp_isAir = WarpDriveConfig.isAirBlock(worldObj, zp_blockId, x, y, z + 1); - int zp_concentration = (zp_blockId != this.blockID) ? 0 : worldObj.getBlockMetadata(x, y, z + 1); - if (zp_isAir) { - air_count++; - if (zp_concentration > 0) { - sum_concentration += zp_concentration; - } else { - empty_count++; - } - } - int zn_blockId = worldObj.getBlockId(x, y, z - 1); - boolean zn_isAir = WarpDriveConfig.isAirBlock(worldObj, zn_blockId, x, y, z - 1); - int zn_concentration = (zn_blockId != this.blockID) ? 0 : worldObj.getBlockMetadata(x, y, z - 1); - if (zn_isAir) { - air_count++; - if (zn_concentration > 0) { - sum_concentration += zn_concentration; - } else { - empty_count++; - } - } + if ((var6 || var7) && par5 == 3 && !var6) + { + return true; + } + else if ((var6 || var7) && par5 == 4 && !var6) + { + return true; + } + else if ((var6 || var7) && par5 == 5 && !var6) + { + return true; + } + else if ((var6 || var7) && par5 == 2 && !var6) + { + return true; + } + else if ((var6 || var7) && par5 == 0 && !var6) + { + return true; + } + else if ((var6 || var7) && par5 == 1 && !var6) + { + return true; + } + else + { + return false; + } + } + } - if (empty_count > 0) { - if (concentration < 8) { - sum_concentration -= empty_count; - } else if (concentration < 4) { - sum_concentration -= empty_count + (worldObj.rand.nextBoolean() ? 0 : empty_count); - } else { - sum_concentration -= 1; - } - } - if (sum_concentration < 0) sum_concentration = 0; - int mid_concentration = (int) Math.floor(sum_concentration * 1.0F / air_count); - int new_concentration = sum_concentration - mid_concentration * (air_count - 1); - if (new_concentration > 14) { - new_concentration = 14; - } - if (concentration != new_concentration) - { - if (concentration == 15) { - if ( (xp_blockId != WarpDriveConfig.airgenID) && (xn_blockId != WarpDriveConfig.airgenID) - && (yp_blockId != WarpDriveConfig.airgenID) && (yn_blockId != WarpDriveConfig.airgenID) - && (zp_blockId != WarpDriveConfig.airgenID) && (zn_blockId != WarpDriveConfig.airgenID) ) { -// WarpDrive.debugPrint("AirGenerator not found, removing air block at " + x + ", " + y + ", " + z); - worldObj.setBlockMetadataWithNotify(x, y, z, 1, 2); - } else { - // keep the block as a source -/* WarpDrive.debugPrint("15 + " - + xp_concentration + " " + xn_concentration + " " - + yp_concentration + " " + yn_concentration + " " - + zp_concentration + " " + zn_concentration + " = " + sum_concentration + " total, " + empty_count + " empty / " + air_count + " -> " + new_concentration);/**/ - } - } else { - worldObj.setBlockMetadataWithNotify(x, y, z, new_concentration, 2); - } - } - - // Check and setup air to adjacent blocks - if (xp_isAir) { - if (xp_blockId == this.blockID) { - if (xp_concentration != 15) { - worldObj.setBlockMetadataWithNotify(x + 1, y, z, mid_concentration, 2); - } - } else { - worldObj.setBlock(x + 1, y, z, this.blockID, mid_concentration, 2); - } - } + private void spreadAirBlock(World worldObj, int x, int y, int z, int concentration) + { + if (concentration <= 0) + { + return; + } - if (xn_isAir) { - if (xn_blockId == this.blockID) { - if (xn_concentration != 15) { - worldObj.setBlockMetadataWithNotify(x - 1, y, z, mid_concentration, 2); - } - } else { - worldObj.setBlock(x - 1, y, z, this.blockID, mid_concentration, 2); - } - } + int mid_concentration; + int block_count = 1; + mid_concentration = worldObj.getBlockMetadata(x, y, z); - if (yp_isAir) { - if (yp_blockId == this.blockID) { - if (yp_concentration != 15) { - worldObj.setBlockMetadataWithNotify(x, y + 1, z, mid_concentration, 2); - } - } else { - worldObj.setBlock(x, y + 1, z, this.blockID, mid_concentration, 2); - } - } + // Count air in adjacent blocks + if (worldObj.isAirBlock(x + 1, y, z)) + { + block_count++; + mid_concentration += worldObj.getBlockMetadata(x + 1, y, z); + } - if (yn_isAir) { - if (yn_blockId == this.blockID) { - if (yn_concentration != 15) { - worldObj.setBlockMetadataWithNotify(x, y - 1, z, mid_concentration, 2); - } - } else { - worldObj.setBlock(x, y - 1, z, this.blockID, mid_concentration, 2); - } - } + if (worldObj.isAirBlock(x - 1, y, z)) + { + block_count++; + mid_concentration += worldObj.getBlockMetadata(x - 1, y, z); + } - if (zp_isAir) { - if (zp_blockId == this.blockID) { - if (zp_concentration != 15) { - worldObj.setBlockMetadataWithNotify(x, y, z + 1, mid_concentration, 2); - } - } else { - worldObj.setBlock(x, y, z + 1, this.blockID, mid_concentration, 2); - } - } + if (worldObj.isAirBlock(x, y + 1, z)) + { + block_count++; + mid_concentration += worldObj.getBlockMetadata(x, y + 1, z); + } - if (zn_isAir) { - if (zn_blockId == this.blockID) { - if (zn_concentration != 15) { - worldObj.setBlockMetadataWithNotify(x, y, z - 1, mid_concentration, 2); - } - } else { - worldObj.setBlock(x, y, z - 1, this.blockID, mid_concentration, 2); - } - } - } + if (worldObj.isAirBlock(x, y - 1, z)) + { + block_count++; + mid_concentration += worldObj.getBlockMetadata(x, y - 1, z); + } - // Used to prevent updates on chunk generation - @Override - public boolean func_82506_l() { - return false; - } + if (worldObj.isAirBlock(x, y, z + 1)) + { + block_count++; + mid_concentration += worldObj.getBlockMetadata(x, y, z + 1); + } - /** - * Returns if this block is collidable. Args: x, y, z - */ - @Override - public boolean isCollidable() { - return false; - } + if (worldObj.isAirBlock(x, y, z - 1)) + { + block_count++; + mid_concentration += worldObj.getBlockMetadata(x, y, z - 1); + } - @Override - public void onBlockAdded(World par1World, int par2, int par3, int par4) { - if (par1World.provider.dimensionId == WarpDriveConfig.G_SPACE_DIMENSION_ID || par1World.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID) { - par1World.scheduleBlockUpdate(par2, par3, par4, this.blockID, this.tickRate(par1World)); - } else { - par1World.setBlockToAir(par2, par3, par4); - } - } + mid_concentration = (int)Math.floor(mid_concentration / block_count); + setNewAirBlockWithConcentration(worldObj, x, y, z, mid_concentration); + + // Check and setup air to adjacent blocks + if (worldObj.isAirBlock(x + 1, y, z) && (mid_concentration > worldObj.getBlockMetadata(x + 1, y, z))) + { + setNewAirBlockWithConcentration(worldObj, x + 1, y, z, mid_concentration); + } + + if (worldObj.isAirBlock(x - 1, y, z) && (mid_concentration > worldObj.getBlockMetadata(x - 1, y, z))) + { + setNewAirBlockWithConcentration(worldObj, x - 1, y, z, mid_concentration); + } + + if (worldObj.isAirBlock(x, y + 1, z) && (mid_concentration > worldObj.getBlockMetadata(x, y + 1, z))) + { + setNewAirBlockWithConcentration(worldObj, x, y + 1, z, mid_concentration); + } + + if (worldObj.isAirBlock(x, y - 1, z) && (mid_concentration > worldObj.getBlockMetadata(x, y - 1, z))) + { + setNewAirBlockWithConcentration(worldObj, x, y - 1, z, mid_concentration); + } + + if (worldObj.isAirBlock(x, y, z + 1) && (mid_concentration > worldObj.getBlockMetadata(x, y, z + 1))) + { + setNewAirBlockWithConcentration(worldObj, x, y, z + 1, mid_concentration); + } + + if (worldObj.isAirBlock(x, y, z - 1) && (mid_concentration > worldObj.getBlockMetadata(x, y, z - 1))) + { + setNewAirBlockWithConcentration(worldObj, x, y, z - 1, mid_concentration); + } + } + + private void setNewAirBlockWithConcentration(World worldObj, int x, int y, int z, int concentration) + { + worldObj.setBlock(x, y, z, this.blockID, concentration, 2); + } + + @Override + public boolean func_82506_l() + { + return false; + } + + /** + * Returns if this block is collidable. Args: x, y, z + */ + @Override + public boolean isCollidable() + { + return false; + } + + @Override + public void onBlockAdded(World par1World, int par2, int par3, int par4) + { + if (par1World.provider.dimensionId == WarpDrive.instance.spaceDimID || par1World.provider.dimensionId == WarpDrive.instance.hyperSpaceDimID) + { + par1World.scheduleBlockUpdate(par2, par3, par4, this.blockID, this.tickRate(par1World)); + } + else + { + par1World.setBlockToAir(par2, par3, par4); + } + } } \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/BlockAirGenerator.java b/src/cr0s/WarpDrive/BlockAirGenerator.java similarity index 67% rename from src/cr0s/WarpDrive/machines/BlockAirGenerator.java rename to src/cr0s/WarpDrive/BlockAirGenerator.java index 4098f102..8a304d7b 100644 --- a/src/cr0s/WarpDrive/machines/BlockAirGenerator.java +++ b/src/cr0s/WarpDrive/BlockAirGenerator.java @@ -1,13 +1,11 @@ -package cr0s.WarpDrive.machines; +package cr0s.WarpDrive; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; import java.util.Random; -import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; @@ -25,10 +23,6 @@ public class BlockAirGenerator extends BlockContainer public BlockAirGenerator(int id, int texture, Material material) { super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.AirGenerator"); } @Override @@ -42,20 +36,30 @@ public class BlockAirGenerator extends BlockContainer } @Override - public Icon getIcon(int side, int metadata) { - if (side == 0) { + public Icon getIcon(int side, int metadata) + { + if (side == 0) + { return iconBuffer[ICON_BOTTOM]; - } else if (side == 1) { - if (metadata == 0) { + } + else if (side == 1) + { + if (metadata == 0) + { return iconBuffer[ICON_INACTIVE_SIDE]; - } else { + } + else + { return iconBuffer[ICON_SIDE_ACTIVATED]; } } - if (metadata == 0) { // Inactive state - return iconBuffer[ICON_INACTIVE_SIDE]; - } else if (metadata == 1) { + if (metadata == 0) // Inactive state + { + return iconBuffer[ICON_INACTIVE_SIDE]; + } + else if (metadata == 1) + { return iconBuffer[ICON_SIDE_ACTIVATED]; } @@ -63,7 +67,8 @@ public class BlockAirGenerator extends BlockContainer } @Override - public TileEntity createNewTileEntity(World var1) { + public TileEntity createNewTileEntity(World var1) + { return new TileEntityAirGenerator(); } @@ -71,7 +76,8 @@ public class BlockAirGenerator extends BlockContainer * Returns the quantity of items to drop on block destruction. */ @Override - public int quantityDropped(Random par1Random) { + public int quantityDropped(Random par1Random) + { return 1; } @@ -79,29 +85,36 @@ public class BlockAirGenerator extends BlockContainer * Returns the ID of the items to drop on destruction. */ @Override - public int idDropped(int par1, Random par2Random, int par3) { + public int idDropped(int par1, Random par2Random, int par3) + { return this.blockID; } @Override - public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { + public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { return false; } - WarpEnergyTE te = (WarpEnergyTE)par1World.getBlockTileEntity(par2, par3, par4); - if (te != null && (par5EntityPlayer.getHeldItem() == null)) { - par5EntityPlayer.addChatMessage(te.getStatus()); - return true; + TileEntityAirGenerator gen = (TileEntityAirGenerator)par1World.getBlockTileEntity(par2, par3, par4); + + if (gen != null) + { + par5EntityPlayer.addChatMessage("[AirGen] Energy level: " + gen.getCurrentEnergyValue() + " Eu"); } - return false; + return true; } @Override - public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) { + public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) + { TileEntity te = par1World.getBlockTileEntity(par2, par3, par4); - if (te != null) { + + if (te != null) + { te.invalidate(); } diff --git a/src/cr0s/WarpDrive/BlockCamera.java b/src/cr0s/WarpDrive/BlockCamera.java new file mode 100644 index 00000000..2576c2bc --- /dev/null +++ b/src/cr0s/WarpDrive/BlockCamera.java @@ -0,0 +1,64 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.Random; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Icon; +import net.minecraft.world.World; + +public class BlockCamera extends BlockContainer +{ + private Icon[] iconBuffer; + + private final int ICON_SIDE = 0; + + public BlockCamera(int id, int texture, Material material) + { + super(id, material); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister par1IconRegister) + { + iconBuffer = new Icon[1]; + // Solid textures + iconBuffer[ICON_SIDE] = par1IconRegister.registerIcon("warpdrive:cameraSide"); + } + + @Override + public Icon getIcon(int side, int metadata) + { + return iconBuffer[ICON_SIDE]; + } + + @Override + public TileEntity createNewTileEntity(World var1) + { + return new TileEntityCamera(); + } + + /** + * Returns the quantity of items to drop on block destruction. + */ + @Override + public int quantityDropped(Random par1Random) + { + return 1; + } + + /** + * Returns the ID of the items to drop on destruction. + */ + @Override + public int idDropped(int par1, Random par2Random, int par3) + { + return this.blockID; + } +} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/BlockCloakingCoil.java b/src/cr0s/WarpDrive/BlockCloakingCoil.java new file mode 100644 index 00000000..db908dea --- /dev/null +++ b/src/cr0s/WarpDrive/BlockCloakingCoil.java @@ -0,0 +1,72 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Icon; +import net.minecraft.world.World; + +public class BlockCloakingCoil extends Block +{ + private Icon[] iconBuffer; + + public BlockCloakingCoil(int id, int texture, Material material) + { + super(id, material); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister par1IconRegister) + { + iconBuffer = new Icon[2]; + iconBuffer[0] = par1IconRegister.registerIcon("warpdrive:cloakCoilSide"); + iconBuffer[1] = par1IconRegister.registerIcon("warpdrive:cloakCoilSideActive"); + } + + @Override + public Icon getIcon(int side, int metadata) + { + return iconBuffer[metadata]; + } + + /** + * Returns the quantity of items to drop on block destruction. + */ + @Override + public int quantityDropped(Random par1Random) + { + return 1; + } + + /** + * Returns the ID of the items to drop on destruction. + */ + @Override + public int idDropped(int par1, Random par2Random, int par3) + { + return this.blockID; + } + + @Override + public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) + { + TileEntity te = par1World.getBlockTileEntity(par2, par3, par4); + + if (te != null) + { + te.invalidate(); + } + + super.breakBlock(par1World, par2, par3, par4, par5, par6); + } +} diff --git a/src/cr0s/WarpDrive/BlockCloakingDeviceCore.java b/src/cr0s/WarpDrive/BlockCloakingDeviceCore.java new file mode 100644 index 00000000..f94f4d41 --- /dev/null +++ b/src/cr0s/WarpDrive/BlockCloakingDeviceCore.java @@ -0,0 +1,98 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +import java.util.Random; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Icon; +import net.minecraft.world.World; + +public class BlockCloakingDeviceCore extends BlockContainer +{ + private Icon[] iconBuffer; + + public BlockCloakingDeviceCore(int id, int texture, Material material) + { + super(id, material); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister par1IconRegister) + { + iconBuffer = new Icon[2]; + iconBuffer[0] = par1IconRegister.registerIcon("warpdrive:cloakingCoreInactive"); + iconBuffer[1] = par1IconRegister.registerIcon("warpdrive:cloakingCoreActive"); + } + + @Override + public Icon getIcon(int side, int metadata) + { + return iconBuffer[metadata]; + } + + @Override + public TileEntity createNewTileEntity(World var1) + { + return new TileEntityCloakingDeviceCore(); + } + + /** + * Returns the quantity of items to drop on block destruction. + */ + @Override + public int quantityDropped(Random par1Random) + { + return 1; + } + + /** + * Returns the ID of the items to drop on destruction. + */ + @Override + public int idDropped(int par1, Random par2Random, int par3) + { + return this.blockID; + } + + @Override + public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return false; + } + + TileEntityCloakingDeviceCore me = (TileEntityCloakingDeviceCore)par1World.getBlockTileEntity(par2, par3, par4); + + if (me != null) + { + par5EntityPlayer.addChatMessage("[CloakDeviceCore] Energy level: " + me.getCurrentEnergyValue() + " Eu"); + } + + return true; + } + + @Override + public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) + { + TileEntity te = par1World.getBlockTileEntity(par2, par3, par4); + + if (te != null) + { + if (((TileEntityCloakingDeviceCore)te).isEnabled) + ((TileEntityCloakingDeviceCore)te).disableCloakingField(); + + te.invalidate(); + } + + super.breakBlock(par1World, par2, par3, par4, par5, par6); + } +} diff --git a/src/cr0s/WarpDrive/BlockGas.java b/src/cr0s/WarpDrive/BlockGas.java index 74d7b4dc..003fef0a 100644 --- a/src/cr0s/WarpDrive/BlockGas.java +++ b/src/cr0s/WarpDrive/BlockGas.java @@ -1,7 +1,6 @@ package cr0s.WarpDrive; import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; @@ -10,52 +9,60 @@ import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockGas extends Block { +public class BlockGas extends Block +{ private Icon[] gasIcons; - public BlockGas(int par1) { + public BlockGas(int par1) + { super(par1, Material.air); - setHardness(0.0F); - setUnlocalizedName("warpdrive.blocks.Gas"); } @Override - public boolean isOpaqueCube() { + public boolean isOpaqueCube() + { return false; } @Override - public boolean isAirBlock(World var1, int var2, int var3, int var4) { + public boolean isAirBlock(World var1, int var2, int var3, int var4) + { return true; } @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) + { return null; } @Override - public boolean isBlockReplaceable(World var1, int var2, int var3, int var4) { + public boolean isBlockReplaceable(World var1, int var2, int var3, int var4) + { return true; } @Override - public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) + { return true; } @Override - public boolean canCollideCheck(int var1, boolean var2) { + public boolean canCollideCheck(int var1, boolean var2) + { return false; } @Override - public int getRenderBlockPass() { + public int getRenderBlockPass() + { return 1; // transparency enabled } @Override - public void registerIcons(IconRegister par1IconRegister) { + public void registerIcons(IconRegister par1IconRegister) + { gasIcons = new Icon[12]; gasIcons[0] = par1IconRegister.registerIcon("warpdrive:gasBlockBlue"); gasIcons[1] = par1IconRegister.registerIcon("warpdrive:gasBlockRed"); @@ -72,17 +79,20 @@ public class BlockGas extends Block { } @Override - public Icon getIcon(int side, int metadata) { - return gasIcons[metadata % gasIcons.length]; // Lem + public Icon getIcon(int side, int metadata) + { + return gasIcons[metadata]; } @Override - public int getMobilityFlag() { + public int getMobilityFlag() + { return 1; } @Override - public int idDropped(int var1, Random var2, int var3) { + public int idDropped(int var1, Random var2, int var3) + { return -1; } @@ -90,17 +100,59 @@ public class BlockGas extends Block { * Returns the quantity of items to drop on block destruction. */ @Override - public int quantityDropped(Random par1Random) { + public int quantityDropped(Random par1Random) + { return 0; } @Override - public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { - int sideBlockID = world.getBlockId(x, y, z); - if (sideBlockID == this.blockID) { + public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) + { + if (par1IBlockAccess.getBlockId(par2, par3, par4) == this.blockID) + { return false; } - return world.isAirBlock(x, y, z); + else + { + final int i = par1IBlockAccess.getBlockId(par2, par3, par4); + boolean var6 = false; + + if (Block.blocksList[i] != null) + { + var6 = !Block.blocksList[i].isOpaqueCube(); + } + + final boolean var7 = i == 0; + + if ((var6 || var7) && par5 == 3 && !var6) + { + return true; + } + else if ((var6 || var7) && par5 == 4 && !var6) + { + return true; + } + else if ((var6 || var7) && par5 == 5 && !var6) + { + return true; + } + else if ((var6 || var7) && par5 == 2 && !var6) + { + return true; + } + else if ((var6 || var7) && par5 == 0 && !var6) + { + return true; + } + else if ((var6 || var7) && par5 == 1 && !var6) + { + return true; + } + else + { + return false; + } + } } @Override @@ -113,14 +165,17 @@ public class BlockGas extends Block { * Returns if this block is collidable. Args: x, y, z */ @Override - public boolean isCollidable() { + public boolean isCollidable() + { return false; } @Override - public void onBlockAdded(World par1World, int par2, int par3, int par4) { + public void onBlockAdded(World par1World, int par2, int par3, int par4) + { // Gas blocks allow only in space - if (par1World.provider.dimensionId != WarpDriveConfig.G_SPACE_DIMENSION_ID) { + if (par1World.provider.dimensionId != WarpDrive.instance.spaceDimID) + { par1World.setBlockToAir(par2, par3, par4); } } diff --git a/src/cr0s/WarpDrive/BlockIridium.java b/src/cr0s/WarpDrive/BlockIridium.java index 0a41c72c..c560457a 100644 --- a/src/cr0s/WarpDrive/BlockIridium.java +++ b/src/cr0s/WarpDrive/BlockIridium.java @@ -4,17 +4,15 @@ import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; public class BlockIridium extends Block { public BlockIridium(int par1) { super(par1, Material.rock); - setHardness(0.8F); - setResistance(150 * 4); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.blocks.IridiumBlock"); } @Override diff --git a/src/cr0s/WarpDrive/machines/BlockLaser.java b/src/cr0s/WarpDrive/BlockLaser.java similarity index 60% rename from src/cr0s/WarpDrive/machines/BlockLaser.java rename to src/cr0s/WarpDrive/BlockLaser.java index 424b4e1a..11e93fdf 100644 --- a/src/cr0s/WarpDrive/machines/BlockLaser.java +++ b/src/cr0s/WarpDrive/BlockLaser.java @@ -1,47 +1,46 @@ -package cr0s.WarpDrive.machines; +package cr0s.WarpDrive; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; - import java.util.Random; - -import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraft.world.World; -public class BlockLaser extends BlockContainer { +public class BlockLaser extends BlockContainer +{ private Icon[] iconBuffer; private final int ICON_SIDE = 0; - public BlockLaser(int id, int texture, Material material) { + public BlockLaser(int id, int texture, Material material) + { super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.Laser"); } @Override @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { + public void registerIcons(IconRegister par1IconRegister) + { iconBuffer = new Icon[1]; // Solid textures iconBuffer[ICON_SIDE] = par1IconRegister.registerIcon("warpdrive:laserSide"); } @Override - public Icon getIcon(int side, int metadata) { + public Icon getIcon(int side, int metadata) + { return iconBuffer[ICON_SIDE]; } @Override - public TileEntity createNewTileEntity(World parWorld) { + public TileEntity createNewTileEntity(World var1) + { return new TileEntityLaser(); } @@ -49,7 +48,8 @@ public class BlockLaser extends BlockContainer { * Returns the quantity of items to drop on block destruction. */ @Override - public int quantityDropped(Random par1Random) { + public int quantityDropped(Random par1Random) + { return 1; } @@ -57,7 +57,8 @@ public class BlockLaser extends BlockContainer { * Returns the ID of the items to drop on destruction. */ @Override - public int idDropped(int par1, Random par2Random, int par3) { + public int idDropped(int par1, Random par2Random, int par3) + { return this.blockID; } } \ No newline at end of file diff --git a/src/cr0s/WarpDrive/BlockLaserCam.java b/src/cr0s/WarpDrive/BlockLaserCam.java new file mode 100644 index 00000000..165f403f --- /dev/null +++ b/src/cr0s/WarpDrive/BlockLaserCam.java @@ -0,0 +1,64 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.Random; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Icon; +import net.minecraft.world.World; + +public class BlockLaserCam extends BlockContainer +{ + private Icon[] iconBuffer; + + private final int ICON_SIDE = 0; + + public BlockLaserCam(int id, int texture, Material material) + { + super(id, material); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister par1IconRegister) + { + iconBuffer = new Icon[1]; + // Solid textures + iconBuffer[ICON_SIDE] = par1IconRegister.registerIcon("warpdrive:laserSideCam"); + } + + @Override + public Icon getIcon(int side, int metadata) + { + return iconBuffer[ICON_SIDE]; + } + + @Override + public TileEntity createNewTileEntity(World var1) + { + return new TileEntityLaser(); + } + + /** + * Returns the quantity of items to drop on block destruction. + */ + @Override + public int quantityDropped(Random par1Random) + { + return 1; + } + + /** + * Returns the ID of the items to drop on destruction. + */ + @Override + public int idDropped(int par1, Random par2Random, int par3) + { + return this.blockID; + } +} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/BlockLift.java b/src/cr0s/WarpDrive/BlockLift.java similarity index 65% rename from src/cr0s/WarpDrive/machines/BlockLift.java rename to src/cr0s/WarpDrive/BlockLift.java index abca2b73..dad3ac2b 100644 --- a/src/cr0s/WarpDrive/machines/BlockLift.java +++ b/src/cr0s/WarpDrive/BlockLift.java @@ -1,13 +1,11 @@ -package cr0s.WarpDrive.machines; +package cr0s.WarpDrive; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; import java.util.Random; -import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; @@ -20,17 +18,15 @@ public class BlockLift extends BlockContainer { private Icon[] iconBuffer; - public BlockLift(int id, int texture, Material material) { + public BlockLift(int id, int texture, Material material) + { super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.LaserLift"); } @Override @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { + public void registerIcons(IconRegister par1IconRegister) + { iconBuffer = new Icon[6]; iconBuffer[0] = par1IconRegister.registerIcon("warpdrive:liftSideOffline"); iconBuffer[1] = par1IconRegister.registerIcon("warpdrive:liftSideUp"); @@ -41,16 +37,20 @@ public class BlockLift extends BlockContainer } @Override - public Icon getIcon(int side, int metadata) { - if (metadata > 2) { - return iconBuffer[0]; - } - if (side == 1) { + public Icon getIcon(int side, int metadata) + { + if (side == 1) + { return iconBuffer[3 + metadata]; - } else if (side == 0) { - if (metadata == 0) { + } + else if (side == 0) + { + if (metadata == 0) + { return iconBuffer[3]; - } else { + } + else + { return iconBuffer[6 - metadata]; } } @@ -59,7 +59,8 @@ public class BlockLift extends BlockContainer } @Override - public TileEntity createNewTileEntity(World var1) { + public TileEntity createNewTileEntity(World var1) + { return new TileEntityLift(); } @@ -67,7 +68,8 @@ public class BlockLift extends BlockContainer * Returns the quantity of items to drop on block destruction. */ @Override - public int quantityDropped(Random par1Random) { + public int quantityDropped(Random par1Random) + { return 1; } @@ -75,7 +77,8 @@ public class BlockLift extends BlockContainer * Returns the ID of the items to drop on destruction. */ @Override - public int idDropped(int par1, Random par2Random, int par3) { + public int idDropped(int par1, Random par2Random, int par3) + { return this.blockID; } @@ -83,24 +86,30 @@ public class BlockLift extends BlockContainer * Called upon block activation (right click on the block.) */ @Override - public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { + public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { return false; } - WarpEnergyTE te = (WarpEnergyTE)par1World.getBlockTileEntity(par2, par3, par4); - if (te != null && (par5EntityPlayer.getHeldItem() == null)) { - par5EntityPlayer.addChatMessage(te.getStatus()); - return true; + TileEntityLift booster = (TileEntityLift)par1World.getBlockTileEntity(par2, par3, par4); + + if (booster != null) + { + par5EntityPlayer.addChatMessage("[Laser Lift] Energy level: " + booster.getCurrentEnergyValue()); } - return false; + return true; } @Override - public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) { + public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) + { TileEntity te = par1World.getBlockTileEntity(par2, par3, par4); - if (te != null) { + + if (te != null) + { te.invalidate(); } } diff --git a/src/cr0s/WarpDrive/machines/BlockLaserTreeFarm.java b/src/cr0s/WarpDrive/BlockMiningLaser.java similarity index 55% rename from src/cr0s/WarpDrive/machines/BlockLaserTreeFarm.java rename to src/cr0s/WarpDrive/BlockMiningLaser.java index e163cd26..c90936f3 100644 --- a/src/cr0s/WarpDrive/machines/BlockLaserTreeFarm.java +++ b/src/cr0s/WarpDrive/BlockMiningLaser.java @@ -1,58 +1,61 @@ -package cr0s.WarpDrive.machines; +package cr0s.WarpDrive; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; - import java.util.Random; - -import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraft.world.World; -public class BlockLaserTreeFarm extends BlockContainer { +public class BlockMiningLaser extends BlockContainer +{ private Icon[] iconBuffer; - public BlockLaserTreeFarm(int id, int texture, Material material) { + private final int ICON_SIDE = 0; + + public BlockMiningLaser(int id, int texture, Material material) + { super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.LaserTreeFarm"); } @Override @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { + public void registerIcons(IconRegister par1IconRegister) + { iconBuffer = new Icon[2]; // Solid textures iconBuffer[0] = par1IconRegister.registerIcon("warpdrive:particleBoosterTopBottom"); - iconBuffer[1] = par1IconRegister.registerIcon("warpdrive:laserTreeFarmSide0"); + iconBuffer[1] = par1IconRegister.registerIcon("warpdrive:miningLaserSide0"); } @Override - public Icon getIcon(int side, int metadata) { - if (side == 0 || side == 1) { + public Icon getIcon(int side, int metadata) + { + if (side == 0 || side == 1) + { return iconBuffer[0]; } - return iconBuffer[1]; + return iconBuffer[metadata + 1]; } - + @Override - public TileEntity createNewTileEntity(World var1) { - return new TileEntityLaserTreeFarm(); + public TileEntity createNewTileEntity(World var1) + { + return new TileEntityMiningLaser(); } /** * Returns the quantity of items to drop on block destruction. */ @Override - public int quantityDropped(Random par1Random) { + public int quantityDropped(Random par1Random) + { return 1; } @@ -60,7 +63,8 @@ public class BlockLaserTreeFarm extends BlockContainer { * Returns the ID of the items to drop on destruction. */ @Override - public int idDropped(int par1, Random par2Random, int par3) { + public int idDropped(int par1, Random par2Random, int par3) + { return this.blockID; } } \ No newline at end of file diff --git a/src/cr0s/WarpDrive/BlockMonitor.java b/src/cr0s/WarpDrive/BlockMonitor.java new file mode 100644 index 00000000..7f931d37 --- /dev/null +++ b/src/cr0s/WarpDrive/BlockMonitor.java @@ -0,0 +1,112 @@ +package cr0s.WarpDrive; + +import java.util.List; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.BlockDirectional; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityChest; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Icon; +import net.minecraft.world.ChunkPosition; +import net.minecraft.world.World; + +public class BlockMonitor extends BlockContainer +{ + private Icon frontIcon; + private Icon blockIcon; + + public BlockMonitor(int id) + { + super(id, Material.iron); + } + + @SideOnly(Side.CLIENT) + + /** + * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata + */ + public Icon getIcon(int side, int meta) + { + meta &= 3; + return side == 2 ? (meta == 0 ? this.frontIcon : this.blockIcon) : (side == 3 ? (meta == 2 ? this.frontIcon : this.blockIcon) : (side == 4 ? (meta == 3 ? this.frontIcon : this.blockIcon) : (side == 5 ? (meta == 1 ? this.frontIcon : this.blockIcon) : this.blockIcon))); + } + + /** + * When this method is called, your block should register all the icons it needs with the given IconRegister. This + * is the only chance you get to register icons. + */ + public void registerIcons(IconRegister reg) + { + this.frontIcon = reg.registerIcon("warpdrive:monitorFront"); + this.blockIcon = reg.registerIcon("warpdrive:monitorSide"); + } + + /** + * Called when the block is placed in the world. + */ + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entityliving, ItemStack itemstack) + { + int dir = Math.round(entityliving.rotationYaw / 90.0F) & 3; + world.setBlockMetadataWithNotify(x, y, z, dir, 3); + } + + /** + * Called upon block activation (right click on the block.) + */ + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer entityplayer, int par6, float par7, float par8, float par9) + { + if (!FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return true; + } + + // Get camera frequency + TileEntity te = world.getBlockTileEntity(x, y, z); + + if (te != null && te instanceof TileEntityMonitor) + { + int freq = ((TileEntityMonitor)te).getFrequency(); + WarpDrive.instance.cams.removeDeadCams(); + CamRegistryItem cam = WarpDrive.instance.cams.getCamByFreq(freq, world); + + if (cam == null || cam.worldObj == null || cam.worldObj != world || !WarpDrive.instance.cams.isCamAlive(cam)) + { + entityplayer.addChatMessage("[Monitor: " + freq + "] Invalid frequency or camera is too far!"); + return false; + } + else + { + // Spawn camera entity + EntityCamera e = new EntityCamera(world, cam.camPos, entityplayer); + world.spawnEntityInWorld(e); + e.setPositionAndUpdate(cam.camPos.x, cam.camPos.y, cam.camPos.z); + //e.setPositionAndRotation(camPos.x, camPos.y, camPos.z, entityplayer.rotationYaw, entityplayer.rotationPitch); + ClientCameraUtils.playerData = entityplayer; + WarpDrive.instance.overlayType = cam.type; + ClientCameraUtils.setupViewpoint(e); + } + } + + return false; + } + + public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) + { + } + + @Override + public TileEntity createNewTileEntity(World world) + { + return new TileEntityMonitor(); + } +} diff --git a/src/cr0s/WarpDrive/BlockParticleBooster.java b/src/cr0s/WarpDrive/BlockParticleBooster.java new file mode 100644 index 00000000..8fc3e121 --- /dev/null +++ b/src/cr0s/WarpDrive/BlockParticleBooster.java @@ -0,0 +1,118 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +import java.util.Random; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Icon; +import net.minecraft.world.World; + +public class BlockParticleBooster extends BlockContainer +{ + private Icon[] iconBuffer; + + public BlockParticleBooster(int id, int texture, Material material) + { + super(id, material); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister par1IconRegister) + { + iconBuffer = new Icon[12]; + iconBuffer[0] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide0"); + iconBuffer[1] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide1"); + iconBuffer[2] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide2"); + iconBuffer[3] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide3"); + iconBuffer[4] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide4"); + iconBuffer[5] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide5"); + iconBuffer[6] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide6"); + iconBuffer[7] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide7"); + iconBuffer[8] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide8"); + iconBuffer[9] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide9"); + iconBuffer[10] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide10"); + iconBuffer[11] = par1IconRegister.registerIcon("warpdrive:particleBoosterTopBottom"); + } + + @Override + public Icon getIcon(int side, int metadata) + { + if (side == 0 || side == 1) + { + return iconBuffer[11]; + } + + if (metadata > 10) + { + metadata = 10; + } + + return iconBuffer[metadata]; + } + + @Override + public TileEntity createNewTileEntity(World var1) + { + return new TileEntityParticleBooster(); + } + + /** + * Returns the quantity of items to drop on block destruction. + */ + @Override + public int quantityDropped(Random par1Random) + { + return 1; + } + + /** + * Returns the ID of the items to drop on destruction. + */ + @Override + public int idDropped(int par1, Random par2Random, int par3) + { + return this.blockID; + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return false; + } + + TileEntityParticleBooster booster = (TileEntityParticleBooster)par1World.getBlockTileEntity(par2, par3, par4); + + if (booster != null) + { + par5EntityPlayer.addChatMessage("[Particle Booster] Energy level: " + booster.getCurrentEnergyValue()); + } + + return true; + } + + @Override + public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) + { + TileEntity te = par1World.getBlockTileEntity(par2, par3, par4); + + if (te != null) + { + te.invalidate(); + } + + super.breakBlock(par1World, par2, par3, par4, par5, par6); + } +} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/BlockProtocol.java b/src/cr0s/WarpDrive/BlockProtocol.java new file mode 100644 index 00000000..e51563f6 --- /dev/null +++ b/src/cr0s/WarpDrive/BlockProtocol.java @@ -0,0 +1,117 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.Random; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Icon; +import net.minecraft.world.World; + +public class BlockProtocol extends BlockContainer +{ + private Icon[] iconBuffer; + + private final int ICON_INACTIVE_SIDE = 0, ICON_BOTTOM = 1, ICON_TOP = 2, ICON_SIDE_ACTIVATED = 3; + //private final int ANIMATION_ + //private int currentTexture; + + public BlockProtocol(int id, int texture, Material material) + { + super(id, material); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister par1IconRegister) + { + iconBuffer = new Icon[9]; + // Solid textures + iconBuffer[ICON_INACTIVE_SIDE] = par1IconRegister.registerIcon("warpdrive:contSideInactive"); + iconBuffer[ICON_BOTTOM] = par1IconRegister.registerIcon("warpdrive:contBottom"); + iconBuffer[ICON_TOP] = par1IconRegister.registerIcon("warpdrive:contTop"); + // Animated textures + iconBuffer[ICON_SIDE_ACTIVATED] = par1IconRegister.registerIcon("warpdrive:contSideActive1"); + iconBuffer[ICON_SIDE_ACTIVATED + 1] = par1IconRegister.registerIcon("warpdrive:contSideActive2"); + iconBuffer[ICON_SIDE_ACTIVATED + 2] = par1IconRegister.registerIcon("warpdrive:contSideActive3"); + iconBuffer[ICON_SIDE_ACTIVATED + 3] = par1IconRegister.registerIcon("warpdrive:contSideActive4"); + iconBuffer[ICON_SIDE_ACTIVATED + 4] = par1IconRegister.registerIcon("warpdrive:contSideActive5"); + iconBuffer[ICON_SIDE_ACTIVATED + 5] = par1IconRegister.registerIcon("warpdrive:contSideActive6"); + } + + @Override + public Icon getIcon(int side, int metadata) + { + if (side == 0) + { + return iconBuffer[ICON_BOTTOM]; + } + else if (side == 1) + { + return iconBuffer[ICON_TOP]; + } + + if (metadata == 0) // Inactive state + { + return iconBuffer[ICON_INACTIVE_SIDE]; + } + else if (metadata > 0) // Activated, in metadata stored mode number + { + if (ICON_SIDE_ACTIVATED + metadata - 1 < iconBuffer.length) + return iconBuffer[ICON_SIDE_ACTIVATED + metadata - 1]; + else + return iconBuffer[ICON_SIDE_ACTIVATED]; + } + else + return iconBuffer[ICON_SIDE_ACTIVATED]; + } + + @Override + public TileEntity createNewTileEntity(World var1) + { + return new TileEntityProtocol(); + } + + /** + * Returns the quantity of items to drop on block destruction. + */ + @Override + public int quantityDropped(Random par1Random) + { + return 1; + } + + /** + * Returns the ID of the items to drop on destruction. + */ + @Override + public int idDropped(int par1, Random par2Random, int par3) + { + return this.blockID; + } + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return false; + } + + TileEntityProtocol controller = (TileEntityProtocol)par1World.getBlockTileEntity(par2, par3, par4); + + if (controller != null) + { + controller.attachPlayer(par5EntityPlayer); + par5EntityPlayer.addChatMessage("[WarpCtrlr] Attached players: " + controller.getAttachedPlayersList()); + } + + return true; + } +} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/BlockRadar.java b/src/cr0s/WarpDrive/BlockRadar.java similarity index 56% rename from src/cr0s/WarpDrive/machines/BlockRadar.java rename to src/cr0s/WarpDrive/BlockRadar.java index f9cd6d93..7aabc33e 100644 --- a/src/cr0s/WarpDrive/machines/BlockRadar.java +++ b/src/cr0s/WarpDrive/BlockRadar.java @@ -1,13 +1,12 @@ -package cr0s.WarpDrive.machines; +package cr0s.WarpDrive; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; +import java.util.ArrayList; import java.util.Random; -import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; @@ -20,25 +19,19 @@ public class BlockRadar extends BlockContainer { private Icon[] iconBuffer; - private final int ICON_SIDE_INACTIVE = 0; - private final int ICON_BOTTOM = 1; - private final int ICON_TOP = 2; - private final int ICON_SIDE_ACTIVATED = 3; - private final int ICON_SIDE_ACTIVATED_SCAN = 4; + private final int ICON_INACTIVE_SIDE = 0, ICON_BOTTOM = 1, ICON_TOP = 2, ICON_SIDE_ACTIVATED = 3, ICON_SIDE_ACTIVATED_SCAN = 4; - public BlockRadar(int id, int texture, Material material) { + public BlockRadar(int id, int texture, Material material) + { super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.WarpRadar"); } @Override @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { - iconBuffer = new Icon[16]; - iconBuffer[ICON_SIDE_INACTIVE] = par1IconRegister.registerIcon("warpdrive:radarSideInactive"); + public void registerIcons(IconRegister par1IconRegister) + { + iconBuffer = new Icon[5]; + iconBuffer[ICON_INACTIVE_SIDE] = par1IconRegister.registerIcon("warpdrive:radarSideInactive"); iconBuffer[ICON_BOTTOM] = par1IconRegister.registerIcon("warpdrive:contBottom"); iconBuffer[ICON_TOP] = par1IconRegister.registerIcon("warpdrive:contTop"); iconBuffer[ICON_SIDE_ACTIVATED] = par1IconRegister.registerIcon("warpdrive:radarSideActive"); @@ -46,26 +39,36 @@ public class BlockRadar extends BlockContainer } @Override - public Icon getIcon(int side, int metadata) { - if (side == 0) { + public Icon getIcon(int side, int metadata) + { + if (side == 0) + { return iconBuffer[ICON_BOTTOM]; - } else if (side == 1) { + } + else if (side == 1) + { return iconBuffer[ICON_TOP]; } - if (metadata == 0) {// Inactive state - return iconBuffer[ICON_SIDE_INACTIVE]; - } else if (metadata == 1) { // Attached state + if (metadata == 0) // Inactive state + { + return iconBuffer[ICON_INACTIVE_SIDE]; + } + else if (metadata == 1) // Attached state + { return iconBuffer[ICON_SIDE_ACTIVATED]; - } else if (metadata == 2) { // Scanning state + } + else if (metadata == 2) // Scanning state + { return iconBuffer[ICON_SIDE_ACTIVATED_SCAN]; } - return iconBuffer[ICON_SIDE_INACTIVE]; + return null; } @Override - public TileEntity createNewTileEntity(World var1) { + public TileEntity createNewTileEntity(World var1) + { return new TileEntityRadar(); } @@ -73,7 +76,8 @@ public class BlockRadar extends BlockContainer * Returns the quantity of items to drop on block destruction. */ @Override - public int quantityDropped(Random par1Random) { + public int quantityDropped(Random par1Random) + { return 1; } @@ -81,29 +85,36 @@ public class BlockRadar extends BlockContainer * Returns the ID of the items to drop on destruction. */ @Override - public int idDropped(int par1, Random par2Random, int par3) { + public int idDropped(int par1, Random par2Random, int par3) + { return this.blockID; } @Override - public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { + public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { return false; } - WarpEnergyTE te = (WarpEnergyTE)par1World.getBlockTileEntity(par2, par3, par4); - if (te != null && (par5EntityPlayer.getHeldItem() == null)) { - par5EntityPlayer.addChatMessage(te.getStatus()); - return true; + TileEntityRadar radar = (TileEntityRadar)par1World.getBlockTileEntity(par2, par3, par4); + + if (radar != null) + { + par5EntityPlayer.addChatMessage("[Radar] Energy level: " + radar.getCurrentEnergyValue() + " Eu"); } - return false; + return true; } @Override - public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) { + public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) + { TileEntity te = par1World.getBlockTileEntity(par2, par3, par4); - if (te != null) { + + if (te != null) + { te.invalidate(); } diff --git a/src/cr0s/WarpDrive/machines/BlockReactor.java b/src/cr0s/WarpDrive/BlockReactor.java similarity index 54% rename from src/cr0s/WarpDrive/machines/BlockReactor.java rename to src/cr0s/WarpDrive/BlockReactor.java index a8936fe2..83b7c4c5 100644 --- a/src/cr0s/WarpDrive/machines/BlockReactor.java +++ b/src/cr0s/WarpDrive/BlockReactor.java @@ -1,13 +1,9 @@ -package cr0s.WarpDrive.machines; +package cr0s.WarpDrive; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; - import java.util.Random; - -import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; @@ -16,51 +12,55 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraft.world.World; -public class BlockReactor extends BlockContainer { +public class BlockReactor extends BlockContainer +{ private Icon[] iconBuffer; - private final int ICON_SIDE_INACTIVE = 0, ICON_BOTTOM = 1, ICON_TOP = 2, ICON_SIDE_ACTIVATED = 3, ICON_SIDE_HEATED = 4; + private final int ICON_INACTIVE_SIDE = 0, ICON_BOTTOM = 1, ICON_TOP = 2, ICON_SIDE_ACTIVATED = 3; - public BlockReactor(int id, int texture, Material material) { + public BlockReactor(int id, int texture, Material material) + { super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.WarpCore"); } @Override @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { - iconBuffer = new Icon[5]; - iconBuffer[ICON_SIDE_INACTIVE] = par1IconRegister.registerIcon("warpdrive:coreSideInactive"); + public void registerIcons(IconRegister par1IconRegister) + { + iconBuffer = new Icon[4]; + iconBuffer[ICON_INACTIVE_SIDE] = par1IconRegister.registerIcon("warpdrive:coreSideInactive"); iconBuffer[ICON_BOTTOM] = par1IconRegister.registerIcon("warpdrive:coreBottom"); iconBuffer[ICON_TOP] = par1IconRegister.registerIcon("warpdrive:coreTop"); iconBuffer[ICON_SIDE_ACTIVATED] = par1IconRegister.registerIcon("warpdrive:coreSideActive"); - iconBuffer[ICON_SIDE_HEATED] = par1IconRegister.registerIcon("warpdrive:coreSideHeated"); } @Override - public Icon getIcon(int side, int metadata) { - if (side == 0) { + public Icon getIcon(int side, int metadata) + { + if (side == 0) + { return iconBuffer[ICON_BOTTOM]; - } else if (side == 1) { + } + else if (side == 1) + { return iconBuffer[ICON_TOP]; } - if (metadata == 0) { // Inactive state - return iconBuffer[ICON_SIDE_INACTIVE]; - } else if (metadata == 1) { // Activated state + if (metadata == 0) //Inactive state + { + return iconBuffer[ICON_INACTIVE_SIDE]; + } + else if (metadata == 1) // Activated state + { return iconBuffer[ICON_SIDE_ACTIVATED]; - } else if (metadata == 2) { // Heated state - return iconBuffer[ICON_SIDE_HEATED]; - } + } return null; } @Override - public TileEntity createNewTileEntity(World var1) { + public TileEntity createNewTileEntity(World var1) + { return new TileEntityReactor(); } @@ -68,7 +68,8 @@ public class BlockReactor extends BlockContainer { * Returns the quantity of items to drop on block destruction. */ @Override - public int quantityDropped(Random par1Random) { + public int quantityDropped(Random par1Random) + { return 1; } @@ -76,7 +77,8 @@ public class BlockReactor extends BlockContainer { * Returns the ID of the items to drop on destruction. */ @Override - public int idDropped(int par1, Random par2Random, int par3) { + public int idDropped(int par1, Random par2Random, int par3) + { return this.blockID; } @@ -84,30 +86,35 @@ public class BlockReactor extends BlockContainer { * Called upon block activation (right click on the block.) */ @Override - public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { + public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { return false; } TileEntityReactor reactor = (TileEntityReactor)par1World.getBlockTileEntity(par2, par3, par4); - if (reactor != null && (par5EntityPlayer.getHeldItem() == null)) { - par5EntityPlayer.addChatMessage(reactor.getStatus()); - return true; + if (reactor != null) + { + par5EntityPlayer.addChatMessage(reactor.getCoreState()); } - return false; + return true; } @Override - public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) { + public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) + { TileEntity te = par1World.getBlockTileEntity(par2, par3, par4); - if (te != null && te instanceof TileEntityReactor) { - WarpDrive.instance.warpCores.removeFromRegistry((TileEntityReactor)te); + + if (te != null && te instanceof TileEntityReactor) + { + WarpDrive.instance.registry.removeFromRegistry((TileEntityReactor)te); te.invalidate(); } - WarpDrive.instance.warpCores.removeDeadCores(); + WarpDrive.instance.registry.removeDeadCores(); super.breakBlock(par1World, par2, par3, par4, par5, par6); } } \ No newline at end of file diff --git a/src/cr0s/WarpDrive/BlockShipScanner.java b/src/cr0s/WarpDrive/BlockShipScanner.java new file mode 100644 index 00000000..7e69bb34 --- /dev/null +++ b/src/cr0s/WarpDrive/BlockShipScanner.java @@ -0,0 +1,106 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +import java.util.Random; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Icon; +import net.minecraft.world.World; + +public class BlockShipScanner extends BlockContainer +{ + private Icon[] iconBuffer; + + public BlockShipScanner(int id, int texture, Material material) + { + super(id, material); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister par1IconRegister) + { + iconBuffer = new Icon[3]; + iconBuffer[0] = par1IconRegister.registerIcon("warpdrive:shipScannerUp"); + iconBuffer[1] = par1IconRegister.registerIcon("warpdrive:shipScannerSide"); + iconBuffer[2] = par1IconRegister.registerIcon("warpdrive:contBottom"); + } + + @Override + public Icon getIcon(int side, int metadata) + { + if (side == 1) // UP + { + return iconBuffer[0]; + } + else if (side == 0) // DOWN + { + return iconBuffer[2]; + } + + return iconBuffer[1]; + } + + @Override + public TileEntity createNewTileEntity(World var1) + { + return new TileEntityShipScanner(); + } + + /** + * Returns the quantity of items to drop on block destruction. + */ + @Override + public int quantityDropped(Random par1Random) + { + return 1; + } + + /** + * Returns the ID of the items to drop on destruction. + */ + @Override + public int idDropped(int par1, Random par2Random, int par3) + { + return this.blockID; + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return false; + } + + TileEntityShipScanner me = (TileEntityShipScanner)par1World.getBlockTileEntity(par2, par3, par4); + + if (me != null) + { + par5EntityPlayer.addChatMessage("[Ship Scanner] Energy level: " + me.getCurrentEnergyValue()); + } + + return true; + } + + @Override + public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) + { + TileEntity te = par1World.getBlockTileEntity(par2, par3, par4); + + if (te != null) + { + te.invalidate(); + } + } +} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/BlockWarpIsolation.java b/src/cr0s/WarpDrive/BlockWarpIsolation.java similarity index 62% rename from src/cr0s/WarpDrive/machines/BlockWarpIsolation.java rename to src/cr0s/WarpDrive/BlockWarpIsolation.java index 34813f1f..efeb31ac 100644 --- a/src/cr0s/WarpDrive/machines/BlockWarpIsolation.java +++ b/src/cr0s/WarpDrive/BlockWarpIsolation.java @@ -1,36 +1,38 @@ -package cr0s.WarpDrive.machines; +package cr0s.WarpDrive; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; import java.util.Random; import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; +import net.minecraft.world.World; -public class BlockWarpIsolation extends Block { +public class BlockWarpIsolation extends Block +{ private Icon[] iconBuffer; - public BlockWarpIsolation(int id, int texture, Material material) { + public BlockWarpIsolation(int id, int texture, Material material) + { super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.blocks.WarpIsolation"); } @Override @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { + public void registerIcons(IconRegister par1IconRegister) + { iconBuffer = new Icon[1]; iconBuffer[0] = par1IconRegister.registerIcon("warpdrive:warpIsolation"); } @Override - public Icon getIcon(int side, int metadata) { + public Icon getIcon(int side, int metadata) + { return iconBuffer[0]; } @@ -38,7 +40,8 @@ public class BlockWarpIsolation extends Block { * Returns the quantity of items to drop on block destruction. */ @Override - public int quantityDropped(Random par1Random) { + public int quantityDropped(Random par1Random) + { return 1; } @@ -46,7 +49,8 @@ public class BlockWarpIsolation extends Block { * Returns the ID of the items to drop on destruction. */ @Override - public int idDropped(int par1, Random par2Random, int par3) { + public int idDropped(int par1, Random par2Random, int par3) + { return this.blockID; } } \ No newline at end of file diff --git a/src/cr0s/WarpDrive/CamRegistry.java b/src/cr0s/WarpDrive/CamRegistry.java index 376deb29..40cb65ae 100644 --- a/src/cr0s/WarpDrive/CamRegistry.java +++ b/src/cr0s/WarpDrive/CamRegistry.java @@ -1,113 +1,72 @@ package cr0s.WarpDrive; -import java.util.Iterator; -import java.util.LinkedList; +import java.util.ArrayList; +import java.util.HashMap; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; -public class CamRegistry { - private LinkedList registry; +public class CamRegistry +{ + private ArrayList registry; - public CamRegistry() { - registry = new LinkedList(); + public CamRegistry() + { + registry = new ArrayList(); } - public CamRegistryItem getCamByFrequency(World worldObj, int frequency) { - CamRegistryItem cam = null; - for (Iterator it = registry.iterator(); it.hasNext(); ) { - cam = it.next(); - if (cam.frequency == frequency && cam.dimensionId == worldObj.provider.dimensionId) { - if (isCamAlive(worldObj, cam)) { - return cam; - } else { - WarpDrive.debugPrint("Removing 'dead' camera at " + cam.position.x + ", " + cam.position.y + ", " + cam.position.z + " (while searching)"); - it.remove(); - } - } - } - - // not found => dump registry - printRegistry(worldObj); - return null; - } - - public CamRegistryItem getCamByPosition(World worldObj, ChunkPosition position) { - CamRegistryItem cam = null; - for (Iterator it = registry.iterator(); it.hasNext(); ) { - cam = it.next(); - if (cam.position.x == position.x && cam.position.y == position.y && cam.position.z == position.z && cam.dimensionId == worldObj.provider.dimensionId) { - return cam; + public CamRegistryItem getCamByFreq(int frequency, World worldObj) + { + for (CamRegistryItem i : registry) + { + if (i.freq == frequency && i.worldObj == worldObj) + { + return i; } } return null; } - private static boolean isCamAlive(World worldObj, CamRegistryItem cam) { - if (worldObj.provider.dimensionId != cam.dimensionId) { - WarpDrive.debugPrint("Inconsistent worldObj with camera " + worldObj.provider.dimensionId + " vs " + cam.dimensionId); - return false; - } - - if ( (worldObj.getBlockId(cam.position.x, cam.position.y, cam.position.z) != WarpDriveConfig.camID) - && (worldObj.getBlockId(cam.position.x, cam.position.y, cam.position.z) != WarpDriveConfig.laserCamID) ) { - WarpDrive.debugPrint("Reporting a 'dead' camera in dimension " + cam.dimensionId + " at " + cam.position.x + ", " + cam.position.y + ", " + cam.position.z); - return false; - } - - return true; - } - - public void removeDeadCams(World worldObj) { -// LocalProfiler.start("CamRegistry Removing dead cameras"); - - CamRegistryItem cam = null; - for (Iterator it = registry.iterator(); it.hasNext(); ) { - cam = it.next(); - if (!isCamAlive(worldObj, cam)) { - WarpDrive.debugPrint("Removing 'dead' camera in dimension " + cam.dimensionId + " at " + cam.position.x + ", " + cam.position.y + ", " + cam.position.z); - it.remove(); - } - } - -// LocalProfiler.stop(); - } - - public void removeFromRegistry(World worldObj, ChunkPosition position) { - CamRegistryItem cam = getCamByPosition(worldObj, position); - if (cam != null) { - WarpDrive.debugPrint("Removing camera by request in dimension " + cam.dimensionId + " at " + cam.position.x + ", " + cam.position.y + ", " + cam.position.z); - registry.remove(cam); - } - } - public void updateInRegistry(World worldObj, ChunkPosition position, int frequency, int type) { - updateInRegistry(worldObj, new CamRegistryItem(worldObj, position, frequency, type)); - } - - private void updateInRegistry(World worldObj, CamRegistryItem cam) { - removeDeadCams(worldObj); - - if (isCamAlive(worldObj, cam)) { - CamRegistryItem existingCam = getCamByPosition(worldObj, cam.position); - if (existingCam == null) { - WarpDrive.debugPrint("Adding 'live' camera at " + cam.position.x + ", " + cam.position.y + ", " + cam.position.z + " with frequency '" + cam.frequency + "'"); - registry.add(cam); - } else if (existingCam.frequency != cam.frequency) { - WarpDrive.debugPrint("Updating 'live' camera at " + cam.position.x + ", " + cam.position.y + ", " + cam.position.z + " to frequency '" + cam.frequency + "'"); - registry.add(cam); + public boolean isCamAlive(CamRegistryItem i) + { + if (i.worldObj != null) + { + if (i.worldObj.getBlockId(i.camPos.x, i.camPos.y, i.camPos.z) != WarpDriveConfig.i.camID && i.worldObj.getBlockId(i.camPos.x, i.camPos.y, i.camPos.z) != WarpDriveConfig.i.laserCamID) + { + return false; + } + + return true; + } + + return false; + } + + public void removeDeadCams() + { + for (CamRegistryItem i : registry) + { + if (!isCamAlive(i)) + { + registry.remove(i); + return; } - } else { - WarpDrive.debugPrint("Unable to update 'dead' camera at " + cam.position.x + ", " + cam.position.y + ", " + cam.position.z); } } - public void printRegistry(World worldObj) { - System.out.println("Cameras registry for dimension " + worldObj.provider.dimensionId + ":"); - removeDeadCams(worldObj); + public void updateInRegistry(CamRegistryItem i) + { + removeDeadCams(); - for (CamRegistryItem cam : registry) { - System.out.println("- " + cam.frequency + " (" + cam.position.x + ", " + cam.position.y + ", " + cam.position.z + ")"); - } - } + if (isCamAlive(i)) + { + CamRegistryItem existingCam = this.getCamByFreq(i.freq, i.worldObj); + + if (existingCam == null) + { + registry.add(i); + } + } + } } diff --git a/src/cr0s/WarpDrive/CamRegistryItem.java b/src/cr0s/WarpDrive/CamRegistryItem.java index 05c0a7d3..b841a970 100644 --- a/src/cr0s/WarpDrive/CamRegistryItem.java +++ b/src/cr0s/WarpDrive/CamRegistryItem.java @@ -3,16 +3,23 @@ package cr0s.WarpDrive; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; -public class CamRegistryItem { - public int dimensionId = -666; - public ChunkPosition position = null; - public int frequency = -1; - public int type = 0; // 0 - basic camera, 1 - laser camera +public class CamRegistryItem +{ + public int freq; + public ChunkPosition camPos; + public World worldObj; - public CamRegistryItem(World parWorldObj, ChunkPosition parPosition, int parFrequency, int parType) { - frequency = parFrequency; - position = parPosition; - dimensionId = parWorldObj.provider.dimensionId; - type = parType; + public int type = 0; // 0 - basic cam, 1 - laser cam + public CamRegistryItem(int freq, ChunkPosition pos, World worldObj) + { + this.freq = freq; + this.camPos = pos; + this.worldObj = worldObj; + } + + public CamRegistryItem setType(int type) + { + this.type = type; + return this; } } \ No newline at end of file diff --git a/src/cr0s/WarpDrive/CameraOverlay.java b/src/cr0s/WarpDrive/CameraOverlay.java index 0876647f..eeab8ab1 100644 --- a/src/cr0s/WarpDrive/CameraOverlay.java +++ b/src/cr0s/WarpDrive/CameraOverlay.java @@ -12,56 +12,36 @@ import net.minecraftforge.event.ForgeSubscribe; public class CameraOverlay { private Minecraft mc; - private int frameCount = 0; - private static int ANIMATION_FRAMES = 200; - public CameraOverlay(Minecraft parMinecraft) { - mc = parMinecraft; - } - - private static int colorGradient(float gradient, int start, int end) { - return Math.max(0, Math.min(255, start + Math.round(gradient * (end - start)))); + public CameraOverlay(Minecraft mc) + { + this.mc = mc; } - protected void renderOverlay(int scaledWidth, int scaledHeight) { + protected void renderOverlay(int par1, int par2) + { GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glDepthMask(false); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glDisable(GL11.GL_ALPHA_TEST); - try { - String text; - if (WarpDrive.instance.overlayType == 0) { - mc.getTextureManager().bindTexture(new ResourceLocation("warpdrive", "textures/blocks/camOverlay.png")); - text = "Left click to zoom / Right click to exit"; - } else { - mc.getTextureManager().bindTexture(new ResourceLocation("warpdrive", "textures/blocks/lasercamOverlay.png")); - text = "Left click to zoom / Right click to exit / Space to fire"; - } - - Tessellator tessellator = Tessellator.instance; - tessellator.startDrawingQuads(); - tessellator.addVertexWithUV( 0.0D, scaledHeight, -90.0D, 0.0D, 1.0D); - tessellator.addVertexWithUV(scaledWidth, scaledHeight, -90.0D, 1.0D, 1.0D); - tessellator.addVertexWithUV(scaledWidth, 0.0D, -90.0D, 1.0D, 0.0D); - tessellator.addVertexWithUV( 0.0D, 0.0D, -90.0D, 0.0D, 0.0D); - tessellator.draw(); - - frameCount++; - if (frameCount >= ANIMATION_FRAMES) { - frameCount = 0; - } - float time = Math.abs(frameCount * 2.0F / ANIMATION_FRAMES - 1.0F); - int color = (colorGradient(time, 0x40, 0xA0) << 16) + (colorGradient(time, 0x80, 0x00) << 8) + colorGradient(time, 0x80, 0xFF); - mc.fontRenderer.drawString(text, (scaledWidth - mc.fontRenderer.getStringWidth(text)) / 2, 30, color, true); - if (WarpDriveConfig.debugMode) { - mc.fontRenderer.drawString(WarpDrive.instance.debugMessage, (scaledWidth - mc.fontRenderer.getStringWidth(WarpDrive.instance.debugMessage)) / 2, 40, 0xFF008F, true); - } - } catch (Exception e) { - e.printStackTrace(); + if (WarpDrive.instance.overlayType == 0) + { + this.mc.getTextureManager().bindTexture(new ResourceLocation("warpdrive", "textures/blocks/camOverlay.png")); } - + else + { + this.mc.getTextureManager().bindTexture(new ResourceLocation("warpdrive", "textures/blocks/lasercamOverlay.png")); + } + + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.addVertexWithUV(0.0D, (double)par2, -90.0D, 0.0D, 1.0D); + tessellator.addVertexWithUV((double)par1, (double)par2, -90.0D, 1.0D, 1.0D); + tessellator.addVertexWithUV((double)par1, 0.0D, -90.0D, 1.0D, 0.0D); + tessellator.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D); + tessellator.draw(); GL11.glDepthMask(true); GL11.glEnable(GL11.GL_DEPTH_TEST); GL11.glEnable(GL11.GL_ALPHA_TEST); @@ -69,17 +49,18 @@ public class CameraOverlay } @ForgeSubscribe - public void onRender(RenderGameOverlayEvent.Pre event) { - if (WarpDrive.instance.isOverlayEnabled) { - if (event.type == ElementType.HELMET) { + public void onRender(RenderGameOverlayEvent.Pre event) + { + if (WarpDrive.instance.isOverlayEnabled) + { + if (event.type == ElementType.HELMET) + { renderOverlay(event.resolution.getScaledWidth(), event.resolution.getScaledHeight()); - } else if (event.type == ElementType.EXPERIENCE || event.type == ElementType.HOTBAR || event.type == ElementType.ARMOR - || event.type == ElementType.HEALTH || event.type == ElementType.HEALTHMOUNT || event.type == ElementType.FOOD - || event.type == ElementType.BOSSHEALTH || event.type == ElementType.TEXT || event.type == ElementType.AIR) { - // Don't render other GUI parts - if (event.isCancelable()) { - event.setCanceled(true); - } + } + else if (event.type == ElementType.EXPERIENCE || event.type == ElementType.HOTBAR || event.type == ElementType.ARMOR || event.type == ElementType.HEALTH || event.type == ElementType.HEALTHMOUNT || event.type == ElementType.FOOD || event.type == ElementType.BOSSHEALTH || event.type == ElementType.TEXT) + { + // Don't render other GUI parts + event.setCanceled(true); } } } diff --git a/src/cr0s/WarpDrive/ClientCameraUtils.java b/src/cr0s/WarpDrive/ClientCameraUtils.java index 63abec58..9fe0bf66 100644 --- a/src/cr0s/WarpDrive/ClientCameraUtils.java +++ b/src/cr0s/WarpDrive/ClientCameraUtils.java @@ -1,83 +1,42 @@ package cr0s.WarpDrive; -import org.lwjgl.input.Keyboard; - import net.minecraft.client.Minecraft; import net.minecraft.client.settings.EnumOptions; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.world.World; -public class ClientCameraUtils { - public static EntityPlayer entityPlayer; - public static int dimensionId = -666; - public static int check1_x, check1_y, check1_z, check1_blockId; - public static int check2_x, check2_y, check2_z, check2_blockId; +public class ClientCameraUtils +{ + public static EntityPlayer playerData; + public static float oldFOV; + public static float oldSens; - public static void setupViewpoint(EntityPlayer parPlayerEntity, EntityCamera entityCamera, int x1, int y1, int z1, int blockId1, int x2, int y2, int z2, int blockId2) { + public static void setupViewpoint(Entity entity) + { Minecraft mc = Minecraft.getMinecraft(); - if (parPlayerEntity == null) { - System.out.println("[WarpDrive] setupViewpoint with null player => denied"); - return; - } - if (entityCamera == null) { - System.out.println("[WarpDrive] setupViewpoint with null camera => denied"); - return; + if (entity == null) + { + System.out.println("Null"); } - entityPlayer = parPlayerEntity; - dimensionId = entityCamera.worldObj.provider.dimensionId; - check1_x = x1; - check1_y = y1; - check1_z = z1; - check1_blockId = blockId1; - check2_x = x2; - check2_y = y2; - check2_z = z2; - check2_blockId = blockId2; - - WarpDrive.debugPrint("Setting viewpoint: " + entityCamera.toString()); - mc.renderViewEntity = entityCamera; + System.out.println("Setting viewpoint: " + entity.toString()); + mc.renderViewEntity = (EntityLivingBase)entity; mc.gameSettings.thirdPersonView = 0; + oldFOV = mc.gameSettings.fovSetting; + oldSens = mc.gameSettings.mouseSensitivity; WarpDrive.instance.isOverlayEnabled = true; - - Keyboard.enableRepeatEvents(true); } - public static void resetViewpoint() { + public static void resetCam() + { Minecraft mc = Minecraft.getMinecraft(); - if (entityPlayer != null) { - mc.renderViewEntity = entityPlayer; - entityPlayer = null; - WarpDrive.debugPrint("Resetting viewpoint"); - } else { - System.out.println("[WarpDrive] reseting viewpoint with invalid player entity ?!?"); - } - - Keyboard.enableRepeatEvents(false); - - WarpDrive.instance.isOverlayEnabled = false; + mc.renderViewEntity = playerData; + playerData = null; mc.gameSettings.thirdPersonView = 0; - mc.gameSettings.setOptionFloatValue(EnumOptions.FOV, WarpDrive.normalFOV); - mc.gameSettings.setOptionFloatValue(EnumOptions.SENSITIVITY, WarpDrive.normalSensitivity); - - entityPlayer = null; - dimensionId = -666; - } - - public static boolean isValidContext(World worldObj) { - if (worldObj == null || worldObj.provider.dimensionId != dimensionId) { - return false; - } - if (worldObj.getBlockId(check1_x, check1_y, check1_z) != check1_blockId) { - System.out.println("[WarpDrive] checking viewpoint, found invalid block1 at (" + check1_x + ", " + check1_y + ", " + check1_z + ")"); - return false; - } - if (worldObj.getBlockId(check2_x, check2_y, check2_z) != check2_blockId) { - System.out.println("[WarpDrive] checking viewpoint, found invalid block2 at (" + check2_x + ", " + check2_y + ", " + check2_z + ")"); - return false; - } - return true; + mc.gameSettings.setOptionFloatValue(EnumOptions.FOV, oldFOV); + mc.gameSettings.setOptionFloatValue(EnumOptions.SENSITIVITY, oldSens); + WarpDrive.instance.isOverlayEnabled = false; } } diff --git a/src/cr0s/WarpDrive/ClientProxy.java b/src/cr0s/WarpDrive/ClientProxy.java new file mode 100644 index 00000000..92d94cb8 --- /dev/null +++ b/src/cr0s/WarpDrive/ClientProxy.java @@ -0,0 +1,20 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.client.FMLClientHandler; +import net.minecraft.world.World; +import net.minecraftforge.client.MinecraftForgeClient; + +public class ClientProxy extends CommonProxy +{ + @Override + public void registerRenderers() + { + } + + @Override + public void renderBeam(World world, Vector3 position, Vector3 target, float red, float green, float blue, int age, int energy) + { + //System.out.println("Rendering beam..."); + FMLClientHandler.instance().getClient().effectRenderer.addEffect(new FXBeam(world, position, target, red, green, blue, age, energy)); + } +} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/CloakChunkWatcher.java b/src/cr0s/WarpDrive/CloakChunkWatcher.java index 2273610d..0c23f044 100644 --- a/src/cr0s/WarpDrive/CloakChunkWatcher.java +++ b/src/cr0s/WarpDrive/CloakChunkWatcher.java @@ -1,35 +1,26 @@ package cr0s.WarpDrive; import java.util.ArrayList; -import cr0s.WarpDrive.CloakedArea; +import java.util.List; + import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.packet.Packet56MapChunks; import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.chunk.Chunk; import net.minecraftforge.event.ForgeSubscribe; import net.minecraftforge.event.world.ChunkWatchEvent; -public class CloakChunkWatcher { +public class CloakChunkWatcher +{ @ForgeSubscribe public void chunkLoaded(ChunkWatchEvent event) { EntityPlayerMP p = event.player; ChunkCoordIntPair chunk = event.chunk; - - // Check chunk for locating in cloaked areas ArrayList cloaks = WarpDrive.instance.cloaks.getCloaksForPoint(p.worldObj.provider.dimensionId, chunk.getCenterXPos(), 0, chunk.getCenterZPosition(), true); if (cloaks.size() == 0) return; - - //Chunk c = p.worldObj.getChunkFromChunkCoords(chunk.chunkXPos, chunk.chunkZPos); - for (CloakedArea area : cloaks) { + for (CloakedArea area : cloaks) area.sendCloakPacketToPlayer(p, false); - } - - /*List list = new ArrayList(); - list.add(c); - - // Send obscured chunk - System.out.println("[Cloak] Sending to player " + p.username + " obscured chunk at (" + chunk.chunkXPos + "; " + chunk.chunkZPos + ")"); - ((EntityPlayerMP)p).playerNetServerHandler.sendPacketToPlayer(new Packet56MapChunks(list));*/ - } } diff --git a/src/cr0s/WarpDrive/CloakManager.java b/src/cr0s/WarpDrive/CloakManager.java index 907ed1d0..c06e4027 100644 --- a/src/cr0s/WarpDrive/CloakManager.java +++ b/src/cr0s/WarpDrive/CloakManager.java @@ -6,7 +6,10 @@ import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.network.FMLNetworkHandler; +import cpw.mods.fml.relauncher.Side; +import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLeashKnot; import net.minecraft.entity.EntityLivingBase; @@ -42,7 +45,9 @@ import net.minecraft.network.packet.Packet24MobSpawn; import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.network.packet.Packet25EntityPainting; import net.minecraft.network.packet.Packet26EntityExpOrb; +import net.minecraft.network.packet.Packet56MapChunks; import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import net.minecraft.world.World; @@ -55,22 +60,22 @@ import net.minecraft.world.chunk.storage.ExtendedBlockStorage; * */ -public class CloakManager { - - private LinkedList cloaks; +public class CloakManager +{ + private ArrayList cloaks; public CloakManager() { - this.cloaks = new LinkedList(); + this.cloaks = new ArrayList(); } public boolean isInCloak(int dimensionID, int x, int y, int z, boolean chunk) { - for (int i = 0; i < this.cloaks.size(); i++) { - if (this.cloaks.get(i).dimensionId != dimensionID) + for (int i = 0; i < this.cloaks.size(); i++){ + if (this.cloaks.get(i).world == null || this.cloaks.get(i).world.provider.dimensionId != dimensionID) continue; AxisAlignedBB axisalignedbb = this.cloaks.get(i).aabb; - if (axisalignedbb.minX <= x && axisalignedbb.maxX >= x && (chunk || (axisalignedbb.minY <= y && axisalignedbb.maxY >= y)) && axisalignedbb.minZ <= z && axisalignedbb.maxZ >= z) { + if (axisalignedbb.minX <= (double) x && axisalignedbb.maxX >= (double) x && (chunk || (axisalignedbb.minY <= (double) y && axisalignedbb.maxY >= (double) y)) && axisalignedbb.minZ <= (double) z && axisalignedbb.maxZ >= (double) z) { return true; } } @@ -81,31 +86,39 @@ public class CloakManager { public ArrayList getCloaksForPoint(int dimensionID, int x, int y, int z, boolean chunk) { ArrayList res = new ArrayList(); - for (int i = 0; i < this.cloaks.size(); i++) { - if (this.cloaks.get(i).dimensionId != dimensionID) + for (int i = 0; i < this.cloaks.size(); i++){ + if (this.cloaks.get(i).world == null || this.cloaks.get(i).world.provider.dimensionId != dimensionID) continue; AxisAlignedBB axisalignedbb = this.cloaks.get(i).aabb; - if (axisalignedbb.minX <= x && axisalignedbb.maxX >= x && (chunk || (axisalignedbb.minY <= y && axisalignedbb.maxY >= y)) && axisalignedbb.minZ <= z && axisalignedbb.maxZ >= z) { + //System.outprint("[Cloak] checking (" + x + "; " + y + "; " + z + ") -> " + this.cloaks.get(i).aabb); + if (axisalignedbb.minX <= (double) x && axisalignedbb.maxX >= (double) x && (chunk || (axisalignedbb.minY <= (double) y && axisalignedbb.maxY >= (double) y)) && axisalignedbb.minZ <= (double) z && axisalignedbb.maxZ >= (double) z) { res.add(cloaks.get(i)); - } + //System.outprintln(": YES"); + }// else + //System.outprintln(": NO"); } return res; } - public boolean isAreaExists(World worldObj, int x, int y, int z) { - return (getCloakedArea(worldObj, x, y, z) != null); + public boolean isAreaExists(int frequency) { + for (int i = 0; i < this.cloaks.size(); i++){ + if (this.cloaks.get(i).frequency == frequency) + return true; + } + + return false; } - public void addCloakedAreaWorld(World worldObj, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, int x, int y, int z, byte tier) { - cloaks.add(new CloakedArea(worldObj, x, y, z, AxisAlignedBB.getBoundingBox(minX, minY, minZ, maxX, maxY, maxZ), tier)); + public void addCloakedAreaWorld(World worldObj, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, int frequency, byte tier) { + cloaks.add(new CloakedArea(worldObj, frequency, AxisAlignedBB.getBoundingBox(minX, minY, minZ, maxX, maxY, maxZ), tier)); } - public void removeCloakedArea(World worldObj, int x, int y, int z) { + public void removeCloakedArea(int frequency) { int index = 0; for (int i = 0; i < this.cloaks.size(); i++){ - if (this.cloaks.get(i).coreX == x && this.cloaks.get(i).coreY == y && this.cloaks.get(i).coreZ == z && this.cloaks.get(i).dimensionId == worldObj.provider.dimensionId) { + if (this.cloaks.get(i).frequency == frequency) { this.cloaks.get(i).sendCloakPacketToPlayersEx(true); // send info about collapsing cloaking field index = i; break; @@ -115,121 +128,216 @@ public class CloakManager { cloaks.remove(index); } - public CloakedArea getCloakedArea(World worldObj, int x, int y, int z) { + public CloakedArea getCloakedArea(int frequency) { for (CloakedArea area : this.cloaks) { - if (area.coreX == x && area.coreY == y && area.coreZ == z && area.dimensionId == worldObj.provider.dimensionId) + if (area.frequency == frequency) return area; } return null; } - public void checkPlayerLeftArea(EntityPlayer player) { + public void playerEnteringCloakedArea(CloakedArea area, EntityPlayer player) { + area.playersInArea.add(player); + revealChunksToPlayer(area, player); + revealEntityToPlayer(area, player); + area.sendCloakPacketToPlayer(player, false); + } + + public void revealEntityToPlayer(CloakedArea area, EntityPlayer p) { + List list = p.worldObj.getEntitiesWithinAABBExcludingEntity(p, area.aabb); + + for (Entity e : list) { + ((EntityPlayerMP)p).playerNetServerHandler.sendPacketToPlayer(getPacketForThisEntity(e)); + } + } + + public void checkPlayerLeavedArea(EntityPlayer p) { for (CloakedArea area : this.cloaks) { - if (!area.isEntityWithinArea(player) && area.isPlayerInArea(player.username)) { - area.removePlayer(player.username); + if (!area.isPlayerWithinArea(p) && area.isPlayerInArea(p)) { + area.removePlayerFromArea(p); //System.outprintln("[Cloak] Player " + p.username + " has leaved cloaked area " + area.frequency); - MinecraftServer.getServer().getConfigurationManager().sendToAllNearExcept(player, player.posX, player.posY, player.posZ, 100, player.worldObj.provider.dimensionId, getPacketForThisEntity(player)); - area.sendCloakPacketToPlayer(player, false); + MinecraftServer.getServer().getConfigurationManager().sendToAllNearExcept(p, p.posX, p.posY, p.posZ, 100, p.worldObj.provider.dimensionId, getPacketForThisEntity(p)); + area.sendCloakPacketToPlayer(p, false); } } } - public static Packet getPacketForThisEntity(Entity e) { - if (e.isDead) { - e.worldObj.getWorldLogAgent().logWarning("Fetching addPacket for removed entity"); - } + public void revealChunksToPlayer(CloakedArea area, EntityPlayer p) { + //System.outprintln("[Cloak] Revealing cloaked chunks in area " + area.frequency + " to player " + p.username); + for (int x = (int)area.aabb.minX; x < (int)area.aabb.maxX; x++) + for (int z = (int)area.aabb.minZ; z < (int)area.aabb.maxZ; z++) + for (int y = (int)area.aabb.minY; y < (int)area.aabb.maxY; y++) { + if (p.worldObj.getBlockId(x, y, z) != 0) + p.worldObj.markBlockForUpdate(x, y, z); + } + /*ArrayList chunksToSend = new ArrayList(); + + for (int x = (int)area.aabb.minX >> 4; x <= (int)area.aabb.maxX >> 4; x++) + for (int z = (int)area.aabb.minZ >> 4; z <= (int)area.aabb.maxZ >> 4; z++) { + chunksToSend.add(p.worldObj.getChunkFromChunkCoords(x, z)); + } + + //System.outprintln("[Cloak] Sending " + chunksToSend.size() + " chunks to player " + p.username); + ((EntityPlayerMP)p).playerNetServerHandler.sendPacketToPlayer(new Packet56MapChunks(chunksToSend)); + + //System.outprintln("[Cloak] Sending decloak packet to player " + p.username); + area.sendCloakPacketToPlayer(p, true); // decloak = true + */ + } + + private Packet getPacketForThisEntity(Entity e) + { + if (e.isDead) + { + e.worldObj.getWorldLogAgent().logWarning("Fetching addPacket for removed entity"); + } - Packet pkt = FMLNetworkHandler.getEntitySpawningPacket(e); - if (pkt != null) { - return pkt; - } + Packet pkt = FMLNetworkHandler.getEntitySpawningPacket(e); - if (e instanceof EntityItem) { - return new Packet23VehicleSpawn(e, 2, 1); - } else if (e instanceof EntityPlayerMP) { - return new Packet20NamedEntitySpawn((EntityPlayer)e); - } else if (e instanceof EntityMinecart) { - EntityMinecart entityminecart = (EntityMinecart)e; - return new Packet23VehicleSpawn(e, 10, entityminecart.getMinecartType()); - } else if (e instanceof EntityBoat) { - return new Packet23VehicleSpawn(e, 1); - } else if (!(e instanceof IAnimals) && !(e instanceof EntityDragon)) { - if (e instanceof EntityFishHook) { - EntityPlayer entityplayer = ((EntityFishHook)e).angler; - return new Packet23VehicleSpawn(e, 90, entityplayer != null ? entityplayer.entityId : e.entityId); - } else if (e instanceof EntityArrow) { - Entity entity = ((EntityArrow)e).shootingEntity; - return new Packet23VehicleSpawn(e, 60, entity != null ? entity.entityId : e.entityId); - } else if (e instanceof EntitySnowball) { - return new Packet23VehicleSpawn(e, 61); - } else if (e instanceof EntityPotion) { - return new Packet23VehicleSpawn(e, 73, ((EntityPotion)e).getPotionDamage()); - } else if (e instanceof EntityExpBottle) { - return new Packet23VehicleSpawn(e, 75); - } else if (e instanceof EntityEnderPearl) { - return new Packet23VehicleSpawn(e, 65); - } else if (e instanceof EntityEnderEye) { - return new Packet23VehicleSpawn(e, 72); - } else if (e instanceof EntityFireworkRocket) { - return new Packet23VehicleSpawn(e, 76); - } else { - Packet23VehicleSpawn packet23vehiclespawn; + if (pkt != null) + { + return pkt; + } - if (e instanceof EntityFireball) { - EntityFireball entityfireball = (EntityFireball)e; - packet23vehiclespawn = null; - byte b0 = 63; + if (e instanceof EntityItem) + { + return new Packet23VehicleSpawn(e, 2, 1); + } + else if (e instanceof EntityPlayerMP) + { + return new Packet20NamedEntitySpawn((EntityPlayer)e); + } + else if (e instanceof EntityMinecart) + { + EntityMinecart entityminecart = (EntityMinecart)e; + return new Packet23VehicleSpawn(e, 10, entityminecart.getMinecartType()); + } + else if (e instanceof EntityBoat) + { + return new Packet23VehicleSpawn(e, 1); + } + else if (!(e instanceof IAnimals) && !(e instanceof EntityDragon)) + { + if (e instanceof EntityFishHook) + { + EntityPlayer entityplayer = ((EntityFishHook)e).angler; + return new Packet23VehicleSpawn(e, 90, entityplayer != null ? entityplayer.entityId : e.entityId); + } + else if (e instanceof EntityArrow) + { + Entity entity = ((EntityArrow)e).shootingEntity; + return new Packet23VehicleSpawn(e, 60, entity != null ? entity.entityId : e.entityId); + } + else if (e instanceof EntitySnowball) + { + return new Packet23VehicleSpawn(e, 61); + } + else if (e instanceof EntityPotion) + { + return new Packet23VehicleSpawn(e, 73, ((EntityPotion)e).getPotionDamage()); + } + else if (e instanceof EntityExpBottle) + { + return new Packet23VehicleSpawn(e, 75); + } + else if (e instanceof EntityEnderPearl) + { + return new Packet23VehicleSpawn(e, 65); + } + else if (e instanceof EntityEnderEye) + { + return new Packet23VehicleSpawn(e, 72); + } + else if (e instanceof EntityFireworkRocket) + { + return new Packet23VehicleSpawn(e, 76); + } + else + { + Packet23VehicleSpawn packet23vehiclespawn; - if (e instanceof EntitySmallFireball) { - b0 = 64; - } else if (e instanceof EntityWitherSkull) { - b0 = 66; - } + if (e instanceof EntityFireball) + { + EntityFireball entityfireball = (EntityFireball)e; + packet23vehiclespawn = null; + byte b0 = 63; - if (entityfireball.shootingEntity != null) { - packet23vehiclespawn = new Packet23VehicleSpawn(e, b0, ((EntityFireball)e).shootingEntity.entityId); - } else { - packet23vehiclespawn = new Packet23VehicleSpawn(e, b0, 0); - } + if (e instanceof EntitySmallFireball) + { + b0 = 64; + } + else if (e instanceof EntityWitherSkull) + { + b0 = 66; + } - packet23vehiclespawn.speedX = (int)(entityfireball.accelerationX * 8000.0D); - packet23vehiclespawn.speedY = (int)(entityfireball.accelerationY * 8000.0D); - packet23vehiclespawn.speedZ = (int)(entityfireball.accelerationZ * 8000.0D); - return packet23vehiclespawn; - } else if (e instanceof EntityEgg) { - return new Packet23VehicleSpawn(e, 62); - } else if (e instanceof EntityTNTPrimed) { - return new Packet23VehicleSpawn(e, 50); - } else if (e instanceof EntityEnderCrystal) { - return new Packet23VehicleSpawn(e, 51); - } else if (e instanceof EntityFallingSand) { - EntityFallingSand entityfallingsand = (EntityFallingSand)e; - return new Packet23VehicleSpawn(e, 70, entityfallingsand.blockID | entityfallingsand.metadata << 16); - } else if (e instanceof EntityPainting) { - return new Packet25EntityPainting((EntityPainting)e); - } else if (e instanceof EntityItemFrame) { - EntityItemFrame entityitemframe = (EntityItemFrame)e; - packet23vehiclespawn = new Packet23VehicleSpawn(e, 71, entityitemframe.hangingDirection); - packet23vehiclespawn.xPosition = MathHelper.floor_float(entityitemframe.xPosition * 32); - packet23vehiclespawn.yPosition = MathHelper.floor_float(entityitemframe.yPosition * 32); - packet23vehiclespawn.zPosition = MathHelper.floor_float(entityitemframe.zPosition * 32); - return packet23vehiclespawn; - } else if (e instanceof EntityLeashKnot) { - EntityLeashKnot entityleashknot = (EntityLeashKnot)e; - packet23vehiclespawn = new Packet23VehicleSpawn(e, 77); - packet23vehiclespawn.xPosition = MathHelper.floor_float(entityleashknot.xPosition * 32); - packet23vehiclespawn.yPosition = MathHelper.floor_float(entityleashknot.yPosition * 32); - packet23vehiclespawn.zPosition = MathHelper.floor_float(entityleashknot.zPosition * 32); - return packet23vehiclespawn; - } else if (e instanceof EntityXPOrb) { - return new Packet26EntityExpOrb((EntityXPOrb)e); - } else { - throw new IllegalArgumentException("Don\'t know how to add " + e.getClass() + "!"); - } - } - } else { - return new Packet24MobSpawn((EntityLivingBase)e); - } - } + if (entityfireball.shootingEntity != null) + { + packet23vehiclespawn = new Packet23VehicleSpawn(e, b0, ((EntityFireball)e).shootingEntity.entityId); + } + else + { + packet23vehiclespawn = new Packet23VehicleSpawn(e, b0, 0); + } + + packet23vehiclespawn.speedX = (int)(entityfireball.accelerationX * 8000.0D); + packet23vehiclespawn.speedY = (int)(entityfireball.accelerationY * 8000.0D); + packet23vehiclespawn.speedZ = (int)(entityfireball.accelerationZ * 8000.0D); + return packet23vehiclespawn; + } + else if (e instanceof EntityEgg) + { + return new Packet23VehicleSpawn(e, 62); + } + else if (e instanceof EntityTNTPrimed) + { + return new Packet23VehicleSpawn(e, 50); + } + else if (e instanceof EntityEnderCrystal) + { + return new Packet23VehicleSpawn(e, 51); + } + else if (e instanceof EntityFallingSand) + { + EntityFallingSand entityfallingsand = (EntityFallingSand)e; + return new Packet23VehicleSpawn(e, 70, entityfallingsand.blockID | entityfallingsand.metadata << 16); + } + else if (e instanceof EntityPainting) + { + return new Packet25EntityPainting((EntityPainting)e); + } + else if (e instanceof EntityItemFrame) + { + EntityItemFrame entityitemframe = (EntityItemFrame)e; + packet23vehiclespawn = new Packet23VehicleSpawn(e, 71, entityitemframe.hangingDirection); + packet23vehiclespawn.xPosition = MathHelper.floor_float((float)(entityitemframe.xPosition * 32)); + packet23vehiclespawn.yPosition = MathHelper.floor_float((float)(entityitemframe.yPosition * 32)); + packet23vehiclespawn.zPosition = MathHelper.floor_float((float)(entityitemframe.zPosition * 32)); + return packet23vehiclespawn; + } + else if (e instanceof EntityLeashKnot) + { + EntityLeashKnot entityleashknot = (EntityLeashKnot)e; + packet23vehiclespawn = new Packet23VehicleSpawn(e, 77); + packet23vehiclespawn.xPosition = MathHelper.floor_float((float)(entityleashknot.xPosition * 32)); + packet23vehiclespawn.yPosition = MathHelper.floor_float((float)(entityleashknot.yPosition * 32)); + packet23vehiclespawn.zPosition = MathHelper.floor_float((float)(entityleashknot.zPosition * 32)); + return packet23vehiclespawn; + } + else if (e instanceof EntityXPOrb) + { + return new Packet26EntityExpOrb((EntityXPOrb)e); + } + else + { + throw new IllegalArgumentException("Don\'t know how to add " + e.getClass() + "!"); + } + } + } + else + { + return new Packet24MobSpawn((EntityLivingBase)e); + } + } } diff --git a/src/cr0s/WarpDrive/CloakedArea.java b/src/cr0s/WarpDrive/CloakedArea.java index b90f7245..dbae7818 100644 --- a/src/cr0s/WarpDrive/CloakedArea.java +++ b/src/cr0s/WarpDrive/CloakedArea.java @@ -17,63 +17,57 @@ import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; -public class CloakedArea { - public int dimensionId = -666; - public int coreX, coreY, coreZ; +public class CloakedArea +{ + public int frequency; public AxisAlignedBB aabb; - private LinkedList playersInArea; + public LinkedList playersInArea; public byte tier = 0; + public World world = null; - public boolean isPlayerInArea(String username) { - for (String playerInArea : playersInArea) { + public boolean isPlayerInArea(EntityPlayer player) { + for (EntityPlayer p : this.playersInArea) { //System.outprintln("[Cloak] Checking player: " + p.username + "(" + p.entityId + ")" + " =? " + player.username + " (" + p.entityId + ")"); - if (playerInArea.equals(username)) + if (p.username.equals(player.username)) return true; } - + return false; } - public void removePlayer(String username) { - for (int i = 0; i < playersInArea.size(); i++) { - if (playersInArea.get(i).equals(username)) { - playersInArea.remove(i); + public void removePlayerFromArea(EntityPlayer p) { + for (int i = 0; i < this.playersInArea.size(); i++) { + if (this.playersInArea.get(i).username.equals(p.username)) { + this.playersInArea.remove(i); return; } - } + } } - public void addPlayer(String username) { - if (!isPlayerInArea(username)) { - playersInArea.add(username); - } + public boolean isPlayerWithinArea(EntityPlayer player) { + return (aabb.minX <= player.posX && aabb.maxX >= player.posX && aabb.minY <= player.posY && aabb.maxY >= player.posY && aabb.minZ <= player.posZ && aabb.maxZ >= player.posZ); } - - public boolean isEntityWithinArea(Entity entity) { - return (aabb.minX <= entity.posX && aabb.maxX >= entity.posX && aabb.minY <= entity.posY && aabb.maxY >= entity.posY && aabb.minZ <= entity.posZ && aabb.maxZ >= entity.posZ); - } - - public CloakedArea(World worldObj, int x, int y, int z, AxisAlignedBB aabb, byte tier) { - this.coreX = x; - this.coreY = y; - this.coreZ = z; + + public CloakedArea(World worldObj, int frequency, AxisAlignedBB aabb, byte tier) { + this.frequency = frequency; this.aabb = aabb; this.tier = tier; - this.playersInArea = new LinkedList(); + this.playersInArea = new LinkedList(); - if (worldObj == null || aabb == null) { + if (worldObj == null || aabb == null) + return; + + this.world = worldObj; + + if (this.world == null) return; - } - this.dimensionId = worldObj.provider.dimensionId; - try { - // Add all players currently inside the field + // Added all players, who inside the field List list = worldObj.getEntitiesWithinAABB(EntityPlayerMP.class, this.aabb); for (Entity e : list) { - if (e instanceof EntityPlayer) { - addPlayer(((EntityPlayer)e).username); - } + if (e instanceof EntityPlayer) + this.playersInArea.add((EntityPlayer)e); } } catch (Exception e) { e.printStackTrace(); @@ -98,33 +92,36 @@ public class CloakedArea { double midY = this.aabb.minY + (Math.abs(this.aabb.maxY - this.aabb.minY) / 2); double midZ = this.aabb.minZ + (Math.abs(this.aabb.maxZ - this.aabb.minZ) / 2); - for (int j = 0; j < MinecraftServer.getServer().getConfigurationManager().playerEntityList.size(); j++) { - EntityPlayerMP entityPlayerMP = (EntityPlayerMP)MinecraftServer.getServer().getConfigurationManager().playerEntityList.get(j); + for (int j = 0; j < MinecraftServer.getServer().getConfigurationManager().playerEntityList.size(); ++j) + { + EntityPlayerMP entityplayermp = (EntityPlayerMP)MinecraftServer.getServer().getConfigurationManager().playerEntityList.get(j); - if (entityPlayerMP.dimension == dimensionId) { - double d4 = midX - entityPlayerMP.posX; - double d5 = midY - entityPlayerMP.posY; - double d6 = midZ - entityPlayerMP.posZ; + if (entityplayermp.dimension == this.world.provider.dimensionId) + { + double d4 = midX - entityplayermp.posX; + double d5 = midY - entityplayermp.posY; + double d6 = midZ - entityplayermp.posZ; - if (Math.abs(d4) < RADIUS && Math.abs(d5) < RADIUS && Math.abs(d6) < RADIUS) { + if (d4 * d4 + d5 * d5 + d6 * d6 < RADIUS * RADIUS) + { if (decloak) { - revealChunksToPlayer(entityPlayerMP); - revealEntityToPlayer(entityPlayerMP); + WarpDrive.instance.cloaks.revealChunksToPlayer(this, (EntityPlayer)entityplayermp); + WarpDrive.instance.cloaks.revealEntityToPlayer(this, (EntityPlayer)entityplayermp); } - if (!isEntityWithinArea(entityPlayerMP) && !decloak) { - sendCloakPacketToPlayer(entityPlayerMP, false); - } else if (decloak) { - sendCloakPacketToPlayer(entityPlayerMP, true); + if (!isPlayerWithinArea((EntityPlayer)entityplayermp) && !decloak) + sendCloakPacketToPlayer((EntityPlayer)entityplayermp, false); + else if (decloak) { + sendCloakPacketToPlayer((EntityPlayer)entityplayermp, true); } } } - } + } } public void sendCloakPacketToPlayer(EntityPlayer player, boolean decloak) { //System.outprintln("[Cloak] Sending cloak packet to player " + player.username); - if (isPlayerInArea(player.username)) { + if (isPlayerInArea(player)) { //System.outprintln("[Cloak] Player " + player.username + " is inside cloaking field"); return; } @@ -132,7 +129,8 @@ public class CloakedArea { ByteArrayOutputStream bos = new ByteArrayOutputStream(8); DataOutputStream outputStream = new DataOutputStream(bos); - try { + try + { outputStream.writeInt((int) this.aabb.minX); outputStream.writeInt((int) this.aabb.minY); outputStream.writeInt((int) this.aabb.minZ); @@ -144,15 +142,17 @@ public class CloakedArea { outputStream.writeBoolean(decloak); outputStream.writeByte(this.tier); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.printStackTrace(); } - + Packet250CustomPayload packet = new Packet250CustomPayload(); packet.channel = "WarpDriveCloaks"; packet.data = bos.toByteArray(); packet.length = bos.size(); - + ((EntityPlayerMP)player).playerNetServerHandler.sendPacketToPlayer(packet); } @@ -186,6 +186,9 @@ public class CloakedArea { extendedblockstorage = storageArrays[y >> 4] = new ExtendedBlockStorage(y >> 4 << 4, !c.worldObj.provider.hasNoSky); } + + int j2 = c.xPosition * 16 + x; + int k2 = c.zPosition * 16 + z; extendedblockstorage.setExtBlockID(x, y & 15, z, blockId); if (extendedblockstorage.getExtBlockID(x, y & 15, z) != blockId) @@ -199,46 +202,5 @@ public class CloakedArea { return true; } } - } - - public void playerEnteringCloakedArea(EntityPlayer player) { - addPlayer(player.username); - revealChunksToPlayer(player); - revealEntityToPlayer(player); - sendCloakPacketToPlayer(player, false); - } - - public void revealChunksToPlayer(EntityPlayer p) { - //System.outprintln("[Cloak] Revealing cloaked chunks in area " + area.frequency + " to player " + p.username); - for (int x = (int)aabb.minX; x <= (int)aabb.maxX; x++) { - for (int z = (int)aabb.minZ; z <= (int)aabb.maxZ; z++) { - for (int y = (int)aabb.minY; y <= (int)aabb.maxY; y++) { - if (p.worldObj.getBlockId(x, y, z) != 0) { - p.worldObj.markBlockForUpdate(x, y, z); - } - } - } - } - /*ArrayList chunksToSend = new ArrayList(); - - for (int x = (int)aabb.minX >> 4; x <= (int)aabb.maxX >> 4; x++) - for (int z = (int)aabb.minZ >> 4; z <= (int)aabb.maxZ >> 4; z++) { - chunksToSend.add(p.worldObj.getChunkFromChunkCoords(x, z)); - } - - //System.outprintln("[Cloak] Sending " + chunksToSend.size() + " chunks to player " + p.username); - ((EntityPlayerMP)p).playerNetServerHandler.sendPacketToPlayer(new Packet56MapChunks(chunksToSend)); - - //System.outprintln("[Cloak] Sending decloak packet to player " + p.username); - area.sendCloakPacketToPlayer(p, true); // decloak = true - */ - } - - public void revealEntityToPlayer(EntityPlayer p) { - List list = p.worldObj.getEntitiesWithinAABBExcludingEntity(p, aabb); - - for (Entity e : list) { - ((EntityPlayerMP)p).playerNetServerHandler.sendPacketToPlayer(CloakManager.getPacketForThisEntity(e)); - } - } + } } diff --git a/src/cr0s/WarpDrive/CommonProxy.java b/src/cr0s/WarpDrive/CommonProxy.java index 6cdacb9c..272c2ca2 100644 --- a/src/cr0s/WarpDrive/CommonProxy.java +++ b/src/cr0s/WarpDrive/CommonProxy.java @@ -1,5 +1,8 @@ package cr0s.WarpDrive; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; + import net.minecraft.world.World; import cpw.mods.fml.common.registry.EntityRegistry; @@ -7,10 +10,10 @@ public class CommonProxy { public void registerEntities() { - EntityRegistry.registerModEntity(EntityJump.class, "EntityJump", 240, WarpDrive.instance, 80, 1, false); // Lem - EntityRegistry.registerModEntity(EntitySphereGen.class, "EntitySphereGenerator", 241, WarpDrive.instance, 200, 1, false); // Lem - EntityRegistry.registerModEntity(EntityStarCore.class, "EntityStarCore", 242, WarpDrive.instance, 300, 1, false); // Lem - EntityRegistry.registerModEntity(EntityCamera.class, "EntityCamera", 243, WarpDrive.instance, 300, 1, false); // Lem + EntityRegistry.registerModEntity(EntityJump.class, "EntityJump", 1, WarpDrive.instance, 80, 1, false); + EntityRegistry.registerModEntity(EntitySphereGen.class, "EntitySphereGenerator", 1, WarpDrive.instance, 200, 1, false); + EntityRegistry.registerModEntity(EntityStarCore.class, "EntityStarCore", 1, WarpDrive.instance, 300, 1, false); + EntityRegistry.registerModEntity(EntityCamera.class, "EntityCamera", 1, WarpDrive.instance, 300, 1, false); } public void registerRenderers() diff --git a/src/cr0s/WarpDrive/DebugCommand.java b/src/cr0s/WarpDrive/DebugCommand.java deleted file mode 100644 index 452dc050..00000000 --- a/src/cr0s/WarpDrive/DebugCommand.java +++ /dev/null @@ -1,150 +0,0 @@ -package cr0s.WarpDrive; - -import cpw.mods.fml.common.FMLCommonHandler; -import net.minecraft.command.CommandBase; -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.DimensionManager; - -/* -* /wdebug -*/ - -public class DebugCommand extends CommandBase -{ - @Override - public String getCommandName() - { - return "wdebug"; - } - - @Override - public int getRequiredPermissionLevel() - { - return 2; - } - - @Override - public String getCommandUsage(ICommandSender par1ICommandSender) - { - return "/" + getCommandName() + " ...\n" - + "dimension: 0/world, 2/space, 3/hyperspace\n" - + "coordinates: x,y,z\n" - + "action: I(nvalidate), V(alidate), A(set air), R(emoveEntity), P(setBlock), S(etEntity)"; - } - - @Override - public void processCommand(ICommandSender icommandsender, String[] params) - { - EntityPlayerMP player = (EntityPlayerMP)icommandsender; - if(params.length > 6 ) - { - int dim, x, y, z, blockId, metadata; - String actions; - try - { - String par = params[0].toLowerCase(); - if (par.equals("world") || par.equals("overworld") || par.equals("0")) - { - dim = 0; - } - else if (par.equals("nether") || par.equals("thenether") || par.equals("-1")) - { - dim = -1; - } - else if (par.equals("s") || par.equals("space")) - { - dim = WarpDriveConfig.G_SPACE_DIMENSION_ID; - } - else if (par.equals("h") || par.equals("hyper") || par.equals("hyperspace")) - { - dim = WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID; - } - else - { - dim = Integer.parseInt(par); - } - - x = Integer.parseInt(params[1]); - y = Integer.parseInt(params[2]); - z = Integer.parseInt(params[3]); - blockId = Integer.parseInt(params[4]); - metadata = Integer.parseInt(params[5]); - actions = params[6]; - } - catch (Exception e) - { - e.printStackTrace(); - player.addChatMessage(getCommandUsage(icommandsender)); - return; - } - - notifyAdmins(icommandsender, "/" + getCommandName() + " " + dim + " " + x + "," + y + "," + z + " " + blockId + ":" + metadata + " " + actions); - World worldObj = DimensionManager.getWorld(dim); - TileEntity te = worldObj.getBlockTileEntity(x, y, z); - notifyAdmins(icommandsender, "[" + getCommandName() + "] In dimension " + worldObj.getProviderName() + " - " + worldObj.getWorldInfo().getWorldName() + ", Current block is " + worldObj.getBlockId(x, y, z) + ":" + worldObj.getBlockMetadata(x, y, z) + ", tile entity is " + ((te == null) ? "undefined" : "defined")); - String side = FMLCommonHandler.instance().getEffectiveSide().isClient() ? "Client":"Server"; - - // I(nvalidate), V(alidate), A(set air), R(emoveEntity), P(setBlock), S(etEntity) - boolean bReturn = false; - for (char ch: actions.toUpperCase().toCharArray()) { - switch (ch) { - case 'I': - notifyAdmins(icommandsender, "[" + getCommandName() + "] " + side + ": invalidating"); - if (te != null) { - te.invalidate(); - } - break; - case 'V': - notifyAdmins(icommandsender, "[" + getCommandName() + "] " + side + ": validating"); - if (te != null) { - te.validate(); - } - break; - case 'A': - notifyAdmins(icommandsender, "[" + getCommandName() + "] " + side + ": setting to Air"); - bReturn = worldObj.setBlockToAir(x, y, z); - notifyAdmins(icommandsender, "[" + getCommandName() + "] " + side + ": returned " + bReturn); - break; - case 'R': - notifyAdmins(icommandsender, "[" + getCommandName() + "] " + side + ": remove entity"); - worldObj.removeBlockTileEntity(x, y, z); - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - notifyAdmins(icommandsender, "[" + getCommandName() + "] " + side + ": set block " + x + ", " + y + ", " + z + " to " + blockId + ":" + metadata); - bReturn = worldObj.setBlock(x, y, z, blockId, metadata, ch - '0'); - notifyAdmins(icommandsender, "[" + getCommandName() + "] " + side + ": returned " + bReturn); - break; - case 'P': - notifyAdmins(icommandsender, "[" + getCommandName() + "] " + side + ": set block " + x + ", " + y + ", " + z + " to " + blockId + ":" + metadata); - bReturn = worldObj.setBlock(x, y, z, blockId, metadata, 2); - notifyAdmins(icommandsender, "[" + getCommandName() + "] " + side + ": returned " + bReturn); - break; - case 'S': - notifyAdmins(icommandsender, "[" + getCommandName() + "] " + side + ": set entity"); - worldObj.setBlockTileEntity(x, y, z, te); - break; - case 'C': - notifyAdmins(icommandsender, "[" + getCommandName() + "] " + side + ": update containing block info"); - if (te != null) { - te.updateContainingBlockInfo(); - } - break; - } - } - } - else - { - player.addChatMessage(getCommandUsage(icommandsender)); - } - } -} diff --git a/src/cr0s/WarpDrive/EntityCamera.java b/src/cr0s/WarpDrive/EntityCamera.java index 0bf3dcf1..0c3f2389 100644 --- a/src/cr0s/WarpDrive/EntityCamera.java +++ b/src/cr0s/WarpDrive/EntityCamera.java @@ -2,24 +2,35 @@ package cr0s.WarpDrive; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.network.PacketDispatcher; +import cpw.mods.fml.relauncher.Side; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; +import java.util.List; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.Display; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.settings.EnumOptions; -import net.minecraft.client.settings.GameSettings; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet250CustomPayload; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatMessageComponent; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.DamageSource; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; +import net.minecraft.entity.player.EntityPlayer; public final class EntityCamera extends EntityLivingBase { @@ -27,165 +38,145 @@ public final class EntityCamera extends EntityLivingBase public int yCoord; public int zCoord; + private int ticks = 0; private EntityPlayer player; private Minecraft mc = Minecraft.getMinecraft(); + private int dx, dy, dz; - private int dx = 0, dy = 0, dz = 0; private int zoomNumber = 0; - private int closeWaitTicks = 0; - private int zoomWaitTicks = 0; - private int fireWaitTicks = 0; - private boolean isActive = true; - private int bootUpTicks = 20; + private int waitTicks = 2; + private int fireWaitTicks = 2; + + private float oldFOV; + private float oldSens; - public EntityCamera(World world) { - super(world); - // TODO Auto-generated constructor stub - } - private boolean isCentered = true; - public EntityCamera(World world, ChunkPosition pos, EntityPlayer player) { + public EntityCamera(World world, ChunkPosition pos, EntityPlayer player) + { super(world); this.setInvisible(true); int x = pos.x; int y = pos.y; int z = pos.z; this.xCoord = x; - this.posX = x; + this.posX = (double) x; this.yCoord = y; - this.posY = y; + this.posY = (double) y; this.zCoord = z; - this.posZ = z; + this.posZ = (double) z; this.player = player; } - - private void closeCamera() { - if (!isActive) { - return; - } - - ClientCameraUtils.resetViewpoint(); - worldObj.removeEntity(this); - isActive = false; - } - + @Override - public void onEntityUpdate() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - if (player == null || player.isDead) { - WarpDrive.debugPrint("" + this + " Player is null or dead, closing camera..."); - closeCamera(); - return; - } - if (!ClientCameraUtils.isValidContext(worldObj)) { - WarpDrive.debugPrint("" + this + " Invalid context, closing camera..."); - closeCamera(); - return; - } - - int blockID = worldObj.getBlockId(xCoord, yCoord, zCoord); + public void onEntityUpdate() + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { mc.renderViewEntity.rotationYaw = player.rotationYaw; - //mc.renderViewEntity.rotationYawHead = player.rotationYawHead; mc.renderViewEntity.rotationPitch = player.rotationPitch; - WarpDrive.instance.debugMessage = "Mouse " + Mouse.isButtonDown(0) + " " + Mouse.isButtonDown(1) + " " + Mouse.isButtonDown(2) + " " + Mouse.isButtonDown(3) - + "\nBackspace " + Keyboard.isKeyDown(Keyboard.KEY_BACKSLASH) + " Space " + Keyboard.isKeyDown(Keyboard.KEY_SPACE) + " Shift " + ""; // Perform zoom - if (Mouse.isButtonDown(0)) {// FIXME merge: main is using right click with Mouse.isButtonDown(1), branch is using left click - zoomWaitTicks++; - if (zoomWaitTicks >= 2) { - zoomWaitTicks = 0; - zoom(); + if (Mouse.isButtonDown(1) && waitTicks-- <= 0) + { + waitTicks = 4; + zoom(); + } + + if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) + { + ClientCameraUtils.resetCam(); + this.setDead(); + } + else if (Mouse.isButtonDown(0) && fireWaitTicks-- <= 0) + { + fireWaitTicks = 1; + + // Make a shoot with camera-laser + if (worldObj.getBlockId(xCoord, yCoord, zCoord) == WarpDriveConfig.i.laserCamID) + { + sendTargetPacket(); + } + } + else + { + if (Keyboard.isKeyDown(Keyboard.KEY_DOWN) && (dy != -2)) + { + dy = -1; + } + else if (Keyboard.isKeyDown(Keyboard.KEY_UP) && (dy != 2)) + { + dy = 2; + } + else if (Keyboard.isKeyDown(Keyboard.KEY_A) && (dz != -1)) + { + dz = -1; + } + else if (Keyboard.isKeyDown(Keyboard.KEY_D) && (dz != 1)) + { + dz = 1; + } + else if (Keyboard.isKeyDown(Keyboard.KEY_W) && (dx != 1)) + { + dx = 1; + } + else if (Keyboard.isKeyDown(Keyboard.KEY_S) && (dx != -1)) + { + dx = -1; + } + else if (Keyboard.isKeyDown(Keyboard.KEY_C)) //centering view + { + isCentered = !isCentered; + return; } - } else { - zoomWaitTicks = 0; } - if (bootUpTicks > 0) { - bootUpTicks--; - } else { - if (Mouse.isButtonDown(1)) { - closeWaitTicks++; - if (closeWaitTicks >= 2) { - closeWaitTicks = 0; - closeCamera(); - } - } else { - closeWaitTicks = 0; - } - } - - if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {// FIXME merge: main is using left click with Mouse.isButtonDown(0), branch is using space bar - fireWaitTicks++; - if (fireWaitTicks >= 2) { - fireWaitTicks = 0; - - // Make a shoot with camera-laser - if (blockID == WarpDriveConfig.laserCamID) { - sendTargetPacket(); - } - } - } else { - fireWaitTicks = 0; - } - - GameSettings gamesettings = mc.gameSettings; - if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { - dy = -1; - } else if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { - dy = 2; - } else if (Keyboard.isKeyDown(gamesettings.keyBindLeft.keyCode)) { - dz = -1; - } else if (Keyboard.isKeyDown(gamesettings.keyBindRight.keyCode)) { - dz = 1; - } else if (Keyboard.isKeyDown(gamesettings.keyBindForward.keyCode)) { - dx = 1; - } else if (Keyboard.isKeyDown(gamesettings.keyBindBack.keyCode)) { - dx = -1; - } else if (Keyboard.isKeyDown(Keyboard.KEY_C)) { // centering view - dx = 0; - dy = 0; - dz = 0; - isCentered = !isCentered; - return; - } - - if (isCentered) { - setPosition(xCoord + 0.5D, yCoord + 0.75D, zCoord + 0.5D); + if (isCentered) + { + this.setPosition(xCoord + 0.5, yCoord + 0.75, zCoord + 0.5); } else { - setPosition(xCoord + dx, yCoord + dy, zCoord + dz); - } + this.setPosition(xCoord + dx, yCoord + dy, zCoord + dz); + } + + } } - @Override - public void onUpdate() { - super.onUpdate(); - this.motionX = this.motionY = this.motionZ = 0.0D; - } - - public void zoom() { - if (zoomNumber == 0) { + public void zoom() + { + if (zoomNumber == 0) + { + this.oldFOV = mc.gameSettings.fovSetting; + this.oldSens = mc.gameSettings.mouseSensitivity; mc.gameSettings.setOptionFloatValue(EnumOptions.FOV, -0.75F); mc.gameSettings.setOptionFloatValue(EnumOptions.SENSITIVITY, 0.4F); - } else if (zoomNumber == 1) { + ++zoomNumber; + } + else if (zoomNumber == 1) + { mc.gameSettings.setOptionFloatValue(EnumOptions.FOV, -1.25F); mc.gameSettings.setOptionFloatValue(EnumOptions.SENSITIVITY, 0.3F); - } else if (zoomNumber == 2) { + ++zoomNumber; + } + else if (zoomNumber == 2) + { mc.gameSettings.setOptionFloatValue(EnumOptions.FOV, -1.6F); mc.gameSettings.setOptionFloatValue(EnumOptions.SENSITIVITY, 0.15F); - } else if (zoomNumber == 3) { - mc.gameSettings.setOptionFloatValue(EnumOptions.FOV, WarpDrive.normalFOV); - mc.gameSettings.setOptionFloatValue(EnumOptions.SENSITIVITY, WarpDrive.normalSensitivity); + zoomNumber = 3; + } + else if (zoomNumber == 3) + { + mc.gameSettings.setOptionFloatValue(EnumOptions.FOV, this.oldFOV); + mc.gameSettings.setOptionFloatValue(EnumOptions.SENSITIVITY, this.oldSens); + zoomNumber = 0; } - zoomNumber = (zoomNumber + 1) % 4; } @Override - public boolean shouldRenderInPass(int pass) { + public boolean shouldRenderInPass(int pass) + { return false; } @@ -199,52 +190,68 @@ public final class EntityCamera extends EntityLivingBase @Override public void readEntityFromNBT(NBTTagCompound nbttagcompound) { - xCoord = nbttagcompound.getInteger("x"); - yCoord = nbttagcompound.getInteger("y"); - zCoord = nbttagcompound.getInteger("z"); + this.xCoord = nbttagcompound.getInteger("x"); + this.yCoord = nbttagcompound.getInteger("y"); + this.zCoord = nbttagcompound.getInteger("z"); } + /*@Override + protected void entityInit() { + }*/ + @Override public void writeEntityToNBT(NBTTagCompound nbttagcompound) { - nbttagcompound.setInteger("x", xCoord); - nbttagcompound.setInteger("y", yCoord); - nbttagcompound.setInteger("z", zCoord); + nbttagcompound.setInteger("x", this.xCoord); + nbttagcompound.setInteger("y", this.yCoord); + nbttagcompound.setInteger("z", this.zCoord); } @Override - public ItemStack getHeldItem() { + public ItemStack getHeldItem() + { return null; } @Override - public ItemStack getCurrentItemOrArmor(int i) { + public ItemStack getCurrentItemOrArmor(int i) + { return null; } @Override - public void setCurrentItemOrArmor(int i, ItemStack itemstack) { + public void setCurrentItemOrArmor(int i, ItemStack itemstack) + { } @Override - public ItemStack[] getLastActiveItems() { + public ItemStack[] getLastActiveItems() + { return null; } - // Camera orientation refresh to server packet - public void sendTargetPacket() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { + // Camera frequency refresh to clients packet + public void sendTargetPacket() + { + Side side = FMLCommonHandler.instance().getEffectiveSide(); + + if (side == Side.CLIENT) + { ByteArrayOutputStream bos = new ByteArrayOutputStream(8); DataOutputStream outputStream = new DataOutputStream(bos); - try { + try + { + // Write source vector outputStream.writeInt(xCoord); outputStream.writeInt(yCoord); outputStream.writeInt(zCoord); outputStream.writeFloat(mc.renderViewEntity.rotationYaw); outputStream.writeFloat(mc.renderViewEntity.rotationPitch); - } catch (Exception e) { - e.printStackTrace(); + } + catch (Exception ex) + { + ex.printStackTrace(); } Packet250CustomPayload packet = new Packet250CustomPayload(); @@ -252,7 +259,6 @@ public final class EntityCamera extends EntityLivingBase packet.data = bos.toByteArray(); packet.length = bos.size(); PacketDispatcher.sendPacketToServer(packet); - WarpDrive.debugPrint("" + this + " Packet '" + packet.channel + "' sent (" + xCoord + ", " + yCoord + ", " + zCoord + ") yawn " + mc.renderViewEntity.rotationYaw + " pitch " + mc.renderViewEntity.rotationPitch); } } @@ -270,4 +276,4 @@ public final class EntityCamera extends EntityLivingBase public ChunkCoordinates getPlayerCoordinates() { return new ChunkCoordinates(xCoord, yCoord, zCoord); }*/ -} \ No newline at end of file +} diff --git a/src/cr0s/WarpDrive/EntityJump.java b/src/cr0s/WarpDrive/EntityJump.java index 9a4cf5b5..64055e2c 100644 --- a/src/cr0s/WarpDrive/EntityJump.java +++ b/src/cr0s/WarpDrive/EntityJump.java @@ -1,8 +1,9 @@ package cr0s.WarpDrive; import cpw.mods.fml.common.FMLCommonHandler; -import cr0s.WarpDrive.machines.TileEntityReactor; -import dan200.computercraft.api.peripheral.IPeripheral; +import dan200.computer.api.IPeripheral; +import dan200.turtle.api.ITurtleAccess; +import dan200.turtle.api.TurtleSide; import ic2.api.network.NetworkHelper; import java.lang.reflect.Method; @@ -40,13 +41,17 @@ public class EntityJump extends Entity private int moveY; private int moveZ; - private int xCoord; - private int yCoord; - private int zCoord; - private int dx; - private int dz; - private int distance; - private int direction; + public int xCoord; + public int yCoord; + public int zCoord; + public int distance; + public int dir; + public int shipLeft; + public int shipRight; + public int shipFront; + public int shipBack; + public int shipDown; + public int shipUp; public int shipLength; public int maxX; public int maxZ; @@ -54,182 +59,161 @@ public class EntityJump extends Entity public int minX; public int minZ; public int minY; + public int dx; + public int dz; - private boolean isHyperspaceJump; + public int mode; - private World targetWorld; + public World targetWorld; private Ticket sourceWorldTicket; private Ticket targetWorldTicket; - private boolean collisionDetected = false; - private ArrayList collisionAtSource; - private ArrayList collisionAtTarget; - private float collisionStrength = 0; - + // Collision point coordinates + public int blowX, blowY, blowZ; + boolean needToExplode = false; public boolean on = false; - private JumpBlock ship[]; - private TileEntityReactor reactor; + public boolean bedrockOnShip = false; + public JumpBlock ship[]; + public TileEntityReactor reactor; - private final static int STATE_IDLE = 0; - private final static int STATE_JUMPING = 1; - private final static int STATE_REMOVING = 2; - private int state = STATE_IDLE; - private int currentIndexInShip = 0; + public final static int STATE_IDLE = 0; + public final static int STATE_JUMPING = 1; + public final static int STATE_REMOVING = 2; + int state = STATE_IDLE; + int currentIndexInShip = 0; private final int BLOCKS_PER_TICK = 3500; private List entitiesOnShip; private List ASTurbines; - private boolean betweenWorlds; + AxisAlignedBB axisalignedbb; - private int destX, destY, destZ; - private boolean isCoordJump; + private boolean fromSpace, toSpace, betweenWorlds; + public boolean toHyperSpace, fromHyperSpace; + private boolean isInHyperSpace; - private long msCounter = 0; - private int ticks = 0; + int destX, destY, destZ; + boolean isCoordJump; + + long msCounter = 0; public EntityJump(World world) { super(world); targetWorld = worldObj; - WarpDrive.debugPrint("" + this + " Entity created (empty) in dimension " + worldObj.getProviderName() + " - " + worldObj.getWorldInfo().getWorldName() - + " " + (FMLCommonHandler.instance().getEffectiveSide().isClient() ? "Client":"Server")); + System.out.println("[JE@" + this + "] Entity created (empty)"); } - public EntityJump(World world, int x, int y, int z, int _dx, int _dz, TileEntityReactor _reactor, - boolean _isHyperspaceJump, int _distance, int _direction, boolean _isCoordJump, int _destX, int _destY, int _destZ) { + public EntityJump(World world, int x, int y, int z, int _dist, int _direction, int _dx, int _dz, TileEntityReactor parReactor) + { super(world); - this.posX = x + 0.5D; - this.posY = y + 0.5D; - this.posZ = z + 0.5D; this.xCoord = x; + this.posX = (double) x; this.yCoord = y; + this.posY = (double) y; this.zCoord = z; + this.posZ = (double) z; + this.distance = _dist; + this.dir = _direction; + shipLeft = shipRight = shipFront = shipBack = shipDown = shipUp = shipLength = 0; this.dx = _dx; this.dz = _dz; - this.reactor = _reactor; - this.isHyperspaceJump = _isHyperspaceJump; - this.distance = _distance; - this.direction = _direction; - this.isCoordJump = _isCoordJump; - this.destX = _destX; - this.destY = _destY; - this.destZ = _destZ; - - // set by reactor maxX = maxZ = maxY = minX = minZ = minY = 0; - shipLength = 0; - - // set when preparing jump - targetWorld = null; - - WarpDrive.debugPrint("" + this + " Entity created"); + targetWorld = worldObj; + System.out.println("[JE@" + this + "] Entity created"); + this.reactor = parReactor; } - public void killEntity(String reason) { - if (!on) { + public void killEntity(String reason) + { + if (!on) + { return; } on = false; + System.out.println("[JE@" + this + "] Killing jump entity..."); - if (reason == null || reason.isEmpty()) { - WarpDrive.debugPrint("" + this + " Killing jump entity..."); - } else { - WarpDrive.debugPrint("" + this + " Killing jump entity... (" + reason + ")"); + if (!reason.isEmpty()) + { + System.out.println("[JUMP] Killed: " + reason); } -// unlockWorlds(); + unlockWorlds(); unforceChunks(); worldObj.removeEntity(this); } - + @Override - public boolean isEntityInvulnerable() { - return true; - } - - @Override - public void onUpdate() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { + public void onUpdate() + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { return; } - if (!on) { - System.out.println("" + this + " Removing from onUpdate..."); + if (!on) + { worldObj.removeEntity(this); return; } - if (minY < 0 || maxY > 256) { - String msg = "Invalid Y coordinate(s), check ship dimensions..."; - messageToAllPlayersOnShip(msg); - killEntity(msg); + if (minY < 0 || maxY > 256) + { + killEntity("Y-coord error!"); return; } - ticks++; - if (state == STATE_IDLE) { - WarpDrive.debugPrint("" + this + " Preparing to jump..."); + if (state == STATE_IDLE) + { + System.out.println("[JE] Preparing to jump..."); prepareToJump(); - if (on) { - state = STATE_JUMPING; - } - } else if (state == STATE_JUMPING) { - if (currentIndexInShip < ship.length - 1) { - //moveEntities(true); - moveShip(); - } else { + state = STATE_JUMPING; + } + else if (state == STATE_JUMPING) + { + if (currentIndexInShip >= ship.length - 1) + { moveEntities(false); currentIndexInShip = 0; state = STATE_REMOVING; } - } else if (state == STATE_REMOVING) { + else + { + //moveEntities(true); + moveShip(); + } + } + else if (state == STATE_REMOVING) + { ASTurbines = new ArrayList(); removeShip(); - if (currentIndexInShip >= ship.length - 1) { + if (currentIndexInShip >= ship.length - 1) + { finishJump(); + FixASTurbines(); state = STATE_IDLE; } - } else { - String msg = "Invalid state, aborting jump..."; - messageToAllPlayersOnShip(msg); - killEntity(msg); - return; } } - private boolean forceChunks(StringBuilder reason) + private void forceChunks() { - LocalProfiler.start("EntityJump.forceChunks"); - WarpDrive.debugPrint("" + this + " Forcing chunks in " + worldObj.provider.getDimensionName() + " and " + targetWorld.provider.getDimensionName()); - sourceWorldTicket = ForgeChunkManager.requestTicket(WarpDrive.instance, worldObj, Type.NORMAL); // Type.ENTITY); - if (sourceWorldTicket == null) { - reason.append("Chunkloading rejected in S:" + worldObj.getWorldInfo().getWorldName() + ". Aborting."); - return false; - } + System.out.println("[JE@" + this + "] Forcing chunks"); + sourceWorldTicket = ForgeChunkManager.requestTicket(WarpDrive.instance, worldObj, Type.ENTITY); targetWorldTicket = ForgeChunkManager.requestTicket(WarpDrive.instance, targetWorld, Type.NORMAL); - if (targetWorldTicket == null) { - reason.append("Chunkloading rejected in T:" + worldObj.getWorldInfo().getWorldName() + ". Aborting."); - return false; - } -// sourceWorldTicket.bindEntity(this); + sourceWorldTicket.bindEntity(this); int x1 = minX >> 4; int x2 = maxX >> 4; int z1 = minZ >> 4; int z2 = maxZ >> 4; - int chunkCount = 0; + for (int x = x1; x <= x2; x++) { for (int z = z1; z <= z2; z++) { - chunkCount++; - if (chunkCount > sourceWorldTicket.getMaxChunkListDepth()) { - reason.append("Ship is extending over too many chunks, max is S:" + sourceWorldTicket.getMaxChunkListDepth() + ". Aborting."); - return false; - } ForgeChunkManager.forceChunk(sourceWorldTicket, new ChunkCoordIntPair(x, z)); } } @@ -238,283 +222,283 @@ public class EntityJump extends Entity x2 = (maxX + moveX) >> 4; z1 = (minZ + moveZ) >> 4; z2 = (maxZ + moveZ) >> 4; - chunkCount = 0; + for (int x = x1; x <= x2; x++) { for (int z = z1; z <= z2; z++) { - chunkCount++; - if (chunkCount > targetWorldTicket.getMaxChunkListDepth()) { - reason.append("Ship is extending over too many chunks, max is T:" + sourceWorldTicket.getMaxChunkListDepth() + ". Aborting."); - return false; - } ForgeChunkManager.forceChunk(targetWorldTicket, new ChunkCoordIntPair(x, z)); } } - LocalProfiler.stop(); - return true; } private void unforceChunks() { - LocalProfiler.start("EntityJump.unforceChunks"); - WarpDrive.debugPrint("" + this + " Unforcing chunks"); + System.out.println("[JE@" + this + "] Unforcing chunks"); - int x1, x2, z1, z2; - if (sourceWorldTicket != null) { - x1 = minX >> 4; - x2 = maxX >> 4; - z1 = minZ >> 4; - z2 = maxZ >> 4; - for (int x = x1; x <= x2; x++) { - for (int z = z1; z <= z2; z++) { - ForgeChunkManager.unforceChunk(sourceWorldTicket, new ChunkCoordIntPair(x, z)); - } - } - ForgeChunkManager.releaseTicket(sourceWorldTicket); - sourceWorldTicket = null; + if (sourceWorldTicket == null || targetWorldTicket == null) + { + return; } - if (targetWorldTicket != null) { - x1 = (minX + moveX) >> 4; - x2 = (maxX + moveX) >> 4; - z1 = (minZ + moveZ) >> 4; - z2 = (maxZ + moveZ) >> 4; - for (int x = x1; x <= x2; x++) { - for (int z = z1; z <= z2; z++) { - ForgeChunkManager.unforceChunk(targetWorldTicket, new ChunkCoordIntPair(x, z)); - } + int x1 = minX >> 4; + int x2 = maxX >> 4; + int z1 = minZ >> 4; + int z2 = maxZ >> 4; + + for (int x = x1; x <= x2; x++) + { + for (int z = z1; z <= z2; z++) + { + ForgeChunkManager.unforceChunk(sourceWorldTicket, new ChunkCoordIntPair(x, z)); } - ForgeChunkManager.releaseTicket(targetWorldTicket); - targetWorldTicket = null; } - - LocalProfiler.stop(); + + x1 = (minX + moveX) >> 4; + x2 = (maxX + moveX) >> 4; + z1 = (minZ + moveZ) >> 4; + z2 = (maxZ + moveZ) >> 4; + + for (int x = x1; x <= x2; x++) + { + for (int z = z1; z <= z2; z++) + { + ForgeChunkManager.unforceChunk(targetWorldTicket, new ChunkCoordIntPair(x, z)); + } + } + + ForgeChunkManager.releaseTicket(sourceWorldTicket); + ForgeChunkManager.releaseTicket(targetWorldTicket); + sourceWorldTicket = null; + targetWorldTicket = null; } - private void messageToAllPlayersOnShip(String msg) { - if (entitiesOnShip == null) { - reactor.messageToAllPlayersOnShip(msg); - } else { - System.out.println("" + this + " messageToAllPlayersOnShip: " + msg); - for (MovingEntity me : entitiesOnShip) { - if (me.entity instanceof EntityPlayer) { - ((EntityPlayer)me.entity).addChatMessage("[" + ((reactor != null && reactor.coreFrequency.length() > 0) ? reactor.coreFrequency : "WarpCore") + "] " + msg); - } - } + public void lockWorlds() + { + System.out.println("[JE@" + this + "] Locking worlds..."); + targetWorld.isRemote = true; + + // When warping between dimensions is need to lock both worlds + if (targetWorld.provider.dimensionId != worldObj.provider.dimensionId) + { + worldObj.isRemote = true; } } - public static String getDirectionLabel(int direction) { - switch (direction) { - case -1: return "UP"; - case -2: return "DOWN"; - case 0: return "FRONT"; - case 180: return "BACK"; - case 90: return "LEFT"; - case 255: return "RIGHT"; - default: return direction + " degrees"; + public void unlockWorlds() + { + System.out.println("[JE@" + this + "] Unlocking worlds.."); + targetWorld.isRemote = false; + + if (targetWorld.provider.dimensionId != worldObj.provider.dimensionId) + { + worldObj.isRemote = false; } } - - private void prepareToJump() { - StringBuilder reason = new StringBuilder(); + public void messageToAllPlayersOnShip(String msg) + { + if (entitiesOnShip != null) + for (MovingEntity me : entitiesOnShip) + if (me.entity instanceof EntityPlayer) + ((EntityPlayer)me.entity).addChatMessage("[WarpCore] " + msg); + } + + public void prepareToJump() + { LocalProfiler.start("EntityJump.prepareToJump"); - boolean isInSpace = (worldObj.provider.dimensionId == WarpDriveConfig.G_SPACE_DIMENSION_ID); - boolean isInHyperSpace = (worldObj.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID); + isInHyperSpace = (worldObj.provider.dimensionId == WarpDrive.instance.hyperSpaceDimID); + toSpace = (dir == -1 && (maxY + distance > 255) && worldObj.provider.dimensionId == 0); + fromSpace = (dir == -2 && (minY - distance < 0) && worldObj.provider.dimensionId == WarpDrive.instance.spaceDimID); + betweenWorlds = fromSpace || toSpace || toHyperSpace || fromHyperSpace; - boolean toSpace = (direction == -1) && (maxY + distance > 255) && (!isInSpace) && (!isInHyperSpace); - boolean fromSpace = (direction == -2) && (minY - distance < 0) && isInSpace; - betweenWorlds = fromSpace || toSpace || isHyperspaceJump; - moveX = moveY = moveZ = 0; - - TransitionPlane overworld = new TransitionPlane(0, 0, 0, 5000, 5000, 0, 0); - Vector3 exit; //FIXME - if (toSpace) { - if (worldObj.provider.dimensionId == overworld.dimensionId) { - if (!overworld.isValidToSpace(new Vector3(this))) {// invalid transition, cancel transition - LocalProfiler.stop(); - String msg = "Ship is outside worldborder, unable to transition to space!"; - messageToAllPlayersOnShip(msg); - killEntity(msg); - return; - } - moveX = overworld.spaceCenterX - overworld.dimensionCenterX; - moveZ = overworld.spaceCenterZ - overworld.dimensionCenterZ; - } else { - moveX = 0; - moveZ = 0; - } - targetWorld = DimensionManager.getWorld(WarpDriveConfig.G_SPACE_DIMENSION_ID); - } else if (fromSpace) { - if (!overworld.isValidFromSpace(new Vector3(this))) {// invalid transition, cancel transition - LocalProfiler.stop(); - String msg = "Ship is outside worldborder, unable to transition from space!"; - messageToAllPlayersOnShip(msg); - killEntity(msg); - return; - } - moveX = overworld.dimensionCenterX - overworld.spaceCenterX; - moveZ = overworld.dimensionCenterZ - overworld.spaceCenterZ; - targetWorld = DimensionManager.getWorld(0); - } else if (isHyperspaceJump && isInHyperSpace) { - targetWorld = DimensionManager.getWorld(WarpDriveConfig.G_SPACE_DIMENSION_ID); - } else if (isHyperspaceJump && isInSpace) { - targetWorld = DimensionManager.getWorld(WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID); - } else { - targetWorld = worldObj; + if (toSpace || fromHyperSpace) + { + targetWorld = DimensionManager.getWorld(WarpDrive.instance.spaceDimID); } + else if (fromSpace) + { + targetWorld = DimensionManager.getWorld(0); + } + else if (toHyperSpace) + { + targetWorld = DimensionManager.getWorld(WarpDrive.instance.hyperSpaceDimID); + } + else + { + targetWorld = this.worldObj; + } + + axisalignedbb = AxisAlignedBB.getBoundingBox(minX, minY, minZ, maxX, maxY, maxZ); // FIXME //turnOffModems(); // Calculate jump vector - if (isCoordJump) { + if (isCoordJump) + { moveX = destX - xCoord; moveZ = destZ - zCoord; moveY = destY - yCoord; - distance = 0; // FIXME: check collision in straight path, starting with getPossibleJumpDistance() ? - } else if (isHyperspaceJump) { distance = 0; - } else { - if (toSpace) { - // enter space at current altitude - moveY = 0; - } else if (fromSpace) { - // re-enter atmosphere at max altitude - moveY = 245 - maxY; - } else { + } + else if (toHyperSpace || fromHyperSpace) + { + moveX = moveY = moveZ = 0; + distance = 0; + } + else + { + if (betweenWorlds) + { + moveX = moveY = 0; + + if (fromSpace) + { + moveY = 245 - maxY; + } + + if (toSpace) + { + moveY = 0; + } + } + else + { // Do not check in long jumps - if (distance < 256) { + if (distance < 256) + { distance = getPossibleJumpDistance(); } - int movementVector[] = getVector(direction); + if (distance <= shipLength) + { + killEntity("Not enough space for jump."); + messageToAllPlayersOnShip("Not enough space for jump!"); + LocalProfiler.stop(); + return; + } + + int movementVector[] = getVector(dir); moveX = movementVector[0] * distance; moveY = movementVector[1] * distance; moveZ = movementVector[2] * distance; - if ((maxY + moveY) > 255) { + if ((maxY + moveY) > 255) + { moveY = 255 - maxY; } - if ((minY + moveY) < 5) { + if ((minY + moveY) < 5) + { moveY = 5 - minY; } } } - if (betweenWorlds) { - WarpDrive.debugPrint("" + this + " Worlds: " + worldObj.provider.getDimensionName() + " -> " + targetWorld.provider.getDimensionName()); + if (betweenWorlds) + { + System.out.println("[JE] Worlds: " + worldObj.provider.getDimensionName() + " -> " + targetWorld.provider.getDimensionName()); } - - // Validate positions aren't overlapping - if (!betweenWorlds) { - if ( Math.abs(moveX) <= (maxX - minX + 1) && Math.abs(moveY) <= (maxY - minY + 1) && Math.abs(moveZ) <= (maxZ - minZ + 1) ) { - // render fake explosions - doCollisionDamage(false); - // cancel jump - LocalProfiler.stop(); - String msg = "Not enough space for jump!"; - messageToAllPlayersOnShip(msg); - killEntity(msg); - return; + forceChunks(); + lockWorlds(); + saveEntities(axisalignedbb); + System.out.println("[JE] Saved " + entitiesOnShip.size() + " entities from ship"); + + if (!isCoordJump && !(toHyperSpace || fromHyperSpace)) + { + if (dir != -2 && dir != -1) + { + messageToAllPlayersOnShip("Jumping in direction " + dir + " degrees to distance " + distance + " blocks "); + } + else if (dir == -1) + { + messageToAllPlayersOnShip("Jumping UP to distance " + distance + " blocks "); + } + else if (dir == -2) + { + messageToAllPlayersOnShip("Jumping DOWN to distance " + distance + " blocks "); } } - - if (!forceChunks(reason)) { - String msg = reason.toString(); - killEntity(msg); - messageToAllPlayersOnShip(msg); - LocalProfiler.stop(); - return; - } -// lockWorlds(); - saveEntities(); - WarpDrive.debugPrint("" + this + " Saved " + entitiesOnShip.size() + " entities from ship"); - - if (isHyperspaceJump && isInSpace) { + else if (toHyperSpace) + { messageToAllPlayersOnShip("Entering HYPERSPACE..."); - } else if (isHyperspaceJump && isInHyperSpace) { - messageToAllPlayersOnShip("Leaving HYPERSPACE.."); - } else if (isCoordJump) { - messageToAllPlayersOnShip("Jumping to coordinates (" + destX + "; " + yCoord + "; " + destZ + ")!"); - } else { - messageToAllPlayersOnShip("Jumping " + getDirectionLabel(direction) + " by " + distance + " blocks"); + } + else if (fromHyperSpace) + { + messageToAllPlayersOnShip("Leaving HYPERSPACE"); + } + else if (isCoordJump) + { + messageToAllPlayersOnShip("Jumping by coordinates to (" + destX + "; " + yCoord + "; " + destZ + ")!"); } - // validate ship content - int shipVolume = getRealShipVolume_checkBedrock(reason); - if (shipVolume == -1) { - String msg = reason.toString(); - killEntity(msg); - messageToAllPlayersOnShip(msg); + bedrockOnShip = false; + int shipSize = getRealShipSize(); // sets bedrockOnShip + + if (bedrockOnShip) + { + killEntity("Bedrock is on the ship. Aborting."); + messageToAllPlayersOnShip("Bedrock is on the ship. Aborting."); LocalProfiler.stop(); return; } - saveShip(shipVolume); + saveShip(shipSize); this.currentIndexInShip = 0; msCounter = System.currentTimeMillis(); LocalProfiler.stop(); - WarpDrive.debugPrint("Removing TE duplicates: tileEntities in target world before jump: " + targetWorld.loadedTileEntityList.size()); + System.out.println("Removing TE duplicates. Size before jump: " + targetWorld.loadedTileEntityList.size()); } /** * Finish jump: move entities, unlock worlds and delete self */ - private void finishJump() { - WarpDrive.debugPrint("" + this + " Jump done in " + ((System.currentTimeMillis() - msCounter) / 1000F) + " seconds and " + ticks + " ticks"); + public void finishJump() + { + System.out.println("[JE] Finished. Jump took " + ((System.currentTimeMillis() - msCounter) / 1000F) + " seconds"); //FIXME TileEntity duplication workaround - WarpDrive.debugPrint("Removing TE duplicates: tileEntities in target world after jump, before cleanup: " + targetWorld.loadedTileEntityList.size()); + System.out.println("Removing TE duplicates. Size before: " + targetWorld.loadedTileEntityList.size()); LocalProfiler.start("EntityJump.removeDuplicates()"); - try { + try + { targetWorld.loadedTileEntityList = this.removeDuplicates(targetWorld.loadedTileEntityList); - } catch (Exception e) { - WarpDrive.debugPrint("TE Duplicates removing exception: " + e.getMessage()); } - FixASTurbines(); - doCollisionDamage(true); + catch (Exception e) + { + System.out.println("TE Duplicates removing exception: " + e.getMessage()); + } LocalProfiler.stop(); - WarpDrive.debugPrint("Removing TE duplicates: tileEntities in target world after jump, after cleanup: " + targetWorld.loadedTileEntityList.size()); - killEntity("Jump done"); + System.out.println("Removing TE duplicates. Size after: " + targetWorld.loadedTileEntityList.size()); + killEntity(""); } /** * Removing ship from world * */ - private void removeShip() { + public void removeShip() + { LocalProfiler.start("EntityJump.removeShip"); int blocksToMove = Math.min(BLOCKS_PER_TICK, ship.length - currentIndexInShip); - WarpDrive.debugPrint("" + this + " Removing ship blocks " + currentIndexInShip + " to " + (currentIndexInShip + blocksToMove - 1) + " / " + (ship.length - 1)); + System.out.println("[JE] Removing ship part: " + currentIndexInShip + "/" + ship.length + " [btm: " + blocksToMove + "]"); TileEntity te; Class c; - for (int index = 0; index < blocksToMove; index++) { - if (currentIndexInShip >= ship.length) { + for (int index = 0; index < blocksToMove; index++) + { + if (currentIndexInShip >= ship.length) break; - } - JumpBlock jb = ship[ship.length - currentIndexInShip - 1]; - if (jb == null) { - WarpDrive.debugPrint("" + this + " Removing ship part: unexpected null found at ship[" + currentIndexInShip + "]"); - currentIndexInShip++; - continue; - } - - if (jb.blockTileEntity != null) { - // WarpDrive.debugPrint("Removing tile entity at " + jb.x + ", " + jb.y + ", " + jb.z); + JumpBlock jb = ship[currentIndexInShip]; + if (jb != null && jb.blockTileEntity != null) worldObj.removeBlockTileEntity(jb.x, jb.y, jb.z); - } - worldObj.setBlock(jb.x, jb.y, jb.z, 0, 0, 2); - - te = targetWorld.getBlockTileEntity(jb.x + moveX, jb.y + moveY, jb.z + moveZ); - if (te != null) { + te = worldObj.getBlockTileEntity(jb.x + moveX, jb.y + moveY, jb.z + moveZ); + if (te != null) + { c = te.getClass(); - if (c.getName().equals("atomicscience.jiqi.TTurbine")) { + if (c.getName().equals("atomicscience.jiqi.TTurbine")) try { if (c.getField("shiDa").getBoolean(te)) @@ -524,36 +508,27 @@ public class EntityJump extends Entity { e.printStackTrace(); } - } else if (te instanceof TileEntityReactor) { - WarpDrive.instance.warpCores.removeFromRegistry((TileEntityReactor)te); - } - c = c.getSuperclass(); - if (c.getName().equals("ic2.core.block.wiring.TileEntityElectricBlock") || c.getName().equals("ic2.core.block.TileEntityBlock") || c.getName().contains("ic2.core.block.generator")) { + if (c.getName().equals("ic2.core.block.wiring.TileEntityElectricBlock") || c.getName().equals("ic2.core.block.TileEntityBlock") || c.getName().contains("ic2.core.block.generator")) + { try { Method method; - method = c.getDeclaredMethod("onUnloaded", (Class[])null); - method.invoke(te, (Object[])null); - method = c.getDeclaredMethod("onLoaded", (Class[])null); - method.invoke(te, (Class)null); - } - catch (Exception e) - { - e.printStackTrace(); + method = c.getDeclaredMethod("onUnloaded", null); + method.invoke(te, null); + method = c.getDeclaredMethod("onLoaded", null); + method.invoke(te, null); } + catch (Exception e) {} te.updateContainingBlockInfo(); try { NetworkHelper.updateTileEntityField(te, "facing"); } - catch (Exception e) - { - e.printStackTrace(); - } + catch (Exception e) {} } } - + worldObj.setBlockToAir(jb.x, jb.y, jb.z); currentIndexInShip++; } LocalProfiler.stop(); @@ -564,12 +539,14 @@ public class EntityJump extends Entity * * @param shipSize */ - private void saveShip(int shipSize) { + public void saveShip(int shipSize) + { LocalProfiler.start("EntityJump.saveShip"); ship = new JumpBlock[shipSize]; - if (ship == null) { - killEntity("Unable to allocate memory (ship is null!)"); + if (ship == null) + { + killEntity("ship is null!"); LocalProfiler.stop(); return; } @@ -599,7 +576,7 @@ public class EntityJump extends Entity int blockID = worldObj.getBlockId(x, y, z); // Skip air blocks - if (worldObj.isAirBlock(x, y, z) && (blockID != WarpDriveConfig.airID)) + if (blockID == 0 || blockID == WarpDriveConfig.i.gasID) { continue; } @@ -607,11 +584,6 @@ public class EntityJump extends Entity int blockMeta = worldObj.getBlockMetadata(x, y, z); TileEntity tileentity = worldObj.getBlockTileEntity(x, y, z); ship[index] = new JumpBlock(blockID, blockMeta, tileentity, x, y, z); - if (ship[index] == null) - { - WarpDrive.debugPrint("" + this + " Unable to allocate memory (ship[" + index + "] is null!)"); - } - index++; } } @@ -619,20 +591,23 @@ public class EntityJump extends Entity } } - WarpDrive.debugPrint("" + this + " Ship saved as " + ship.length + " blocks"); + System.out.println((new StringBuilder()).append("[JUMP] Ship saved: ").append((new StringBuilder()).append(ship.length).append(" blocks")).toString()); LocalProfiler.stop(); } /** *Ship moving */ - private void moveShip() { + public void moveShip() + { LocalProfiler.start("EntityJump.moveShip"); int blocksToMove = Math.min(BLOCKS_PER_TICK, ship.length - currentIndexInShip); - WarpDrive.debugPrint("" + this + " Moving ship blocks " + currentIndexInShip + " to " + (currentIndexInShip + blocksToMove - 1) + " / " + (ship.length - 1)); + System.out.println("[JE] Moving ship part: " + currentIndexInShip + "/" + ship.length + " [btm: " + blocksToMove + "]"); - for (int index = 0; index < blocksToMove; index++) { - if (currentIndexInShip >= ship.length) { + for (int index = 0; index < blocksToMove; index++) + { + if (currentIndexInShip >= ship.length) + { break; } @@ -648,199 +623,80 @@ public class EntityJump extends Entity * * @return possible jump distance or -1 */ - private int getPossibleJumpDistance() { - WarpDrive.debugPrint("" + this + " Calculating possible jump distance..."); + public int getPossibleJumpDistance() + { + System.out.println("[JUMP] Calculating possible jump distance..."); int testDistance = this.distance; int blowPoints = 0; - collisionDetected = false; - - CheckMovementResult result = null; - while (testDistance >= 0) { - // Is there enough space in destination point? - result = checkMovement(testDistance, false); - if (result == null) { + while (testDistance >= 0) + { + // Is there enough space in destination point? + boolean canJump = checkMovement(testDistance); + + if (canJump) + { break; } - - if (result.isCollision) { - blowPoints++; - } + + blowPoints++; testDistance--; } - - if (distance != testDistance) { - WarpDrive.debugPrint("" + this + " Jump distance adjusted to " + testDistance + " after " + blowPoints + " collisions"); - } - // Register explosion(s) at collision point - if (blowPoints > WarpDriveConfig.WC_COLLISION_TOLERANCE_BLOCKS) { - result = checkMovement(Math.max(1, testDistance + 1), true); - if (result != null) { - /* - * Strength scaling: - * Creeper = 3 or 6 - * Wither skull = 1 - * Wither boom = 5 - * Endercrystal = 6 - * TNTcart = 4 to 11.5 - * TNT = 4 - */ - float massCorrection = 0.5F + (float)Math.sqrt( - Math.min(1.0D, Math.max(0.0D, reactor.shipVolume - WarpDriveConfig.WC_MAX_SHIP_VOLUME_ON_SURFACE) / WarpDriveConfig.WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE)); - collisionDetected = true; - collisionStrength = (4.0F + blowPoints - WarpDriveConfig.WC_COLLISION_TOLERANCE_BLOCKS) * massCorrection; - collisionAtSource = result.atSource; - collisionAtTarget = result.atTarget; - WarpDrive.debugPrint("" + this + " Reporting " + collisionAtTarget.size() + " collisions coordinates " - + blowPoints + " blowPoints with massCorrection of " + String.format("%.2f", massCorrection) + " => strength " + String.format("%.2f", collisionStrength) ); - } else { - System.out.println("WarpDrive error: unable to compute collision points, ignoring..."); - } + // Make an explosion in collision point + if (blowPoints > 5 && (this.dir != -1 && this.dir != -2)) + { + messageToAllPlayersOnShip(" [COLLISION] at (" + blowX + "; " + blowY + "; " + blowZ + ")"); + worldObj.createExplosion((Entity) null, blowX, blowY, blowZ, Math.min(4F * 30, 4F * (distance / 2)), true); } return testDistance; } - - private void doCollisionDamage(boolean atTarget) { - if (!collisionDetected) { - WarpDrive.debugPrint("" + this + " doCollisionDamage No collision detected..."); - return; - } - ArrayList collisionPoints = atTarget ? collisionAtTarget : collisionAtSource; - Vector3 min = collisionPoints.get(0); - Vector3 max = collisionPoints.get(0); - for (Vector3 v : collisionPoints) { - if (min.x > v.x) { - min.x = v.x; - } else if (max.x < v.x) { - max.x = v.x; - } - if (min.y > v.y) { - min.y = v.y; - } else if (max.y < v.y) { - max.y = v.y; - } - if (min.z > v.z) { - min.z = v.z; - } else if (max.z < v.z) { - max.z = v.z; - } - } - - // inform players on board - double rx = Math.round(min.x + worldObj.rand.nextInt( Math.max(1, (int) (max.x - min.x)) )); - double ry = Math.round(min.y + worldObj.rand.nextInt( Math.max(1, (int) (max.y - min.y)) )); - double rz = Math.round(min.z + worldObj.rand.nextInt( Math.max(1, (int) (max.z - min.z)) )); -// WarpDrive.debugPrint("doCollisionDamage msg " + rx + ", " + ry + ", " + rz + " atTarget " + atTarget + " min " + min + " max " + max); - messageToAllPlayersOnShip("Ship collision detected around " + (int)rx + ", " + (int)ry + ", " + (int)rz + ". Damage report pending..."); - - // randomize if too many collision points - int nbExplosions = Math.min(5, collisionPoints.size()); - WarpDrive.debugPrint("doCollisionDamage nbExplosions " + nbExplosions + "/" + collisionPoints.size()); - for (int i = 0; i < nbExplosions; i++) { - // get location - Vector3 current; - if (nbExplosions < collisionPoints.size()) { - WarpDrive.debugPrint("doCollisionDamage random #" + i); - current = collisionPoints.get(worldObj.rand.nextInt(collisionPoints.size())); - } else { - WarpDrive.debugPrint("doCollisionDamage get " + i); - current = collisionPoints.get(i); - } - - // compute explosion strength with a jitter, at least 1 TNT - float strength = Math.max(4.0F, collisionStrength / nbExplosions - 2.0F + 2.0F * worldObj.rand.nextFloat()); - - (atTarget ? targetWorld : worldObj).newExplosion((Entity) null, current.x, current.y, current.z, strength, atTarget, atTarget); - WarpDrive.debugPrint("doCollisionDamage explosion at " + current.x + ", " + current.y + ", " + current.z + " with strength " + strength); - } - } - private int getRealShipVolume_checkBedrock(StringBuilder reason) { - LocalProfiler.start("EntityJump.getRealShipVolume_checkBedrock"); - int shipVolume = 0; - - for (int x = minX; x <= maxX; x++) { - for (int z = minZ; z <= maxZ; z++) { - for (int y = minY; y <= maxY; y++) { - int blockID = worldObj.getBlockId(x, y, z); - - // Skipping vanilla air & WarpDrive gas blocks, keep WarpDrive air block - if (worldObj.isAirBlock(x, y, z) && (blockID != WarpDriveConfig.airID)) {// whitelist - continue; - } - - shipVolume++; - - /* - Item item = Item.itemsList[blockID]; - if (item == null) - WarpDrive.debugPrint("Block(" + x + ", " + y + ", " + z + ") is undefined#" + blockID + ":" + worldObj.getBlockMetadata(x, y, z)); - else - WarpDrive.debugPrint("Block(" + x + ", " + y + ", " + z + ") is " + item.getUnlocalizedName() + ":" + worldObj.getBlockMetadata(x, y, z)); - /**/ - - if ((blockID == Block.bedrock.blockID) || (blockID == 2702)) {// Blacklist - reason.append("Bedrock detected onboard at " + x + ", " + y + ", " + z + ". Aborting."); - LocalProfiler.stop(); - return -1; - } - } - } - } - - // Lem: abort jump if blocks with TE are connecting to the ship (avoid crash when splitting multi-blocks) - for (int x = minX - 1; x <= maxX + 1; x++) { - boolean xBorder = (x == minX - 1) || (x == maxX + 1); - for (int z = minZ - 1; z <= maxZ + 1; z++) { - boolean zBorder = (z == minZ - 1) || (z == maxZ + 1); - for (int y = minY - 1; y <= maxY + 1; y++) { - boolean yBorder = (y == minY - 1) || (y == maxY + 1); - if ((y < 0) || (y > 255)) - continue; - if (!(xBorder || yBorder || zBorder)) - continue; + public int getRealShipSize() + { + LocalProfiler.start("EntityJump.getRealShipSize"); + int shipSize = 0; + for (int x = minX; x <= maxX; x++) + { + for (int z = minZ; z <= maxZ; z++) + { + for (int y = minY; y <= maxY; y++) + { int blockID = worldObj.getBlockId(x, y, z); // Skipping air blocks - if (worldObj.isAirBlock(x, y, z)) { + if (blockID == 0 || blockID == WarpDriveConfig.i.gasID) + { continue; } - // Skipping unmovable blocks - if ((blockID == Block.bedrock.blockID) || (blockID == 2702)) {// Blacklist - continue; + shipSize++; + + if (blockID == Block.bedrock.blockID) + { + bedrockOnShip = true; + LocalProfiler.stop(); + return shipSize; } - - TileEntity te = worldObj.getBlockTileEntity(x, y, z); - if (te == null) { - continue; - } - - reason.append("Ship snagged at " + x + ", " + y + ", " + z + ". Damage report pending..."); - worldObj.createExplosion((Entity) null, x, y, z, Math.min(4F * 30, 4F * (shipVolume / 50)), false); - LocalProfiler.stop(); - return -1; } } } LocalProfiler.stop(); - return shipVolume; + return shipSize; } - - private void saveEntities() { + public void saveEntities(AxisAlignedBB axisalignedbb) + { entitiesOnShip = new ArrayList(); - - AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(minX, minY, minZ, maxX + 0.99D, maxY + 0.99D, maxZ + 0.99D); - List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); - - for (Object o : list) { - if (o == null || !(o instanceof Entity) || (o instanceof EntityJump)) { + + for (Object o : list) + { + if (o == null || !(o instanceof Entity) || (o instanceof EntityJump)) + { continue; } @@ -849,17 +705,19 @@ public class EntityJump extends Entity entitiesOnShip.add(movingEntity); } } - - private boolean moveEntities(boolean restorePositions) { - WarpDrive.debugPrint("" + this + " Moving entities"); - LocalProfiler.start("EntityJump.moveEntities"); + public boolean moveEntities(boolean restorePositions) + { + System.out.println("[JE] Moving entities"); - if (entitiesOnShip != null) { - for (MovingEntity me : entitiesOnShip) { + if (entitiesOnShip != null) + { + for (MovingEntity me : entitiesOnShip) + { Entity entity = me.entity; - if (entity == null) { + if (entity == null) + { continue; } @@ -870,43 +728,48 @@ public class EntityJump extends Entity double newEntityY; double newEntityZ; - if (restorePositions) { + if (restorePositions) + { newEntityX = oldEntityX; newEntityY = oldEntityY; newEntityZ = oldEntityZ; - } else { + } + else + { newEntityX = oldEntityX + moveX; newEntityY = oldEntityY + moveY; newEntityZ = oldEntityZ + moveZ; } - //WarpDrive.debugPrint("Entity moving: old (" + oldEntityX + " " + oldEntityY + " " + oldEntityZ + ") -> new (" + newEntityX + " " + newEntityY + " " + newEntityZ); + //System.out.println("Entity moving: old (" + oldEntityX + " " + oldEntityY + " " + oldEntityZ + ") -> new (" + newEntityX + " " + newEntityY + " " + newEntityZ); // Travel to another dimension if needed - if (betweenWorlds && !restorePositions) { + if (betweenWorlds && !restorePositions) + { MinecraftServer server = MinecraftServer.getServer(); WorldServer from = server.worldServerForDimension(worldObj.provider.dimensionId); WorldServer to = server.worldServerForDimension(targetWorld.provider.dimensionId); SpaceTeleporter teleporter = new SpaceTeleporter(to, 0, MathHelper.floor_double(newEntityX), MathHelper.floor_double(newEntityY), MathHelper.floor_double(newEntityZ)); - if (entity instanceof EntityPlayerMP) { + if (entity instanceof EntityPlayerMP) + { EntityPlayerMP player = (EntityPlayerMP) entity; server.getConfigurationManager().transferPlayerToDimension(player, targetWorld.provider.dimensionId, teleporter); - } else { + } + else + { server.getConfigurationManager().transferEntityToWorld(entity, worldObj.provider.dimensionId, from, to, teleporter); } } // Update position - if (entity instanceof EntityPlayerMP) { + if (entity instanceof EntityPlayerMP) + { EntityPlayerMP player = (EntityPlayerMP) entity; + ChunkCoordinates bedLocation = player.getBedLocation(); - ChunkCoordinates bedLocation = player.getBedLocation(player.worldObj.provider.dimensionId); - - if (bedLocation != null - && minX <= bedLocation.posX && maxX >= bedLocation.posX - && minY <= bedLocation.posY && maxY >= bedLocation.posY - && minZ <= bedLocation.posZ && maxZ >= bedLocation.posZ) { + if (bedLocation != null && testBB(axisalignedbb, bedLocation.posX, bedLocation.posY, bedLocation.posZ)) + { bedLocation.posX = bedLocation.posX + moveX; bedLocation.posY = bedLocation.posY + moveY; bedLocation.posZ = bedLocation.posZ + moveZ; @@ -914,17 +777,21 @@ public class EntityJump extends Entity } player.setPositionAndUpdate(newEntityX, newEntityY, newEntityZ); - } else { + } + else + { entity.setPosition(newEntityX, newEntityY, newEntityZ); } } } - LocalProfiler.stop(); return true; } - + public boolean testBB(AxisAlignedBB axisalignedbb, int x, int y, int z) + { + return axisalignedbb.minX <= (double) x && axisalignedbb.maxX >= (double) x && axisalignedbb.minY <= (double) y && axisalignedbb.maxY >= (double) y && axisalignedbb.minZ <= (double) z && axisalignedbb.maxZ >= (double) z; + } public int[] getVector(int i) { @@ -966,92 +833,76 @@ public class EntityJump extends Entity return v; } - class CheckMovementResult { - public ArrayList atSource; - public ArrayList atTarget; - public boolean isCollision = false; - public String reason = ""; - - CheckMovementResult() { - this.atSource = new ArrayList(1); - this.atTarget = new ArrayList(1); - this.isCollision = false; - this.reason = "Unknown reason"; - } - - public void add(double sx, double sy, double sz, double tx, double ty, double tz, boolean pisCollision, String preason) { - atSource.add(new Vector3(sx, sy, sz)); - atTarget.add(new Vector3(tx, ty, tz)); - isCollision = isCollision || pisCollision; - reason = preason; - WarpDrive.debugPrint("CheckMovementResult " + sx + ", " + sy + ", " + sz + " -> " + tx + ", " + ty + ", " + tz + " " + isCollision + " '" + reason + "'"); - } - }; - private CheckMovementResult checkMovement(int testDistance, boolean fullCollisionDetails) { - CheckMovementResult result = new CheckMovementResult(); - if ((direction == -1 && maxY + testDistance > 255) && !betweenWorlds) { - result.add(xCoord, maxY + testDistance, zCoord, xCoord + 0.5D, maxY + testDistance + 1.0D, zCoord + 0.5D, - false, "Reactor will blow due +high limit"); - return result; + public boolean checkMovement(int testDistance) + { + if ((dir == -1 && maxY + testDistance > 255) && !toSpace) + { + System.out.println("[JUMP] Reactor will blow due +high limit"); + return false; } - if ((direction == -2 && minY - testDistance <= 8) && !betweenWorlds) { - result.add(xCoord, minY - testDistance, zCoord, xCoord + 0.5D, maxY - testDistance, zCoord + 0.5D, - false, "Reactor will blow due -low limit"); - return result; + if ((dir == -2 && minY - testDistance <= 8) && !fromSpace) + { + blowY = minY - testDistance; + blowX = xCoord; + blowZ = zCoord; + System.out.println("[JUMP] Reactor will blow due -low limit"); + return false; } - int movementVector[] = getVector(direction); - int lmoveX = movementVector[0] * testDistance; - int lmoveY = movementVector[1] * testDistance; - int lmoveZ = movementVector[2] * testDistance; - - int x, y, z, newX, newY, newZ, blockOnShipID, blockID; - for (y = minY; y <= maxY; y++) { - newY = y + lmoveY; - for (x = minX; x <= maxX; x++) { - newX = x + lmoveX; - for (z = minZ; z <= maxZ; z++) { - newZ = z + lmoveZ; + int movementVector[] = getVector(dir); + // TODO: Disasm, plz fix it. Local variable hiding class global field + int moveX = movementVector[0] * testDistance; + int moveY = movementVector[1] * testDistance; + int moveZ = movementVector[2] * testDistance; - blockID = worldObj.getBlockId(newX, newY, newZ); - if ((blockID == Block.bedrock.blockID) || (blockID == 2702)) {// Blacklist - result.add(x, y, z, - newX + 0.5D - movementVector[0] * 1.0D, - newY + 0.5D - movementVector[1] * 1.0D, - newZ + 0.5D - movementVector[2] * 1.0D, - true, "Unpassable block " + blockID + " detected at destination (" + newX + ";" + newY + ";" + newZ + ")"); - if (!fullCollisionDetails) { - return result; - } + for (int y = minY; y <= maxY; y++) + { + for (int x = minX; x <= maxX; x++) + { + for (int z = minZ; z <= maxZ; z++) + { + int newX = x + moveX; + int newY = y + moveY; + int newZ = z + moveZ; + + if (isBlockInShip(newX, newY, newZ)) + { + continue; } - blockOnShipID = worldObj.getBlockId(x, y, z); - if (blockOnShipID != 0 && blockID != 0 && blockID != WarpDriveConfig.airID && blockID != WarpDriveConfig.gasID && blockID != 18) { - result.add(x, y, z, - newX + 0.5D + movementVector[0] * 0.1D, - newY + 0.5D + movementVector[1] * 0.1D, - newZ + 0.5D + movementVector[2] * 0.1D, - true, "Obstacle block #" + blockID + " detected at (" + newX + ", " + newY + ", " + newZ + ")"); - if (!fullCollisionDetails) { - return result; - } + int blockID = worldObj.getBlockId(newX, newY, newZ); + int blockOnShipID = worldObj.getBlockId(x, y, z); + + if (blockOnShipID == Block.bedrock.blockID) + { + return false; + } + + if (blockOnShipID != 0 && blockID != 0 && blockID != WarpDriveConfig.i.airID && blockID != WarpDriveConfig.i.gasID && blockID != 18) + { + blowX = x; + blowY = y; + blowZ = z; + System.out.println((new StringBuilder()).append("[JUMP] Reactor will blow due BlockID ").append((new StringBuilder()).append(blockID).append(" at (").append(newX).append(";").append(newY).append(";").append(newZ).append(")").toString()).toString()); + return false; } } } } - if (fullCollisionDetails && result.isCollision) { - return result; - } else { - return null; - } + return true; } -/* + + public boolean isBlockInShip(int x, int y, int z) + { + return x >= minX && x <= maxX && y >= minY && y <= maxY && z >= minZ && z <= maxZ; + } + private void turnOffModem(IPeripheral p) { // FIXME - if (p.getType() == "modem") { + /*if (p.getType() == "modem") { String[] methods = p.getMethodNames(); for(int i = 0; i < methods.length; i++) { if (methods[i] == "closeAll") { @@ -1063,17 +914,17 @@ public class EntityJump extends Entity return; } } - } + }*/ } private void turnOffModems() { // FIXME - for (int x = minX; x <= maxX; x++) { + /*for (int x = minX; x <= maxX; x++) { for (int z = minZ; z <= maxZ; z++) { for (int y = minY; y <= maxY; y++) { int blockID = worldObj.getBlockId(x, y, z); - if (blockID == 0 || blockID == WarpDriveConfig.airID || blockID == WarpDriveConfig.gasID) { + if (blockID == 0 || blockID == WarpDriveConfig.i.airID || blockID == WarpDriveConfig.i.gasID) { continue; } @@ -1093,16 +944,17 @@ public class EntityJump extends Entity } } } - } - }/**/ + }*/ + } - private boolean moveBlockSimple(int indexInShip) + public boolean moveBlockSimple(int indexInShip) { try { JumpBlock shipBlock = ship[indexInShip]; - if (shipBlock == null) { + if (shipBlock == null) + { return false; } @@ -1117,42 +969,29 @@ public class EntityJump extends Entity mySetBlock(targetWorld, newX, newY, newZ, blockID, blockMeta, 2); // Re-schedule air blocks update - if (blockID == WarpDriveConfig.airID) { + if (blockID == WarpDriveConfig.i.airID) + { targetWorld.markBlockForUpdate(newX, newY, newZ); targetWorld.scheduleBlockUpdate(newX, newY, newZ, blockID, 40 + targetWorld.rand.nextInt(20)); } NBTTagCompound oldnbt = new NBTTagCompound(); - boolean unlockToValidate = false; - // 145 Anvil, 146 Trapped chest, 149 inactive redstone comparator, 156 Quartz stair, 159 Stained clay + if (shipBlock.blockTileEntity != null && blockID != 159 && blockID != 149 && blockID != 156 && blockID != 146 && blockID != 145) { shipBlock.blockTileEntity.writeToNBT(oldnbt); oldnbt.setInteger("x", newX); oldnbt.setInteger("y", newY); oldnbt.setInteger("z", newZ); - - if (oldnbt.hasKey("mainX") && oldnbt.hasKey("mainY") && oldnbt.hasKey("mainZ")) // Mekanism 6.0.4.44 - { - WarpDrive.debugPrint("[JUMP] moveBlockSimple: TileEntity from Mekanism detected"); - oldnbt.setInteger("mainX", oldnbt.getInteger("mainX") + moveX); - oldnbt.setInteger("mainY", oldnbt.getInteger("mainY") + moveY); - oldnbt.setInteger("mainZ", oldnbt.getInteger("mainZ") + moveZ); - unlockToValidate = true; - } else if (oldnbt.hasKey("id") && oldnbt.getString("id") == "savedMultipart") - { - WarpDrive.debugPrint("[JUMP] moveBlockSimple: TileEntity from Forge multipart detected at " + oldX + ", " + oldY + ", " + oldZ); - unlockToValidate = true; - } else { -// WarpDrive.debugPrint("[JUMP] moveBlockSimple: TileEntity from other detected"); - } TileEntity newTileEntity = null; - if (blockID == WarpDriveConfig.CC_Computer || blockID == WarpDriveConfig.CC_peripheral || blockID == WarpDriveConfig.CCT_Turtle || blockID == WarpDriveConfig.CCT_Upgraded || blockID == WarpDriveConfig.CCT_Advanced) + if (blockID == WarpDriveConfig.i.CC_Computer || blockID == WarpDriveConfig.i.CC_peripheral || blockID == WarpDriveConfig.i.CCT_Turtle || blockID == WarpDriveConfig.i.CCT_Upgraded || blockID == WarpDriveConfig.i.CCT_Advanced) { newTileEntity = TileEntity.createAndLoadEntity(oldnbt); newTileEntity.invalidate(); } - else if (blockID == WarpDriveConfig.AS_Turbine) + else if (blockID == WarpDriveConfig.i.GT_Machine) + newTileEntity = TileEntity.createAndLoadEntity(oldnbt); + else if (blockID == WarpDriveConfig.i.AS_Turbine) { if (oldnbt.hasKey("zhuYao")) { @@ -1164,22 +1003,19 @@ public class EntityJump extends Entity } newTileEntity = TileEntity.createAndLoadEntity(oldnbt); } - - if (newTileEntity == null) - newTileEntity = TileEntity.createAndLoadEntity(oldnbt); - - newTileEntity.worldObj = targetWorld; - if (unlockToValidate) - { -// targetWorld.isRemote = false; - newTileEntity.validate(); -// targetWorld.isRemote = true; - } else { - newTileEntity.validate(); + newTileEntity = targetWorld.getBlockTileEntity(newX, newY, newZ); + if (newTileEntity == null) + { + System.out.println("[EJ] Error moving tileEntity! TE is null"); + return false; + } + newTileEntity.invalidate(); + newTileEntity.readFromNBT(oldnbt); } - + newTileEntity.worldObj = targetWorld; + newTileEntity.validate(); worldObj.removeBlockTileEntity(oldX, oldY, oldZ); targetWorld.setBlockTileEntity(newX, newY, newZ, newTileEntity); } @@ -1187,14 +1023,13 @@ public class EntityJump extends Entity catch (Exception exception) { exception.printStackTrace(); - WarpDrive.debugPrint("[JUMP] moveBlockSimple exception Idx " + indexInShip); return false; } return true; } - private static ArrayList removeDuplicates(List l) + public ArrayList removeDuplicates(List l) { Set s = new TreeSet(new Comparator() { @@ -1203,7 +1038,7 @@ public class EntityJump extends Entity { if (o1.xCoord == o2.xCoord && o1.yCoord == o2.yCoord && o1.zCoord == o2.zCoord) { - WarpDrive.debugPrint("Removed duplicated TE: " + o1 + ", " + o2); + System.out.println("Removed duplicated TE: " + o1 + ", " + o2); return 0; } else @@ -1219,23 +1054,23 @@ public class EntityJump extends Entity @Override protected void readEntityFromNBT(NBTTagCompound nbttagcompound) { - //WarpDrive.debugPrint("" + this + " readEntityFromNBT()"); + //System.out.println("[JE@"+this+"] readEntityFromNBT()"); } @Override protected void entityInit() { - //WarpDrive.debugPrint("" + this + " entityInit()"); + //System.out.println("[JE@"+this+"] entityInit()"); } @Override protected void writeEntityToNBT(NBTTagCompound var1) { - //WarpDrive.debugPrint("" + this + " writeEntityToNBT()"); + //System.out.println("[JE@"+this+"] writeEntityToNBT()"); } // Own implementation of setting blocks without light recalculation in optimization purposes - private boolean mySetBlock(World w, int x, int y, int z, int blockId, int blockMeta, int par6) + public boolean mySetBlock(World w, int x, int y, int z, int blockId, int blockMeta, int par6) { if (x >= -30000000 && z >= -30000000 && x < 30000000 && z < 30000000) { @@ -1260,7 +1095,7 @@ public class EntityJump extends Entity } } - private boolean myChunkSBIDWMT(Chunk c, int x, int y, int z, int blockId, int blockMeta) + public boolean myChunkSBIDWMT(Chunk c, int x, int y, int z, int blockId, int blockMeta) { int j1 = z << 4 | x; @@ -1376,33 +1211,13 @@ public class EntityJump extends Entity try { c = t.getClass(); - Method method = c.getDeclaredMethod("bianDa", (Class[])null); - method.invoke(t, (Object[])null); - method.invoke(t, (Object[])null); + Method method = c.getDeclaredMethod("bianDa", null); + method.invoke(t, null); + method.invoke(t, null); } catch (Exception e) { e.printStackTrace(); } } - - public void setMinMaxes(int minXV,int maxXV,int minYV,int maxYV,int minZV,int maxZV) - { - minX = minXV; - maxX = maxXV; - minY = minYV; - maxY = maxYV; - minZ = minZV; - maxZ = maxZV; - } - - @Override - public String toString() { - return String.format("%s/%d \'%s\' @ \'%s\' %.2f, %.2f, %.2f", new Object[] { - getClass().getSimpleName(), - Integer.valueOf(entityId), - reactor == null ? "~NULL~" : reactor.coreFrequency, - worldObj == null ? "~NULL~" : worldObj.getWorldInfo().getWorldName(), - Double.valueOf(posX), Double.valueOf(posY), Double.valueOf(posZ)}); - } } \ No newline at end of file diff --git a/src/cr0s/WarpDrive/EntitySphereGen.java b/src/cr0s/WarpDrive/EntitySphereGen.java index 51127987..6c88825d 100644 --- a/src/cr0s/WarpDrive/EntitySphereGen.java +++ b/src/cr0s/WarpDrive/EntitySphereGen.java @@ -1,8 +1,13 @@ package cr0s.WarpDrive; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.ArrayList; +import java.util.List; +import java.util.Random; import net.minecraft.block.Block; import net.minecraft.entity.Entity; @@ -11,35 +16,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; -/* -2014-06-07 21:41:45 [Infos] [STDOUT] Generating star (class 0) at -579 257 1162 -2014-06-07 21:41:45 [Infos] [Minecraft-Client] [CHAT] /generate: generating star at -579, 257, 1162 -2014-06-07 21:41:45 [Infos] [STDOUT] [ESG] Saving blocks... -2014-06-07 21:41:45 [Infos] [STDOUT] [ESG] Saved 310248 blocks -2014-06-07 21:41:45 [Infos] [STDOUT] [PROF] {EntitySphereGen.saveSphereBlocks} self: 95.646ms, total: 95.646ms -2014-06-07 21:41:45 [Infos] [STDOUT] [ESG] Saving blocks... -2014-06-07 21:41:45 [Infos] [STDOUT] [ESG] Saved 23706 blocks -2014-06-07 21:41:45 [Infos] [STDOUT] [PROF] {EntitySphereGen.saveSphereBlocks} self: 15.427ms, total: 15.427ms -2014-06-07 21:42:03 [Infos] [STDOUT] Generating star (class 1) at -554 257 1045 -2014-06-07 21:42:03 [Infos] [Minecraft-Client] [CHAT] /generate: generating star at -554, 257, 1045 -2014-06-07 21:42:03 [Infos] [STDOUT] [ESG] Saving blocks... -2014-06-07 21:42:03 [Infos] [STDOUT] [ESG] Saved 1099136 blocks -2014-06-07 21:42:03 [Infos] [STDOUT] [PROF] {EntitySphereGen.saveSphereBlocks} self: 37.404ms, total: 37.404ms -2014-06-07 21:42:03 [Infos] [STDOUT] [ESG] Saving blocks... -2014-06-07 21:42:03 [Infos] [STDOUT] [ESG] Saved 50646 blocks -2014-06-07 21:42:03 [Infos] [STDOUT] [PROF] {EntitySphereGen.saveSphereBlocks} self: 34.369ms, total: 34.369ms - -2014-06-07 21:42:39 [Infos] [STDOUT] Generating star (class 2) at -404 257 978 -2014-06-07 21:42:39 [Infos] [Minecraft-Client] [CHAT] /generate: generating star at -404, 257, 978 -2014-06-07 21:42:39 [Infos] [STDOUT] [ESG] Saving blocks... -2014-06-07 21:42:39 [Infos] [STDOUT] [ESG] Saved 2144432 blocks -2014-06-07 21:42:39 [Infos] [STDOUT] [PROF] {EntitySphereGen.saveSphereBlocks} self: 85.523ms, total: 85.523ms -2014-06-07 21:42:39 [Infos] [STDOUT] [ESG] Saving blocks... -2014-06-07 21:42:40 [Infos] [STDOUT] [ESG] Saved 76699 blocks -2014-06-07 21:42:40 [Infos] [STDOUT] [PROF] {EntitySphereGen.saveSphereBlocks} self: 9.286ms, total: 9.286ms - - */ public final class EntitySphereGen extends Entity { public int xCoord; @@ -47,76 +24,77 @@ public final class EntitySphereGen extends Entity public int zCoord; private int radius; - private int[] defaultBlock; + private int[] block; + public int[] defaultBlock; private boolean hollow; - private boolean fillingSphere; // new sphere blocks does not replace existing blocks (for gases & moons) - private boolean generateOres; // generate random surface blocks (ores) or fixed blockID - private int gasColor; + private boolean fillingSphere; // new sphere blocks does not replace existing blocks (for gases) + private boolean surfaceSphere; // generate random surface blocks or fixed blockID - private final int BLOCKS_PER_TICK = 5000; + private final int BLOCKS_PER_TICK = 10000; private final int STATE_SAVING = 0; private final int STATE_SETUP = 1; - private final int STATE_DELETE = 2; - private final int STATE_STOP = 3; + private final int STATE_STOP = 2; + private final int STATE_DELETE = 3; private int state = STATE_DELETE; - private int ticksDelay = 0; private int currentIndex = 0; - private int pregenSize = 0; private ArrayList blocks; - public EntitySphereGen(World world) { + public EntitySphereGen(World world) + { super(world); +System.out.println("ZLO EntitySphereGen THE FUCK create"); } - public EntitySphereGen(World world, int x, int y, int z, int radius, int blockID, int blockMeta, boolean hollow, boolean fillingSphere, boolean generateOres) { + public EntitySphereGen(World world, int x, int y, int z, int radius, int blockID, int blockMeta, boolean hollow, boolean fillingSphere) + { super(world); this.xCoord = x; - this.posX = x; + this.posX = (double) x; this.yCoord = y; - this.posY = y; + this.posY = (double) y; this.zCoord = z; - this.posZ = z; + this.posZ = (double) z; this.radius = radius; this.hollow = hollow; this.fillingSphere = fillingSphere; - this.generateOres = generateOres; - this.gasColor = worldObj.rand.nextInt(12); + this.surfaceSphere = (blockID == 0); this.state = STATE_SAVING; - this.pregenSize = (int)Math.ceil(Math.PI * 4.0F / 3.0F * Math.pow(radius + 1, 3)); - blocks = new ArrayList(this.pregenSize); - this.defaultBlock = new int[] {blockID, blockMeta}; - this.ticksDelay = world.rand.nextInt(60); + blocks = new ArrayList(); + if (surfaceSphere) + defaultBlock = WarpDriveConfig.i.getDefaultSurfaceBlock(world.rand, world.rand.nextInt(10) > 8, true); + else + this.block = new int[] {blockID, blockMeta}; } - public void killEntity() { + public void killEntity() + { this.state = STATE_STOP; worldObj.removeEntity(this); } @Override - public void onUpdate() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { + public void onUpdate() + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { return; } - - if (ticksDelay > 0) { - ticksDelay--; - return; - } - - switch (this.state) { + + switch (this.state) + { case STATE_SAVING: - tickScheduleBlocks(); + System.out.println("[ESG] Saving blocks..."); + saveSphereBlocks(); this.state = STATE_SETUP; break; case STATE_SETUP: if (currentIndex >= blocks.size() - 1) this.state = STATE_DELETE; else - tickPlaceBlocks(); + setupBlocksTick(); break; case STATE_DELETE: currentIndex = 0; @@ -125,12 +103,15 @@ public final class EntitySphereGen extends Entity } } - private void tickPlaceBlocks() { + private void setupBlocksTick() + { + LocalProfiler.start("EntitySphereGen.setupBlocksTick"); int blocksToMove = Math.min(BLOCKS_PER_TICK, blocks.size() - currentIndex); -// LocalProfiler.start("[EntitySphereGen] Placing blocks: " + currentIndex + "/" + blocks.size()); + System.out.println("[ESG] Setting up blocks: " + currentIndex + "/" + blocks.size() + " [bts: " + blocksToMove + "]"); int notifyFlag; - for (int index = 0; index < blocksToMove; index++) { + for (int index = 0; index < blocksToMove; index++) + { if (currentIndex >= blocks.size()) break; notifyFlag = (currentIndex % 1000 == 0 ? 2 : 0); @@ -139,105 +120,98 @@ public final class EntitySphereGen extends Entity currentIndex++; } -// LocalProfiler.stop(); + LocalProfiler.stop(); } - private void tickScheduleBlocks() { -// LocalProfiler.start("EntitySphereGen.tickScheduleBlocks"); + private void saveSphereBlocks() + { radius += 0.5D; // Radius from center of block double radiusSq = radius * radius; // Optimization to avoid square roots double radius1Sq = (radius - 1.0D) * (radius - 1.0D); // for hollow sphere int ceilRadius = (int) Math.ceil(radius); // Pass the cube and check points for sphere equation x^2 + y^2 + z^2 = r^2 - int[] block = defaultBlock; - for (int x = 0; x <= ceilRadius; x++) { - double x2 = (x + 0.5D) * (x + 0.5D); - for (int y = 0; y <= ceilRadius; y++) { - double y2 = (y + 0.5D) * (y + 0.5D); - for (int z = 0; z <= ceilRadius; z++) { - double z2 = (z + 0.5D) * (z + 0.5D); - double dSq = x2 + y2 + z2; // Distance from current position to center - + for (int x = 0; x <= ceilRadius; x++) + { + for (int y = 0; y <= ceilRadius; y++) + { + for (int z = 0; z <= ceilRadius; z++) + { + double dSq = lengthSq(x, y, z); // Distance from current position to center + // Skip too far blocks if (dSq > radiusSq) continue; // Hollow sphere condition - if ((hollow) && ((dSq < radius1Sq) || ((lengthSq(x + 1.5D, y + 0.5D, z + 0.5D) <= radiusSq) && (lengthSq(x + 0.5D, y + 1.5D, z + 0.5D) <= radiusSq) && (lengthSq(x + 0.5D, y + 0.5D, z + 1.5D) <= radiusSq)))) + if ((hollow) && ((dSq < radius1Sq) || ((lengthSq(x + 1, y, z) <= radiusSq) && (lengthSq(x, y + 1, z) <= radiusSq) && (lengthSq(x, y, z + 1) <= radiusSq)))) continue; - - if (generateOres) - block = WarpDriveConfig.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); + if (surfaceSphere) + block = WarpDriveConfig.i.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); // Add blocks to memory addBlock(new JumpBlock(block[0], block[1], xCoord + x, yCoord + y, zCoord + z)); - if (generateOres) - block = WarpDriveConfig.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); + if (surfaceSphere) + block = WarpDriveConfig.i.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); addBlock(new JumpBlock(block[0], block[1], xCoord - x, yCoord + y, zCoord + z)); - if (generateOres) - block = WarpDriveConfig.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); + if (surfaceSphere) + block = WarpDriveConfig.i.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); addBlock(new JumpBlock(block[0], block[1], xCoord + x, yCoord - y, zCoord + z)); - if (generateOres) - block = WarpDriveConfig.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); + if (surfaceSphere) + block = WarpDriveConfig.i.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); addBlock(new JumpBlock(block[0], block[1], xCoord + x, yCoord + y, zCoord - z)); - if (generateOres) - block = WarpDriveConfig.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); + if (surfaceSphere) + block = WarpDriveConfig.i.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); addBlock(new JumpBlock(block[0], block[1], xCoord - x, yCoord - y, zCoord + z)); - if (generateOres) - block = WarpDriveConfig.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); + if (surfaceSphere) + block = WarpDriveConfig.i.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); addBlock(new JumpBlock(block[0], block[1], xCoord + x, yCoord - y, zCoord - z)); - if (generateOres) - block = WarpDriveConfig.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); + if (surfaceSphere) + block = WarpDriveConfig.i.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); addBlock(new JumpBlock(block[0], block[1], xCoord - x, yCoord + y, zCoord - z)); - if (generateOres) - block = WarpDriveConfig.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); + if (surfaceSphere) + block = WarpDriveConfig.i.getRandomSurfaceBlock(worldObj.rand, defaultBlock[0], defaultBlock[1], true); addBlock(new JumpBlock(block[0], block[1], xCoord - x, yCoord - y, zCoord - z)); } } } - if (blocks != null) { - WarpDrive.debugPrint("[EntitySphereGen] Saved " + blocks.size() + " blocks (estimated to " + pregenSize + ")"); - } -// LocalProfiler.stop(); + if (blocks != null) + System.out.println("[ESG] Saved " + blocks.size() + " blocks"); } - private void addBlock(JumpBlock jb) { - if (blocks == null) - return; - // Replace water with random gas (ship in moon) - if (worldObj.getBlockId(jb.x, jb.y, jb.z) == Block.leaves.blockID) { - if (worldObj.rand.nextInt(50) != 1) - { - jb.blockID = WarpDriveConfig.gasID; - jb.blockMeta = gasColor; - } - blocks.add(jb); - return; - } - // Do not replace existing blocks if fillingSphere is true + private void addBlock(JumpBlock jb) + { + // Do not replace exitsting blocks if fillingSphere is true if (fillingSphere && !worldObj.isAirBlock(jb.x, jb.y, jb.z)) return; + if (blocks == null) + return; blocks.add(jb); } - private static double lengthSq(double x, double y, double z) { + private static double lengthSq(double x, double y, double z) + { return (x * x) + (y * y) + (z * z); } @Override - protected void readEntityFromNBT(NBTTagCompound tag) { + protected void readEntityFromNBT(NBTTagCompound tag) + { } @Override - protected void entityInit() { + protected void entityInit() + { } @Override - protected void writeEntityToNBT(NBTTagCompound tag) { + protected void writeEntityToNBT(NBTTagCompound tag) + { } - // Own implementation of setting blocks without light recalculation in optimization purposes - private static boolean mySetBlock(World w, int x, int y, int z, int blockId, int blockMeta, int par6) { - if (x >= -30000000 && z >= -30000000 && x < 30000000 && z < 30000000) { + // Own implementation of setting blocks withow light recalculation in optimization purposes + public boolean mySetBlock(World w, int x, int y, int z, int blockId, int blockMeta, int par6) + { + if (x >= -30000000 && z >= -30000000 && x < 30000000 && z < 30000000) + { if (y < 0) return false; else if (y >= 256) @@ -245,12 +219,13 @@ public final class EntitySphereGen extends Entity w.markBlockForUpdate(x, y, z); Chunk chunk = w.getChunkFromChunkCoords(x >> 4, z >> 4); return myChunkSBIDWMT(chunk, x & 15, y, z & 15, blockId, blockMeta); - } else { - return false; } + else + return false; } - private static boolean myChunkSBIDWMT(Chunk c, int x, int y, int z, int blockId, int blockMeta) { + public boolean myChunkSBIDWMT(Chunk c, int x, int y, int z, int blockId, int blockMeta) + { int j1 = z << 4 | x; if (y >= c.precipitationHeightMap[j1] - 1) c.precipitationHeightMap[j1] = -999; @@ -290,9 +265,4 @@ public final class EntitySphereGen extends Entity c.isModified = true; return true; } - - @Override - public boolean shouldRenderInPass(int pass) { - return false; - } } \ No newline at end of file diff --git a/src/cr0s/WarpDrive/EntityStarCore.java b/src/cr0s/WarpDrive/EntityStarCore.java index 37513e4c..2831e553 100644 --- a/src/cr0s/WarpDrive/EntityStarCore.java +++ b/src/cr0s/WarpDrive/EntityStarCore.java @@ -6,7 +6,6 @@ import java.util.List; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; @@ -23,7 +22,6 @@ public final class EntityStarCore extends Entity private final int KILL_RADIUS = 60; private final int BURN_RADIUS = 200; //private final int ROCKET_INTERCEPT_RADIUS = 100; //disabled - private boolean isLogged = false; private final int ENTITY_ACTION_INTERVAL = 10; // ticks @@ -38,38 +36,58 @@ public final class EntityStarCore extends Entity { super(world); this.xCoord = x; - this.posX = x; + this.posX = (double) x; this.yCoord = y; - this.posY = y; + this.posY = (double) y; this.zCoord = z; - this.posZ = z; + this.posZ = (double) z; this.radius = radius; } private void actionToEntitiesNearStar() { - int xmax, ymax, zmax; + int xmax, ymax, zmax, x1, x2, z1, z2; int xmin, ymin, zmin; - final int MAX_RANGE = this.radius + KILL_RADIUS + BURN_RADIUS;// + ROCKET_INTERCEPT_RADIUS; - final int KILL_RANGESQ = (this.radius + KILL_RADIUS) * (this.radius + KILL_RADIUS); - final int BURN_RANGESQ = (this.radius + KILL_RADIUS + BURN_RADIUS) * (this.radius + KILL_RADIUS + BURN_RADIUS); - xmin = xCoord - MAX_RANGE; - xmax = xCoord + MAX_RANGE; + final int CUBE_SIDE = this.radius + KILL_RADIUS + BURN_RADIUS;// + ROCKET_INTERCEPT_RADIUS; + x1 = xCoord + CUBE_SIDE; + x2 = xCoord - CUBE_SIDE; - zmin = zCoord - MAX_RANGE; - zmax = zCoord + MAX_RANGE; + if (x1 < x2) + { + xmin = x1; + xmax = x2; + } + else + { + xmin = x2; + xmax = x1; + } - ymin = yCoord - MAX_RANGE; - ymax = yCoord + MAX_RANGE; + z1 = zCoord + CUBE_SIDE; + z2 = zCoord - CUBE_SIDE; + + if (z1 < z2) + { + zmin = z1; + zmax = z2; + } + else + { + zmin = z2; + zmax = z1; + } + + ymax = yCoord + CUBE_SIDE; + ymin = yCoord - CUBE_SIDE; AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(xmin, ymin, zmin, xmax, ymax, zmax); List list = worldObj.getEntitiesWithinAABBExcludingEntity(this, aabb); - if (!isLogged) - { - isLogged = true; - WarpDrive.debugPrint(this + ": Capture range: " + MAX_RANGE - + " X: " + xmin + " to " + xmax + " Y: " + ymin + " to " + ymax + " Z: " + zmin + " to " + zmax); - } + /*System.out.println("-"); + System.out.println("Coordinates: (" + xCoord + "; " + yCoord + "; " + zCoord + "). Cube side: " + CUBE_SIDE); + System.out.println("[" + this + "] X: " + xmin + " -> " + xmax); + System.out.println("[" + this + "] Y: " + ymin + " -> " + ymax); + System.out.println("[" + this + "] Z: " + zmin + " -> " + zmax); + */ for (Object o : list) { if (o == null || !(o instanceof Entity)) @@ -82,22 +100,15 @@ public final class EntityStarCore extends Entity EntityLivingBase entity = (EntityLivingBase)o; //System.out.println("Found: " + entity.getEntityName() + " distance: " + entity.getDistanceToEntity(this)); - if (entity.getDistanceSqToEntity(this) <= KILL_RANGESQ) + if (entity.getDistanceToEntity(this) <= (this.radius + KILL_RADIUS)) { // 100% kill, ignores any protection entity.attackEntityFrom(DamageSource.onFire, 9000); } - else if (entity.getDistanceSqToEntity(this) <= BURN_RANGESQ) + else if (entity.getDistanceToEntity(this) <= (this.radius + BURN_RADIUS)) { - if (entity instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer)entity; - if (player.capabilities.isCreativeMode) - continue; - } // burn entity to 100 seconds - if (!entity.isImmuneToFire()) - entity.setFire(100); + entity.setFire(100); entity.attackEntityFrom(DamageSource.onFire, 1); } }/* else { // Intercept ICBM rocket and kill diff --git a/src/cr0s/WarpDrive/FXBeam.java b/src/cr0s/WarpDrive/FXBeam.java index 24f58023..cc84f312 100644 --- a/src/cr0s/WarpDrive/FXBeam.java +++ b/src/cr0s/WarpDrive/FXBeam.java @@ -1,6 +1,7 @@ package cr0s.WarpDrive; import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.EffectRenderer; import net.minecraft.client.particle.EntityFX; import net.minecraft.client.renderer.Tessellator; import net.minecraft.entity.EntityLivingBase; @@ -57,8 +58,29 @@ public class FXBeam extends EntityFX this.particleMaxAge = age; this.energy = energy; - if (red == 1 && green == 0 && blue == 0) { - TEXTURE = new ResourceLocation("warpdrive", "textures/blocks/energy_grey.png"); + if (red == 1 && green == 0 && blue == 0) + { + TEXTURE = new ResourceLocation("warpdrive", "textures/blocks/energy_red.png"); + } + else if (red == 0 && green == 1 && blue == 0) + { + TEXTURE = new ResourceLocation("warpdrive", "textures/blocks/energy_green.png"); + } + else if (red == 0 && green == 0 && blue == 1) + { + TEXTURE = new ResourceLocation("warpdrive", "textures/blocks/energy.png"); + } + else if (red == 1 && green == 1 && blue == 0) + { + TEXTURE = new ResourceLocation("warpdrive", "textures/blocks/energy_yellow.png"); + } + else if (red == 1 && green == 0.5 && blue == 0) + { + TEXTURE = new ResourceLocation("warpdrive", "textures/blocks/energy_orange.png"); + } + else if (red == 0.5 && green == 0 && blue == 0.5) + { + TEXTURE = new ResourceLocation("warpdrive", "textures/blocks/energy_violet.png"); } /** @@ -100,8 +122,31 @@ public class FXBeam extends EntityFX this.particleMaxAge = age; this.energy = energy; - TEXTURE = new ResourceLocation("warpdrive", "textures/blocks/energy_grey.png"); - + if (red == 1 && green == 0 && blue == 0) + { + TEXTURE = new ResourceLocation("warpdrive", "textures/blocks/energy_red.png"); + } + else if (red == 0 && green == 1 && blue == 0) + { + TEXTURE = new ResourceLocation("warpdrive", "textures/blocks/energy_green.png"); + } + else if (red == 0 && green == 0 && blue == 1) + { + TEXTURE = new ResourceLocation("warpdrive", "textures/blocks/energy.png"); + } + else if (red == 1 && green == 1 && blue == 0) + { + TEXTURE = new ResourceLocation("warpdrive", "textures/blocks/energy_yellow.png"); + } + else if (red == 1 && green == 0.5 && blue == 0) + { + TEXTURE = new ResourceLocation("warpdrive", "textures/blocks/energy_orange.png"); + } + else if (red == 0.5 && green == 0 && blue == 0.5) + { + TEXTURE = new ResourceLocation("warpdrive", "textures/blocks/energy_violet.png"); + } + /** * Sets the particle age based on distance. */ diff --git a/src/cr0s/WarpDrive/GenerateCommand.java b/src/cr0s/WarpDrive/GenerateCommand.java index 99b0d212..dd7cddc1 100644 --- a/src/cr0s/WarpDrive/GenerateCommand.java +++ b/src/cr0s/WarpDrive/GenerateCommand.java @@ -1,6 +1,5 @@ package cr0s.WarpDrive; -import cpw.mods.fml.common.FMLCommonHandler; import net.minecraft.command.CommandBase; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayerMP; @@ -29,64 +28,71 @@ public class GenerateCommand extends CommandBase @Override public String getCommandUsage(ICommandSender par1ICommandSender) { - return "/" + getCommandName() + " \nPossible structures: moon, ship, asteroid, astfield, gascloud, star , jumpgate "; + return "/" + getCommandName() + " \nPossible structures: moon, ship, asteroid, astfield, gascloud, star, jumpgate "; } @Override public void processCommand(ICommandSender icommandsender, String[] params) { EntityPlayerMP player = (EntityPlayerMP)icommandsender; - if(params.length > 0) + String struct = params[0]; + + // Reject command, if player is not in space + if (player.dimension != WarpDrive.instance.spaceDimID && (!"ship".equals(struct))) { - String struct = params[0]; - - // Reject command, if player is not in space - if (player.dimension != WarpDriveConfig.G_SPACE_DIMENSION_ID && (!"ship".equals(struct))) - { - player.addChatMessage("* generate: this structure is only allowed in space!"); - return; - } - - int x = MathHelper.floor_double(player.posX); - int y = MathHelper.floor_double(player.posY); - int z = MathHelper.floor_double(player.posZ); - - if (FMLCommonHandler.instance().getEffectiveSide().isServer()) { - if (struct.equals("moon")) { - notifyAdmins(icommandsender, "/generate: generating moon at " + x + ", " + (y - 16) + ", " + z, new Object[0]); - WarpDrive.instance.spaceWorldGenerator.generateMoon(player.worldObj, x, y - 16, z); - } else if (struct.equals("ship")) { - notifyAdmins(icommandsender, "/generate: generating NPC ship at " + x + ", " + y + ", " + z, new Object[0]); - new WorldGenSmallShip(false).generate(player.worldObj, player.worldObj.rand, x, y, z); - } else if (struct.equals("asteroid")) { - notifyAdmins(icommandsender, "/generate: generating asteroid at " + x + ", " + (y - 10) + ", " + z, new Object[0]); - WarpDrive.instance.spaceWorldGenerator.generateRandomAsteroid(player.worldObj, x, y - 10, z, 6, 11); - } else if (struct.equals("astfield")) { - notifyAdmins(icommandsender, "/generate: generating asteroid field at " + x + ", " + y + ", " + z, new Object[0]); - WarpDrive.instance.spaceWorldGenerator.generateAsteroidField(player.worldObj, x, y, z); - } else if (struct.equals("gascloud")) { - notifyAdmins(icommandsender, "/generate: generating gas cloud at " + x + ", " + y + ", " + z, new Object[0]); - WarpDrive.instance.spaceWorldGenerator.generateGasCloudOfColor(player.worldObj, x, y, z, 15, 20, player.worldObj.rand.nextInt(12)); - } else if (struct.equals("star")) { - notifyAdmins(icommandsender, "/generate: generating star at " + x + ", " + y + ", " + z, new Object[0]); - Integer type = (params.length > 1) ? Integer.parseInt(params[1]) : -1; // Lem - WarpDrive.instance.spaceWorldGenerator.generateStar(player.worldObj, x, y, z, type); // Lem - } else if (struct.equals("jumpgate")) { - if (params.length == 2) { - notifyAdmins(icommandsender, "/generate: creating jumpgate at " + x + ", " + y + ", " + z, new Object[0]); - - if (WarpDrive.instance.jumpGates.addGate(params[1], x, y, z)) { - JumpGateGenerator.generate(player.worldObj, x, Math.min(y,255-JumpGateGenerator.GATE_SIZE_HALF - 1), z); - } else { - notifyAdmins(icommandsender, "/generate: jumpgate '" + params[1] + "' already exists.", new Object[0]); - } - } - } else { - player.addChatMessage(getCommandUsage(icommandsender)); - } - } - } else { - player.addChatMessage(getCommandUsage(icommandsender)); + player.addChatMessage("* generate: this structure generation allowed only in space!"); + return; + } + + int x = MathHelper.floor_double(player.posX); + int y = MathHelper.floor_double(player.posY); + int z = MathHelper.floor_double(player.posZ); + + if (struct.equals("moon")) + { + notifyAdmins(icommandsender, "/generate: generating moon at " + x + ", " + (y - 16) + ", " + z, new Object[0]); + WarpDrive.instance.spaceWorldGenerator.generateMoon(player.worldObj, x, y - 16, z); + } + else if (struct.equals("ship")) + { + notifyAdmins(icommandsender, "/generate: generating NPC ship at " + x + ", " + y + ", " + z, new Object[0]); + new WorldGenSmallShip(false).generate(player.worldObj, player.worldObj.rand, x, y, z); + } + else if (struct.equals("asteroid")) + { + notifyAdmins(icommandsender, "/generate: generating asteroid at " + x + ", " + (y - 10) + ", " + z, new Object[0]); + WarpDrive.instance.spaceWorldGenerator.generateAsteroid(player.worldObj, x, y - 10, z, 6, 11); + } + else if (struct.equals("astfield")) + { + notifyAdmins(icommandsender, "/generate: generating asteroid field at " + x + ", " + y + ", " + z, new Object[0]); + WarpDrive.instance.spaceWorldGenerator.generateAsteroidField(player.worldObj, x, y, z); + } + else if (struct.equals("gascloud")) + { + notifyAdmins(icommandsender, "/generate: generating gas cloud at " + x + ", " + y + ", " + z, new Object[0]); + WarpDrive.instance.spaceWorldGenerator.generateGasCloudOfColor(player.worldObj, x, y, z, 15, 20, player.worldObj.rand.nextInt(12)); + } + else if (struct.equals("star")) + { + notifyAdmins(icommandsender, "/generate: generating star at " + x + ", " + y + ", " + z, new Object[0]); + WarpDrive.instance.spaceWorldGenerator.generateStar(player.worldObj, x, y, z); + } + else if (struct.equals("jumpgate")) + { + if (params.length == 2) + { + notifyAdmins(icommandsender, "/generate: creating jumpgate at " + x + ", " + y + ", " + z, new Object[0]); + + if (WarpDrive.instance.jumpGates.addGate(params[1], x, y, z)) + { + JumpGateGenerator.generate(player.worldObj, x, y, z); + } + else + { + notifyAdmins(icommandsender, "/generate: jumpgate '" + params[1] + "' already exists.", new Object[0]); + } + } } } } diff --git a/src/cr0s/WarpDrive/GravityManager.java b/src/cr0s/WarpDrive/GravityManager.java index 34d0adbb..3674f794 100644 --- a/src/cr0s/WarpDrive/GravityManager.java +++ b/src/cr0s/WarpDrive/GravityManager.java @@ -1,6 +1,7 @@ package cr0s.WarpDrive; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -8,104 +9,79 @@ import net.minecraft.util.MathHelper; public class GravityManager { - private static double OVERWORLD_ENTITY_GRAVITY = 0.080000000000000002D; // Default value from Vanilla - private static double OVERWORLD_ITEM_GRAVITY = 0.039999999105930328D; // Default value from Vanilla - private static double OVERWORLD_ITEM_GRAVITY2 = 0.9800000190734863D; // Default value from Vanilla - private static double HYPERSPACE_FIELD_ENTITY_GRAVITY = 0.035D; - private static double HYPERSPACE_VOID_ENTITY_JITTER = 0.005D; - private static double SPACE_FIELD_ENTITY_GRAVITY = 0.025D; // Lem 0.08D - private static double SPACE_FIELD_ITEM_GRAVITY = 0.02D; // Lem 0.04D - private static double SPACE_FIELD_ITEM_GRAVITY2 = 0.60D; // Lem 0.9800000190734863D - private static double SPACE_VOID_GRAVITY = 0.001D; // Lem 0.0001D - private static double SPACE_VOID_GRAVITY_JETPACKSNEAK = 0.02D; // Lem 0.01D - private static double SPACE_VOID_GRAVITY_RAWSNEAK = 0.005D; // Lem 0.01D 0.001 = no mvt + private static double SPACE_GRAVITY = 0.0001D; + private static double SPACE_GRAVITY_SNEAK = 0.01D; public static double getGravityForEntity(EntityLivingBase entity) { // Is entity in space or hyper-space? - boolean inSpace = entity.worldObj.provider.dimensionId == WarpDriveConfig.G_SPACE_DIMENSION_ID; - boolean inHyperspace = entity.worldObj.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID; - // entity.ticksExisted + boolean inSpace = entity.worldObj.provider.dimensionId == WarpDrive.instance.spaceDimID || entity.worldObj.provider.dimensionId == WarpDrive.instance.hyperSpaceDimID; - if (inSpace || inHyperspace) + if (inSpace) { boolean insideGravField = isEntityInGraviField(entity); - + if (insideGravField) { - if (inSpace) - return SPACE_FIELD_ENTITY_GRAVITY; - else - return HYPERSPACE_FIELD_ENTITY_GRAVITY; + return 0.08D; } else { - double jitter = (entity.rand.nextDouble() - 0.5D) * 2.0D * HYPERSPACE_VOID_ENTITY_JITTER; - if (inSpace) - jitter = 0.0D; if (entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)entity; if (player.isSneaking()) { - if (player.getCurrentArmor(2) != null && WarpDriveConfig.Jetpacks.contains(player.getCurrentArmor(2).itemID)) + if (player.getCurrentArmor(2) != null && WarpDriveConfig.i.Jetpacks.contains(player.getCurrentArmor(2).itemID)) { - return SPACE_VOID_GRAVITY_JETPACKSNEAK; + return SPACE_GRAVITY_SNEAK; } - else - { - return SPACE_VOID_GRAVITY_RAWSNEAK; - } - } - else - { - // FIXME: compensate jetpack } } - return SPACE_VOID_GRAVITY + jitter; + return SPACE_GRAVITY; } } - return OVERWORLD_ENTITY_GRAVITY; + return 0.08D; } public static double getItemGravity(EntityItem entity) { - if (entity.worldObj.provider.dimensionId == WarpDriveConfig.G_SPACE_DIMENSION_ID || entity.worldObj.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID) + if (entity.worldObj.provider.dimensionId == WarpDrive.instance.spaceDimID || entity.worldObj.provider.dimensionId == WarpDrive.instance.hyperSpaceDimID) { if (isEntityInGraviField(entity)) { - return SPACE_FIELD_ITEM_GRAVITY; + return 0.03999999910593033D; } else { - return SPACE_VOID_GRAVITY; + return SPACE_GRAVITY; } } else { - return OVERWORLD_ITEM_GRAVITY; // On Earth + return 0.03999999910593033D; // On Earth } } public static double getItemGravity2(EntityItem entity) { - if (entity.worldObj.provider.dimensionId == WarpDriveConfig.G_SPACE_DIMENSION_ID || entity.worldObj.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID) + if (entity.worldObj.provider.dimensionId == WarpDrive.instance.spaceDimID || entity.worldObj.provider.dimensionId == WarpDrive.instance.hyperSpaceDimID) { if (isEntityInGraviField(entity)) { - return SPACE_FIELD_ITEM_GRAVITY2; + return 0.9800000190734863D; } else { - return SPACE_VOID_GRAVITY; + return SPACE_GRAVITY; } } else { - return OVERWORLD_ITEM_GRAVITY2; + return 0.9800000190734863D; } } diff --git a/src/cr0s/WarpDrive/HyperSpaceGenerator.java b/src/cr0s/WarpDrive/HyperSpaceGenerator.java index b2a21e7e..c1f75fcb 100644 --- a/src/cr0s/WarpDrive/HyperSpaceGenerator.java +++ b/src/cr0s/WarpDrive/HyperSpaceGenerator.java @@ -31,7 +31,7 @@ public class HyperSpaceGenerator extends ChunkProviderGenerate implements IChunk @Override public Chunk provideChunk(int par1, int par2) { - this.rand.setSeed(par1 * 341873128712L + par2 * 132897987541L); + this.rand.setSeed((long) par1 * 341873128712L + (long) par2 * 132897987541L); byte[] var3 = new byte[32768]; generateTerrain(par1, par2, var3); //this.caveGenerator.generate(this, this.worldObj, par1, par2, var3); diff --git a/src/cr0s/WarpDrive/HyperSpaceProvider.java b/src/cr0s/WarpDrive/HyperSpaceProvider.java index 7505b557..0df37d31 100644 --- a/src/cr0s/WarpDrive/HyperSpaceProvider.java +++ b/src/cr0s/WarpDrive/HyperSpaceProvider.java @@ -100,7 +100,7 @@ public class HyperSpaceProvider extends WorldProvider for (int var2 = 0; var2 <= 15; ++var2) { - float var3 = 1.0F - var2 / 15.0F; + float var3 = 1.0F - (float)var2 / 15.0F; this.lightBrightnessTable[var2] = (1.0F - var3) / (var3 * 3.0F + 1.0F) * (1.0F - var1) + var1; } } @@ -124,14 +124,14 @@ public class HyperSpaceProvider extends WorldProvider { setCloudRenderer(new CloudRenderBlank()); setSkyRenderer(new CloudRenderBlank()); - return this.worldObj.getWorldVec3Pool().getVecFromPool(1.0D, 0.0D, 0.0D); + return this.worldObj.getWorldVec3Pool().getVecFromPool((double) 1, (double) 0, (double) 0); } @SideOnly(Side.CLIENT) @Override public Vec3 getFogColor(float par1, float par2) { - return this.worldObj.getWorldVec3Pool().getVecFromPool(0.1D, 0.0D, 0.0D); + return this.worldObj.getWorldVec3Pool().getVecFromPool((double) 0.1, (double) 0, (double) 0); } @SideOnly(Side.CLIENT) @@ -150,7 +150,7 @@ public class HyperSpaceProvider extends WorldProvider @Override public int getRespawnDimension(EntityPlayerMP player) { - return WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID; + return WarpDrive.instance.hyperSpaceDimID; } @Override @@ -190,8 +190,8 @@ public class HyperSpaceProvider extends WorldProvider worldObj.setBlock(var5.posX, var5.posY + 1, var5.posZ - 1, Block.glass.blockID, 0, 2); worldObj.setBlock(var5.posX, var5.posY + 2, var5.posZ - 1, Block.glass.blockID, 0, 2); worldObj.setBlock(var5.posX, var5.posY + 3, var5.posZ, Block.glass.blockID, 0, 2); - worldObj.setBlock(var5.posX, var5.posY, var5.posZ, WarpDriveConfig.airID, 15, 2); - worldObj.setBlock(var5.posX, var5.posY + 1, var5.posZ, WarpDriveConfig.airID, 15, 2); + worldObj.setBlock(var5.posX, var5.posY, var5.posZ, WarpDriveConfig.i.airID, 15, 2); + worldObj.setBlock(var5.posX, var5.posY + 1, var5.posZ, WarpDriveConfig.i.airID, 15, 2); } return var5; diff --git a/src/cr0s/WarpDrive/HyperSpaceWorldGenerator.java b/src/cr0s/WarpDrive/HyperSpaceWorldGenerator.java index 74fccd91..46169fde 100644 --- a/src/cr0s/WarpDrive/HyperSpaceWorldGenerator.java +++ b/src/cr0s/WarpDrive/HyperSpaceWorldGenerator.java @@ -1,9 +1,7 @@ package cr0s.WarpDrive; import cpw.mods.fml.common.IWorldGenerator; - import java.util.Random; - import net.minecraft.world.World; import net.minecraft.world.chunk.IChunkProvider; @@ -24,7 +22,7 @@ public class HyperSpaceWorldGenerator implements IWorldGenerator @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { - if (world.provider.dimensionId != WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID) + if (world.provider.dimensionId != WarpDrive.instance.hyperSpaceDimID) { // ... } diff --git a/src/cr0s/WarpDrive/InvisibleCommand.java b/src/cr0s/WarpDrive/InvisibleCommand.java index a06f051c..8ad020aa 100644 --- a/src/cr0s/WarpDrive/InvisibleCommand.java +++ b/src/cr0s/WarpDrive/InvisibleCommand.java @@ -4,6 +4,8 @@ import net.minecraft.command.CommandBase; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; +import net.minecraft.util.MathHelper; +import net.minecraft.world.WorldServer; public class InvisibleCommand extends CommandBase { @@ -23,6 +25,8 @@ public class InvisibleCommand extends CommandBase public void processCommand(ICommandSender icommandsender, String[] astring) { EntityPlayerMP player = (EntityPlayerMP)icommandsender; + MinecraftServer server = MinecraftServer.getServer(); + int targetDim = WarpDrive.instance.spaceDimID; if (astring.length >= 1) { diff --git a/src/cr0s/WarpDrive/JumpGatesRegistry.java b/src/cr0s/WarpDrive/JumpGatesRegistry.java index 1db0f86e..87c570ad 100644 --- a/src/cr0s/WarpDrive/JumpGatesRegistry.java +++ b/src/cr0s/WarpDrive/JumpGatesRegistry.java @@ -9,49 +9,52 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.MathHelper; +import net.minecraft.client.Minecraft; -public final class JumpGatesRegistry { +public final class JumpGatesRegistry +{ private File db; private ArrayList gates = new ArrayList(); //@SideOnly(Side.CLIENT) - public JumpGatesRegistry() { - db = new File("gates.txt"); - System.out.println("Gates.txt file: " + db); - - if (db != null && !db.exists()) { - try { - db.createNewFile(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - try { + public JumpGatesRegistry() + { + db = MinecraftServer.getServer().getFile("gates.txt"); + + try + { loadGates(); - } catch (IOException ex) { + } + catch (IOException ex) + { Logger.getLogger(JumpGatesRegistry.class.getName()).log(Level.SEVERE, null, ex); } } - public void saveGates() throws IOException { + public void saveGates() throws IOException + { PrintWriter out = new PrintWriter(new FileWriter(db)); // Write each string in the array on a separate line - for (JumpGate jg : gates) { + for (JumpGate jg : gates) + { out.println(jg); } out.close(); } - public void loadGates() throws IOException { + public void loadGates() throws IOException + { System.out.println("[JUMP GATES] Loading jump gates from gates.txt..."); BufferedReader bufferedreader; bufferedreader = new BufferedReader(new FileReader(db)); String s1; - while ((s1 = bufferedreader.readLine()) != null) { + while ((s1 = bufferedreader.readLine()) != null) + { gates.add(new JumpGate(s1)); } @@ -59,31 +62,39 @@ public final class JumpGatesRegistry { System.out.println("[JUMP GATES] Loaded " + gates.size() + " jump gates."); } - public void addGate(JumpGate jg) { + public void addGate(JumpGate jg) + { gates.add(jg); } - public boolean addGate(String name, int x, int y, int z) { + public boolean addGate(String name, int x, int y, int z) + { // Gate already exists - if (findGateByName(name) != null) { + if (findGateByName(name) != null) + { return false; } addGate(new JumpGate(name, x, y, z)); - try { + try + { saveGates(); - } catch (IOException ex) { + } + catch (IOException ex) + { Logger.getLogger(JumpGatesRegistry.class.getName()).log(Level.SEVERE, null, ex); } return true; } - public void removeGate(String name) { + public void removeGate(String name) + { JumpGate jg; - for (int i = 0; i < gates.size(); i++) { + for (int i = 0; i < gates.size(); i++) + { jg = gates.get(i); if (jg.name.equalsIgnoreCase(name)) @@ -93,16 +104,22 @@ public final class JumpGatesRegistry { } } - try { + try + { saveGates(); - } catch (IOException ex) { + } + catch (IOException ex) + { Logger.getLogger(JumpGatesRegistry.class.getName()).log(Level.SEVERE, null, ex); } } - public JumpGate findGateByName(String name) { - for (JumpGate jg : gates) { - if (jg.name.equalsIgnoreCase(name)) { + public JumpGate findGateByName(String name) + { + for (JumpGate jg : gates) + { + if (jg.name.equalsIgnoreCase(name)) + { return jg; } } @@ -110,37 +127,36 @@ public final class JumpGatesRegistry { return null; } - public String jumpGatesList() { + public String jumpGatesList() + { String result = ""; - for (JumpGate jg : gates) { + for (JumpGate jg : gates) + { result += jg.toNiceString() + "\n"; } return result; } - - public String commaList() { - String result = ""; - for (JumpGate jg : gates) { - result += jg.toNiceString() + ","; - } - return result; - } - public JumpGate findNearestGate(int x, int y, int z) { -// WarpDrive.debugPrint(jumpGatesList()); - double minDistance2 = -1; + public JumpGate findNearestGate(int x, int y, int z) + { + System.out.println(jumpGatesList()); + double minDistance = -1; JumpGate res = null; - for (JumpGate jg : gates) { - double dX = jg.xCoord - x; - double dY = jg.yCoord - y; - double dZ = jg.zCoord - z; - double distance2 = dX * dX + dY * dY + dZ * dZ; + for (JumpGate jg : gates) + { + double d3 = jg.xCoord - x; + double d4 = jg.yCoord - y; + double d5 = jg.zCoord - z; + double distance = MathHelper.sqrt_double(d3 * d3 + d4 * d4 + d5 * d5); + System.out.println("Checking gate: " + jg.name + ", distance: " + distance); - if ((minDistance2 == -1) || (distance2 < minDistance2)) { - minDistance2 = distance2; + if (minDistance == -1 || distance < minDistance) + { + System.out.println("Setting " + jg.name + " as nearest"); + minDistance = distance; res = jg; } } diff --git a/src/cr0s/WarpDrive/JumpgateCommand.java b/src/cr0s/WarpDrive/JumpgateCommand.java deleted file mode 100644 index 44632926..00000000 --- a/src/cr0s/WarpDrive/JumpgateCommand.java +++ /dev/null @@ -1,33 +0,0 @@ -package cr0s.WarpDrive; - -import net.minecraft.command.CommandBase; -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.player.EntityPlayerMP; - -public class JumpgateCommand extends CommandBase -{ - @Override - public int getRequiredPermissionLevel() - { - return 4; - } - - @Override - public String getCommandName() - { - return "jumpgates"; - } - - @Override - public String getCommandUsage(ICommandSender icommandsender) - { - return "Lists jumpgates"; - } - - @Override - public void processCommand(ICommandSender icommandsender, String[] astring) - { - EntityPlayerMP player = (EntityPlayerMP)icommandsender; - player.addChatMessage(WarpDrive.instance.jumpGates.commaList()); - } -} diff --git a/src/cr0s/WarpDrive/MetaRotations$1.java b/src/cr0s/WarpDrive/MetaRotations$1.java index 3e4a7321..ef8e684a 100644 --- a/src/cr0s/WarpDrive/MetaRotations$1.java +++ b/src/cr0s/WarpDrive/MetaRotations$1.java @@ -12,8 +12,7 @@ class MetaRotations$1 implements FilenameFilter this.this$0 = var1; } - @Override - public boolean accept(File f, String name) + public boolean accept(File f, String name) { return name.endsWith(".mrot"); } diff --git a/src/cr0s/WarpDrive/MetaRotations.java b/src/cr0s/WarpDrive/MetaRotations.java index 98698387..aef3148a 100644 --- a/src/cr0s/WarpDrive/MetaRotations.java +++ b/src/cr0s/WarpDrive/MetaRotations.java @@ -6,16 +6,24 @@ import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; import net.minecraft.block.Block; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import ic2.api.network.NetworkHelper; public class MetaRotations { private File metaRotationsDirectory; - public Map metaRotationMap = new HashMap(); + public Map metaRotationMap = new HashMap(); public int getRotatedMeta(int block, int meta, int rotate) { @@ -25,7 +33,7 @@ public class MetaRotations } else { - BlockMetaRotation rotation = metaRotationMap.get(Integer.valueOf(block)); + BlockMetaRotation rotation = (BlockMetaRotation)this.metaRotationMap.get(Integer.valueOf(block)); return rotation == null ? meta : rotation.getRotatedMeta(meta, rotate); } } @@ -237,8 +245,7 @@ public class MetaRotations reader.close(); } - public static int rotate90(int type, int parData) { - int data = parData; + public static int rotate90(int type, int data) { switch (type) { case BlockID.MINECART_TRACKS: switch (data) { @@ -399,19 +406,23 @@ public class MetaRotations } public static short rotateIC2MachineFacing90Reverse(short facing) { - switch(facing) // 3 5 2 4 + switch(facing) // 3 5 2 4 { case 3: - return 5; + facing = 5; + break; case 5: - return 2; + facing = 2; + break; case 2: - return 4; + facing = 4; + break; case 4: - return 3; + facing = 3; + break; } return facing; } @@ -431,16 +442,20 @@ public class MetaRotations switch(facing) // 0 4 2 1 { case 0: - return 4; + facing = 4; + break; case 4: - return 2; + facing = 2; + break; case 2: - return 1; + facing = 1; + break; case 1: - return 0; + facing = 0; + break; } return facing; @@ -450,16 +465,20 @@ public class MetaRotations switch(facing) // 3 5 2 4 { case 3: - return 5; + facing = 5; + break; case 5: - return 2; + facing = 2; + break; case 2: - return 4; + facing = 4; + break; case 4: - return 3; + facing = 3; + break; } return facing; @@ -474,7 +493,8 @@ public class MetaRotations } public static int rotateCCBlock90Reverse(int dir) { - switch(dir) { + switch(dir) + { case 4: return 3; case 3: @@ -491,7 +511,8 @@ public class MetaRotations public static int rotateComputer90Reverse(int meta) { int typeMeta = meta & 0x8; - switch(meta - typeMeta) { + switch(meta - typeMeta) + { case 4: return typeMeta + 3; case 3: @@ -513,8 +534,7 @@ public class MetaRotations * @param data * @return */ - public static int rotate90Reverse(int type, int parData) { - int data = parData; + public static int rotate90Reverse(int type, int data) { switch (type) { case BlockID.MINECART_TRACKS: switch (data) { diff --git a/src/cr0s/WarpDrive/PacketHandler.java b/src/cr0s/WarpDrive/PacketHandler.java index a265eed3..508a02fd 100644 --- a/src/cr0s/WarpDrive/PacketHandler.java +++ b/src/cr0s/WarpDrive/PacketHandler.java @@ -5,18 +5,18 @@ import java.io.DataInputStream; import java.io.IOException; import java.util.List; +import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; import cpw.mods.fml.common.network.IPacketHandler; import cpw.mods.fml.common.network.Player; -import cr0s.WarpDrive.machines.TileEntityCamera; -import cr0s.WarpDrive.machines.TileEntityLaser; -import cr0s.WarpDrive.machines.TileEntityMonitor; import net.minecraft.client.multiplayer.WorldClient; public class PacketHandler implements IPacketHandler @@ -42,142 +42,192 @@ public class PacketHandler implements IPacketHandler } } - public static void handleCloak(Packet250CustomPayload packet, EntityPlayer player) { - DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(packet.data)); + public void handleCloak(Packet250CustomPayload packet, EntityPlayer player) { + DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(packet.data)); - try { - // Read cloaked area parameters - int minX = inputStream.readInt(); - int minY = inputStream.readInt(); - int minZ = inputStream.readInt(); - - int maxX = inputStream.readInt(); - int maxY = inputStream.readInt(); - int maxZ = inputStream.readInt(); - - boolean decloak = inputStream.readBoolean(); - - byte tier = inputStream.readByte(); - - //WarpDrive.debugPrint("[Cloak Packet] Received " + ((decloak) ? "DEcloaked" : "cloaked") + "area: (" + minX + "; " + minY + "; " + minZ + ") -> (" + maxX + "; " + maxY + "; " + maxZ + ")"); - - if (minX <= player.posX && maxX >= player.posY && minY <= player.posZ && maxY >= player.posX && minZ <= player.posY && maxZ >= player.posZ) - return; - + try + { + // Read cloaked area parameters + int minX = inputStream.readInt(); + int minY = inputStream.readInt(); + int minZ = inputStream.readInt(); + + int maxX = inputStream.readInt(); + int maxY = inputStream.readInt(); + int maxZ = inputStream.readInt(); + + boolean decloak = inputStream.readBoolean(); + + byte tier = inputStream.readByte(); + + int w = Math.abs(maxX - minX); + int h = Math.abs(maxY - minY); + int l = Math.abs(maxZ - minZ); + + //(-2099; 208; 423) -> (-2069; 243; 453) + // + int size = w * h * l; + + //System.out.println("[Cloak Packet] Received " + ((decloak) ? "DEcloaked" : "cloaked") + "area: (" + minX + "; " + minY + "; " + minZ + ") -> (" + maxX + "; " + maxY + "; " + maxZ + ")"); + + if (minX <= player.chunkCoordX && maxX >= player.chunkCoordY && minY <= player.chunkCoordY && maxY >= player.chunkCoordY && minZ <= player.chunkCoordZ && maxZ >= player.chunkCoordZ) + return; + // Hide the area - if (!decloak) { - //WarpDrive.debugPrint("[Cloak Packet] Removing " + size + " blocks..."); - - // Now hide the blocks within area - World worldObj = player.worldObj; - int cloakBlockID = (tier == 1) ? WarpDriveConfig.gasID : 0; - int cloakBlockMetadata = (tier == 1) ? 5 : 0; - for (int y = minY; y <= maxY; y++) { - for (int x = minX; x <= maxX; x++) { - for(int z = minZ; z <= maxZ; z++) { - if (worldObj.getBlockId(x, y, z) != 0) { - worldObj.setBlock(x, y, z, cloakBlockID, cloakBlockMetadata, 4); - } - } - } + if (!decloak) + { + //System.out.println("[Cloak Packet] Removing " + size + " blocks..."); + + // Now hide the blocks within area + World worldObj = player.worldObj; + for (int y = minY; y <= maxY; y++) + for (int x = minX; x <= maxX; x++) + for(int z = minZ; z <= maxZ; z++) + if (worldObj.getBlockId(x, y, z) != 0) + worldObj.setBlock(x, y, z, (tier == 1) ? WarpDriveConfig.i.gasID : 0, 5, 4); + + //System.out.println("[Cloak Packet] Removing entity..."); + // Hide any entities inside area + AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(minX, minY, minZ, maxX, maxY, maxZ); + List list = worldObj.getEntitiesWithinAABBExcludingEntity(player, aabb); + for (Entity e : list) + { + worldObj.removeEntity(e); + ((WorldClient)worldObj).removeEntityFromWorld(e.entityId); } - - //WarpDrive.debugPrint("[Cloak Packet] Removing entity..."); - // Hide any entities inside area - AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(minX, minY, minZ, maxX, maxY, maxZ); - List list = worldObj.getEntitiesWithinAABBExcludingEntity(player, aabb); - for (Entity e : list) { - worldObj.removeEntity(e); - ((WorldClient)worldObj).removeEntityFromWorld(e.entityId); - } - } else { // reveal the area - player.worldObj.markBlockRangeForRenderUpdate(minX + 1, minY + 1, minZ + 1, maxX + 1, maxY + 1, maxZ + 1); - - // Make some graphics - int numLasers = 80 + player.worldObj.rand.nextInt(50); - - double centerX = (minX + maxX) / 2.0D; - double centerY = (minY + maxY) / 2.0D; - double centerZ = (minZ + maxZ) / 2.0D; - double radiusX = (maxX - minX) / 2.0D + 5.0D; - double radiusY = (maxY - minY) / 2.0D + 5.0D; - double radiusZ = (maxZ - minZ) / 2.0D + 5.0D; - - for (int i = 0; i < numLasers; i++) { - WarpDrive.proxy.renderBeam(player.worldObj, - new Vector3( - centerX + radiusX * player.worldObj.rand.nextGaussian(), - centerY + radiusY * player.worldObj.rand.nextGaussian(), - centerZ + radiusZ * player.worldObj.rand.nextGaussian()), - new Vector3( - centerX + radiusX * player.worldObj.rand.nextGaussian(), - centerY + radiusY * player.worldObj.rand.nextGaussian(), - centerZ + radiusZ * player.worldObj.rand.nextGaussian()), - player.worldObj.rand.nextFloat(), player.worldObj.rand.nextFloat(), player.worldObj.rand.nextFloat(), - 60 + player.worldObj.rand.nextInt(60), 100); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static void handleLaserTargeting(Packet250CustomPayload packet, EntityPlayer player) - { - DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(packet.data)); + } + else + { // reveal the area + player.worldObj.markBlockRangeForRenderUpdate(minX, minY, minZ, maxX, maxY, maxZ); + + // Make some graphics + int numLasers = 25 + player.worldObj.rand.nextInt(300); + + for (int i = 0; i < numLasers; i++) + { + int randX1 = minX + player.worldObj.rand.nextInt(maxX - minX); + int randX2 = minX + player.worldObj.rand.nextInt(maxX - minX); + + int randY1 = minY + player.worldObj.rand.nextInt(maxY - minY); + int randY2 = minY + player.worldObj.rand.nextInt(maxY - minY); + + int randZ1 = minZ + player.worldObj.rand.nextInt(maxZ - minZ); + int randZ2 = minZ + player.worldObj.rand.nextInt(maxZ - minZ); + + float r = 0, g = 0, b = 0; + + switch (player.worldObj.rand.nextInt(6)) + { + case 0: + r = 1.0f; + g = b = 0; + break; + case 1: + r = b = 0; + g = 1.0f; + break; + case 2: + r = g = 0; + b = 1.0f; + break; + case 3: + r = b = 0.5f; + g = 0; + break; + case 4: + r = g = 1.0f; + b = 0; + break; + case 5: + r = 1.0f; + b = 0.5f; + g = 0f; + } + WarpDrive.proxy.renderBeam(player.worldObj, new Vector3(randX1, randY1, randZ1), new Vector3(randX2, randY2, randZ2), r, g, b, 10, 100); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } - try - { - int x = inputStream.readInt(); - int y = inputStream.readInt(); - int z = inputStream.readInt(); - float yaw = inputStream.readFloat(); - float pitch = inputStream.readFloat(); - WarpDrive.debugPrint("Received target packet: (" + x + "; " + y + "; " + z + ") yaw: " + yaw + " pitch: " + pitch); - TileEntity te = player.worldObj.getBlockTileEntity(x, y, z); - if (te != null && te instanceof TileEntityLaser) { - TileEntityLaser laser = (TileEntityLaser)te; - laser.yaw = yaw; - laser.pitch = pitch; - laser.delayTicks = 0; - laser.isEmitting = true; - } - } - catch (Exception e) - { - e.printStackTrace(); - } + public void handleLaserTargeting(Packet250CustomPayload packet, EntityPlayer player) + { + DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(packet.data)); + + try + { + int x = inputStream.readInt(); + int y = inputStream.readInt(); + int z = inputStream.readInt(); + float yaw = inputStream.readFloat(); + float pitch = inputStream.readFloat(); + System.out.println("Got target packet: (" + x + "; " + y + "; " + z + ") | yaw: " + yaw + " | pitch: " + pitch); + TileEntity te = player.worldObj.getBlockTileEntity(x, y, z); + + if (te != null) + { + System.out.println("TE is NULL"); + + if (te instanceof TileEntityLaser) + { + TileEntityLaser l = (TileEntityLaser)te; + l.yaw = yaw; + l.pitch = pitch; + l.delayTicks = 0; + l.isEmitting = true; + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } } - public static void handleFreqUpdate(Packet250CustomPayload packet, EntityPlayer player) { - DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(packet.data)); + public void handleFreqUpdate(Packet250CustomPayload packet, EntityPlayer player) + { + DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(packet.data)); - try { - int x = inputStream.readInt(); - int y = inputStream.readInt(); - int z = inputStream.readInt(); - int frequency = inputStream.readInt(); -// WarpDrive.debugPrint("Received frequency packet: (" + x + ", " + y + ", " + z + ") frequency '" + frequency + "'"); - TileEntity te = player.worldObj.getBlockTileEntity(x, y, z); - if (te != null) { - if (te instanceof TileEntityMonitor) { - ((TileEntityMonitor)te).setFrequency(frequency); - } else if (te instanceof TileEntityCamera) { - ((TileEntityCamera)te).setFrequency(frequency); - } else if (te instanceof TileEntityLaser) { - ((TileEntityLaser)te).setCameraFrequency(frequency); - } - } - } - catch (Exception e) - { - e.printStackTrace(); - } - } + try + { + int x = inputStream.readInt(); + int y = inputStream.readInt(); + int z = inputStream.readInt(); + int freq = inputStream.readInt(); + //System.out.println("Got freq packet: (" + x + "; " + y + "; " + z + ") | freq: " + freq); + TileEntity te = player.worldObj.getBlockTileEntity(x, y, z); + + if (te != null) + { + if (te instanceof TileEntityMonitor) + { + ((TileEntityMonitor)te).setFrequency(freq); + } + else if (te instanceof TileEntityCamera) + { + ((TileEntityCamera)te).setFrequency(freq); + WarpDrive.instance.cams.updateInRegistry(new CamRegistryItem(freq, new ChunkPosition(x, y, z), player.worldObj).setType(0)); + } + else if (te instanceof TileEntityLaser) + { + ((TileEntityLaser)te).camFreq = freq; + WarpDrive.instance.cams.updateInRegistry(new CamRegistryItem(freq, new ChunkPosition(x, y, z), player.worldObj).setType(1)); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } private void handleBeam(Packet250CustomPayload packet, EntityPlayer player) { DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(packet.data)); + int dimID; Vector3 source, target; double sx, sy, sz; double tx, ty, tz; @@ -207,15 +257,24 @@ public class PacketHandler implements IPacketHandler // Read energy value energy = inputStream.readInt(); - // Render beam -// WarpDrive.debugPrint("Received beam packet from " + source + " to " + target + " as RGB " + r + " " + g + " " + b + " age " + age +" energy " + energy); + // Render beam + /*System.out.println("sx: " + sx + " sy: " + sy + " sz: " + sz); + System.out.println("tx: " + sx + " ty: " + sy + " tz: " + sz); - // To avoid NPE at logging in - if (worldObj == null) - { - WarpDrive.debugPrint("WorldObj is null"); - return; - } + System.out.println("source: " + source); + System.out.println("target: " + target); + System.out.println("r: " + r); + System.out.println("g: " + g); + System.out.println("b " + b); + System.out.println("age: " + age); + System.out.println("energy: " + energy);*/ + + // To avoid NPE at logging in + if (worldObj == null) + { + System.out.println("WorldObj is null"); + return; + } WarpDrive.proxy.renderBeam(worldObj, source.clone(), target.clone(), r, g, b, age, energy); } diff --git a/src/cr0s/WarpDrive/SoundHandler.java b/src/cr0s/WarpDrive/SoundHandler.java index b0993218..c76e5814 100644 --- a/src/cr0s/WarpDrive/SoundHandler.java +++ b/src/cr0s/WarpDrive/SoundHandler.java @@ -5,21 +5,22 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraftforge.client.event.sound.SoundLoadEvent; import net.minecraftforge.event.ForgeSubscribe; -public class SoundHandler { +public class SoundHandler +{ @SideOnly(Side.CLIENT) @ForgeSubscribe - public void onSoundLoad(SoundLoadEvent event) { - try { + public void onSoundLoad(SoundLoadEvent event) + { + try + { System.out.println("[WarpDrive] Registering sound files..."); - event.manager.addSound("warpdrive:warp_4s.ogg"); - event.manager.addSound("warpdrive:warp_10s.ogg"); - event.manager.addSound("warpdrive:warp_30s.ogg"); + event.manager.addSound("warpdrive:warp.ogg"); event.manager.addSound("warpdrive:hilaser.ogg"); event.manager.addSound("warpdrive:midlaser.ogg"); event.manager.addSound("warpdrive:lowlaser.ogg"); - event.manager.addSound("warpdrive:cloak.ogg"); - event.manager.addSound("warpdrive:decloak.ogg"); - } catch (Exception e) { + } + catch (Exception e) + { System.err.println("Failed to register sound: " + e.getLocalizedMessage()); e.printStackTrace(); } diff --git a/src/cr0s/WarpDrive/SpaceEventHandler.java b/src/cr0s/WarpDrive/SpaceEventHandler.java index d47bb72a..3de997a0 100644 --- a/src/cr0s/WarpDrive/SpaceEventHandler.java +++ b/src/cr0s/WarpDrive/SpaceEventHandler.java @@ -1,58 +1,48 @@ package cr0s.WarpDrive; -import ic2.api.item.Items; - import java.util.HashMap; import java.util.List; -import cr0s.WarpDrive.CloakedArea; -import cr0s.WarpDrive.api.IBreathingHelmet; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; -import net.minecraft.world.EnumGameType; -import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.event.ForgeSubscribe; -import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; /** - * + * Обработчик событий в мире Space * @author Cr0s */ -public class SpaceEventHandler { - private HashMap entity_airBlock; - private HashMap player_airTank; - private HashMap player_cloakTicks; +public class SpaceEventHandler +{ + private HashMap vacuumPlayers; + private HashMap cloakPlayersTimers; + private long lastTimer = 0; - private final int CLOAK_CHECK_TIMEOUT_TICKS = 100; - private final int AIR_BLOCK_TICKS = 20; - private final int AIR_TANK_TICKS = 300; - private final int AIR_DROWN_TICKS = 20; + private final int CLOAK_CHECK_TIMEOUT_SEC = 5; - public SpaceEventHandler() { - entity_airBlock = new HashMap(); - player_airTank = new HashMap(); - player_cloakTicks = new HashMap(); + public SpaceEventHandler() + { + vacuumPlayers = new HashMap(); + cloakPlayersTimers = new HashMap(); + this.lastTimer = 0; } @ForgeSubscribe - public void livingUpdate(LivingUpdateEvent event) { + public void livingUpdate(LivingUpdateEvent event) + { EntityLivingBase entity = event.entityLiving; - int x = MathHelper.floor_double(entity.posX); - int y = MathHelper.floor_double(entity.posY); - int z = MathHelper.floor_double(entity.posZ); - - // Instant kill if entity exceeds world's limit - if (x > WarpDrive.WORLD_LIMIT_BLOCKS || z > WarpDrive.WORLD_LIMIT_BLOCKS) { - if (entity instanceof EntityPlayerMP) { - if (((EntityPlayerMP)entity).capabilities.isCreativeMode) { + + if (Math.abs(MathHelper.floor_double(entity.posX)) > WarpDrive.WORLD_LIMIT_BLOCKS || Math.abs(MathHelper.floor_double(entity.posZ)) > WarpDrive.WORLD_LIMIT_BLOCKS) + { + if (entity instanceof EntityPlayerMP) + { + if (((EntityPlayerMP)entity).capabilities.isCreativeMode) + { return; } } @@ -60,193 +50,153 @@ public class SpaceEventHandler { entity.attackEntityFrom(DamageSource.outOfWorld, 9000); return; } - if (entity instanceof EntityPlayerMP) { + if (entity instanceof EntityPlayerMP) updatePlayerCloakState(entity); - - // skip players in creative - if (((EntityPlayerMP)entity).theItemInWorldManager.getGameType() == EnumGameType.CREATIVE) { - return; - } - } - - // skip dead or invulnerable entities - if (entity.isDead || entity.isEntityInvulnerable()) { - return; - } - - // If entity is in vacuum, check and start consuming air cells - if (entity.worldObj.provider.dimensionId == WarpDriveConfig.G_SPACE_DIMENSION_ID || entity.worldObj.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID) { - int id1 = entity.worldObj.getBlockId(x, y, z); - int id2 = entity.worldObj.getBlockId(x, y - 1, z); - boolean inVacuum = (id1 != WarpDriveConfig.airID && id2 != WarpDriveConfig.airID); - Integer air; - if (!inVacuum) {// In space with air blocks - air = entity_airBlock.get(entity.entityId); - if (air == null) { - entity_airBlock.put(entity.entityId, AIR_BLOCK_TICKS); - } else if (air <= 1) {// time elapsed => consume air block - entity_airBlock.put(entity.entityId, AIR_BLOCK_TICKS); - - int metadata; - if (id1 == WarpDriveConfig.airID) { - metadata = entity.worldObj.getBlockMetadata(x, y, z); - if (metadata > 0 && metadata < 15) { - entity.worldObj.setBlockMetadataWithNotify(x, y, z, metadata - 1, 2); - } - } else { - metadata = entity.worldObj.getBlockMetadata(x, y - 1, z); - if (metadata > 0 && metadata < 15) { - entity.worldObj.setBlockMetadataWithNotify(x, y - 1, z, metadata - 1, 2); - } - } - } else { - entity_airBlock.put(entity.entityId, air - 1); - } - } else {// In space without air blocks - // Damage entity if in vacuum without protection - if (entity instanceof EntityPlayerMP) { - EntityPlayerMP player = (EntityPlayerMP)entity; - air = player_airTank.get(player.username); - boolean hasHelmet = false; - ItemStack helmetStack = player.getCurrentArmor(3); - if (helmetStack != null) { - Item helmet = helmetStack.getItem(); - if (helmet instanceof IBreathingHelmet) { - IBreathingHelmet breathHelmet = (IBreathingHelmet)helmet; - if (breathHelmet.canBreath(player)) { - hasHelmet = true; - if (air == null) {// new player in space => grace period - player_airTank.put(player.username, AIR_TANK_TICKS); - } else if (air <= 1) { - if (breathHelmet.removeAir(player)) { - player_airTank.put(player.username, AIR_TANK_TICKS); - } else { - player_airTank.put(player.username, AIR_DROWN_TICKS); - player.attackEntityFrom(DamageSource.drown, 2.0F); - } - } else { - player_airTank.put(player.username, air - 1); - } + // If player in vaccum, check and start consuming air cells + if (entity.worldObj.provider.dimensionId == WarpDrive.instance.spaceDimID || entity.worldObj.provider.dimensionId == WarpDrive.instance.hyperSpaceDimID) + { + boolean inVacuum = isEntityInVacuum(entity); + + // Damage entity if in vacuum without protection + if (inVacuum) + { + if (entity instanceof EntityPlayerMP) + { + + if (((EntityPlayerMP)entity).getCurrentArmor(3) != null && WarpDriveConfig.i.SpaceHelmets.contains(((EntityPlayerMP)entity).getCurrentArmor(3).itemID)) + { + Integer airValue = vacuumPlayers.get(((EntityPlayerMP)entity).username); + + if (airValue == null) + { + vacuumPlayers.put(((EntityPlayerMP)entity).username, 300); + airValue = 300; + } + + if (airValue <= 0) + { + if (consumeO2(((EntityPlayerMP)entity).inventory.mainInventory)) + { + setPlayerAirValue(entity, 300); + ((EntityPlayerMP)entity).inventory.addItemStackToInventory(new ItemStack(WarpDriveConfig.i.IC2_Air[0],1,0)); } - } else if (WarpDriveConfig.SpaceHelmets.contains(helmetStack.itemID)) { - hasHelmet = true; - if (air == null) {// new player in space => grace period - player_airTank.put(player.username, AIR_TANK_TICKS); - } else if (air <= 1) { - if (consumeO2(player.inventory.mainInventory, player)) { - player_airTank.put(player.username, AIR_TANK_TICKS); - } else { - player_airTank.put(player.username, AIR_DROWN_TICKS); - entity.attackEntityFrom(DamageSource.drown, 2.0F); - } - } else { - player_airTank.put(player.username, air - 1); + else + { + setPlayerAirValue(entity, 0); + entity.attackEntityFrom(DamageSource.drown, 1); } } + else + { + setPlayerAirValue(entity, airValue - 1); + } } - - if (!hasHelmet) { - if (air == null) {// new player in space => grace period - player_airTank.put(player.username, AIR_TANK_TICKS); - } else if (air <= 1) { - player_airTank.put(player.username, AIR_DROWN_TICKS); - entity.attackEntityFrom(DamageSource.drown, 2.0F); - } else { - player_airTank.put(player.username, air - 1); - } + else + { + entity.attackEntityFrom(DamageSource.drown, 1); } // If player falling down, teleport on earth - if (entity.posY < -10.0D) { - player.mcServer.getConfigurationManager().transferPlayerToDimension(player, 0, new SpaceTeleporter(DimensionManager.getWorld(WarpDriveConfig.G_SPACE_DIMENSION_ID), 0, x, 250, z)); - player.setFire(30); - player.setPositionAndUpdate(entity.posX, 250.0D, entity.posZ); + if (entity.posY < -10.0D) + { + ((EntityPlayerMP)entity).mcServer.getConfigurationManager().transferPlayerToDimension(((EntityPlayerMP) entity), 0, new SpaceTeleporter(DimensionManager.getWorld(WarpDrive.instance.spaceDimID), 0, MathHelper.floor_double(entity.posX), 250, MathHelper.floor_double(entity.posZ))); + ((EntityPlayerMP)entity).setFire(30); + ((EntityPlayerMP)entity).setPositionAndUpdate(entity.posX, 250D, entity.posZ); } - } else { - entity_airBlock.put(entity.entityId, 0); - entity.attackEntityFrom(DamageSource.drown, 2.0F); + } + else + { + entity.attackEntityFrom(DamageSource.drown, 1); } } } } - private void updatePlayerCloakState(EntityLivingBase entity) { + private void updatePlayerCloakState(EntityLivingBase entity) + { + // Make sure for elapsed time is second after last update + if (System.currentTimeMillis() - this.lastTimer > 1000) + lastTimer = System.currentTimeMillis(); + else + return; + try { - EntityPlayerMP player = (EntityPlayerMP)entity; - Integer cloakTicks = player_cloakTicks.get(player.username); + EntityPlayerMP p = (EntityPlayerMP)entity; + Integer cloakTicks = this.cloakPlayersTimers.get(p.username); - if (cloakTicks == null) { - player_cloakTicks.put(player.username, 0); + if (cloakTicks == null) + { + this.cloakPlayersTimers.remove(p.username); + this.cloakPlayersTimers.put(p.username, 0); + return; } - if (cloakTicks >= CLOAK_CHECK_TIMEOUT_TICKS) { - player_cloakTicks.put(player.username, 0); + if (cloakTicks >= CLOAK_CHECK_TIMEOUT_SEC) + { + this.cloakPlayersTimers.remove(p.username); + this.cloakPlayersTimers.put(p.username, 0); - List cloaks = WarpDrive.instance.cloaks.getCloaksForPoint(player.worldObj.provider.dimensionId, MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ), false); - if (cloaks.size() != 0) { - //WarpDrive.debugPrint("[Cloak] Player inside " + cloaks.size() + " cloaked areas"); - for (CloakedArea area : cloaks) { - //WarpDrive.debugPrint("[Cloak] Frequency: " + area.frequency + ". In: " + area.isPlayerInArea(p) + ", W: " + area.isPlayerWithinArea(p)); - if (!area.isPlayerInArea(player.username) && area.isEntityWithinArea(player)) { - area.playerEnteringCloakedArea(player); + List cloaks = WarpDrive.instance.cloaks.getCloaksForPoint(p.worldObj.provider.dimensionId, MathHelper.floor_double(p.posX), MathHelper.floor_double(p.posY), MathHelper.floor_double(p.posZ), false); + if (cloaks.size() != 0) + { + //System.out.println("[Cloak] Player inside " + cloaks.size() + " cloaked areas"); + for (CloakedArea area : cloaks) + { + //System.out.println("[Cloak] Frequency: " + area.frequency + ". In: " + area.isPlayerInArea(p) + ", W: " + area.isPlayerWithinArea(p)); + if (!area.isPlayerInArea(p) && area.isPlayerWithinArea(p)) + { + WarpDrive.instance.cloaks.playerEnteringCloakedArea(area, p); } } - } else { - //WarpDrive.debugPrint("[Cloak] Player is not inside any cloak fields. Check, which field player may left..."); - WarpDrive.instance.cloaks.checkPlayerLeftArea(player); + } else + { + //System.out.println("[Cloak] Player is not inside any cloak fields. Check, which field player may left..."); + WarpDrive.instance.cloaks.checkPlayerLeavedArea(p); } - } else { - player_cloakTicks.put(player.username, cloakTicks + 1); } - } catch (Exception e) { - e.printStackTrace(); - } + else + { + this.cloakPlayersTimers.remove(p.username); + this.cloakPlayersTimers.put(p.username, cloakTicks + 1); + } + } catch (Exception e) { e.printStackTrace(); } } - private static boolean consumeO2(ItemStack[] inventory, EntityPlayerMP entityPlayer) { - for (int j = 0; j < inventory.length; ++j) { - if (inventory[j] != null && inventory[j].itemID == WarpDriveConfig.IC2_Air[0] && inventory[j].getItemDamage() == WarpDriveConfig.IC2_Air[1]) { - inventory[j].stackSize--; - if (inventory[j].stackSize <= 0) { - inventory[j] = null; - } + private void setPlayerAirValue(EntityLivingBase entity, Integer air) + { + vacuumPlayers.remove(((EntityPlayerMP)entity).username); + vacuumPlayers.put(((EntityPlayerMP)entity).username, air); + } - if (WarpDriveConfig.IC2_Empty.length != 0) { -// WarpDrive.debugPrint("giveEmptyCell"); - ItemStack emptyCell = new ItemStack(WarpDriveConfig.IC2_Empty[0], 1, WarpDriveConfig.IC2_Empty[1]); - if (!entityPlayer.inventory.addItemStackToInventory(emptyCell)) { - World world = entityPlayer.worldObj; - EntityItem itemEnt = new EntityItem(world, entityPlayer.posX, entityPlayer.posY, entityPlayer.posZ, emptyCell); - entityPlayer.worldObj.spawnEntityInWorld(itemEnt); - } - } + /** + * Проверка, находится ли Entity в открытом космосе + * @param e + * @return + */ + private boolean isEntityInVacuum(Entity e) + { + int x = MathHelper.floor_double(e.posX); + int y = MathHelper.floor_double(e.posY); + int z = MathHelper.floor_double(e.posZ); + int id1 = e.worldObj.getBlockId(x, y, z); + int id2 = e.worldObj.getBlockId(x, y + 1, z); + + if (id1 == WarpDriveConfig.i.airID || id2 == WarpDriveConfig.i.airID) + return false; + return true; + } + + private boolean consumeO2(ItemStack[] i) + { + for (int j = 0; j < i.length; ++j) + if (i[j] != null && i[j].itemID == WarpDriveConfig.i.IC2_Air[0] && i[j].getItemDamage() == WarpDriveConfig.i.IC2_Air[1]) + { + if (--i[j].stackSize <= 0) + i[j] = null; return true; } - } return false; } - - @ForgeSubscribe - public void livingFall(LivingFallEvent event) - { - EntityLivingBase entity = event.entityLiving; - float distance = event.distance; - - if (entity instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) entity; - int check = MathHelper.ceiling_float_int(distance - 3.0F); - - if (check > 0) - { - if ((player.getCurrentArmor(0) != null && player.getCurrentArmor(0).itemID == Items.getItem("quantumBoots").itemID) || - (player.getCurrentArmor(2) != null && WarpDriveConfig.Jetpacks.contains(player.getCurrentArmor(2).itemID))) - { - event.setCanceled(true); // Don't damage player - } - } - } - } } diff --git a/src/cr0s/WarpDrive/SpaceGenerator.java b/src/cr0s/WarpDrive/SpaceGenerator.java index 374dd39f..784e0cd5 100644 --- a/src/cr0s/WarpDrive/SpaceGenerator.java +++ b/src/cr0s/WarpDrive/SpaceGenerator.java @@ -35,7 +35,7 @@ public class SpaceGenerator extends ChunkProviderGenerate implements IChunkProvi @Override public Chunk provideChunk(int par1, int par2) { - this.rand.setSeed(par1 * 341873128712L + par2 * 132897987541L); + this.rand.setSeed((long) par1 * 341873128712L + (long) par2 * 132897987541L); byte[] var3 = new byte[32768]; generateTerrain(par1, par2, var3); //this.caveGenerator.generate(this, this.worldObj, par1, par2, var3); @@ -156,7 +156,8 @@ public class SpaceGenerator extends ChunkProviderGenerate implements IChunkProvi } @Override - public List getPossibleCreatures(EnumCreatureType var1, int var2, int var3, int var4) + public List getPossibleCreatures(EnumCreatureType var1, int var2, int var3, + int var4) { // TODO Auto-generated method stub return null; diff --git a/src/cr0s/WarpDrive/SpaceProvider.java b/src/cr0s/WarpDrive/SpaceProvider.java index 3b991da4..88ea3e0c 100644 --- a/src/cr0s/WarpDrive/SpaceProvider.java +++ b/src/cr0s/WarpDrive/SpaceProvider.java @@ -2,6 +2,7 @@ package cr0s.WarpDrive; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.ChunkCoordinates; @@ -109,7 +110,7 @@ public class SpaceProvider extends WorldProvider for (int var2 = 0; var2 <= 15; ++var2) { - float var3 = 1.0F - var2 / 15.0F; + float var3 = 1.0F - (float)var2 / 15.0F; this.lightBrightnessTable[var2] = (1.0F - var3) / (var3 * 3.0F + 1.0F) * (1.0F - var1) + var1; } } @@ -132,14 +133,14 @@ public class SpaceProvider extends WorldProvider { setCloudRenderer(new CloudRenderBlank()); //setSkyRenderer(new SpaceSkyRenderer()); - return this.worldObj.getWorldVec3Pool().getVecFromPool(0.0D, 0.0D, 0.0D); + return this.worldObj.getWorldVec3Pool().getVecFromPool((double) 0, (double) 0, (double) 0); } @SideOnly(Side.CLIENT) @Override public Vec3 getFogColor(float par1, float par2) { - return this.worldObj.getWorldVec3Pool().getVecFromPool(0.0D, 0.0D, 0.0D); + return this.worldObj.getWorldVec3Pool().getVecFromPool((double) 0, (double) 0, (double) 0); } @SideOnly(Side.CLIENT) diff --git a/src/cr0s/WarpDrive/SpaceSkyRenderer.java b/src/cr0s/WarpDrive/SpaceSkyRenderer.java index df9c791f..70e4077b 100644 --- a/src/cr0s/WarpDrive/SpaceSkyRenderer.java +++ b/src/cr0s/WarpDrive/SpaceSkyRenderer.java @@ -264,12 +264,12 @@ public class SpaceSkyRenderer extends IRenderHandler var2.draw(); } - private static Vec3 getCustomSkyColor() + private Vec3 getCustomSkyColor() { return Vec3.fakePool.getVecFromPool(0.26796875D, 0.1796875D, 0.0D); } - public static float getSkyBrightness(float par1) + public float getSkyBrightness(float par1) { final float var2 = FMLClientHandler.instance().getClient().theWorld.getCelestialAngle(par1); float var3 = 1.0F - (MathHelper.sin(var2 * (float) Math.PI * 2.0F) * 2.0F + 0.25F); diff --git a/src/cr0s/WarpDrive/SpaceTpCommand.java b/src/cr0s/WarpDrive/SpaceTpCommand.java index 51df1238..c9c1e276 100644 --- a/src/cr0s/WarpDrive/SpaceTpCommand.java +++ b/src/cr0s/WarpDrive/SpaceTpCommand.java @@ -7,49 +7,53 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.util.MathHelper; import net.minecraft.world.WorldServer; -public class SpaceTpCommand extends CommandBase { +public class SpaceTpCommand extends CommandBase +{ @Override - public int getRequiredPermissionLevel() { + public int getRequiredPermissionLevel() + { return 2; } @Override - public String getCommandName() { + public String getCommandName() + { return "space"; } @Override - public void processCommand(ICommandSender icommandsender, String[] astring) { - EntityPlayerMP player = null; + public void processCommand(ICommandSender icommandsender, String[] astring) + { + EntityPlayerMP player = (EntityPlayerMP)icommandsender; MinecraftServer server = MinecraftServer.getServer(); - int targetDim = WarpDriveConfig.G_SPACE_DIMENSION_ID; + int targetDim = WarpDrive.instance.spaceDimID; - if (icommandsender != null && icommandsender instanceof EntityPlayerMP) { - player = (EntityPlayerMP)icommandsender; - } - if (astring.length >= 1) { - if ("hyper".equals(astring[0])) { - targetDim = WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID; - } else if ("overworld".equals(astring[0])) { - targetDim = 0; - } else { + if (astring.length >= 1) + { + if ("hyper".equals(astring[0])) + { + targetDim = WarpDrive.instance.hyperSpaceDimID; + } + else + { + notifyAdmins(icommandsender, "/space: teleporting player " + astring[0] + " to space", new Object[0]); player = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(astring[0]); } } - if (player == null) { - notifyAdmins(icommandsender, "/space: undefined player"); - return; + if (player == null) + { + return; } - WorldServer targetWorld = server.worldServerForDimension(targetDim); - notifyAdmins(icommandsender, "/space: teleporting player " + player.getDisplayName() + " to " + targetDim + ":" + targetWorld.getWorldInfo().getWorldName(), new Object[0]); - SpaceTeleporter teleporter = new SpaceTeleporter(targetWorld, 0, MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ)); + WorldServer to = server.worldServerForDimension(targetDim); + SpaceTeleporter teleporter = new SpaceTeleporter(to, 0, MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ)); server.getConfigurationManager().transferPlayerToDimension(player, targetDim, teleporter); } @Override - public String getCommandUsage(ICommandSender icommandsender) { - return "/space [hyper|overworld|]"; + public String getCommandUsage(ICommandSender icommandsender) + { + return "/space [hyper|]"; } } diff --git a/src/cr0s/WarpDrive/SpaceWorldGenerator.java b/src/cr0s/WarpDrive/SpaceWorldGenerator.java index 30582863..8b129202 100644 --- a/src/cr0s/WarpDrive/SpaceWorldGenerator.java +++ b/src/cr0s/WarpDrive/SpaceWorldGenerator.java @@ -1,9 +1,10 @@ package cr0s.WarpDrive; +import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.IWorldGenerator; - import java.util.Random; - +import java.util.List; +import java.util.ArrayList; import net.minecraft.block.Block; import net.minecraft.world.World; import net.minecraft.world.chunk.IChunkProvider; @@ -39,7 +40,7 @@ public class SpaceWorldGenerator implements IWorldGenerator @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { - if (world.provider.dimensionId != WarpDriveConfig.G_SPACE_DIMENSION_ID) + if (world.provider.dimensionId != WarpDrive.instance.spaceDimID) return; int x = (chunkX * 16) + (5 - random.nextInt(10)); int z = (chunkZ * 16) + (5 - random.nextInt(10)); @@ -47,294 +48,233 @@ public class SpaceWorldGenerator implements IWorldGenerator return; int y = Y_LIMIT_DOWN + random.nextInt(Y_LIMIT - Y_LIMIT_DOWN); // Moon setup - if (random.nextInt(700) == 1) + if (random.nextInt(8000) == 1) generateMoon(world, x, y, z); // Simple asteroids - else if (random.nextInt(150) == 1) { - generateAsteroidOfBlock(world, x, y, z, 6, 11, -1, 0); + else if (random.nextInt(500) == 1) + generateAsteroid(world, x, y, z, 6, 11); // Random asteroid of block - } else if (random.nextInt(400) == 1) { + else if (random.nextInt(1000) == 1) + { generateRandomAsteroid(world, x, y, z, 6, 11); - if (random.nextBoolean()) { + if (random.nextBoolean()) generateGasCloudOfColor(world, x, y, z, 6, 11, random.nextInt(12)); - } - } else if (random.nextInt(200) == 1) {// Ice asteroid + } + // Ice asteroid + else if (random.nextInt(2000) == 1) generateAsteroidOfBlock(world, x, y, z, 6, 11, Block.ice.blockID, 0); - } else if (random.nextInt(500) == 1) {// Asteroid field + // Asteroid field + else if (random.nextInt(3500) == 1) generateAsteroidField(world, x, y, z); - } else if (random.nextInt(1400) == 1) {// Diamond asteroid - generateAsteroidOfBlock(world, x, y, z, 3, 2, Block.oreDiamond.blockID, 0); + // Diamond asteroid + else if (random.nextInt(10000) == 1) + { + generateAsteroidOfBlock(world, x, y, z, 4, 6, Block.oreDiamond.blockID, 0); // Diamond block core world.setBlock(x, y, z, Block.blockDiamond.blockID, 0, 2); - if (random.nextBoolean()) { + if (random.nextBoolean()) + generateGasCloudOfColor(world, x, y, z, 6, 11, random.nextInt(12)); + } + // Quartz asteroid + else if (WarpDriveConfig.i.isAELoaded && random.nextInt(20000) == 1) + { + generateAsteroidOfBlock(world, x, y, z, 4, 6, WarpDriveConfig.i.getAEBlock("blkQuartzOre").itemID, WarpDriveConfig.i.getAEBlock("blkQuartzOre").getItemDamage()); + if (random.nextBoolean()) generateGasCloudOfColor(world, x, y, z, 6, 11, random.nextInt(12)); - } - } else if (WarpDriveConfig.isAppliedEnergisticsLoaded && random.nextInt(1600) == 1) {// Quartz asteroid - generateAsteroidOfBlock(world, x, y, z, 3, 2, WarpDriveConfig.getAEBlock("blkQuartzOre").itemID, WarpDriveConfig.getAEBlock("blkQuartzOre").getItemDamage()); - if (random.nextBoolean()) { - generateGasCloudOfColor(world, x, y, z, 4, 7, random.nextInt(12)); - } } } - public static void generateMoon(World world, int x, int y, int z) { - int coreRadius = 5 + world.rand.nextInt(12); - int moonRadius = coreRadius + 5 + world.rand.nextInt(26); - int y2 = Math.max(moonRadius + 6, Math.min(y, 255 - moonRadius - 6)); - System.out.println("Generating moon at " + x + " " + y2 + " " + z); - - int[] block = WarpDriveConfig.getDefaultSurfaceBlock(world.rand, world.rand.nextInt(10) > 8, true); - + public void generateMoon(World world, int x, int y, int z) + { + System.out.println("Generating moon at " + x + " " + y + " " + z); + int t = generateSphereEntity(world, x, y, z, MOON_RADIUS, false, 0, 0); // Generate moon's core - if (block[0] == Block.netherrack.blockID) { - generateSphereDirect(world, x, y2, z, coreRadius, false, Block.lavaStill.blockID, 0, false); // Lava core - world.setBlock(x, y2, z, Block.bedrock.blockID, 0, 0); - } else if (block[0] != Block.whiteStone.blockID) { - if (world.rand.nextInt(100) >= 10) { - generateSphereDirect(world, x, y2, z, coreRadius, false, Block.lavaStill.blockID, 0, false); // Lava core - world.setBlock(x, y2, z, Block.bedrock.blockID, 0, 0); - generateSphereDirect(world, x, y2, z, coreRadius + 1, false, Block.obsidian.blockID, 0, true); // Obsidian shell - } else { - coreRadius = Math.max(coreRadius, 7); - generateSphereDirect(world, x, y2, z, coreRadius, false, Block.leaves.blockID, 0, false); - world.setBlock(x, y2, z, Block.bedrock.blockID, 0, 0); - generateSmallShip(world, x, y2, z, coreRadius - 6); + if (t == Block.netherrack.blockID) + generateSphere2(world, x, y, z, MOON_CORE_RADIUS, false, Block.lavaStill.blockID, 0, false); // Lava core + else if (t != Block.whiteStone.blockID) + { + if (world.rand.nextInt(10) > 2) + { + generateSphere2(world, x, y, z, MOON_CORE_RADIUS, false, Block.lavaStill.blockID, 0, false); // Lava core + generateSphere2(world, x, y, z, MOON_CORE_RADIUS + 1, false, Block.obsidian.blockID, 0, true); // Obsidian shell + } + else + { + generateSphere2(world, x, y, z, MOON_CORE_RADIUS, false, 0, 0, false); + generateSmallShip(world, x, y, z); } } - - // Place bedrock blocks - world.setBlock(x + coreRadius , y2 , z , Block.bedrock.blockID, 0, 0); - world.setBlock(x - coreRadius , y2 , z , Block.bedrock.blockID, 0, 0); - world.setBlock(x , y2 , z + coreRadius , Block.bedrock.blockID, 0, 0); - world.setBlock(x , y2 , z - coreRadius , Block.bedrock.blockID, 0, 0); - world.setBlock(x , y2 + coreRadius , z , Block.bedrock.blockID, 0, 0); - world.setBlock(x , y2 - coreRadius , z , Block.bedrock.blockID, 0, 0); - world.setBlock(x + moonRadius / 2 , y2 , z , Block.bedrock.blockID, 0, 0); - world.setBlock(x - moonRadius / 2 , y2 , z , Block.bedrock.blockID, 0, 0); - world.setBlock(x , y2 , z + moonRadius / 2 , Block.bedrock.blockID, 0, 0); - world.setBlock(x , y2 , z - moonRadius / 2 , Block.bedrock.blockID, 0, 0); - world.setBlock(x , y2 + moonRadius / 2 , z , Block.bedrock.blockID, 0, 0); - world.setBlock(x , y2 - moonRadius / 2 , z , Block.bedrock.blockID, 0, 0); - world.setBlock(x + moonRadius - 10, y2 , z , Block.bedrock.blockID, 0, 0); - world.setBlock(x - moonRadius + 10, y2 , z , Block.bedrock.blockID, 0, 0); - world.setBlock(x , y2 , z + moonRadius - 10, Block.bedrock.blockID, 0, 0); - world.setBlock(x , y2 , z - moonRadius + 10, Block.bedrock.blockID, 0, 0); - world.setBlock(x , y2 + moonRadius - 10, z , Block.bedrock.blockID, 0, 0); - world.setBlock(x , y2 - moonRadius + 10, z , Block.bedrock.blockID, 0, 0); - // Generate moon's blocks - generateSphereEntity(world, x, y2, z, moonRadius, false, block[0], block[1], true); // Generate moon's atmosphere - if (world.rand.nextBoolean()) { - generateGasSphereEntity(world, x, y2, z, moonRadius + 2 + world.rand.nextInt(5), true, world.rand.nextInt(12)); - } + if (world.rand.nextBoolean()) + generateGasSphereEntity(world, x, y, z, MOON_RADIUS + 5, true, 1 + world.rand.nextInt(11)); + // Place bedrock blocks + world.setBlock(x, y, z, Block.bedrock.blockID, 0, 0); + world.setBlock(x + MOON_CORE_RADIUS, y, z, Block.bedrock.blockID, 0, 0); + world.setBlock(x - MOON_CORE_RADIUS, y, z, Block.bedrock.blockID, 0, 0); + world.setBlock(x, y, z + MOON_CORE_RADIUS, Block.bedrock.blockID, 0, 0); + world.setBlock(x, y, z - MOON_CORE_RADIUS, Block.bedrock.blockID, 0, 0); + world.setBlock(x, y + MOON_CORE_RADIUS, z, Block.bedrock.blockID, 0, 0); + world.setBlock(x, y - MOON_CORE_RADIUS, z, Block.bedrock.blockID, 0, 0); + world.setBlock(x + MOON_RADIUS / 2, y, z, Block.bedrock.blockID, 0, 0); + world.setBlock(x - MOON_RADIUS / 2, y, z, Block.bedrock.blockID, 0, 0); + world.setBlock(x, y, z + MOON_RADIUS / 2, Block.bedrock.blockID, 0, 0); + world.setBlock(x, y, z - MOON_RADIUS / 2, Block.bedrock.blockID, 0, 0); + world.setBlock(x, y + MOON_RADIUS / 2, z, Block.bedrock.blockID, 0, 0); + world.setBlock(x, y - MOON_RADIUS / 2, z, Block.bedrock.blockID, 0, 0); + world.setBlock(x + MOON_RADIUS - 10, y, z, Block.bedrock.blockID, 0, 0); + world.setBlock(x - MOON_RADIUS + 10, y, z, Block.bedrock.blockID, 0, 0); + world.setBlock(x, y, z + MOON_RADIUS - 10, Block.bedrock.blockID, 0, 0); + world.setBlock(x, y, z - MOON_RADIUS + 10, Block.bedrock.blockID, 0, 0); + world.setBlock(x, y + MOON_RADIUS - 10, z, Block.bedrock.blockID, 0, 0); + world.setBlock(x, y - MOON_RADIUS + 10, z, Block.bedrock.blockID, 0, 0); } - private static void placeStarCore(World world, int x, int y, int z, int radius) { + private void placeStarCore(World world, int x, int y, int z, int radius) + { EntityStarCore core = new EntityStarCore(world, x, y, z, radius); core.xCoord = x; core.yCoord = y; core.zCoord = z; - core.setPosition(x, y, z); + core.setPosition((double)x, (double)y, (double)z); world.spawnEntityInWorld(core); } - - public void generateStar(World world, int x, int y, int z, Integer type) { - Integer starClass = type == -1 ? world.rand.nextInt(3) : type; - Integer y2 = y; + public void generateStar(World world, int x, int y, int z) + { + int starClass = world.rand.nextInt(3); System.out.println("Generating star (class " + starClass + ") at " + x + " " + y + " " + z); - switch (starClass) { + switch (starClass) + { case 0: // red dwarf - y2 = Math.max(RED_DWARF_RADIUS + 6, Math.min(y, 255 - RED_DWARF_RADIUS - 6)); - generateSphereEntity(world, x, y2, z, RED_DWARF_RADIUS, false, Block.blockRedstone.blockID, 0, false); + generateSphereEntity(world, x, y, z, RED_DWARF_RADIUS, false, Block.blockRedstone.blockID, 0); // Heliosphere of red gas - generateGasSphereEntity(world, x, y2, z, RED_DWARF_RADIUS + 6, true, 1); - placeStarCore(world, x, y2, z, RED_DWARF_RADIUS + 6); + generateGasSphereEntity(world, x, y, z, RED_DWARF_RADIUS + 6, true, 1); + placeStarCore(world, x, y, z, RED_DWARF_RADIUS + 6); break; - case 1: - y2 = Math.max(YELLOW_GIANT_RADIUS + 6, Math.min(y, 255 - YELLOW_GIANT_RADIUS - 6)); - generateSphereEntity(world, x, y2, z, YELLOW_GIANT_RADIUS, false, Block.glowStone.blockID, 0, false); + case 1: // yellow giant + generateSphereEntity(world, x, y, z, YELLOW_GIANT_RADIUS, false, Block.glowStone.blockID, 0); // Heliosphere of yellow gas - generateGasSphereEntity(world, x, y2, z, YELLOW_GIANT_RADIUS + 6, true, 3); - placeStarCore(world, x, y2, z, YELLOW_GIANT_RADIUS + 6); + generateGasSphereEntity(world, x, y, z, YELLOW_GIANT_RADIUS + 6, true, 3); + placeStarCore(world, x, y, z, YELLOW_GIANT_RADIUS + 6); break; case 2: - y2 = Math.max(YELLOW_SUPERGIANT_RADIUS + 6, Math.min(y, 255 - YELLOW_SUPERGIANT_RADIUS - 6)); - generateSphereEntity(world, x, y2, z, YELLOW_SUPERGIANT_RADIUS, false, Block.glowStone.blockID, 0, false); + generateSphereEntity(world, x, y, z, YELLOW_SUPERGIANT_RADIUS, false, Block.glowStone.blockID, 0); // Heliosphere of yellow gas - generateGasSphereEntity(world, x, y2, z, YELLOW_SUPERGIANT_RADIUS + 6, true, 3); - placeStarCore(world, x, y2, z, YELLOW_SUPERGIANT_RADIUS + 6); + generateGasSphereEntity(world, x, y, z, YELLOW_SUPERGIANT_RADIUS + 6, true, 3); + placeStarCore(world, x, y, z, YELLOW_SUPERGIANT_RADIUS + 6); break; } } - private static void generateSphereEntity(World world, int x, int y, int z, int radius, boolean hollow, int blockID, int blockMeta, boolean generateOres) { - EntitySphereGen esg = new EntitySphereGen(world, x, y, z, radius, blockID, blockMeta, hollow, true, generateOres); + private int generateSphereEntity(World world, int x, int y, int z, int radius, boolean hollow, int blockID, int blockMeta) + { + EntitySphereGen esg = new EntitySphereGen(world, x, y, z, radius, blockID, blockMeta, hollow, false); + esg.xCoord = x; + esg.yCoord = y; + esg.zCoord = z; + world.spawnEntityInWorld(esg); + return esg.defaultBlock[0]; + } + + private void generateGasSphereEntity(World world, int x, int y, int z, int radius, boolean hollow, int color) + { + EntitySphereGen esg = new EntitySphereGen(world, x, y, z, radius, WarpDriveConfig.i.gasID, color, hollow, true); + esg.xCoord = x; + esg.yCoord = y; + esg.zCoord = z; world.spawnEntityInWorld(esg); } - private static void generateGasSphereEntity(World world, int x, int y, int z, int radius, boolean hollow, int color) { - EntitySphereGen esg = new EntitySphereGen(world, x, y, z, radius, WarpDriveConfig.gasID, color, hollow, true, false); - world.spawnEntityInWorld(esg); + private void generateSmallShip(World world, int x, int y, int z) + { + x = x + (((world.rand.nextBoolean()) ? -1 : 1) * world.rand.nextInt(10)); + y = y + (((world.rand.nextBoolean()) ? -1 : 1) * world.rand.nextInt(10)); + z = z + (((world.rand.nextBoolean()) ? -1 : 1) * world.rand.nextInt(10)); + System.out.println("Generating small ship at " + x + " " + y + " " + z); + new WorldGenSmallShip(world.rand.nextBoolean()).generate(world, world.rand, x, y, z); } - private static void generateSmallShip(World world, int x, int y, int z, int jitter) { - int x2 = x + (((world.rand.nextBoolean()) ? -1 : 1) * world.rand.nextInt(jitter)); - int y2 = y + (((world.rand.nextBoolean()) ? -1 : 1) * world.rand.nextInt(jitter)); - int z2 = z + (((world.rand.nextBoolean()) ? -1 : 1) * world.rand.nextInt(jitter)); - System.out.println("Generating small ship at " + x2 + "," + y2 + "," + z2); - new WorldGenSmallShip(world.rand.nextBoolean()).generate(world, world.rand, x2, y2, z2); - } - - public static void generateRandomAsteroid(World world, int x, int y, int z, int asteroidSizeMax, int centerRadiusMax) { - if (world.rand.nextInt(30) == 1) { + private void generateRandomAsteroid(World world, int x, int y, int z, int asteroidSizeMax, int centerRadiusMax) + { + if (world.rand.nextInt(30) == 1) + { int[] t = new int[] {0, 0}; - if (world.rand.nextInt(25) == 1) { - while(t[0] == 0) { - t = WarpDriveConfig.getRandomNetherBlock(world.rand, 0, 0); - } - } else if (world.rand.nextInt(35) == 1) { - while(t[0] == 0) { - t = WarpDriveConfig.getRandomEndBlock(world.rand, 0, 0); - } - } else { - while(t[0] == 0) { - t = WarpDriveConfig.getRandomOverworldBlock(world.rand, 0, 0); - } - } - generateAsteroidOfBlock(world, x, y, z, Math.min(3, asteroidSizeMax), Math.min(2, centerRadiusMax), t[0], t[1]); - } else { - generateAsteroidOfBlock(world, x, y, z, asteroidSizeMax, centerRadiusMax, -1, 0); + if (world.rand.nextInt(25) == 1) + while(t[0] == 0) + t = WarpDriveConfig.i.getRandomNetherBlock(world.rand, 0, 0); + else if (world.rand.nextInt(50) == 1) + while(t[0] == 0) + t = WarpDriveConfig.i.getRandomEndBlock(world.rand, 0, 0); + else + while(t[0] == 0) + t = WarpDriveConfig.i.getRandomOverworldBlock(world.rand, 0, 0); + generateAsteroidOfBlock(world, x, y, z, asteroidSizeMax, centerRadiusMax, t[0], t[1]); } + else + generateAsteroid(world, x, y, z, asteroidSizeMax, centerRadiusMax); } - private static float binomialRandom(World world) { - float linear = world.rand.nextFloat(); - // ideal sphere repartition = x ^ 0.5 (sqrt) - // Dilution but slow to compute = 0.5 * ( x ^ 0.3 + 1 + (x - 1) ^ 3 ) - // Optimized 'pushed out' form = 1.25 - 0.625 / (0.5 + 2 * x) - // Natural sphere with ring = (1 - x ^ 2.5) * x ^ 0.5 + x ^ 4 - - // rectangular approach: return 0.5F * linear + 0.5F * linear * linear; - return 1.25F - 0.625F / (0.5F + 2.0F * linear); - } - public static void generateAsteroidField(World world, int x, int y1, int z) { - LocalProfiler.start("SpaceWorldGenerator.generateAsteroidField"); - // 6.0.1 au = 120 radius with 60 to 140 big + 60 to 140 small + 5 to 13 gaz - // 45238 blocks surface with 120 to 280 asteroids => 161 to 376 blocks per asteroid (big & small) - - // 6.0.2 av big = 80 to 180 radius with 40 to 90 big + 80 to 200 small + 5 to 13 gaz - // 20106 to 101787 surface with 120 to 290 asteroids => 69 to 848 blocks per asteroid - - // 6.0.2 av small = 30 to 80 radius with 2 to 22 big + 15 to 75 small + 0 to 3 gaz - // 2827 to 20106 surface with 17 to 97 asteroids => 29 to 1182 blocks per asteroid - - // random distanced one = 89727 surface 256 asteroids => 350 blocks per asteroid - - /* - boolean isBig = world.rand.nextInt(3) == 1; - int numOfBigAsteroids, numOfSmallAsteroids, numOfClouds, maxDistance, maxHeight; - if (isBig) { - numOfBigAsteroids = 40 + world.rand.nextInt(50); - numOfSmallAsteroids = 80 + world.rand.nextInt(120); - numOfClouds = 5 + world.rand.nextInt(8); - maxDistance = 80 + world.rand.nextInt(100); - maxHeight = 40 + world.rand.nextInt(40); - } else { - numOfBigAsteroids = 2 + world.rand.nextInt(20); - numOfSmallAsteroids = 15 + world.rand.nextInt(60); - numOfClouds = 0 + world.rand.nextInt(3); - maxDistance = 30 + world.rand.nextInt(50); - maxHeight = 30 + world.rand.nextInt(30); - }/**/ - - float surfacePerAsteroid = 80.0F + world.rand.nextFloat() * 300; - int maxDistance = 30 + world.rand.nextInt(170); - int maxDistanceBig = Math.round(maxDistance * (0.6F + 0.2F * world.rand.nextFloat())); - int maxDistanceSmall = Math.round(maxDistance * 1.1F); - float bigRatio = 0.3F + world.rand.nextFloat() * 0.3F; - float surfaceBig = (float) (Math.PI * Math.pow(maxDistanceBig, 2)); - float surfaceSmall = (float) (Math.PI * Math.pow(maxDistanceSmall, 2)); - int numOfBigAsteroids = Math.round(bigRatio * surfaceBig / surfacePerAsteroid); - int numOfSmallAsteroids = Math.round((1.0F - bigRatio) * surfaceSmall / surfacePerAsteroid); - int numOfClouds = Math.round(numOfBigAsteroids * 1.0F / (10.0F + world.rand.nextInt(10))); - int maxHeight = 70 + world.rand.nextInt(50); - int y2 = Math.min(240 - maxHeight, Math.max(y1, maxHeight)); - System.out.println("Generating asteroid field at " + x + "," + y2 + "," + z - + " qty " + numOfBigAsteroids + ", " + numOfSmallAsteroids + ", " + numOfClouds - + " over " + maxDistance + ", " + maxHeight + " surfacePerAsteroid " + String.format("%.1f", surfacePerAsteroid)); - + /** + * Asteroid field generator + * @param world мир + * @param x координата центра поля + * @param y координата центра поля + * @param z координата центра поля + */ + public void generateAsteroidField(World world, int x, int y, int z) + { + int numOfAsteroids = 15 + world.rand.nextInt(30); + int numOfClouds = 5 + world.rand.nextInt(10); + // Minimal distance between asteroids in field + final int FIELD_ASTEROID_MIN_DISTANCE = 5; + // Maximum distance + final int FIELD_ASTEROID_MAX_DISTANCE = 100; // Setting up of big asteroids - for (int i = 1; i <= numOfBigAsteroids; i++) { - float binomial = binomialRandom(world); - double bearing = world.rand.nextFloat() * 2.0D * Math.PI; - double yawn = world.rand.nextFloat() * Math.PI; - float horizontalRange = Math.max(6.0F, binomial * maxDistanceBig); - float verticalRange = Math.max(3.0F, binomial * maxHeight); - - int aX = (int) (x + Math.round(horizontalRange * Math.cos(bearing))); - int aY = (int) (y2 + Math.round(verticalRange * Math.cos(yawn))); - int aZ = (int) (z + Math.round(horizontalRange * Math.sin(bearing))); - /*System.out.println(String.format("Big asteroid: %.3f %.3f r %.3f r makes %3d, %3d, %3d", new Object[] { - Double.valueOf(binomial),Double.valueOf(bearing), Double.valueOf(yawn), - Integer.valueOf(aX), Integer.valueOf(aY), Integer.valueOf(aZ)}));/**/ + for (int i = 1; i <= numOfAsteroids; i++) + { + int aX = x + (((world.rand.nextBoolean()) ? -1 : 1) * (FIELD_ASTEROID_MIN_DISTANCE + world.rand.nextInt(FIELD_ASTEROID_MAX_DISTANCE))); + int aY = y + (((world.rand.nextBoolean()) ? -1 : 1) * (FIELD_ASTEROID_MIN_DISTANCE + world.rand.nextInt(FIELD_ASTEROID_MAX_DISTANCE))); + int aZ = z + (((world.rand.nextBoolean()) ? -1 : 1) * (FIELD_ASTEROID_MIN_DISTANCE + world.rand.nextInt(FIELD_ASTEROID_MAX_DISTANCE))); // Place an asteroid generateRandomAsteroid(world, aX, aY, aZ, 4, 6); } - // Setting up small asteroids - for (int i = 1; i <= numOfSmallAsteroids; i++) { - float binomial = binomialRandom(world); - double bearing = world.rand.nextFloat() * 2.0D * Math.PI; - double yawn = world.rand.nextFloat() * Math.PI; - float horizontalRange = Math.max(6.0F, binomial * maxDistanceSmall); - float verticalRange = Math.max(3.0F, binomial * maxHeight); - - int aX = (int) (x + Math.round(horizontalRange * Math.cos(bearing))); - int aY = (int) (y2 + Math.round(verticalRange * Math.cos(yawn))); - int aZ = (int) (z + Math.round(horizontalRange * Math.sin(bearing))); - + for (int i = 1; i <= numOfAsteroids; i++) + { + int aX = x + (((world.rand.nextBoolean()) ? -1 : 1) * (FIELD_ASTEROID_MIN_DISTANCE + world.rand.nextInt(FIELD_ASTEROID_MAX_DISTANCE))); + int aY = y + (((world.rand.nextBoolean()) ? -1 : 1) * (FIELD_ASTEROID_MIN_DISTANCE + world.rand.nextInt(FIELD_ASTEROID_MAX_DISTANCE))); + int aZ = z + (((world.rand.nextBoolean()) ? -1 : 1) * (FIELD_ASTEROID_MIN_DISTANCE + world.rand.nextInt(FIELD_ASTEROID_MAX_DISTANCE))); // Placing - if (world.rand.nextInt(400) != 1) { - generateRandomAsteroid(world, aX, aY, aZ, 3, 3); - } else { - generateSmallShip(world, aX, aY, aZ, 8); - } + if (world.rand.nextInt(100) != 0) + generateRandomAsteroid(world, aX, aY, aZ, 2, 2); + else + generateSmallShip(world, aX, aY, aZ); } - // Setting up gas clouds - for (int i = 1; i <= numOfClouds; i++) { - float binomial = binomialRandom(world); - double bearing = world.rand.nextFloat() * 2.0D * Math.PI; - double yawn = world.rand.nextFloat() * Math.PI; - float horizontalRange = Math.max(6.0F, binomial * maxDistanceBig); - float verticalRange = Math.max(3.0F, binomial * maxHeight); - - int aX = (int) (x + Math.round(horizontalRange * Math.cos(bearing))); - int aY = (int) (y2 + Math.round(verticalRange * Math.cos(yawn))); - int aZ = (int) (z + Math.round(horizontalRange * Math.sin(bearing))); - + for (int i = 1; i <= numOfClouds; i++) + { + int aX = x + (((world.rand.nextBoolean()) ? -1 : 1) * (FIELD_ASTEROID_MIN_DISTANCE + world.rand.nextInt(FIELD_ASTEROID_MAX_DISTANCE))); + int aY = y + (((world.rand.nextBoolean()) ? -1 : 1) * (FIELD_ASTEROID_MIN_DISTANCE + world.rand.nextInt(FIELD_ASTEROID_MAX_DISTANCE))); + int aZ = z + (((world.rand.nextBoolean()) ? -1 : 1) * (FIELD_ASTEROID_MIN_DISTANCE + world.rand.nextInt(FIELD_ASTEROID_MAX_DISTANCE))); // Placing - if (world.rand.nextBoolean()) { + if (world.rand.nextInt(10) != 0) generateGasCloudOfColor(world, aX, aY, aZ, 12, 15, world.rand.nextInt(12)); - } } - - LocalProfiler.stop(); } /** * Gas cloud generator * - * @param x coordinate of center - * @param y coordinate of center - * @param z coordinate of center + * @param x x-coord of center + * @param y center + * @param z center * @param cloudSizeMax maximum gas cloud size (by number of balls it consists) * @param centerRadiusMax maximum radius of central ball */ - public static void generateGasCloudOfColor(World world, int x, int y, int z, int cloudSizeMax, int centerRadiusMax, int color) { + public void generateGasCloudOfColor(World world, int x, int y, int z, int cloudSizeMax, int centerRadiusMax, int color) + { int cloudSize = 1 + world.rand.nextInt(20); if (cloudSizeMax != 0) cloudSize = Math.min(cloudSizeMax, cloudSize); @@ -345,7 +285,8 @@ public class SpaceWorldGenerator implements IWorldGenerator // Asteroid's center generateGasSphereEntity(world, x, y, z, centerRadius, false, color); // Asteroids knolls - for (int i = 1; i <= cloudSize; i++) { + for (int i = 1; i <= cloudSize; i++) + { int radius = 2 + world.rand.nextInt(centerRadius); int newX = x + (((world.rand.nextBoolean()) ? -1 : 1) * world.rand.nextInt(CENTER_SHIFT + centerRadius / 2)); int newY = y + (((world.rand.nextBoolean()) ? -1 : 1) * world.rand.nextInt(CENTER_SHIFT + centerRadius / 2)); @@ -357,36 +298,65 @@ public class SpaceWorldGenerator implements IWorldGenerator /** * Asteroid of block generator * - * @param x coordinate of center - * @param y coordinate of center - * @param z coordinate of center + * @param x x-coord of center + * @param y center + * @param z center * @param asteroidSizeMax maximum asteroid size (by number of balls it consists) * @param centerRadiusMax maximum radius of central ball */ - private static void generateAsteroidOfBlock(World world, int x, int y, int z, int asteroidSizeMax, int centerRadiusMax, int blockID, int meta) { - // FIXME: get a proper range of random instead of capping it + private void generateAsteroidOfBlock(World world, int x, int y, int z, int asteroidSizeMax, int centerRadiusMax, int blockID, int meta) + { int asteroidSize = 1 + world.rand.nextInt(6); - if (asteroidSizeMax != 0) { + if (asteroidSizeMax != 0) asteroidSize = Math.min(asteroidSizeMax, asteroidSize); - } int centerRadius = 1 + world.rand.nextInt(6); - if (centerRadiusMax != 0) { + if (centerRadiusMax != 0) centerRadius = Math.min(centerRadiusMax, centerRadius); - } final int CENTER_SHIFT = 2; // Offset from center of central ball // Asteroid's center - int[] t = WarpDriveConfig.getDefaultSurfaceBlock(world.rand, true, false); - generateSphereDirect(world, x, y, z, centerRadius, true, blockID, meta, false, t); + int[] t = WarpDriveConfig.i.getDefaultSurfaceBlock(world.rand, true, false); + generateSphere2(world, x, y, z, centerRadius, true, blockID, meta, false, t); // Asteroids knolls - for (int i = 1; i <= asteroidSize; i++) { - int radius = 1 + world.rand.nextInt(centerRadius); + for (int i = 1; i <= asteroidSize; i++) + { + int radius = 2 + world.rand.nextInt(centerRadius); int newX = x + (((world.rand.nextBoolean()) ? -1 : 1) * world.rand.nextInt(CENTER_SHIFT + centerRadius / 2)); int newY = y + (((world.rand.nextBoolean()) ? -1 : 1) * world.rand.nextInt(CENTER_SHIFT + centerRadius / 2)); int newZ = z + (((world.rand.nextBoolean()) ? -1 : 1) * world.rand.nextInt(CENTER_SHIFT + centerRadius / 2)); - generateSphereDirect(world, newX, newY, newZ, radius, true, blockID, meta, false, t); + generateSphere2(world, newX, newY, newZ, radius, true, blockID, meta, false, t); } } - + + /** + * Asteroid generator + * + * @param x x-coord of center + * @param y center + * @param z center + * @param asteroidSizeMax maximum asteroid size (by number of balls it consists) + * @param centerRadiusMax maximum radius of central ball + */ + public void generateAsteroid(World world, int x, int y, int z, int asteroidSizeMax, int centerRadiusMax) + { + int asteroidSize = 1 + world.rand.nextInt(6); + if (asteroidSizeMax != 0) + asteroidSize = Math.min(asteroidSizeMax, asteroidSize); + int centerRadius = 1 + world.rand.nextInt(6); + if (centerRadiusMax != 0) + centerRadius = Math.min(centerRadiusMax, centerRadius); + final int CENTER_SHIFT = 2; + int[] t = WarpDriveConfig.i.getDefaultSurfaceBlock(world.rand, true, false); + generateSphere2(world, x, y, z, centerRadius, true, -1, 0, false, t); + for (int i = 1; i <= asteroidSize; i++) + { + int radius = 2 + world.rand.nextInt(centerRadius); + int newX = x + (((world.rand.nextBoolean()) ? -1 : 1) * world.rand.nextInt(CENTER_SHIFT + centerRadius / 2)); + int newY = y + (((world.rand.nextBoolean()) ? -1 : 1) * world.rand.nextInt(CENTER_SHIFT + centerRadius / 2)); + int newZ = z + (((world.rand.nextBoolean()) ? -1 : 1) * world.rand.nextInt(CENTER_SHIFT + centerRadius / 2)); + generateSphere2(world, newX, newY, newZ, radius, true, -1, 0, false, t); + } + } + /** * Sphere generator * @param world target world @@ -398,69 +368,73 @@ public class SpaceWorldGenerator implements IWorldGenerator * @param forcedID sphere of specified blocks or random blocks if not specified * @return */ - public static void generateSphereDirect(World world, int xCoord, int yCoord, int zCoord, double radius, boolean corrupted, int forcedID, int meta, boolean hollow) { - if (forcedID == -1) { - generateSphereDirect(world, xCoord, yCoord, zCoord, radius, corrupted, forcedID, meta, hollow, WarpDriveConfig.getDefaultSurfaceBlock(world.rand, corrupted, false)); - } else { - generateSphereDirect(world, xCoord, yCoord, zCoord, radius, corrupted, forcedID, meta, hollow, new int[] {forcedID, meta}); - } + public void generateSphere2(World world, int xCoord, int yCoord, int zCoord, double radius, boolean corrupted, int forcedID, int meta, boolean hollow) + { + if (forcedID == -1) + generateSphere2(world, xCoord, yCoord, zCoord, radius, corrupted, forcedID, meta, hollow, WarpDriveConfig.i.getDefaultSurfaceBlock(world.rand, corrupted, false)); + else + generateSphere2(world, xCoord, yCoord, zCoord, radius, corrupted, forcedID, meta, hollow, new int[] {forcedID, meta}); } - public static void generateSphereDirect(World world, int xCoord, int yCoord, int zCoord, double radius, boolean corrupted, int forcedID, int meta, boolean hollow, int[] defaultBlock) { - double radiusC = radius + 0.5D; // Radius from center of block - double radiusSq = radiusC * radiusC; // Optimization to avoid sqrts... - double radius1Sq = (radiusC - 1.0D) * (radiusC - 1.0D); // for hollow sphere - int ceilRadius = (int) Math.ceil(radiusC); + public void generateSphere2(World world, int xCoord, int yCoord, int zCoord, double radius, boolean corrupted, int forcedID, int meta, boolean hollow, int[] defaultBlock) + { + radius += 0.5D; // Radius from center of block + double radiusSq = radius * radius; // Optimization to avoid sqrts... + double radius1Sq = (radius - 1.0D) * (radius - 1.0D); // for hollow sphere + int ceilRadius = (int) Math.ceil(radius); - int[] blockID = new int[] {0, 0}; - if (forcedID != -1) { + int[] blockID; + if (forcedID == 0) + blockID = new int[] {0, 0}; + else if (forcedID == -1) + blockID = new int[] {forcedID, meta};//SRANYA JABA might not have been initialized + else blockID = new int[] {forcedID, meta}; - } // Pass the cube and check points for sphere equation x^2 + y^2 + z^2 = r^2 - for (int x = 0; x <= ceilRadius; x++) { - double x2 = (x + 0.5D) * (x + 0.5D); - for (int y = 0; y <= ceilRadius; y++) { - double y2 = (y + 0.5D) * (y + 0.5D); - for (int z = 0; z <= ceilRadius; z++) { - double z2 = (z + 0.5D) * (z + 0.5D); - double dSq = x2 + y2 + z2; // Distance from current position to center + for (int x = 0; x <= ceilRadius; x++) + for (int y = 0; y <= ceilRadius; y++) + for (int z = 0; z <= ceilRadius; z++) + { + double dSq = lengthSq(x, y, z); // Distance from current position to center // Skip too far blocks if (dSq > radiusSq) continue; // Hollow sphere condition - if ((hollow) && ((dSq < radius1Sq) || ((lengthSq(x + 1.5D, y + 0.5D, z + 0.5D) <= radiusSq) && (lengthSq(x + 0.5D, y + 1.5D, z + 0.5D) <= radiusSq) && (lengthSq(x + 0.5D, y + 0.5D, z + 1.5D) <= radiusSq)))) + if ((hollow) && ((dSq < radius1Sq) || ((lengthSq(x + 1, y, z) <= radiusSq) && (lengthSq(x, y + 1, z) <= radiusSq) && (lengthSq(x, y, z + 1) <= radiusSq)))) continue; // Place blocks - if (!corrupted || world.rand.nextInt(5) != 1) { + if (!corrupted || world.rand.nextInt(10) != 1) + { if (forcedID == -1) - blockID = WarpDriveConfig.getRandomSurfaceBlock(world.rand, defaultBlock[0], defaultBlock[1], false); + blockID = WarpDriveConfig.i.getRandomSurfaceBlock(world.rand, defaultBlock[0], defaultBlock[1], false); world.setBlock(xCoord + x, yCoord + y, zCoord + z, blockID[0], blockID[1], 2); world.setBlock(xCoord - x, yCoord + y, zCoord + z, blockID[0], blockID[1], 2); } - if (!corrupted || world.rand.nextInt(5) != 1) { + if (!corrupted || world.rand.nextInt(10) != 1) + { if (forcedID == -1) - blockID = WarpDriveConfig.getRandomSurfaceBlock(world.rand, defaultBlock[0], defaultBlock[1], false); + blockID = WarpDriveConfig.i.getRandomSurfaceBlock(world.rand, defaultBlock[0], defaultBlock[1], false); world.setBlock(xCoord + x, yCoord - y, zCoord + z, blockID[0], blockID[1], 2); world.setBlock(xCoord + x, yCoord + y, zCoord - z, blockID[0], blockID[1], 2); } - if (!corrupted || world.rand.nextInt(5) != 1) { + if (!corrupted || world.rand.nextInt(10) != 1) + { if (forcedID == -1) - blockID = WarpDriveConfig.getRandomSurfaceBlock(world.rand, defaultBlock[0], defaultBlock[1], false); + blockID = WarpDriveConfig.i.getRandomSurfaceBlock(world.rand, defaultBlock[0], defaultBlock[1], false); world.setBlock(xCoord - x, yCoord - y, zCoord + z, blockID[0], blockID[1], 2); world.setBlock(xCoord + x, yCoord - y, zCoord - z, blockID[0], blockID[1], 2); } - if (!corrupted || world.rand.nextInt(5) != 1) { + if (!corrupted || world.rand.nextInt(10) != 1) + { if (forcedID == -1) - blockID = WarpDriveConfig.getRandomSurfaceBlock(world.rand, defaultBlock[0], defaultBlock[1], false); + blockID = WarpDriveConfig.i.getRandomSurfaceBlock(world.rand, defaultBlock[0], defaultBlock[1], false); world.setBlock(xCoord - x, yCoord + y, zCoord - z, blockID[0], blockID[1], 2); world.setBlock(xCoord - x, yCoord - y, zCoord - z, blockID[0], blockID[1], 2); } } - } - } } private static double lengthSq(double x, double y, double z) diff --git a/src/cr0s/WarpDrive/TileEntityAirGenerator.java b/src/cr0s/WarpDrive/TileEntityAirGenerator.java new file mode 100644 index 00000000..a821a975 --- /dev/null +++ b/src/cr0s/WarpDrive/TileEntityAirGenerator.java @@ -0,0 +1,180 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import net.minecraftforge.common.ForgeDirection; +import ic2.api.energy.event.EnergyTileLoadEvent; +import ic2.api.energy.event.EnergyTileUnloadEvent; +import ic2.api.energy.tile.IEnergySink; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.MinecraftForge; + +public class TileEntityAirGenerator extends TileEntity implements IEnergySink +{ + public boolean addedToEnergyNet = false; + + private final int EU_PER_AIRBLOCK = 10; + private final int MAX_ENERGY_VALUE = 36 * EU_PER_AIRBLOCK; + private int currentEnergyValue = 0; + + private int cooldownTicks = 0; + private final float AIR_POLLUTION_INTERVAL = 4; // seconds + + private final int START_CONCENTRATION_VALUE = 15; + + @Override + public void updateEntity() + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return; + } + + if (!addedToEnergyNet && !this.tileEntityInvalid) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(this)); + addedToEnergyNet = true; + } + + // Air generator works only in spaces + if (worldObj.provider.dimensionId != WarpDrive.instance.spaceDimID && worldObj.provider.dimensionId != WarpDrive.instance.hyperSpaceDimID) + { + return; + } + + if (addedToEnergyNet && currentEnergyValue > EU_PER_AIRBLOCK) + { + if (cooldownTicks++ > AIR_POLLUTION_INTERVAL * 20) + { + cooldownTicks = 0; + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 2); // set enabled texture + releaseAir(); + } + } + else + { + if (cooldownTicks++ > 20) + { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2); // set disabled texture + cooldownTicks = 0; + } + } + } + + private void releaseAir() + { + if (worldObj.isAirBlock(xCoord + 1, yCoord, zCoord) && (currentEnergyValue - EU_PER_AIRBLOCK >= 0)) + { + worldObj.setBlock(xCoord + 1, yCoord, zCoord, WarpDriveConfig.i.airID, START_CONCENTRATION_VALUE, 2); + currentEnergyValue -= EU_PER_AIRBLOCK; + } + + if (worldObj.isAirBlock(xCoord - 1, yCoord, zCoord) && (currentEnergyValue - EU_PER_AIRBLOCK >= 0)) + { + worldObj.setBlock(xCoord - 1, yCoord, zCoord, WarpDriveConfig.i.airID, START_CONCENTRATION_VALUE, 2); + currentEnergyValue -= EU_PER_AIRBLOCK; + } + + if (worldObj.isAirBlock(xCoord, yCoord + 1, zCoord) && (currentEnergyValue - EU_PER_AIRBLOCK >= 0)) + { + worldObj.setBlock(xCoord, yCoord + 1, zCoord, WarpDriveConfig.i.airID, START_CONCENTRATION_VALUE, 2); + currentEnergyValue -= EU_PER_AIRBLOCK; + } + + if (worldObj.isAirBlock(xCoord, yCoord - 1, zCoord) && (currentEnergyValue - EU_PER_AIRBLOCK >= 0)) + { + worldObj.setBlock(xCoord, yCoord - 1, zCoord, WarpDriveConfig.i.airID, START_CONCENTRATION_VALUE, 2); + currentEnergyValue -= EU_PER_AIRBLOCK; + } + + if (worldObj.isAirBlock(xCoord, yCoord, zCoord + 1) && (currentEnergyValue - EU_PER_AIRBLOCK >= 0)) + { + worldObj.setBlock(xCoord, yCoord, zCoord + 1, WarpDriveConfig.i.airID, START_CONCENTRATION_VALUE, 2); + currentEnergyValue -= EU_PER_AIRBLOCK; + } + + if (worldObj.isAirBlock(xCoord, yCoord, zCoord - 1) && (currentEnergyValue - EU_PER_AIRBLOCK >= 0)) + { + worldObj.setBlock(xCoord, yCoord, zCoord - 1, WarpDriveConfig.i.airID, START_CONCENTRATION_VALUE, 2); + currentEnergyValue -= EU_PER_AIRBLOCK; + } + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + this.currentEnergyValue = tag.getInteger("energy"); + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + tag.setInteger("energy", this.getCurrentEnergyValue()); + } + + // IEnergySink methods implementation + @Override + public double demandedEnergyUnits() + { + return (MAX_ENERGY_VALUE - currentEnergyValue); + } + + @Override + public double injectEnergyUnits(ForgeDirection directionFrom, double amount) + { + double leftover = 0; + currentEnergyValue += Math.round(amount); + + if (getCurrentEnergyValue() > MAX_ENERGY_VALUE) + { + leftover = (getCurrentEnergyValue() - MAX_ENERGY_VALUE); + currentEnergyValue = MAX_ENERGY_VALUE; + } + + return leftover; + } + + @Override + public int getMaxSafeInput() + { + return Integer.MAX_VALUE; + } + + @Override + public boolean acceptsEnergyFrom(TileEntity emitter, ForgeDirection direction) + { + return true; + } + + /** + * @return the currentEnergyValue + */ + public int getCurrentEnergyValue() + { + return currentEnergyValue; + } + + @Override + public void onChunkUnload() + { + if (addedToEnergyNet) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + addedToEnergyNet = false; + } + } + + @Override + public void invalidate() + { + if (addedToEnergyNet) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + addedToEnergyNet = false; + } + + super.invalidate(); + } +} diff --git a/src/cr0s/WarpDrive/TileEntityCamera.java b/src/cr0s/WarpDrive/TileEntityCamera.java new file mode 100644 index 00000000..905e5319 --- /dev/null +++ b/src/cr0s/WarpDrive/TileEntityCamera.java @@ -0,0 +1,167 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import dan200.computer.api.IComputerAccess; +import dan200.computer.api.ILuaContext; +import dan200.computer.api.IPeripheral; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.packet.Packet250CustomPayload; +import net.minecraft.network.packet.Packet62LevelSound; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.ChunkPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.MinecraftForge; + +public class TileEntityCamera extends TileEntity implements IPeripheral +{ + private int dx, dz, dy; + private float yaw, pitch; // laser direction + + private int frequency = -1; // beam frequency + private float r, g, b; // beam color (corresponds to frequency) + + private boolean isEmitting = false; + + private String[] methodsArray = + { + "freq" + }; + + private final int REGISTRY_UPDATE_INTERVAL_SEC = 10; + private int ticks = 0; + + private int packetSendTicks = 20; + + @Override + public void updateEntity() + { + // Update frequency on clients + if (FMLCommonHandler.instance().getEffectiveSide().isServer()) + { + if (packetSendTicks-- == 0) + { + packetSendTicks = 20 * 5; + sendFreqPacket(); + } + + return; + } + + if (++ticks > 20 * REGISTRY_UPDATE_INTERVAL_SEC) + { + ticks = 0; + WarpDrive.instance.cams.updateInRegistry(new CamRegistryItem(this.frequency, new ChunkPosition(xCoord, yCoord, zCoord), worldObj).setType(0)); + } + } + + public int getFrequency() + { + return frequency; + } + + public void setFrequency(int freq) + { + frequency = freq; + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + frequency = tag.getInteger("frequency"); + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + tag.setInteger("frequency", frequency); + } + + public void sendFreqPacket() + { + Side side = FMLCommonHandler.instance().getEffectiveSide(); + + if (side == Side.SERVER) + { + ByteArrayOutputStream bos = new ByteArrayOutputStream(8); + DataOutputStream outputStream = new DataOutputStream(bos); + + try + { + // Write source vector + outputStream.writeInt(xCoord); + outputStream.writeInt(yCoord); + outputStream.writeInt(zCoord); + outputStream.writeInt(this.frequency); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + + Packet250CustomPayload packet = new Packet250CustomPayload(); + packet.channel = "WarpDriveFreq"; + packet.data = bos.toByteArray(); + packet.length = bos.size(); + MinecraftServer.getServer().getConfigurationManager().sendToAllNear(xCoord, yCoord, zCoord, 100, worldObj.provider.dimensionId, packet); + } + } + + // IPeripheral methods implementation + @Override + public String getType() + { + return "camera"; + } + + @Override + public String[] getMethodNames() + { + return methodsArray; + } + + @Override + public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception + { + if (arguments.length == 1) + frequency = ((Double)arguments[0]).intValue(); + return new Integer[] { frequency }; + } + + @Override + public boolean canAttachToSide(int side) + { + return true; + } + + @Override + public void attach(IComputerAccess computer) + { + } + + @Override + public void detach(IComputerAccess computer) + { + } +} diff --git a/src/cr0s/WarpDrive/TileEntityCloakingDeviceCore.java b/src/cr0s/WarpDrive/TileEntityCloakingDeviceCore.java new file mode 100644 index 00000000..cc4d8396 --- /dev/null +++ b/src/cr0s/WarpDrive/TileEntityCloakingDeviceCore.java @@ -0,0 +1,480 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import dan200.computer.api.IComputerAccess; +import dan200.computer.api.ILuaContext; +import dan200.computer.api.IPeripheral; +import net.minecraftforge.common.ForgeDirection; +import ic2.api.energy.event.EnergyTileLoadEvent; +import ic2.api.energy.event.EnergyTileUnloadEvent; +import ic2.api.energy.tile.IEnergySink; +import ic2.api.energy.tile.IEnergyTile; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.packet.Packet250CustomPayload; +import net.minecraft.server.MinecraftServer; +import net.minecraft.src.ModLoader; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.storage.ExtendedBlockStorage; +import net.minecraftforge.common.MinecraftForge; +import net.minecraft.entity.player.EntityPlayerMP; + +public class TileEntityCloakingDeviceCore extends TileEntity implements IEnergySink, + IPeripheral { + public boolean addedToEnergyNet = false; + + private final int MAX_ENERGY_VALUE = 500000000; // 500kk eU + private int currentEnergyValue = 0; + + private String[] methodsArray = { "setFieldTier", // 0 setFieldTier(1 or 2) + "isAssemblyValid", // 1 - returns true or false + "getEnergyLevel", // 2 + "enableCloakingField", // 3 enables field if assembled right + "disableCloakingField", // 4 disables cloaking field + "setFieldFrequency" // 5 setFieldFrequency(int) + }; + + public boolean isEnabled = false; + public byte tier = 1; // cloaking field tier, 1 or 2 + public int frequency = 0; + + // Spatial cloaking field parameters + public int front, back, up, down, left, right; + public int minX = 0, minY = 0, minZ = 0, maxX = 0, maxY = 0, maxZ = 0; + + private int updateTicks = 0; + private int laserDrawingTicks = 0; + + @Override + public void updateEntity() { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { + return; + } + + if (!addedToEnergyNet && !this.tileEntityInvalid) { + MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(this)); + addedToEnergyNet = true; + } + + if (--this.updateTicks <= 0) { + this.updateTicks = ((this.tier == 1) ? 20 : (tier == 2) ? 10 : 20) * WarpDriveConfig.i.CD_FIELD_REFRESH_INTERVAL_SECONDS; // resetting timer + + if (validateAssembly() && isEnabled) { + // Consume power for sustaining cloaking field + countBlocksAndConsumeEnergy(); + + if (currentEnergyValue >= 0) { + if (!WarpDrive.instance.cloaks.isAreaExists(this.frequency)) { + WarpDrive.instance.cloaks.addCloakedAreaWorld(worldObj, minX, minY, minZ, maxX, maxY, maxZ, frequency, tier); + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 2); + worldObj.playSoundEffect(xCoord + 0.5f, yCoord + 0.5f, zCoord + 0.5f, "warpdrive:cloak", 4F, 1F); + + // Enable coils + setCoilsState(true); + } else { + // Refresh the field + CloakedArea area = WarpDrive.instance.cloaks.getCloakedArea(frequency); + if (area != null) + area.sendCloakPacketToPlayersEx(false); // recloak field + } + } else { + currentEnergyValue = 0; + setCoilsState(false); + disableCloakingField(); + } + } else if (!validateAssembly() && isEnabled) { + currentEnergyValue = 0; + setCoilsState(false); + disableCloakingField(); + } + } + + if (laserDrawingTicks++ > 100) { + laserDrawingTicks = 0; + + if (isEnabled) + drawLasers(); + } + } + + public void setCoilsState(boolean enabled) { + final int START_LENGTH = 2; // Step length from core block to main coils + + // Directions to check (all six directions: left, right, up, down, front, back) + byte[] dx = { 1, -1, 0, 0, 0, 0 }; + byte[] dy = { 0, 0, -1, 1, 0, 0 }; + byte[] dz = { 0, 0, 0, 0, -1, 1 }; + + for (int i = 0; i < 6; i++) + searchCoilInDirectionAndSetState(dx[i], dy[i], dz[i], enabled); + } + + public void searchCoilInDirectionAndSetState(byte dx, byte dy, byte dz, boolean state) { + for (int i = 0; i < WarpDriveConfig.i.CD_MAX_CLOAKING_FIELD_SIDE; i++) { + if (worldObj.getBlockId(xCoord + i * dx, yCoord + i * dy, zCoord + i * dz) == WarpDriveConfig.i.cloakCoilID) + worldObj.setBlockMetadataWithNotify(xCoord + i * dx, yCoord + i * dy, zCoord + i * dz, (state) ? 1 : 0, 2); + } + } + + public void searchCoilInDirectionAndDrawLaser(byte dx, byte dy, byte dz) { + final int START_LENGTH = 2; + float r = 0.0f, g = 1.0f, b = 0; + if (this.tier == 1) { + r = 0.0f; g = 1.0f; + } else if (this.tier == 2) { + r = 1.0f; g = 0.0f; + } + + for (int i = START_LENGTH + 1; i < WarpDriveConfig.i.CD_MAX_CLOAKING_FIELD_SIDE; i++) { + if (worldObj.getBlockId(xCoord + i * dx, yCoord + i * dy, zCoord + i * dz) == WarpDriveConfig.i.cloakCoilID) + sendLaserPacket(new Vector3(this).add(0.5), new Vector3(xCoord + i * dx, yCoord + i * dy, zCoord + i * dz).add(0.5), r, g, b, 110, 0, 100); + } + } + + public void drawLasers() { + final int START_LENGTH = 2; + float r = 0.0f, g = 1.0f, b = 0; + if (this.tier == 1) { + r = 0.0f; g = 1.0f; + } else if (this.tier == 2) { + r = 1.0f; g = 0.0f; + } + + // Directions to check (all six directions: left, right, up, down, front, back) + byte[] dx = { 1, -1, 0, 0, 0, 0 }; + byte[] dy = { 0, 0, -1, 1, 0, 0 }; + byte[] dz = { 0, 0, 0, 0, -1, 1 }; + + for (int k = 0; k < 6; k++) + searchCoilInDirectionAndDrawLaser(dx[k], dy[k], dz[k]); + + for (int i = 0; i < 6; i++) { + for (int j = 0; j < 6; j++) { + switch (worldObj.rand.nextInt(6)) { + case 0: + r = 1.0f; + g = b = 0; + break; + case 1: + r = b = 0; + g = 1.0f; + break; + case 2: + r = g = 0; + b = 1.0f; + break; + case 3: + r = b = 0.5f; + g = 0; + break; + case 4: + r = g = 1.0f; + b = 0; + break; + case 5: + r = 1.0f; + b = 0.5f; + g = 0f; + } + + sendLaserPacket(new Vector3(xCoord + START_LENGTH * dx[i], yCoord + START_LENGTH * dy[i], zCoord + START_LENGTH * dz[i]).add(0.5), new Vector3(xCoord + START_LENGTH * dx[j], yCoord + START_LENGTH * dy[j], zCoord + START_LENGTH * dz[j]).add(0.5), r, g, b, 110, 0, 100); + } + } + } + + public void disableCloakingField() { + this.isEnabled = false; + + if (WarpDrive.instance.cloaks.isAreaExists(this.frequency)) + WarpDrive.instance.cloaks.removeCloakedArea(this.frequency); + + worldObj.playSoundEffect(xCoord + 0.5f, yCoord + 0.5f, zCoord + 0.5f, "warpdrive:decloak", 4F, 1F); + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2); + } + public void countBlocksAndConsumeEnergy() { + int blocksCount = 0; + for (int y = minY; y <= maxY; y++) + for (int x = minX; x <= maxX; x++) + for(int z = minZ; z <= maxZ; z++) + if (worldObj.getBlockId(x, y, z) != 0) + blocksCount++; + int energyToConsume = blocksCount * ((this.tier == 1) ? WarpDriveConfig.i.CD_ENERGY_PER_BLOCK_TIER1 : WarpDriveConfig.i.CD_ENERGY_PER_BLOCK_TIER2); + + this.currentEnergyValue -= energyToConsume; + } + + public void sendLaserPacket(Vector3 source, Vector3 dest, float r, float g, float b, int age, int energy, int radius) { + Side side = FMLCommonHandler.instance().getEffectiveSide(); + + if (side == Side.SERVER) { + ByteArrayOutputStream bos = new ByteArrayOutputStream(8); + DataOutputStream outputStream = new DataOutputStream(bos); + + try { + // Write source vector + outputStream.writeDouble(source.x); + outputStream.writeDouble(source.y); + outputStream.writeDouble(source.z); + // Write target vector + outputStream.writeDouble(dest.x); + outputStream.writeDouble(dest.y); + outputStream.writeDouble(dest.z); + // Write r, g, b of laser + outputStream.writeFloat(r); + outputStream.writeFloat(g); + outputStream.writeFloat(b); + // Write age + outputStream.writeByte(age); + // Write energy value + outputStream.writeInt(energy); + } catch (Exception ex) { + ex.printStackTrace(); + } + + Packet250CustomPayload packet = new Packet250CustomPayload(); + packet.channel = "WarpDriveBeam"; + packet.data = bos.toByteArray(); + packet.length = bos.size(); + + // Send packet to all players within cloaked area + List list = worldObj.getEntitiesWithinAABB(EntityPlayerMP.class, AxisAlignedBB.getBoundingBox(minX, minY, minZ, maxX, maxY, maxZ)); + for (Entity e : list) { + if (e != null && e instanceof EntityPlayer) { + ((EntityPlayerMP)e).playerNetServerHandler.sendPacketToPlayer(packet); + } + } + } + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + this.currentEnergyValue = tag.getInteger("energy"); + this.tier = tag.getByte("tier"); + this.frequency = tag.getInteger("frequency"); + this.isEnabled = tag.getBoolean("enabled"); + } + + @Override + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + tag.setInteger("energy", this.getCurrentEnergyValue()); + tag.setByte("tier", this.tier); + tag.setInteger("frequency", this.frequency); + tag.setBoolean("enabled", this.isEnabled); + } + + public int searchCoilInDirection(byte dx, byte dy, byte dz) { + for (int i = 3; i < WarpDriveConfig.i.CD_MAX_CLOAKING_FIELD_SIDE; i++) { + if (worldObj.getBlockId(xCoord + i * dx, yCoord + i * dy, zCoord + i * dz) == WarpDriveConfig.i.cloakCoilID) + return i; + } + + return 0; + } + public boolean validateAssembly() { + final int START_LENGTH = 2; // Step length from core block to main coils + + // Directions to check (all six directions: left, right, up, down, front, back) + byte[] dx = { 1, -1, 0, 0, 0, 0 }; + byte[] dy = { 0, 0, -1, 1, 0, 0 }; + byte[] dz = { 0, 0, 0, 0, -1, 1 }; + + for (int i = 0; i < 6; i++) + if (worldObj.getBlockId(xCoord + START_LENGTH * dx[i], yCoord + START_LENGTH * dy[i], zCoord + START_LENGTH * dz[i]) != WarpDriveConfig.i.cloakCoilID) + return false; + + // Check cloaking field parameters defining coils + this.left = searchCoilInDirection((byte)1, (byte)0, (byte)0) + WarpDriveConfig.i.CD_COIL_CAPTURE_BLOCKS; + if (this.left == WarpDriveConfig.i.CD_COIL_CAPTURE_BLOCKS) return false; + this.right = searchCoilInDirection((byte)-1, (byte)0, (byte)0) + WarpDriveConfig.i.CD_COIL_CAPTURE_BLOCKS; + if (this.right == WarpDriveConfig.i.CD_COIL_CAPTURE_BLOCKS) return false; + + this.up = searchCoilInDirection((byte)0, (byte)1, (byte)0) + WarpDriveConfig.i.CD_COIL_CAPTURE_BLOCKS; + if (this.up == WarpDriveConfig.i.CD_COIL_CAPTURE_BLOCKS) return false; + this.down = searchCoilInDirection((byte)0, (byte)-1, (byte)0) + WarpDriveConfig.i.CD_COIL_CAPTURE_BLOCKS; + if (this.down == WarpDriveConfig.i.CD_COIL_CAPTURE_BLOCKS) return false; + + this.front = searchCoilInDirection((byte)0, (byte)0, (byte)1) + WarpDriveConfig.i.CD_COIL_CAPTURE_BLOCKS; + if (this.front == WarpDriveConfig.i.CD_COIL_CAPTURE_BLOCKS) return false; + this.back = searchCoilInDirection((byte)0, (byte)0, (byte)-1) + WarpDriveConfig.i.CD_COIL_CAPTURE_BLOCKS; + if (this.back == WarpDriveConfig.i.CD_COIL_CAPTURE_BLOCKS) return false; + + int x1 = 0, x2 = 0, z1 = 0, z2 = 0; + + + z1 = zCoord - this.back; + z2 = zCoord + this.front; + x1 = xCoord - this.right; + x2 = xCoord + this.left; + + if (x1 < x2) { + this.minX = x1;this. maxX = x2; + } + else { + this.minX = x2; this.maxX = x1; + } + + if (z1 < z2) { + this.minZ = z1; this.maxZ = z2; + } + else { + this.minZ = z2; this.maxZ = z1; + } + + this.minY = yCoord - this.down; + this.maxY = yCoord + this.up; + + return true; + } + + // CC + // IPeripheral methods implementation + @Override + public String getType() { + return "cloakingdevicecore"; + } + + @Override + public String[] getMethodNames() { + return methodsArray; + } + + @Override + public Object[] callMethod(IComputerAccess computer, ILuaContext context, + int method, Object[] arguments) throws Exception { + switch (method) { + case 0: // setFieldTier(1 or 2) + if (arguments.length == 1) { + this.tier = ((Double)arguments[0]).byteValue(); + } + + break; + case 1: // isAssemblyValid() + return new Object[] { (boolean)validateAssembly() }; + + case 2: // getEnergyLevel() + return new Object[] { currentEnergyValue }; + + case 3: // enableCloakingField() + this.isEnabled = true; + break; + + case 4: // disableCloakingField() + disableCloakingField(); + setCoilsState(false); + break; + + case 5: // setFieldFrequency(int) + if (arguments.length == 1) { + if (isEnabled) + disableCloakingField(); + + if (WarpDrive.instance.cloaks.isAreaExists(((Double)arguments[0]).intValue())) + return new Object[] { (Boolean)false }; + + this.frequency = ((Double)arguments[0]).intValue(); + return new Object[] { (Boolean)true }; + } + break; + } + + return null; + } + + @Override + public boolean canAttachToSide(int side) { + return true; + } + + @Override + public void attach(IComputerAccess computer) { + } + + @Override + public void detach(IComputerAccess computer) { + } + + // IEnergySink methods implementation + @Override + public double demandedEnergyUnits() { + return (MAX_ENERGY_VALUE - currentEnergyValue); + } + + @Override + public double injectEnergyUnits(ForgeDirection directionFrom, double amount) { + double leftover = 0; + currentEnergyValue += Math.round(amount); + + if (getCurrentEnergyValue() > MAX_ENERGY_VALUE) { + leftover = (getCurrentEnergyValue() - MAX_ENERGY_VALUE); + currentEnergyValue = MAX_ENERGY_VALUE; + } + + return leftover; + } + + @Override + public int getMaxSafeInput() { + return Integer.MAX_VALUE; + } + + @Override + public boolean acceptsEnergyFrom(TileEntity emitter, + ForgeDirection direction) { + return true; + } + + /** + * @return the currentEnergyValue + */ + public int getCurrentEnergyValue() { + return currentEnergyValue; + } + + public int collectAllEnergy() { + int energy = currentEnergyValue; + currentEnergyValue = 0; + return energy; + } + + @Override + public void onChunkUnload() { + if (addedToEnergyNet) { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + addedToEnergyNet = false; + } + } + + @Override + public void invalidate() { + if (addedToEnergyNet) { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + addedToEnergyNet = false; + } + + super.invalidate(); + } + } diff --git a/src/cr0s/WarpDrive/machines/TileEntityLaser.java b/src/cr0s/WarpDrive/TileEntityLaser.java similarity index 50% rename from src/cr0s/WarpDrive/machines/TileEntityLaser.java rename to src/cr0s/WarpDrive/TileEntityLaser.java index 3459622b..c0234152 100644 --- a/src/cr0s/WarpDrive/machines/TileEntityLaser.java +++ b/src/cr0s/WarpDrive/TileEntityLaser.java @@ -1,20 +1,25 @@ -package cr0s.WarpDrive.machines; +package cr0s.WarpDrive; import cpw.mods.fml.common.FMLCommonHandler; -import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.api.lua.ILuaContext; -import dan200.computercraft.api.peripheral.IPeripheral; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import dan200.computer.api.IComputerAccess; +import dan200.computer.api.ILuaContext; +import dan200.computer.api.IPeripheral; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; +import java.util.ArrayList; import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet250CustomPayload; +import net.minecraft.network.packet.Packet62LevelSound; import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; @@ -23,18 +28,21 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.ChunkPosition; -import cr0s.WarpDrive.*; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.MinecraftForge; -public class TileEntityLaser extends WarpTE implements IPeripheral { +public class TileEntityLaser extends TileEntity implements IPeripheral +{ //magic constants - private final int SCANNING_BEAM_LENGTH = 400; //FIXME merge re-adding a non-used definition? + private final int SCANNING_BEAM_LENGTH = 400; private final int SCANNING_BEAM_FREQ = 1420; private int dx, dz, dy; public float yaw, pitch; // laser direction - private int beamFrequency = -1; // beam frequency - private int cameraFrequency = -1; // camera frequency + private int frequency = -1; // beam frequency + public int camFreq = -1; // camera frequency private float r, g, b; // beam color (corresponds to frequency) public boolean isEmitting = false; @@ -51,65 +59,80 @@ public class TileEntityLaser extends WarpTE implements IPeripheral { public int delayTicks = 0; private int energyFromOtherBeams = 0; - + private MovingObjectPosition firstHit = null; + private int hitX = 0; + private int hitY = 0; + private int hitZ = 0; + private int hitBlockId = 0; + private int hitBlockMeta = 0; + private float hitBlockResistance = 0; private int camUpdateTicks = 20; private int registryUpdateTicks = 20 * 10; @Override - public void updateEntity() { - if (isWithCamera()) { - registryUpdateTicks--; - if (registryUpdateTicks == 0 && FMLCommonHandler.instance().getEffectiveSide().isClient()) { + public void updateEntity() + { + // Frequency is not set + if (frequency <= 0 || frequency > 65000) + { + return; + } + + if (isWithCamera()) + { + if (registryUpdateTicks-- == 0 && FMLCommonHandler.instance().getEffectiveSide().isClient()) + { registryUpdateTicks = 20 * 10; - WarpDrive.instance.cams.updateInRegistry(worldObj, new ChunkPosition(xCoord, yCoord, zCoord), cameraFrequency, 1); + WarpDrive.instance.cams.updateInRegistry(new CamRegistryItem(this.camFreq, new ChunkPosition(xCoord, yCoord, zCoord), worldObj).setType(1)); } - camUpdateTicks--; - if (camUpdateTicks == 0) { + if (camUpdateTicks-- == 0) + { camUpdateTicks = 20 * 5; // 5 seconds sendFreqPacket(); // send own cam frequency to clients } } - // Frequency is not set - if (beamFrequency <= 0 || beamFrequency > 65000) { - return; - } - - delayTicks++; - if (isEmitting && ((beamFrequency != 1420 && delayTicks > WarpDriveConfig.LE_EMIT_DELAY_TICKS) || ((beamFrequency == 1420) && delayTicks > WarpDriveConfig.LE_EMIT_SCAN_DELAY_TICKS))) { + if (isEmitting && ((frequency != SCANNING_BEAM_FREQ && ++delayTicks > WarpDriveConfig.i.LE_EMIT_DELAY_TICKS) || ((frequency == SCANNING_BEAM_FREQ) && ++delayTicks > WarpDriveConfig.i.LE_EMIT_SCAN_DELAY_TICKS))) + { delayTicks = 0; isEmitting = false; - emitBeam(Math.min(this.consumeEnergyFromBoosters() + MathHelper.floor_double(energyFromOtherBeams * WarpDriveConfig.LE_COLLECT_ENERGY_MULTIPLIER), WarpDriveConfig.LE_MAX_LASER_ENERGY)); + emitBeam(Math.min(this.collectEnergyFromBoosters() + MathHelper.floor_double(energyFromOtherBeams * WarpDriveConfig.i.LE_COLLECT_ENERGY_MULTIPLIER), WarpDriveConfig.i.LE_MAX_LASER_ENERGY)); energyFromOtherBeams = 0; } } - public void addBeamEnergy(int amount) { - if (isEmitting) { + public void addBeamEnergy(int amount) + { + if (isEmitting) energyFromOtherBeams += amount; - WarpDrive.debugPrint("[LE] Added energy: " + amount); - } else { - WarpDrive.debugPrint("[LE] Ignored energy: " + amount); - } } - private int consumeEnergyFromBoosters() { + private int collectEnergyFromBoosters() + { int energyCollected = 0; - if (findFirstBooster() != null) { - int newX, newY, newZ; - TileEntity te; - for (int shift = 1; shift <= WarpDriveConfig.LE_MAX_BOOSTERS_NUMBER; shift++) { - newX = xCoord + (dx * shift); - newY = yCoord + (dy * shift); - newZ = zCoord + (dz * shift); - te = worldObj.getBlockTileEntity(newX, newY, newZ); - if (te != null && te instanceof TileEntityParticleBooster) { - energyCollected += ((TileEntityParticleBooster)te).consumeAllEnergy(); - } else { + if (findFirstBooster() != null) + { + int maxShift = WarpDriveConfig.i.LE_MAX_BOOSTERS_NUMBER; + if (frequency == SCANNING_BEAM_FREQ) + maxShift = 1; + + for (int shift = 1; shift <= maxShift; shift++) + { + int newX = xCoord + (dx * shift); + int newY = yCoord + (dy * shift); + int newZ = zCoord + (dz * shift); + TileEntity te = worldObj.getBlockTileEntity(newX, newY, newZ); + + if (te != null && te instanceof TileEntityParticleBooster) + { + energyCollected += ((TileEntityParticleBooster)te).collectAllEnergy(); + } + else + { break; } } @@ -119,67 +142,81 @@ public class TileEntityLaser extends WarpTE implements IPeripheral { } // TODO refactor me - private void emitBeam(int parEnergy) { - int energy = parEnergy; // FIXME + private void emitBeam(int energy) + { // Beam power calculations - int beamLengthBlocks = energy / WarpDriveConfig.LE_BEAM_LENGTH_PER_ENERGY_DIVIDER; + int beamLengthBlocks = energy / WarpDriveConfig.i.LE_BEAM_LENGTH_PER_ENERGY_DIVIDER; + + if (frequency == SCANNING_BEAM_FREQ) + beamLengthBlocks = SCANNING_BEAM_LENGTH; - if (energy == 0 || beamLengthBlocks < 1 || beamFrequency > 65000 || beamFrequency <= 0) { + if (energy == 0 || beamLengthBlocks < 1 || frequency > 65000 || frequency <= 0) + { return; } - Vector3 beamVector = new Vector3(this).translate(0.5D); - WarpDrive.debugPrint("" + this + " Energy " + energy + " over " + beamLengthBlocks + " blocks, Initial beam " + beamVector); + Vector3 beamVector = new Vector3(this).add(0.5); float yawz = MathHelper.cos(-yaw * 0.017453292F - (float) Math.PI); float yawx = MathHelper.sin(-yaw * 0.017453292F - (float) Math.PI); float pitchhorizontal = -MathHelper.cos(-pitch * 0.017453292F); float pitchvertical = MathHelper.sin(-pitch * 0.017453292F); float directionx = yawx * pitchhorizontal; float directionz = yawz * pitchhorizontal; - Vector3 lookVector = new Vector3(directionx, pitchvertical, directionz); + Vector3 lookVector = new Vector3((double) directionx, (double) pitchvertical, (double) directionz); Vector3.translate(beamVector, lookVector); Vector3 reachPoint = beamVector.clone().translate(beamVector.clone(), beamVector.clone().scale(lookVector.clone(), beamLengthBlocks)); - WarpDrive.debugPrint("" + this + " Beam " + beamVector + " Look " + lookVector + " Reach " + reachPoint + " TranslatedBeam " + beamVector); Vector3 endPoint = reachPoint.clone(); playSoundCorrespondsEnergy(energy); + int distanceTravelled = 0; //distance travelled from beam emitter to previous hit if there were any - + // This is scanning beam, do not deal damage to blocks - if (beamFrequency == SCANNING_BEAM_FREQ) { + if (frequency == SCANNING_BEAM_FREQ) + { firstHit = worldObj.rayTraceBlocks_do_do(beamVector.toVec3(), reachPoint.toVec3(), false, false); - if (firstHit != null) { - WarpDrive.sendLaserPacket(worldObj, beamVector, new Vector3(firstHit.hitVec), r, g, b, 50, energy, 200); + if (firstHit != null) + { + hitBlockId = worldObj.getBlockId(firstHit.blockX, firstHit.blockY, firstHit.blockZ); + hitBlockMeta = worldObj.getBlockMetadata(firstHit.blockX, firstHit.blockY, firstHit.blockZ); + hitBlockResistance = Block.blocksList[hitBlockId].blockResistance; + hitX = firstHit.blockX; + hitY = firstHit.blockY; + hitZ = firstHit.blockZ; + sendLaserPacket(beamVector, new Vector3(firstHit.hitVec), r, g, b, 50, energy, 200); } else { - WarpDrive.sendLaserPacket(worldObj, beamVector, reachPoint, r, g, b, 50, energy, 200); - } - + sendLaserPacket(beamVector, reachPoint, r, g, b, 50, energy, 200); + } + return; } - for (int passedBlocks = 0; passedBlocks < beamLengthBlocks; passedBlocks++) { + for (int passedBlocks = 0; passedBlocks < beamLengthBlocks; ++passedBlocks) + { // Get next block hit MovingObjectPosition hit = worldObj.rayTraceBlocks_do_do(beamVector.toVec3(), reachPoint.toVec3(), true, false); // FIXME entity ray-tracing MovingObjectPosition entityHit = raytraceEntities(beamVector.clone(), lookVector.clone(), true, beamLengthBlocks); - WarpDrive.debugPrint("Entity hit is " + entityHit); - - if (entityHit != null && entityHit.entityHit instanceof EntityLivingBase) { + if (entityHit != null && entityHit.entityHit instanceof EntityLivingBase) + { EntityLivingBase e = (EntityLivingBase)entityHit.entityHit; double distanceToEntity = entityHit.hitVec.distanceTo(beamVector.clone().toVec3()); - if (hit == null || (hit != null && hit.hitVec.distanceTo(beamVector.clone().toVec3()) > distanceToEntity)) { - if (distanceToEntity <= beamLengthBlocks) { - e.setFire(WarpDriveConfig.LE_ENTITY_HIT_SET_ON_FIRE_TIME); - e.attackEntityFrom(DamageSource.inFire, energy / WarpDriveConfig.LE_ENTITY_HIT_DAMAGE_PER_ENERGY_DIVIDER); + if (hit == null || (hit != null && hit.hitVec.distanceTo(beamVector.clone().toVec3()) > distanceToEntity)) + { + if (distanceToEntity <= beamLengthBlocks) + { + ((EntityLivingBase)e).setFire(WarpDriveConfig.i.LE_ENTITY_HIT_SET_ON_FIRE_TIME); + ((EntityLivingBase)e).attackEntityFrom(DamageSource.inFire, energy / WarpDriveConfig.i.LE_ENTITY_HIT_DAMAGE_PER_ENERGY_DIVIDER); - if (energy > WarpDriveConfig.LE_ENTITY_HIT_EXPLOSION_LASER_ENERGY) { + if (energy > WarpDriveConfig.i.LE_ENTITY_HIT_EXPLOSION_LASER_ENERGY) + { worldObj.newExplosion(null, e.posX, e.posY, e.posZ, 4F, true, true); } // consume energy - energy -= WarpDriveConfig.LE_ENTITY_HIT_DAMAGE_PER_ENERGY_DIVIDER + (10 * distanceToEntity); + energy -= WarpDriveConfig.i.LE_ENTITY_HIT_DAMAGE_PER_ENERGY_DIVIDER + (10 * distanceToEntity); endPoint = new Vector3(entityHit.hitVec); break; } @@ -187,66 +224,79 @@ public class TileEntityLaser extends WarpTE implements IPeripheral { } // Laser is missed - if (hit == null && entityHit == null) { + if (hit == null && entityHit == null) + { endPoint = reachPoint; break; - } else if (hit != null) { + } + else if (hit != null) + { // We got a hit block int distance = (int) new Vector3(hit.hitVec).distanceTo(beamVector); // Laser gone too far - if (distance >= beamLengthBlocks) { + if (distance >= beamLengthBlocks) + { endPoint = reachPoint; break; } int blockID = worldObj.getBlockId(hit.blockX, hit.blockY, hit.blockZ); - // int blockMeta = worldObj.getBlockMetadata(hit.blockX, hit.blockY, hit.blockZ); + int blockMeta = worldObj.getBlockMetadata(hit.blockX, hit.blockY, hit.blockZ); float resistance = Block.blocksList[blockID].blockResistance; - if (blockID == Block.bedrock.blockID) { + if (blockID == Block.bedrock.blockID) + { endPoint = new Vector3(hit.hitVec); break; } // Hit is a laser head - if (blockID == WarpDriveConfig.laserID || blockID == WarpDriveConfig.laserCamID) { + if (blockID == WarpDriveConfig.i.laserID || blockID == WarpDriveConfig.i.laserCamID) + { // Compare frequencies TileEntityLaser tel = (TileEntityLaser)worldObj.getBlockTileEntity(hit.blockX, hit.blockY, hit.blockZ); - if (tel != null && tel.getBeamFrequency() == beamFrequency) { + if (tel != null && tel.getFrequency() == frequency) + { tel.addBeamEnergy(energy); endPoint = new Vector3(hit.hitVec); break; } } - if (Block.blocksList[blockID].blockMaterial == Material.glass) { + if (Block.blocksList[blockID].blockMaterial == Material.glass) + { worldObj.destroyBlock(hit.blockX, hit.blockY, hit.blockZ, (worldObj.rand.nextInt(20) == 0)); endPoint = new Vector3(hit.hitVec); } - energy -= WarpDriveConfig.LE_BLOCK_HIT_CONSUME_ENERGY + (resistance * WarpDriveConfig.LE_BLOCK_HIT_CONSUME_ENERGY_PER_BLOCK_RESISTANCE) + ( (distance - distanceTravelled) * WarpDriveConfig.LE_BLOCK_HIT_CONSUME_ENERGY_PER_DISTANCE); + energy -= WarpDriveConfig.i.LE_BLOCK_HIT_CONSUME_ENERGY + (resistance * WarpDriveConfig.i.LE_BLOCK_HIT_CONSUME_ENERGY_PER_BLOCK_RESISTANCE) + ( (distance - distanceTravelled) * WarpDriveConfig.i.LE_BLOCK_HIT_CONSUME_ENERGY_PER_DISTANCE); distanceTravelled = distance; endPoint = new Vector3(hit.hitVec); - if (energy <= 0) { + if (energy <= 0) + { break; } - if (resistance >= Block.obsidian.blockResistance) { + if (resistance >= Block.obsidian.blockResistance) + { worldObj.newExplosion(null, hit.blockX, hit.blockY, hit.blockZ, 4F * (2 + (energy / 500000)), true, true); worldObj.setBlock(hit.blockX, hit.blockY, hit.blockZ, (worldObj.rand.nextBoolean()) ? Block.fire.blockID : 0); - } else { + } + else + { worldObj.destroyBlock(hit.blockX, hit.blockY, hit.blockZ, (worldObj.rand.nextInt(20) == 0)); } } } - WarpDrive.instance.sendLaserPacket(worldObj, beamVector, endPoint, r, g, b, 50, energy, beamLengthBlocks); + sendLaserPacket(beamVector, endPoint, r, g, b, 50, energy, beamLengthBlocks); } - public MovingObjectPosition raytraceEntities(Vector3 beamVec, Vector3 lookVec, boolean collisionFlag, double reachDistance) { + public MovingObjectPosition raytraceEntities(Vector3 beamVec, Vector3 lookVec, boolean collisionFlag, double reachDistance) + { MovingObjectPosition pickedEntity = null; Vec3 playerPosition = beamVec.toVec3(); Vec3 playerLook = lookVec.toVec3(); @@ -257,30 +307,40 @@ public class TileEntityLaser extends WarpTE implements IPeripheral { List entitiesHit = worldObj.getEntitiesWithinAABBExcludingEntity(null, boxToScan); double closestEntity = reachDistance; - if (entitiesHit == null || entitiesHit.isEmpty()) { + if (entitiesHit == null || entitiesHit.isEmpty()) + { return null; } - for (Entity entityHit : (Iterable) entitiesHit) { - if (entityHit != null && entityHit.canBeCollidedWith() && entityHit.boundingBox != null) { - double border = entityHit.getCollisionBorderSize(); - AxisAlignedBB aabb = entityHit.boundingBox.expand(border, border, border); + for (Entity entityHit : (Iterable) entitiesHit) + { + if (entityHit != null && entityHit.canBeCollidedWith() && entityHit.boundingBox != null) + { + float border = entityHit.getCollisionBorderSize(); + AxisAlignedBB aabb = entityHit.boundingBox.expand((double) border, (double) border, (double) border); MovingObjectPosition hitMOP = aabb.calculateIntercept(playerPosition, playerViewOffset); - if (hitMOP != null) { - if (aabb.isVecInside(playerPosition)) { - if (0.0D < closestEntity || closestEntity == 0.0D) { + if (hitMOP != null) + { + if (aabb.isVecInside(playerPosition)) + { + if (0.0D < closestEntity || closestEntity == 0.0D) + { pickedEntity = new MovingObjectPosition(entityHit); - if (pickedEntity != null) { + if (pickedEntity != null) + { pickedEntity.hitVec = hitMOP.hitVec; closestEntity = 0.0D; } } - } else { + } + else + { double distance = playerPosition.distanceTo(hitMOP.hitVec); - if (distance < closestEntity || closestEntity == 0.0D) { + if (distance < closestEntity || closestEntity == 0.0D) + { pickedEntity = new MovingObjectPosition(entityHit); pickedEntity.hitVec = hitMOP.hitVec; closestEntity = distance; @@ -293,180 +353,272 @@ public class TileEntityLaser extends WarpTE implements IPeripheral { return pickedEntity; } - public boolean isWithCamera() { - return (getBlockType().blockID == WarpDriveConfig.laserCamID); + public boolean isWithCamera() + { + return (worldObj.getBlockId(xCoord, yCoord, zCoord) == WarpDriveConfig.i.laserCamID); } - public int getBeamFrequency() { - return beamFrequency; - } - - public void setBeamFrequency(int parBeamFrequency) { - if (beamFrequency != parBeamFrequency) { - WarpDrive.debugPrint("" + this + " Beam frequency set from " + beamFrequency + " to " + parBeamFrequency); - beamFrequency = parBeamFrequency; - } - updateColor(); + public int getFrequency() + { + return frequency; } - public int getCameraFrequency() { - return cameraFrequency; - } - - public void setCameraFrequency(int parCameraFrequency) { - if (cameraFrequency != parCameraFrequency) { - WarpDrive.debugPrint("" + this + " Camera frequency set from " + cameraFrequency + " to " + parCameraFrequency); - cameraFrequency = parCameraFrequency; - } - if (worldObj != null) { - WarpDrive.instance.cams.updateInRegistry(worldObj, new ChunkPosition(xCoord, yCoord, zCoord), cameraFrequency, 1); - } - } - - private TileEntityParticleBooster findFirstBooster() { + private TileEntityParticleBooster findFirstBooster() + { TileEntity result; result = worldObj.getBlockTileEntity(xCoord + 1, yCoord, zCoord); - if (result != null && result instanceof TileEntityParticleBooster) { + + if (result != null && result instanceof TileEntityParticleBooster) + { dx = 1; - dy = 0; dz = 0; + dy = 0; return (TileEntityParticleBooster) result; } result = worldObj.getBlockTileEntity(xCoord - 1, yCoord, zCoord); - if (result != null && result instanceof TileEntityParticleBooster) { + + if (result != null && result instanceof TileEntityParticleBooster) + { dx = -1; - dy = 0; dz = 0; + dy = 0; return (TileEntityParticleBooster) result; } result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord + 1); - if (result != null && result instanceof TileEntityParticleBooster) { + + if (result != null && result instanceof TileEntityParticleBooster) + { dx = 0; - dy = 0; dz = 1; + dy = 0; return (TileEntityParticleBooster) result; } result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord - 1); - if (result != null && result instanceof TileEntityParticleBooster) { + + if (result != null && result instanceof TileEntityParticleBooster) + { dx = 0; - dy = 0; dz = -1; + dy = 0; return (TileEntityParticleBooster) result; } result = worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord); - if (result != null && result instanceof TileEntityParticleBooster) { + + if (result != null && result instanceof TileEntityParticleBooster) + { dx = 0; - dy = 1; dz = 0; + dy = 1; return (TileEntityParticleBooster) result; } result = worldObj.getBlockTileEntity(xCoord, yCoord - 1, zCoord); - if (result != null && result instanceof TileEntityParticleBooster) { + + if (result != null && result instanceof TileEntityParticleBooster) + { dx = 0; - dy = -1; dz = 0; + dy = -1; return (TileEntityParticleBooster) result; } return null; } - private void playSoundCorrespondsEnergy(int energy) { - if (energy <= 500000) { + public void sendLaserPacket(Vector3 source, Vector3 dest, float r, float g, float b, int age, int energy, int radius) + { + Side side = FMLCommonHandler.instance().getEffectiveSide(); + + if (side == Side.SERVER) + { + ByteArrayOutputStream bos = new ByteArrayOutputStream(8); + DataOutputStream outputStream = new DataOutputStream(bos); + + try + { + // Write source vector + outputStream.writeDouble(source.x); + outputStream.writeDouble(source.y); + outputStream.writeDouble(source.z); + // Write target vector + outputStream.writeDouble(dest.x); + outputStream.writeDouble(dest.y); + outputStream.writeDouble(dest.z); + // Write r, g, b of laser + outputStream.writeFloat(r); + outputStream.writeFloat(g); + outputStream.writeFloat(b); + // Write age + outputStream.writeByte(age); + // Write energy value + outputStream.writeInt(energy); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + + Packet250CustomPayload packet = new Packet250CustomPayload(); + packet.channel = "WarpDriveBeam"; + packet.data = bos.toByteArray(); + packet.length = bos.size(); + MinecraftServer.getServer().getConfigurationManager().sendToAllNear(source.intX(), source.intY(), source.intZ(), radius, worldObj.provider.dimensionId, packet); + ByteArrayOutputStream bos2 = new ByteArrayOutputStream(8); + DataOutputStream outputStream2 = new DataOutputStream(bos2); + + try + { + // Write source vector + outputStream2.writeDouble(source.x); + outputStream2.writeDouble(source.y); + outputStream2.writeDouble(source.z); + // Write target vector + outputStream2.writeDouble(dest.x); + outputStream2.writeDouble(dest.y); + outputStream2.writeDouble(dest.z); + // Write r, g, b of laser + outputStream2.writeFloat(r); + outputStream2.writeFloat(g); + outputStream2.writeFloat(b); + // Write age + outputStream2.writeByte(age); + // Write energy value + outputStream2.writeInt(energy); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + + Packet250CustomPayload packet2 = new Packet250CustomPayload(); + packet.channel = "WarpDriveBeam"; + packet.data = bos.toByteArray(); + packet.length = bos.size(); + MinecraftServer.getServer().getConfigurationManager().sendToAllNear(dest.intX(), dest.intY(), dest.intZ(), radius, worldObj.provider.dimensionId, packet); + } + } + + private void playSoundCorrespondsEnergy(int energy) + { + if (energy <= 500000) + { worldObj.playSoundEffect(xCoord + 0.5f, yCoord - 0.5f, zCoord + 0.5f, "warpdrive:lowlaser", 4F, 1F); - } else if (energy > 500000 && energy <= 1000000) { + } + else if (energy > 500000 && energy <= 1000000) + { worldObj.playSoundEffect(xCoord + 0.5f, yCoord - 0.5f, zCoord + 0.5f, "warpdrive:midlaser", 4F, 1F); - } else if (energy > 1000000) { + } + else if (energy > 1000000) + { worldObj.playSoundEffect(xCoord + 0.5f, yCoord - 0.5f, zCoord + 0.5f, "warpdrive:hilaser", 4F, 1F); } } - private void updateColor() { - if (beamFrequency > 65000 || beamFrequency <= 0) { // Invalid frequency + private boolean parseFrequency(int freq) + { + if (freq > 65000 || freq <= 0) // Invalid frequency + { + r = 1; + g = 0; + b = 0; + return false; + } + + if (freq > 0 && freq <= 10000) // red + { r = 1; g = 0; b = 0; } - - if (beamFrequency > 0 && beamFrequency <= 10000) { // red - r = 1; - g = 0; - b = 0; - } else if (beamFrequency > 10000 && beamFrequency <= 20000) { // orange + else if (freq > 10000 && freq <= 20000) // orange + { r = 1; g = 0; b = 0.5f; - } else if (beamFrequency > 20000 && beamFrequency <= 30000) { // yellow + } + else if (freq > 20000 && freq <= 30000) // yellow + { r = 1; g = 1; b = 0; - } else if (beamFrequency > 30000 && beamFrequency <= 40000) { // green + } + else if (freq > 30000 && freq <= 40000) // green + { r = 0; g = 1; b = 0; - } else if (beamFrequency > 50000 && beamFrequency <= 60000) { // blue + } + else if (freq > 50000 && freq <= 60000) // blue + { r = 0; g = 0; b = 1; - } else if (beamFrequency > 60000 && beamFrequency <= 65000) { // violet + } + else if (freq > 60000 && freq <= 65000) // violet + { r = 0.5f; g = 0; b = 0.5f; - } else { // impossible frequency + } + else // impossible frequency + { r = 1; g = 0; b = 0; } + + return true; } @Override - public void readFromNBT(NBTTagCompound tag) { + public void readFromNBT(NBTTagCompound tag) + { super.readFromNBT(tag); - setBeamFrequency(tag.getInteger("beamFrequency")); - setCameraFrequency(tag.getInteger("cameraFrequency")); + frequency = tag.getInteger("frequency"); + camFreq = tag.getInteger("camfreq"); } @Override - public void writeToNBT(NBTTagCompound tag) { + public void writeToNBT(NBTTagCompound tag) + { super.writeToNBT(tag); - tag.setInteger("beamFrequency", beamFrequency); - tag.setInteger("cameraFrequency", cameraFrequency); + tag.setInteger("frequency", frequency); + tag.setInteger("camFreq", camFreq); } - @Override - public void onChunkUnload() { - WarpDrive.instance.cams.removeFromRegistry(worldObj, new ChunkPosition(xCoord, yCoord, zCoord)); - super.onChunkUnload(); - } - // IPeripheral methods implementation @Override - public String getType() { + public String getType() + { return "laser"; } @Override - public String[] getMethodNames() { + public String[] getMethodNames() + { return methodsArray; } @Override - public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception { + public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception + { switch (method) { case 0: // emitBeam(yaw, pitch) // emitBeam(dx, dy, dz) - if (arguments.length == 2) { + if (arguments.length == 2) + { yaw = ((Double)arguments[0]).floatValue(); pitch = ((Double)arguments[1]).floatValue(); isEmitting = true; delayTicks = 0; - } else if (arguments.length == 3) { + } + else if (arguments.length == 3) + { double dx = (Double)arguments[0]; double dy = (Double)arguments[1]; double dz = -(Double)arguments[2]; //FIXME kostyl @@ -483,58 +635,65 @@ public class TileEntityLaser extends WarpTE implements IPeripheral { delayTicks = 0; } break; - case 1: // getX return new Integer[] { xCoord, yCoord, zCoord }; - case 2: // Freq - if (arguments.length == 1) { - int parFrequency = ((Double)arguments[0]).intValue(); - if ((parFrequency <= 65000) && (parFrequency > 0)) { - setBeamFrequency(parFrequency); - } + if (arguments.length == 1) + { + if (parseFrequency(((Double)arguments[0]).intValue())) + frequency = ((Double)arguments[0]).intValue(); + else + return new Integer[] { -1 }; } - return new Integer[] { beamFrequency }; - + return new Integer[] { frequency }; case 3: // getFirstHit() - if (firstHit != null) { + if (firstHit != null) + { int blockID = worldObj.getBlockId(firstHit.blockX, firstHit.blockY, firstHit.blockZ); int blockMeta = worldObj.getBlockMetadata(firstHit.blockX, firstHit.blockY, firstHit.blockZ); float blockResistance = Block.blocksList[blockID].blockResistance; - Object[] info = { firstHit.blockX, firstHit.blockY, firstHit.blockZ, blockID, blockMeta, blockResistance }; + Object[] info = { hitX, hitY, hitZ, hitBlockId, hitBlockMeta, (Float)hitBlockResistance }; return info; - } else { - return new Integer[] { 0, 0, 0, 0, 0, -1 }; } - + else + return new Integer[] { 0, 0, 0, 0, 0, -1 }; case 4: // getBoosterDXDZ findFirstBooster(); return new Integer[] { dx, dz }; case 5: // CamFreq (only for lasers with cam) - if (isWithCamera()) { - if (arguments.length == 1) { - setCameraFrequency(((Double)arguments[0]).intValue()); - } + if (isWithCamera()) + { + if (arguments.length == 1) + camFreq = ((Double)arguments[0]).intValue(); + return new Integer[] { camFreq }; } - return new Integer[] { cameraFrequency }; + break; } return null; } // Camera frequency refresh to clients packet - public void sendFreqPacket() { - if (FMLCommonHandler.instance().getEffectiveSide().isServer()) { + public void sendFreqPacket() + { + Side side = FMLCommonHandler.instance().getEffectiveSide(); + + if (side == Side.SERVER) + { ByteArrayOutputStream bos = new ByteArrayOutputStream(8); DataOutputStream outputStream = new DataOutputStream(bos); - try { + try + { + // Write source vector outputStream.writeInt(xCoord); outputStream.writeInt(yCoord); outputStream.writeInt(zCoord); - outputStream.writeInt(cameraFrequency); - } catch (Exception e) { - e.printStackTrace(); + outputStream.writeInt(this.camFreq); + } + catch (Exception ex) + { + ex.printStackTrace(); } Packet250CustomPayload packet = new Packet250CustomPayload(); @@ -542,20 +701,22 @@ public class TileEntityLaser extends WarpTE implements IPeripheral { packet.data = bos.toByteArray(); packet.length = bos.size(); MinecraftServer.getServer().getConfigurationManager().sendToAllNear(xCoord, yCoord, zCoord, 100, worldObj.provider.dimensionId, packet); -// WarpDrive.debugPrint("" + this + " Packet '" + packet.channel + "' sent (" + xCoord + ", " + yCoord + ", " + zCoord + ") '" + cameraFrequency + "'"); } } @Override - public void attach(IComputerAccess computer) { + public boolean canAttachToSide(int side) + { + return true; } @Override - public void detach(IComputerAccess computer) { + public void attach(IComputerAccess computer) + { } @Override - public boolean equals(IPeripheral other) { - return other == this; + public void detach(IComputerAccess computer) + { } } diff --git a/src/cr0s/WarpDrive/TileEntityLift.java b/src/cr0s/WarpDrive/TileEntityLift.java new file mode 100644 index 00000000..e99f5aa4 --- /dev/null +++ b/src/cr0s/WarpDrive/TileEntityLift.java @@ -0,0 +1,343 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import dan200.computer.api.IComputerAccess; +import dan200.computer.api.ILuaContext; +import dan200.computer.api.IPeripheral; +import net.minecraftforge.common.ForgeDirection; +import ic2.api.energy.event.EnergyTileLoadEvent; +import ic2.api.energy.event.EnergyTileUnloadEvent; +import ic2.api.energy.tile.IEnergySink; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.packet.Packet250CustomPayload; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraftforge.common.MinecraftForge; + +public class TileEntityLift extends TileEntity implements IEnergySink +{ + public boolean addedToEnergyNet = false; + + private final int MAX_ENERGY_VALUE = 2048; // eU + private int currentEnergyValue = 0; + + private int mode = 0; // 0 - inactive, 1 - up, 2 - down + private int firstUncoveredY; + + private boolean isEnabled = false; + + int ticks = 0; + + @Override + public void updateEntity() + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return; + } + + if (!addedToEnergyNet && !this.tileEntityInvalid) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(this)); + addedToEnergyNet = true; + } + + if (++ticks > 40) + { + ticks = 0; + + // Switching mode + if (worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) + { + mode = 2; // down + } + else + { + mode = 1; // up + } + + isEnabled = (worldObj.isAirBlock(xCoord, yCoord + 1, zCoord) && worldObj.isAirBlock(xCoord, yCoord + 2, zCoord)); + + if (currentEnergyValue != MAX_ENERGY_VALUE || !isEnabled) + { + mode = 0; + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2); // disabled + return; + } + + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, mode, 2); // current mode + + // Launch a beam + if (isEnabled) + { + // Search non-air blocks under lift + for (int ny = yCoord - 1; ny > 0; ny--) + { + if (!worldObj.isAirBlock(xCoord, ny, zCoord)) + { + firstUncoveredY = ny; + break; + } + } + + if (yCoord - firstUncoveredY > 0) + if (mode == 1) + { + sendLaserPacket(new Vector3(this).add(0.5), new Vector3(xCoord, firstUncoveredY, zCoord).add(0.5), 0f, 1f, 0f, 40, 0, 100); + } + else if (mode == 2) + { + sendLaserPacket(new Vector3(this).add(0.5), new Vector3(xCoord, firstUncoveredY, zCoord).add(0.5), 0f, 0f, 1f, 40, 0, 100); + } + + liftEntity(); + } + } + } + + public void liftEntity() + { + int xmax, zmax, x1, x2, z1, z2; + int xmin, zmin; + final int CUBE_SIDE = 2; + x1 = xCoord + CUBE_SIDE / 2; + x2 = xCoord - CUBE_SIDE / 2; + + if (x1 < x2) + { + xmin = x1; + xmax = x2; + } + else + { + xmin = x2; + xmax = x1; + } + + z1 = zCoord + CUBE_SIDE / 2; + z2 = zCoord - CUBE_SIDE / 2; + + if (z1 < z2) + { + zmin = z1; + zmax = z2; + } + else + { + zmin = z2; + zmax = z1; + } + + // Lift up + if (mode == 1) + { + AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(xmin + 0.3, firstUncoveredY, zmin + 0.3, xmax - 0.3, yCoord, zmax - 0.3); + List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, aabb); + + if (list != null) // up + { + for (Object o : list) + { + if (o != null && o instanceof EntityLivingBase) + { + ((EntityLivingBase)o).setPositionAndUpdate(xCoord + 0.5f, yCoord + 1, zCoord + 0.5f); + sendLaserPacket(new Vector3(this).add(0.5), new Vector3(xCoord, firstUncoveredY, zCoord).add(0.5), 1, 1, 0, 40, 0, 100); + worldObj.playSoundEffect(xCoord + 0.5f, yCoord, zCoord + 0.5f, "warpdrive:hilaser", 4F, 1F); + currentEnergyValue = 0; + return; + } + } + } + } + else if (mode == 2) // down + { + AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(xmin + 0.3, yCoord, zmin + 0.3, xmax - 0.3, yCoord + 2, zmax - 0.3); + List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, aabb); + + if (list != null) + { + for (Object o : list) + { + if (o != null && o instanceof EntityLivingBase) + { + ((EntityLivingBase)o).setPositionAndUpdate(xCoord + 0.5f, firstUncoveredY + 1, zCoord + 0.5f); + sendLaserPacket(new Vector3(this).add(0.5), new Vector3(xCoord, firstUncoveredY + 1, zCoord).add(0.5), 1, 1, 0, 40, 0, 100); + worldObj.playSoundEffect(xCoord + 0.5f, yCoord, zCoord + 0.5f, "warpdrive:hilaser", 4F, 1F); + currentEnergyValue = 0; + return; + } + } + } + } + } + + public void sendLaserPacket(Vector3 source, Vector3 dest, float r, float g, float b, int age, int energy, int radius) + { + Side side = FMLCommonHandler.instance().getEffectiveSide(); + + if (side == Side.SERVER) + { + ByteArrayOutputStream bos = new ByteArrayOutputStream(8); + DataOutputStream outputStream = new DataOutputStream(bos); + + try + { + // Write source vector + outputStream.writeDouble(source.x); + outputStream.writeDouble(source.y); + outputStream.writeDouble(source.z); + // Write target vector + outputStream.writeDouble(dest.x); + outputStream.writeDouble(dest.y); + outputStream.writeDouble(dest.z); + // Write r, g, b of laser + outputStream.writeFloat(r); + outputStream.writeFloat(g); + outputStream.writeFloat(b); + // Write age + outputStream.writeByte(age); + // Write energy value + outputStream.writeInt(energy); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + + Packet250CustomPayload packet = new Packet250CustomPayload(); + packet.channel = "WarpDriveBeam"; + packet.data = bos.toByteArray(); + packet.length = bos.size(); + MinecraftServer.getServer().getConfigurationManager().sendToAllNear(source.intX(), source.intY(), source.intZ(), radius, worldObj.provider.dimensionId, packet); + ByteArrayOutputStream bos2 = new ByteArrayOutputStream(8); + DataOutputStream outputStream2 = new DataOutputStream(bos2); + + try + { + // Write source vector + outputStream2.writeDouble(source.x); + outputStream2.writeDouble(source.y); + outputStream2.writeDouble(source.z); + // Write target vector + outputStream2.writeDouble(dest.x); + outputStream2.writeDouble(dest.y); + outputStream2.writeDouble(dest.z); + // Write r, g, b of laser + outputStream2.writeFloat(r); + outputStream2.writeFloat(g); + outputStream2.writeFloat(b); + // Write age + outputStream2.writeByte(age); + // Write energy value + outputStream2.writeInt(energy); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + + Packet250CustomPayload packet2 = new Packet250CustomPayload(); + packet.channel = "WarpDriveBeam"; + packet.data = bos.toByteArray(); + packet.length = bos.size(); + MinecraftServer.getServer().getConfigurationManager().sendToAllNear(dest.intX(), dest.intY(), dest.intZ(), radius, worldObj.provider.dimensionId, packet); + } + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + this.currentEnergyValue = tag.getInteger("energy"); + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + tag.setInteger("energy", this.getCurrentEnergyValue()); + } + + // IEnergySink methods implementation + @Override + public double demandedEnergyUnits() + { + return (MAX_ENERGY_VALUE - currentEnergyValue); + } + + @Override + public double injectEnergyUnits(ForgeDirection directionFrom, double amount) + { + double leftover = 0; + currentEnergyValue += Math.round(amount); + + if (getCurrentEnergyValue() > MAX_ENERGY_VALUE) + { + leftover = (getCurrentEnergyValue() - MAX_ENERGY_VALUE); + currentEnergyValue = MAX_ENERGY_VALUE; + } + + return leftover; + } + + @Override + public int getMaxSafeInput() + { + return Integer.MAX_VALUE; + } + + @Override + public boolean acceptsEnergyFrom(TileEntity emitter, ForgeDirection direction) + { + return true; + } + + /** + * @return the currentEnergyValue + */ + public int getCurrentEnergyValue() + { + return currentEnergyValue; + } + + public int collectAllEnergy() + { + int energy = currentEnergyValue; + currentEnergyValue = 0; + return energy; + } + + @Override + public void onChunkUnload() + { + if (addedToEnergyNet) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + addedToEnergyNet = false; + } + } + + @Override + public void invalidate() + { + if (addedToEnergyNet) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + addedToEnergyNet = false; + } + + super.invalidate(); + } +} diff --git a/src/cr0s/WarpDrive/TileEntityMiningLaser.java b/src/cr0s/WarpDrive/TileEntityMiningLaser.java new file mode 100644 index 00000000..e62b2dfb --- /dev/null +++ b/src/cr0s/WarpDrive/TileEntityMiningLaser.java @@ -0,0 +1,700 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import dan200.computer.api.IComputerAccess; +import dan200.computer.api.ILuaContext; +import dan200.computer.api.IPeripheral; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.packet.Packet250CustomPayload; +import net.minecraft.network.packet.Packet62LevelSound; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.inventory.IInventory; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.fluids.FluidRegistry; +import appeng.api.WorldCoord; +import appeng.api.IAEItemStack; +import appeng.api.Util; +import appeng.api.events.GridTileLoadEvent; +import appeng.api.events.GridTileUnloadEvent; +import appeng.api.me.tiles.IGridMachine; +import appeng.api.me.tiles.ITileCable; +import appeng.api.me.util.IGridInterface; +import appeng.api.me.util.IMEInventoryHandler; + + +public class TileEntityMiningLaser extends TileEntity implements IPeripheral, IGridMachine, ITileCable +{ + Boolean powerStatus = false; + private IGridInterface grid; + + private int dx, dz, dy; + private boolean isMining = false; + private boolean isQuarry = false; + private boolean useDeiterium = false; + private boolean AENetworkReady = false; + + private String[] methodsArray = + { + "mine", //0 + "stop", //1 + "isMining", //2 + "quarry", //3 + "state", //4 + "offset" //5 + }; + + private int delayTicksScan = 0; + private int delayTicksMine = 0; + private int currentMode = 0; // 0 - scan next layer, 1 - collect valuables + + private int currentLayer; + + private ArrayList valuablesInLayer = new ArrayList(); + private int valuableIndex = 0; + + private int layerOffset = 1; + + private Vector3 minerVector; + //private long uid = 0; + + TileEntityParticleBooster booster = null; + + private boolean isOnEarth = false; + //int t = 20; + @Override + public void updateEntity() + { + if (isMining) + { + isOnEarth = (worldObj.provider.dimensionId == 0); + if (minerVector != null) + { + minerVector.x = xCoord; + minerVector.y = yCoord - 1; + minerVector.z = zCoord; + minerVector = minerVector.add(0.5); + } + + if (currentMode == 0) + { + if (++delayTicksScan > WarpDriveConfig.i.ML_SCAN_DELAY) + { + delayTicksScan = 0; + valuablesInLayer.clear(); + valuableIndex = 0; + if (!collectEnergyPacketFromBooster(isOnEarth ? WarpDriveConfig.i.ML_EU_PER_LAYER_EARTH : WarpDriveConfig.i.ML_EU_PER_LAYER_SPACE, true)) + return; + while (currentLayer > 0) + { + scanLayer(); + if (valuablesInLayer.size() > 0) + { + if (!collectEnergyPacketFromBooster(isOnEarth ? WarpDriveConfig.i.ML_EU_PER_LAYER_EARTH : WarpDriveConfig.i.ML_EU_PER_LAYER_SPACE, false)) + return; + sendLaserPacket(minerVector, new Vector3(xCoord, currentLayer, zCoord).add(0.5), 0, 0, 1, 20, 0, 50); + worldObj.playSoundEffect(xCoord + 0.5f, yCoord, zCoord + 0.5f, "warpdrive:hilaser", 4F, 1F); + int blockID = worldObj.getBlockId(xCoord, currentLayer, zCoord); + if (blockID != 0) + if (canDig(blockID)) + harvestBlock(new Vector3(xCoord, currentLayer, zCoord)); + currentMode = 1; + return; + } + else + --currentLayer; + } + if (currentLayer <= 0) + isMining = false; + } + } + else + { + if (++delayTicksMine > WarpDriveConfig.i.ML_MINE_DELAY && isMining) + { + delayTicksMine = 0; + while(valuableIndex < valuablesInLayer.size() && isMining) + { + Vector3 valuable = valuablesInLayer.get(valuableIndex++); + int blockID = worldObj.getBlockId(valuable.intX(), valuable.intY(), valuable.intZ()); + if (blockID == 0 || !canDig(blockID)) + continue; + sendLaserPacket(minerVector, new Vector3(valuable.intX(), valuable.intY(), valuable.intZ()).add(0.5), 1, 1, 0, 2 * WarpDriveConfig.i.ML_MINE_DELAY, 0, 50); + worldObj.playSoundEffect(xCoord + 0.5f, yCoord, zCoord + 0.5f, "warpdrive:lowlaser", 4F, 1F); + harvestBlock(valuable); + return;//top lel, yes yes + } + delayTicksMine = 0; + currentMode = 0; + --currentLayer; + } + } + } + } + + + private boolean canDig(int blockID) + { + if (blockID == 0) + return false; + if (Block.blocksList[blockID] != null) + return ( (WarpDriveConfig.i.MinerOres.contains(blockID) || + Block.blocksList[blockID].blockHardness <= Block.obsidian.blockHardness) && + blockID !=WarpDriveConfig.i.MFFS_Field && + blockID != Block.bedrock.blockID ); + else + return (blockID != WarpDriveConfig.i.MFFS_Field && blockID != Block.bedrock.blockID); + } + + private void harvestBlock(Vector3 valuable) + { + int blockID = worldObj.getBlockId(valuable.intX(), valuable.intY(), valuable.intZ()); + int blockMeta = worldObj.getBlockMetadata(valuable.intX(), valuable.intY(), valuable.intZ()); + if (blockID != Block.waterMoving.blockID && blockID != Block.waterStill.blockID && blockID != Block.lavaMoving.blockID && blockID != Block.lavaStill.blockID) + { + List stacks = getItemStackFromBlock(valuable.intX(), valuable.intY(), valuable.intZ(), blockID, blockMeta); + if (stacks != null) + for (ItemStack stack : stacks) + { + if (grid != null && AENetworkReady) + putInGrid(stack); + else + putInChest(findChest(), stack); + } + worldObj.playAuxSFXAtEntity(null, 2001, valuable.intX(), valuable.intY(), valuable.intZ(), blockID + (blockMeta << 12)); + } + else if (blockID == Block.waterMoving.blockID || blockID == Block.waterStill.blockID) + // Evaporate water + worldObj.playSoundEffect((double)((float)valuable.intX() + 0.5F), (double)((float)valuable.intY() + 0.5F), (double)((float)valuable.intZ() + 0.5F), "random.fizz", 0.5F, 2.6F + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.8F); + worldObj.setBlockToAir(valuable.intX(), valuable.intY(), valuable.intZ()); + } + + private IInventory findChest() + { + TileEntity result = null; + result = worldObj.getBlockTileEntity(xCoord + 1, yCoord, zCoord); + + if (result != null && result instanceof IInventory) + { + return (IInventory) result; + } + + result = worldObj.getBlockTileEntity(xCoord - 1, yCoord, zCoord); + + if (result != null && result instanceof IInventory) + { + return (IInventory) result; + } + + result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord + 1); + + if (result != null && result instanceof IInventory) + { + return (IInventory) result; + } + + result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord - 1); + + if (result != null && result instanceof IInventory) + { + return (IInventory) result; + } + + result = worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord); + + if (result != null && result instanceof IInventory) + { + return (IInventory) result; + } + + return null; + } + + public List getItemStackFromBlock(int i, int j, int k, int blockID, int blockMeta) + { + Block block = Block.blocksList[blockID]; + if (block == null) + return null; + if (useDeiterium && grid != null && AENetworkReady) + { + IMEInventoryHandler cellArray = grid.getCellArray(); + if (cellArray != null) + { + int consume = isQuarry?15:1000; + IAEItemStack entryToAEIS = Util.createItemStack(new ItemStack(WarpDriveConfig.i.AEExtraFDI, consume, FluidRegistry.getFluidID("deuterium"))); + long contained = cellArray.countOfItemType(entryToAEIS); + if (block.canSilkHarvest(worldObj, null, i, j, k, blockMeta) && contained >= consume) + { + cellArray.extractItems(entryToAEIS); + ArrayList t = new ArrayList(); + t.add(new ItemStack(blockID, 1, blockMeta)); + return t; + } + } + } + return block.getBlockDropped(worldObj, i, j, k, blockMeta, 0); + } + + public int putInGrid(ItemStack itemStackSource) + { + int transferred = itemStackSource.stackSize; + IMEInventoryHandler cellArray = grid.getCellArray(); + if (cellArray != null) + { + IAEItemStack ret = cellArray.addItems(Util.createItemStack(itemStackSource)); + if (ret != null) + transferred -= ret.getStackSize(); + } + return transferred; + } + + public int putInChest(IInventory inventory, ItemStack itemStackSource) + { + if (inventory == null || itemStackSource == null) + { + isMining = false; //stopping operation + return 0; + } + + int transferred = 0; + + for (int i = 0; i < inventory.getSizeInventory(); i++) + { + if (!inventory.isItemValidForSlot(i, itemStackSource)) + { + continue; + } + + ItemStack itemStack = inventory.getStackInSlot(i); + + if (itemStack == null || !itemStack.isItemEqual(itemStackSource)) + { + continue; + } + + int transfer = Math.min(itemStackSource.stackSize - transferred, itemStack.getMaxStackSize() - itemStack.stackSize); + itemStack.stackSize += transfer; + transferred += transfer; + + if (transferred == itemStackSource.stackSize) + { + return transferred; + } + } + + for (int i = 0; i < inventory.getSizeInventory(); i++) + { + if (!inventory.isItemValidForSlot(i, itemStackSource)) + { + continue; + } + + ItemStack itemStack = inventory.getStackInSlot(i); + + if (itemStack != null) + { + continue; + } + + int transfer = Math.min(itemStackSource.stackSize - transferred, itemStackSource.getMaxStackSize()); + ItemStack dest = copyWithSize(itemStackSource, transfer); + inventory.setInventorySlotContents(i, dest); + transferred += transfer; + + if (transferred == itemStackSource.stackSize) + { + return transferred; + } + } + + return transferred; + } + + public ItemStack copyWithSize(ItemStack itemStack, int newSize) + { + ItemStack ret = itemStack.copy(); + ret.stackSize = newSize; + return ret; + } + + private void scanLayer() + { + valuablesInLayer.clear(); + int xmax, zmax, x1, x2, z1, z2; + int xmin, zmin; + final int CUBE_SIDE = 8; + x1 = xCoord + CUBE_SIDE / 2; + x2 = xCoord - CUBE_SIDE / 2; + + if (x1 < x2) + { + xmin = x1; + xmax = x2; + } + else + { + xmin = x2; + xmax = x1; + } + + z1 = zCoord + CUBE_SIDE / 2; + z2 = zCoord - CUBE_SIDE / 2; + + if (z1 < z2) + { + zmin = z1; + zmax = z2; + } + else + { + zmin = z2; + zmax = z1; + } + + // Search for valuable blocks + for (int x = xmin; x <= xmax; x++) + for (int z = zmin; z <= zmax; z++) + { + int blockID = worldObj.getBlockId(x, currentLayer, z); + if (canDig(blockID)) + if (isQuarry) // Quarry collects all blocks + { + if (!worldObj.isAirBlock(x, currentLayer, z) && blockID != Block.lavaMoving.blockID && blockID != Block.lavaStill.blockID) + valuablesInLayer.add(new Vector3(x, currentLayer, z)); + } + else // Not-quarry collect only valuables blocks + if (WarpDriveConfig.i.MinerOres.contains(worldObj.getBlockId(x, currentLayer, z))) + valuablesInLayer.add(new Vector3(x, currentLayer, z)); + } + + valuableIndex = 0; + } + + private boolean collectEnergyPacketFromBooster(int packet, boolean test) + { + if (booster == null) + booster = findFirstBooster(); + if (booster != null) + if (test) + return packet <= booster.getCurrentEnergyValue(); + else + return booster.consumeEnergy(packet); + return false; + } + + private TileEntityParticleBooster findFirstBooster() + { + TileEntity result; + result = worldObj.getBlockTileEntity(xCoord + 1, yCoord, zCoord); + + if (result != null && result instanceof TileEntityParticleBooster) + { + dx = 1; + dz = 0; + dy = 0; + return (TileEntityParticleBooster) result; + } + + result = worldObj.getBlockTileEntity(xCoord - 1, yCoord, zCoord); + + if (result != null && result instanceof TileEntityParticleBooster) + { + dx = -1; + dz = 0; + dy = 0; + return (TileEntityParticleBooster) result; + } + + result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord + 1); + + if (result != null && result instanceof TileEntityParticleBooster) + { + dx = 0; + dz = 1; + dy = 0; + return (TileEntityParticleBooster) result; + } + + result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord - 1); + + if (result != null && result instanceof TileEntityParticleBooster) + { + dx = 0; + dz = -1; + dy = 0; + return (TileEntityParticleBooster) result; + } + + result = worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord); + + if (result != null && result instanceof TileEntityParticleBooster) + { + dx = 0; + dz = 0; + dy = 1; + return (TileEntityParticleBooster) result; + } + + return null; + } + + public void sendLaserPacket(Vector3 source, Vector3 dest, float r, float g, float b, int age, int energy, int radius) + { + Side side = FMLCommonHandler.instance().getEffectiveSide(); + + if (side == Side.SERVER) + { + if (source == null || dest == null || worldObj == null) + { + return; + } + + ByteArrayOutputStream bos = new ByteArrayOutputStream(8); + DataOutputStream outputStream = new DataOutputStream(bos); + + try + { + // Write source vector + outputStream.writeDouble(source.x); + outputStream.writeDouble(source.y); + outputStream.writeDouble(source.z); + // Write target vector + outputStream.writeDouble(dest.x); + outputStream.writeDouble(dest.y); + outputStream.writeDouble(dest.z); + // Write r, g, b of laser + outputStream.writeFloat(r); + outputStream.writeFloat(g); + outputStream.writeFloat(b); + // Write age + outputStream.writeByte(age); + // Write energy value + outputStream.writeInt(0); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + + Packet250CustomPayload packet = new Packet250CustomPayload(); + packet.channel = "WarpDriveBeam"; + packet.data = bos.toByteArray(); + packet.length = bos.size(); + MinecraftServer.getServer().getConfigurationManager().sendToAllNear(source.intX(), source.intY(), source.intZ(), radius, worldObj.provider.dimensionId, packet); + MinecraftServer.getServer().getConfigurationManager().sendToAllNear(dest.intX(), dest.intY(), dest.intZ(), radius, worldObj.provider.dimensionId, packet); + } + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + isMining = tag.getBoolean("isMining"); + isQuarry = tag.getBoolean("isQuarry"); + currentLayer = tag.getInteger("currentLayer"); + useDeiterium = tag.getBoolean("useDeiterium"); + minerVector = new Vector3(xCoord, yCoord - 1, zCoord).add(0.5); + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + tag.setBoolean("isMining", isMining); + tag.setBoolean("isQuarry", isQuarry); + tag.setInteger("currentLayer", currentLayer); + tag.setBoolean("useDeiterium", useDeiterium); + } +//CC + // IPeripheral methods implementation + @Override + public String getType() + { + return "mininglaser"; + } + + @Override + public String[] getMethodNames() + { + return methodsArray; + } + + @Override + public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception + { + switch (method) + { + case 0: // Mine() + if (isMining) + return new Boolean[] { false }; + isQuarry = false; + delayTicksScan = 0; + currentMode = 0; + minerVector = new Vector3(xCoord, yCoord - 1, zCoord).add(0.5); + currentLayer = yCoord - layerOffset; + isMining = true; + useDeiterium = (arguments.length == 1 && FluidRegistry.isFluidRegistered("deuterium")); + return new Boolean[] { true }; + + case 1: // stop() + isMining = false; + break; + + case 2: // isMining() + return new Boolean[] { isMining }; + case 3: // Quarry() + if (isMining) + return new Boolean[] { false }; + + isQuarry = true; + delayTicksScan = 0; + currentMode = 0; + minerVector = new Vector3(xCoord, yCoord - 1, zCoord).add(0.5); + currentLayer = yCoord - layerOffset; + isMining = true; + useDeiterium = (arguments.length == 1 && FluidRegistry.isFluidRegistered("deuterium")); + return new Boolean[] { true }; + + case 4: // State is: state, energy, currentLayer, valuablesMined, valuablesInLayer = getMinerState() + int energy = 0; + if (booster != null) + energy = booster.getCurrentEnergyValue(); + String state = "not mining"; + Integer valuablesInLayer, valuablesMined; + if (isMining) + { + valuablesInLayer = this.valuablesInLayer.size(); + valuablesMined = this.valuableIndex; + state = "mining" + ((isQuarry) ? " (quarry mode)" : ""); + if (energy < 0) + state = "out of energy"; + return new Object[] {state, energy, currentLayer, valuablesMined, valuablesInLayer}; + } + return new Object[] {state, energy, currentLayer, 0, 0}; + + case 5: // Offset + if (arguments.length == 1) + { + int t = ((Double)arguments[0]).intValue(); + if (t < 0) + t = 0; + layerOffset = t + 1; + } + return new Integer[] { layerOffset-1 }; + } + return null; + } + + @Override + public boolean canAttachToSide(int side) + { + return true; + } + + @Override + public void attach(IComputerAccess computer) + { + } + + @Override + public void detach(IComputerAccess computer) + { + } +//AE + @Override + public float getPowerDrainPerTick() + { + return 1; + } + + @Override + public void validate() + { + super.validate(); + MinecraftForge.EVENT_BUS.post(new GridTileLoadEvent(this, worldObj, getLocation())); + } + + @Override + public void invalidate() + { + super.invalidate(); + MinecraftForge.EVENT_BUS.post(new GridTileUnloadEvent(this, worldObj, getLocation())); + } + + @Override + public WorldCoord getLocation() + { + return new WorldCoord(xCoord, yCoord, zCoord); + } + + @Override + public boolean isValid() + { + return true; + } + + @Override + public void setPowerStatus(boolean hasPower) + { + powerStatus = hasPower; + } + + @Override + public boolean isPowered() + { + return powerStatus; + } + + @Override + public IGridInterface getGrid() + { + return grid; + } + + @Override + public void setGrid(IGridInterface gi) + { + grid = gi; + } + + @Override + public World getWorld() + { + return worldObj; + } + + @Override + public boolean coveredConnections() + { + return true; + } + + public void setNetworkReady( boolean isReady ) + { + AENetworkReady = isReady; + } + + public boolean isMachineActive() + { + return true; + } +} diff --git a/src/cr0s/WarpDrive/TileEntityMonitor.java b/src/cr0s/WarpDrive/TileEntityMonitor.java new file mode 100644 index 00000000..c5819990 --- /dev/null +++ b/src/cr0s/WarpDrive/TileEntityMonitor.java @@ -0,0 +1,151 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import dan200.computer.api.IComputerAccess; +import dan200.computer.api.ILuaContext; +import dan200.computer.api.IPeripheral; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.packet.Packet250CustomPayload; +import net.minecraft.network.packet.Packet62LevelSound; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.ChunkPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.MinecraftForge; + +public class TileEntityMonitor extends TileEntity implements IPeripheral +{ + private int frequency; + + private String[] methodsArray = + { + "freq" + }; + + private int packetSendTicks = 20; + + @Override + public void updateEntity() + { + if (FMLCommonHandler.instance().getEffectiveSide().isServer()) + { + if (packetSendTicks-- == 0) + { + packetSendTicks = 20 * 5; + sendFreqPacket(); + } + + return; + } + } + + public int getFrequency() + { + return frequency; + } + + public void setFrequency(int freq) + { + frequency = freq; + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + frequency = tag.getInteger("frequency"); + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + tag.setInteger("frequency", frequency); + } + + // IPeripheral methods implementation + @Override + public String getType() + { + return "monitor"; + } + + @Override + public String[] getMethodNames() + { + return methodsArray; + } + + @Override + public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception + { + if (arguments.length == 1) + frequency = ((Double)arguments[0]).intValue(); + return new Integer[] { frequency }; + } + + public void sendFreqPacket() + { + Side side = FMLCommonHandler.instance().getEffectiveSide(); + + if (side == Side.SERVER) + { + ByteArrayOutputStream bos = new ByteArrayOutputStream(8); + DataOutputStream outputStream = new DataOutputStream(bos); + + try + { + // Write source vector + outputStream.writeInt(xCoord); + outputStream.writeInt(yCoord); + outputStream.writeInt(zCoord); + outputStream.writeInt(this.frequency); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + + Packet250CustomPayload packet = new Packet250CustomPayload(); + packet.channel = "WarpDriveFreq"; + packet.data = bos.toByteArray(); + packet.length = bos.size(); + MinecraftServer.getServer().getConfigurationManager().sendToAllNear(xCoord, yCoord, zCoord, 100, worldObj.provider.dimensionId, packet); + } + } + + @Override + public boolean canAttachToSide(int side) + { + return true; + } + + @Override + public void attach(IComputerAccess computer) + { + } + + @Override + public void detach(IComputerAccess computer) + { + } +} diff --git a/src/cr0s/WarpDrive/TileEntityParticleBooster.java b/src/cr0s/WarpDrive/TileEntityParticleBooster.java new file mode 100644 index 00000000..74cc7f32 --- /dev/null +++ b/src/cr0s/WarpDrive/TileEntityParticleBooster.java @@ -0,0 +1,150 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import dan200.computer.api.IComputerAccess; +import dan200.computer.api.ILuaContext; +import dan200.computer.api.IPeripheral; +import net.minecraftforge.common.ForgeDirection; +import ic2.api.energy.event.EnergyTileLoadEvent; +import ic2.api.energy.event.EnergyTileUnloadEvent; +import ic2.api.energy.tile.IEnergySink; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraftforge.common.MinecraftForge; + +public class TileEntityParticleBooster extends TileEntity implements IEnergySink +{ + public boolean addedToEnergyNet = false; + + private int currentEnergyValue = 0; + + int ticks = 0; + + @Override + public void updateEntity() + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return; + } + + if (!addedToEnergyNet && !this.tileEntityInvalid) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(this)); + addedToEnergyNet = true; + } + + if (++ticks > 40) + { + ticks = 0; + currentEnergyValue = Math.min(currentEnergyValue, WarpDriveConfig.i.PB_MAX_ENERGY_VALUE); + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, currentEnergyValue / 10000, 2); + } + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + this.currentEnergyValue = tag.getInteger("energy"); + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + tag.setInteger("energy", this.getCurrentEnergyValue()); + } + + // IEnergySink methods implementation + @Override + public double demandedEnergyUnits() + { + return (WarpDriveConfig.i.PB_MAX_ENERGY_VALUE - currentEnergyValue); + } + + @Override + public double injectEnergyUnits(ForgeDirection directionFrom, double amount) + { + double leftover = 0; + currentEnergyValue += Math.round(amount); + + if (getCurrentEnergyValue() > WarpDriveConfig.i.PB_MAX_ENERGY_VALUE) + { + leftover = (getCurrentEnergyValue() - WarpDriveConfig.i.PB_MAX_ENERGY_VALUE); + currentEnergyValue = WarpDriveConfig.i.PB_MAX_ENERGY_VALUE; + } + + return leftover; + } + + @Override + public int getMaxSafeInput() + { + return Integer.MAX_VALUE; + } + + @Override + public boolean acceptsEnergyFrom(TileEntity emitter, ForgeDirection direction) + { + return true; + } + + /** + * @return the currentEnergyValue + */ + public int getCurrentEnergyValue() + { + return currentEnergyValue; + } + + public boolean consumeEnergy(int amount) + { + if (currentEnergyValue - amount < 0) + { + return false; + } + + currentEnergyValue -= amount; + return true; + } + + public int collectAllEnergy() + { + int energy = currentEnergyValue; + currentEnergyValue = 0; + return energy; + } + + @Override + public void onChunkUnload() + { + if (addedToEnergyNet) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + addedToEnergyNet = false; + } + } + + @Override + public void invalidate() + { + if (addedToEnergyNet) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + addedToEnergyNet = false; + } + + super.invalidate(); + } +} diff --git a/src/cr0s/WarpDrive/TileEntityProtocol.java b/src/cr0s/WarpDrive/TileEntityProtocol.java new file mode 100644 index 00000000..cb4cf021 --- /dev/null +++ b/src/cr0s/WarpDrive/TileEntityProtocol.java @@ -0,0 +1,683 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import dan200.computer.api.IComputerAccess; +import dan200.computer.api.ILuaContext; +import dan200.computer.api.IPeripheral; +import java.util.ArrayList; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.DamageSource; + +/** + * Protocol block tile entity + * @author Cr0s + */ +public class TileEntityProtocol extends TileEntity implements IPeripheral +{ + // Variables + private int distance = 0; + private int direction = 0; + private int mode = 0; + + private boolean jumpFlag = false; + private boolean summonFlag = false; + private String toSummon = ""; + + private String targetJumpgateName = ""; + + // Gabarits + private int front, right, up; + private int back, left, down; + + // Player attaching + public ArrayList players = new ArrayList(); + public String playersString = ""; + + private String beaconFrequency = ""; + + boolean ready = false; // Ready to operate (valid assembly) + + public String[] methodsArray = + { + "dim_getp", "dim_setp", // 0, 1 + "dim_getn", "dim_setn", // 2, 3 + "set_mode", "set_distance", "set_direction", // 4, 5, 6 + "get_attached_players", "summon", "summon_all", // 7, 8, 9 + "get_x", "get_y", "get_z", // 10, 11, 12 + "get_energy_level", "do_jump", "get_ship_size", // 13, 14, 15 + "set_beacon_frequency", "get_dx", "get_dz", // 16, 17, 18 + "set_core_frequency", "is_in_space", "is_in_hyperspace", // 19, 20, 21 + "set_target_jumpgate", // 22 + }; + + private int ticks = 0; + private final int BLOCK_UPDATE_INTERVAL = 20 * 3; // 3 seconds + + private TileEntity core; + + @Override + public void updateEntity() + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return; + } + + if (++ticks >= BLOCK_UPDATE_INTERVAL) + { + findCoreBlock(); + + if (core != null) + { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, this.mode, 1 + 2); // Activated + } + else + { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 1 + 2); // Inactive + } + + ticks = 0; + } + } + + private void setJumpDistance(int distance) + { + this.distance = distance; + } + + private void setMode(int mode) + { + this.mode = mode; + } + + private void setDirection(int dir) + { + if (dir == 1) + { + dir = -1; + } + else if (dir == 2) + { + dir = -2; + } + else if (dir == 255) + { + dir = 270; + } + + this.direction = dir; + } + + private void doJump() + { + if (core != null && core instanceof TileEntityReactor) + { + ((TileEntityReactor)core).randomCooldownAddition = worldObj.rand.nextInt(60); // Adding random ticks to cooldown + } + + setJumpFlag(true); + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + setMode(tag.getInteger("mode")); + setFront(tag.getInteger("front")); + setRight(tag.getInteger("right")); + setUp(tag.getInteger("up")); + setBack(tag.getInteger("back")); + setLeft(tag.getInteger("left")); + setDown(tag.getInteger("down")); + setDistance(tag.getInteger("distance")); + playersString = tag.getString("players"); + updatePlayersList(); + setBeaconFrequency(tag.getString("bfreq")); + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + updatePlayersString(); + tag.setString("players", playersString); + tag.setInteger("mode", this.mode); + tag.setInteger("front", this.front); + tag.setInteger("right", this.right); + tag.setInteger("up", this.up); + tag.setInteger("back", this.back); + tag.setInteger("left", this.left); + tag.setInteger("down", this.down); + tag.setInteger("distance", this.distance); + tag.setString("bfreq", getBeaconFrequency()); + } + + public void attachPlayer(EntityPlayer ep) + { + for (int i = 0; i < players.size(); i++) + { + String nick = players.get(i); + + if (ep.username.equals(nick)) + { + ep.addChatMessage("[WarpCtrlr] Detached."); + players.remove(i); + return; + } + } + + ep.attackEntityFrom(DamageSource.generic, 1); + ep.addChatMessage("[WarpCtrlr] Successfully attached."); + players.add(ep.username); + updatePlayersString(); + } + + public void updatePlayersString() + { + String nick; + this.playersString = ""; + + for (int i = 0; i < players.size(); i++) + { + nick = players.get(i); + this.playersString += nick + "|"; + } + } + + public void updatePlayersList() + { + String[] playersArray = playersString.split("\\|"); + + for (int i = 0; i < playersArray.length; i++) + { + String nick = playersArray[i]; + + if (!nick.isEmpty()) + { + players.add(nick); + } + } + } + + public String getAttachedPlayersList() + { + String list = ""; + + for (int i = 0; i < this.players.size(); i++) + { + String nick = this.players.get(i); + list += nick + ((i == this.players.size() - 1) ? "" : ", "); + } + + if (players.isEmpty()) + { + list = ""; + } + + return list; + } + + /** + * @return the jumpFlag + */ + public boolean isJumpFlag() + { + return jumpFlag; + } + + /** + * @param jumpFlag the jumpFlag to set + */ + public void setJumpFlag(boolean jumpFlag) + { + this.jumpFlag = jumpFlag; + } + + /** + * @return the front + */ + public int getFront() + { + return front; + } + + /** + * @param front the front to set + */ + public void setFront(int front) + { + this.front = front; + } + + /** + * @return the right + */ + public int getRight() + { + return right; + } + + /** + * @param right the right to set + */ + public void setRight(int right) + { + this.right = right; + } + + /** + * @return the up + */ + public int getUp() + { + return up; + } + + /** + * @param up the up to set + */ + public void setUp(int up) + { + this.up = up; + } + + /** + * @return the back + */ + public int getBack() + { + return back; + } + + /** + * @param back the back to set + */ + public void setBack(int back) + { + this.back = back; + } + + /** + * @return the left + */ + public int getLeft() + { + return left; + } + + /** + * @param left the left to set + */ + public void setLeft(int left) + { + this.left = left; + } + + /** + * @return the down + */ + public int getDown() + { + return down; + } + + /** + * @param down the down to set + */ + public void setDown(int down) + { + this.down = down; + } + + public void setDistance(int distance) + { + this.distance = distance; + } + + public int getDistance() + { + return this.distance; + } + + /** + * @return the mode + */ + public int getMode() + { + return mode; + } + + /** + * @return the direction + */ + public int getDirection() + { + return direction; + } + + /** + * @return the summonFlag + */ + public boolean isSummonAllFlag() + { + return summonFlag; + } + + /** + * @param summonFlag the summonFlag to set + */ + public void setSummonAllFlag(boolean summonFlag) + { + this.summonFlag = summonFlag; + } + + @Override + public String getType() + { + return "warpcore"; + } + + @Override + public String[] getMethodNames() + { + return (methodsArray); + } + + @Override + public boolean canAttachToSide(int side) + { + return true; + } + + @Override + public void attach(IComputerAccess computer) + { + } + + @Override + public void detach(IComputerAccess computer) + { + } + + /** + * @return the toSummon + */ + public String getToSummon() + { + return toSummon; + } + + /** + * @param toSummon the toSummon to set + */ + public void setToSummon(String toSummon) + { + this.toSummon = toSummon; + } + + /** + * @return the beaconFrequency + */ + public String getBeaconFrequency() + { + return beaconFrequency; + } + + /** + * @param beaconFrequency the beaconFrequency to set + */ + public void setBeaconFrequency(String beaconFrequency) + { + this.beaconFrequency = beaconFrequency; + } + + public TileEntity findCoreBlock() + { + this.core = worldObj.getBlockTileEntity(xCoord + 1, yCoord, zCoord); + + if (this.core != null && this.core instanceof TileEntityReactor) + { + return this.core; + } + + this.core = worldObj.getBlockTileEntity(xCoord - 1, yCoord, zCoord); + + if (this.core != null && this.core instanceof TileEntityReactor) + { + return this.core; + } + + this.core = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord + 1); + + if (this.core != null && this.core instanceof TileEntityReactor) + { + return this.core; + } + + this.core = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord - 1); + + if (this.core != null && this.core instanceof TileEntityReactor) + { + return this.core; + } + + return null; + } + + @Override + public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception + { + switch (method) + { + case 0: // dim_getp () + return new Integer[] { getFront(), getRight(), getUp() }; + case 1: // dim_setp (front, right, up) + if ( arguments.length != 3 || + ( ( (Double)arguments[0] ).intValue() < 0 || + ( (Double)arguments[1] ).intValue() < 0 || + ( (Double)arguments[2] ).intValue() < 0 || + ( (Double)arguments[0] ).intValue() > WarpDriveConfig.i.WC_MAX_SHIP_SIDE || + ( (Double)arguments[1] ).intValue() > WarpDriveConfig.i.WC_MAX_SHIP_SIDE || + ( (Double)arguments[2] ).intValue() > WarpDriveConfig.i.WC_MAX_SHIP_SIDE ) ) + { + return new Integer[] { -1 }; + } + + setFront(((Double)arguments[0]).intValue()); + setRight(((Double)arguments[1]).intValue()); + setUp(((Double)arguments[2]).intValue()); + WarpDrive.instance.registry.removeDeadCores(); + break; + + case 2: // dim_getn () + return new Integer[] { getBack(), getLeft(), getDown() }; + case 3: // dim_setn (back, left, down) + if ( arguments.length != 3 || + ( ( (Double)arguments[0] ).intValue() < 0 || + ( (Double)arguments[1] ).intValue() < 0 || + ( (Double)arguments[2] ).intValue() < 0 || + ( (Double)arguments[0] ).intValue() > WarpDriveConfig.i.WC_MAX_SHIP_SIDE || + ( (Double)arguments[1] ).intValue() > WarpDriveConfig.i.WC_MAX_SHIP_SIDE || + ( (Double)arguments[2] ).intValue() > WarpDriveConfig.i.WC_MAX_SHIP_SIDE ) ) + { + return new Integer[] { -1 }; + } + + setBack(((Double)arguments[0]).intValue()); + setLeft(((Double)arguments[1]).intValue()); + setDown(((Double)arguments[2]).intValue()); + WarpDrive.instance.registry.removeDeadCores(); + break; + + case 4: // set_mode (mode) + if (arguments.length != 1) + { + return new Integer[] { -1 }; + } + + setMode(((Double)arguments[0]).intValue()); + break; + + case 5: // set_distance (distance) + if (arguments.length != 1) + { + return new Integer[] { -1 }; + } + + setJumpDistance(((Double)arguments[0]).intValue()); + break; + + case 6: // set_direction (dir) + if (arguments.length != 1) + { + return new Integer[] { -1 }; + } + + setDirection(((Double)arguments[0]).intValue()); + break; + + case 7: // get_attached_players + String list = ""; + + for (int i = 0; i < this.players.size(); i++) + { + String nick = this.players.get(i); + list += nick + ((i == this.players.size() - 1) ? "" : ","); + } + + if (players.isEmpty()) + { + list = ""; + } + + return new Object[] { (String)list }; + + case 8: // summon + if (arguments.length != 1) + { + return new Integer[] { -1 }; + } + + int playerID = ((Double)arguments[0]).intValue(); + + if (playerID >= 0 && playerID < players.size()) + { + setToSummon(players.get(playerID)); + } + + break; + + case 9: // summon_all + this.setSummonAllFlag(true); + + case 10: // get_x + if (core == null) + { + return null; + } + + return new Object[] { (Integer)core.xCoord }; + + case 11: // get_y + if (core == null) + { + return null; + } + + return new Object[] { (Integer)core.yCoord }; + + case 12: // get_z + if (core == null) + { + return null; + } + + return new Object[] { (Integer)core.zCoord }; + + case 13: // get_energy_value + if (core != null) + { + return new Object[] { (Integer)((TileEntityReactor)core).currentEnergyValue }; + } + + return null; + + case 14: // do_jump + doJump(); + break; + + case 15: // get_ship_size + if (core != null) + { + ((TileEntityReactor)core).calculateSpatialShipParameters(); + return new Object[] { (Integer)((TileEntityReactor)core).getRealShipVolume() }; + } + + break; + + case 16: // set_beacon_frequency + if (arguments.length == 1) + { + setBeaconFrequency((String)arguments[0]); + } + + break; + + case 17: // get_dx + if (core != null && core instanceof TileEntityReactor) + { + return new Object[] { (Integer)(((TileEntityReactor)core).dx) }; + } + + break; + + case 18: // get_dz + if (core != null && core instanceof TileEntityReactor) + { + return new Object[] { (Integer)(((TileEntityReactor)core).dz) }; + } + + break; + + case 19: // set_core_frequency + if (arguments.length == 1 && (core != null && core instanceof TileEntityReactor)) + { + ((TileEntityReactor)core).coreFrequency = ((String)arguments[0]).replace("/", "").replace(".", "").replace("\\", "."); + } + + break; + + case 20: // is_in_space + return new Boolean[] { worldObj.provider.dimensionId == WarpDrive.instance.spaceDimID }; + case 21: // is_in_hyperspace + return new Boolean[] { worldObj.provider.dimensionId == WarpDrive.instance.hyperSpaceDimID }; + case 22: // set_target_jumpgate + if (arguments.length == 1) + { + setTargetJumpgateName((String)arguments[0]); + } + + break; + } + + return new Integer[] { 0 }; + } + + /** + * @return the targetJumpgateName + */ + public String getTargetJumpgateName() + { + return targetJumpgateName; + } + + /** + * @param targetJumpgateName the targetJumpgateName to set + */ + public void setTargetJumpgateName(String targetJumpgateName) + { + this.targetJumpgateName = targetJumpgateName; + } +} diff --git a/src/cr0s/WarpDrive/TileEntityRadar.java b/src/cr0s/WarpDrive/TileEntityRadar.java new file mode 100644 index 00000000..2a6d6630 --- /dev/null +++ b/src/cr0s/WarpDrive/TileEntityRadar.java @@ -0,0 +1,256 @@ +package cr0s.WarpDrive; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import dan200.computer.api.IComputerAccess; +import dan200.computer.api.ILuaContext; +import dan200.computer.api.IPeripheral; +import net.minecraftforge.common.ForgeDirection; +import ic2.api.energy.event.EnergyTileLoadEvent; +import ic2.api.energy.event.EnergyTileUnloadEvent; +import ic2.api.energy.tile.IEnergySink; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraftforge.common.MinecraftForge; + +public class TileEntityRadar extends TileEntity implements IPeripheral, IEnergySink +{ + public boolean addedToEnergyNet = false; + + private int currentEnergyValue = 0; + + private String[] methodsArray = + { + "scanRay", // 0 + "scanRadius", // 1 + "getResultsCount", // 2 + "getResult", // 3 + "getEnergyLevel", // 4 + "pos" // 5 + }; + + private ArrayList results; + + private int scanRadius = 0; + private int cooldownTime = 0; + + private boolean isEnergyEnoughForScanRadiusW(int radius) + { + int needEnergy = (radius * radius); + return ((getCurrentEnergyValue() - needEnergy) > 0); + } + + @Override + public void updateEntity() + { + if (!addedToEnergyNet && !this.tileEntityInvalid) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(this)); + addedToEnergyNet = true; + } + + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return; + } + + try + { + if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) == 2) + { + if (cooldownTime++ > (20 * ((scanRadius / 1000) + 1))) + { + WarpDrive.instance.registry.removeDeadCores(); + results = WarpDrive.instance.registry.searchWarpCoresInRadius(xCoord, yCoord, zCoord, scanRadius); + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 1 + 2); + cooldownTime = 0; + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + this.currentEnergyValue = tag.getInteger("energy"); + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + tag.setInteger("energy", this.getCurrentEnergyValue()); + } + + // IPeripheral methods implementation + @Override + public String getType() + { + return "radar"; + } + + @Override + public String[] getMethodNames() + { + return methodsArray; + } + + @Override + public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception + { + switch (method) + { + case 0: // scanRay (toX, toY, toZ) + return new Object[] { -1 }; + case 1: // scanRadius (radius) + if (arguments.length == 1) + { + int radius = ((Double)arguments[0]).intValue(); + if (radius <= 0 || radius > 10000) + { + scanRadius = 0; + return new Boolean[] { false }; + } + if (radius != 0 && isEnergyEnoughForScanRadiusW(radius)) + { + // Consume energy + this.currentEnergyValue -= radius * radius; + // Begin searching + scanRadius = radius; + cooldownTime = 0; + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 2, 1 + 2); + } + else + { + results = null; + return new Boolean[] { false }; + } + } + else + return new Boolean[] { false }; + return new Boolean[] { true }; + + case 2: // getResultsCount + if (results != null) + return new Integer[] { results.size() }; + return new Integer[] { 0 }; + case 3: // getResult + if (arguments.length == 1 && (results != null)) + { + int index = ((Double)arguments[0]).intValue(); + if (index > -1 && index < results.size()) + { + TileEntityReactor res = results.get(index); + if (res != null) + { + int yAddition = (res.worldObj.provider.dimensionId == WarpDrive.instance.spaceDimID) ? 256 : (res.worldObj.provider.dimensionId == WarpDrive.instance.hyperSpaceDimID) ? 512 : 0; + return new Object[] { (String)res.coreFrequency, (Integer)res.xCoord, (Integer)res.yCoord + yAddition, (Integer)res.zCoord }; + } + } + } + return new Object[] { (String)"FAIL", 0, 0, 0 }; + case 4: // getEnergyLevel + return new Integer[] { getCurrentEnergyValue() }; + case 5: // Pos + return new Integer[] { xCoord, yCoord, zCoord }; + } + + return null; + } + + @Override + public boolean canAttachToSide(int side) + { + return true; + } + + @Override + public void attach(IComputerAccess computer) + { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 1 + 2); + } + + @Override + public void detach(IComputerAccess computer) + { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 1 + 2); + } + + // IEnergySink methods implementation + @Override + public double demandedEnergyUnits() + { + return (WarpDriveConfig.i.WR_MAX_ENERGY_VALUE - currentEnergyValue); + } + + @Override + public double injectEnergyUnits(ForgeDirection directionFrom, double amount) + { + double leftover = 0; + currentEnergyValue += Math.round(amount); + + if (getCurrentEnergyValue() > WarpDriveConfig.i.WR_MAX_ENERGY_VALUE) + { + leftover = (getCurrentEnergyValue() - WarpDriveConfig.i.WR_MAX_ENERGY_VALUE); + currentEnergyValue = WarpDriveConfig.i.WR_MAX_ENERGY_VALUE; + } + + return leftover; + } + + @Override + public int getMaxSafeInput() + { + return Integer.MAX_VALUE; + } + + @Override + public boolean acceptsEnergyFrom(TileEntity emitter, ForgeDirection direction) + { + return true; + } + + /** + * @return the currentEnergyValue + */ + public int getCurrentEnergyValue() + { + return currentEnergyValue; + } + + @Override + public void onChunkUnload() + { + if (addedToEnergyNet) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + addedToEnergyNet = false; + } + } + + @Override + public void invalidate() + { + if (addedToEnergyNet) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + addedToEnergyNet = false; + } + + super.invalidate(); + } +} diff --git a/src/cr0s/WarpDrive/TileEntityReactor.java b/src/cr0s/WarpDrive/TileEntityReactor.java new file mode 100644 index 00000000..6c206f5e --- /dev/null +++ b/src/cr0s/WarpDrive/TileEntityReactor.java @@ -0,0 +1,1163 @@ +package cr0s.WarpDrive; + +import ic2.api.energy.event.EnergyTileLoadEvent; +import ic2.api.energy.event.EnergyTileUnloadEvent; +import ic2.api.energy.tile.IEnergySink; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityChest; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.MinecraftForge; +import cpw.mods.fml.common.FMLCommonHandler; + +/** + * @author Cr0s + */ +public class TileEntityReactor extends TileEntity implements IEnergySink +{ + public boolean addedToEnergyNet = false; + + public Boolean ready; + + public Boolean invalidAssembly = false; + + public Boolean launchState = false; + + int ticks; + + public final int JUMP_UP = -1; + public final int JUMP_DOWN = -2; + int dx, dz; + int direction; + int distance; + + public int maxX, maxY, maxZ; + public int minX, minY, minZ; + + public int shipFront, shipBack; + public int shipLeft, shipRight; + public int shipUp, shipDown; + public int shipHeight, shipWidth, shipLength; + int shipSize = 0; //ship length in the direction of a jump + int shipVolume = 0; //number of all blocks the ship consists of + int currentMode = 0; + + int currentEnergyValue = 0; + + private final byte MODE_BASIC_JUMP = 1; // 0-128 + private final byte MODE_LONG_JUMP = 2; // 0-12800 + private final byte MODE_BEACON_JUMP = 4; // Jump ship by beacon + private final byte MODE_HYPERSPACE = 5; // Jump to Hyperspace + private final byte MODE_TELEPORT = -1; + private final byte MODE_GATE_JUMP = 6; // Jump via jumpgate + + int cooldownTime = 0; + public int randomCooldownAddition = 0; + + private int registryUpdateTicks = 0; + public String coreFrequency = "default"; + + public int isolationBlocksCount = 0; + public int isolationUpdateTicks = 0; + + public String coreState = ""; + public TileEntityProtocol controller; + + private boolean soundPlayed = false; + + @Override + public void updateEntity() + { + if (!FMLCommonHandler.instance().getEffectiveSide().isClient() && !addedToEnergyNet) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(this)); + addedToEnergyNet = true; + } + + // Update warp core in cores registry + if (++registryUpdateTicks > WarpDriveConfig.i.WC_CORES_REGISTRY_UPDATE_INTERVAL_SECONDS * 20) + { + registryUpdateTicks = 0; + WarpDrive.instance.registry.updateInRegistry(this); + } + + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return; + } + + if (++isolationUpdateTicks > WarpDriveConfig.i.WC_ISOLATION_UPDATE_INTARVAL_SECONDS * 20) + { + isolationUpdateTicks = 0; + updateIsolationState(); + } + + TileEntity c = findControllerBlock(); + + if (c != null) + { + this.controller = (TileEntityProtocol)c; + this.currentMode = controller.getMode(); + shipFront = controller.getFront(); + shipRight = controller.getRight(); + shipUp = controller.getUp(); + shipBack = controller.getBack(); + shipLeft = controller.getLeft(); + shipDown = controller.getDown(); + + if (this.controller.isSummonAllFlag()) + { + summonPlayers(); + controller.setSummonAllFlag(false); + } + else if (!this.controller.getToSummon().isEmpty()) + { + summonSinglePlayer(this.controller.getToSummon()); + this.controller.setToSummon(""); + } + } + else + { + invalidAssembly = true; + return; + } + + switch (currentMode) + { + case MODE_TELEPORT: + if (isChestSummonMode()) + { + if (ticks++ < 20) + { + return; + } + + if (worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) + { + summonPlayersByChestCode(); + ticks = 0; + } + } + else + { + teleportPlayersToSpace(); + } + + break; + + case MODE_BASIC_JUMP: + case MODE_LONG_JUMP: + case MODE_BEACON_JUMP: + case MODE_HYPERSPACE: + case MODE_GATE_JUMP: + if (controller == null) + { + return; + } + + coreState = "Energy level: " + currentEnergyValue + " Eu"; + + if (controller.isJumpFlag()) + { + // Set up activated animation + if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) == 0) + { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 1 + 2); // Set block state to "active" + makePlayersOnShipDrunk(); + } + + if (!soundPlayed) + { + worldObj.playSoundEffect(xCoord + 0.5f, yCoord + 0.5f, zCoord + 0.5f, "warpdrive:warp", 4F, 1F); + this.soundPlayed = true; + } + + // Awaiting cooldown time + if (/*currentMode != MODE_BASIC_JUMP && */cooldownTime++ < ((WarpDriveConfig.i.WC_COOLDOWN_INTERVAL_SECONDS) * 20) + randomCooldownAddition) + { + //System.out.println("[WC] Awaiting cooldown: " + cooldownTime + " < " + ( ((WarpDriveConfig.i.WC_COOLDOWN_INTERVAL_SECONDS) * 20) + randomCooldownAddition)); + return; + } + + cooldownTime = 0; + soundPlayed = false; + + if (!prepareToJump()) + { + return; + } + + if (WarpDrive.instance.registry.isWarpCoreIntersectsWithOthers(this)) + { + this.controller.setJumpFlag(false); + messageToAllPlayersOnShip("Warp field intersects with other ship's field. Cannot jump."); + return; + } + + if (WarpDrive.instance.cloaks.isInCloak(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, false)) + { + this.controller.setJumpFlag(false); + messageToAllPlayersOnShip("Wap-Core is inside cloaking field. Can't jump. Disable cloaking field to jump!"); + return; + } + + doJump(); + controller.setJumpFlag(false); + } + else + { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 1 + 2); // Deactivate block animation + } + + break; + } + } + + public void messageToAllPlayersOnShip(String msg) + { + AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ); + List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); + + for (Object o : list) + { + if (o == null || !(o instanceof EntityPlayer)) + { + continue; + } + + ((EntityPlayer)o).addChatMessage("[WarpCore] " + msg); + } + } + + public void updateIsolationState() + { + // Search block in cube around core with side 10 + int xmax, ymax, zmax, x1, x2, z1, z2; + int xmin, ymin, zmin; + final int ISOLATION_CUBE_SIDE = 6; + x1 = xCoord + ((ISOLATION_CUBE_SIDE / 2) - 1); + x2 = xCoord - ((ISOLATION_CUBE_SIDE / 2) - 1); + + if (x1 < x2) + { + xmin = x1; + xmax = x2; + } + else + { + xmin = x2; + xmax = x1; + } + + z1 = zCoord + ((ISOLATION_CUBE_SIDE / 2) - 1); + z2 = zCoord - ((ISOLATION_CUBE_SIDE / 2) - 1); + + if (z1 < z2) + { + zmin = z1; + zmax = z2; + } + else + { + zmin = z2; + zmax = z1; + } + + ymax = yCoord + ((ISOLATION_CUBE_SIDE / 2) - 1); + ymin = yCoord - ((ISOLATION_CUBE_SIDE / 2) - 1); + this.isolationBlocksCount = 0; + + // Search for warp isolation blocks + for (int y = ymin; y <= ymax; y++) + { + for (int x = xmin; x <= xmax; x++) + { + for (int z = zmin; z <= zmax; z++) + { + if (worldObj.getBlockId(x, y, z) == WarpDriveConfig.i.isolationID) + { + this.isolationBlocksCount++; + } + } + } + } + } + + public void makePlayersOnShipDrunk() + { + if (!prepareToJump()) + { + return; + } + + AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ); + List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); + + for (Object o : list) + { + if (o == null || !(o instanceof EntityPlayer)) + { + continue; + } + + // Set "drunk" effect + ((EntityPlayer)o).addPotionEffect(new PotionEffect(Potion.confusion.id, 180, 0, true)); + } + } + + public void summonPlayers() + { + calculateSpatialShipParameters(); + AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ); + + for (int i = 0; i < controller.players.size(); i++) + { + String nick = controller.players.get(i); + EntityPlayerMP player = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(nick); + + if (player != null && !testBB(aabb, MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ))) + { + summonPlayer(player, xCoord + dx, yCoord, zCoord + dz); + } + } + } + + public void summonSinglePlayer(String nickname) + { + calculateSpatialShipParameters(); + AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ); + + for (int i = 0; i < controller.players.size(); i++) + { + String nick = controller.players.get(i); + EntityPlayerMP player = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(nick); + + if (player != null && nick.equals(nickname) && !testBB(aabb, MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ))) + { + summonPlayer(player, xCoord + dx, yCoord, zCoord + dz); + return; + } + } + } + + public void summonPlayer(EntityPlayerMP player, int x, int y, int z) + { + if (this.currentEnergyValue - WarpDriveConfig.i.WC_ENERGY_PER_ENTITY_TO_SPACE >= 0) + { + player.setPositionAndUpdate(x, y, z); + + if (player.dimension != worldObj.provider.dimensionId) + { + player.mcServer.getConfigurationManager().transferPlayerToDimension(player, this.worldObj.provider.dimensionId, new SpaceTeleporter(DimensionManager.getWorld(this.worldObj.provider.dimensionId), 0, MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ))); + } + + this.currentEnergyValue -= WarpDriveConfig.i.WC_ENERGY_PER_ENTITY_TO_SPACE; + } + } + + public boolean prepareToJump() + { + if (controller == null) + return false; + + this.direction = controller.getDirection(); + this.shipFront = controller.getFront(); + this.shipRight = controller.getRight(); + this.shipUp = controller.getUp(); + this.shipBack = controller.getBack(); + this.shipLeft = controller.getLeft(); + this.shipDown = controller.getDown(); + this.distance = Math.min(WarpDriveConfig.i.WC_MAX_JUMP_DISTANCE, controller.getDistance()); + return calculateSpatialShipParameters(); + } + + public boolean calculateSpatialShipParameters() + { + int x1 = 0, x2 = 0, z1 = 0, z2 = 0; + + if (Math.abs(dx) > 0) + { + if (dx == 1) + { + x1 = xCoord - shipBack; + x2 = xCoord + shipFront; + z1 = zCoord - shipLeft; + z2 = zCoord + shipRight; + } + else + { + x1 = xCoord - shipFront; + x2 = xCoord + shipBack; + z1 = zCoord - shipRight; + z2 = zCoord + shipLeft; + } + } + else if (Math.abs(dz) > 0) + { + if (dz == 1) + { + z1 = zCoord - shipBack; + z2 = zCoord + shipFront; + x1 = xCoord - shipRight; + x2 = xCoord + shipLeft; + } + else + { + z1 = zCoord - shipFront; + z2 = zCoord + shipBack; + x1 = xCoord - shipLeft; + x2 = xCoord + shipRight; + } + } + + if (x1 < x2) + { + minX = x1; + maxX = x2; + } + else + { + minX = x2; + maxX = x1; + } + + if (z1 < z2) + { + minZ = z1; + maxZ = z2; + } + else + { + minZ = z2; + maxZ = z1; + } + + minY = yCoord - shipDown; + maxY = yCoord + shipUp; + this.shipSize = 0; + + int sizeFrontBack = shipFront + shipBack; + int sizeRightLeft = shipRight + shipLeft; + int sizeUpDown = shipUp + shipDown; + + switch (this.direction) + { + case 0: + case 180: + this.shipSize = sizeFrontBack; + break; + + case 90: + case 270: + this.shipSize = sizeRightLeft; + break; + + case -1: + case -2: + this.shipSize = sizeUpDown; + break; + } + // Ship size is too big + if (sizeFrontBack > WarpDriveConfig.i.WC_MAX_SHIP_SIDE || sizeRightLeft > WarpDriveConfig.i.WC_MAX_SHIP_SIDE || sizeUpDown > WarpDriveConfig.i.WC_MAX_SHIP_SIDE) + { + messageToAllPlayersOnShip("Ship is too long. Cannot jump."); + this.controller.setJumpFlag(false); + return false; + } + + this.shipVolume = getRealShipVolume(); + + if (shipVolume > WarpDriveConfig.i.WC_MAX_SHIP_VOLUME_ON_SURFACE && worldObj.provider.dimensionId == 0) + { + this.controller.setJumpFlag(false); + return false; + } + + return true; + } + + private void doBeaconJump() + { + if (currentEnergyValue - calculateRequiredEnergy(shipVolume, distance) < 0) + { + this.controller.setJumpFlag(false); + return; + } + + // Search beacon coordinates + String freq = controller.getBeaconFrequency(); + int beaconX = 0, beaconZ = 0; + boolean isBeaconFound = false; + EntityPlayerMP player; + + for (int i = 0; i < MinecraftServer.getServer().getConfigurationManager().playerEntityList.size(); i++) + { + player = (EntityPlayerMP)MinecraftServer.getServer().getConfigurationManager().playerEntityList.get(i); + + // Skip players from other dimensions + if (player.dimension != worldObj.provider.dimensionId) + { + continue; + } + + TileEntity te = worldObj.getBlockTileEntity(MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY) - 1, MathHelper.floor_double(player.posZ)); + + if (te != null && (te instanceof TileEntityProtocol)) + { + if (((TileEntityProtocol)te).getBeaconFrequency().equals(freq)) + { + beaconX = te.xCoord; + beaconZ = te.zCoord; + isBeaconFound = true; + break; + } + } + } + + // Now make jump to a beacon + if (isBeaconFound) + { + // Consume all energy + currentEnergyValue -= calculateRequiredEnergy(shipVolume, distance); + EntityJump jump = new EntityJump(worldObj, xCoord, yCoord, zCoord, 1, 0, dx, dz, this); + jump.maxX = maxX; + jump.minX = minX; + jump.maxZ = maxZ; + jump.minZ = minZ; + jump.maxY = maxY; + jump.minY = minY; + jump.shipFront = shipFront; + jump.shipBack = shipBack; + jump.shipLeft = shipLeft; + jump.shipRight = shipRight; + jump.shipUp = shipUp; + jump.shipDown = shipDown; + jump.shipLength = this.shipSize; + jump.xCoord = xCoord; + jump.yCoord = yCoord; + jump.zCoord = zCoord; + jump.isCoordJump = true; // is jump to a beacon + jump.destX = beaconX; + jump.destY = yCoord; + jump.destZ = beaconZ; + jump.on = true; + worldObj.spawnEntityInWorld(jump); + coreState = ""; + } + } + + private boolean isShipInJumpgate(JumpGate jg) + { + AxisAlignedBB aabb = jg.getGateAABB(); + int numBlocks = 0; + + if (aabb.isVecInside(worldObj.getWorldVec3Pool().getVecFromPool(maxX - minX, maxY - minY, maxZ - minZ))) + { + return true; + } + + for (int x = minX; x <= maxX; x++) + { + for (int z = minZ; z <= maxZ; z++) + { + for (int y = minY; y <= maxY; y++) + { + if (!worldObj.isAirBlock(x, y, z)) + { + if (aabb.minX <= x && aabb.maxX >= x && aabb.minY <= y && aabb.maxY >= y && aabb.minZ <= z && aabb.maxZ >= z) + { + numBlocks++; + } + } + } + } + } + + if (numBlocks == 0) + { + return false; + } + + // At least 80% of ship must be inside jumpgate + if (shipVolume / numBlocks > 0.8F) + { + return true; + } + + return false; + } + + private boolean isFreePlaceForShip(int destX, int destY, int destZ) + { + int newX, newY, newZ; + + if (destY + shipUp > 255 || destY - shipDown < 5) + { + return false; + } + + int moveX = destX - xCoord; + int moveY = destY - yCoord; + int moveZ = destZ - zCoord; + + for (int x = minX; x <= maxX; x++) + { + for (int z = minZ; z <= maxZ; z++) + { + for (int y = minY; y <= maxY; y++) + { + if (!worldObj.isAirBlock(x, y, z)) + { + newX = moveX + x; + newY = moveY + y; + newZ = moveZ + z; + + if (!worldObj.isAirBlock(newX, newY, newZ)) + { + return false; + } + } + } + } + } + + return true; + } + + private void doGateJump() + { + if (currentEnergyValue - calculateRequiredEnergy(shipVolume, distance) < 0) + { + this.controller.setJumpFlag(false); + return; + } + + // Search beacon coordinates + String gateName = controller.getTargetJumpgateName(); + JumpGate jg = WarpDrive.instance.jumpGates.findGateByName(gateName); + int gateX, gateY, gateZ; + int destX = 0, destY = 0, destZ = 0; + boolean isGateFound = (jg != null); + + // Now make jump to a beacon + if (isGateFound) + { + gateX = jg.xCoord; + gateY = jg.yCoord; + gateZ = jg.zCoord; + destX = gateX; + destY = gateY; + destZ = gateZ; + JumpGate nearestGate = WarpDrive.instance.jumpGates.findNearestGate(xCoord, yCoord, zCoord); + + if (!isShipInJumpgate(nearestGate)) + { + messageToAllPlayersOnShip("[GATE] Ship is not inside the jumpgate. Jump rejected. Nearest jumpgate: " + nearestGate.toNiceString()); + this.controller.setJumpFlag(false); + return; + } + + // If gate is blocked by obstacle + if (!isFreePlaceForShip(gateX, gateY, gateZ)) + { + // Randomize destination coordinates and check for collision with obstacles around jumpgate + // Try to find good place for ship + int numTries = 10; // num tries to check for collision + boolean placeFound = false; + + for (; numTries > 0; numTries--) + { + // randomize dest. coordinates around jumpgate + destX = gateX + ((worldObj.rand.nextBoolean()) ? -1 : 1) * (20 + worldObj.rand.nextInt(100)); + destZ = gateZ + ((worldObj.rand.nextBoolean()) ? -1 : 1) * (20 + worldObj.rand.nextInt(100)); + destY = gateY + ((worldObj.rand.nextBoolean()) ? -1 : 1) * (20 + worldObj.rand.nextInt(50)); + + // check for collision + if (isFreePlaceForShip(destX, destY, destZ)) + { + placeFound = true; + break; + } + } + + if (!placeFound) + { + messageToAllPlayersOnShip("[GATE] Destination gate is blocked by obstacles. Cannot jump."); + this.controller.setJumpFlag(false); + return; + } + + } + + // Consume energy + currentEnergyValue -= calculateRequiredEnergy(shipVolume, distance); + EntityJump jump = new EntityJump(worldObj, xCoord, yCoord, zCoord, 1, 0, dx, dz, this); + jump.maxX = maxX; + jump.minX = minX; + jump.maxZ = maxZ; + jump.minZ = minZ; + jump.maxY = maxY; + jump.minY = minY; + jump.shipFront = shipFront; + jump.shipBack = shipBack; + jump.shipLeft = shipLeft; + jump.shipRight = shipRight; + jump.shipUp = shipUp; + jump.shipDown = shipDown; + jump.shipLength = this.shipSize; + jump.xCoord = xCoord; + jump.yCoord = yCoord; + jump.zCoord = zCoord; + jump.isCoordJump = true; + jump.destX = destX; + jump.destY = destY; + jump.destZ = destZ; + jump.on = true; + worldObj.spawnEntityInWorld(jump); + coreState = ""; + } + else + { + messageToAllPlayersOnShip("[GATE] Destination jumpgate is not found. Check jumpgate name."); + this.controller.setJumpFlag(false); + } + } + + public void doJump() + { + if (currentMode == this.MODE_GATE_JUMP) + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return; + } + + doGateJump(); + return; + } + + if (currentMode == this.MODE_BEACON_JUMP) + { + doBeaconJump(); + return; + } + + // Check ship size for hyperspace jump + if (currentMode == this.MODE_HYPERSPACE) + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return; + } + + JumpGate t = WarpDrive.instance.jumpGates.findNearestGate(xCoord, yCoord, zCoord); + + if (t != null && !isShipInJumpgate(t)) + { + if (shipVolume < WarpDriveConfig.i.WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE) + { + this.messageToAllPlayersOnShip("Ship is too small (" + shipVolume + "/" + WarpDriveConfig.i.WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE + "). Insufficient ship mass to open hyperspace portal."); + this.controller.setJumpFlag(false); + return; + } + } + } + + if (currentMode == this.MODE_BASIC_JUMP || currentMode == this.MODE_LONG_JUMP || currentMode == MODE_HYPERSPACE) + { + if (this.currentEnergyValue - calculateRequiredEnergy(shipVolume, distance) < 0) + { + messageToAllPlayersOnShip("Insufficient energy to jump!"); + this.controller.setJumpFlag(false); + return; + } + + this.currentEnergyValue -= calculateRequiredEnergy(shipVolume, distance); + if (this.currentMode == this.MODE_BASIC_JUMP) + { + distance += shipSize; + } + + if (currentMode == this.MODE_LONG_JUMP && (direction != -1 && direction != -2)) + { + if (worldObj.provider.dimensionId == WarpDrive.instance.hyperSpaceDimID) + { + distance *= 100; + } + } + + EntityJump jump = new EntityJump(worldObj, xCoord, yCoord, zCoord, distance, direction, dx, dz, this); + jump.maxX = maxX; + jump.minX = minX; + jump.maxZ = maxZ; + jump.minZ = minZ; + jump.maxY = maxY; + jump.minY = minY; + jump.shipFront = shipFront; + jump.shipBack = shipBack; + jump.shipLeft = shipLeft; + jump.shipRight = shipRight; + jump.shipUp = shipUp; + jump.shipDown = shipDown; + jump.shipLength = this.shipSize; + jump.isCoordJump = false; + + if (currentMode == MODE_HYPERSPACE) + { + jump.toHyperSpace = (worldObj.provider.dimensionId == WarpDrive.instance.spaceDimID); + jump.fromHyperSpace = (worldObj.provider.dimensionId == WarpDrive.instance.hyperSpaceDimID); + } + + jump.xCoord = xCoord; + jump.yCoord = yCoord; + jump.zCoord = zCoord; + jump.mode = currentMode; + jump.on = true; + worldObj.spawnEntityInWorld(jump); + coreState = ""; + } + } + + public void teleportPlayersToSpace() + { + if (currentMode == MODE_TELEPORT && worldObj.provider.dimensionId != WarpDrive.instance.spaceDimID) + { + if (worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) + { + AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(xCoord - 5, yCoord - 5, zCoord - 5, xCoord + 5, yCoord + 5, zCoord + 5); + List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); + + for (Object o : list) + { + if (currentEnergyValue - WarpDriveConfig.i.WC_ENERGY_PER_ENTITY_TO_SPACE < 0) + { + return; + } + + currentEnergyValue -= WarpDriveConfig.i.WC_ENERGY_PER_ENTITY_TO_SPACE; + Entity entity = (Entity) o; + int x = MathHelper.floor_double(entity.posX); + int z = MathHelper.floor_double(entity.posZ); + //int y = MathHelper.floor_double(entity.posY); + final int WOOL_BLOCK_ID = 35; + int newY; + + for (newY = 254; newY > 0; newY--) + { + if (DimensionManager.getWorld(WarpDrive.instance.spaceDimID).getBlockId(x, newY, z) == WOOL_BLOCK_ID) + { + break; + } + } + + if (newY <= 0) + { + newY = 254; + } + + if (entity instanceof EntityPlayerMP) + { + ((EntityPlayerMP) entity).mcServer.getConfigurationManager().transferPlayerToDimension(((EntityPlayerMP) entity), WarpDrive.instance.spaceDimID, new SpaceTeleporter(DimensionManager.getWorld(WarpDrive.instance.spaceDimID), 0, x, 256, z)); + WorldServer space = DimensionManager.getWorld(WarpDrive.instance.spaceDimID); + + if (space.isAirBlock(x, newY, z)) + { + space.setBlock(x, newY, z, Block.stone.blockID, 0, 2); + space.setBlock(x + 1, newY, z, Block.stone.blockID, 0, 2); + space.setBlock(x - 1, newY, z, Block.stone.blockID, 0, 2); + space.setBlock(x, newY, z + 1, Block.stone.blockID, 0, 2); + space.setBlock(x, newY, z - 1, Block.stone.blockID, 0, 2); + space.setBlock(x + 1, newY, z + 1, Block.stone.blockID, 0, 2); + space.setBlock(x - 1, newY, z - 1, Block.stone.blockID, 0, 2); + space.setBlock(x + 1, newY, z - 1, Block.stone.blockID, 0, 2); + space.setBlock(x - 1, newY, z + 1, Block.stone.blockID, 0, 2); + } + + ((EntityPlayerMP) entity).setPositionAndUpdate(x, newY + 2, z); + } + } + } + } + } + + public void summonPlayersByChestCode() + { + if (worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord) == null) + { + return; + } + + TileEntityChest chest = (TileEntityChest)worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord); + EntityPlayerMP player; + + for (int i = 0; i < MinecraftServer.getServer().getConfigurationManager().playerEntityList.size(); i++) + { + player = (EntityPlayerMP)MinecraftServer.getServer().getConfigurationManager().playerEntityList.get(i); + + if (checkPlayerInventory(chest, player)) + { + summonPlayer(player, xCoord, yCoord + 2, zCoord); + } + } + } + + public boolean checkPlayerInventory(TileEntityChest chest, EntityPlayerMP player) + { + Boolean result = false; + final int MIN_KEY_LENGTH = 5; + int keyLength = 0; + + for (int index = 0; index < chest.getSizeInventory(); index++) + { + ItemStack chestItem = chest.getStackInSlot(index); + ItemStack playerItem = player.inventory.getStackInSlot(9 + index); + + if (chestItem == null || playerItem == null) + { + continue; + } + + if (chestItem.itemID != playerItem.itemID || chestItem.getItemDamage() != playerItem.getItemDamage() || chestItem.stackSize != playerItem.stackSize) + { + return false; + } + else + { + result = true; + } + + keyLength++; + } + + if (keyLength < MIN_KEY_LENGTH) + { + return false; + } + + return result; + } + + public Boolean isChestSummonMode() + { + TileEntity te = worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord); + + if (te != null) + { + return (te instanceof TileEntityChest); + } + + return false; + } + + public boolean testBB(AxisAlignedBB axisalignedbb, int x, int y, int z) + { + return axisalignedbb.minX <= (double) x && axisalignedbb.maxX >= (double) x && axisalignedbb.minY <= (double) y && axisalignedbb.maxY >= (double) y && axisalignedbb.minZ <= (double) z && axisalignedbb.maxZ >= (double) z; + } + + public String getCoreState() + { + return "[WarpCore] " + this.coreState; + } + + public int calculateRequiredEnergy(int shipVolume, int jumpDistance) + { + int energyValue = 0; + + switch (currentMode) + { + case MODE_BASIC_JUMP: + energyValue = (WarpDriveConfig.i.WC_ENERGY_PER_BLOCK_MODE1 * shipVolume) + (WarpDriveConfig.i.WC_ENERGY_PER_DISTANCE_MODE1 * jumpDistance); + break; + + case MODE_LONG_JUMP: + energyValue = (WarpDriveConfig.i.WC_ENERGY_PER_BLOCK_MODE2 * shipVolume) + (WarpDriveConfig.i.WC_ENERGY_PER_DISTANCE_MODE2 * jumpDistance); + break; + + case MODE_HYPERSPACE: + energyValue = WarpDriveConfig.i.WC_MAX_ENERGY_VALUE / 10; // 10% of maximum + break; + + case MODE_BEACON_JUMP: + energyValue = WarpDriveConfig.i.WC_MAX_ENERGY_VALUE / 2; // half of maximum + break; + + case MODE_GATE_JUMP: + energyValue = 2 * shipVolume; + } + + return energyValue; + } + + public int getRealShipVolume() + { + int shipVol = 0; + + for (int x = minX; x <= maxX; x++) + { + for (int z = minZ; z <= maxZ; z++) + { + for (int y = minY; y <= maxY; y++) + { + int blockID = worldObj.getBlockId(x, y, z); + + if (blockID != 0) + { + shipVol++; + } + } + } + } + + return shipVol; + } + + public TileEntity findControllerBlock() + { + TileEntity result; + result = worldObj.getBlockTileEntity(xCoord + 1, yCoord, zCoord); + + if (result != null && result instanceof TileEntityProtocol) + { + dx = 1; + dz = 0; + return result; + } + + result = worldObj.getBlockTileEntity(xCoord - 1, yCoord, zCoord); + + if (result != null && result instanceof TileEntityProtocol) + { + dx = -1; + dz = 0; + return result; + } + + result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord + 1); + + if (result != null && result instanceof TileEntityProtocol) + { + dx = 0; + dz = 1; + return result; + } + + result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord - 1); + + if (result != null && result instanceof TileEntityProtocol) + { + dx = 0; + dz = -1; + return result; + } + + return null; + } + + @Override + public double demandedEnergyUnits() + { + if (this.controller != null && controller.getMode() == 0) + { + return 0; + } + + return (WarpDriveConfig.i.WC_MAX_ENERGY_VALUE - currentEnergyValue); + } + + @Override + public double injectEnergyUnits(ForgeDirection directionFrom, double amount) + { + double leftover = 0; + currentEnergyValue += Math.round(amount); + + if (currentEnergyValue > WarpDriveConfig.i.WC_MAX_ENERGY_VALUE) + { + leftover = (currentEnergyValue - WarpDriveConfig.i.WC_MAX_ENERGY_VALUE); + currentEnergyValue = WarpDriveConfig.i.WC_MAX_ENERGY_VALUE; + } + + return leftover; + } + + @Override + public int getMaxSafeInput() + { + return Integer.MAX_VALUE; + } + + @Override + public boolean acceptsEnergyFrom(TileEntity emitter, ForgeDirection direction) + { + return true; + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + currentEnergyValue = tag.getInteger("energy"); + coreFrequency = tag.getString("corefrequency"); + isolationBlocksCount = tag.getInteger("isolation"); + WarpDrive.instance.registry.updateInRegistry(this); + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + tag.setInteger("energy", currentEnergyValue); + tag.setString("corefrequency", coreFrequency); + tag.setInteger("isolation", this.isolationBlocksCount); + } + + @Override + public void onChunkUnload() + { + if (addedToEnergyNet) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + addedToEnergyNet = false; + } + + WarpDrive.instance.registry.removeFromRegistry(this); + } + + @Override + public void validate() + { + super.validate(); + WarpDrive.instance.registry.updateInRegistry(this); + if (!addedToEnergyNet) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(this)); + addedToEnergyNet = true; + } + } + + @Override + public void invalidate() + { + if (addedToEnergyNet) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + addedToEnergyNet = false; + } + + super.invalidate(); + } +} diff --git a/src/cr0s/WarpDrive/machines/TileEntityShipScanner.java b/src/cr0s/WarpDrive/TileEntityShipScanner.java similarity index 71% rename from src/cr0s/WarpDrive/machines/TileEntityShipScanner.java rename to src/cr0s/WarpDrive/TileEntityShipScanner.java index 1ae6f273..0884c61f 100644 --- a/src/cr0s/WarpDrive/machines/TileEntityShipScanner.java +++ b/src/cr0s/WarpDrive/TileEntityShipScanner.java @@ -1,29 +1,50 @@ -package cr0s.WarpDrive.machines; +package cr0s.WarpDrive; import cpw.mods.fml.common.FMLCommonHandler; -import cr0s.WarpDrive.*; -import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.api.lua.ILuaContext; -import dan200.computercraft.api.peripheral.IPeripheral; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import dan200.computer.api.IComputerAccess; +import dan200.computer.api.ILuaContext; +import dan200.computer.api.IPeripheral; +import net.minecraftforge.common.ForgeDirection; +import ic2.api.energy.event.EnergyTileLoadEvent; +import ic2.api.energy.event.EnergyTileUnloadEvent; +import ic2.api.energy.tile.IEnergySink; import ic2.api.energy.tile.IEnergyTile; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.List; import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.packet.Packet250CustomPayload; +import net.minecraft.server.MinecraftServer; +import net.minecraft.src.ModLoader; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; +import net.minecraftforge.common.MinecraftForge; + +public class TileEntityShipScanner extends TileEntity implements IEnergySink, + IPeripheral { + public boolean addedToEnergyNet = false; -public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { private final int MAX_ENERGY_VALUE = 500000000; // 500kk eU + private int currentEnergyValue = 0; private int state = 0; // 0 - inactive, 1 - active private int firstUncoveredY; @@ -38,17 +59,16 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { int warpCoreSearchTicks = 0; // Config //TODO add to WarpDriveConfig - private final String SCHEMATICS_DIR = "warpDrive_schematics"; + private final String SCHEMATICS_DIR = "schematics"; private final int EU_PER_BLOCK_SCAN = 100; // eU per block of ship volume (including air) private final int EU_PER_BLOCK_DEPLOY = 5000; - private final int BLOCK_TO_DEPLOY_PER_TICK = 3000; + private final int BLOCK_TO_DEPLOY_PER_TICK = 1000; private final int ALLOWED_DEPLOY_RADIUS = 50; // blocks - private String[] methodsArray = { - "scan", // 0 - "fileName", // 1 - "energy", // 2 - "deploy" // 3 deployShipFromSchematic(file, offsetX, offsetY, offsetZ) + private String[] methodsArray = { "scan", // 0 + "fileName", // 1 + "energy", // 2 + "deploy" // 3 deploy(file, offsetX, offsetY, offsetZ) }; private String schematicFileName; @@ -66,7 +86,10 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { if (FMLCommonHandler.instance().getEffectiveSide().isClient()) return; - super.updateEntity(); + if (!addedToEnergyNet && !this.tileEntityInvalid) { + MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(this)); + addedToEnergyNet = true; + } if (++warpCoreSearchTicks > 20) { core = searchWarpCore(); @@ -81,9 +104,9 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { if (state == 0) { // inactive if (++laserTicks > 20) { - WarpDrive.sendLaserPacket(worldObj, - new Vector3(this).translate(0.5D), new Vector3(core.xCoord, core.yCoord, core.zCoord).translate(0.5D), - 0f, 1f, 0f, 40, 0, 100); + sendLaserPacket(new Vector3(this).add(0.5), new Vector3( + core.xCoord, core.yCoord, core.zCoord).add(0.5), 0f, + 1f, 0f, 40, 0, 100); laserTicks = 0; } } else if (state == 1 && !isDeploying) { // active: scanning @@ -129,7 +152,7 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { g = 0f; } - WarpDrive.sendLaserPacket(worldObj, new Vector3(this).translate(0.5D), new Vector3(x, core.maxY, randomZ).translate(0.5D), r, g, b, 15, 0, 100); + sendLaserPacket(new Vector3(this).add(0.5), new Vector3(x, core.maxY, randomZ).add(0.5), r, g, b, 15, 0, 100); } } @@ -165,17 +188,17 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { if (block != null && block.blockID != Block.bedrock.blockID && - !WarpDriveConfig.scannerIgnoreBlocks.contains(block.blockID) && - worldObj.isAirBlock(newX + block.x, newY + block.y, newZ + block.z)) { + !WarpDriveConfig.i.scannerIgnoreBlocks.contains(block.blockID) && + worldObj.isAirBlock(newX + block.x, newY + block.y, newZ + block.z)) + { moveBlockSimple(block); if (worldObj.rand.nextInt(100) <= 10) { worldObj.playSoundEffect(xCoord + 0.5f, yCoord, zCoord + 0.5f, "warpdrive:lowlaser", 4F, 1F); - WarpDrive.sendLaserPacket(worldObj, - new Vector3(this).translate(0.5D), - new Vector3(newX + block.x, newY + block.y, newZ + block.z).translate(0.5D), - 0f, 1f, 0f, 15, 0, 100); + sendLaserPacket(new Vector3(this).add(0.5), new Vector3( + newX + block.x, newY + block.y, newZ + block.z).add(0.5), 0f, + 1f, 0f, 15, 0, 100); } } @@ -190,17 +213,20 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { } private TileEntityReactor searchWarpCore() { - StringBuilder reason = new StringBuilder(); TileEntityReactor result = null; // Search for warp cores above for (int newY = yCoord + 1; newY <= 255; newY++) { - if (worldObj.getBlockId(xCoord, newY, zCoord) == WarpDriveConfig.coreID) { // found warp core above + if (worldObj.getBlockId(xCoord, newY, zCoord) == WarpDriveConfig.i.coreID) { // found + // warp + // core + // above result = (TileEntityReactor) worldObj.getBlockTileEntity( xCoord, newY, zCoord); if (result != null) { - if (!result.validateShipSpatialParameters(reason)) { // If we can't refresh ship's spatial parameters + if (!result.prepareToJump()) { // If we can't refresh ship's + // spatial parameters result = null; } } @@ -212,6 +238,89 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { return result; } + public void sendLaserPacket(Vector3 source, Vector3 dest, float r, float g, + float b, int age, int energy, int radius) { + Side side = FMLCommonHandler.instance().getEffectiveSide(); + + if (side == Side.SERVER) { + ByteArrayOutputStream bos = new ByteArrayOutputStream(8); + DataOutputStream outputStream = new DataOutputStream(bos); + + try { + // Write source vector + outputStream.writeDouble(source.x); + outputStream.writeDouble(source.y); + outputStream.writeDouble(source.z); + // Write target vector + outputStream.writeDouble(dest.x); + outputStream.writeDouble(dest.y); + outputStream.writeDouble(dest.z); + // Write r, g, b of laser + outputStream.writeFloat(r); + outputStream.writeFloat(g); + outputStream.writeFloat(b); + // Write age + outputStream.writeByte(age); + // Write energy value + outputStream.writeInt(energy); + } catch (Exception ex) { + ex.printStackTrace(); + } + + Packet250CustomPayload packet = new Packet250CustomPayload(); + packet.channel = "WarpDriveBeam"; + packet.data = bos.toByteArray(); + packet.length = bos.size(); + MinecraftServer + .getServer() + .getConfigurationManager() + .sendToAllNear(source.intX(), source.intY(), source.intZ(), + radius, worldObj.provider.dimensionId, packet); + ByteArrayOutputStream bos2 = new ByteArrayOutputStream(8); + DataOutputStream outputStream2 = new DataOutputStream(bos2); + + try { + // Write source vector + outputStream2.writeDouble(source.x); + outputStream2.writeDouble(source.y); + outputStream2.writeDouble(source.z); + // Write target vector + outputStream2.writeDouble(dest.x); + outputStream2.writeDouble(dest.y); + outputStream2.writeDouble(dest.z); + // Write r, g, b of laser + outputStream2.writeFloat(r); + outputStream2.writeFloat(g); + outputStream2.writeFloat(b); + // Write age + outputStream2.writeByte(age); + // Write energy value + outputStream2.writeInt(energy); + } catch (Exception ex) { + ex.printStackTrace(); + } + + Packet250CustomPayload packet2 = new Packet250CustomPayload(); + packet.channel = "WarpDriveBeam"; + packet.data = bos.toByteArray(); + packet.length = bos.size(); + MinecraftServer + .getServer() + .getConfigurationManager() + .sendToAllNear(dest.intX(), dest.intY(), dest.intZ(), + radius, worldObj.provider.dimensionId, packet); + } + } + + // Checks energy level + private boolean isEnoughEnergyForScan() { + if (core != null) { + return core.shipVolume * EU_PER_BLOCK_SCAN <= currentEnergyValue; + } + + return false; + } + private void saveShipToSchematic(String fileName) { NBTTagCompound schematic = new NBTTagCompound("Schematic"); @@ -231,7 +340,7 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { int size = width * length * height; // Consume energy - consumeEnergy(size * EU_PER_BLOCK_SCAN, false); + currentEnergyValue = Math.abs(currentEnergyValue - size * EU_PER_BLOCK_SCAN); byte localBlocks[] = new byte[size]; @@ -247,10 +356,9 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { for (int z = 0; z < length; z++) { int blockID = worldObj.getBlockId(core.minX + x, core.minY + y, core.minZ + z); - // Do not scan air, bedrock and specified forbidden blocks (like ore or Warp-Cores) - if (worldObj.isAirBlock(core.minX + x, core.minY + y, core.minZ + z) || blockID == Block.bedrock.blockID /*|| WarpDriveConfig.scannerIgnoreBlocks.contains(blockID)/**/) { + // Do not scan air and bedrock + if ( worldObj.isAirBlock(core.minX + x, core.minY + y, core.minZ + z) || blockID == Block.bedrock.blockID ) blockID = 0; - } int blockMetadata = (byte) worldObj.getBlockMetadata(core.minX + x, core.minY + y, core.minZ + z); localBlocks[x + (y * length + z) * width] = (byte) blockID; @@ -307,8 +415,7 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { writeNBTToFile(fileName, schematic); } - private static void writeNBTToFile(String fileName, NBTTagCompound nbttagcompound) { - System.out.println("[ShipScanner] Filename: " + fileName); + private void writeNBTToFile(String fileName, NBTTagCompound nbttagcompound) { try { File file = new File(fileName); @@ -318,7 +425,8 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { FileOutputStream fileoutputstream = new FileOutputStream(file); - CompressedStreamTools.writeCompressed(nbttagcompound, fileoutputstream); + CompressedStreamTools.writeCompressed(nbttagcompound, + fileoutputstream); fileoutputstream.close(); } catch (Exception exception) { @@ -340,11 +448,10 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { .append(System.currentTimeMillis()).append(".schematic")) .toString(); } while (new File(SCHEMATICS_DIR + "/" + schematicFileName).exists()); - saveShipToSchematic(SCHEMATICS_DIR + "/" + schematicFileName); } - private static NBTTagCompound readNBTFromFile(String fileName) { + private NBTTagCompound readNBTFromFile(String fileName) { try { File file = new File(fileName); if (!file.exists()) { @@ -352,7 +459,8 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { } FileInputStream fileinputstream = new FileInputStream(file); - NBTTagCompound nbttagcompound = CompressedStreamTools.readCompressed(fileinputstream); + NBTTagCompound nbttagcompound = CompressedStreamTools + .readCompressed(fileinputstream); fileinputstream.close(); @@ -364,6 +472,10 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { return null; } + private boolean isEnoughEnergyForDeploy(int size) { + return MAX_ENERGY_VALUE <= currentEnergyValue; + } + // Returns result array for CC interface: [ code, "message" ] private Object[] deployShip(String fileName, int offsetX, int offsetY, int offsetZ) { NBTTagCompound schematic = readNBTFromFile(SCHEMATICS_DIR + "/" + fileName); @@ -392,10 +504,8 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { // Check energy level - if (!consumeEnergy(size * EU_PER_BLOCK_DEPLOY, false)) { - String msg = "[ShipScanner] Not enough energy! Need at least " + (size * EU_PER_BLOCK_DEPLOY) + " EU"; - WarpDrive.debugPrint(msg); - return new Object[] { 1, msg }; + if (!isEnoughEnergyForDeploy(size)) { + return new Object[] { 1, "Not enough energy! Need at least " + MAX_ENERGY_VALUE + " Eu" }; } // Check specified area for occupation by blocks @@ -414,6 +524,9 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { return new Object[] { 2, "Deploying area occupied with " + occupiedBlockCount + " blocks. Can't deploy ship." }; } + // Consume energy + currentEnergyValue = 0; + // Set deployment vars this.blocksToDeploy = new JumpBlock[size]; this.isDeploying = true; @@ -469,27 +582,11 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { jb.blockMeta = (localMetadata[x + (y * length + z) * width]) & 0xFF; jb.blockNBT = tileEntities[x + (y * length + z) * width]; - - - + jb.x = x; jb.y = y; jb.z = z; - - if (jb.blockID != 0 && Block.blocksList[jb.blockID] != null) { - System.out.print("[ShipScanner] Saving block: " + Block.blocksList[jb.blockID].getUnlocalizedName() + ", TE: "); - if (tileEntities[x + (y * length + z) * width] == null) { - System.out.println("null!"); - } else { - System.out.println(tileEntities[x + (y * length + z) * width].getString("id")); - } - - blocksToDeploy[x + (y * length + z) * width] = jb; - } else { - jb = null; - - blocksToDeploy[x + (y * length + z) * width] = jb; - } + blocksToDeploy[x + (y * length + z) * width] = jb; } } } @@ -501,11 +598,13 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { @Override public void readFromNBT(NBTTagCompound tag) { super.readFromNBT(tag); + this.currentEnergyValue = tag.getInteger("energy"); } @Override public void writeToNBT(NBTTagCompound tag) { super.writeToNBT(tag); + tag.setInteger("energy", this.getCurrentEnergyValue()); } // CC @@ -529,15 +628,15 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { if (this.state == 1) return new Object[] { false, 0, "Already scanning" }; - if (core == null) { - return new Object[] { false, 1, "Warp-Core not found" }; - } else if (consumeEnergy(core.shipVolume * EU_PER_BLOCK_SCAN, true)) { + if (core != null && isEnoughEnergyForScan()) { scanShip(); + } else if (core == null) { + return new Object[] { false, 1, "Warp-Core not found" }; } else { return new Object[] { false, 2, "Not enough energy!" }; } - break; + break; case 1: // getSchematicFileName() if (state != 0 && !schematicFileName.isEmpty()) return new Object[] { "Scanning in process. Please wait." }; @@ -545,7 +644,7 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { return new Object[] { schematicFileName }; case 2: // getEnergyLevel() - return new Object[] { getEnergyStored() }; + return new Object[] { currentEnergyValue }; case 3: // deployShipFromSchematic(schematicFileName, offsetX, offsetY, offsetZ) if (arguments.length == 4) { @@ -554,20 +653,24 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { int y = ((Double)arguments[2]).intValue(); int z = ((Double)arguments[3]).intValue(); - if (!new File(SCHEMATICS_DIR + "/" + fileName).exists()) { + if (!new File(SCHEMATICS_DIR + "/" + fileName).exists()) return new Object[] { 0, "Specified .schematic file not found!" }; - } else + else { return deployShip(fileName, x, y, z); } - } else { + } else return new Object[] { 4, ".schematic file name not specified or invalid arguments count!" }; - } } return null; } + @Override + public boolean canAttachToSide(int side) { + return true; + } + @Override public void attach(IComputerAccess computer) { } @@ -577,10 +680,65 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { } // IEnergySink methods implementation + @Override + public double demandedEnergyUnits() { + return (MAX_ENERGY_VALUE - currentEnergyValue); + } + + @Override + public double injectEnergyUnits(ForgeDirection directionFrom, double amount) { + double leftover = 0; + currentEnergyValue += Math.round(amount); + + if (getCurrentEnergyValue() > MAX_ENERGY_VALUE) { + leftover = (getCurrentEnergyValue() - MAX_ENERGY_VALUE); + currentEnergyValue = MAX_ENERGY_VALUE; + } + + return leftover; + } + @Override public int getMaxSafeInput() { return Integer.MAX_VALUE; } + + @Override + public boolean acceptsEnergyFrom(TileEntity emitter, + ForgeDirection direction) { + return true; + } + + /** + * @return the currentEnergyValue + */ + public int getCurrentEnergyValue() { + return currentEnergyValue; + } + + public int collectAllEnergy() { + int energy = currentEnergyValue; + currentEnergyValue = 0; + return energy; + } + + @Override + public void onChunkUnload() { + if (addedToEnergyNet) { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + addedToEnergyNet = false; + } + } + + @Override + public void invalidate() { + if (addedToEnergyNet) { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + addedToEnergyNet = false; + } + + super.invalidate(); + } public boolean moveBlockSimple(JumpBlock shipBlock) { @@ -751,10 +909,5 @@ public class TileEntityShipScanner extends WarpEnergyTE implements IPeripheral { return true; } } - } - - @Override - public boolean equals(IPeripheral other) { - return other == this; } } diff --git a/src/cr0s/WarpDrive/TransitionPlane.java b/src/cr0s/WarpDrive/TransitionPlane.java deleted file mode 100644 index d0cd97ad..00000000 --- a/src/cr0s/WarpDrive/TransitionPlane.java +++ /dev/null @@ -1,104 +0,0 @@ -package cr0s.WarpDrive; - - -import cr0s.WarpDrive.Vector3; -import net.minecraft.nbt.NBTTagCompound; - -/** - * TransitionPlane Class is used for defining transition planes between dimensions. - * - * @author LemADEC - */ - -public class TransitionPlane implements Cloneable -{ - public int dimensionId; - public int dimensionCenterX, dimensionCenterZ; - public int borderSizeX, borderSizeZ; - public int spaceCenterX, spaceCenterZ; - - public TransitionPlane() { - this(0, 0, 0, 5000, 5000, 0, 0); - } - - public TransitionPlane(int parDimensionId, int parDimensionCenterX, int parDimensionCenterZ, int parBorderSizeX, int parBorderSizeZ, int parSpaceCenterX, int parSpaceCenterZ) { - this.dimensionId = parDimensionId; - this.spaceCenterX = parSpaceCenterX; - this.spaceCenterZ = parSpaceCenterZ; - this.dimensionCenterX = parDimensionCenterX; - this.dimensionCenterZ = parDimensionCenterZ; - this.borderSizeX = parBorderSizeX; - this.borderSizeZ = parBorderSizeZ; - } - - public TransitionPlane(NBTTagCompound nbt) { - readFromNBT(nbt); - } - - /** - * Makes a new copy of this Vector. Prevents variable referencing problems. - */ - @Override - public TransitionPlane clone() { - return new TransitionPlane(dimensionId, dimensionCenterX, dimensionCenterZ, borderSizeX, borderSizeZ, spaceCenterX, spaceCenterZ); - } - - /** - * Compute transition. - * - * @param world - * @return - */ - - public boolean isValidToSpace(Vector3 currentPosition) { - return ( (Math.abs(currentPosition.x - dimensionCenterX) <= borderSizeX) && (Math.abs(currentPosition.z - dimensionCenterZ) <= borderSizeZ) ); - } - - public boolean isValidFromSpace(Vector3 currentPosition) { - return ( (Math.abs(currentPosition.x - spaceCenterX) <= borderSizeX) && (Math.abs(currentPosition.z - spaceCenterX) <= borderSizeZ) ); - } - - public void readFromNBT(NBTTagCompound tag) { - this.dimensionId = tag.getInteger("dimensionId"); - this.dimensionCenterX = tag.getInteger("dimensionCenterX"); - this.dimensionCenterZ = tag.getInteger("dimensionCenterZ"); - this.borderSizeX = tag.getInteger("borderSizeX"); - this.borderSizeZ = tag.getInteger("borderSizeZ"); - this.spaceCenterX = tag.getInteger("spaceCenterX"); - this.spaceCenterZ = tag.getInteger("spaceCenterZ"); - } - - public void writeToNBT(NBTTagCompound tag) { - tag.setInteger("dimensionId", dimensionId); - tag.setInteger("dimensionCenterX", dimensionCenterX); - tag.setInteger("dimensionCenterZ", dimensionCenterZ); - tag.setInteger("borderSizeX", borderSizeX); - tag.setInteger("borderSizeZ", borderSizeZ); - tag.setInteger("spaceCenterX", spaceCenterX); - tag.setInteger("spaceCenterZ", spaceCenterZ); - } - - - @Override - public int hashCode() { - return ("dim:" + dimensionId + "(" + dimensionCenterX + "," + dimensionCenterZ + ")_Border(" + borderSizeX + "," + borderSizeZ + ")_Space(" + spaceCenterX + "," + spaceCenterZ).hashCode(); - } - - @Override - public boolean equals(Object o) { - if (o instanceof TransitionPlane) { - TransitionPlane transitionPlane = (TransitionPlane) o; - return this.dimensionId == transitionPlane.dimensionId - && this.dimensionCenterX == transitionPlane.dimensionCenterX && this.dimensionCenterZ == transitionPlane.dimensionCenterZ - && this.borderSizeX == transitionPlane.borderSizeX && this.borderSizeZ == transitionPlane.borderSizeZ - && this.spaceCenterX == transitionPlane.spaceCenterX && this.spaceCenterZ == transitionPlane.spaceCenterZ; - } - - return false; - } - - @Override - public String toString() { - return "TransitionPlane [dim:" + dimensionId + "(" + dimensionCenterX + ", " + dimensionCenterZ + ") Border(" + borderSizeX + ", " + borderSizeZ + ") Space(" + spaceCenterX + ", " + spaceCenterZ + ")]"; - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/Vector3.java b/src/cr0s/WarpDrive/Vector3.java index 51bbaed5..20ba8d48 100644 --- a/src/cr0s/WarpDrive/Vector3.java +++ b/src/cr0s/WarpDrive/Vector3.java @@ -203,14 +203,6 @@ public class Vector3 implements Cloneable return Math.sqrt(var2 * var2 + var4 * var4 + var6 * var6); } - public double distanceTo_square(Vector3 vector3) - { - double var2 = vector3.x - this.x; - double var4 = vector3.y - this.y; - double var6 = vector3.z - this.z; - return var2 * var2 + var4 * var4 + var6 * var6; - } - /** * Multiplies the vector by negative one. */ @@ -493,26 +485,26 @@ public class Vector3 implements Cloneable return translateMatrix(getRotationMatrix(angle, axis), this.clone()); } - public double[] getRotationMatrix(float angle_deg) + public double[] getRotationMatrix(float angle) { double[] matrix = new double[16]; Vector3 axis = this.clone().normalize(); - double xn = axis.x; - double yn = axis.y; - double zn = axis.z; - float angle_rad = angle_deg * 0.0174532925F; - float cos = (float) Math.cos(angle_rad); + double x = axis.x; + double y = axis.y; + double z = axis.z; + angle *= 0.0174532925D; + float cos = (float) Math.cos(angle); float ocos = 1.0F - cos; - float sin = (float) Math.sin(angle_rad); - matrix[0] = (xn * xn * ocos + cos); - matrix[1] = (yn * xn * ocos + zn * sin); - matrix[2] = (xn * zn * ocos - yn * sin); - matrix[4] = (xn * yn * ocos - zn * sin); - matrix[5] = (yn * yn * ocos + cos); - matrix[6] = (yn * zn * ocos + xn * sin); - matrix[8] = (xn * zn * ocos + yn * sin); - matrix[9] = (yn * zn * ocos - xn * sin); - matrix[10] = (zn * zn * ocos + cos); + float sin = (float) Math.sin(angle); + matrix[0] = (x * x * ocos + cos); + matrix[1] = (y * x * ocos + z * sin); + matrix[2] = (x * z * ocos - y * sin); + matrix[4] = (x * y * ocos - z * sin); + matrix[5] = (y * y * ocos + cos); + matrix[6] = (y * z * ocos + x * sin); + matrix[8] = (x * z * ocos + y * sin); + matrix[9] = (y * z * ocos - x * sin); + matrix[10] = (z * z * ocos + cos); matrix[15] = 1.0F; return matrix; } @@ -541,12 +533,12 @@ public class Vector3 implements Cloneable double yawRadians = Math.toRadians(yaw); double pitchRadians = Math.toRadians(pitch); double rollRadians = Math.toRadians(roll); - double oldX = this.x; - double oldY = this.y; - double oldZ = this.z; - this.x = oldX * Math.cos(yawRadians) * Math.cos(pitchRadians) + oldZ * (Math.cos(yawRadians) * Math.sin(pitchRadians) * Math.sin(rollRadians) - Math.sin(yawRadians) * Math.cos(rollRadians)) + oldY * (Math.cos(yawRadians) * Math.sin(pitchRadians) * Math.cos(rollRadians) + Math.sin(yawRadians) * Math.sin(rollRadians)); - this.z = oldX * Math.sin(yawRadians) * Math.cos(pitchRadians) + oldZ * (Math.sin(yawRadians) * Math.sin(pitchRadians) * Math.sin(rollRadians) + Math.cos(yawRadians) * Math.cos(rollRadians)) + oldY * (Math.sin(yawRadians) * Math.sin(pitchRadians) * Math.cos(rollRadians) - Math.cos(yawRadians) * Math.sin(rollRadians)); - this.y = -oldX * Math.sin(pitchRadians) + oldZ * Math.cos(pitchRadians) * Math.sin(rollRadians) + oldY * Math.cos(pitchRadians) * Math.cos(rollRadians); + double x = this.x; + double y = this.y; + double z = this.z; + this.x = x * Math.cos(yawRadians) * Math.cos(pitchRadians) + z * (Math.cos(yawRadians) * Math.sin(pitchRadians) * Math.sin(rollRadians) - Math.sin(yawRadians) * Math.cos(rollRadians)) + y * (Math.cos(yawRadians) * Math.sin(pitchRadians) * Math.cos(rollRadians) + Math.sin(yawRadians) * Math.sin(rollRadians)); + this.z = x * Math.sin(yawRadians) * Math.cos(pitchRadians) + z * (Math.sin(yawRadians) * Math.sin(pitchRadians) * Math.sin(rollRadians) + Math.cos(yawRadians) * Math.cos(rollRadians)) + y * (Math.sin(yawRadians) * Math.sin(pitchRadians) * Math.cos(rollRadians) - Math.cos(yawRadians) * Math.sin(rollRadians)); + this.y = -x * Math.sin(pitchRadians) + z * Math.cos(pitchRadians) * Math.sin(rollRadians) + y * Math.cos(pitchRadians) * Math.cos(rollRadians); } /** @@ -560,13 +552,13 @@ public class Vector3 implements Cloneable public void rotate(double yaw) { double yawRadians = Math.toRadians(yaw); - double oldX = this.x; - double oldZ = this.z; + double x = this.x; + double z = this.z; if (yaw != 0) { - this.x = oldX * Math.cos(yawRadians) - oldZ * Math.sin(yawRadians); - this.z = oldX * Math.sin(yawRadians) + oldZ * Math.cos(yawRadians); + this.x = x * Math.cos(yawRadians) - z * Math.sin(yawRadians); + this.z = x * Math.sin(yawRadians) + z * Math.cos(yawRadians); } } @@ -577,11 +569,11 @@ public class Vector3 implements Cloneable * @param rotationYaw * @param rotationPitch */ - public static Vector3 getDeltaPositionFromRotation(float rotationYaw1, float rotationPitch1) + public static Vector3 getDeltaPositionFromRotation(float rotationYaw, float rotationPitch) { - float rotationYaw2 = rotationYaw1 + 90; - float rotationPitch2 = -rotationPitch1; - return new Vector3(Math.cos(Math.toRadians(rotationYaw2)), Math.sin(Math.toRadians(rotationPitch2)), Math.sin(Math.toRadians(rotationYaw2))); + rotationYaw = rotationYaw + 90; + rotationPitch = -rotationPitch; + return new Vector3(Math.cos(Math.toRadians(rotationYaw)), Math.sin(Math.toRadians(rotationPitch)), Math.sin(Math.toRadians(rotationYaw))); } /** diff --git a/src/cr0s/WarpDrive/WarpCoresRegistry.java b/src/cr0s/WarpDrive/WarpCoresRegistry.java index 966f1860..f4649451 100644 --- a/src/cr0s/WarpDrive/WarpCoresRegistry.java +++ b/src/cr0s/WarpDrive/WarpCoresRegistry.java @@ -1,29 +1,33 @@ package cr0s.WarpDrive; import java.util.ArrayList; -import java.util.LinkedList; -import cr0s.WarpDrive.machines.TileEntityReactor; +import net.minecraft.entity.Entity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; /** Registry of active Warp Cores in world * @author Cr0s */ -public class WarpCoresRegistry { - private LinkedList registry; +public class WarpCoresRegistry +{ + private ArrayList registry; - public WarpCoresRegistry() { - registry = new LinkedList(); + public WarpCoresRegistry() + { + registry = new ArrayList(); } - public int searchCoreInRegistry(TileEntityReactor core) { + public int searchCoreInRegistry(TileEntityReactor core) + { int res = -1; - for (int i = 0; i < registry.size(); i++) { + for (int i = 0; i < registry.size(); i++) + { TileEntityReactor c = registry.get(i); - if (c.xCoord == core.xCoord && c.yCoord == core.yCoord && c.zCoord == core.zCoord) { + if (c.xCoord == core.xCoord && c.yCoord == core.yCoord && c.zCoord == core.zCoord) + { return i; } } @@ -31,41 +35,49 @@ public class WarpCoresRegistry { return res; } - public boolean isCoreInRegistry(TileEntityReactor core) { + public boolean isCoreInRegistry(TileEntityReactor core) + { return (searchCoreInRegistry(core) != -1); } - public void updateInRegistry(TileEntityReactor core) { + public void updateInRegistry(TileEntityReactor core) + { int idx = searchCoreInRegistry(core); // update - if (idx != -1) { + if (idx != -1) + { registry.set(idx, core); - } else { + } + else + { registry.add(core); } } - public void removeFromRegistry(TileEntityReactor core) { - int idx = searchCoreInRegistry(core); + public void removeFromRegistry(TileEntityReactor core) + { + int idx; - if (idx != -1) { + if ((idx = searchCoreInRegistry(core)) != -1) + { registry.remove(idx); } } - public ArrayList searchWarpCoresInRadius(int x, int y, int z, int radius) { - ArrayList res = new ArrayList(registry.size()); + public ArrayList searchWarpCoresInRadius(int x, int y, int z, int radius) + { + ArrayList res = new ArrayList(); - printRegistry(); - for (TileEntityReactor c : registry) { + for (TileEntityReactor c : registry) + { double d3 = c.xCoord - x; double d4 = c.yCoord - y; double d5 = c.zCoord - z; double distance = MathHelper.sqrt_double(d3 * d3 + d4 * d4 + d5 * d5); -// if (distance <= radius && !(c.controller == null || c.controller.getMode() == 0) && !isCoreHidden(c)) { - if (distance <= radius && !isCoreHidden(c)) { + if (distance <= radius && !(c.controller == null || c.controller.getMode() == 0) && !isCoreHidden(c)) + { res.add(c); } } @@ -73,22 +85,26 @@ public class WarpCoresRegistry { return res; } - public void printRegistry() { + public void printRegistry() + { System.out.println("WarpCores registry:"); removeDeadCores(); - for (TileEntityReactor c : registry) { - System.out.println("- " + c.coreFrequency + " (" + c.xCoord + ", " + c.yCoord + ", " + c.zCoord + ")"); + for (TileEntityReactor c : registry) + { + System.out.println(c.coreFrequency + " (" + c.xCoord + "; " + c.yCoord + "; " + c.zCoord + ")"); } } final int LOWER_HIDE_POINT = 18; - private boolean isCoreHidden(TileEntityReactor core) { - if (core.isolationBlocksCount > 5) { + private boolean isCoreHidden(TileEntityReactor core) + { + if (core.isolationBlocksCount > 5) + { int randomNumber = core.worldObj.rand.nextInt(150); - if (randomNumber < LOWER_HIDE_POINT + core.isolationBlocksCount) { - WarpDrive.debugPrint("" + this + " Core '" + core.coreFrequency + "' is hidden"); + if (randomNumber < LOWER_HIDE_POINT + core.isolationBlocksCount) + { return true; } } @@ -96,27 +112,28 @@ public class WarpCoresRegistry { return false; } - public boolean isWarpCoreIntersectsWithOthers(TileEntityReactor core) { - StringBuilder reason = new StringBuilder(); + public boolean isWarpCoreIntersectsWithOthers(TileEntityReactor core) + { AxisAlignedBB aabb1, aabb2; removeDeadCores(); - - core.validateShipSpatialParameters(reason); - aabb1 = AxisAlignedBB.getBoundingBox(core.minX, core.minY, core.minZ, core.maxX, core.maxY, core.maxZ); - for (TileEntityReactor c : registry) { + for (TileEntityReactor c : registry) + { // Skip cores in other worlds - if (c.worldObj != core.worldObj) { + if (c.worldObj != core.worldObj) + { continue; } // Skip self - if (c.xCoord == core.xCoord && c.yCoord == core.yCoord && c.zCoord == core.zCoord) { + if (c.xCoord == core.xCoord && c.yCoord == core.yCoord && c.zCoord == core.zCoord) + { continue; } // Skip offline warp cores - if (c.controller == null || c.controller.getMode() == 0 || !c.validateShipSpatialParameters(reason)) { + if (c.controller == null || c.controller.getMode() == 0 || !c.prepareToJump()) + { continue; } @@ -124,12 +141,19 @@ public class WarpCoresRegistry { double d3 = c.xCoord - core.xCoord; double d4 = c.yCoord - core.yCoord; double d5 = c.zCoord - core.zCoord; - double distance2 = d3 * d3 + d4 * d4 + d5 * d5; + double distance = MathHelper.sqrt_double(d3 * d3 + d4 * d4 + d5 * d5); - if (distance2 <= ((2 * WarpDriveConfig.WC_MAX_SHIP_SIDE) - 1) * ((2 * WarpDriveConfig.WC_MAX_SHIP_SIDE) - 1)) { + if (distance <= (2 * WarpDriveConfig.i.WC_MAX_SHIP_SIDE) - 1) + { + // Check for warpfields intersections + core.prepareToJump(); // calculate spatial parameters + c.prepareToJump(); // Compare warp-fields for intersection + aabb1 = AxisAlignedBB.getBoundingBox(core.minX, core.minY, core.minZ, core.maxX, core.maxY, core.maxZ); aabb2 = AxisAlignedBB.getBoundingBox(c.minX, c.minY, c.minZ, c.maxX, c.maxY, c.maxZ); - if (aabb1.intersectsWith(aabb2)) { + + if (aabb1.intersectsWith(aabb2)) + { return true; } } @@ -138,18 +162,17 @@ public class WarpCoresRegistry { return false; } - public void removeDeadCores() { - LocalProfiler.start("WarpCoresRegistry Removing dead cores"); + public void removeDeadCores() + { + LocalProfiler.start("WCR.removeDeadCores()"); + ArrayList oldRegistry = (ArrayList) registry.clone(); - TileEntityReactor c; - for (int i = registry.size() - 1; i >= 0; i--) { - c = registry.get(i); - if (c == null || c.worldObj == null || c.worldObj.getBlockId(c.xCoord, c.yCoord, c.zCoord) != WarpDriveConfig.coreID || c.worldObj.getBlockTileEntity(c.xCoord, c.yCoord, c.zCoord) != c || c.worldObj.getBlockTileEntity(c.xCoord, c.yCoord, c.zCoord).isInvalid()) { - WarpDrive.debugPrint("Removing 'dead' core at " + ((c != null)? c.xCoord : "?") + ", " + ((c != null)? c.yCoord : "?") + ", " + ((c != null)? c.zCoord : "?")); - registry.remove(i); - } - } + for (TileEntityReactor c : registry) + if (c == null || c.worldObj == null || c.worldObj.getBlockId(c.xCoord, c.yCoord, c.zCoord) != WarpDriveConfig.i.coreID || c.worldObj.getBlockTileEntity(c.xCoord, c.yCoord, c.zCoord) != c || c.worldObj.getBlockTileEntity(c.xCoord, c.yCoord, c.zCoord).isInvalid()) + oldRegistry.remove(c); + // Update old registry to new witout dead cores + this.registry = (ArrayList) oldRegistry.clone(); LocalProfiler.stop(); } diff --git a/src/cr0s/WarpDrive/WarpDrive.java b/src/cr0s/WarpDrive/WarpDrive.java index c3592c94..2628c648 100644 --- a/src/cr0s/WarpDrive/WarpDrive.java +++ b/src/cr0s/WarpDrive/WarpDrive.java @@ -3,7 +3,11 @@ package cr0s.WarpDrive; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Init; import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.Mod.PostInit; +import cpw.mods.fml.common.Mod.PreInit; +import cpw.mods.fml.common.Mod.ServerStarting; import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; @@ -11,16 +15,8 @@ import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; import cpw.mods.fml.common.network.NetworkMod; import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.item.*; -import cr0s.WarpDrive.machines.*; -import dan200.computercraft.api.ComputerCraftAPI; +import cpw.mods.fml.common.registry.LanguageRegistry; -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import net.minecraft.block.Block; @@ -29,8 +25,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.network.packet.Packet250CustomPayload; -import net.minecraft.server.MinecraftServer; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.Configuration; @@ -38,22 +32,19 @@ import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.ForgeChunkManager.LoadingCallback; import net.minecraftforge.common.ForgeChunkManager.Ticket; -import net.minecraftforge.common.ForgeChunkManager.Type; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; -@Mod(modid = "WarpDrive", name = "WarpDrive", version = "1.2.5.0", - dependencies = "required-after:IC2; required-after:ComputerCraft; after:CCTurtle; after:gregtech_addon; required-after:AppliedEnergistics; after:AdvancedSolarPanel; after:AtomicScience; after:ICBM|Explosion; after:MFFS; after:GraviSuite; after:UndergroundBiomes; after:NetherOres") +@Mod(modid = "WarpDrive", name = "WarpDrive", version = "1.2.0_ZLO", dependencies="required-after:IC2; after:required-AppliedEnergistics; after:extracells; required-after:ComputerCraft; after:CCTurtle; after:gregtech_addon; after:AdvancedSolarPanel; after:AtomicScience; after:ICBM|Explosion; after:MFFS; after:GraviSuite") @NetworkMod(clientSideRequired = true, serverSideRequired = true, channels = { - "WarpDriveBeam", - "WarpDriveFreq", + "WarpDriveBeam", + "WarpDriveFreq", "WarpDriveLaserT", "WarpDriveCloaks" }, packetHandler = PacketHandler.class) /** * @author Cr0s */ -public class WarpDrive implements LoadingCallback { +public class WarpDrive implements LoadingCallback +{ // World limits public final static int WORLD_LIMIT_BLOCKS = 100000; @@ -68,43 +59,33 @@ public class WarpDrive implements LoadingCallback { public static Block monitorBlock; public static Block boosterBlock; public static Block miningLaserBlock; - public static Block laserTreeFarmBlock; public static Block liftBlock; public static Block scannerBlock; public static Block cloakBlock; public static Block cloakCoilBlock; - public static Block transporterBlock; - public static Block reactorMonitorBlock; - public static Block powerReactorBlock; - public static Block powerLaserBlock; - + public static Block airBlock; public static Block gasBlock; public static Block iridiumBlock; - public static Block transportBeaconBlock; - - public static Item reactorLaserFocusItem; - public static ItemWarpComponent componentItem; - + public static BiomeGenBase spaceBiome; public World space; + private int spaceProviderID; + public int spaceDimID; public SpaceWorldGenerator spaceWorldGenerator; public HyperSpaceWorldGenerator hyperSpaceWorldGenerator; - public World hyperSpace; - - // Client settings - public static float normalFOV = 70.0F; - public static float normalSensitivity = 1.0F; - public static CreativeTabs warpdriveTab = new WarpDriveCreativeTab("Warpdrive","Warpdrive").setBackgroundImageName("warpdrive:creativeTab"); - + public World hyperSpace; + private int hyperSpaceProviderID; + public int hyperSpaceDimID; + @Instance("WarpDrive") public static WarpDrive instance; - @SidedProxy(clientSide = "cr0s.WarpDrive.client.ClientProxy", serverSide = "cr0s.WarpDrive.CommonProxy") + @SidedProxy(clientSide = "cr0s.WarpDrive.ClientProxy", serverSide = "cr0s.WarpDrive.CommonProxy") public static CommonProxy proxy; - public WarpCoresRegistry warpCores; + public WarpCoresRegistry registry; public JumpGatesRegistry jumpGates; public CloakManager cloaks; @@ -112,708 +93,249 @@ public class WarpDrive implements LoadingCallback { public CamRegistry cams; public boolean isOverlayEnabled = false; public int overlayType = 0; - public String debugMessage = ""; - - public static WarpDrivePeripheralHandler peripheralHandler = new WarpDrivePeripheralHandler(); - - public static String defHelpStr = "help(\"functionName\"): returns help for the function specified"; - public static String defEnergyStr = "energy(): returns currently contained energy, max contained energy"; - - private LinkedList warpTickets = new LinkedList(); @EventHandler - public void preInit(FMLPreInitializationEvent event) { - WarpDriveConfig.preInit(new Configuration(event.getSuggestedConfigurationFile())); + //@PreInit + public void preInit(FMLPreInitializationEvent event) + { + WarpDriveConfig.Init(new Configuration(event.getSuggestedConfigurationFile())); - if (FMLCommonHandler.instance().getSide().isClient()) { - Minecraft mc = Minecraft.getMinecraft(); - - // System.out.println("[WarpDrive] Registering sounds event handler..."); + if (FMLCommonHandler.instance().getSide().isClient()) + { + System.out.println("[WarpDrive] Registering sounds event handler..."); MinecraftForge.EVENT_BUS.register(new SoundHandler()); - - normalFOV = mc.gameSettings.fovSetting; - normalSensitivity = mc.gameSettings.mouseSensitivity; - System.out.println("[WarpDrive] FOV is " + normalFOV + " Sensitivity is " + normalSensitivity); - } - } - - @SideOnly(Side.CLIENT) - @EventHandler - public void init(FMLInitializationEvent event) { -// FIXME FMLInterModComms.sendMessage("Waila", "register", "cr0s.WarpDrive.client.WailaHandler.callbackRegister"); - } - - public static void debugPrint(String out) { - if (WarpDriveConfig.debugMode == false) { - return; - } - if (WarpDriveConfig.debugMode) { - System.out.println(out); } } - @EventHandler - public void load(FMLInitializationEvent event) { - WarpDriveConfig.load(); - + @Init + public void load(FMLInitializationEvent event) + { + WarpDriveConfig.i.Init2(); + // WARP CORE + this.warpCore = new BlockReactor(WarpDriveConfig.i.coreID, 0, Material.rock) + .setHardness(0.5F).setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone).setUnlocalizedName("Warp Core"); + LanguageRegistry.addName(warpCore, "Warp Core"); + GameRegistry.registerBlock(warpCore, "warpCore"); + GameRegistry.registerTileEntity(TileEntityReactor.class, "warpCore"); // CORE CONTROLLER - protocolBlock = new BlockProtocol(WarpDriveConfig.controllerID,0, Material.rock); - + this.protocolBlock = new BlockProtocol(WarpDriveConfig.i.controllerID, 0, Material.rock) + .setHardness(0.5F).setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone).setUnlocalizedName("Warp Controller"); + LanguageRegistry.addName(protocolBlock, "Warp Controller"); GameRegistry.registerBlock(protocolBlock, "protocolBlock"); GameRegistry.registerTileEntity(TileEntityProtocol.class, "protocolBlock"); - - // WARP CORE - warpCore = new BlockReactor(WarpDriveConfig.coreID, 0, Material.rock); - - GameRegistry.registerBlock(warpCore, "warpCore"); - GameRegistry.registerTileEntity(TileEntityReactor.class, "warpCore"); - // WARP RADAR - radarBlock = new BlockRadar(WarpDriveConfig.radarID, 0, Material.rock); - + this.radarBlock = new BlockRadar(WarpDriveConfig.i.radarID, 0, Material.rock) + .setHardness(0.5F).setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone).setUnlocalizedName("W-Radar"); + LanguageRegistry.addName(radarBlock, "W-Radar"); GameRegistry.registerBlock(radarBlock, "radarBlock"); GameRegistry.registerTileEntity(TileEntityRadar.class, "radarBlock"); - // WARP ISOLATION - isolationBlock = new BlockWarpIsolation( WarpDriveConfig.isolationID, 0, Material.rock); - + this.isolationBlock = new BlockWarpIsolation(WarpDriveConfig.i.isolationID, 0, Material.rock) + .setHardness(0.5F).setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone).setUnlocalizedName("Warp-Field Isolation Block"); + LanguageRegistry.addName(isolationBlock, "Warp-Field Isolation Block"); GameRegistry.registerBlock(isolationBlock, "isolationBlock"); - // AIR GENERATOR - airgenBlock = new BlockAirGenerator(WarpDriveConfig.airgenID, 0,Material.rock); - + this.airgenBlock = new BlockAirGenerator(WarpDriveConfig.i.airgenID, 0, Material.rock) + .setHardness(0.5F).setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone).setUnlocalizedName("Air Generator"); + LanguageRegistry.addName(airgenBlock, "Air Generator"); GameRegistry.registerBlock(airgenBlock, "airgenBlock"); GameRegistry.registerTileEntity(TileEntityAirGenerator.class, "airgenBlock"); - - // AIR BLOCK - airBlock = (new BlockAir(WarpDriveConfig.airID)); - + this.airBlock = (new BlockAir(WarpDriveConfig.i.airID)).setHardness(0.0F).setUnlocalizedName("Air block"); + LanguageRegistry.addName(airBlock, "Air block"); GameRegistry.registerBlock(airBlock, "airBlock"); - // GAS BLOCK - gasBlock = (new BlockGas(WarpDriveConfig.gasID)); - + this.gasBlock = (new BlockGas(WarpDriveConfig.i.gasID)).setHardness(0.0F).setUnlocalizedName("Gas block"); + LanguageRegistry.addName(gasBlock, "Gas block"); GameRegistry.registerBlock(gasBlock, "gasBlock"); - // LASER EMITTER - laserBlock = new BlockLaser(WarpDriveConfig.laserID, 0,Material.rock); - + this.laserBlock = new BlockLaser(WarpDriveConfig.i.laserID, 0, Material.rock) + .setHardness(0.5F).setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone).setUnlocalizedName("Laser Emitter"); + LanguageRegistry.addName(laserBlock, "Laser Emitter"); GameRegistry.registerBlock(laserBlock, "laserBlock"); GameRegistry.registerTileEntity(TileEntityLaser.class, "laserBlock"); - // LASER EMITTER WITH CAMERA - laserCamBlock = new BlockLaserCam(WarpDriveConfig.laserCamID, 0, Material.rock); - + this.laserCamBlock = new BlockLaserCam(WarpDriveConfig.i.laserCamID, 0, Material.rock) + .setHardness(0.5F).setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone).setUnlocalizedName("Laser Emitter + Camera"); + LanguageRegistry.addName(laserCamBlock, "Laser Emitter + Camera"); GameRegistry.registerBlock(laserCamBlock, "laserCamBlock"); - // CAMERA - cameraBlock = new BlockCamera(WarpDriveConfig.camID, 0,Material.rock); - + this.cameraBlock = new BlockCamera(WarpDriveConfig.i.camID, 0, Material.rock) + .setHardness(0.5F).setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone).setUnlocalizedName("Camera block"); + LanguageRegistry.addName(cameraBlock, "Camera"); GameRegistry.registerBlock(cameraBlock, "cameraBlock"); GameRegistry.registerTileEntity(TileEntityCamera.class, "cameraBlock"); - // MONITOR - monitorBlock = new BlockMonitor(WarpDriveConfig.monitorID); - + this.monitorBlock = new BlockMonitor(WarpDriveConfig.i.monitorID) + .setHardness(0.5F).setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone).setUnlocalizedName("Monitor"); + LanguageRegistry.addName(monitorBlock, "Monitor"); GameRegistry.registerBlock(monitorBlock, "monitorBlock"); GameRegistry.registerTileEntity(TileEntityMonitor.class, "monitorBlock"); - - // MINING LASER - miningLaserBlock = new BlockMiningLaser(WarpDriveConfig.miningLaserID, 0, Material.rock); - + this.miningLaserBlock = new BlockMiningLaser(WarpDriveConfig.i.miningLaserID, 0, Material.rock) + .setHardness(0.5F).setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone).setUnlocalizedName("Mining Laser"); + LanguageRegistry.addName(miningLaserBlock, "Mining Laser"); GameRegistry.registerBlock(miningLaserBlock, "miningLaserBlock"); GameRegistry.registerTileEntity(TileEntityMiningLaser.class, "miningLaserBlock"); - - // LASER TREE FARM - laserTreeFarmBlock = new BlockLaserTreeFarm(WarpDriveConfig.laserTreeFarmID, 0, Material.rock); - - GameRegistry.registerBlock(laserTreeFarmBlock, "laserTreeFarmBlock"); - GameRegistry.registerTileEntity(TileEntityLaserTreeFarm.class,"laserTreeFarmBlock"); - // PARTICLE BOOSTER - boosterBlock = new BlockParticleBooster(WarpDriveConfig.particleBoosterID, 0, Material.rock); - + this.boosterBlock = new BlockParticleBooster(WarpDriveConfig.i.particleBoosterID, 0, Material.rock) + .setHardness(0.5F).setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone).setUnlocalizedName("Particle Booster"); + LanguageRegistry.addName(boosterBlock, "Particle Booster"); GameRegistry.registerBlock(boosterBlock, "boosterBlock"); GameRegistry.registerTileEntity(TileEntityParticleBooster.class, "boosterBlock"); - // LASER LIFT - liftBlock = new BlockLift(WarpDriveConfig.liftID, 0, Material.rock); - + this.liftBlock = new BlockLift(WarpDriveConfig.i.liftID, 0, Material.rock) + .setHardness(0.5F).setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone).setUnlocalizedName("Laser lift"); + LanguageRegistry.addName(liftBlock, "Laser lift"); GameRegistry.registerBlock(liftBlock, "liftBlock"); GameRegistry.registerTileEntity(TileEntityLift.class, "liftBlock"); - // IRIDIUM BLOCK - iridiumBlock = new BlockIridium(WarpDriveConfig.iridiumBlockID); - + this.iridiumBlock = new BlockIridium(WarpDriveConfig.i.iridiumID) + .setHardness(0.8F).setResistance(150 * 4).setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone).setUnlocalizedName("Block of Iridium"); + LanguageRegistry.addName(iridiumBlock, "Block of Iridium"); GameRegistry.registerBlock(iridiumBlock, "iridiumBlock"); - - // SHIP SCANNER - scannerBlock = new BlockShipScanner(WarpDriveConfig.shipScannerID, 0, Material.rock); - - GameRegistry.registerBlock(scannerBlock, "scannerBlock"); - GameRegistry.registerTileEntity(TileEntityShipScanner.class, "scannerBlock"); - // CLOAKING DEVICE CORE - cloakBlock = new BlockCloakingDeviceCore(WarpDriveConfig.cloakCoreID, 0, Material.rock); - - GameRegistry.registerBlock(cloakBlock, "cloakBlock"); - GameRegistry.registerTileEntity(TileEntityCloakingDeviceCore.class, "cloakBlock"); - - // CLOAKING DEVICE COIL - cloakCoilBlock = new BlockCloakingCoil(WarpDriveConfig.cloakCoilID, 0, Material.rock); - - GameRegistry.registerBlock(cloakCoilBlock, "cloakCoilBlock"); - - // TRANSPORTER - transporterBlock = new BlockTransporter(WarpDriveConfig.transporterID,Material.rock); - - GameRegistry.registerBlock(transporterBlock, "transporter"); - GameRegistry.registerTileEntity(TileEntityTransporter.class,"transporter"); - - reactorMonitorBlock = new BlockLaserReactorMonitor(WarpDriveConfig.reactorMonitorID, Material.rock); - - GameRegistry.registerBlock(reactorMonitorBlock, "reactorMonitor"); - GameRegistry.registerTileEntity(TileEntityLaserReactorMonitor.class,"reactorMonitor"); - - // TRANSPORT BEACON - /*transportBeaconBlock = new BlockTransportBeacon(WarpDriveConfig.transportBeaconID) - .setHardness(0.5F) - .setStepSound(Block.soundMetalFootstep) - .setCreativeTab(CreativeTabs.tabRedstone) - .setUnlocalizedName("warpdrive.blocks.TransporterBeacon"); - - GameRegistry.registerBlock(transportBeaconBlock, "transportBeacon");*/ - - // POWER STUFF - powerReactorBlock = new BlockPowerReactor(WarpDriveConfig.powerReactorID); - GameRegistry.registerBlock(powerReactorBlock,"powerReactor"); - GameRegistry.registerTileEntity(TileEntityPowerReactor.class, "powerReactor"); - powerLaserBlock = new BlockPowerLaser(WarpDriveConfig.powerLaserID); - GameRegistry.registerBlock(powerLaserBlock, "powerLaser"); - GameRegistry.registerTileEntity(TileEntityPowerLaser.class, "powerLaser"); - - // REACTOR LASER FOCUS - reactorLaserFocusItem = new ItemReactorLaserFocus(WarpDriveConfig.reactorLaserFocusID); - GameRegistry.registerItem(reactorLaserFocusItem, "reactorLaserFocus"); - - // COMPONENT ITEMS - componentItem = new ItemWarpComponent(WarpDriveConfig.componentID); - GameRegistry.registerItem(componentItem, "component"); - - + // SHIP SCANNER + this.scannerBlock = new BlockShipScanner(WarpDriveConfig.i.shipScannerID, 0, Material.rock) + .setHardness(0.5F).setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone).setUnlocalizedName("Ship Scanner"); + + LanguageRegistry.addName(scannerBlock, "Ship Scanner"); + GameRegistry.registerBlock(scannerBlock, "scannerBlock"); + GameRegistry.registerTileEntity(TileEntityShipScanner.class, "scannerBlock"); + + // CLOAKING DEVICE CORE + this.cloakBlock = new BlockCloakingDeviceCore(WarpDriveConfig.i.cloakCoreID, 0, Material.rock) + .setHardness(0.5F).setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone).setUnlocalizedName("Cloaking Device Core"); + + LanguageRegistry.addName(cloakBlock, "Cloaking Device Core"); + GameRegistry.registerBlock(cloakBlock, "cloakBlock"); + GameRegistry.registerTileEntity(TileEntityCloakingDeviceCore.class, "cloakBlock"); + + // CLOAKING DEVICE COIL + this.cloakCoilBlock = new BlockCloakingCoil(WarpDriveConfig.i.cloakCoilID, 0, Material.rock) + .setHardness(0.5F) + .setStepSound(Block.soundMetalFootstep) + .setCreativeTab(CreativeTabs.tabRedstone) + .setUnlocalizedName("Cloaking Device Coil"); + + LanguageRegistry.addName(cloakCoilBlock, "Cloaking Device Coil"); + GameRegistry.registerBlock(cloakCoilBlock, "cloakCoilBlock"); + proxy.registerEntities(); ForgeChunkManager.setForcedChunkLoadingCallback(instance, instance); - spaceWorldGenerator = new SpaceWorldGenerator(); GameRegistry.registerWorldGenerator(spaceWorldGenerator); hyperSpaceWorldGenerator = new HyperSpaceWorldGenerator(); GameRegistry.registerWorldGenerator(hyperSpaceWorldGenerator); - registerSpaceDimension(); registerHyperSpaceDimension(); - MinecraftForge.EVENT_BUS.register(new SpaceEventHandler()); - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - warpdriveTab.setBackgroundImageName("items.png"); + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + { MinecraftForge.EVENT_BUS.register(new CameraOverlay(Minecraft.getMinecraft())); } - - ComputerCraftAPI.registerPeripheralProvider(peripheralHandler); } - @EventHandler - public void postInit(FMLPostInitializationEvent event) { - space = DimensionManager.getWorld(WarpDriveConfig.G_SPACE_DIMENSION_ID); - hyperSpace = DimensionManager.getWorld(WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID); - - if (WarpDriveConfig.isICLoaded && WarpDriveConfig.recipesIC2) { - initIC2Recipes(); - } - if (WarpDriveConfig.isAppliedEnergisticsLoaded && WarpDriveConfig.isThermalExpansionLoaded) { - initAETERecipes(); - } - if (!WarpDriveConfig.recipesIC2) { - initVanillaRecipes(); - } - - warpCores = new WarpCoresRegistry(); - jumpGates = new JumpGatesRegistry(); - cams = new CamRegistry(); - } - - private static void initVanillaRecipes() { - componentItem.registerRecipes(); - //WarpCore - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(warpCore), false, "ipi", "ici", "idi", - 'i', Item.ingotIron, - 'p', componentItem.getIS(6), - 'c', componentItem.getIS(2), - 'd', Item.diamond)); - - //Controller - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(protocolBlock), false, "ici", "idi", "iii", - 'i', Item.ingotIron, - 'c', componentItem.getIS(5), - 'd', Item.diamond)); - - //Radar - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(radarBlock), false, "ggg", "pdc", "iii", - 'i', Item.ingotIron, - 'c', componentItem.getIS(5), - 'p', componentItem.getIS(6), - 'g', Block.glass, - 'd', Item.diamond)); - - //Isolation Block - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(isolationBlock), false, "igi", "geg", "igi", - 'i', Item.ingotIron, - 'g', Block.glass, - 'e', Item.enderPearl)); - - //Air generator - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(airgenBlock), false, "ibi", "i i", "ipi", - 'i', Item.ingotIron, - 'b', Block.fenceIron, - 'p', componentItem.getIS(6))); - - //Laser - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(laserBlock), false, "ili", "iri", "ici", - 'i', Item.ingotIron, - 'r', Item.redstone, - 'c', componentItem.getIS(5), - 'l', componentItem.getIS(3), - 'p', componentItem.getIS(6))); - - //Mining laser - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(miningLaserBlock), false, "ici", "iti", "ili", - 'i', Item.ingotIron, - 'r', Item.redstone, - 't', componentItem.getIS(1), - 'c', componentItem.getIS(5), - 'l', componentItem.getIS(3))); - - //Tree farm laser - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(laserTreeFarmBlock), false, "ili", "sts", "ici", - 'i', Item.ingotIron, - 's', "treeSapling", - 't', componentItem.getIS(1), - 'c', componentItem.getIS(5), - 'l', componentItem.getIS(3))); - - //Laser Lift - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(liftBlock), false, "ipi", "rtr", "ili", - 'i', Item.ingotIron, - 'r', Item.redstone, - 't', componentItem.getIS(1), - 'l', componentItem.getIS(3), - 'p', componentItem.getIS(6))); - - //Transporter - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(transporterBlock), false, "iii", "ptc", "iii", - 'i', Item.ingotIron, - 't', componentItem.getIS(1), - 'c', componentItem.getIS(5), - 'p', componentItem.getIS(6))); - - //Particle Booster - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(boosterBlock), false, "ipi", "rgr", "iii", - 'i', Item.ingotIron, - 'r', Item.redstone, - 'g', Block.glass, - 'p', componentItem.getIS(6))); - - //Camera - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(cameraBlock), false, "ngn", "i i", "ici", - 'i', Item.ingotIron, - 'n', Item.goldNugget, - 'g', Block.glass, - 'c', componentItem.getIS(5))); - - //LaserCamera - GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(laserCamBlock), cameraBlock, laserBlock)); - - //Monitor - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(monitorBlock), false, "ggg", "iti", "ici", - 'i', Item.ingotIron, - 't', Block.torchWood, - 'g', Block.glass, - 'c', componentItem.getIS(5))); - - //Cloaking device - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(cloakBlock), false, "ipi", "lrl", "ici", - 'i', Item.ingotIron, - 'r', Item.redstone, - 'l', componentItem.getIS(3), - 'c', componentItem.getIS(5), - 'p', componentItem.getIS(6))); - - //Cloaking coil - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(cloakCoilBlock), false, "ini", "rdr", "ini", - 'i', Item.ingotIron, - 'd', Item.diamond, - 'r', Item.redstone, - 'n', Item.goldNugget)); - - //Power Laser - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(powerLaserBlock), false, "iii","ilg","ici", - 'i', Item.ingotIron, - 'g', Block.glass, - 'c', componentItem.getIS(5), - 'l', componentItem.getIS(3))); - - //Power Reactor - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(powerReactorBlock), false, "ipi","gog","ici", - 'i', Item.ingotIron, - 'g', Block.glass, - 'o', componentItem.getIS(4), - 'c', componentItem.getIS(5), - 'p', componentItem.getIS(6))); - } - - private static void initAETERecipes() { - ItemStack redstoneEnergycell = GameRegistry.findItemStack("ThermalExpansion", "cellReinforced", 1); - ItemStack bucketEnder = GameRegistry.findItemStack("ThermalExpansion", "bucketEnder", 1); - ItemStack fluixCrystal = WarpDriveConfig.getAEMaterial("matFluxCrystal"); - ItemStack quantumEntangledSingularity = WarpDriveConfig.getAEMaterial("matQuantumEntangledSingularity"); - ItemStack vibrantQuartzGlass = WarpDriveConfig.getAEBlock("blkQuartzLamp"); - vibrantQuartzGlass.setItemDamage(4); - ItemStack antimatter = GameRegistry.findItemStack("ResonantInduction|Atomic", "antimatter", 1); - antimatter.setItemDamage(1); - ItemStack floppy = GameRegistry.findItemStack("ComputerCraft", "disk", 1); - ItemStack ultimateLappack = new ItemStack(WarpDriveConfig.GS_ultimateLappack, 1, 0); - - // top = advancedCircuit, redstoneEnergycell, advancedCircuit - // middle = fluix crystal, advancedMachine, fluix crystal - // bottom = advancedCircuit, bucket Resonant ender, advancedCircuit - GameRegistry.addRecipe(new ItemStack(warpCore), "crc", "fmf", "cec", - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'r', redstoneEnergycell, - 'e', bucketEnder, - 'f', fluixCrystal); - - // top = advancedCircuit, floppy, advancedCircuit - // middle = advancedCircuit, advancedMachine, advancedCircuit - // bottom = advancedCircuit, flux crystal, advancedCircuit - GameRegistry.addRecipe(new ItemStack(protocolBlock), "coc", "cmc", "cfc", - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'o', floppy, - 'f', fluixCrystal); - - // top = Iridium plate, Ultimate lappack, Iridium plate - // middle = Singularity, 1 gram antimatter, Singularity - // bottom = Iridium plate, Ultimate lappack, Iridium plate - GameRegistry.addRecipe(new ItemStack(powerReactorBlock), "ili", "sas", "ili", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), - 's', quantumEntangledSingularity, - 'a', antimatter, - 'l', ultimateLappack); - - // top = Advanced circuit, Advanced alloy, Advanced alloy - // middle = Advanced circuit, Warp drive laser, Vibrant quartz glass - // bottom = Advanced circuit, Certus quartz tank, Advanced alloy - ItemStack isMiningLaserBlock = new ItemStack(miningLaserBlock.blockID, 1, 0); - ItemStack isCertusQuartzTank = new ItemStack(WarpDriveConfig.AEExtra_certusQuartzTank.blockID, 1, 0); - - GameRegistry.addRecipe(new ItemStack(powerLaserBlock), "caa", "czg", "cta", - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'a', WarpDriveConfig.getIC2Item("advancedAlloy"), - 'z', isMiningLaserBlock, - 't', isCertusQuartzTank, - 'g', vibrantQuartzGlass); - } - - private static void initIC2Recipes() { + @PostInit + public void postInit(FMLPostInitializationEvent event) + { + space = DimensionManager.getWorld(spaceDimID); + hyperSpace = DimensionManager.getWorld(hyperSpaceDimID); GameRegistry.addRecipe(new ItemStack(warpCore), "ici", "cmc", "ici", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit")); - + 'i', WarpDriveConfig.i.getIC2Item("iridiumPlate"), 'm', WarpDriveConfig.i.getIC2Item("advancedMachine"), 'c', WarpDriveConfig.i.getIC2Item("advancedCircuit")); GameRegistry.addRecipe(new ItemStack(protocolBlock), "iic", "imi", "cii", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit")); - + 'i', WarpDriveConfig.i.getIC2Item("iridiumPlate"), 'm', WarpDriveConfig.i.getIC2Item("advancedMachine"), 'c', WarpDriveConfig.i.getIC2Item("advancedCircuit")); GameRegistry.addRecipe(new ItemStack(radarBlock), "ifi", "imi", "imi", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'f', WarpDriveConfig.getIC2Item("frequencyTransmitter")); - + 'i', WarpDriveConfig.i.getIC2Item("iridiumPlate"), 'm', WarpDriveConfig.i.getIC2Item("advancedMachine"), 'f', WarpDriveConfig.i.getIC2Item("frequencyTransmitter")); GameRegistry.addRecipe(new ItemStack(isolationBlock), "iii", "idi", "iii", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'd', Block.blockDiamond); - + 'i', WarpDriveConfig.i.getIC2Item("iridiumPlate"), 'm', WarpDriveConfig.i.getIC2Item("advancedMachine"), 'd', Block.blockDiamond); GameRegistry.addRecipe(new ItemStack(airgenBlock), "lcl", "lml", "lll", - 'l', Block.leaves, - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit")); - + 'l', Block.leaves, 'm', WarpDriveConfig.i.getIC2Item("advancedMachine"), 'c', WarpDriveConfig.i.getIC2Item("advancedCircuit")); GameRegistry.addRecipe(new ItemStack(laserBlock), "sss", "ama", "aaa", - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'a', WarpDriveConfig.getIC2Item("advancedAlloy"), - 's', WarpDriveConfig.getIC2Item("advancedCircuit")); - + 'm', WarpDriveConfig.i.getIC2Item("advancedMachine"), 'a', WarpDriveConfig.i.getIC2Item("advancedAlloy"), 's', WarpDriveConfig.i.getIC2Item("advancedCircuit")); GameRegistry.addRecipe(new ItemStack(miningLaserBlock), "aaa", "ama", "ccc", - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'a', WarpDriveConfig.getIC2Item("advancedAlloy"), - 'm', WarpDriveConfig.getIC2Item("miner")); - + 'c', WarpDriveConfig.i.getIC2Item("advancedCircuit"), 'a', WarpDriveConfig.i.getIC2Item("advancedAlloy"), 'm', WarpDriveConfig.i.getIC2Item("miner")); GameRegistry.addRecipe(new ItemStack(boosterBlock), "afc", "ama", "cfa", - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'a', WarpDriveConfig.getIC2Item("advancedAlloy"), - 'f', WarpDriveConfig.getIC2Item("glassFiberCableItem"), - 'm', WarpDriveConfig.getIC2Item("mfeUnit")); - + 'c', WarpDriveConfig.i.getIC2Item("advancedCircuit"), 'a', WarpDriveConfig.i.getIC2Item("advancedAlloy"), 'f', WarpDriveConfig.i.getIC2Item("glassFiberCableItem"), 'm', WarpDriveConfig.i.getIC2Item("mfeUnit")); GameRegistry.addRecipe(new ItemStack(liftBlock), "aca", "ama", "a#a", - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'a', WarpDriveConfig.getIC2Item("advancedAlloy"), - 'm', WarpDriveConfig.getIC2Item("magnetizer")); - + 'c', WarpDriveConfig.i.getIC2Item("advancedCircuit"), 'a', WarpDriveConfig.i.getIC2Item("advancedAlloy"), 'm', WarpDriveConfig.i.getIC2Item("magnetizer")); GameRegistry.addRecipe(new ItemStack(iridiumBlock), "iii", "iii", "iii", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate")); - - GameRegistry.addShapelessRecipe( - new ItemStack(WarpDriveConfig.getIC2Item("iridiumPlate").getItem(), 9), - new ItemStack(iridiumBlock)); - + 'i', WarpDriveConfig.i.getIC2Item("iridiumPlate")); + GameRegistry.addShapelessRecipe(new ItemStack(WarpDriveConfig.i.getIC2Item("iridiumPlate").getItem(), 9), new ItemStack(iridiumBlock)); + GameRegistry.addRecipe(new ItemStack(laserCamBlock), "imi", "cec", "#k#", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'e', laserBlock, - 'k', cameraBlock); - + 'i', WarpDriveConfig.i.getIC2Item("iridiumPlate"), 'm', WarpDriveConfig.i.getIC2Item("advancedMachine"), 'c', WarpDriveConfig.i.getIC2Item("advancedCircuit"), 'e', laserBlock, 'k', cameraBlock); GameRegistry.addRecipe(new ItemStack(cameraBlock), "cgc", "gmg", "cgc", - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'g', Block.glass); - - GameRegistry.addRecipe(new ItemStack(monitorBlock), "gcg", "gmg", "ggg", - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'g', Block.glass); - + 'm', WarpDriveConfig.i.getIC2Item("advancedMachine"), 'c', WarpDriveConfig.i.getIC2Item("advancedCircuit"), 'g', Block.glass); + GameRegistry.addRecipe(new ItemStack(monitorBlock), "gcg", "gmg", "ggg", + 'm', WarpDriveConfig.i.getIC2Item("advancedMachine"), 'c', WarpDriveConfig.i.getIC2Item("advancedCircuit"), 'g', Block.glass); GameRegistry.addRecipe(new ItemStack(scannerBlock), "sgs", "mma", "amm", - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'a', WarpDriveConfig.getIC2Item("advancedAlloy"), - 's', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'g', Block.glass); - - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(laserTreeFarmBlock),false,new Object[] { - "cwc", "wmw", "cwc", - 'c', WarpDriveConfig.getIC2Item("electronicCircuit"), - 'w', "logWood", - 'm', miningLaserBlock })); - - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(transporterBlock), false, new Object[] { - "ece", "imi", "iei", - 'e', Item.enderPearl, - 'c', WarpDriveConfig.getIC2Item("electronicCircuit"), - 'i', WarpDriveConfig.getIC2Item("plateiron"), - 'm', WarpDriveConfig.getIC2Item("machine") })); - - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(reactorLaserFocusItem),false,new Object[] { - " p ", "pdp", " p ", - 'p', WarpDriveConfig.getIC2Item("plateiron"), - 'd', "gemDiamond"})); - - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(reactorMonitorBlock), false, new Object[] { - "pdp", "dmd", "pdp", - 'p', WarpDriveConfig.getIC2Item("plateiron"), - 'd', "gemDiamond", - 'm', WarpDriveConfig.getIC2Item("mfeUnit")})); - + 'm', WarpDriveConfig.i.getIC2Item("advancedMachine"), 'a', WarpDriveConfig.i.getIC2Item("advancedAlloy"), 's', WarpDriveConfig.i.getIC2Item("advancedCircuit"), 'g', Block.glass); GameRegistry.addRecipe(new ItemStack(cloakBlock), "imi", "mcm", "imi", - 'i', iridiumBlock, - 'c', cloakCoilBlock, - 'm', WarpDriveConfig.getIC2Item("advancedMachine")); - + 'i', iridiumBlock, 'c', cloakCoilBlock, 'm', WarpDriveConfig.i.getIC2Item("advancedMachine")); GameRegistry.addRecipe(new ItemStack(cloakCoilBlock), "iai", "aca", "iai", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'a', WarpDriveConfig.getIC2Item("advancedAlloy")); - } + 'i', WarpDriveConfig.i.getIC2Item("iridiumPlate"), 'c', WarpDriveConfig.i.getIC2Item("advancedCircuit"), 'a', WarpDriveConfig.i.getIC2Item("advancedAlloy")); + registry = new WarpCoresRegistry(); - private static void registerSpaceDimension() { - spaceBiome = (new BiomeSpace(24)) - .setColor(0) - .setDisableRain() - .setBiomeName("Space"); - DimensionManager.registerProviderType(WarpDriveConfig.G_SPACE_PROVIDER_ID, SpaceProvider.class, true); - DimensionManager.registerDimension(WarpDriveConfig.G_SPACE_DIMENSION_ID, WarpDriveConfig.G_SPACE_PROVIDER_ID); - } - - private static void registerHyperSpaceDimension() { - DimensionManager.registerProviderType(WarpDriveConfig.G_HYPERSPACE_PROVIDER_ID, HyperSpaceProvider.class, true); - DimensionManager.registerDimension(WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID, WarpDriveConfig.G_HYPERSPACE_PROVIDER_ID); - } - - @EventHandler - public void serverLoad(FMLServerStartingEvent event) { - cloaks = new CloakManager(); - MinecraftForge.EVENT_BUS.register(new CloakChunkWatcher()); - - event.registerServerCommand(new GenerateCommand()); - event.registerServerCommand(new SpaceTpCommand()); - event.registerServerCommand(new InvisibleCommand()); - event.registerServerCommand(new JumpgateCommand()); - event.registerServerCommand(new DebugCommand()); - } - - private ArrayList worldTickets(World worldObj) { - ArrayList worldTicks = new ArrayList(warpTickets.size()); - for(Ticket t: warpTickets) { - if (t.world.equals(worldObj)) { - worldTicks.add(t); - } - } - return worldTicks; - } - - public Ticket registerChunkLoadTE(WarpChunkTE te, boolean refreshLoading) { - World worldObj = te.worldObj; - ArrayList worldTicks = worldTickets(worldObj); - boolean isWorldTicketed = worldTicks.size() != 0; - if(isWorldTicketed) + if (FMLCommonHandler.instance().getEffectiveSide().isServer()) { - if(ForgeChunkManager.ticketCountAvailableFor(this, worldObj) > 0) - { - Ticket t = ForgeChunkManager.requestTicket(this, worldObj, Type.NORMAL); - if(t != null) - { - te.giveTicket(t); - if(refreshLoading) - te.refreshLoading(); - return t; - } - else { - WarpDrive.debugPrint("Ticket not granted"); - } - } - else { - WarpDrive.debugPrint("No tickets left!"); - } + jumpGates = new JumpGatesRegistry(); } else { - Ticket t = ForgeChunkManager.requestTicket(this, worldObj, Type.NORMAL); - if(t != null) - { - te.giveTicket(t); - if(refreshLoading) - te.refreshLoading(); - return t; - } - else - { - WarpDrive.debugPrint("Ticket not granted"); - } + cams = new CamRegistry(); } - return null; } - - public Ticket registerChunkLoadTE(WarpChunkTE te) + + private void registerSpaceDimension() { - return registerChunkLoadTE(te,true); + spaceBiome = (new BiomeSpace(23)).setColor(0).setDisableRain().setBiomeName("Space"); + this.spaceProviderID = 14; + DimensionManager.registerProviderType(this.spaceProviderID, SpaceProvider.class, true); + this.spaceDimID = DimensionManager.getNextFreeDimId(); + DimensionManager.registerDimension(this.spaceDimID, this.spaceProviderID); } - - public Ticket getTicket(WarpChunkTE te) + + private void registerHyperSpaceDimension() { - return registerChunkLoadTE(te,false); + this.hyperSpaceProviderID = 15; + DimensionManager.registerProviderType(this.hyperSpaceProviderID, HyperSpaceProvider.class, true); + this.hyperSpaceDimID = DimensionManager.getNextFreeDimId(); + DimensionManager.registerDimension(this.hyperSpaceDimID, this.hyperSpaceProviderID); } - - public void removeTicket(Ticket t) + + @ServerStarting + public void serverLoad(FMLServerStartingEvent event) { - for(Ticket ticket:warpTickets) - if(t.equals(ticket)) - warpTickets.remove(ticket); + cloaks = new CloakManager(); + MinecraftForge.EVENT_BUS.register(new CloakChunkWatcher()); + event.registerServerCommand(new GenerateCommand()); + event.registerServerCommand(new SpaceTpCommand()); + event.registerServerCommand(new InvisibleCommand()); } @Override public void ticketsLoaded(List tickets, World world) { for (Ticket ticket : tickets) + { ForgeChunkManager.releaseTicket(ticket); + } } - - - public static void sendLaserPacket(World worldObj, Vector3 source, Vector3 dest, float r, float g, float b, int age, int energy, int radius) { - Side side = FMLCommonHandler.instance().getEffectiveSide(); - if (side == Side.SERVER) { - ByteArrayOutputStream bos = new ByteArrayOutputStream(8); - DataOutputStream outputStream = new DataOutputStream(bos); - - try { - // Write source vector - outputStream.writeDouble(source.x); - outputStream.writeDouble(source.y); - outputStream.writeDouble(source.z); - // Write target vector - outputStream.writeDouble(dest.x); - outputStream.writeDouble(dest.y); - outputStream.writeDouble(dest.z); - // Write r, g, b of laser - outputStream.writeFloat(r); - outputStream.writeFloat(g); - outputStream.writeFloat(b); - // Write age - outputStream.writeByte(age); - // Write energy value - outputStream.writeInt(energy); - } catch (Exception ex) { - ex.printStackTrace(); - } - - Packet250CustomPayload packet = new Packet250CustomPayload(); - packet.channel = "WarpDriveBeam"; - packet.data = bos.toByteArray(); - packet.length = bos.size(); - if (source.distanceTo_square(dest) < 3600 /* 60 * 60 */) { - MinecraftServer.getServer().getConfigurationManager().sendToAllNear( - (source.intX() + dest.intX()) / 2, (source.intY() + dest.intY()) / 2, (source.intZ() + dest.intZ()) / 2, - radius, worldObj.provider.dimensionId, packet); - return; - } - MinecraftServer.getServer().getConfigurationManager().sendToAllNear( - source.intX(), source.intY(), source.intZ(), - radius, worldObj.provider.dimensionId, packet); - - ByteArrayOutputStream bos2 = new ByteArrayOutputStream(8); - DataOutputStream outputStream2 = new DataOutputStream(bos2); - - try { - // Write source vector - outputStream2.writeDouble(source.x); - outputStream2.writeDouble(source.y); - outputStream2.writeDouble(source.z); - // Write target vector - outputStream2.writeDouble(dest.x); - outputStream2.writeDouble(dest.y); - outputStream2.writeDouble(dest.z); - // Write r, g, b of laser - outputStream2.writeFloat(r); - outputStream2.writeFloat(g); - outputStream2.writeFloat(b); - // Write age - outputStream2.writeByte(age); - // Write energy value - outputStream2.writeInt(energy); - } catch (Exception ex) { - ex.printStackTrace(); - } - - Packet250CustomPayload packet2 = new Packet250CustomPayload(); - packet2.channel = "WarpDriveBeam"; - packet2.data = bos.toByteArray(); - packet2.length = bos.size(); - MinecraftServer.getServer().getConfigurationManager().sendToAllNear( - dest.intX(), dest.intY(), dest.intZ(), - radius, worldObj.provider.dimensionId, packet2); - } - } } \ No newline at end of file diff --git a/src/cr0s/WarpDrive/WarpDriveConfig.java b/src/cr0s/WarpDrive/WarpDriveConfig.java index 12bf13b1..50f7d2fd 100644 --- a/src/cr0s/WarpDrive/WarpDriveConfig.java +++ b/src/cr0s/WarpDrive/WarpDriveConfig.java @@ -1,241 +1,175 @@ package cr0s.WarpDrive; import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.HashSet; import java.util.Set; import java.util.Random; - +import java.lang.reflect.*; import cpw.mods.fml.common.Loader; import net.minecraftforge.common.Configuration; -import net.minecraftforge.oredict.OreDictionary; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.world.World; import ic2.api.item.Items; public class WarpDriveConfig { - private static Configuration config; - public static int coreID, controllerID, radarID, isolationID, airID, airgenID, gasID, laserID, miningLaserID, particleBoosterID, liftID, laserCamID, camID, monitorID, iridiumBlockID, shipScannerID, cloakCoreID, cloakCoilID; - public static int laserTreeFarmID, transporterID, transportBeaconID, reactorLaserFocusID, reactorMonitorID, powerReactorID, powerLaserID, componentID; + public static WarpDriveConfig i; + private Configuration config; + public int coreID, controllerID, radarID, isolationID, airID, airgenID, gasID, laserID, miningLaserID, particleBoosterID, liftID, laserCamID, camID, monitorID, iridiumID, shipScannerID, cloakCoreID, cloakCoilID; // - /* - * The variables which store whether or not individual mods are loaded - */ - public static boolean isGregLoaded = false; - public static boolean isAppliedEnergisticsLoaded = false; - public static boolean isAdvSolPanelLoaded = false; - public static boolean isAtomicScienceLoaded = false; - public static boolean isAEExtraLoaded = false; - public static boolean isICBMLoaded = false; - public static boolean isMFFSLoaded = false; - public static boolean isGraviSuiteLoaded = false; - public static boolean isICLoaded = false; - public static boolean isCCLoaded = false; - public static boolean isUndergroundBiomesLoaded = false; - public static boolean isNetherOresLoaded = false; - public static boolean isThermalExpansionLoaded = false; - public static boolean isMetallurgyLoaded = false; - public static boolean isAdvancedRepulsionSystemsLoaded = false; - - /* - * The variables that control which recipes should be loaded - */ - public static boolean recipesIC2 = true; + public boolean isGregLoaded = false, isAELoaded = false, isAEExtraLoaded = false, isAdvSolPanelLoaded = false, isASLoaded = false, isICBMLoaded = false, isMFFSLoaded = false, isGraviSuiteLoaded = false; // - public static int[] IC2_Air; - public static int[] IC2_Empty; - public static int IC2_RubberWood; - public static ItemStack IC2_Resin; - public static Item IC2_fluidCell; - public static int CC_Computer = 0, CC_peripheral = 0, CC_Floppy = 0, CCT_Turtle = 0, CCT_Upgraded = 0, CCT_Advanced = 0; - public static int GT_Ores = 0, GT_Granite = 0, GT_Machine = 0; - public static int ASP = 0; - public static int AS_Turbine = 0, AS_deuteriumCell = 0; - public static int ICBM_Machine = 0, ICBM_Missile = 0, ICBM_Explosive = 0; - public static int GS_ultimateLappack = 0; - public static int UB_igneousStone = 0, UB_igneousCobblestone = 0, UB_metamorphicStone = 0, UB_metamorphicCobblestone = 0, UB_sedimentaryStone = 0; - public static int NetherOres_count; - public static int[] NetherOres_block; - public static int[][] Metallurgy_overworldOresBlock; - public static int[][] Metallurgy_netherOresBlock; - public static int[][] Metallurgy_endOresBlock; - public static ArrayList forceFieldBlocks; - - public static Set SpaceHelmets, Jetpacks, MinerOres, MinerLogs, MinerLeaves, scannerIgnoreBlocks; - private static Class AEBlocks; - private static Class AEMaterials; - private static Class AEItems; - public static ArrayList CommonWorldGenOres; - public static Item AEExtra_fluidDrive; - public static Block AEExtra_certusQuartzTank; - - public static boolean debugMode = false; + public int[] IC2_Air; + public int CC_Computer = 0, CC_peripheral = 0, CCT_Turtle = 0, CCT_Upgraded = 0, CCT_Advanced = 0, GT_Ores = 0, GT_Granite = 0, GT_Machine = 0, ASP = 0, AS_Turbine = 0, ICBM_Machine = 0, ICBM_Missile = 0, ICBM_Explosive = 0, MFFS_Field = 0; + public Set SpaceHelmets, Jetpacks, MinerOres, scannerIgnoreBlocks; + private Class AEBlocks; + private Class AEMaterials; + private Class AEItems; + public Item AEExtraFDI; + public ArrayList CommonWorldGenOres; // Mod config - // General - public static int G_SPACE_PROVIDER_ID = 14; - public static int G_SPACE_DIMENSION_ID = 2; - public static int G_HYPERSPACE_PROVIDER_ID = 15; - public static int G_HYPERSPACE_DIMENSION_ID = 3; - // Warp Core - public static int WC_MAX_ENERGY_VALUE = 100000000; - public static int WC_ENERGY_PER_BLOCK_MODE1 = 10; // eU - public static int WC_ENERGY_PER_DISTANCE_MODE1 = 100; // eU - public static int WC_ENERGY_PER_BLOCK_MODE2 = 1000; // eU - public static int WC_ENERGY_PER_DISTANCE_MODE2 = 1000; // eU - public static int WC_ENERGY_PER_ENTITY_TO_SPACE = 1000000; // eU - public static int WC_MAX_JUMP_DISTANCE = 128; // Maximum jump length value - public static int WC_MAX_SHIP_VOLUME_ON_SURFACE = 3000; // Maximum ship mass to jump on earth - public static int WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE = 1200; // Minimum ship volume value for hyperspace travel - public static int WC_MAX_SHIP_SIDE = 127; - public static int WC_COOLDOWN_INTERVAL_SECONDS = 4; // FIXME update me - public static int WC_COLLISION_TOLERANCE_BLOCKS = 3; - public static int WC_WARMUP_SHORTJUMP_SECONDS = 10; - public static int WC_WARMUP_LONGJUMP_SECONDS = 30; - public static int WC_WARMUP_RANDOM_TICKS = 60; - public static int WC_CORES_REGISTRY_UPDATE_INTERVAL_SECONDS = 10; - public static int WC_ISOLATION_UPDATE_INTERVAL_SECONDS = 10; - - // Warp Radar - public static int WR_MAX_ENERGY_VALUE = 100000000; // 100kk eU - - // Particle Booster - public static int PB_MAX_ENERGY_VALUE = 100000; - - // Mining Laser - public static int ML_MAX_BOOSTERS_NUMBER = 1; - public static int ML_WARMUP_DELAY_TICKS = 20; - public static int ML_SCAN_DELAY_TICKS = 10; - public static int ML_MINE_DELAY_TICKS = 3; - public static int ML_EU_PER_LAYER_SPACE = 2000; - public static int ML_EU_PER_LAYER_EARTH = 10000; - public static int ML_EU_PER_BLOCK_SPACE = 500; - public static int ML_EU_PER_BLOCK_EARTH = 2500; - public static double ML_EU_MUL_ORESONLY = 4.0; - public static double ML_EU_MUL_SILKTOUCH = 2.5; - public static double ML_EU_MUL_FORTUNE = 2.5; -// public static double ML_MAX_SPEED = 10; -// public static double ML_MIN_SPEED = 0.1; - public static int ML_MAX_RADIUS = 6; + public int WC_MAX_ENERGY_VALUE = 100000000; + public int WC_ENERGY_PER_BLOCK_MODE1 = 10; // eU + public int WC_ENERGY_PER_DISTANCE_MODE1 = 100; // eU + public int WC_ENERGY_PER_BLOCK_MODE2 = 1000; // eU + public int WC_ENERGY_PER_DISTANCE_MODE2 = 1000; // eU + public int WC_ENERGY_PER_ENTITY_TO_SPACE = 1000000; // eU + public int WC_MAX_JUMP_DISTANCE = 128; // Maximum jump length value + public int WC_MAX_SHIP_VOLUME_ON_SURFACE = 15000; // Maximum ship volume to jump on earth + public int WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE = 500; // Minimum ship volume value for hyperspace travel + public int WC_MAX_SHIP_SIDE = 199; //miaximum ship length - 1 + public int WC_COOLDOWN_INTERVAL_SECONDS = 4; + public int WC_CORES_REGISTRY_UPDATE_INTERVAL_SECONDS = 10; + public int WC_ISOLATION_UPDATE_INTARVAL_SECONDS = 10; - //Tree farm - public static int TF_MAX_SIZE=32; + // Warp Radar + public int WR_MAX_ENERGY_VALUE = 100000000; // 100kk eU - //Transporter - public static int TR_MAX_ENERGY=10000000; - public static boolean TR_RELATIVE_COORDS=false; - public static double TR_EU_PER_METRE=100; - public static double TR_MAX_SCAN_RANGE=4; - public static double TR_MAX_BOOST_MUL=4; + // Particle Booster + public int PB_MAX_ENERGY_VALUE = 100000; + + // Mining Laser + public int ML_MAX_BOOSTERS_NUMBER = 1; + public int ML_SCAN_DELAY = 20 * 5; + public int ML_MINE_DELAY = 10; + public int ML_EU_PER_LAYER_SPACE = 500; + public int ML_EU_PER_LAYER_EARTH = 5000; // Laser Emitter - public static int LE_MAX_BOOSTERS_NUMBER = 10; - public static int LE_MAX_LASER_ENERGY = 4000000; - public static int LE_EMIT_DELAY_TICKS = 20 * 3; - public static int LE_EMIT_SCAN_DELAY_TICKS = 10; - public static double LE_COLLECT_ENERGY_MULTIPLIER = 0.60D; - public static int LE_BEAM_LENGTH_PER_ENERGY_DIVIDER = 5000; - public static int LE_ENTITY_HIT_SET_ON_FIRE_TIME = 100; - public static int LE_ENTITY_HIT_DAMAGE_PER_ENERGY_DIVIDER = 10000; - public static int LE_ENTITY_HIT_EXPLOSION_LASER_ENERGY = 1000000; - public static int LE_BLOCK_HIT_CONSUME_ENERGY = 70000; - public static int LE_BLOCK_HIT_CONSUME_ENERGY_PER_BLOCK_RESISTANCE = 1000; - public static int LE_BLOCK_HIT_CONSUME_ENERGY_PER_DISTANCE = 10; - - // POWER REACTOR - public static int PR_MAX_ENERGY = 10000000; - public static int PR_TICK_TIME = 20; - public static int PR_MAX_LASERS = 3; - - // REACTOR MONITOR - public static int RM_MAX_ENERGY = 1000000; - public static double RM_EU_PER_HEAT = 2; - - public static String schemaLocation = "/home/cros/mc_site/schematics/"; + public int LE_MAX_BOOSTERS_NUMBER = 10; + public int LE_MAX_LASER_ENERGY = 4000000; + public int LE_EMIT_DELAY_TICKS = 20 * 3; + public int LE_EMIT_SCAN_DELAY_TICKS = 10; + public double LE_COLLECT_ENERGY_MULTIPLIER = 0.60D; + public int LE_BEAM_LENGTH_PER_ENERGY_DIVIDER = 5000; + public int LE_ENTITY_HIT_SET_ON_FIRE_TIME = 100; + public int LE_ENTITY_HIT_DAMAGE_PER_ENERGY_DIVIDER = 10000; + public int LE_ENTITY_HIT_EXPLOSION_LASER_ENERGY = 1000000; + public int LE_BLOCK_HIT_CONSUME_ENERGY = 70000; + public int LE_BLOCK_HIT_CONSUME_ENERGY_PER_BLOCK_RESISTANCE = 1000; + public int LE_BLOCK_HIT_CONSUME_ENERGY_PER_DISTANCE = 10; // Cloaking device core - public static int CD_MAX_CLOAKING_FIELD_SIDE = 100; - public static int CD_ENERGY_PER_BLOCK_TIER1 = 1000; - public static int CD_ENERGY_PER_BLOCK_TIER2 = 5000; - public static int CD_FIELD_REFRESH_INTERVAL_SECONDS = 10; - public static int CD_COIL_CAPTURE_BLOCKS = 5; + public int CD_MAX_CLOAKING_FIELD_SIDE = 100; + public int CD_ENERGY_PER_BLOCK_TIER1 = 1000; + public int CD_ENERGY_PER_BLOCK_TIER2 = 5000; + public int CD_FIELD_REFRESH_INTERVAL_SECONDS = 10; + public int CD_COIL_CAPTURE_BLOCKS = 5; - public static ItemStack getIC2Item(String id) { + private WarpDriveConfig() {} + + public ItemStack getIC2Item(String id) + { return Items.getItem(id); } - public static ItemStack getAEBlock(String id) { - try { + public ItemStack getAEBlock(String id) + { + try + { Object ret = AEBlocks.getField(id).get(null); if (ret instanceof ItemStack) return (ItemStack)ret; - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Call getAEBlock failed for " + id); + } + catch (Exception e) + { + System.out.println("WarpDriveConfig Call getAEBlock failed for " + id); } return null; } - public static ItemStack getAEMaterial(String id) { - try { + public ItemStack getAEMaterial(String id) + { + try + { Object ret = AEMaterials.getField(id).get(null); if (ret instanceof ItemStack) return (ItemStack)ret; - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Call getAEMaterial failed for " + id); + } + catch (Exception e) + { + System.out.println("WarpDriveConfig Call getAEMaterial failed for " + id); } return null; } - public static ItemStack getAEItem(String id) { - try { + public ItemStack getAEItem(String id) + { + try + { Object ret = AEItems.getField(id).get(null); if (ret instanceof ItemStack) return (ItemStack)ret; - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Call getAEItem failed for " + id); + } + catch (Exception e) + { + System.out.println("WarpDriveConfig Call getAEItem failed for " + id); } return null; } - public static void preInit(Configuration configIn) { - config = configIn; + public static void Init(Configuration config) + { + if (i == null) + i = new WarpDriveConfig(); + i.config = config; } - public static void loadWarpDriveConfig() { - // General - G_SPACE_PROVIDER_ID = config.get("General", "space_provider_id", 14).getInt(); - G_SPACE_DIMENSION_ID = config.get("General", "space_dimension_id", -2).getInt(); - G_HYPERSPACE_PROVIDER_ID = config.get("General", "hyperspace_provider_id", 15).getInt(); - G_HYPERSPACE_DIMENSION_ID = config.get("General", "hyperspace_dimension_id", -3).getInt(); - + public void loadWarpDriveConfig() + { // Warp Core WC_MAX_ENERGY_VALUE = config.get("WarpCore", "max_energy_value", 100000000).getInt(); WC_ENERGY_PER_BLOCK_MODE1 = config.get("WarpCore", "energy_per_block_mode1", 10).getInt(); WC_ENERGY_PER_DISTANCE_MODE1 = config.get("WarpCore", "energy_per_distance_mode1", 100).getInt(); - WC_ENERGY_PER_DISTANCE_MODE2 = config.get("WarpCore", "energy_per_distance_mode2", 1000).getInt(); - WC_ENERGY_PER_BLOCK_MODE2 = config.get("WarpCore", "energy_per_block_mode2", 1000).getInt(); - WC_ENERGY_PER_ENTITY_TO_SPACE = config.get("WarpCore", "energy_per_entity_to_space", 1000000).getInt(); - WC_MAX_JUMP_DISTANCE = config.get("WarpCore", "max_jump_distance", 128).getInt(); - WC_MAX_SHIP_VOLUME_ON_SURFACE = config.get("WarpCore", "max_ship_volume_on_surface", 15000).getInt(); // Maximum ship mass to jump on earth (15k blocks) - WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE = config.get("WarpCore", "min_ship_volume_for_hyperspace", 500).getInt(); // Minimum ship volume value for hyper space - WC_MAX_SHIP_SIDE = config.get("WarpCore", "max_ship_side", 100).getInt(); - WC_COLLISION_TOLERANCE_BLOCKS = config.get("WarpCore", "collision_tolerance_blocks", 5).getInt(); - - WC_COOLDOWN_INTERVAL_SECONDS = config.get("WarpCore", "cooldown_interval_seconds", 4).getInt(); - WC_WARMUP_SHORTJUMP_SECONDS = config.get("WarpCore", "warmup_shortjump_seconds", 10).getInt(); - WC_WARMUP_LONGJUMP_SECONDS = config.get("WarpCore", "warmup_longjump_seconds", 30).getInt(); - - WC_CORES_REGISTRY_UPDATE_INTERVAL_SECONDS = config.get("WarpCore", "cores_registry_update_interval", 10).getInt(); - WC_ISOLATION_UPDATE_INTERVAL_SECONDS = config.get("WarpCore", "isolation_update_interval", 10).getInt(); - - // Warp Radar - WR_MAX_ENERGY_VALUE = config.get("WarpRadar", "max_energy_value", 100000000).getInt(); - - // Particle Booster - PB_MAX_ENERGY_VALUE = config.get("ParticleBooster", "max_energy_value", 100000).getInt(); + WC_ENERGY_PER_DISTANCE_MODE2 = config.get("WarpCore", "energy_per_distance_mode2", 1000).getInt(); + WC_ENERGY_PER_BLOCK_MODE2 = config.get("WarpCore", "energy_per_block_mode2", 1000).getInt(); + WC_ENERGY_PER_ENTITY_TO_SPACE = config.get("WarpCore", "energy_ped_entity_to_space", 1000000).getInt(); + WC_MAX_JUMP_DISTANCE = config.get("WarpCore", "max_jump_distance", 128).getInt(); + WC_MAX_SHIP_VOLUME_ON_SURFACE = config.get("WarpCore", "max_ship_volume_on_surface", 15000).getInt(); // Maximum ship mass to jump on earth (15k blocks) + WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE = config.get("WarpCore", "min_ship_volume_for_hyperspace", 500).getInt(); ; // Minimum ship volume value for hyper space + WC_MAX_SHIP_SIDE = config.get("WarpCore", "max_ship_side", 100).getInt(); + + WC_COOLDOWN_INTERVAL_SECONDS = config.get("WarpCore", "cooldown_interval_seconds", 4).getInt(); + WC_CORES_REGISTRY_UPDATE_INTERVAL_SECONDS = config.get("WarpCore", "cores_registry_update_interval", 10).getInt(); + WC_ISOLATION_UPDATE_INTARVAL_SECONDS = config.get("WarpCore", "isolation_update_interval", 10).getInt(); + + // Warp Radar + WR_MAX_ENERGY_VALUE = config.get("WarpRadar", "max_energy_value", 100000000).getInt(); + + // Particle Booster + PB_MAX_ENERGY_VALUE = config.get("ParticleBooster", "max_energy_value", 100000).getInt(); + + // Mining Laser + ML_MAX_BOOSTERS_NUMBER = config.get("MiningLaser", "max_boosters_number", 1).getInt(); + ML_SCAN_DELAY = 20 * config.get("MiningLaser", "scan_delay_seconds", 5).getInt(); + ML_MINE_DELAY = config.get("MiningLaser", "mine_delay_ticks", 10).getInt(); + ML_EU_PER_LAYER_SPACE = config.get("MiningLaser", "eu_per_layer_space", 500).getInt(); + ML_EU_PER_LAYER_EARTH = config.get("MiningLaser", "eu_per_layer_earth", 5000).getInt(); // Laser Emitter LE_MAX_BOOSTERS_NUMBER = config.get("LaserEmitter", "max_boosters_number", 10).getInt(); @@ -259,51 +193,11 @@ public class WarpDriveConfig CD_ENERGY_PER_BLOCK_TIER2 = config.get("CloakingDevice", "energy_per_block_tier2", 500).getInt(); CD_FIELD_REFRESH_INTERVAL_SECONDS = config.get("CloakingDevice", "field_refresh_interval_seconds", 3).getInt(); CD_COIL_CAPTURE_BLOCKS = config.get("CloakingDevice", "coil_capture_blocks", 5).getInt(); - - // Dark's modifications - debugMode = config.get("Dark's stuff", "debug_mode", false).getBoolean(false); - schemaLocation = config.get("Dark's stuff", "schematic_location", schemaLocation).getString(); - - // Mining Laser - ML_MAX_BOOSTERS_NUMBER = config.get("MiningLaser", "max_boosters_number", 1).getInt(); - ML_WARMUP_DELAY_TICKS = config.get("MiningLaser", "warmup_delay_ticks", 20).getInt(); - ML_SCAN_DELAY_TICKS = config.get("MiningLaser", "scan_delay_ticks", 10).getInt(); - ML_MINE_DELAY_TICKS = config.get("MiningLaser", "mine_delay_ticks", 3).getInt(); - ML_EU_PER_LAYER_SPACE = config.get("MiningLaser", "eu_per_layer_space", 2000).getInt(); - ML_EU_PER_LAYER_EARTH = config.get("MiningLaser", "eu_per_layer_earth", 10000).getInt(); - ML_EU_PER_BLOCK_SPACE = config.get("MiningLaser", "eu_per_block_space", 500).getInt(); - ML_EU_PER_BLOCK_EARTH = config.get("MiningLaser", "eu_per_block_earth", 2500).getInt(); - ML_MAX_RADIUS = config.get("MiningLaser", "max_radius", 5).getInt(); - ML_EU_MUL_ORESONLY = config.get("MiningLaser", "oresonly_power_mul", 4.0).getDouble(4.0); - ML_EU_MUL_SILKTOUCH = config.get("MiningLaser", "silktouch_power_mul", 2.5).getDouble(2.5); - ML_EU_MUL_FORTUNE = config.get("MiningLaser", "fortune_power_base", 2.5).getDouble(2.5); -// ML_MAX_SPEED = config.get("MiningLaser", "max_speed_mul", 10).getDouble(10); -// ML_MIN_SPEED = config.get("MiningLaser", "min_speed_mul", 0.1).getDouble(0.1); - - // Tree Farm - TF_MAX_SIZE = config.get("TreeFarm", "max_treefarm_size", 16).getInt(); - - // Transporter - TR_MAX_ENERGY = config.get("Transporter", "max_energy", 1000000).getInt(); - TR_RELATIVE_COORDS = config.get("Transporter", "relative_coords", true).getBoolean(true); - TR_EU_PER_METRE = config.get("Transporter", "eu_per_ent_per_metre", 100).getDouble(100); - TR_MAX_BOOST_MUL = config.get("Transporter", "max_boost", 4).getInt(); - - // Reactor - PR_MAX_ENERGY = config.get("Reactor", "max_energy", 100000000).getInt(); - PR_TICK_TIME = config.get("Reactor", "ticks_per_update",20).getInt(); - PR_MAX_LASERS = config.get("Reactor", "max_lasers", 4).getInt(); - - // Reactor monitor - RM_MAX_ENERGY = config.get("Reactor Monitor", "max_rm_energy", 1000000).getInt(); - RM_EU_PER_HEAT = config.get("Reactor Monitor", "eu_per_heat", 2).getDouble(2); - - // Recipes config - recipesIC2 = config.get("Recipes", "ic2_recipes",true).getBoolean(true); } - public static void load() { - CommonWorldGenOres = new ArrayList(30); + public void Init2() + { + CommonWorldGenOres = new ArrayList(); CommonWorldGenOres.add(new int[] {Block.oreIron.blockID, 0}); CommonWorldGenOres.add(new int[] {Block.oreGold.blockID, 0}); CommonWorldGenOres.add(new int[] {Block.oreCoal.blockID, 0}); @@ -311,14 +205,10 @@ public class WarpDriveConfig CommonWorldGenOres.add(new int[] {Block.oreLapis.blockID, 0}); CommonWorldGenOres.add(new int[] {Block.oreRedstoneGlowing.blockID, 0}); CommonWorldGenOres.add(new int[] {Block.oreRedstone.blockID, 0}); - - forceFieldBlocks = new ArrayList(); - +// SpaceHelmets = new HashSet(); Jetpacks = new HashSet(); MinerOres = new HashSet(); - MinerLogs = new HashSet(); - MinerLeaves = new HashSet(); scannerIgnoreBlocks = new HashSet(); config.load(); coreID = config.getBlock("core", 500).getInt(); @@ -335,147 +225,70 @@ public class WarpDriveConfig laserCamID = config.getBlock("lasercam", 512).getInt(); camID = config.getBlock("camera", 513).getInt(); monitorID = config.getBlock("monitor", 514).getInt(); - iridiumBlockID = config.getBlock("iridium", 515).getInt(); + iridiumID = config.getBlock("iridium", 515).getInt(); shipScannerID = config.getBlock("shipscanner", 516).getInt(); cloakCoreID = config.getBlock("cloakcore", 517).getInt(); cloakCoilID = config.getBlock("cloakcoil", 518).getInt(); - laserTreeFarmID = config.getBlock("lasertreefarm", 519).getInt(); - transporterID = config.getBlock("transporter", 520).getInt(); - transportBeaconID = config.getBlock("transportBeacon", 521).getInt(); - reactorMonitorID = config.getBlock("reactorMonitor",522).getInt(); - powerLaserID = config.getBlock("powerLaser", 523).getInt(); - powerReactorID = config.getBlock("powerReactor",524).getInt(); - - reactorLaserFocusID = config.getItem("reactorLaserFocus", 8700).getInt(); - componentID = config.getItem("component", 8701).getInt(); - - isICLoaded = Loader.isModLoaded("IC2"); - if (isICLoaded) - loadIC2(); - - isCCLoaded = Loader.isModLoaded("ComputerCraft"); - if (isCCLoaded) - loadCC(); - + LoadIC2(); + LoadCC(); isGregLoaded = Loader.isModLoaded("gregtech_addon"); if (isGregLoaded) - loadGT(); - - isAppliedEnergisticsLoaded = Loader.isModLoaded("AppliedEnergistics"); - if (isAppliedEnergisticsLoaded) - loadAppliedEnergistics(); - + LoadGT(); + isAELoaded = Loader.isModLoaded("AppliedEnergistics"); + if (isAELoaded) + LoadAE(); isAEExtraLoaded = Loader.isModLoaded("extracells"); if (isAEExtraLoaded) - loadAEExtra(); - + LoadAEExtra(); isAdvSolPanelLoaded = Loader.isModLoaded("AdvancedSolarPanel"); if (isAdvSolPanelLoaded) - loadASP(); - - isAtomicScienceLoaded = Loader.isModLoaded("ResonantInduction|Atomic"); - if (isAtomicScienceLoaded) - loadAtomicScience(); - + LoadASP(); + isASLoaded = Loader.isModLoaded("AtomicScience"); + if (isASLoaded) + LoadAS(); isICBMLoaded = Loader.isModLoaded("ICBM|Explosion"); if (isICBMLoaded) - loadICBM(); - + LoadICBM(); isMFFSLoaded = Loader.isModLoaded("MFFS"); if (isMFFSLoaded) - loadMFFS(); - + LoadMFFS(); isGraviSuiteLoaded = Loader.isModLoaded("GraviSuite"); if (isGraviSuiteLoaded) - loadGraviSuite(); - - isUndergroundBiomesLoaded = Loader.isModLoaded("UndergroundBiomes"); - if (isUndergroundBiomesLoaded) - loadUndergroundBiomes(); - - isNetherOresLoaded = Loader.isModLoaded("NetherOres"); - if (isNetherOresLoaded) - loadNetherOres(); - - isThermalExpansionLoaded = Loader.isModLoaded("ThermalExpansion"); - if (isThermalExpansionLoaded) - loadThermalExpansion(); - - isMetallurgyLoaded = Loader.isModLoaded("Metallurgy3Core"); - if (isMetallurgyLoaded) { - loadMetallurgy(); - } - - isAdvancedRepulsionSystemsLoaded = Loader.isModLoaded("AdvancedRepulsionSystems"); - if (isAdvancedRepulsionSystemsLoaded) { - loadAdvancedRepulsionSystems(); - } + LoadGS(); // + MinerOres.add(iridiumID); MinerOres.add(Block.oreNetherQuartz.blockID); + for (int[] t : CommonWorldGenOres) + MinerOres.add(t[0]); + MinerOres.add(Block.wood.blockID); + MinerOres.add(Block.planks.blockID); + MinerOres.add(Block.rail.blockID); + MinerOres.add(Block.oreDiamond.blockID); MinerOres.add(Block.obsidian.blockID); MinerOres.add(Block.web.blockID); MinerOres.add(Block.fence.blockID); MinerOres.add(Block.torchWood.blockID); MinerOres.add(Block.glowStone.blockID); - LoadOreDict(); + // Ignore WarpDrive blocks (which potentially will be duplicated by cheaters using ship scan/deploy) scannerIgnoreBlocks.add(coreID); scannerIgnoreBlocks.add(controllerID); - scannerIgnoreBlocks.add(iridiumBlockID); + scannerIgnoreBlocks.add(iridiumID); - if (isICLoaded) { - scannerIgnoreBlocks.add(Items.getItem("mfsUnit").itemID); - scannerIgnoreBlocks.add(Items.getItem("mfeUnit").itemID); - scannerIgnoreBlocks.add(Items.getItem("cesuUnit").itemID); - scannerIgnoreBlocks.add(Items.getItem("batBox").itemID); - } - if (isICBMLoaded) { - scannerIgnoreBlocks.add(ICBM_Explosive); - } - if (isCCLoaded) { - scannerIgnoreBlocks.add(CC_Computer); - scannerIgnoreBlocks.add(CCT_Turtle); - scannerIgnoreBlocks.add(CCT_Upgraded); - scannerIgnoreBlocks.add(CCT_Advanced); - } + scannerIgnoreBlocks.add(Items.getItem("mfsUnit").itemID); + scannerIgnoreBlocks.add(Items.getItem("mfeUnit").itemID); + scannerIgnoreBlocks.add(Items.getItem("cesuUnit").itemID); + scannerIgnoreBlocks.add(Items.getItem("batBox").itemID); + // Do not deploy ores and valuables - for (int[] t : CommonWorldGenOres) {// each element of this set is pair [id, meta] + for (int[] t : CommonWorldGenOres) // each element of this set is pair [id, meta] scannerIgnoreBlocks.add(t[0]); // we adding ID only - } loadWarpDriveConfig(); config.save(); } - - private static void LoadOreDict() { - String[] oreNames = OreDictionary.getOreNames(); - for(String oreName: oreNames) { - String lowerOreName = oreName.toLowerCase(); - if (oreName.substring(0,3).equals("ore")) { - ArrayList item = OreDictionary.getOres(oreName); - for(ItemStack i: item) { - MinerOres.add(i.itemID); - WarpDrive.debugPrint("WD: Added ore ID: "+i.itemID); - } - } - if (lowerOreName.contains("log")) { - ArrayList item = OreDictionary.getOres(oreName); - for(ItemStack i: item) { - MinerLogs.add(i.itemID); - WarpDrive.debugPrint("WD: Added log ID: "+i.itemID); - } - } - if (lowerOreName.contains("leave") || lowerOreName.contains("leaf")) { - ArrayList item = OreDictionary.getOres(oreName); - for(ItemStack i: item) { - MinerLeaves.add(i.itemID); - WarpDrive.debugPrint("WD: Added leaf ID: "+i.itemID); - } - } - } - } - private static void loadIC2() + private void LoadIC2() { ASP = Items.getItem("solarPanel").itemID; SpaceHelmets.add(Items.getItem("hazmatHelmet").itemID); @@ -483,65 +296,57 @@ public class WarpDriveConfig Jetpacks.add(Items.getItem("jetpack").itemID); Jetpacks.add(Items.getItem("electricJetpack").itemID); IC2_Air = new int[] {Items.getItem("airCell").itemID, Items.getItem("airCell").getItemDamage()}; - IC2_Empty = new int[] {Items.getItem("cell").itemID, Items.getItem("cell").getItemDamage()}; - ItemStack rubberWood = Items.getItem("rubberWood"); - IC2_Resin = Items.getItem("resin"); - if(rubberWood != null) { - IC2_RubberWood = rubberWood.itemID; - } - ItemStack ore = Items.getItem("uraniumOre"); - if (ore != null) CommonWorldGenOres.add(new int[] {ore.itemID, ore.getItemDamage()}); - ore = Items.getItem("copperOre"); - if (ore != null) CommonWorldGenOres.add(new int[] {ore.itemID, ore.getItemDamage()}); - ore = Items.getItem("tinOre"); - if (ore != null) CommonWorldGenOres.add(new int[] {ore.itemID, ore.getItemDamage()}); - ore = Items.getItem("leadOre"); - if (ore != null) CommonWorldGenOres.add(new int[] {ore.itemID, ore.getItemDamage()}); - + CommonWorldGenOres.add(new int[] {Items.getItem("uraniumOre").itemID, Items.getItem("uraniumOre").getItemDamage()}); + CommonWorldGenOres.add(new int[] {Items.getItem("copperOre").itemID, Items.getItem("copperOre").getItemDamage()}); + CommonWorldGenOres.add(new int[] {Items.getItem("tinOre").itemID, Items.getItem("tinOre").getItemDamage()}); + CommonWorldGenOres.add(new int[] {Items.getItem("leadOre").itemID, Items.getItem("leadOre").getItemDamage()}); MinerOres.add(Items.getItem("rubberWood").itemID); - IC2_fluidCell = Items.getItem("FluidCell").getItem(); + AEExtraFDI = Items.getItem("FluidCell").getItem(); } - private static void loadCC() + private void LoadCC() { try { - Class z = Class.forName("dan200.computercraft.ComputerCraft"); + Class z = Class.forName("dan200.ComputerCraft"); CC_Computer = z.getField("computerBlockID").getInt(null); CC_peripheral = z.getField("peripheralBlockID").getInt(null); - CC_Floppy = z.getField("diskItemID").getInt(null); + z = Class.forName("dan200.CCTurtle"); CCT_Turtle = z.getField("turtleBlockID").getInt(null); CCT_Upgraded = z.getField("turtleUpgradedBlockID").getInt(null); CCT_Advanced = z.getField("turtleAdvancedBlockID").getInt(null); + scannerIgnoreBlocks.add(CC_Computer); + scannerIgnoreBlocks.add(CCT_Turtle); + scannerIgnoreBlocks.add(CCT_Upgraded); + scannerIgnoreBlocks.add(CCT_Advanced); } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Error loading ComputerCraft classes"); + System.out.println("WarpDriveConfig Error loading CC classes AWWW SHEEEEET NIGGA"); e.printStackTrace(); } } - private static void loadGT() + private void LoadGT() { try { - Class z = Class.forName("gregtechmod.GT_Mod"); - int[] t = (int[])z.getField("sBlockIDs").get(null); + int[] t = (int[])Class.forName("gregtechmod.GT_Mod").getField("sBlockIDs").get(null); GT_Machine = t[1]; GT_Ores = t[2]; // meta 1-15 = ores GT_Granite = t[5]; // 0 - black, 1 - black cobble, 8 - red, 9 - red cobble MinerOres.add(GT_Ores); - //MinerOres.add(GT_Granite); + MinerOres.add(GT_Granite); } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Error loading GT classes"); + System.out.println("WarpDriveConfig Error loading GT classes"); e.printStackTrace(); isGregLoaded = false; } } - private static void loadAppliedEnergistics() + private void LoadAE() { try { @@ -552,32 +357,29 @@ public class WarpDriveConfig } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Error loading AppliedEnergistics classes"); + System.out.println("WarpDriveConfig Error loading AE classes"); e.printStackTrace(); - isAppliedEnergisticsLoaded = false; + isAELoaded = false; } } - private static void loadAEExtra() + private void LoadAEExtra() { try { Class z = Class.forName("extracells.ItemEnum"); Object z1 = z.getEnumConstants()[6]; - AEExtra_fluidDrive = (Item)z1.getClass().getDeclaredMethod("getItemInstance").invoke(z1); - z = Class.forName("extracells.BlockEnum"); - z1 = z.getEnumConstants()[9]; - AEExtra_certusQuartzTank = (Block)z1.getClass().getDeclaredMethod("getBlockInstance").invoke(z1); + AEExtraFDI = (Item)z1.getClass().getDeclaredMethod("getItemInstance").invoke(z1); } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Error loading AEExtra classes"); + System.out.println("WarpDriveConfig Error loading AEExtra classes"); e.printStackTrace(); isAEExtraLoaded = false; } - } - - private static void loadASP() + } + + private void LoadASP() { try { @@ -589,199 +391,124 @@ public class WarpDriveConfig } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Error loading ASP classes"); + System.out.println("WarpDriveConfig Error loading ASP classes"); e.printStackTrace(); isAdvSolPanelLoaded = false; } } - private static void loadAtomicScience() { - try { - Class z = Class.forName("resonantinduction.atomic.Atomic"); + private void LoadAS() + { + try + { +/* + Class z = Class.forName("atomicscience.AtomicScience"); CommonWorldGenOres.add(new int[] {((Block)z.getField("blockUraniumOre").get(null)).blockID, 0}); AS_Turbine = ((Block)z.getField("blockElectricTurbine").get(null)).blockID; - AS_deuteriumCell = ((Item)z.getField("itemDeuteriumCell").get(null)).itemID; - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Error loading AS classes"); - isAtomicScienceLoaded = false; +*/ + Class z = Class.forName("atomicscience.ZhuYaoAS"); + CommonWorldGenOres.add(new int[] {((Block)z.getField("bHeOre").get(null)).blockID, 0}); + AS_Turbine = ((Block)z.getField("bWoLun").get(null)).blockID; + } + catch (Exception e) + { + System.out.println("WarpDriveConfig Error loading AS classes"); + e.printStackTrace(); + isASLoaded = false; } } - private static void loadICBM() { - try { + private void LoadICBM() + { + try + { Class z = Class.forName("icbm.core.ICBMCore"); CommonWorldGenOres.add(new int[] {((Block)z.getField("blockSulfurOre").get(null)).blockID, 0}); z = Class.forName("icbm.explosion.ICBMExplosion"); ICBM_Machine = ((Block)z.getField("blockMachine").get(null)).blockID; ICBM_Missile = ((Item)z.getField("itemMissile").get(null)).itemID; ICBM_Explosive = ((Block)z.getField("blockExplosive").get(null)).blockID; - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Error loading ICBM classes"); + scannerIgnoreBlocks.add(ICBM_Explosive); + } + catch (Exception e) + { + System.out.println("WarpDriveConfig Error loading ICBM classes"); e.printStackTrace(); isICBMLoaded = false; } } - private static void loadMFFS() { - try { + private void LoadMFFS() + { + try + { Class z = Class.forName("mffs.ModularForceFieldSystem"); - int blockId = ((Block)z.getField("blockForceField").get(null)).blockID; - forceFieldBlocks.add(blockId); - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Error loading MFFS classes"); + MFFS_Field = ((Block)z.getField("blockForceField").get(null)).blockID; + } + catch (Exception e) + { + System.out.println("WarpDriveConfig Error loading MFFS classes"); e.printStackTrace(); isICBMLoaded = false; } } - private static void loadGraviSuite() { - try { + private void LoadGS() + { + try + { Class z = Class.forName("gravisuite.GraviSuite"); if (z.getField("ultimateSolarHelmet").get(null) != null) SpaceHelmets.add(((Item)z.getField("ultimateSolarHelmet").get(null)).itemID); Jetpacks.add(z.getField("advJetpackID").getInt(null) + 256); Jetpacks.add(z.getField("graviChestPlateID").getInt(null) + 256); - GS_ultimateLappack = z.getField("ultimateLappackID").getInt(null) + 256; - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Error loading GS classes"); + } + catch (Exception e) + { + System.out.println("WarpDriveConfig Error loading GS classes"); e.printStackTrace(); isGraviSuiteLoaded = false; } } - private static void loadUndergroundBiomes() { - try { - Class z = Class.forName("exterminatorJeff.undergroundBiomes.common.UndergroundBiomes"); - UB_igneousStone = ((Block)z.getField("igneousStone").get(null)).blockID; - UB_igneousCobblestone = ((Block)z.getField("igneousCobblestone").get(null)).blockID; - UB_metamorphicStone = ((Block)z.getField("metamorphicStone").get(null)).blockID; - UB_metamorphicCobblestone = ((Block)z.getField("metamorphicCobblestone").get(null)).blockID; - UB_sedimentaryStone = ((Block)z.getField("sedimentaryStone").get(null)).blockID; - WarpDrive.debugPrint("WarpDriveConfig found UndergroundBiomes blocks " + UB_igneousStone + ", " + UB_igneousCobblestone + ", " + UB_metamorphicStone + ", " + UB_metamorphicCobblestone + ", " + UB_sedimentaryStone); - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Error loading UndergroundBiomes classes"); - e.printStackTrace(); - isUndergroundBiomesLoaded = false; - } - } - - private static void loadNetherOres() { - try { - NetherOres_count = 21; // FIXME: extract it properly -/* Class z = Class.forName("powercrystals.netherores.ores.Ores"); - NO_netherOresCount = z.getField("values").get(null).length; - WarpDrive.debugPrint("WarpDriveConfig found NetherOres count " + NO_netherOresCount); - - z = Class.forName("powercrystals.netherores.NetherOresCore"); - for (int i = 0; i < (NO_netherOresCount + 15) / 16; i++) - { - NO_netherOresBlock[i] = ((Block[])z.getDeclaredField("blockNetherOres").get(null))[i].blockID; - WarpDrive.debugPrint("WarpDriveConfig found NetherOres blockId " + NO_netherOresBlock[i]); - }*/ - NetherOres_block = new int[(NetherOres_count + 15) / 16]; - NetherOres_block[0] = 1440; - NetherOres_block[1] = 1442; - System.out.println("WarpDriveConfig found " + NetherOres_count + " NetherOres"); - } - catch (Exception e) + public int[] getDefaultSurfaceBlock(Random random, boolean corrupted, boolean isMoon) + { + if (isMoon) { - System.out.println("WarpDriveConfig Error loading NetherOres classes"); - e.printStackTrace(); - isNetherOresLoaded = false; - } - } - - private static void loadThermalExpansion() { - try { -// TEEnergyCell = Class.forName("thermalexpansion.block.energycell.BlockEnergyCell"); -// TEFluids = Class.forName("thermalexpansion.fluid.TEFluids"); - } catch (Exception e) { - System.out.println("WarpDriveConfig Error loading ThermalExpansion classes"); - e.printStackTrace(); - isThermalExpansionLoaded = false; - } - } - - private static void loadMetallurgy() { - try { - Metallurgy_overworldOresBlock = new int[][] { { 905, 7}, { 905, 8}, { 905, 9}, { 905, 10}, { 905, 11}, { 905, 12}, { 906, 0}, { 906, 1}, { 906, 2}, { 906, 4}, { 906, 5}, { 906, 6}, { 906, 7}, { 906, 8}, { 906, 11}, { 906, 13}, { 906, 14} }; - Metallurgy_netherOresBlock = new int[][] { { 903, 0}, { 903, 1}, { 903, 2}, { 903, 3}, { 903, 4}, { 903, 5}, { 903, 6}, { 903, 7}, { 903, 8}, { 903, 9} }; - Metallurgy_endOresBlock = new int[][] { { 900, 5}, { 900, 6} }; - } catch (Exception e) { - System.out.println("WarpDriveConfig Error loading Metallurgy classes"); - e.printStackTrace(); - isMetallurgyLoaded = false; - } - } - - private static void loadAdvancedRepulsionSystems() { - try { - Class z = Class.forName("mods.immibis.ars.ARSMod"); - int fieldBlockId = ((Block)z.getField("MFFSFieldblock").get(null)).blockID; - forceFieldBlocks.add(fieldBlockId); - } catch (Exception e) { - System.out.println("WarpDriveConfig Error loading AdvancedRepulsionSystems classes"); - e.printStackTrace(); - isAdvancedRepulsionSystemsLoaded = false; - } - } - - public static int[] getDefaultSurfaceBlock(Random random, boolean corrupted, boolean isMoon) { - if (isMoon) { - if (isGregLoaded && (random.nextInt(100) == 1)) { - if (random.nextBoolean()) { + if (random.nextInt(100) == 1) + if (random.nextBoolean()) return new int[] {GT_Granite, (corrupted && random.nextBoolean())?1:0}; - } else { + else return new int[] {GT_Granite, (corrupted && random.nextBoolean())?9:8}; - } - } else if (random.nextInt(5) == 1) { + else if (random.nextInt(666) == 1) return new int[] {Block.netherrack.blockID, 0}; - } else if (random.nextInt(15) == 1) { + else if (random.nextInt(1000) == 1) return new int[] {Block.whiteStone.blockID, 0}; - } - } else { - if (isGregLoaded && (random.nextInt(25) == 1)) { - if (random.nextBoolean()) { - return new int[] {GT_Granite, (corrupted && random.nextBoolean())?1:0}; - } else { - return new int[] {GT_Granite, (corrupted && random.nextBoolean())?9:8}; - } - } else if (random.nextInt(6) == 1) { - return new int[] {Block.netherrack.blockID, 0}; - } else if (random.nextInt(50) == 1) { - return new int[] {Block.whiteStone.blockID, 0}; - } } - if (corrupted && random.nextBoolean()) { - if (isUndergroundBiomesLoaded) { - int rnd = random.nextInt(8 + 8 + 2); - if (rnd < 8) { - return new int[] {UB_igneousCobblestone, rnd}; - } else if (rnd < (8 + 8)) { - return new int[] {UB_metamorphicCobblestone, rnd - 8}; - } - } + else + { + if (random.nextInt(25) == 1) + if (random.nextBoolean()) + return new int[] {GT_Granite, (corrupted && random.nextBoolean())?1:0}; + else + return new int[] {GT_Granite, (corrupted && random.nextBoolean())?9:8}; + else if (random.nextInt(50) == 1) + return new int[] {Block.netherrack.blockID, 0}; + else if (random.nextInt(150) == 1) + return new int[] {Block.whiteStone.blockID, 0}; + } + if (corrupted && random.nextBoolean()) return new int[] {Block.cobblestone.blockID, 0}; - } - if (isUndergroundBiomesLoaded) { - int rnd = random.nextInt(8 + 8 + 8 + 3); - if (rnd < 8) { - return new int[] {UB_igneousStone, rnd}; - } else if (rnd < (8 + 8)) { - return new int[] {UB_metamorphicStone, rnd - 8}; - } - else if (rnd < (8 + 8 + 8)) { - return new int[] {UB_sedimentaryStone, rnd - 8 - 8}; - } - } return new int[] {Block.stone.blockID, 0}; } - public static int[] getRandomSurfaceBlock(Random random, int blockID, int blockMeta, boolean bedrock) { - if (bedrock && (random.nextInt(1000) == 1)) { + public int[] getRandomSurfaceBlock(Random random, int blockID, int blockMeta, boolean bedrock) + { + if (bedrock && random.nextInt(1000) == 1) return new int[] {Block.bedrock.blockID, 0}; - } else if (blockID == GT_Granite) { - if ((blockMeta == 0) || (blockMeta == 1)) { + if (blockID == GT_Granite) + if (blockMeta == 0 || blockMeta == 1) + { int[] t; t = getRandomOverworldBlock(random, blockID, blockMeta); if (t[0] == blockID) @@ -789,7 +516,9 @@ public class WarpDriveConfig if (t[0] == blockID) t = getRandomEndBlock(random, blockID, blockMeta); return t; - } else if ((blockMeta == 8) || (blockMeta == 9)) { + } + else if (blockMeta == 8 || blockMeta == 9) + { int[] t; t = getRandomOverworldBlock(random, blockID, blockMeta); if (t[0] == blockID) @@ -798,27 +527,25 @@ public class WarpDriveConfig t = getRandomOverworldBlock(random, blockID, blockMeta); return t; } - } else if (blockID == Block.whiteStone.blockID) { + else if (blockID == Block.whiteStone.blockID) return getRandomEndBlock(random, blockID, blockMeta); - } else if (blockID == Block.netherrack.blockID) { + else if (blockID == Block.netherrack.blockID) return getRandomNetherBlock(random, blockID, blockMeta); - } return getRandomOverworldBlock(random, blockID, blockMeta); } - public static int[] getRandomOverworldBlock(Random random, int blockID, int blockMeta) + public int[] getRandomOverworldBlock(Random random, int blockID, int blockMeta) { - if (random.nextInt(25) == 5) { + if (random.nextInt(25) == 5) return CommonWorldGenOres.get(random.nextInt(CommonWorldGenOres.size())); - } else if (isMetallurgyLoaded && (random.nextInt(25) == 1)) { - return Metallurgy_overworldOresBlock[random.nextInt(Metallurgy_overworldOresBlock.length)]; - } else if (isAppliedEnergisticsLoaded && random.nextInt(750) == 1) { + else if (isAELoaded && random.nextInt(750) == 1) return new int[] {getAEBlock("blkQuartzOre").itemID, getAEBlock("blkQuartzOre").getItemDamage()}; - } else if (random.nextInt(250) == 1) { + else if (random.nextInt(250) == 1) return new int[] {Block.oreDiamond.blockID, 0}; - } else if (!isNetherOresLoaded && (random.nextInt(10000) == 42)) { - return new int[] {iridiumBlockID, 0}; - } else if (isGregLoaded) { + else if (random.nextInt(10000) == 42) + return new int[] {iridiumID, 0}; + if (isGregLoaded) + { if (random.nextInt(50) == 1) return new int[] {GT_Ores, 5}; //Bauxite S /* Stone/Iron/Diamod pick | +S = Silktouch recommended */ else if (random.nextInt(50) == 1) @@ -841,33 +568,32 @@ public class WarpDriveConfig return new int[] {blockID, blockMeta}; } - public static int[] getRandomNetherBlock(Random random, int blockID, int blockMeta) { - if (isICLoaded && (!isNetherOresLoaded) && (random.nextInt(10000) == 42)) { - return new int[] {iridiumBlockID, 0}; - } else if (isNetherOresLoaded && (random.nextInt(25) == 1)) { - int rnd = random.nextInt(NetherOres_count); - return new int[] {NetherOres_block[rnd / 16], rnd % 16}; - } else if (isMetallurgyLoaded && (random.nextInt(25) == 1)) { - return Metallurgy_netherOresBlock[random.nextInt(Metallurgy_netherOresBlock.length)]; - } else if (random.nextInt(25) == 1) { + public int[] getRandomNetherBlock(Random random, int blockID, int blockMeta) + { + if (random.nextInt(10000) == 42) + return new int[] {iridiumID, 0}; + else if (random.nextInt(25) == 1) return new int[] {Block.oreNetherQuartz.blockID, 0}; - } else if (isGregLoaded) { + else if (isGregLoaded) + { if (random.nextInt(100) == 1) return new int[] {GT_Ores, 6}; //Pyrite S+S else if (random.nextInt(100) == 1) return new int[] {GT_Ores, 8}; //Sphalerite S+S else if (random.nextInt(500) == 1) return new int[] {GT_Ores, 7}; //Cinnabar I+S - } else if ((!isNetherOresLoaded) && (random.nextInt(100) == 13)) + } + else if (random.nextInt(100) == 13) return CommonWorldGenOres.get(random.nextInt(CommonWorldGenOres.size())); return new int[] {blockID, blockMeta}; } - public static int[] getRandomEndBlock(Random random, int blockID, int blockMeta) + public int[] getRandomEndBlock(Random random, int blockID, int blockMeta) { - if (isICLoaded && random.nextInt(10000) == 42) { - return new int[] { iridiumBlockID, 0 }; - } else if (isGregLoaded) { + if (random.nextInt(10000) == 42) + return new int[] {iridiumID, 0}; + else if (isGregLoaded) + { if (random.nextInt(250) == 1) return new int[] {GT_Ores, 9}; //Tungstate I else if (random.nextInt(500) == 1) @@ -876,15 +602,9 @@ public class WarpDriveConfig return new int[] {GT_Ores, 10}; //Cooperite=Sheldonite D else if (random.nextInt(1000) == 1) return new int[] {GT_Ores, 11}; //Olivine D+S - } else if (isMetallurgyLoaded && (random.nextInt(25) == 1)) { - return Metallurgy_endOresBlock[random.nextInt(Metallurgy_endOresBlock.length)]; - } else if (random.nextInt(200) == 13) { - return CommonWorldGenOres.get(random.nextInt(CommonWorldGenOres.size())); } + else if (random.nextInt(200) == 13) + return CommonWorldGenOres.get(random.nextInt(CommonWorldGenOres.size())); return new int[] {blockID, blockMeta}; } - - public static boolean isAirBlock(World worldObj, int id, int x, int y, int z) { - return id == 0 || Block.blocksList[id] == null || Block.blocksList[id].isAirBlock(worldObj, x, y, z); - } } diff --git a/src/cr0s/WarpDrive/WarpDriveCreativeTab.java b/src/cr0s/WarpDrive/WarpDriveCreativeTab.java deleted file mode 100644 index eaba5a3c..00000000 --- a/src/cr0s/WarpDrive/WarpDriveCreativeTab.java +++ /dev/null @@ -1,31 +0,0 @@ -package cr0s.WarpDrive; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; - -public class WarpDriveCreativeTab extends CreativeTabs { - String topLabel; - - public WarpDriveCreativeTab(int par1, String par2Str) { - super(par1, par2Str); - } - - public WarpDriveCreativeTab(String par1Str,String topLabelIn) { - super(par1Str); - topLabel = topLabelIn; - } - - @Override - @SideOnly(Side.CLIENT) - public Item getTabIconItem() { - return WarpDrive.componentItem; - // return WarpDrive.reactorLaserFocusItem; - } - - @Override - public String getTranslatedTabLabel() { - return topLabel; - } -} diff --git a/src/cr0s/WarpDrive/WarpDrivePeripheralHandler.java b/src/cr0s/WarpDrive/WarpDrivePeripheralHandler.java deleted file mode 100644 index 6c92d8ca..00000000 --- a/src/cr0s/WarpDrive/WarpDrivePeripheralHandler.java +++ /dev/null @@ -1,18 +0,0 @@ -package cr0s.WarpDrive; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import dan200.computercraft.api.peripheral.IPeripheral; -import dan200.computercraft.api.peripheral.IPeripheralProvider; - -public class WarpDrivePeripheralHandler implements IPeripheralProvider { - @Override - public IPeripheral getPeripheral(World world, int x, int y, int z, int side) { -// WarpDrive.debugPrint("Checking Peripheral at " + x + ", " + y + ", " + z); - TileEntity te = world.getBlockTileEntity(x, y, z); - if(te instanceof IPeripheral) { - return (IPeripheral)te; - } - return null; - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/WorldGenSmallShip.java b/src/cr0s/WarpDrive/WorldGenSmallShip.java index 0ce04b4a..43592fcc 100644 --- a/src/cr0s/WarpDrive/WorldGenSmallShip.java +++ b/src/cr0s/WarpDrive/WorldGenSmallShip.java @@ -1,5 +1,6 @@ package cr0s.WarpDrive; +import cpw.mods.fml.common.Loader; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.entity.monster.EntityZombie; @@ -15,39 +16,39 @@ public class WorldGenSmallShip extends WorldGenerator private boolean corrupted; private int solarType; - public WorldGenSmallShip(boolean corrupted) { + public WorldGenSmallShip(boolean corrupted) + { this.corrupted = corrupted; - solarType = WarpDriveConfig.getIC2Item("solarPanel").getItemDamage(); + solarType = WarpDriveConfig.i.getIC2Item("solarPanel").getItemDamage(); } @Override - public boolean generate(World world, Random rand, int centerX, int centerY, int centerZ) + public boolean generate(World world, Random rand, int i, int j, int k) { - if (WarpDriveConfig.isAdvSolPanelLoaded) + if (WarpDriveConfig.i.isAdvSolPanelLoaded) solarType = rand.nextInt(2); - ItemStack cableType = WarpDriveConfig.getIC2Item("copperCableBlock").copy(); + ItemStack cableType = WarpDriveConfig.i.getIC2Item("copperCableBlock").copy(); switch (rand.nextInt(4)) { case 0: - cableType = WarpDriveConfig.getIC2Item("glassFiberCableBlock").copy(); + cableType = WarpDriveConfig.i.getIC2Item("glassFiberCableBlock").copy(); break; case 1: - cableType = WarpDriveConfig.getIC2Item("glassFiberCableBlock").copy(); + cableType = WarpDriveConfig.i.getIC2Item("glassFiberCableBlock").copy(); break; case 2: - cableType = WarpDriveConfig.getIC2Item("insulatedGoldCableBlock").copy(); + cableType = WarpDriveConfig.i.getIC2Item("insulatedGoldCableBlock").copy(); break; case 3: - cableType = WarpDriveConfig.getIC2Item("doubleInsulatedIronCableBlock").copy(); + cableType = WarpDriveConfig.i.getIC2Item("doubleInsulatedIronCableBlock").copy(); break; } - int i = centerX - 5, j = centerY - 4, k = centerZ - 6; world.setBlock(i + 0, j + 1, k + 4, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 0, j + 1, k + 10, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 1, j + 1, k + 4, WorldGenStructure.getStoneBlock(corrupted, rand)); @@ -217,7 +218,7 @@ public class WorldGenSmallShip extends WorldGenerator world.setBlock(i + 7, j + 6, k + 3, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 7, j + 6, k + 4, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 7, j + 6, k + 6, cableType.itemID, cableType.getItemDamage(), 0); - world.setBlock(i + 7, j + 6, k + 7, WarpDriveConfig.ASP, solarType, 0); + world.setBlock(i + 7, j + 6, k + 7, WarpDriveConfig.i.ASP, solarType, 0); world.setBlock(i + 7, j + 6, k + 10, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 7, j + 6, k + 11, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 7, j + 7, k + 5, WorldGenStructure.getStoneBlock(corrupted, rand)); @@ -250,7 +251,7 @@ public class WorldGenSmallShip extends WorldGenerator world.setBlock(i + 8, j + 6, k + 3, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 8, j + 6, k + 4, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 8, j + 6, k + 6, cableType.itemID, cableType.getItemDamage(), 0); - world.setBlock(i + 8, j + 6, k + 7, WarpDriveConfig.ASP, solarType, 0); + world.setBlock(i + 8, j + 6, k + 7, WarpDriveConfig.i.ASP, solarType, 0); world.setBlock(i + 8, j + 6, k + 10, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 8, j + 6, k + 11, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 8, j + 7, k + 4, WorldGenStructure.getStoneBlock(corrupted, rand)); @@ -285,9 +286,9 @@ public class WorldGenSmallShip extends WorldGenerator world.setBlock(i + 9, j + 6, k + 3, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 9, j + 6, k + 4, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 9, j + 6, k + 6, cableType.itemID, cableType.getItemDamage(), 0); - world.setBlock(i + 9, j + 6, k + 7, WarpDriveConfig.ASP, solarType, 0); + world.setBlock(i + 9, j + 6, k + 7, WarpDriveConfig.i.ASP, solarType, 0); // Placing air generator - world.setBlock(i + 9, j + 5, k + 7, WarpDriveConfig.airgenID, 0, 0); + world.setBlock(i + 9, j + 5, k + 7, WarpDriveConfig.i.airgenID, 0, 0); world.setBlock(i + 9, j + 6, k + 10, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 9, j + 6, k + 11, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 9, j + 7, k + 4, WorldGenStructure.getStoneBlock(corrupted, rand)); @@ -325,9 +326,9 @@ public class WorldGenSmallShip extends WorldGenerator world.setBlock(i + 10, j + 6, k + 3, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 10, j + 6, k + 4, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 10, j + 6, k + 6, cableType.itemID, cableType.getItemDamage(), 0); - world.setBlock(i + 10, j + 6, k + 7, WarpDriveConfig.ASP, solarType, 0); + world.setBlock(i + 10, j + 6, k + 7, WarpDriveConfig.i.ASP, solarType, 0); // Placing air generator - world.setBlock(i + 10, j + 5, k + 7, WarpDriveConfig.airgenID, 0, 0); + world.setBlock(i + 10, j + 5, k + 7, WarpDriveConfig.i.airgenID, 0, 0); world.setBlock(i + 10, j + 6, k + 10, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 10, j + 6, k + 11, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 10, j + 7, k + 4, WorldGenStructure.getStoneBlock(corrupted, rand)); @@ -361,7 +362,7 @@ public class WorldGenSmallShip extends WorldGenerator // Place warp-controller if (rand.nextBoolean()) { - world.setBlock(i + 11, j + 3, k + 7, WarpDriveConfig.controllerID); + world.setBlock(i + 11, j + 3, k + 7, WarpDriveConfig.i.controllerID); } world.setBlock(i + 11, j + 3, k + 8, WorldGenStructure.getGlassBlock(corrupted, rand)); @@ -372,7 +373,7 @@ public class WorldGenSmallShip extends WorldGenerator // Place computer if (rand.nextBoolean()) { - world.setBlock(i + 11, j + 4, k + 7, WarpDriveConfig.CC_Computer, 12, 3); + world.setBlock(i + 11, j + 4, k + 7, 1225, 16384, 0); } world.setBlock(i + 11, j + 4, k + 8, WorldGenStructure.getGlassBlock(corrupted, rand)); @@ -383,7 +384,7 @@ public class WorldGenSmallShip extends WorldGenerator world.setBlock(i + 11, j + 6, k + 3, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 11, j + 6, k + 4, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 11, j + 6, k + 6, cableType.itemID, cableType.getItemDamage(), 0); - world.setBlock(i + 11, j + 6, k + 7, WarpDriveConfig.ASP, solarType, 0); + world.setBlock(i + 11, j + 6, k + 7, WarpDriveConfig.i.ASP, solarType, 0); world.setBlock(i + 11, j + 6, k + 10, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 11, j + 6, k + 11, WorldGenStructure.getStoneBlock(corrupted, rand)); world.setBlock(i + 11, j + 7, k + 4, WorldGenStructure.getStoneBlock(corrupted, rand)); @@ -417,7 +418,7 @@ public class WorldGenSmallShip extends WorldGenerator // Place warp-core if (rand.nextBoolean()) { - world.setBlock(i + 12, j + 3, k + 7, WarpDriveConfig.coreID); + world.setBlock(i + 12, j + 3, k + 7, WarpDriveConfig.i.coreID); } world.setBlock(i + 12, j + 3, k + 8, WorldGenStructure.getGlassBlock(corrupted, rand)); @@ -554,7 +555,7 @@ public class WorldGenSmallShip extends WorldGenerator return true; } - public static void spawnNPC(World world, int i, int j, int k) + public void spawnNPC(World world, int i, int j, int k) { int numMobs = 2 + world.rand.nextInt(10); @@ -563,7 +564,7 @@ public class WorldGenSmallShip extends WorldGenerator for (int idx = 0; idx < numMobs; idx++) { EntityVillager entityvillager = new EntityVillager(world, 0); - entityvillager.setLocationAndAngles(i + 0.5D, j, k + 0.5D, 0.0F, 0.0F); + entityvillager.setLocationAndAngles((double)i + 0.5D, (double)j, (double)k + 0.5D, 0.0F, 0.0F); world.spawnEntityInWorld(entityvillager); } } @@ -572,7 +573,7 @@ public class WorldGenSmallShip extends WorldGenerator for (int idx = 0; idx < numMobs; idx++) { EntityZombie entityzombie = new EntityZombie(world); - entityzombie.setLocationAndAngles(i + 0.5D, j, k + 0.5D, 0.0F, 0.0F); + entityzombie.setLocationAndAngles((double)i + 0.5D, (double)j, (double)k + 0.5D, 0.0F, 0.0F); world.spawnEntityInWorld(entityzombie); } } @@ -585,12 +586,11 @@ public class WorldGenSmallShip extends WorldGenerator if (te != null) { TileEntityChest chest = (TileEntityChest)te; - int size = chest.getSizeInventory(); - int numBonuses = rand.nextInt(size) / 2; + int numBonuses = rand.nextInt(28); - for (int i = 0; i < size; i++) + for (int i = 0; i < chest.getSizeInventory(); i++) { - if (rand.nextInt(size) <= numBonuses) + if (rand.nextInt(15) == 0) { numBonuses--; chest.setInventorySlotContents(i, getRandomBonus(rand)); @@ -609,14 +609,14 @@ public class WorldGenSmallShip extends WorldGenerator switch (rand.nextInt(14)) { case 0: - res = WarpDriveConfig.getIC2Item("massFabricator").copy(); - res.stackSize = 1; // + rand.nextInt(2); + res = WarpDriveConfig.i.getIC2Item("massFabricator").copy(); + res.stackSize = 1 + rand.nextInt(2); isDone = true; break; case 1: - res = WarpDriveConfig.getIC2Item("nuke").copy(); - res.stackSize = 1 + rand.nextInt(2); + res = WarpDriveConfig.i.getIC2Item("nuke").copy(); + res.stackSize = 1 + rand.nextInt(64); isDone = true; break; @@ -628,14 +628,14 @@ public class WorldGenSmallShip extends WorldGenerator break;// skipped case 6: - res = WarpDriveConfig.getIC2Item("glassFiberCableItem").copy(); - res.stackSize = 2 + rand.nextInt(12); + res = WarpDriveConfig.i.getIC2Item("glassFiberCableItem").copy(); + res.stackSize = 2 + rand.nextInt(63); isDone = true; break; case 7: - res = WarpDriveConfig.getIC2Item("matter").copy(); - res.stackSize = 2 + rand.nextInt(14); + res = WarpDriveConfig.i.getIC2Item("matter").copy(); + res.stackSize = 2 + rand.nextInt(63); isDone = true; break; @@ -645,10 +645,10 @@ public class WorldGenSmallShip extends WorldGenerator // AE Quarz case 9: - if (WarpDriveConfig.isAppliedEnergisticsLoaded) + if (WarpDriveConfig.i.isAELoaded) { - res = WarpDriveConfig.getAEMaterial("matQuartz").copy(); - res.stackSize = 2 + rand.nextInt(22); + res = WarpDriveConfig.i.getAEMaterial("matQuartz").copy(); + res.stackSize = 2 + rand.nextInt(63); isDone = true; } @@ -656,37 +656,37 @@ public class WorldGenSmallShip extends WorldGenerator // AE improved processor case 10: - if (WarpDriveConfig.isAppliedEnergisticsLoaded) + if (WarpDriveConfig.i.isAELoaded) { - res = WarpDriveConfig.getAEMaterial("matProcessorAdvanced").copy(); - res.stackSize = 1 + rand.nextInt(3); + res = WarpDriveConfig.i.getAEMaterial("matProcessorAdvanced").copy(); + res.stackSize = 2 + rand.nextInt(63); isDone = true; } break; // Rocket launcher platform Tier3 case 11: - if (WarpDriveConfig.isICBMLoaded) + if (WarpDriveConfig.i.isICBMLoaded) { - res = new ItemStack(WarpDriveConfig.ICBM_Machine, 1 + rand.nextInt(1), 2).copy(); + res = new ItemStack(WarpDriveConfig.i.ICBM_Machine, 2 + rand.nextInt(1), 2).copy(); isDone = true; } break; // Missles from conventional to hypersonic case 12: - if (WarpDriveConfig.isICBMLoaded) + if (WarpDriveConfig.i.isICBMLoaded) { - res = new ItemStack(WarpDriveConfig.ICBM_Missile, 2 + rand.nextInt(1), rand.nextInt(10)).copy(); + res = new ItemStack(WarpDriveConfig.i.ICBM_Missile, 2 + rand.nextInt(1), rand.nextInt(21)).copy(); isDone = true; } break; // Advanced solar panels case 13: - if (WarpDriveConfig.isAdvSolPanelLoaded) + if (WarpDriveConfig.i.isAdvSolPanelLoaded) { - res = new ItemStack(WarpDriveConfig.ASP, rand.nextInt(3), solarType).copy(); + res = new ItemStack(WarpDriveConfig.i.ASP, rand.nextInt(3), solarType).copy(); isDone = true; } break; diff --git a/src/cr0s/WarpDrive/WorldGenStation.java b/src/cr0s/WarpDrive/WorldGenStation.java index c2fced01..e91b1bf6 100644 --- a/src/cr0s/WarpDrive/WorldGenStation.java +++ b/src/cr0s/WarpDrive/WorldGenStation.java @@ -16,7 +16,8 @@ public class WorldGenStation { public WorldGenStation() { } - public static boolean generate(World world, Random rand, int i, int j, int k) { + public boolean generate(World world, Random rand, int i, int j, int k) + { world.setBlock(i + 1, j + 0, k + 3, Block.stone.blockID); world.setBlock(i + 1, j + 0, k + 12, Block.stone.blockID); world.setBlock(i + 1, j + 1, k + 3, Block.stone.blockID); diff --git a/src/cr0s/WarpDrive/WorldGenStructure.java b/src/cr0s/WarpDrive/WorldGenStructure.java index 90bd262a..263be895 100644 --- a/src/cr0s/WarpDrive/WorldGenStructure.java +++ b/src/cr0s/WarpDrive/WorldGenStructure.java @@ -2,31 +2,19 @@ package cr0s.WarpDrive; import java.util.Random; -import net.minecraft.block.Block; - public class WorldGenStructure { public static int getStoneBlock(boolean corrupted, Random rand) { if (corrupted && (rand.nextInt(15) == 1)) return 0; - - if (WarpDriveConfig.isICLoaded) { - return WarpDriveConfig.getIC2Item("reinforcedStone").itemID; - } else { - return Block.stone.blockID; - } + return WarpDriveConfig.i.getIC2Item("reinforcedStone").itemID; } public static int getGlassBlock(boolean corrupted, Random rand) { if (corrupted && (rand.nextInt(30) == 1)) return 0; - - if (WarpDriveConfig.isICLoaded) { - return WarpDriveConfig.getIC2Item("reinforcedGlass").itemID; - } else { - return Block.glass.blockID; - } + return WarpDriveConfig.i.getIC2Item("reinforcedGlass").itemID; } } diff --git a/src/cr0s/WarpDrive/api/IBreathingHelmet.java b/src/cr0s/WarpDrive/api/IBreathingHelmet.java deleted file mode 100644 index f8af02ff..00000000 --- a/src/cr0s/WarpDrive/api/IBreathingHelmet.java +++ /dev/null @@ -1,8 +0,0 @@ -package cr0s.WarpDrive.api; - -import net.minecraft.entity.Entity; - -public interface IBreathingHelmet { - public boolean canBreath(Entity player); - public boolean removeAir(Entity player); -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/client/WailaHandler.java-notcompiling b/src/cr0s/WarpDrive/client/WailaHandler.java-notcompiling deleted file mode 100644 index 15e9a887..00000000 --- a/src/cr0s/WarpDrive/client/WailaHandler.java-notcompiling +++ /dev/null @@ -1,48 +0,0 @@ -package cr0s.WarpDrive.client; - -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; -import mcp.mobius.waila.api.IWailaDataProvider; -import mcp.mobius.waila.api.IWailaRegistrar; - -import java.util.List; - -import cr0s.WarpDrive.machines.TileEntityReactor; -import cr0s.WarpDrive.machines.WarpEnergyTE; -import net.minecraft.block.Block; -import net.minecraft.item.ItemStack; - -public class WailaHandler implements IWailaDataProvider { - @Override - public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { - return null; - } - - @Override - public List getWailaHead(ItemStack itemStack, List toolTip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return toolTip; - } - - @Override - public List getWailaBody(ItemStack itemStack, List toolTip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - if (accessor.getTileEntity() instanceof WarpEnergyTE) { - WarpEnergyTE energyTE = (WarpEnergyTE) accessor.getTileEntity(); - toolTip.add(String.format("Energy level %.0f %% (%d/%d EU)", (energyTE.getEnergyStored() * 100.0F / energyTE.getMaxEnergyStored()), energyTE.getEnergyStored(), + energyTE.getMaxEnergyStored())); - if (energyTE instanceof TileEntityReactor) { - TileEntityReactor reactorTE = (TileEntityReactor) energyTE; - toolTip.add(String.format("Cooldown remaining: %d s", Math.ceil(reactorTE.getCooldown() / 20))); - } - } - return toolTip; - } - - @Override - public List getWailaTail(ItemStack itemStack, List toolTip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return toolTip; - } - - public static void callbackRegister(IWailaRegistrar registrar) { - WailaHandler instance = new WailaHandler(); - registrar.registerBodyProvider(instance, WarpEnergyTE.class); - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/item/ItemReactorLaserFocus.java b/src/cr0s/WarpDrive/item/ItemReactorLaserFocus.java deleted file mode 100644 index ec1ac5fe..00000000 --- a/src/cr0s/WarpDrive/item/ItemReactorLaserFocus.java +++ /dev/null @@ -1,134 +0,0 @@ -package cr0s.WarpDrive.item; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import ic2.api.reactor.IReactor; -import ic2.api.reactor.IReactorComponent; - -public class ItemReactorLaserFocus extends Item implements IReactorComponent -{ - private final static int maxHeat = 3000; - - public ItemReactorLaserFocus(int id) - { - super(id); - setMaxDamage(maxHeat); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.items.ReactorLaserFocus"); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon("warpdrive:reactorFocus"); - } - - private static void damageComponent(ItemStack self,int damage) - { - //WarpDrive.debugPrint("ReactorCompDamage:" + damage); - int currDamage = self.getItemDamage(); - int nextDamage = Math.min(maxHeat,Math.max(0, currDamage + damage)); - self.setItemDamage(nextDamage); - } - - private static void balanceComponent(ItemStack self, ItemStack other) - { - final int selfBalance = 4; - int otherDamage = other.getItemDamage(); - int myDamage = self.getItemDamage(); - int newOne = (otherDamage + (selfBalance-1)*myDamage) / selfBalance; - int newTwo = otherDamage - (newOne - myDamage); - self.setItemDamage(newTwo); - other.setItemDamage(newOne); - } - - private static void coolComponent(ItemStack self, IReactorComponent comp, IReactor reactor, ItemStack stack, int x, int y) - { - int maxTransfer = maxHeat - self.getItemDamage(); - int compHeat = comp.getCurrentHeat(reactor, stack, x, y); - int transferHeat = - Math.min(compHeat,maxTransfer); - int retained = comp.alterHeat(reactor, stack, x, y, transferHeat); - damageComponent(self,retained - transferHeat); - } - - private static void coolReactor(IReactor reactor,ItemStack stack) - { - int reactorHeat = reactor.getHeat(); - int myHeat = stack.getItemDamage(); - int transfer = Math.min(maxHeat - myHeat,reactorHeat); - reactor.addHeat(-transfer); - damageComponent(stack,transfer); - } - - @Override - public void processChamber(IReactor reactor, ItemStack yourStack, int x, int y, boolean heatrun) - { - if(heatrun) - { - int[] xDif = {-1,0,0,1}; - int[] yDif = {0,-1,1,0}; - for(int i=0;i=0 && damage < potentialUnlocalized.length) { - if (cachedIS[damage] == null) { - cachedIS[damage] = new ItemStack(WarpDrive.componentItem,1,damage); - } - return cachedIS[damage]; - } - return null; - } - - public void registerRecipes() { - WarpDrive.debugPrint("Registering empty recipe"); - GameRegistry.addRecipe(new ShapedOreRecipe(getIS(0),false,"nrn","r r","nrn", - 'r', Item.redstone, - 'n', Item.goldNugget)); - - GameRegistry.addRecipe(new ShapedOreRecipe(getIS(1),false,"g","e","c", - 'g', Block.glass, - 'e', Item.enderPearl, - 'c', getIS(0))); - - GameRegistry.addRecipe(new ShapedOreRecipe(getIS(2),false," g ","ede"," c ", - 'g', Block.glass, - 'e', Item.enderPearl, - 'd', Item.diamond, - 'c', getIS(0))); - - GameRegistry.addRecipe(new ShapedOreRecipe(getIS(3),false," g ","rtr"," c ", - 'g', Block.glass, - 'r', "dyeBlue", - 't', Block.torchWood, - 'c', getIS(0))); - - GameRegistry.addRecipe(new ShapedOreRecipe(getIS(4),false," l ","rcr"," l ", - 'l', "dyeWhite", - 'r', Item.coal, - 'c', getIS(0))); - - GameRegistry.addRecipe(new ShapedOreRecipe(getIS(5),false,"g ","gwr","rwr", - 'g', Item.goldNugget, - 'r', Item.redstone, - 'w', "plankWood")); - - GameRegistry.addRecipe(new ShapedOreRecipe(getIS(6),false,"gig","iri","gig", - 'g', Item.goldNugget, - 'r', Item.redstone, - 'i', Item.ingotIron)); - } - - @Override - public void registerIcons(IconRegister par1IconRegister) { - for(int i = 0; i < potentialUnlocalized.length; i++) { - potentialIcons[i] = par1IconRegister.registerIcon("warpdrive:component" + potentialUnlocalized[i]); - } - } - - @Override - public String getUnlocalizedName(ItemStack itemSt) { - int damage = itemSt.getItemDamage(); - if (damage >= 0 && damage < potentialUnlocalized.length) { - return "item.warpdrive.crafting." + potentialUnlocalized[damage]; - } - return getUnlocalizedName(); - } - - @Override - @SideOnly(Side.CLIENT) - public Icon getIconFromDamage(int damage) { - if (damage >= 0 && damage < potentialUnlocalized.length) { - return potentialIcons[damage]; - } - return potentialIcons[0]; - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List) { - for(int i = 0; i < potentialUnlocalized.length; i++) - par3List.add(new ItemStack(par1, 1, i)); - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/BlockCamera.java b/src/cr0s/WarpDrive/machines/BlockCamera.java deleted file mode 100644 index 9035ef81..00000000 --- a/src/cr0s/WarpDrive/machines/BlockCamera.java +++ /dev/null @@ -1,93 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.CamRegistryItem; -import cr0s.WarpDrive.WarpDrive; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; -import net.minecraft.world.World; - -public class BlockCamera extends BlockContainer { - private Icon[] iconBuffer; - - private final int ICON_SIDE = 0; - - public BlockCamera(int id, int texture, Material material) { - super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.Camera"); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { - iconBuffer = new Icon[1]; - // Solid textures - iconBuffer[ICON_SIDE] = par1IconRegister.registerIcon("warpdrive:cameraSide"); - } - - @Override - public Icon getIcon(int side, int metadata) { - return iconBuffer[ICON_SIDE]; - } - - @Override - public TileEntity createNewTileEntity(World var1) { - return new TileEntityCamera(); - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random par1Random) { - return 1; - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public int idDropped(int par1, Random par2Random, int par3) { - return this.blockID; - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return false; - } - - // Get camera frequency - TileEntity te = par1World.getBlockTileEntity(x, y, z); - if (te != null && te instanceof TileEntityCamera) { - int frequency = ((TileEntityCamera)te).getFrequency(); - - CamRegistryItem cam = WarpDrive.instance.cams.getCamByFrequency(par1World, frequency); - if (cam == null) { - WarpDrive.instance.cams.printRegistry(par1World); - par5EntityPlayer.addChatMessage(getLocalizedName() + " Frequency '" + frequency + "' is invalid!"); - } else { - par5EntityPlayer.addChatMessage(getLocalizedName() + " Frequency '" + frequency + "' is valid for camera at " + cam.position.x + ", " + cam.position.y + ", " + cam.position.z); - } - return true; - } - - return false; - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/BlockCloakingCoil.java b/src/cr0s/WarpDrive/machines/BlockCloakingCoil.java deleted file mode 100644 index 1ed9beca..00000000 --- a/src/cr0s/WarpDrive/machines/BlockCloakingCoil.java +++ /dev/null @@ -1,77 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; -import net.minecraft.world.World; - -public class BlockCloakingCoil extends Block { - private Icon[] iconBuffer; - - public BlockCloakingCoil(int id, int texture, Material material) { - super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.CloakingCoil"); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { - iconBuffer = new Icon[3]; - iconBuffer[0] = par1IconRegister.registerIcon("warpdrive:cloakCoilSide"); - iconBuffer[1] = par1IconRegister.registerIcon("warpdrive:cloakCoilSideActive"); - iconBuffer[2] = par1IconRegister.registerIcon("warpdrive:cloakCoilTop"); - } - - @Override - public Icon getIcon(int side, int metadata) { - if (side == 0) { - return iconBuffer[2]; - } else if (side == 1) { - return iconBuffer[2]; - } - if (metadata == 0) { - return iconBuffer[0]; - } else if (metadata == 1) { - return iconBuffer[1]; - } else { - return null; - } - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random par1Random) { - return 1; - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public int idDropped(int par1, Random par2Random, int par3) { - return this.blockID; - } - - @Override - public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) { - TileEntity te = par1World.getBlockTileEntity(par2, par3, par4); - if (te != null) { - te.invalidate(); - } - - super.breakBlock(par1World, par2, par3, par4, par5, par6); - } -} diff --git a/src/cr0s/WarpDrive/machines/BlockCloakingDeviceCore.java b/src/cr0s/WarpDrive/machines/BlockCloakingDeviceCore.java deleted file mode 100644 index df910706..00000000 --- a/src/cr0s/WarpDrive/machines/BlockCloakingDeviceCore.java +++ /dev/null @@ -1,100 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; -import net.minecraft.world.World; - -public class BlockCloakingDeviceCore extends BlockContainer { - private Icon[] iconBuffer; - - public BlockCloakingDeviceCore(int id, int texture, Material material) { - super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.CloakingDeviceCore"); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { - iconBuffer = new Icon[2]; - iconBuffer[0] = par1IconRegister.registerIcon("warpdrive:cloakingCoreInactive"); - iconBuffer[1] = par1IconRegister.registerIcon("warpdrive:cloakingCoreActive"); - } - - @Override - public Icon getIcon(int side, int metadata) { - if (metadata < iconBuffer.length) { - return iconBuffer[metadata]; - } else { - return null; - } - } - - @Override - public TileEntity createNewTileEntity(World var1) { - return new TileEntityCloakingDeviceCore(); - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random par1Random) { - return 1; - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public int idDropped(int par1, Random par2Random, int par3) { - return this.blockID; - } - - @Override - public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return false; - } - - TileEntityCloakingDeviceCore te = (TileEntityCloakingDeviceCore)par1World.getBlockTileEntity(par2, par3, par4); - if (te != null && (par5EntityPlayer.getHeldItem() == null)) { - par5EntityPlayer.addChatMessage(te.getStatus() + "\n" -// + " Valid? " + te.isValid + " Cloaking? " + te.isCloaking + " Enabled? " + te.isEnabled + "\n" - + ((!te.isValid) ? "Invalid assembly!" : - ((!te.isEnabled) ? "Cloak is disabled" : - ((te.isCloaking) ? "A tier " + te.tier + " cloak is currently covering " + te.volume + " blocks!" : "Cloak needs more power!")))); - return true; - } - - return false; - } - - @Override - public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) { - TileEntity te = par1World.getBlockTileEntity(par2, par3, par4); - - if (te != null && te instanceof TileEntityCloakingDeviceCore) { - ((TileEntityCloakingDeviceCore)te).isEnabled = false; - ((TileEntityCloakingDeviceCore)te).disableCloakingField(); - - te.invalidate(); - } - - super.breakBlock(par1World, par2, par3, par4, par5, par6); - } -} diff --git a/src/cr0s/WarpDrive/machines/BlockLaserCam.java b/src/cr0s/WarpDrive/machines/BlockLaserCam.java deleted file mode 100644 index e1be2900..00000000 --- a/src/cr0s/WarpDrive/machines/BlockLaserCam.java +++ /dev/null @@ -1,91 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.CamRegistryItem; -import cr0s.WarpDrive.WarpDrive; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; -import net.minecraft.world.World; - -public class BlockLaserCam extends BlockContainer { - private Icon[] iconBuffer; - - private final int ICON_SIDE = 0; - - public BlockLaserCam(int id, int texture, Material material) { - super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.LaserCamera"); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { - iconBuffer = new Icon[1]; - // Solid textures - iconBuffer[ICON_SIDE] = par1IconRegister.registerIcon("warpdrive:laserSideCam"); - } - - @Override - public Icon getIcon(int side, int metadata) { - return iconBuffer[ICON_SIDE]; - } - - @Override - public TileEntity createNewTileEntity(World parWorld) { - return new TileEntityLaser(); - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random par1Random) { - return 1; - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public int idDropped(int par1, Random par2Random, int par3) { - return this.blockID; - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return false; - } - - // Get camera frequency - TileEntity te = par1World.getBlockTileEntity(x, y, z); - if (te != null && te instanceof TileEntityLaser && (par5EntityPlayer.getHeldItem() == null)) { - int beamFrequency = ((TileEntityLaser)te).getBeamFrequency(); - int cameraFrequency = ((TileEntityLaser)te).getCameraFrequency(); - - CamRegistryItem cam = WarpDrive.instance.cams.getCamByFrequency(par1World, cameraFrequency); - par5EntityPlayer.addChatMessage(getLocalizedName() - + ": Beam frequency '" + beamFrequency + "' is " + ((beamFrequency < 0) ? "invalid!":"valid.") - + " Camera frequency '" + cameraFrequency + "' is " + ((cam == null) ? "invalid!":"valid for laser-camera at " + cam.position.x + ", " + cam.position.y + ", " + cam.position.z)); - return true; - } - - return false; - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/BlockLaserReactorMonitor.java b/src/cr0s/WarpDrive/machines/BlockLaserReactorMonitor.java deleted file mode 100644 index 63b46418..00000000 --- a/src/cr0s/WarpDrive/machines/BlockLaserReactorMonitor.java +++ /dev/null @@ -1,38 +0,0 @@ -package cr0s.WarpDrive.machines; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; - -public class BlockLaserReactorMonitor extends BlockContainer { - public BlockLaserReactorMonitor(int id, int texture, Material material) { - super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.LaserReactorMonitor"); - } - - public BlockLaserReactorMonitor(int id, Material material) { - this(id, 0, material); - } - - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { - // Solid textures - blockIcon = par1IconRegister.registerIcon("warpdrive:reactorMonitor"); - } - - @Override - public TileEntity createNewTileEntity(World var1) { - return new TileEntityLaserReactorMonitor(); - } -} diff --git a/src/cr0s/WarpDrive/machines/BlockMiningLaser.java b/src/cr0s/WarpDrive/machines/BlockMiningLaser.java deleted file mode 100644 index 62cbbc03..00000000 --- a/src/cr0s/WarpDrive/machines/BlockMiningLaser.java +++ /dev/null @@ -1,100 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; -import net.minecraft.world.World; - -public class BlockMiningLaser extends BlockContainer { - private Icon[] iconBuffer; - private final static int ICON_TOP = 5; - public final static int ICON_IDLE = 0; - public final static int ICON_MININGLOWPOWER = 1; - public final static int ICON_MININGPOWERED = 2; - public final static int ICON_SCANNINGLOWPOWER = 3; - public final static int ICON_SCANNINGPOWERED = 4; - - public BlockMiningLaser(int id, int texture, Material material) { - super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.MiningLaser"); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { - iconBuffer = new Icon[16]; - // Solid textures - iconBuffer[ICON_TOP ] = par1IconRegister.registerIcon("warpdrive:particleBoosterTopBottom"); - iconBuffer[ICON_IDLE ] = par1IconRegister.registerIcon("warpdrive:miningLaser_idle"); - iconBuffer[ICON_MININGLOWPOWER ] = par1IconRegister.registerIcon("warpdrive:miningLaser_miningLowPower"); - iconBuffer[ICON_MININGPOWERED ] = par1IconRegister.registerIcon("warpdrive:miningLaser_miningPowered"); - iconBuffer[ICON_SCANNINGLOWPOWER] = par1IconRegister.registerIcon("warpdrive:miningLaser_scanningLowPower"); - iconBuffer[ICON_SCANNINGPOWERED ] = par1IconRegister.registerIcon("warpdrive:miningLaser_scanningPowered"); - } - - @Override - public Icon getIcon(int side, int metadata) { - if (side == 0 || side == 1) { - return iconBuffer[ICON_TOP]; - } - if (metadata < iconBuffer.length) { - return iconBuffer[metadata]; - } else { - return null; - } - } - - @Override - public TileEntity createNewTileEntity(World var1) { - return new TileEntityMiningLaser(); - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random par1Random) { - return 1; - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public int idDropped(int par1, Random par2Random, int par3) { - return this.blockID; - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return false; - } - - TileEntityMiningLaser miningLaser = (TileEntityMiningLaser)par1World.getBlockTileEntity(par2, par3, par4); - - if (miningLaser != null && (par5EntityPlayer.getHeldItem() == null)) { - par5EntityPlayer.addChatMessage(miningLaser.getStatus()); - return true; - } - - return false; - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/BlockMonitor.java b/src/cr0s/WarpDrive/machines/BlockMonitor.java deleted file mode 100644 index 08a563e2..00000000 --- a/src/cr0s/WarpDrive/machines/BlockMonitor.java +++ /dev/null @@ -1,106 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.CamRegistryItem; -import cr0s.WarpDrive.ClientCameraUtils; -import cr0s.WarpDrive.EntityCamera; -import cr0s.WarpDrive.WarpDrive; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; -import net.minecraft.world.World; - -public class BlockMonitor extends BlockContainer { - private Icon iconFront; - private Icon iconBlock; - - public BlockMonitor(int id) { - super(id, Material.iron); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.Monitor"); - } - - @Override - @SideOnly(Side.CLIENT) - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - public Icon getIcon(int side, int parMetadata) { - int meta = parMetadata & 3; - return side == 2 ? (meta == 0 ? this.iconFront : this.iconBlock) : (side == 3 ? (meta == 2 ? this.iconFront : this.iconBlock) : (side == 4 ? (meta == 3 ? this.iconFront : this.iconBlock) : (side == 5 ? (meta == 1 ? this.iconFront : this.iconBlock) : this.iconBlock))); - } - - /** - * When this method is called, your block should register all the icons it needs with the given IconRegister. This - * is the only chance you get to register icons. - */ - @Override - public void registerIcons(IconRegister reg) { - this.iconFront = reg.registerIcon("warpdrive:monitorFront"); - this.iconBlock = reg.registerIcon("warpdrive:monitorSide"); - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entityliving, ItemStack itemstack) { - int dir = Math.round(entityliving.rotationYaw / 90.0F) & 3; - world.setBlockMetadataWithNotify(x, y, z, dir, 3); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { - // Monitor is only reacting client side - if (!FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return false; - } - - // Get camera frequency - TileEntity te = par1World.getBlockTileEntity(x, y, z); - - if (te != null && te instanceof TileEntityMonitor && (par5EntityPlayer.getHeldItem() == null)) { - int frequency = ((TileEntityMonitor)te).getFrequency(); - WarpDrive.instance.cams.removeDeadCams(par1World); - CamRegistryItem cam = WarpDrive.instance.cams.getCamByFrequency(par1World, frequency); - if (cam == null) { - par5EntityPlayer.addChatMessage(getLocalizedName() + " Frequency '" + frequency + "' is invalid or camera is too far!"); - return false; - } else { - par5EntityPlayer.addChatMessage(getLocalizedName() + " Frequency '" + frequency + "' is valid. Viewing camera at " + cam.position.x + ", " + cam.position.y + ", " + cam.position.z); - // Spawn camera entity - EntityCamera e = new EntityCamera(par1World, cam.position, par5EntityPlayer); - par1World.spawnEntityInWorld(e); - e.setPositionAndUpdate(cam.position.x + 0.5D, cam.position.y + 0.5D, cam.position.z + 0.5D); - //e.setPositionAndRotation(camPos.x, camPos.y, camPos.z, entityplayer.rotationYaw, entityplayer.rotationPitch); - WarpDrive.instance.overlayType = cam.type; - ClientCameraUtils.setupViewpoint(par5EntityPlayer, e, x, y, z, blockID, cam.position.x, cam.position.y, cam.position.z, par1World.getBlockId(cam.position.x, cam.position.y, cam.position.z)); - } - } - - return false; - } - - @Override - public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) { - } - - @Override - public TileEntity createNewTileEntity(World world) { - return new TileEntityMonitor(); - } -} diff --git a/src/cr0s/WarpDrive/machines/BlockParticleBooster.java b/src/cr0s/WarpDrive/machines/BlockParticleBooster.java deleted file mode 100644 index 0b9e7a2f..00000000 --- a/src/cr0s/WarpDrive/machines/BlockParticleBooster.java +++ /dev/null @@ -1,105 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; -import net.minecraft.world.World; - -public class BlockParticleBooster extends BlockContainer { - private Icon[] iconBuffer; - - public BlockParticleBooster(int id, int texture, Material material) { - super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.ParticleBooster"); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { - iconBuffer = new Icon[16]; - iconBuffer[ 0] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide0"); - iconBuffer[ 1] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide1"); - iconBuffer[ 2] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide2"); - iconBuffer[ 3] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide3"); - iconBuffer[ 4] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide4"); - iconBuffer[ 5] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide5"); - iconBuffer[ 6] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide6"); - iconBuffer[ 7] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide7"); - iconBuffer[ 8] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide8"); - iconBuffer[ 9] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide9"); - iconBuffer[10] = par1IconRegister.registerIcon("warpdrive:particleBoosterSide10"); - iconBuffer[11] = par1IconRegister.registerIcon("warpdrive:particleBoosterTopBottom"); - } - - @Override - public Icon getIcon(int side, int metadata) { - if (side == 0 || side == 1) { - return iconBuffer[11]; - } - - return iconBuffer[metadata]; - } - - @Override - public TileEntity createNewTileEntity(World var1) { - return new TileEntityParticleBooster(); - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random par1Random) { - return 1; - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public int idDropped(int par1, Random par2Random, int par3) { - return this.blockID; - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return false; - } - - WarpEnergyTE te = (WarpEnergyTE)par1World.getBlockTileEntity(par2, par3, par4); - if (te != null && (par5EntityPlayer.getHeldItem() == null)) { - par5EntityPlayer.addChatMessage(te.getStatus()); - return true; - } - - return false; - } - - @Override - public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) { - TileEntity te = par1World.getBlockTileEntity(par2, par3, par4); - if (te != null) { - te.invalidate(); - } - - super.breakBlock(par1World, par2, par3, par4, par5, par6); - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/BlockPowerLaser.java b/src/cr0s/WarpDrive/machines/BlockPowerLaser.java deleted file mode 100644 index 94f45d45..00000000 --- a/src/cr0s/WarpDrive/machines/BlockPowerLaser.java +++ /dev/null @@ -1,86 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; -import net.minecraft.world.World; - -public class BlockPowerLaser extends BlockContainer { - static Icon[] iconBuffer = new Icon[16]; - public BlockPowerLaser(int id) { - super(id, Material.iron); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.power.Laser"); - setResistance(100.0F); - } - - @Override - public TileEntity createNewTileEntity(World world) { - return new TileEntityPowerLaser(); - } - - @Override - public void onBlockAdded(World w,int x,int y, int z) { - TileEntity te = w.getBlockTileEntity(x, y, z); - if (te instanceof TileEntityPowerLaser) { - ((TileEntityPowerLaser)te).scanForReactor(); - } - } - - @Override - public void onNeighborBlockChange(World w, int x, int y, int z, int b) { - TileEntity te = w.getBlockTileEntity(x, y, z); - if (te instanceof TileEntityPowerLaser) { - ((TileEntityPowerLaser)te).updateNeighbours(); - } - } - - private static boolean isActive(int side, int meta) { - if (side == 3 && meta == 1) { - return true; - } - - if (side == 2 && meta == 2) { - return true; - } - - if (side == 4 && meta == 4) { - return true; - } - - if (side == 5 && meta == 3) { - return true; - } - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public Icon getIcon(int side, int meta) { - if (side == 0 || side == 1) { - return iconBuffer[0]; - } - - if(isActive(side,meta)) { - return iconBuffer[2]; - } - - return iconBuffer[1]; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { - iconBuffer[0] = par1IconRegister.registerIcon("warpdrive:powerLaserTopBottom"); - iconBuffer[1] = par1IconRegister.registerIcon("warpdrive:powerLaserSides"); - iconBuffer[2] = par1IconRegister.registerIcon("warpdrive:powerLaserActive"); - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/BlockPowerReactor.java b/src/cr0s/WarpDrive/machines/BlockPowerReactor.java deleted file mode 100644 index 3db9d5c4..00000000 --- a/src/cr0s/WarpDrive/machines/BlockPowerReactor.java +++ /dev/null @@ -1,95 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; -import net.minecraft.world.World; - -public class BlockPowerReactor extends BlockContainer { - Icon[] iconBuffer = new Icon[17]; - - public BlockPowerReactor(int id) { - super(id, Material.iron); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.power.Reactor"); - } - - @Override - public TileEntity createNewTileEntity(World world) { - return new TileEntityPowerReactor(); - } - - @Override - public void onBlockAdded(World w,int x, int y,int z) { - super.onBlockAdded(w, x, y, z); - - TileEntity te = w.getBlockTileEntity(x, y, z); - if(te instanceof TileEntityPowerReactor) { - ((TileEntityPowerReactor)te).updateNeighbours(); - } - } - - @Override - public void onNeighborBlockChange(World w,int x,int y,int z,int b) { - TileEntity te = w.getBlockTileEntity(x, y, z); - if(te instanceof TileEntityPowerReactor) { - ((TileEntityPowerReactor)te).updateNeighbours(); - } - } - - @Override - public void breakBlock(World w,int x,int y,int z, int oid,int om) { - super.breakBlock(w, x, y, z, oid, om); - - int[] xo = {-2, 2, 0, 0}; - int[] zo = { 0, 0,-2, 2}; - for(int i = 0; i < 4; i++) { - TileEntity te = w.getBlockTileEntity(x+xo[i], y, z+zo[i]); - if(te instanceof TileEntityPowerLaser) { - ((TileEntityPowerLaser)te).unlink(); - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public Icon getIcon(int side, int meta) { - if (side == 0 || side == 1) { - return iconBuffer[16]; - } - if (meta >= 0 && meta < 16) { - return iconBuffer[meta]; - } - return iconBuffer[0]; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { - iconBuffer[16] = par1IconRegister.registerIcon("warpdrive:reactorTB"); - iconBuffer[0] = par1IconRegister.registerIcon("warpdrive:reactorSide00"); - iconBuffer[1] = par1IconRegister.registerIcon("warpdrive:reactorSide01"); - iconBuffer[2] = par1IconRegister.registerIcon("warpdrive:reactorSide02"); - iconBuffer[3] = par1IconRegister.registerIcon("warpdrive:reactorSide03"); - iconBuffer[4] = par1IconRegister.registerIcon("warpdrive:reactorSide10"); - iconBuffer[5] = par1IconRegister.registerIcon("warpdrive:reactorSide11"); - iconBuffer[6] = par1IconRegister.registerIcon("warpdrive:reactorSide12"); - iconBuffer[7] = par1IconRegister.registerIcon("warpdrive:reactorSide13"); - iconBuffer[8] = par1IconRegister.registerIcon("warpdrive:reactorSide20"); - iconBuffer[9] = par1IconRegister.registerIcon("warpdrive:reactorSide21"); - iconBuffer[10] = par1IconRegister.registerIcon("warpdrive:reactorSide22"); - iconBuffer[11] = par1IconRegister.registerIcon("warpdrive:reactorSide23"); - iconBuffer[12] = par1IconRegister.registerIcon("warpdrive:reactorSide30"); - iconBuffer[13] = par1IconRegister.registerIcon("warpdrive:reactorSide31"); - iconBuffer[14] = par1IconRegister.registerIcon("warpdrive:reactorSide32"); - iconBuffer[15] = par1IconRegister.registerIcon("warpdrive:reactorSide33"); - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/BlockProtocol.java b/src/cr0s/WarpDrive/machines/BlockProtocol.java deleted file mode 100644 index fdbe6619..00000000 --- a/src/cr0s/WarpDrive/machines/BlockProtocol.java +++ /dev/null @@ -1,111 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; -import net.minecraft.world.World; - -public class BlockProtocol extends BlockContainer { - private Icon[] iconBuffer; - - private final int ICON_INACTIVE_SIDE = 0, ICON_BOTTOM = 1, ICON_TOP = 2, ICON_SIDE_ACTIVATED = 3; - - public BlockProtocol(int id, int texture, Material material) { - super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.WarpProtocol"); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { - iconBuffer = new Icon[10]; - // Solid textures - iconBuffer[ICON_INACTIVE_SIDE] = par1IconRegister.registerIcon("warpdrive:contSideInactive"); - iconBuffer[ICON_BOTTOM] = par1IconRegister.registerIcon("warpdrive:contBottom"); - iconBuffer[ICON_TOP] = par1IconRegister.registerIcon("warpdrive:contTop"); - // Animated textures - iconBuffer[ICON_SIDE_ACTIVATED ] = par1IconRegister.registerIcon("warpdrive:contSideActive0"); - iconBuffer[ICON_SIDE_ACTIVATED + 1] = par1IconRegister.registerIcon("warpdrive:contSideActive1"); - iconBuffer[ICON_SIDE_ACTIVATED + 2] = par1IconRegister.registerIcon("warpdrive:contSideActive2"); - iconBuffer[ICON_SIDE_ACTIVATED + 3] = par1IconRegister.registerIcon("warpdrive:contSideActive3"); - iconBuffer[ICON_SIDE_ACTIVATED + 4] = par1IconRegister.registerIcon("warpdrive:contSideActive4"); - iconBuffer[ICON_SIDE_ACTIVATED + 5] = par1IconRegister.registerIcon("warpdrive:contSideActive5"); - iconBuffer[ICON_SIDE_ACTIVATED + 6] = par1IconRegister.registerIcon("warpdrive:contSideActive6"); - } - - @Override - public Icon getIcon(int side, int metadata) { - if (side == 0) { - return iconBuffer[ICON_BOTTOM]; - } else if (side == 1) { - return iconBuffer[ICON_TOP]; - } - - if (metadata == 0) { // Inactive state - return iconBuffer[ICON_INACTIVE_SIDE]; - } else if (metadata > 0) { // Activated, in metadata stored mode number - if (ICON_SIDE_ACTIVATED + metadata - 1 < iconBuffer.length) { - return iconBuffer[ICON_SIDE_ACTIVATED + metadata]; - } else { - return null; - } - } - - return null; - } - - @Override - public TileEntity createNewTileEntity(World var1) { - return new TileEntityProtocol(); - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random par1Random) { - return 1; - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public int idDropped(int par1, Random par2Random, int par3) { - return this.blockID; - } - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return false; - } - - if (par5EntityPlayer.getHeldItem() == null) { - TileEntityProtocol controller = (TileEntityProtocol)par1World.getBlockTileEntity(par2, par3, par4); - if (controller != null) { - controller.attachPlayer(par5EntityPlayer); - par5EntityPlayer.addChatMessage(controller.getBlockType().getLocalizedName() + " Attached players: " + controller.getAttachedPlayersList()); - return true; - } - } - - return false; - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/BlockShipScanner.java b/src/cr0s/WarpDrive/machines/BlockShipScanner.java deleted file mode 100644 index d37d9737..00000000 --- a/src/cr0s/WarpDrive/machines/BlockShipScanner.java +++ /dev/null @@ -1,96 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; -import net.minecraft.world.World; - -public class BlockShipScanner extends BlockContainer { - private Icon[] iconBuffer; - - public BlockShipScanner(int id, int texture, Material material) { - super(id, material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.Scanner"); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { - iconBuffer = new Icon[3]; - iconBuffer[0] = par1IconRegister.registerIcon("warpdrive:shipScannerUp"); - iconBuffer[1] = par1IconRegister.registerIcon("warpdrive:shipScannerSide"); - iconBuffer[2] = par1IconRegister.registerIcon("warpdrive:contBottom"); - } - - @Override - public Icon getIcon(int side, int metadata) { - if (side == 1) { // UP - return iconBuffer[0]; - } else if (side == 0) { // DOWN - return iconBuffer[2]; - } - - return iconBuffer[1]; - } - - @Override - public TileEntity createNewTileEntity(World var1) { - return new TileEntityShipScanner(); - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random par1Random) { - return 1; - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public int idDropped(int par1, Random par2Random, int par3) { - return this.blockID; - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return false; - } - - WarpEnergyTE te = (WarpEnergyTE)par1World.getBlockTileEntity(par2, par3, par4); - if (te != null && (par5EntityPlayer.getHeldItem() == null)) { - par5EntityPlayer.addChatMessage(te.getStatus()); - return true; - } - - return false; - } - - @Override - public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) { - TileEntity te = par1World.getBlockTileEntity(par2, par3, par4); - if (te != null) { - te.invalidate(); - } - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/BlockTransporter.java b/src/cr0s/WarpDrive/machines/BlockTransporter.java deleted file mode 100644 index 285bda6d..00000000 --- a/src/cr0s/WarpDrive/machines/BlockTransporter.java +++ /dev/null @@ -1,67 +0,0 @@ -package cr0s.WarpDrive.machines; - -import java.util.Random; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; -import net.minecraft.world.World; - -public class BlockTransporter extends BlockContainer { - - private Icon[] iconBuffer; - - public BlockTransporter(int par1, Material par2Material) { - super(par1, par2Material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - setUnlocalizedName("warpdrive.machines.Transporter"); - } - - @Override - public TileEntity createNewTileEntity(World world) { - return new TileEntityTransporter(); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) { - iconBuffer = new Icon[3]; - // Solid textures - iconBuffer[0] = par1IconRegister.registerIcon("warpdrive:transporterBottom"); - iconBuffer[1] = par1IconRegister.registerIcon("warpdrive:transporterTop"); - iconBuffer[2] = par1IconRegister.registerIcon("warpdrive:transporterSide"); - } - - @Override - public Icon getIcon(int side, int metadata) { - if (side == 0 || side == 1) { - return iconBuffer[side]; - } - - return iconBuffer[2]; - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random par1Random) { - return 1; - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public int idDropped(int par1, Random par2Random, int par3) { - return this.blockID; - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/TileEntityAbstractLaser.java b/src/cr0s/WarpDrive/machines/TileEntityAbstractLaser.java deleted file mode 100644 index 87fd4d5b..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityAbstractLaser.java +++ /dev/null @@ -1,8 +0,0 @@ -package cr0s.WarpDrive.machines; - - - -public abstract class TileEntityAbstractLaser extends WarpChunkTE -{ - -} diff --git a/src/cr0s/WarpDrive/machines/TileEntityAbstractMiner.java b/src/cr0s/WarpDrive/machines/TileEntityAbstractMiner.java deleted file mode 100644 index 889cb036..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityAbstractMiner.java +++ /dev/null @@ -1,549 +0,0 @@ -package cr0s.WarpDrive.machines; - -import java.util.ArrayList; -import java.util.List; - -import appeng.api.IAEItemStack; -import appeng.api.Util; -import appeng.api.WorldCoord; -import appeng.api.events.GridTileLoadEvent; -import appeng.api.events.GridTileUnloadEvent; -import appeng.api.me.tiles.IGridMachine; -import appeng.api.me.tiles.ITileCable; -import appeng.api.me.util.IGridInterface; -import appeng.api.me.util.IMEInventoryHandler; -import net.minecraft.block.Block; -import net.minecraft.block.BlockFluid; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import cr0s.WarpDrive.Vector3; -import cr0s.WarpDrive.WarpDrive; -import cr0s.WarpDrive.WarpDriveConfig; - -public abstract class TileEntityAbstractMiner extends TileEntityAbstractLaser implements IGridMachine, ITileCable -{ - - //FOR STORAGE - private boolean silkTouch = false; - private int fortuneLevel = 0; - - private TileEntityParticleBooster booster = null; - private Vector3 minerVector; - - Boolean powerStatus = false; - private IGridInterface grid; - private boolean isMEReady = false; - - abstract boolean canSilkTouch(); - abstract int minFortune(); - abstract int maxFortune(); - abstract double laserBelow(); - - abstract float getColorR(); - abstract float getColorG(); - abstract float getColorB(); - - public TileEntityAbstractMiner() - { - super(); - fixMinerVector(); - } - - private void fixMinerVector() - { - if(minerVector == null) - minerVector = new Vector3(xCoord,yCoord-laserBelow(),zCoord); - minerVector.x = xCoord; - minerVector.y = yCoord - (laserBelow()); - minerVector.z = zCoord; - minerVector.translate(0.5); - } - - private List getItemStackFromBlock(int i, int j, int k, int blockID, int blockMeta) - { - Block block = Block.blocksList[blockID]; - if (block == null) - return null; - if (silkTouch(blockID)) - { - if (block.canSilkHarvest(worldObj, null, i, j, k, blockMeta)) - { - ArrayList t = new ArrayList(); - t.add(new ItemStack(blockID, 1, blockMeta)); - return t; - } - } - return block.getBlockDropped(worldObj, i, j, k, blockMeta, fortuneLevel); - } - - protected boolean isOnEarth() - { - return worldObj.provider.dimensionId == 0; - } - - private IInventory findChest() { - TileEntity result = null; - - for(int i = 0; i < 6; i++) { - Vector3 sideOffset = adjacentSideOffsets[i]; - result = worldObj.getBlockTileEntity(xCoord + sideOffset.intX(), yCoord + sideOffset.intY(), zCoord + sideOffset.intZ()); - if (result != null && !(result instanceof TileEntityAbstractMiner) && (result instanceof IInventory)) { - return (IInventory) result; - } - } - return null; - } - - //GETTERSETTERS - - protected int fortune() - { - return fortuneLevel; - } - - protected boolean silkTouch() - { - return silkTouch; - } - - protected boolean silkTouch(int blockID) - { - return silkTouch(); - } - - protected boolean silkTouch(boolean b) - { - silkTouch = canSilkTouch() && b; - return silkTouch(); - } - - protected boolean silkTouch(Object o) - { - return silkTouch(toBool(o)); - } - - protected int fortune(int f) - { - try - { - fortuneLevel = clamp(f,minFortune(),maxFortune()); - } - catch(NumberFormatException e) - { - fortuneLevel = minFortune(); - } - return fortune(); - } - - protected TileEntityParticleBooster booster() - { - if(booster == null) - findFirstBooster(); - return booster; - } - - protected int energy() { - TileEntityParticleBooster te = booster(); - if (te != null) { - return te.getEnergyStored(); - } - return 0; - } - - //DATA RET - - protected int calculateLayerCost() - { - return isOnEarth() ? WarpDriveConfig.ML_EU_PER_LAYER_EARTH : WarpDriveConfig.ML_EU_PER_LAYER_SPACE; - } - - protected int calculateBlockCost() - { - return calculateBlockCost(0); - } - - protected int calculateBlockCost(int blockID) - { - int enPerBlock = isOnEarth() ? WarpDriveConfig.ML_EU_PER_BLOCK_EARTH : WarpDriveConfig.ML_EU_PER_BLOCK_SPACE; - if(silkTouch(blockID)) - return (int) Math.round(enPerBlock * WarpDriveConfig.ML_EU_MUL_SILKTOUCH); - return (int) Math.round(enPerBlock * (Math.pow(WarpDriveConfig.ML_EU_MUL_FORTUNE, fortune()))); - } - - protected boolean isRoomForHarvest() - { - if(isMEReady && grid != null) - return true; - - IInventory inv = findChest(); - if(inv != null) - { - int size = inv.getSizeInventory(); - for(int i=0;i stacks = getItemStackFromBlock(valuable.intX(), valuable.intY(), valuable.intZ(), blockID, blockMeta); - if (stacks != null) - { - for (ItemStack stack : stacks) - { - didPlace = didPlace && dumpToInv(stack) == stack.stackSize; - } - } - mineBlock(valuable,blockID,blockMeta); - return didPlace; - } - else if (blockID == Block.waterMoving.blockID || blockID == Block.waterStill.blockID) - // Evaporate water - worldObj.playSoundEffect(valuable.intX() + 0.5D, valuable.intY() + 0.5D, valuable.intZ() + 0.5D, "random.fizz", 0.5F, 2.6F + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.8F); - worldObj.setBlockToAir(valuable.intX(), valuable.intY(), valuable.intZ()); - return true; - } - - protected int dumpToInv(ItemStack item) - { - if (grid != null) - return putInGrid(item); - else - return putInChest(findChest(), item); - } - - private int putInGrid(ItemStack itemStackSource) - { - int transferred = 0; - if(isMEReady && grid != null) - { - IMEInventoryHandler cellArray = grid.getCellArray(); - if (cellArray != null) - { - IAEItemStack ret = cellArray.addItems(Util.createItemStack(itemStackSource)); - if (ret != null) - transferred = (int) ret.getStackSize(); - } - } - return transferred; - } - - private static int putInChest(IInventory inventory, ItemStack itemStackSource) - { - if (inventory == null || itemStackSource == null) - { - return 0; - } - - int transferred = 0; - - for (int i = 0; i < inventory.getSizeInventory(); i++) - { - if (!inventory.isItemValidForSlot(i, itemStackSource)) - { - continue; - } - - ItemStack itemStack = inventory.getStackInSlot(i); - - if (itemStack == null || !itemStack.isItemEqual(itemStackSource)) - { - continue; - } - - int transfer = Math.min(itemStackSource.stackSize - transferred, itemStack.getMaxStackSize() - itemStack.stackSize); - itemStack.stackSize += transfer; - transferred += transfer; - - if (transferred == itemStackSource.stackSize) - { - return transferred; - } - } - - for (int i = 0; i < inventory.getSizeInventory(); i++) - { - if (!inventory.isItemValidForSlot(i, itemStackSource)) - { - continue; - } - - ItemStack itemStack = inventory.getStackInSlot(i); - - if (itemStack != null) - { - continue; - } - - int transfer = Math.min(itemStackSource.stackSize - transferred, itemStackSource.getMaxStackSize()); - ItemStack dest = copyWithSize(itemStackSource, transfer); - inventory.setInventorySlotContents(i, dest); - transferred += transfer; - - if (transferred == itemStackSource.stackSize) - { - return transferred; - } - } - - return transferred; - } - - protected boolean consumeEnergyFromBooster(int requiredEnergy, boolean simulate) - { - TileEntityParticleBooster te = booster(); - if (te != null) { - return te.consumeEnergy(requiredEnergy, simulate); - } - return false; - } - - private TileEntityParticleBooster findFirstBooster() - { - TileEntity result; - int[] xPos = {1,-1,0,0,0,0}; - int[] yPos = {0,0,-1,1,0,0}; - int[] zPos = {0,0,0,0,-1,1}; - - for(int i=0;i<6;i++) - { - result = worldObj.getBlockTileEntity(xCoord + xPos[i], yCoord + yPos[i], zCoord + zPos[i]); - - if (result != null && result instanceof TileEntityParticleBooster) - { - booster = (TileEntityParticleBooster) result; - return (TileEntityParticleBooster) result; - } - } - booster = null; - return null; - } - - protected void defineMiningArea(int xSize,int zSize) - { - int xmax, zmax, x1, x2, z1, z2; - int xmin, zmin; - x1 = xCoord + xSize / 2; - x2 = xCoord - xSize / 2; - - if (x1 < x2) - { - xmin = x1; - xmax = x2; - } - else - { - xmin = x2; - xmax = x1; - } - - z1 = zCoord + zSize / 2; - z2 = zCoord - zSize / 2; - - if (z1 < z2) - { - zmin = z1; - zmax = z2; - } - else - { - zmin = z2; - zmax = z1; - } - - defineMiningArea(xmin,zmin,xmax,zmax); - } - - protected void defineMiningArea(int minX, int minZ, int maxX, int maxZ) - { - if(worldObj == null) - return; - ChunkCoordIntPair a = worldObj.getChunkFromBlockCoords(minX, minZ).getChunkCoordIntPair(); - ChunkCoordIntPair b = worldObj.getChunkFromBlockCoords(maxX, maxZ).getChunkCoordIntPair(); - if(minChunk != null && a.equals(minChunk)) - if(maxChunk != null && b.equals(maxChunk)) - return; - if(minChunk != null && b.equals(minChunk)) - if(maxChunk != null && a.equals(maxChunk)) - return; - minChunk = a; - maxChunk = b; - refreshLoading(true); - } - - private static ItemStack copyWithSize(ItemStack itemStack, int newSize) - { - ItemStack ret = itemStack.copy(); - ret.stackSize = newSize; - return ret; - } - - //NBT DATA - @Override - public void readFromNBT(NBTTagCompound tag) - { - super.readFromNBT(tag); - silkTouch = tag.getBoolean("silkTouch"); - fortuneLevel = tag.getInteger("fortuneLevel"); - - minerVector.x = xCoord; - minerVector.y = yCoord - (laserBelow()); - minerVector.z = zCoord; - minerVector = minerVector.translate(0.5); - } - - @Override - public void writeToNBT(NBTTagCompound tag) - { - super.writeToNBT(tag); - tag.setBoolean("silkTouch", silkTouch); - tag.setInteger("fortuneLevel", fortuneLevel); - } - - //AE INTERFACE - @Override - public void setNetworkReady( boolean isReady ) - { - isMEReady = isReady; - } - - @Override - public boolean isMachineActive() - { - return isMEReady; - } - - //OVERRIDES - @Override - public void updateEntity() - { - if(shouldChunkLoad() != areChunksLoaded) - refreshLoading(); - - } - - @Override - public float getPowerDrainPerTick() - { - return 1; - } - - @Override - public void validate() - { - super.validate(); - MinecraftForge.EVENT_BUS.post(new GridTileLoadEvent(this, worldObj, getLocation())); - } - - @Override - public void invalidate() - { - super.invalidate(); - MinecraftForge.EVENT_BUS.post(new GridTileUnloadEvent(this, worldObj, getLocation())); - } - - @Override - public WorldCoord getLocation() - { - return new WorldCoord(xCoord, yCoord, zCoord); - } - - @Override - public boolean isValid() - { - return true; - } - - @Override - public void setPowerStatus(boolean hasPower) - { - powerStatus = hasPower; - } - - @Override - public boolean isPowered() - { - return powerStatus; - } - - @Override - public IGridInterface getGrid() - { - return grid; - } - - @Override - public void setGrid(IGridInterface gi) - { - grid = gi; - } - - @Override - public boolean coveredConnections() - { - return true; - } - - @Override - public World getWorld() - { - return worldObj; - } - -} diff --git a/src/cr0s/WarpDrive/machines/TileEntityAirGenerator.java b/src/cr0s/WarpDrive/machines/TileEntityAirGenerator.java deleted file mode 100644 index 9bc76317..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityAirGenerator.java +++ /dev/null @@ -1,98 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import cr0s.WarpDrive.WarpDriveConfig; -import net.minecraft.nbt.NBTTagCompound; - -public class TileEntityAirGenerator extends WarpEnergyTE { - private final int EU_PER_NEWAIRBLOCK = 12; - private final int EU_PER_EXISTINGAIRBLOCK = 4; // 1 solar = 1 EU/t - private final int MAX_ENERGY_VALUE = 8 * EU_PER_NEWAIRBLOCK; - - private int cooldownTicks = 0; - private final int AIR_GENERATION_TICKS = 40; - private final int START_CONCENTRATION_VALUE = 15; - - @Override - public void updateEntity() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return; - } - super.updateEntity(); - - // Air generator works only in spaces - if (this.tileEntityInvalid || (worldObj.provider.dimensionId != WarpDriveConfig.G_SPACE_DIMENSION_ID && worldObj.provider.dimensionId != WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID)) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2); // set disabled texture - return; - } - - cooldownTicks++; - if (cooldownTicks > AIR_GENERATION_TICKS) { - if (consumeEnergy(EU_PER_NEWAIRBLOCK, true)) { - if (this.blockMetadata != 1) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 2); // set enabled texture - } - } else { - if (this.blockMetadata != 0) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2); // set disabled texture - } - } - releaseAir( 1, 0, 0); - releaseAir(-1, 0, 0); - releaseAir( 0, 1, 0); - releaseAir( 0, -1, 0); - releaseAir( 0, 0, 1); - releaseAir( 0, 0, -1); - - cooldownTicks = 0; - } - } - - private void releaseAir(int xOffset, int yOffset, int zOffset) { - int blockId = worldObj.getBlockId(xCoord + xOffset, yCoord + yOffset, zCoord + zOffset); - if (WarpDriveConfig.isAirBlock(worldObj, blockId, xCoord + xOffset, yCoord + yOffset, zCoord + zOffset)) {// can be air - int energy_cost = (blockId != WarpDriveConfig.airID) ? EU_PER_NEWAIRBLOCK : EU_PER_EXISTINGAIRBLOCK; - if (consumeEnergy(energy_cost, true)) {// enough energy - if (worldObj.setBlock(xCoord + xOffset, yCoord + yOffset, zCoord + zOffset, WarpDriveConfig.airID, START_CONCENTRATION_VALUE, 2)) {// needs to renew air or was not maxed out - consumeEnergy(EU_PER_NEWAIRBLOCK, false); - } else { - consumeEnergy(EU_PER_EXISTINGAIRBLOCK, false); - } - } - else - {// low energy => remove air block - if (blockId == WarpDriveConfig.airID){ - int metadata = worldObj.getBlockMetadata(xCoord + xOffset, yCoord + yOffset, zCoord + zOffset); - if (metadata > 4) { - worldObj.setBlockMetadataWithNotify(xCoord + xOffset, yCoord + yOffset, zCoord + zOffset, metadata - 4, 2); - } else if (metadata > 1) { - worldObj.setBlockMetadataWithNotify(xCoord + xOffset, yCoord + yOffset, zCoord + zOffset, 1, 2); - } else { - // worldObj.setBlock(xCoord + xOffset, yCoord + yOffset, zCoord + zOffset, 0, 0, 2); - } - } - } - } - } - - @Override - public void readFromNBT(NBTTagCompound tag) { - super.readFromNBT(tag); - } - - @Override - public void writeToNBT(NBTTagCompound tag) { - super.writeToNBT(tag); - } - - @Override - public int getMaxEnergyStored() { - return MAX_ENERGY_VALUE; - } - - // IEnergySink methods implementation - @Override - public int getMaxSafeInput() { - return Integer.MAX_VALUE; - } -} diff --git a/src/cr0s/WarpDrive/machines/TileEntityCamera.java b/src/cr0s/WarpDrive/machines/TileEntityCamera.java deleted file mode 100644 index 17572ce3..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityCamera.java +++ /dev/null @@ -1,136 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import cr0s.WarpDrive.*; -import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.api.lua.ILuaContext; -import dan200.computercraft.api.peripheral.IPeripheral; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.packet.Packet250CustomPayload; -import net.minecraft.server.MinecraftServer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.ChunkPosition; - -public class TileEntityCamera extends TileEntity implements IPeripheral { - private int dx, dz, dy; - private float yaw, pitch; // laser direction - - private int frequency = -1; // beam frequency - - private String[] methodsArray = { - "freq" - }; - - private final int REGISTRY_UPDATE_INTERVAL_SEC = 10; - private int ticks = 0; - - private int packetSendTicks = 20; - - @Override - public void updateEntity() { - // Update frequency on clients - if (FMLCommonHandler.instance().getEffectiveSide().isServer()) { - packetSendTicks--; - if (packetSendTicks == 0) { - packetSendTicks = 20 * 5; - sendFreqPacket(); - } - return; - } - - ticks++; - if (ticks > 20 * REGISTRY_UPDATE_INTERVAL_SEC) { - ticks = 0; - WarpDrive.instance.cams.updateInRegistry(worldObj, new ChunkPosition(xCoord, yCoord, zCoord), frequency, 0); - } - } - - public int getFrequency() { - return frequency; - } - - public void setFrequency(int parFrequency) { - if (frequency != parFrequency) { - frequency = parFrequency; - WarpDrive.debugPrint("" + this + " Frequency set to " + frequency); - } - WarpDrive.instance.cams.updateInRegistry(worldObj, new ChunkPosition(xCoord, yCoord, zCoord), frequency, 0); - } - - @Override - public void onChunkUnload() { - WarpDrive.instance.cams.removeFromRegistry(worldObj, new ChunkPosition(xCoord, yCoord, zCoord)); - super.onChunkUnload(); - } - - @Override - public void readFromNBT(NBTTagCompound tag) { - super.readFromNBT(tag); - frequency = tag.getInteger("frequency"); - } - - @Override - public void writeToNBT(NBTTagCompound tag) { - super.writeToNBT(tag); - tag.setInteger("frequency", frequency); - } - - public void sendFreqPacket() { - if (FMLCommonHandler.instance().getEffectiveSide().isServer()) { - ByteArrayOutputStream bos = new ByteArrayOutputStream(8); - DataOutputStream outputStream = new DataOutputStream(bos); - - try { - outputStream.writeInt(xCoord); - outputStream.writeInt(yCoord); - outputStream.writeInt(zCoord); - outputStream.writeInt(frequency); - } catch (Exception e) { - e.printStackTrace(); - } - - Packet250CustomPayload packet = new Packet250CustomPayload(); - packet.channel = "WarpDriveFreq"; - packet.data = bos.toByteArray(); - packet.length = bos.size(); - MinecraftServer.getServer().getConfigurationManager().sendToAllNear(xCoord, yCoord, zCoord, 100, worldObj.provider.dimensionId, packet); -// WarpDrive.debugPrint("" + this + " Packet '" + packet.channel + "' sent (" + xCoord + ", " + yCoord + ", " + zCoord + ") '" + frequency + "'"); - } - } - - // IPeripheral methods implementation - @Override - public String getType() { - return "camera"; - } - - @Override - public String[] getMethodNames() { - return methodsArray; - } - - @Override - public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception { - if (arguments.length == 1) { - setFrequency(((Double)arguments[0]).intValue()); - } - return new Integer[] { frequency }; - } - - @Override - public void attach(IComputerAccess computer) { - } - - @Override - public void detach(IComputerAccess computer) { - } - - @Override - public boolean equals(IPeripheral other) { - return other == this; - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/TileEntityCloakingDeviceCore.java b/src/cr0s/WarpDrive/machines/TileEntityCloakingDeviceCore.java deleted file mode 100644 index 19a0f139..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityCloakingDeviceCore.java +++ /dev/null @@ -1,466 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.relauncher.Side; -import cr0s.WarpDrive.CloakedArea; -import dan200.computercraft.api.ComputerCraftAPI; -import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.api.lua.ILuaContext; -import dan200.computercraft.api.peripheral.IPeripheral; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.util.List; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.packet.Packet250CustomPayload; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.entity.player.EntityPlayerMP; -import cr0s.WarpDrive.*; - -public class TileEntityCloakingDeviceCore extends WarpEnergyTE implements IPeripheral { - private final int MAX_ENERGY_VALUE = 500000000; // 500kk EU - - private String[] methodsArray = { - "setFieldTier", // 0 setFieldTier(1 or 2) - "isAssemblyValid", // 1 - returns true or false - "getEnergyLevel", // 2 - "enableCloakingField", // 3 enables field if assembled right - "disableCloakingField", // 4 disables cloaking field - "isEnabled" // 5 return true if currently enabled - }; - - public boolean isEnabled = false; - public byte tier = 1; // cloaking field tier, 1 or 2 - - // Spatial cloaking field parameters - public int front, back, up, down, left, right; - public int minX = 0, minY = 0, minZ = 0, maxX = 0, maxY = 0, maxZ = 0; - - public boolean isValid = false; - public boolean isCloaking = false; - public int volume = 0; - private int updateTicks = 0; - private int laserDrawingTicks = 0; - - private boolean soundPlayed = false; - private int soundTicks = 0; - - @Override - public void updateEntity() { - super.updateEntity(); - if (!FMLCommonHandler.instance().getEffectiveSide().isServer()) { - return; - } - - // Reset sound timer - soundTicks++; - if (soundTicks >= 40) { - soundTicks = 0; - soundPlayed = false; - } - - updateTicks--; - if (updateTicks <= 0) { - //System.out.println("" + this + " Updating cloaking state..."); - updateTicks = ((tier == 1) ? 20 : (tier == 2) ? 10 : 20) * WarpDriveConfig.CD_FIELD_REFRESH_INTERVAL_SECONDS; // resetting timer - - isValid = validateAssembly(); - isCloaking = WarpDrive.instance.cloaks.isAreaExists(worldObj, xCoord, yCoord, zCoord); - if (!isEnabled) {// disabled - if (isCloaking) {// disabled, cloaking => stop cloaking - WarpDrive.debugPrint("" + this + " Disabled, cloak field going down..."); - disableCloakingField(); - } else {// disabled, no cloaking - // IDLE - } - } else {// isEnabled - boolean hasEnoughPower = countBlocksAndConsumeEnergy(); - if (!isCloaking) {// enabled, not cloaking - if (hasEnoughPower && isValid) {// enabled, can cloak and able to - setCoilsState(true); - - // Register cloak - WarpDrive.instance.cloaks.addCloakedAreaWorld(worldObj, minX, minY, minZ, maxX, maxY, maxZ, xCoord, yCoord, zCoord, tier); - if (!soundPlayed) { - soundPlayed = true; - worldObj.playSoundEffect(xCoord + 0.5f, yCoord + 0.5f, zCoord + 0.5f, "warpdrive:cloak", 4F, 1F); - } - - // Refresh the field - CloakedArea area = WarpDrive.instance.cloaks.getCloakedArea(worldObj, xCoord, yCoord, zCoord); - if (area != null) { - area.sendCloakPacketToPlayersEx(false); // recloak field - } - } else {// enabled, not cloaking but not able to - // IDLE - } - } else {// enabled & cloaked - if (!isValid) {// enabled, cloaking but invalid - WarpDrive.debugPrint("" + this + " Coil(s) lost, cloak field is collapsing..."); - consumeAllEnergy(); - disableCloakingField(); - } else {// enabled, cloaking and valid - if (hasEnoughPower) {// enabled, cloaking and able to - // IDLE - // Refresh the field !!! LemTest 2014-07-12 - CloakedArea area = WarpDrive.instance.cloaks.getCloakedArea(worldObj, xCoord, yCoord, zCoord); - if (area != null) { - area.sendCloakPacketToPlayersEx(false); // recloak field - } - } else {// loosing power - WarpDrive.debugPrint("" + this + " Low power, cloak field is collapsing..."); - disableCloakingField(); - } - } - } - } - } - - if (laserDrawingTicks++ > 100) { - laserDrawingTicks = 0; - - if (isEnabled && isValid) { - drawLasers(); - } - } - } - - public void setCoilsState(boolean enabled) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, (enabled) ? 1 : 0, 2); - - // Directions to check (all six directions: left, right, up, down, front, back) - byte[] dx = { 1, -1, 0, 0, 0, 0 }; - byte[] dy = { 0, 0, -1, 1, 0, 0 }; - byte[] dz = { 0, 0, 0, 0, -1, 1 }; - - for (int i = 0; i < 6; i++) { - searchCoilInDirectionAndSetState(dx[i], dy[i], dz[i], enabled); - } - } - - public void searchCoilInDirectionAndSetState(byte dx, byte dy, byte dz, boolean enabled) { - int coilCount = 0; - for (int i = 0; i < WarpDriveConfig.CD_MAX_CLOAKING_FIELD_SIDE; i++) { - if (worldObj.getBlockId(xCoord + i * dx, yCoord + i * dy, zCoord + i * dz) == WarpDriveConfig.cloakCoilID) { - coilCount++; - if (coilCount > 2) { - return; - } - worldObj.setBlockMetadataWithNotify(xCoord + i * dx, yCoord + i * dy, zCoord + i * dz, (enabled) ? 1 : 0, 2); - } - } - } - - public void searchCoilInDirectionAndDrawLaser(byte dx, byte dy, byte dz) { - final int START_LENGTH = 2; - float r = 0.0f, g = 1.0f, b = 0; - if (tier == 1) { - r = 0.0f; - g = 1.0f; - } else if (tier == 2) { - r = 1.0f; - g = 0.0f; - } - - for (int i = START_LENGTH + 1; i < WarpDriveConfig.CD_MAX_CLOAKING_FIELD_SIDE; i++) { - if (worldObj.getBlockId(xCoord + i * dx, yCoord + i * dy, zCoord + i * dz) == WarpDriveConfig.cloakCoilID) { - sendLaserPacket(new Vector3(this).add(0.5), new Vector3(xCoord + i * dx, yCoord + i * dy, zCoord + i * dz).add(0.5), r, g, b, 110, 0, 100); - } - } - } - - public void drawLasers() { - final int START_LENGTH = 2; - float r = 0.0f, g = 1.0f, b = 0; - if (this.tier == 1) { - r = 0.0f; g = 1.0f; - } else if (this.tier == 2) { - r = 1.0f; g = 0.0f; - } - - // Directions to check (all six directions: left, right, up, down, front, back) - byte[] dx = { 1, -1, 0, 0, 0, 0 }; - byte[] dy = { 0, 0, -1, 1, 0, 0 }; - byte[] dz = { 0, 0, 0, 0, -1, 1 }; - - for (int k = 0; k < 6; k++) { - searchCoilInDirectionAndDrawLaser(dx[k], dy[k], dz[k]); - } - - for (int i = 0; i < 6; i++) { - for (int j = 0; j < 6; j++) { - switch (worldObj.rand.nextInt(6)) { - case 0: - r = 1.0f; - g = b = 0; - break; - case 1: - r = b = 0; - g = 1.0f; - break; - case 2: - r = g = 0; - b = 1.0f; - break; - case 3: - r = b = 0.5f; - g = 0; - break; - case 4: - r = g = 1.0f; - b = 0; - break; - case 5: - r = 1.0f; - b = 0.5f; - g = 0f; - } - - sendLaserPacket(new Vector3(xCoord + START_LENGTH * dx[i], yCoord + START_LENGTH * dy[i], zCoord + START_LENGTH * dz[i]).add(0.5), new Vector3(xCoord + START_LENGTH * dx[j], yCoord + START_LENGTH * dy[j], zCoord + START_LENGTH * dz[j]).add(0.5), r, g, b, 110, 0, 100); - } - } - } - - public void disableCloakingField() { - setCoilsState(false); - if (WarpDrive.instance.cloaks.isAreaExists(worldObj, xCoord, yCoord, zCoord)) { - WarpDrive.instance.cloaks.removeCloakedArea(worldObj, xCoord, yCoord, zCoord); - - if (!soundPlayed) { - soundPlayed = true; - worldObj.playSoundEffect(xCoord + 0.5f, yCoord + 0.5f, zCoord + 0.5f, "warpdrive:decloak", 4F, 1F); - } - } - } - public boolean countBlocksAndConsumeEnergy() { - int x, y, z, energyToConsume = 0; - volume = 0; - if (tier == 1) {// tier1 = gaz and air blocks don't count - for (y = minY; y <= maxY; y++) { - for (x = minX; x <= maxX; x++) { - for(z = minZ; z <= maxZ; z++) { - if (!worldObj.isAirBlock(x, y, z)) { - volume++; - } - } - } - } - energyToConsume = volume * WarpDriveConfig.CD_ENERGY_PER_BLOCK_TIER1; - } else {// tier2 = everything counts - for (y = minY; y <= maxY; y++) { - for (x = minX; x <= maxX; x++) { - for(z = minZ; z <= maxZ; z++) { - if (worldObj.getBlockId(x, y, z) != 0) { - volume++; - } - } - } - } - energyToConsume = volume * WarpDriveConfig.CD_ENERGY_PER_BLOCK_TIER2; - } - - //System.out.println("" + this + " Consuming " + energyToConsume + " eU for " + blocksCount + " blocks"); - return consumeEnergy(energyToConsume, false); - } - - public void sendLaserPacket(Vector3 source, Vector3 dest, float r, float g, float b, int age, int energy, int radius) { - Side side = FMLCommonHandler.instance().getEffectiveSide(); - - if (side == Side.SERVER) { - ByteArrayOutputStream bos = new ByteArrayOutputStream(8); - DataOutputStream outputStream = new DataOutputStream(bos); - - try { - // Write source vector - outputStream.writeDouble(source.x); - outputStream.writeDouble(source.y); - outputStream.writeDouble(source.z); - // Write target vector - outputStream.writeDouble(dest.x); - outputStream.writeDouble(dest.y); - outputStream.writeDouble(dest.z); - // Write r, g, b of laser - outputStream.writeFloat(r); - outputStream.writeFloat(g); - outputStream.writeFloat(b); - // Write age - outputStream.writeByte(age); - // Write energy value - outputStream.writeInt(energy); - } catch (Exception ex) { - ex.printStackTrace(); - } - - Packet250CustomPayload packet = new Packet250CustomPayload(); - packet.channel = "WarpDriveBeam"; - packet.data = bos.toByteArray(); - packet.length = bos.size(); - - // Send packet to all players within cloaked area - List list = worldObj.getEntitiesWithinAABB(EntityPlayerMP.class, AxisAlignedBB.getBoundingBox(minX, minY, minZ, maxX, maxY, maxZ)); - for (Entity e : list) { - if (e != null && e instanceof EntityPlayer) { - ((EntityPlayerMP)e).playerNetServerHandler.sendPacketToPlayer(packet); - } - } - } - } - - @Override - public void readFromNBT(NBTTagCompound tag) { - super.readFromNBT(tag); - this.tier = tag.getByte("tier"); -// this.frequency = tag.getInteger("frequency"); - this.isEnabled = tag.getBoolean("enabled"); - } - - @Override - public void writeToNBT(NBTTagCompound tag) { - super.writeToNBT(tag); - tag.setByte("tier", tier); -// tag.setInteger("frequency", frequency); - tag.setBoolean("enabled", isEnabled); - } - - public int searchCoilInDirection(byte dx, byte dy, byte dz) { - for (int i = 3; i < WarpDriveConfig.CD_MAX_CLOAKING_FIELD_SIDE; i++) { - if (worldObj.getBlockId(xCoord + i * dx, yCoord + i * dy, zCoord + i * dz) == WarpDriveConfig.cloakCoilID) { - return i; - } - } - - return 0; - } - public boolean validateAssembly() { - final int START_LENGTH = 2; // Step length from core block to main coils - - // Directions to check (all six directions: left, right, up, down, front, back) - byte[] dx = { 1, -1, 0, 0, 0, 0 }; - byte[] dy = { 0, 0, -1, 1, 0, 0 }; - byte[] dz = { 0, 0, 0, 0, -1, 1 }; - - for (int i = 0; i < 6; i++) { - if (worldObj.getBlockId(xCoord + START_LENGTH * dx[i], yCoord + START_LENGTH * dy[i], zCoord + START_LENGTH * dz[i]) != WarpDriveConfig.cloakCoilID) { - return false; - } - } - - // Check cloaking field parameters defining coils - this.left = searchCoilInDirection((byte)1, (byte)0, (byte)0) + WarpDriveConfig.CD_COIL_CAPTURE_BLOCKS; - if (this.left == WarpDriveConfig.CD_COIL_CAPTURE_BLOCKS) return false; - this.right = searchCoilInDirection((byte)-1, (byte)0, (byte)0) + WarpDriveConfig.CD_COIL_CAPTURE_BLOCKS; - if (this.right == WarpDriveConfig.CD_COIL_CAPTURE_BLOCKS) return false; - - this.up = searchCoilInDirection((byte)0, (byte)1, (byte)0) + WarpDriveConfig.CD_COIL_CAPTURE_BLOCKS; - if (this.up == WarpDriveConfig.CD_COIL_CAPTURE_BLOCKS) return false; - this.down = searchCoilInDirection((byte)0, (byte)-1, (byte)0) + WarpDriveConfig.CD_COIL_CAPTURE_BLOCKS; - if (this.down == WarpDriveConfig.CD_COIL_CAPTURE_BLOCKS) return false; - - this.front = searchCoilInDirection((byte)0, (byte)0, (byte)1) + WarpDriveConfig.CD_COIL_CAPTURE_BLOCKS; - if (this.front == WarpDriveConfig.CD_COIL_CAPTURE_BLOCKS) return false; - this.back = searchCoilInDirection((byte)0, (byte)0, (byte)-1) + WarpDriveConfig.CD_COIL_CAPTURE_BLOCKS; - if (this.back == WarpDriveConfig.CD_COIL_CAPTURE_BLOCKS) return false; - - int x1 = 0, x2 = 0, z1 = 0, z2 = 0; - - - z1 = zCoord - this.back; - z2 = zCoord + this.front; - x1 = xCoord - this.right; - x2 = xCoord + this.left; - - if (x1 < x2) { - this.minX = x1; this.maxX = x2; - } else { - this.minX = x2; this.maxX = x1; - } - - if (z1 < z2) { - this.minZ = z1; this.maxZ = z2; - } else { - this.minZ = z2; this.maxZ = z1; - } - - this.minY = yCoord - this.down; - this.maxY = yCoord + this.up; - - return true; - } - - // CC - // IPeripheral methods implementation - @Override - public String getType() { - return "cloakingdevicecore"; - } - - @Override - public String[] getMethodNames() { - return methodsArray; - } - - @Override - public Object[] callMethod(IComputerAccess computer, ILuaContext context, - int method, Object[] arguments) throws Exception { - switch (method) { - case 0: // setFieldTier(1 or 2) - if (arguments.length == 1) { - if (((Double)arguments[0]).byteValue() != 1 && ((Double)arguments[0]).byteValue() != 2) { - this.tier = 1; - } else { - this.tier = ((Double)arguments[0]).byteValue(); - } - } - break; - - case 1: // isAssemblyValid() - return new Object[] { (boolean)validateAssembly() }; - - case 2: // getEnergyLevel() - return new Object[] { getEnergyStored() }; - - case 3: // enableCloakingField() - this.isEnabled = true; - break; - - case 4: // disableCloakingField() - this.isEnabled = false; - break; - - case 5: // isEnabled() - return new Object[] { this.isEnabled }; - } - - return null; - } - - @Override - public void attach(IComputerAccess computer) { - computer.mount("/cloakingdevicecore", ComputerCraftAPI.createResourceMount(WarpDrive.class, "warpdrive", "lua/cloakingdevicecore")); - computer.mount("/uncloak", ComputerCraftAPI.createResourceMount(WarpDrive.class, "warpdrive", "lua/cloakingdevicecore/uncloak")); - computer.mount("/cloak1", ComputerCraftAPI.createResourceMount(WarpDrive.class, "warpdrive", "lua/cloakingdevicecore/cloak1")); - computer.mount("/cloak2", ComputerCraftAPI.createResourceMount(WarpDrive.class, "warpdrive", "lua/cloakingdevicecore/cloak2")); - } - - @Override - public void detach(IComputerAccess computer) { - } - - @Override - public int getMaxEnergyStored() { - return MAX_ENERGY_VALUE; - } - - @Override - public int getMaxSafeInput() { - return Integer.MAX_VALUE; - } - - @Override - public boolean equals(IPeripheral other) { - return other == this; - } -} diff --git a/src/cr0s/WarpDrive/machines/TileEntityLaserReactorMonitor.java b/src/cr0s/WarpDrive/machines/TileEntityLaserReactorMonitor.java deleted file mode 100644 index 79377376..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityLaserReactorMonitor.java +++ /dev/null @@ -1,140 +0,0 @@ -package cr0s.WarpDrive.machines; - -import ic2.api.reactor.IReactor; -import ic2.api.reactor.IReactorChamber; - -import java.util.HashSet; -import java.util.Set; - -import cpw.mods.fml.common.FMLCommonHandler; -import cr0s.WarpDrive.Vector3; -import cr0s.WarpDrive.WarpDrive; -import cr0s.WarpDrive.WarpDriveConfig; -import cr0s.WarpDrive.item.ItemReactorLaserFocus; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChunkCoordinates; - -public class TileEntityLaserReactorMonitor extends TileEntityAbstractLaser { - private final int workRate = 10; - private int ticks = 0; - - private Set findReactors() {//returns either IReactor or IReactorChamber tile entity - int[] xD = {-2, 2, 0, 0, 0, 0}; - int[] yD = { 0, 0,-2, 2, 0, 0}; - int[] zD = { 0, 0, 0, 0,-2, 2}; - Set output = new HashSet(); - for(int i = 0; i < xD.length; i++) { - int xO = xCoord + xD[i]; - int yO = yCoord + yD[i]; - int zO = zCoord + zD[i]; - TileEntity te = worldObj.getBlockTileEntity(xO, yO, zO); - if(te == null) - continue; - - if (te instanceof IReactor) { - output.add(te); - } else if(te instanceof IReactorChamber) { - IReactor reactor = ((IReactorChamber)te).getReactor(); - if(reactor == null) - continue; - - ChunkCoordinates coords = reactor.getPosition(); - - if(Math.abs(coords.posX - xCoord) == 1) - continue; - if(Math.abs(coords.posY - yCoord) == 1) - continue; - if(Math.abs(coords.posZ - zCoord) == 1) - continue; - - output.add(te); - } - } - return output; - } - - private boolean coolReactor(IReactor react) { - boolean didCoolReactor = false; - for(int x = 0; x < 9; x++) { - for(int y = 0; y < 6; y++) { - ItemStack item = react.getItemAt(x, y); - if (item != null) { - if(item.getItem() instanceof ItemReactorLaserFocus) { - int heat = item.getItemDamage(); - int heatRemoval = (int) Math.floor(Math.min(getEnergyStored() / WarpDriveConfig.RM_EU_PER_HEAT, (double) heat)); - if(heatRemoval > 0) { - didCoolReactor = true; - consumeEnergy((int) Math.ceil(heatRemoval * WarpDriveConfig.RM_EU_PER_HEAT), false); - item.setItemDamage(heat - heatRemoval); - } - } - } - } - } - return didCoolReactor; - } - - @Override - public void updateEntity() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return; - } - super.updateEntity(); - - ticks++; - if (ticks > workRate) { - ticks = 0; - Vector3 myPos = new Vector3(this).translate(0.5); - Set reactors = findReactors(); - if(reactors.size() == 0) - return; - - for(Object o : reactors) - { - IReactor react = null; - if(o instanceof TileEntity) - { - if(o instanceof IReactor) - react = (IReactor)o; - else if(o instanceof IReactorChamber) - react = ((IReactorChamber)o).getReactor(); - if(react != null) - { - if(coolReactor(react)) - { - TileEntity te = (TileEntity)o; - WarpDrive.sendLaserPacket(worldObj, myPos, new Vector3(te.xCoord,te.yCoord,te.zCoord).translate(0.5D), 0f, 0.8f, 1f, 20, 0, 20); - } - } - } - } - } - } - - @Override - public void writeToNBT(NBTTagCompound tag) { - super.writeToNBT(tag); - } - - @Override - public void readFromNBT(NBTTagCompound tag) { - super.readFromNBT(tag); - } - - @Override - public boolean shouldChunkLoad() { - return false; - } - - @Override - public int getMaxEnergyStored() { - return WarpDriveConfig.RM_MAX_ENERGY; - } - - @Override - public int getMaxSafeInput() { - return Integer.MAX_VALUE; - } -} diff --git a/src/cr0s/WarpDrive/machines/TileEntityLaserTreeFarm.java b/src/cr0s/WarpDrive/machines/TileEntityLaserTreeFarm.java deleted file mode 100644 index 09b71f89..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityLaserTreeFarm.java +++ /dev/null @@ -1,384 +0,0 @@ -package cr0s.WarpDrive.machines; - -import java.util.LinkedList; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import cr0s.WarpDrive.Vector3; -import cr0s.WarpDrive.WarpDrive; -import cr0s.WarpDrive.WarpDriveConfig; -import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.api.lua.ILuaContext; -import dan200.computercraft.api.peripheral.IPeripheral; - -public class TileEntityLaserTreeFarm extends TileEntityAbstractMiner implements IPeripheral { - Boolean active = false; - - private int mode = 0; - private boolean doLeaves = false; - private boolean silkTouchLeaves = false; - private boolean treeTap = false; - - private final int defSize = 8; - private final int scanWait = 40; - private final int mineWait = 4; - private int delayMul = 4; - - private int totalHarvested=0; - - private int scan=0; - private int xSize = defSize; - private int zSize = defSize; - - LinkedList logs; - private int logIndex = 0; - - private String[] methodsArray = { - "start", - "stop", - "area", - "leaves", - "silkTouch", - "silkTouchLeaves", - "treetap", - "state" - }; - - public TileEntityLaserTreeFarm() { - super(); - } - - @Override - public void updateEntity() { - super.updateEntity(); - - if (active) { - scan++; - if (mode == 0) { - if (scan >= scanWait) { - scan = 0; - logs = scanTrees(); - if(logs.size() > 0) - mode = treeTap ? 2 : 1; - logIndex = 0; - } - } else { - if (scan >= mineWait * delayMul) { - scan = 0; - - if (logIndex >= logs.size()) { - mode = 0; - return; - } - Vector3 pos = logs.get(logIndex); - int blockID = worldObj.getBlockId(pos.intX(), pos.intY(), pos.intZ()); - - if (mode == 1) { - int cost = calculateBlockCost(blockID); - if (consumeEnergyFromBooster(cost, true)) { - if (isLog(blockID) || (doLeaves && isLeaf(blockID))) { - delayMul = 1; - if (isRoomForHarvest()) { - if (consumeEnergyFromBooster(cost, false)) { - if (isLog(blockID)) { - delayMul = 4; - totalHarvested++; - } - harvestBlock(pos); - } else { - return; - } - } else { - return; - } - } - logIndex++; - } - } else if(mode == 2) { - int cost = calculateBlockCost(blockID); - if (consumeEnergyFromBooster(cost, true)) { - if (isRoomForHarvest()) { - if (blockID == WarpDriveConfig.IC2_RubberWood) { - int metadata = worldObj.getBlockMetadata(pos.intX(), pos.intY(), pos.intZ()); - if (metadata >= 2 && metadata <= 5) { - WarpDrive.debugPrint("wetspot found"); - if (consumeEnergyFromBooster(cost, false)) { - ItemStack resin = WarpDriveConfig.IC2_Resin.copy(); - resin.stackSize = (int) Math.round(Math.random() * 4); - dumpToInv(resin); - worldObj.setBlockMetadataWithNotify(pos.intX(), pos.intY(), pos.intZ(), metadata+6, 3); - laserBlock(pos); - totalHarvested++; - delayMul = 4; - } else { - return; - } - } else { - delayMul = 1; - } - } else if(isLog(blockID)) { - if (consumeEnergyFromBooster(cost, false)) { - delayMul = 4; - totalHarvested++; - harvestBlock(pos); - } else { - return; - } - } else if(isLeaf(blockID)) { - if (consumeEnergyFromBooster(cost, true)) { - delayMul = 1; - harvestBlock(pos); - } else { - return; - } - } - } else { - return; - } - logIndex++; - } - } - } - } - } - } - - private static boolean isLog(int blockID) { - return WarpDriveConfig.MinerLogs.contains(blockID); - } - - private static boolean isLeaf(int blockID) { - return WarpDriveConfig.MinerLeaves.contains(blockID); - } - - private static void addTree(LinkedList list, Vector3 newTree) { - WarpDrive.debugPrint("Adding tree position:" + newTree.x + "," + newTree.y + "," + newTree.z); - list.add(newTree); - } - - private LinkedList scanTrees() { - int xmax, zmax, x1, x2, z1, z2; - int xmin, zmin; - x1 = xCoord + xSize / 2; - x2 = xCoord - xSize / 2; - xmin = Math.min(x1, x2); - xmax = Math.max(x1, x2); - - z1 = zCoord + zSize / 2; - z2 = zCoord - zSize / 2; - zmin = Math.min(z1, z2); - zmax = Math.max(z1, z2); - - LinkedList logPositions = new LinkedList(); - - for(int x = xmin; x <= xmax; x++) { - for(int z = zmin; z <= zmax; z++) { - int blockID = worldObj.getBlockId(x, yCoord, z); - if (isLog(blockID)) { - Vector3 pos = new Vector3(x, yCoord, z); - logPositions.add(pos); - scanNearby(logPositions, x, yCoord, z, 0); - } - } - } - return logPositions; - } - - private void scanNearby(LinkedList current, int x, int y, int z, int d) { - int[] deltas = {0, -1, 1}; - for(int dx : deltas) { - for(int dy = 1; dy >= 0; dy--) { - for(int dz : deltas) { - int blockID = worldObj.getBlockId(x+dx, y+dy, z+dz); - if (isLog(blockID) || (doLeaves && isLeaf(blockID))) { - Vector3 pos = new Vector3(x + dx, y + dy, z + dz); - if (!current.contains(pos)) { - addTree(current, pos); - if (d < 35) { - scanNearby(current,x+dx,y+dy,z+dz,d+1); - } - } - } - } - } - } - } - - @Override - public void writeToNBT(NBTTagCompound tag) { - super.writeToNBT(tag); - tag.setInteger("xSize", xSize); - tag.setInteger("zSize", zSize); - tag.setBoolean("doLeaves", doLeaves); - tag.setBoolean("active", active); - tag.setBoolean("treetap", treeTap); - tag.setBoolean("silkTouchLeaves", silkTouchLeaves); - } - - @Override - public void readFromNBT(NBTTagCompound tag) { - super.readFromNBT(tag); - xSize = tag.getInteger("xSize"); - zSize = tag.getInteger("zSize"); - defineMiningArea(xSize,zSize); - - doLeaves = tag.getBoolean("doLeaves"); - active = tag.getBoolean("active"); - treeTap = tag.getBoolean("treetap"); - silkTouchLeaves = tag.getBoolean("silkTouchLeaves"); - } - - @Override - public boolean shouldChunkLoad() { - return active; - } - - @Override - public String getType() { - return "treefarmLaser"; - } - - @Override - public String[] getMethodNames() { - return methodsArray; - } - - @Override - public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception { - String methodStr = methodsArray[method]; - if (methodStr == "start") { - if (!active) { - mode = 0; - totalHarvested = 0; - active = true; - } - return new Boolean[] { true }; - } - - if (methodStr == "stop") { - active = false; - } - - if (methodStr == "area") { - try { - if (arguments.length == 1) { - xSize = clamp(toInt(arguments[0]),3,WarpDriveConfig.TF_MAX_SIZE); - zSize = xSize; - } else if(arguments.length == 2) { - xSize = clamp(toInt(arguments[0]),3,WarpDriveConfig.TF_MAX_SIZE); - zSize = clamp(toInt(arguments[1]),3,WarpDriveConfig.TF_MAX_SIZE); - } - } catch(NumberFormatException e) { - xSize = defSize; - zSize = defSize; - } - defineMiningArea(xSize,zSize); - return new Integer[] { xSize , zSize }; - } - - if (methodStr == "leaves") { - try { - if (arguments.length > 0) { - doLeaves = toBool(arguments[0]); - } - } catch(Exception e) { - - } - return new Boolean[] { doLeaves }; - } - - if (methodStr == "silkTouch") { - try { - silkTouch(arguments[0]); - } catch(Exception e) { - silkTouch(false); - } - return new Object[] { silkTouch() }; - } - - if (methodStr == "silkTouchLeaves") { - try { - if (arguments.length >= 1) { - silkTouchLeaves = toBool(arguments[0]); - } - } catch(Exception e) { - silkTouchLeaves = false; - } - return new Object[] { silkTouchLeaves }; - } - - if (methodStr == "treetap") { - try { - if (arguments.length >= 1) { - treeTap = toBool(arguments[0]); - } - } catch(Exception e) { - treeTap = false; - } - return new Object[] { treeTap }; - } - - if (methodStr == "state") { - String state = active ? (mode==0?"scanning" : (mode == 1 ? "harvesting" : "tapping")) : "inactive"; - return new Object[] { state, xSize, zSize, energy(), totalHarvested }; - } - return null; - } - - @Override - public void attach(IComputerAccess computer) { - } - - @Override - public void detach(IComputerAccess computer) { - } - - //ABSTRACT LASER IMPLEMENTATION - @Override - protected boolean silkTouch(int blockID) { - if (isLeaf(blockID)) { - return silkTouchLeaves; - } - return silkTouch(); - } - - @Override - protected boolean canSilkTouch() { - return true; - } - - @Override - protected int minFortune() { - return 0; - } - - @Override - protected int maxFortune() { - return 0; - } - - @Override - protected double laserBelow() { - return -0.5; - } - - @Override - protected float getColorR() { - return 0.2f; - } - - @Override - protected float getColorG() { - return 0.7f; - } - - @Override - protected float getColorB() { - return 0.4f; - } - - @Override - public boolean equals(IPeripheral other) { - return other == this; - } -} diff --git a/src/cr0s/WarpDrive/machines/TileEntityLift.java b/src/cr0s/WarpDrive/machines/TileEntityLift.java deleted file mode 100644 index 7d4b1253..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityLift.java +++ /dev/null @@ -1,173 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; - -import java.util.List; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.AxisAlignedBB; -import cr0s.WarpDrive.*; - -public class TileEntityLift extends WarpEnergyTE { - private final int MAX_ENERGY_VALUE = 2048; // eU - - private int mode = 0; // 0 - inactive, 1 - up, 2 - down - private int firstUncoveredY; - - private boolean isEnabled = false; - - int ticks = 0; - - @Override - public void updateEntity() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return; - } - super.updateEntity(); - - if (++ticks > 40) - { - ticks = 0; - - // Switching mode - if (worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) - { - mode = 2; // down - } - else - { - mode = 1; // up - } - - isEnabled = (worldObj.isAirBlock(xCoord, yCoord + 1, zCoord) && worldObj.isAirBlock(xCoord, yCoord + 2, zCoord)); - - if (getEnergyStored() != MAX_ENERGY_VALUE || !isEnabled) { - mode = 0; - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2); // disabled - return; - } - - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, mode, 2); // current mode - - // Launch a beam: search non-air blocks under lift - for (int ny = yCoord - 1; ny > 0; ny--) { - int blockId = worldObj.getBlockId(xCoord, ny, zCoord); - // 63 & 68 = signs - if (blockId != 0 && blockId != 63 && blockId != 68 && !WarpDriveConfig.isAirBlock(worldObj, blockId, xCoord, ny, zCoord)) { - firstUncoveredY = ny; - break; - } - } - - if (yCoord - firstUncoveredY > 0) { - if (mode == 1) { - WarpDrive.instance.sendLaserPacket(worldObj, new Vector3(this).translate(0.5D), new Vector3(xCoord, firstUncoveredY, zCoord).translate(0.5D), 0f, 1f, 0f, 40, 0, 100); - } else if (mode == 2) { - WarpDrive.instance.sendLaserPacket(worldObj, new Vector3(this).translate(0.5D), new Vector3(xCoord, firstUncoveredY, zCoord).translate(0.5D), 0f, 0f, 1f, 40, 0, 100); - } - } - - liftEntity(); - } - } - - public void liftEntity() - { - int xmax, zmax, x1, x2, z1, z2; - int xmin, zmin; - final int CUBE_SIDE = 2; - x1 = xCoord + CUBE_SIDE / 2; - x2 = xCoord - CUBE_SIDE / 2; - - if (x1 < x2) - { - xmin = x1; - xmax = x2; - } - else - { - xmin = x2; - xmax = x1; - } - - z1 = zCoord + CUBE_SIDE / 2; - z2 = zCoord - CUBE_SIDE / 2; - - if (z1 < z2) - { - zmin = z1; - zmax = z2; - } - else - { - zmin = z2; - zmax = z1; - } - - // Lift up - if (mode == 1) - { - AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(xmin + 0.3, firstUncoveredY, zmin + 0.3, xmax - 0.3, yCoord, zmax - 0.3); - List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, aabb); - - if (list != null) // up - { - for (Object o : list) - { - if (o != null && o instanceof EntityLivingBase) - { - ((EntityLivingBase)o).setPositionAndUpdate(xCoord + 0.5f, yCoord + 1, zCoord + 0.5f); - WarpDrive.sendLaserPacket(worldObj, new Vector3(this).translate(0.5), new Vector3(xCoord, firstUncoveredY, zCoord).translate(0.5), 1F, 1F, 0F, 40, 0, 100); - worldObj.playSoundEffect(xCoord + 0.5f, yCoord, zCoord + 0.5f, "warpdrive:hilaser", 4F, 1F); - consumeAllEnergy(); - return; - } - } - } - } - else if (mode == 2) // down - { - AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(xmin + 0.3, yCoord, zmin + 0.3, xmax - 0.3, yCoord + 2, zmax - 0.3); - List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, aabb); - - if (list != null) - { - for (Object o : list) - { - if (o != null && o instanceof EntityLivingBase) - { - ((EntityLivingBase)o).setPositionAndUpdate(xCoord + 0.5f, firstUncoveredY + 1, zCoord + 0.5f); - WarpDrive.sendLaserPacket(worldObj, new Vector3(this).translate(0.5), new Vector3(xCoord, firstUncoveredY + 1, zCoord).translate(0.5), 1F, 1F, 0F, 40, 0, 100); - worldObj.playSoundEffect(xCoord + 0.5f, yCoord, zCoord + 0.5f, "warpdrive:hilaser", 4F, 1F); - consumeAllEnergy(); - return; - } - } - } - } - } - - @Override - public void readFromNBT(NBTTagCompound tag) - { - super.readFromNBT(tag); - } - - @Override - public void writeToNBT(NBTTagCompound tag) - { - super.writeToNBT(tag); - } - - // IEnergySink methods implementation - @Override - public int getMaxEnergyStored() { - return MAX_ENERGY_VALUE; - } - - @Override - public int getMaxSafeInput() { - return Integer.MAX_VALUE; - } -} diff --git a/src/cr0s/WarpDrive/machines/TileEntityMiningLaser.java b/src/cr0s/WarpDrive/machines/TileEntityMiningLaser.java deleted file mode 100644 index 51b1aba4..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityMiningLaser.java +++ /dev/null @@ -1,795 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import dan200.computercraft.api.ComputerCraftAPI; -import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.api.lua.ILuaContext; -import dan200.computercraft.api.peripheral.IPeripheral; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockFluid; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.inventory.IInventory; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fluids.FluidRegistry; -import appeng.api.WorldCoord; -import appeng.api.IAEItemStack; -import appeng.api.Util; -import appeng.api.events.GridTileLoadEvent; -import appeng.api.events.GridTileUnloadEvent; -import appeng.api.me.tiles.IGridMachine; -import appeng.api.me.tiles.ITileCable; -import appeng.api.me.util.IGridInterface; -import appeng.api.me.util.IMEInventoryHandler; -import cr0s.WarpDrive.*; - -public class TileEntityMiningLaser extends TileEntity implements IPeripheral, IGridMachine, ITileCable { - Boolean powerStatus = false; - private IGridInterface grid; - - private int dx, dz, dy; - private boolean isMining() { - return currentState != STATE_IDLE; - } - private boolean isQuarry = false; - private boolean useDeiterium = false; - private boolean AENetworkReady = false; - - private String[] methodsArray = { - "mine", //0 - "stop", //1 - "isMining", //2 - "quarry", //3 - "state", //4 - "offset" //5 - }; - - private int delayTicksWarmup = 0; - private int delayTicksScan = 0; - private int delayTicksMine = 0; - private final int STATE_IDLE = 0; - private final int STATE_WARMUP = 1; - private final int STATE_SCANNING = 2; - private final int STATE_MINING = 3; - private int currentState = 0; // 0 - scan next layer, 1 - collect valuables - private boolean enoughPower = false; - private int currentLayer; - - private ArrayList valuablesInLayer = new ArrayList(); - private int valuableIndex = 0; - - private int layerOffset = 1; - - @Override - public void updateEntity() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return; - } - if (currentState == STATE_IDLE) { - delayTicksWarmup = 0; - delayTicksScan = 0; - delayTicksMine = 0; - updateMetadata(BlockMiningLaser.ICON_IDLE); - return; - } - - boolean isOnEarth = (worldObj.provider.dimensionId == 0); - - Vector3 minerVector = new Vector3(xCoord + 0.5D, yCoord, zCoord + 0.5D); - - if (currentState == STATE_WARMUP) { // warming up - delayTicksWarmup++; - updateMetadata(BlockMiningLaser.ICON_SCANNINGLOWPOWER); - if (delayTicksWarmup >= WarpDriveConfig.ML_WARMUP_DELAY_TICKS) { - delayTicksScan = 0; - currentState = STATE_SCANNING; - updateMetadata(BlockMiningLaser.ICON_SCANNINGLOWPOWER); - return; - } - } else if (currentState == STATE_SCANNING) { // scanning - delayTicksScan++; - if (delayTicksScan == 1) { - // check power level - enoughPower = consumeEnergyPacketFromBooster(isOnEarth ? WarpDriveConfig.ML_EU_PER_LAYER_EARTH : WarpDriveConfig.ML_EU_PER_LAYER_SPACE, true); - if (!enoughPower) { - updateMetadata(BlockMiningLaser.ICON_SCANNINGLOWPOWER); - delayTicksScan = 0; - return; - } else { - updateMetadata(BlockMiningLaser.ICON_SCANNINGPOWERED); - } - // show current layer - int age = Math.max(40, 5 * WarpDriveConfig.ML_SCAN_DELAY_TICKS); - double xmax = xCoord + WarpDriveConfig.ML_MAX_RADIUS + 1.0D; - double xmin = xCoord - WarpDriveConfig.ML_MAX_RADIUS + 0.0D; - double zmax = zCoord + WarpDriveConfig.ML_MAX_RADIUS + 1.0D; - double zmin = zCoord - WarpDriveConfig.ML_MAX_RADIUS + 0.0D; - double y = currentLayer + 1.0D; - WarpDrive.sendLaserPacket(worldObj, new Vector3(xmin, y, zmin), new Vector3(xmax, y, zmin), 0.3F, 0.0F, 1.0F, age, 0, 50); - WarpDrive.sendLaserPacket(worldObj, new Vector3(xmax, y, zmin), new Vector3(xmax, y, zmax), 0.3F, 0.0F, 1.0F, age, 0, 50); - WarpDrive.sendLaserPacket(worldObj, new Vector3(xmax, y, zmax), new Vector3(xmin, y, zmax), 0.3F, 0.0F, 1.0F, age, 0, 50); - WarpDrive.sendLaserPacket(worldObj, new Vector3(xmin, y, zmax), new Vector3(xmin, y, zmin), 0.3F, 0.0F, 1.0F, age, 0, 50); - } else if (delayTicksScan >= WarpDriveConfig.ML_SCAN_DELAY_TICKS) { - delayTicksScan = 0; - if (currentLayer <= 0) { - stop(); - return; - } - // consume power - enoughPower = consumeEnergyPacketFromBooster(isOnEarth ? WarpDriveConfig.ML_EU_PER_LAYER_EARTH : WarpDriveConfig.ML_EU_PER_LAYER_SPACE, false); - if (!enoughPower) { - updateMetadata(BlockMiningLaser.ICON_SCANNINGLOWPOWER); - return; - } else { - updateMetadata(BlockMiningLaser.ICON_SCANNINGPOWERED); - } - // scan - scanLayer(); - if (valuablesInLayer.size() > 0) { - int r = (int)Math.ceil(WarpDriveConfig.ML_MAX_RADIUS / 2.0D); - int offset = (yCoord - currentLayer) % (2 * r); - int age = Math.max(20, Math.round(2.5F * WarpDriveConfig.ML_SCAN_DELAY_TICKS)); - double y = currentLayer + 1.0D; - WarpDrive.sendLaserPacket(worldObj, minerVector, new Vector3(xCoord - r + offset, y, zCoord + r ).translate(0.3D), 0.0F, 0.0F, 1.0F, age, 0, 50); - WarpDrive.sendLaserPacket(worldObj, minerVector, new Vector3(xCoord + r , y, zCoord + r - offset).translate(0.3D), 0.0F, 0.0F, 1.0F, age, 0, 50); - WarpDrive.sendLaserPacket(worldObj, minerVector, new Vector3(xCoord + r - offset, y, zCoord - r ).translate(0.3D), 0.0F, 0.0F, 1.0F, age, 0, 50); - WarpDrive.sendLaserPacket(worldObj, minerVector, new Vector3(xCoord - r , y, zCoord - r + offset).translate(0.3D), 0.0F, 0.0F, 1.0F, age, 0, 50); - worldObj.playSoundEffect(xCoord + 0.5f, yCoord, zCoord + 0.5f, "warpdrive:hilaser", 4F, 1F); - delayTicksMine = 0; - currentState = STATE_MINING; - updateMetadata(BlockMiningLaser.ICON_MININGPOWERED); - return; - } else { - worldObj.playSoundEffect(xCoord + 0.5f, yCoord, zCoord + 0.5f, "warpdrive:lowlaser", 4F, 1F); - currentLayer--; - } - } - } else if (currentState == STATE_MINING) { // mining - delayTicksMine++; - if (delayTicksMine >= WarpDriveConfig.ML_MINE_DELAY_TICKS) { - delayTicksMine = 0; - - if (valuableIndex >= valuablesInLayer.size()) { - delayTicksScan = 0; - currentState = STATE_SCANNING; - updateMetadata(BlockMiningLaser.ICON_SCANNINGPOWERED); - // rescan same layer - scanLayer(); - if (valuablesInLayer.size() <= 0) { - currentLayer--; - } - return; - } - - // consume power - enoughPower = consumeEnergyPacketFromBooster(isOnEarth ? WarpDriveConfig.ML_EU_PER_BLOCK_EARTH : WarpDriveConfig.ML_EU_PER_BLOCK_SPACE, false); - if (!enoughPower) { - updateMetadata(BlockMiningLaser.ICON_MININGLOWPOWER); - return; - } else { - updateMetadata(BlockMiningLaser.ICON_MININGPOWERED); - } - - //System.out.println("[ML] Mining: " + (valuableIndex + 1) + "/" + valuablesInLayer.size()); - Vector3 valuable = valuablesInLayer.get(valuableIndex); - valuableIndex++; - // Mine valuable ore - int blockID = worldObj.getBlockId(valuable.intX(), valuable.intY(), valuable.intZ()); - // Skip if block is too hard or its empty block (check again in case it changed) - if (!canDig(blockID, valuable.intX(), valuable.intY(), valuable.intZ())) { - delayTicksMine = Math.round(WarpDriveConfig.ML_MINE_DELAY_TICKS * 0.8F); - } - int age = Math.max(10, Math.round((4 + worldObj.rand.nextFloat()) * WarpDriveConfig.ML_MINE_DELAY_TICKS)); - WarpDrive.sendLaserPacket(worldObj, minerVector, new Vector3(valuable.intX(), valuable.intY(), valuable.intZ()).translate(0.5D), 1.0F, 1.0F, 0.0F, age, 0, 50); - worldObj.playSoundEffect(xCoord + 0.5f, yCoord, zCoord + 0.5f, "warpdrive:lowlaser", 4F, 1F); - harvestBlock(valuable); - } - } - } - - private void updateMetadata(int metadata) { - int blockId = worldObj.getBlockId(xCoord, yCoord, zCoord); - if (blockId == WarpDriveConfig.miningLaserID) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, metadata, 2); - } - } - - private void stop() { - // WarpDrive.debugPrint("" + this + " Stop requested"); - currentState = STATE_IDLE; - updateMetadata(BlockMiningLaser.ICON_IDLE); - } - - private boolean canDig(int blockID, int x, int y, int z) { - // ignore air - if (WarpDriveConfig.isAirBlock(worldObj, blockID, x, y, z)) { - return false; - } - // check blacklist - if (blockID == Block.bedrock.blockID) { - return false; - } - if (WarpDriveConfig.forceFieldBlocks.contains(blockID)) { - stop(); - return false; - } - // check whitelist - if (WarpDriveConfig.MinerOres.contains(blockID)) { - return true; - } - // check default - if ( (Block.blocksList[blockID] != null) && (Block.blocksList[blockID].blockResistance <= Block.obsidian.blockResistance) ) { - return true; - } - // WarpDrive.debugPrint("" + this + " Rejecting " + blockID + " at (" + x + ", " + y + ", " + z + ")"); - return false; - } - - private void harvestBlock(Vector3 valuable) { - int blockID = worldObj.getBlockId(valuable.intX(), valuable.intY(), valuable.intZ()); - int blockMeta = worldObj.getBlockMetadata(valuable.intX(), valuable.intY(), valuable.intZ()); - if (Block.blocksList[blockID] != null && (Block.blocksList[blockID] instanceof BlockFluid)) { - // Evaporate fluid - worldObj.playSoundEffect(valuable.intX() + 0.5D, valuable.intY() + 0.5D, valuable.intZ() + 0.5D, "random.fizz", 0.5F, 2.6F + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.8F); - } else { - List stacks = getItemStackFromBlock(valuable.intX(), valuable.intY(), valuable.intZ(), blockID, blockMeta); - if (stacks != null) { - boolean overflow = false; - for (ItemStack stack : stacks) { - if (grid != null && AENetworkReady) { - putInGrid(stack); - } else { - if (!putInChest(findChest(), stack)) { - WarpDrive.debugPrint("" + this + " Overflow detected"); - overflow = true; - } - } - } - if (overflow) { - stop(); - } - } - // standard harvest block effect - worldObj.playAuxSFXAtEntity(null, 2001, valuable.intX(), valuable.intY(), valuable.intZ(), blockID + (blockMeta << 12)); - } - worldObj.setBlockToAir(valuable.intX(), valuable.intY(), valuable.intZ()); - } - - private IInventory findChest() { - TileEntity result = null; - result = worldObj.getBlockTileEntity(xCoord + 1, yCoord, zCoord); - if (result != null && result instanceof IInventory) { - return (IInventory) result; - } - - result = worldObj.getBlockTileEntity(xCoord - 1, yCoord, zCoord); - if (result != null && result instanceof IInventory) { - return (IInventory) result; - } - - result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord + 1); - if (result != null && result instanceof IInventory) { - return (IInventory) result; - } - - result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord - 1); - if (result != null && result instanceof IInventory) { - return (IInventory) result; - } - - result = worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord); - if (result != null && result instanceof IInventory) { - return (IInventory) result; - } - - return null; - } - - public List getItemStackFromBlock(int i, int j, int k, int blockID, int blockMeta) - { - Block block = Block.blocksList[blockID]; - if (block == null) - return null; - if (useDeiterium && grid != null && AENetworkReady) - { - IMEInventoryHandler cellArray = grid.getCellArray(); - if (cellArray != null && block.canSilkHarvest(worldObj, null, i, j, k, blockMeta)) { - int consume = isQuarry ? 15 : 1000; - - IAEItemStack entryToAEIS1 = null; - long contained1 = 0; - if (WarpDriveConfig.AEExtra_fluidDrive != null) { - entryToAEIS1 = Util.createItemStack(new ItemStack(WarpDriveConfig.AEExtra_fluidDrive, consume, FluidRegistry.getFluidID("deuterium"))); - contained1 = cellArray.countOfItemType(entryToAEIS1); - } - IAEItemStack entryToAEIS2 = null; - long contained2 = 0; - if (WarpDriveConfig.IC2_fluidCell != null) { - entryToAEIS2 = Util.createItemStack(new ItemStack(WarpDriveConfig.IC2_fluidCell, consume, FluidRegistry.getFluidID("deuterium"))); - contained2 = cellArray.countOfItemType(entryToAEIS2); - } - IAEItemStack entryToAEIS3 = null; - long contained3 = 0; - if (WarpDriveConfig.AS_deuteriumCell != 0) { - entryToAEIS3 = Util.createItemStack(new ItemStack(WarpDriveConfig.AS_deuteriumCell, consume, FluidRegistry.getFluidID("deuterium"))); - contained3 = cellArray.countOfItemType(entryToAEIS3); - } - - if (contained1 + contained2 + contained3 >= consume) { - if (contained1 > 0) { - cellArray.extractItems(entryToAEIS1); - } - if (contained2 > 0 && contained1 < consume) { - entryToAEIS2 = Util.createItemStack(new ItemStack(WarpDriveConfig.IC2_fluidCell, (int)(consume - contained2), FluidRegistry.getFluidID("deuterium"))); - cellArray.extractItems(entryToAEIS2); - } - if (contained3 > 0 && contained1 + contained2 < consume) { - entryToAEIS3 = Util.createItemStack(new ItemStack(WarpDriveConfig.AS_deuteriumCell, (int)(consume - contained1 - contained2), FluidRegistry.getFluidID("deuterium"))); - cellArray.extractItems(entryToAEIS3); - } - - ArrayList t = new ArrayList(); - t.add(new ItemStack(blockID, 1, blockMeta)); - return t; - } - } - } - return block.getBlockDropped(worldObj, i, j, k, blockMeta, 0); - } - - public int putInGrid(ItemStack itemStackSource) - { - int transferred = itemStackSource.stackSize; - IMEInventoryHandler cellArray = grid.getCellArray(); - if (cellArray != null) - { - IAEItemStack ret = cellArray.addItems(Util.createItemStack(itemStackSource)); - if (ret != null) - transferred -= ret.getStackSize(); - } - return transferred; - } - - public boolean putInChest(IInventory inventory, ItemStack itemStackSource) { - if (itemStackSource == null) { - stop(); - return false; - } - - int qtyLeft = itemStackSource.stackSize; - int transfer; - - if (inventory != null) { - // fill existing stacks first - for (int i = 0; i < inventory.getSizeInventory(); i++) { - if (!inventory.isItemValidForSlot(i, itemStackSource)) { - continue; - } - - ItemStack itemStack = inventory.getStackInSlot(i); - if (itemStack == null || !itemStack.isItemEqual(itemStackSource)) { - continue; - } - - transfer = Math.min(qtyLeft, itemStack.getMaxStackSize() - itemStack.stackSize); - itemStack.stackSize += transfer; - qtyLeft -= transfer; - if (qtyLeft <= 0) { - return true; - } - } - - // put remaining in empty slot - for (int i = 0; i < inventory.getSizeInventory(); i++) { - if (!inventory.isItemValidForSlot(i, itemStackSource)) { - continue; - } - - ItemStack itemStack = inventory.getStackInSlot(i); - if (itemStack != null) { - continue; - } - - transfer = Math.min(qtyLeft, itemStackSource.getMaxStackSize()); - ItemStack dest = copyWithSize(itemStackSource, transfer); - inventory.setInventorySlotContents(i, dest); - qtyLeft -= transfer; - - if (qtyLeft <= 0) { - return true; - } - } - } - - while (qtyLeft > 0) { - transfer = Math.min(qtyLeft, itemStackSource.getMaxStackSize()); - ItemStack dropItemStack = copyWithSize(itemStackSource, transfer); - EntityItem itemEnt = new EntityItem(worldObj, xCoord + 0.5D, yCoord + 1.0D, zCoord + 0.5D, dropItemStack); - worldObj.spawnEntityInWorld(itemEnt); - qtyLeft -= transfer; - } - - return false; - } - - public static ItemStack copyWithSize(ItemStack itemStack, int newSize) - { - ItemStack ret = itemStack.copy(); - ret.stackSize = newSize; - return ret; - } - - private void scanLayer() { - //System.out.println("Scanning layer"); - valuablesInLayer.clear(); - valuableIndex = 0; - int radius, x, z, blockID; - int xmax, zmax; - int xmin, zmin; - - // Search for valuable blocks - x = xCoord; - z = zCoord; - blockID = worldObj.getBlockId(x, currentLayer, z); - if (canDig(blockID, x, currentLayer, z)) { - if (isQuarry || WarpDriveConfig.MinerOres.contains(blockID)) {// Quarry collects all blocks or only collect valuables blocks - valuablesInLayer.add(new Vector3(x, currentLayer, z)); - } - } - for (radius = 1; radius <= WarpDriveConfig.ML_MAX_RADIUS; radius++) { - xmax = xCoord + radius; - xmin = xCoord - radius; - zmax = zCoord + radius; - zmin = zCoord - radius; - x = xCoord; - z = zmin; - for (; x <= xmax; x++) { - blockID = worldObj.getBlockId(x, currentLayer, z); - if (canDig(blockID, x, currentLayer, z)) { - if (isQuarry || WarpDriveConfig.MinerOres.contains(blockID)) {// Quarry collects all blocks or only collect valuables blocks - valuablesInLayer.add(new Vector3(x, currentLayer, z)); - } - } - } - x = xmax; - z++; - for (; z <= zmax; z++) { - blockID = worldObj.getBlockId(x, currentLayer, z); - if (canDig(blockID, x, currentLayer, z)) { - if (isQuarry || WarpDriveConfig.MinerOres.contains(blockID)) {// Quarry collects all blocks or only collect valuables blocks - valuablesInLayer.add(new Vector3(x, currentLayer, z)); - } - } - } - x--; - z = zmax; - for (; x >= xmin; x--) { - blockID = worldObj.getBlockId(x, currentLayer, z); - if (canDig(blockID, x, currentLayer, z)) { - if (isQuarry || WarpDriveConfig.MinerOres.contains(blockID)) {// Quarry collects all blocks or only collect valuables blocks - valuablesInLayer.add(new Vector3(x, currentLayer, z)); - } - } - } - x = xmin; - z--; - for (; z > zmin; z--) { - blockID = worldObj.getBlockId(x, currentLayer, z); - if (canDig(blockID, x, currentLayer, z)) { - if (isQuarry || WarpDriveConfig.MinerOres.contains(blockID)) {// Quarry collects all blocks or only collect valuables blocks - valuablesInLayer.add(new Vector3(x, currentLayer, z)); - } - } - } - x = xmin; - z = zmin; - for (; x < xCoord; x++) { - blockID = worldObj.getBlockId(x, currentLayer, z); - if (canDig(blockID, x, currentLayer, z)) { - if (isQuarry || WarpDriveConfig.MinerOres.contains(blockID)) {// Quarry collects all blocks or only collect valuables blocks - valuablesInLayer.add(new Vector3(x, currentLayer, z)); - } - } - } - } - - //System.out.println("" + this + " Found " + valuablesInLayer.size() + " valuables"); - } - - private int getEnergyLevel() { - TileEntityParticleBooster booster = findFirstBooster(); - if (booster != null) { - return booster.getEnergyStored(); - } else { - return 0; - } - } - - private boolean consumeEnergyPacketFromBooster(int amount, boolean simulate) { - TileEntityParticleBooster booster = findFirstBooster(); - if (booster != null) { - return booster.consumeEnergy(amount, simulate); - } else { - return false; - } - } - - private TileEntityParticleBooster findFirstBooster() { - TileEntity result; - result = worldObj.getBlockTileEntity(xCoord + 1, yCoord, zCoord); - - if (result != null && result instanceof TileEntityParticleBooster) - { - dx = 1; - dz = 0; - dy = 0; - return (TileEntityParticleBooster) result; - } - - result = worldObj.getBlockTileEntity(xCoord - 1, yCoord, zCoord); - - if (result != null && result instanceof TileEntityParticleBooster) - { - dx = -1; - dz = 0; - dy = 0; - return (TileEntityParticleBooster) result; - } - - result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord + 1); - - if (result != null && result instanceof TileEntityParticleBooster) - { - dx = 0; - dz = 1; - dy = 0; - return (TileEntityParticleBooster) result; - } - - result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord - 1); - - if (result != null && result instanceof TileEntityParticleBooster) - { - dx = 0; - dz = -1; - dy = 0; - return (TileEntityParticleBooster) result; - } - - result = worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord); - - if (result != null && result instanceof TileEntityParticleBooster) - { - dx = 0; - dz = 0; - dy = 1; - return (TileEntityParticleBooster) result; - } - - return null; - } - - @Override - public void readFromNBT(NBTTagCompound tag) { - super.readFromNBT(tag); - currentState = tag.getInteger("currentState"); - isQuarry = tag.getBoolean("isQuarry"); - currentLayer = tag.getInteger("currentLayer"); - useDeiterium = tag.getBoolean("useDeiterium"); - if (currentState == STATE_MINING) { - scanLayer(); - } - } - - @Override - public void writeToNBT(NBTTagCompound tag) { - super.writeToNBT(tag); - tag.setInteger("currentState", currentState); - tag.setBoolean("isQuarry", isQuarry); - tag.setInteger("currentLayer", currentLayer); - tag.setBoolean("useDeiterium", useDeiterium); - } - - // ComputerCraft - // IPeripheral methods implementation - @Override - public String getType() { - return "mininglaser"; - } - - @Override - public String[] getMethodNames() { - return methodsArray; - } - - @Override - public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception { - switch (method) { - case 0: // Mine() - if (isMining()) { - return new Boolean[] { false }; - } - - isQuarry = false; - delayTicksWarmup = 0; - currentState = STATE_WARMUP; - currentLayer = yCoord - layerOffset - 1; - useDeiterium = (arguments.length == 1 && FluidRegistry.isFluidRegistered("deuterium")); - return new Boolean[] { true }; - - case 1: // stop() - stop(); - break; - - case 2: // isMining() - return new Boolean[] { isMining() }; - - case 3: // Quarry() - if (isMining()) { - return new Boolean[] { false }; - } - - isQuarry = true; - delayTicksScan = 0; - currentState = STATE_WARMUP; - currentLayer = yCoord - layerOffset - 1; - useDeiterium = (arguments.length == 1 && FluidRegistry.isFluidRegistered("deuterium")); - return new Boolean[] { true }; - - case 4: // State is: state, energy, currentLayer, valuablesMined, valuablesInLayer = getMinerState() - int energy = getEnergyLevel(); - String status = getStatus(); - Integer retValuablesInLayer, retValuablesMined; - if (isMining()) { - retValuablesInLayer = valuablesInLayer.size(); - retValuablesMined = valuableIndex; - - return new Object[] {status, energy, currentLayer, retValuablesMined, retValuablesInLayer}; - } - return new Object[] {status, energy, currentLayer, 0, 0}; - - case 5: // Offset - if (arguments.length == 1) { - try { - layerOffset = Math.min(256, Math.abs(((Double)arguments[0]).intValue())); - } catch(Exception e) { - return new Integer[] { layerOffset }; - } - } - return new Integer[] { layerOffset }; - } - return null; - } - - public String getStatus() { - int energy = 0; - energy = getEnergyLevel(); - String state = "IDLE (not mining)"; - if (currentState == STATE_IDLE) { - state = "IDLE (not mining)"; - } else if (currentState == STATE_WARMUP) { - state = "Warming up..."; - } else if (currentState == STATE_SCANNING) { - if (isQuarry) { - state = "Scanning all"; - } else { - state = "Scanning ores"; - } - } else if (currentState == STATE_MINING) { - if (isQuarry) { - state = "Mining all"; - } else { - state = "Mining ores"; - } - if (useDeiterium) { - state = state + " using Deuterium"; - } - } - if (energy <= 0) { - state = state + " - Out of energy"; - } else if (((currentState == STATE_SCANNING) || (currentState == STATE_MINING)) && !enoughPower) { - state = state + " - Not enough power"; - } - return state; - } - - @Override - public void attach(IComputerAccess computer) { - computer.mount("/mininglaser", ComputerCraftAPI.createResourceMount(WarpDrive.class, "warpdrive", "lua/mininglaser")); - computer.mount("/mine", ComputerCraftAPI.createResourceMount(WarpDrive.class, "warpdrive", "lua/mininglaser/mine")); - computer.mount("/stop", ComputerCraftAPI.createResourceMount(WarpDrive.class, "warpdrive", "lua/mininglaser/stop")); - } - - @Override - public void detach(IComputerAccess computer) { - } - - @Override - public boolean equals(IPeripheral other) { - return other == this; - } - - // Applied Energistics @Override - - @Override - public float getPowerDrainPerTick() { - return 1; - } - - @Override - public void validate() { - super.validate(); - MinecraftForge.EVENT_BUS.post(new GridTileLoadEvent(this, worldObj, getLocation())); - } - - @Override - public void invalidate() { - super.invalidate(); - MinecraftForge.EVENT_BUS.post(new GridTileUnloadEvent(this, worldObj, getLocation())); - } - - @Override - public WorldCoord getLocation() { - return new WorldCoord(xCoord, yCoord, zCoord); - } - - @Override - public boolean isValid() { - return true; - } - - @Override - public void setPowerStatus(boolean hasPower) { - powerStatus = hasPower; - } - - @Override - public boolean isPowered() { - return powerStatus; - } - - @Override - public IGridInterface getGrid() { - return grid; - } - - @Override - public void setGrid(IGridInterface parGrid) { - grid = parGrid; - } - - @Override - public World getWorld() { - return worldObj; - } - - @Override - public boolean coveredConnections() { - return true; - } - - @Override - public void setNetworkReady( boolean isReady ) { - AENetworkReady = isReady; - } - - @Override - public boolean isMachineActive() { - return isMining(); - } - - @Override - public String toString() { - return String.format("%s @ \'%s\' %d, %d, %d", new Object[] { - getClass().getSimpleName(), - worldObj == null ? "~NULL~" : worldObj.getWorldInfo().getWorldName(), - Integer.valueOf(xCoord), Integer.valueOf(yCoord), Integer.valueOf(zCoord)}); - } -} diff --git a/src/cr0s/WarpDrive/machines/TileEntityMonitor.java b/src/cr0s/WarpDrive/machines/TileEntityMonitor.java deleted file mode 100644 index d9e718c2..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityMonitor.java +++ /dev/null @@ -1,116 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import cr0s.WarpDrive.WarpDrive; -import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.api.lua.ILuaContext; -import dan200.computercraft.api.peripheral.IPeripheral; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.packet.Packet250CustomPayload; -import net.minecraft.server.MinecraftServer; -import net.minecraft.tileentity.TileEntity; - -public class TileEntityMonitor extends TileEntity implements IPeripheral { - private int frequency = -1; - - private String[] methodsArray = - { - "freq" - }; - - private int packetSendTicks = 20; - - @Override - public void updateEntity() { - if (FMLCommonHandler.instance().getEffectiveSide().isServer()) { - packetSendTicks--; - if (packetSendTicks == 0) { - packetSendTicks = 20 * 5; - sendFreqPacket(); - } - return; - } - } - - public int getFrequency() { - return frequency; - } - - public void setFrequency(int parFrequency) { - if (frequency != parFrequency) { - frequency = parFrequency; - WarpDrive.debugPrint("" + this + " Monitor frequency set to " + frequency); - } - } - - @Override - public void readFromNBT(NBTTagCompound tag) { - super.readFromNBT(tag); - frequency = tag.getInteger("frequency"); - } - - @Override - public void writeToNBT(NBTTagCompound tag) { - super.writeToNBT(tag); - tag.setInteger("frequency", frequency); - } - - // IPeripheral methods implementation - @Override - public String getType() { - return "monitor"; - } - - @Override - public String[] getMethodNames() { - return methodsArray; - } - - @Override - public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception { - if (arguments.length == 1) { - setFrequency(((Double)arguments[0]).intValue()); - } - return new Integer[] { frequency }; - } - - public void sendFreqPacket() { - if (FMLCommonHandler.instance().getEffectiveSide().isServer()) { - ByteArrayOutputStream bos = new ByteArrayOutputStream(8); - DataOutputStream outputStream = new DataOutputStream(bos); - - try { - outputStream.writeInt(xCoord); - outputStream.writeInt(yCoord); - outputStream.writeInt(zCoord); - outputStream.writeInt(frequency); - } catch (Exception e) { - e.printStackTrace(); - } - - Packet250CustomPayload packet = new Packet250CustomPayload(); - packet.channel = "WarpDriveFreq"; - packet.data = bos.toByteArray(); - packet.length = bos.size(); - MinecraftServer.getServer().getConfigurationManager().sendToAllNear(xCoord, yCoord, zCoord, 100, worldObj.provider.dimensionId, packet); -// WarpDrive.debugPrint("" + this + " Packet '" + packet.channel + "' sent (" + xCoord + ", " + yCoord + ", " + zCoord + ") '" + frequency + "'"); - } - } - - @Override - public void attach(IComputerAccess computer) { - } - - @Override - public void detach(IComputerAccess computer) { - } - - @Override - public boolean equals(IPeripheral other) { - return other == this; - } -} diff --git a/src/cr0s/WarpDrive/machines/TileEntityParticleBooster.java b/src/cr0s/WarpDrive/machines/TileEntityParticleBooster.java deleted file mode 100644 index c8efb3cf..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityParticleBooster.java +++ /dev/null @@ -1,46 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; - -import net.minecraft.nbt.NBTTagCompound; -import cr0s.WarpDrive.*; - -public class TileEntityParticleBooster extends WarpEnergyTE { - private int ticks = 0; - - @Override - public void updateEntity() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return; - } - super.updateEntity(); - - ticks++; - if (ticks > 20) { - ticks = 0; - - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, Math.max(0, Math.min(10, Math.round((getEnergyStored() * 10) / WarpDriveConfig.PB_MAX_ENERGY_VALUE))), 3); - } - } - - @Override - public void readFromNBT(NBTTagCompound tag) { - super.readFromNBT(tag); - } - - @Override - public void writeToNBT(NBTTagCompound tag) { - super.writeToNBT(tag); - } - - // IEnergySink methods implementation - @Override - public int getMaxEnergyStored() { - return WarpDriveConfig.PB_MAX_ENERGY_VALUE; - } - - @Override - public int getMaxSafeInput() { - return Integer.MAX_VALUE; - } -} diff --git a/src/cr0s/WarpDrive/machines/TileEntityPowerLaser.java b/src/cr0s/WarpDrive/machines/TileEntityPowerLaser.java deleted file mode 100644 index 914f396b..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityPowerLaser.java +++ /dev/null @@ -1,215 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cr0s.WarpDrive.Vector3; -import cr0s.WarpDrive.WarpDrive; -import dan200.computercraft.api.lua.ILuaContext; -import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.api.peripheral.IPeripheral; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.ForgeDirection; - -public class TileEntityPowerLaser extends TileEntityAbstractLaser implements IPeripheral { - Vector3 myVec; - Vector3 reactorVec; - ForgeDirection side = ForgeDirection.UNKNOWN; - TileEntityParticleBooster booster; - TileEntityPowerReactor reactor; - - boolean useLaser = false; - boolean doOnce = false; - - String[] methodArray = { - "energy", - "hasReactor", - "side", - "sendLaser", - "help" - }; - - @Override - public boolean shouldChunkLoad() { - return false; - } - - public TileEntityPowerReactor scanForReactor() { - reactor = null; - TileEntity te; - //I AM ON THE NORTH SIDE - side = ForgeDirection.UNKNOWN; - te = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord + 2); - if (te instanceof TileEntityPowerReactor && worldObj.isAirBlock(xCoord, yCoord, zCoord + 1)) { - side = ForgeDirection.NORTH; - reactor = (TileEntityPowerReactor) te; - } - - //I AM ON THE SOUTH SIDE - te = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord - 2); - if (te instanceof TileEntityPowerReactor && worldObj.isAirBlock(xCoord, yCoord, zCoord - 1)) { - side = ForgeDirection.SOUTH; - reactor = (TileEntityPowerReactor) te; - } - - //I AM ON THE WEST SIDE - te = worldObj.getBlockTileEntity(xCoord + 2, yCoord, zCoord); - if (te instanceof TileEntityPowerReactor && worldObj.isAirBlock(xCoord + 1, yCoord, zCoord)) { - side = ForgeDirection.WEST; - reactor = (TileEntityPowerReactor) te; - } - - //I AM ON THE EAST SIDE - te = worldObj.getBlockTileEntity(xCoord - 2, yCoord, zCoord); - if (te instanceof TileEntityPowerReactor && worldObj.isAirBlock(xCoord - 1, yCoord, zCoord)) { - side = ForgeDirection.EAST; - reactor = (TileEntityPowerReactor) te; - } - - setMetadata(); - - if (reactor != null) { - reactorVec = new Vector3(reactor).translate(0.5); - } - return reactor; - } - - private void setMetadata() { - int meta = 0; - if(side != ForgeDirection.UNKNOWN) { - meta = side.ordinal() - 1; - } - //WarpDrive.debugPrint("META:" + meta); - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, meta, 3); - } - - public TileEntityParticleBooster scanForBooster() { - booster = null; - TileEntity te; - te = worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord); - if (te != null && te instanceof TileEntityParticleBooster) { - booster = (TileEntityParticleBooster)te; - } - - te = worldObj.getBlockTileEntity(xCoord, yCoord - 1, zCoord); - if (te != null && te instanceof TileEntityParticleBooster) { - booster = (TileEntityParticleBooster)te; - } - - return booster; - } - - @Override - public void updateEntity() { - if (doOnce == false) { - scanForReactor(); - scanForBooster(); - myVec = new Vector3(this).translate(0.5); - doOnce = true; - } - - if (useLaser == true) { - WarpDrive.sendLaserPacket(worldObj, myVec, reactorVec, 0.1F, 0.2F, 1.0F, 25, 50, 100); - useLaser = false; - } - } - - public void unlink() { - side = ForgeDirection.UNKNOWN; - setMetadata(); - } - - public void updateNeighbours() { - scanForBooster(); - scanForReactor(); - } - - private void laserReactor(int amount) { - if (amount <= 0) { - return; - } - - scanForBooster(); - scanForReactor(); - if(booster == null) - return; - if(reactor == null) - return; - if (booster.consumeEnergy(amount, false)) { - // WarpDrive.debugPrint("ReactorLaser on " + side.toString() +" side sending " + amount); - useLaser = true; - reactor.decreaseInstability(side, (int)(amount * this.RF_PER_INTERNAL)); - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - } - - @Override - public String getType() { - return "warpdriveReactorLaser"; - } - - @Override - public String[] getMethodNames() { - return methodArray; - } - - private static String helpStr(Object[] args) { - if (args.length > 0) { - String arg = args[0].toString().toLowerCase(); - if (arg.equals("energy")) { - return WarpDrive.defEnergyStr; - } else if(arg.equals("hasReactor")) { - return "hasReactor(): returns true if the laser can see a reactor and false otherwise"; - } else if(arg.equals("sendlaser")) { - return "sendLaser(int): sends a laser of energy int to the reactor"; - } else if(arg.equals("side")) { - return "side(): returns 0-3 depending on which side of the reactor its on"; - } - } - return WarpDrive.defHelpStr; - } - - @Override - public Object[] callMethod(IComputerAccess computer, ILuaContext context,int methodID, Object[] arguments) throws Exception { - String method = methodArray[methodID]; - if (method.equals("energy")) { - scanForBooster(); - if (booster == null) { - return new Object[] { 0,0 }; - } else { - return new Object[] { booster.getEnergyStored(), booster.getMaxEnergyStored() }; - } - } else if (method.equals("hasReactor")) { - return new Object[] { scanForReactor() != null }; - } else if (method.equals("sendLaser")) { - if (arguments.length >= 1) { - laserReactor(toInt(arguments[0])); - } - } else if(method.equals("help")) { - return new Object[] {helpStr(arguments)}; - } else if(method.equals("side")) { - return new Object[] { side.ordinal() - 2 }; - } - return null; - } - - @Override - public void attach(IComputerAccess computer) { - } - - @Override - public void detach(IComputerAccess computer) { - } - - @Override - public boolean equals(IPeripheral other) { - return other == this; - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/TileEntityPowerReactor.java b/src/cr0s/WarpDrive/machines/TileEntityPowerReactor.java deleted file mode 100644 index 03740d74..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityPowerReactor.java +++ /dev/null @@ -1,599 +0,0 @@ -package cr0s.WarpDrive.machines; - -import java.util.HashMap; -import java.util.Random; -import java.util.Set; - -import cofh.api.energy.IEnergyHandler; -import cpw.mods.fml.common.FMLCommonHandler; -import cr0s.WarpDrive.WarpDrive; -import cr0s.WarpDrive.WarpDriveConfig; -import dan200.computercraft.api.lua.ILuaContext; -import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.api.peripheral.IPeripheral; -import net.minecraft.entity.Entity; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.ForgeDirection; - -public class TileEntityPowerReactor extends WarpEnergyTE implements IPeripheral { - private int containedEnergy = 0; - private static int tickTime; - private static int maxLasers; - private static int minGen; - - private int tickCount = 0; - - private double[] instabilityValues = new double[4]; // no instability = 0, explosion = 100 - private int lasersReceived = 0; - private int lastGenerationRate = 0; - private int releasedThisTick = 0; // amount of energy released during current tick update - private int releasedThisCycle = 0; // amount of energy released during current cycle - private int releasedLastCycle = 0; - - private boolean hold = true; // hold updates and power output until reactor is controlled (i.e. don't explode on chunk-loading while computer is booting) - private boolean active = false; - private static final int MODE_DONT_RELEASE = 0; - private static final int MODE_MANUAL_RELEASE = 1; - private static final int MODE_RELEASE_ABOVE = 2; - private static final int MODE_RELEASE_AT_RATE = 3; - private static final String[] MODE_STRING = {"OFF", "MANUAL", "ABOVE", "RATE"}; - private int releaseMode = 0; - private int releaseRate = 0; - private int releaseAbove = 0; - - private boolean init = false; - - IEnergyHandler aboveConnection; - IEnergyHandler belowConnection; - - private String[] methodArray = { - "getActive", - "setActive", // boolean - "energy", // returns energy, maxenergy - "instability", // returns ins0,1,2,3 - "release", // releases all energy - "releaseRate", // releases energy when more than arg0 is produced - "releaseAbove", // releases any energy above arg0 amount - "help" // returns help on arg0 function - }; - private HashMap connectedComputers = new HashMap(); - - { - for(int i = 0; i < 4; i++) { - instabilityValues[i] = 0; - } - - tickTime = WarpDriveConfig.PR_TICK_TIME; - maxLasers = WarpDriveConfig.PR_MAX_LASERS; - minGen = 4; - } - - private void increaseInstability(ForgeDirection from, boolean isNatural) { - if (canInterface(from) || hold) { - return; - } - - int side = from.ordinal() - 2; - if (containedEnergy > tickTime * minGen) { - double amountToIncrease = tickTime * Math.max(0.005D, Math.pow(worldObj.rand.nextDouble() * (containedEnergy / 4), 0.1) * 0.1); - //WarpDrive.debugPrint("InsInc" + amountToIncrease); - instabilityValues[side] += amountToIncrease * (isNatural ? 1.0D : 0.25D); - } else { - double amountToDecrease = tickTime * Math.max(0.005D, instabilityValues[side] * 0.02D); - instabilityValues[side] = Math.max(0.0D, instabilityValues[side] - amountToDecrease); - } - } - - private void increaseInstability(boolean isNatural) { - increaseInstability(ForgeDirection.NORTH, isNatural); - increaseInstability(ForgeDirection.SOUTH, isNatural); - increaseInstability(ForgeDirection.EAST, isNatural); - increaseInstability(ForgeDirection.WEST, isNatural); - } - - public void decreaseInstability(ForgeDirection from, int amount) { - if (canInterface(from)) { - return; - } - - // laser is active => start updating reactor - hold = false; - - if (amount <= 1) { - return; - } - - lasersReceived++; - - if (lasersReceived <= maxLasers) { - double consumeRateIncrease = 1 + Math.pow(Math.E, lastGenerationRate / 63095); // FIXME Math.pow(this.getMaxEnergyStored(), 0.6D) - double randomVariation = 0.4 + worldObj.rand.nextDouble(); - double amountToRemove = Math.min(Math.pow(amount * randomVariation, (1.0 / 3)) * consumeRateIncrease, 75); - int side = from.ordinal() - 2; - // WarpDrive.debugPrint("Instability on " + from.toString() + " decreased by " + String.format("%.1f", amountToRemove) + " after consumming " + amount); - instabilityValues[side] = Math.max(0, instabilityValues[side] - amountToRemove); - } else { - WarpDrive.debugPrint("Too many lasers received, instability increasing..."); - increaseInstability(from, false); - increaseInstability(false); - } - updateSideTextures(); - } - - public void generateEnergy() { - double stabilityOffset = 0.5; - for(int i = 0; i < 4; i++) { - stabilityOffset *= Math.max(0.01D, instabilityValues[i] / 100.0D); - } - - //WarpDrive.debugPrint("INSOFF" + stabilityOffset); - - if (active) {// producing, instability increase output, you want to take the risk - int amountToGenerate = (int)( tickTime * (0.5D + stabilityOffset) * (minGen + Math.ceil(Math.pow(containedEnergy, 0.6D))) ); - containedEnergy = Math.min(containedEnergy + amountToGenerate, getMaxEnergyStored()); - lastGenerationRate = amountToGenerate / tickTime; - } else {// decaying over 20s without producing power, you better have power for those lasers - int amountToDecay = (int)( tickTime * (1.0D - stabilityOffset) * (minGen + containedEnergy * 0.01D) ); - containedEnergy = Math.max(0, containedEnergy - amountToDecay); - lastGenerationRate = 0; - } - } - - @Override - public void updateEntity() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return; - } - super.updateEntity(); - - outputPower(); - releasedThisTick = 0; - - tickCount++; - if (tickCount % tickTime != 0) { - return; - } - tickCount = 0; - releasedLastCycle = releasedThisCycle; - releasedThisCycle = 0; - - if (!init) { - init = true; - updateNeighbours(); - } - - if (!active) { - lasersReceived = Math.max(0, lasersReceived - 2); - } else { - lasersReceived = 0; - } - updateSideTextures(); - - // unstable at all time - if (shouldExplode()) { - explode(); - } - increaseInstability(true); - - generateEnergy(); - - sendEvent("reactorPulse", new Object[] { lastGenerationRate }); - } - - private void explode() { - // remove blocks randomly up to 6 blocks around (breaking whatever protection is there) - int radius = (int) Math.floor(0.6D * Math.pow(containedEnergy, 0.125)); - WarpDrive.debugPrint(this + " Explosion radius: " + radius); - if (radius > 1) { - double c = 0.05 * Math.pow(containedEnergy, 0.125); // chance of a block being destroyed (ranges from 0.5 to 0.05) - WarpDrive.debugPrint(this + " Chance of removal: " + c); - for(int x = xCoord - radius; x < xCoord + radius; x++) { - for(int y = yCoord - radius; y < yCoord + radius; y++) { - for(int z = zCoord - radius; z < zCoord + radius; z++) { - if (z != zCoord || y != yCoord || x != xCoord) { - if (worldObj.rand.nextDouble() < c) { - worldObj.setBlockToAir(x, y, z); - } - } - } - } - } - } - // remove reactor - worldObj.setBlockToAir(xCoord, yCoord, zCoord); - // set a few TnT augmented around reactor - for (int i = 0; i < 3; i++) { - worldObj.newExplosion((Entity) null, - xCoord + worldObj.rand.nextInt(3) - 0.5D, - yCoord + worldObj.rand.nextInt(3) - 0.5D, - zCoord + worldObj.rand.nextInt(3) - 0.5D, - 4.0F + worldObj.rand.nextInt(3), - true, true); - } - } - - private void updateSideTextures() { - double maxInstability = 0.0D; - for (Double ins:instabilityValues) { - if (ins > maxInstability) { - maxInstability = ins; - } - } - int instabilityNibble = (int) Math.max(0, Math.min(3, Math.round( maxInstability / 25.0D))); - int energyNibble = (int) Math.max(0, Math.min(3, Math.round( 4.0D * containedEnergy / getMaxEnergyStored()))); - - int metadata = 4 * instabilityNibble + energyNibble; - // WarpDrive.debugPrint("updateSideTextures " + metadata); - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, metadata, 3); - } - - private boolean shouldExplode() { - boolean exploding = false; - for(int i = 0; i < 4; i++) { - exploding = exploding || (instabilityValues[i] >= 100); - } - - if (exploding) { - active = false; - WarpDrive.debugPrint("EXPLODE!"); - } - return exploding; - } - - //Takes the arguments passed by function call and returns an appropriate string - private static String helpStr(Object[] args) { - if (args.length > 0) { - String arg = args[0].toString().toLowerCase(); - if (arg.equals("getactive")) { - return "getActive(): returns true if the reactor is active and false otherwise"; - } else if (arg.equals("setactive")) { - return "setActive(bool): activates the reactor if passed true and deactivates if passed false"; - } else if (arg.equals("energy")) { - return WarpDrive.defEnergyStr; - } else if (arg.equals("instability")) { - return "instability(): returns the 4 instability values (100 is the point when the reactor explodes)"; - } else if (arg.equals("release")) { - return "release(bool): sets the reactor to output all energy or disables outputting of energy"; - } else if (arg.equals("releaserate")) { - return "releaseRate(int): sets the reactor to try to release exactly int/tick"; - } else if (arg.equals("releaseabove")) { - return "releaseAbove(int): releases all energy above stored int"; - } - } - return WarpDrive.defHelpStr; - } - - public void updateNeighbours() { - TileEntity te; - IEnergyHandler ieh; - te = worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord); - - boolean valid = false; - if (te != null) { - if (te instanceof IEnergyHandler) { - ieh = (IEnergyHandler)te; - if (ieh.canInterface(ForgeDirection.DOWN)) { - aboveConnection = ieh; - valid = true; - } - } - } - if (!valid) { - aboveConnection = null; - } - - valid = false; - te = worldObj.getBlockTileEntity(xCoord, yCoord - 1, zCoord); - if (te != null) { - if (te instanceof IEnergyHandler) { - ieh = (IEnergyHandler)te; - if (ieh.canInterface(ForgeDirection.UP)) { - WarpDrive.debugPrint("a network"); - belowConnection = ieh; - valid = true; - } - } - } - if (!valid) { - belowConnection = null; - } - - int[] xo = { 0, 0,-2, 2}; - int[] zo = { 2,-2, 0, 0}; - - for(int i = 0; i < 4; i++) { - te = worldObj.getBlockTileEntity(xCoord + xo[i], yCoord, zCoord + zo[i]); - if (te instanceof TileEntityPowerLaser) { - ((TileEntityPowerLaser)te).scanForReactor(); - } - } - } - - private void outputPower(IEnergyHandler ieh, ForgeDirection dir) { - int potentialRelease = getPotentialReleaseAmount(); - if (potentialRelease > 0) { - int amountToDump = ieh.receiveEnergy(dir, potentialRelease, true); - if (amountToDump > 0) { - int dumped = ieh.receiveEnergy(dir, amountToDump, false); - containedEnergy -= dumped; - releasedThisTick += dumped; - releasedThisCycle += dumped; - // WarpDrive.debugPrint(this + " outputed " + dumped + " RF, down to " + containedEnergy); - } - } - } - - private void outputPower() { - if (aboveConnection != null) { - outputPower(aboveConnection, ForgeDirection.DOWN); - } - - if (belowConnection != null) { - outputPower(belowConnection, ForgeDirection.UP); - } - } - - //COMPUTER INTERFACES - @Override - public String getType() { - return "warpdriveReactor"; - } - - @Override - public String[] getMethodNames() { - return methodArray; - } - - @Override - public void attach(IComputerAccess computer) { - int id = computer.getID(); - connectedComputers.put(id, computer); - } - - @Override - public void detach(IComputerAccess computer) { - int id = computer.getID(); - if (connectedComputers.containsKey(id)) { - connectedComputers.remove(id); - } - } - - @Override - public boolean equals(IPeripheral other) { - return other == this; - } - - @Override - public Object[] callMethod(IComputerAccess computer, ILuaContext context, int methodID, Object[] arguments) throws Exception { - if (methodID < 0 || methodID >= methodArray.length) { - return null; - } - - // computer is alive => start updating reactor - hold = false; - - String methodName = methodArray[methodID]; - - if (methodName.equals("getActive")) { - if (releaseMode == MODE_DONT_RELEASE || releaseMode == MODE_MANUAL_RELEASE) { - return new Object[] { active, MODE_STRING[releaseMode], 0 }; - } else if (releaseMode == MODE_RELEASE_ABOVE) { - return new Object[] { active, MODE_STRING[releaseMode], releaseAbove }; - } else { - return new Object[] { active, MODE_STRING[releaseMode], releaseRate }; - } - } else if (methodName.equals("setActive")) { - boolean activate = false; - try { - activate = toBool(arguments[0]); - } catch(Exception e) { - throw new Exception("Function expects an boolean value"); - } - if (active && !activate) { - sendEvent("reactorDeactivation", null); - } else if(!active && activate) { - sendEvent("reactorActivation", null); - } - active = activate; - } else if (methodName.equals("energy")) { - return new Object[] { containedEnergy, getMaxEnergyStored(), releasedLastCycle / tickTime, aboveConnection != null, belowConnection != null }; - } else if (methodName.equals("instability")) { - Object[] retVal = new Object[4]; - for(int i = 0; i < 4; i++) { - retVal[i] = instabilityValues[i]; - } - return retVal; - } else if(methodName.equals("release")) { - boolean doRelease = false; - if (arguments.length > 0) { - try { - doRelease = toBool(arguments[0]); - } catch(Exception e) { - throw new Exception("Function expects an boolean value"); - } - - releaseMode = doRelease ? MODE_MANUAL_RELEASE : MODE_DONT_RELEASE; - releaseAbove = 0; - releaseRate = 0; - } - return new Object[] { releaseMode != MODE_DONT_RELEASE }; - } else if(methodName.equals("releaseRate")) { - int rate = -1; - try { - rate = toInt(arguments[0]); - } catch(Exception e) { - throw new Exception("Function expects an integer value"); - } - - if (rate <= 0) { - releaseMode = MODE_DONT_RELEASE; - releaseRate = 0; - } else { -/* releaseAbove = (int)Math.ceil(Math.pow(rate, 1.0 / 0.6)); - WarpDrive.debugPrint("releaseAbove " + releaseAbove); - releaseMode = MODE_RELEASE_ABOVE;/**/ - // player has to adjust it - releaseRate = rate; - releaseMode = MODE_RELEASE_AT_RATE; - } - - return new Object[] { MODE_STRING[releaseMode], releaseRate }; - } else if(methodName.equals("releaseAbove")) { - int above = -1; - try { - above = toInt(arguments[0]); - } catch(Exception e) { - throw new Exception("Function expects an integer value"); - } - - if (above <= 0) { - releaseMode = 0; - releaseAbove = MODE_DONT_RELEASE; - } else { - releaseMode = MODE_RELEASE_ABOVE; - releaseAbove = above; - } - - return new Object[] { MODE_STRING[releaseMode], releaseAbove }; - } else if (methodName.equals("debugLaser")) { - //WarpDrive.debugPrint("debugMethod"); - int side = toInt(arguments[0]); - int amount = toInt(arguments[1]); - - ForgeDirection d; - if (side == 0) { - d = ForgeDirection.NORTH; - } else if (side == 1) { - d = ForgeDirection.SOUTH; - } else if (side == 2) { - d = ForgeDirection.WEST; - } else if (side == 3) { - d = ForgeDirection.EAST; - } else { - d = ForgeDirection.UP; - } - - if (amount < containedEnergy) { - containedEnergy -= amount; - decreaseInstability(d,amount); - } - } else if (methodName.equals("help")) { - return new Object[] { helpStr(arguments) }; - } - - return null; - } - - private void sendEvent(String eventName, Object[] arguments) { - // WarpDrive.debugPrint("" + this + " Sending event '" + eventName + "'"); - Set keys = connectedComputers.keySet(); - for(Integer key:keys) { - IComputerAccess comp = connectedComputers.get(key); - comp.queueEvent(eventName, arguments); - } - } - - //POWER INTERFACES - @Override - public boolean canInterface(ForgeDirection from) { - if(from.equals(ForgeDirection.UP) || from.equals(ForgeDirection.DOWN)) { - return true; - } - return false; - } - - private int getPotentialReleaseAmount() { - if (hold) {// still loading/booting => hold output - return 0; - } - int capacity = Math.max(0, 2 * lastGenerationRate - releasedThisTick); - if (releaseMode == MODE_MANUAL_RELEASE) { - return Math.min(Math.max(0, containedEnergy ), capacity); - } else if (releaseMode == MODE_RELEASE_ABOVE) { - return Math.min(Math.max(0, containedEnergy - releaseAbove), capacity); - } else if (releaseMode == MODE_RELEASE_AT_RATE) { - int remainingRate = Math.max(0, releaseRate - releasedThisTick); - return Math.min(Math.max(0, containedEnergy ), Math.min(remainingRate, capacity)); - } - return 0; - } - - @Override - public int receiveEnergy(ForgeDirection from, int amount, boolean sim) { - return 0; - } - - @Override - public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) { - int dumped; - if (!canInterface(from)) { - return 0; - } - - dumped = Math.min(maxExtract, getPotentialReleaseAmount()); - if (!simulate) { - releasedThisTick += dumped; - releasedThisCycle += dumped; - containedEnergy = Math.max(0, containedEnergy - dumped); - // WarpDrive.debugPrint(this + " extracted " + dumped + " RF, down to " + containedEnergy); - } - - return dumped; - } - - @Override - public int getEnergyStored() { - return containedEnergy; - } - - @Override - public int getEnergyStored(ForgeDirection from) { - if (canInterface(from)) { - return getEnergyStored(); - } - return 0; - } - - @Override - public int getMaxEnergyStored() { - return WarpDriveConfig.PR_MAX_ENERGY; - } - - @Override - public int getMaxEnergyStored(ForgeDirection from) { - if (canInterface(from)) { - return getMaxEnergyStored(); - } - return 0; - } - - //NBT INTERFACES - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setInteger("energy", containedEnergy); - nbt.setInteger("releaseMode", releaseMode); - nbt.setInteger("releaseRate", releaseRate); - nbt.setInteger("releaseAbove", releaseAbove); - nbt.setDouble("i0", instabilityValues[0]); - nbt.setDouble("i1", instabilityValues[1]); - nbt.setDouble("i2", instabilityValues[2]); - nbt.setDouble("i3", instabilityValues[3]); - nbt.setBoolean("active", active); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - containedEnergy = nbt.getInteger("energy"); - releaseMode = nbt.getInteger("releaseMode"); - releaseRate = nbt.getInteger("releaseRate"); - releaseAbove = nbt.getInteger("releaseAbove"); - instabilityValues[0] = nbt.getDouble("i0"); - instabilityValues[1] = nbt.getDouble("i1"); - instabilityValues[2] = nbt.getDouble("i2"); - instabilityValues[3] = nbt.getDouble("i3"); - active = nbt.getBoolean("active"); - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/TileEntityProtocol.java b/src/cr0s/WarpDrive/machines/TileEntityProtocol.java deleted file mode 100644 index 6d8dc968..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityProtocol.java +++ /dev/null @@ -1,670 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import dan200.computercraft.api.ComputerCraftAPI; -import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.api.lua.ILuaContext; -import dan200.computercraft.api.peripheral.IPeripheral; - -import java.util.ArrayList; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.DamageSource; -import cr0s.WarpDrive.*; - -/** - * Protocol block tile entity - * @author Cr0s - */ -public class TileEntityProtocol extends TileEntity implements IPeripheral -{ - // Variables - private int distance = 0; - private int direction = 0; - private int mode = 0; - - private boolean jumpFlag = false; - private boolean summonFlag = false; - private String toSummon = ""; - - private String targetJumpgateName = ""; - - // Gabarits - private int front, right, up; - private int back, left, down; - - // Player attaching - public ArrayList players = new ArrayList(); - public String playersString = ""; - - private String beaconFrequency = ""; - - boolean ready = false; // Ready to operate (valid assembly) - - public String[] methodsArray = { - "dim_getp", "dim_setp", // 0, 1 - "dim_getn", "dim_setn", // 2, 3 - "set_mode", "set_distance", "set_direction", // 4, 5, 6 - "get_attached_players", "summon", "summon_all", // 7, 8, 9 - "get_x", "get_y", "get_z", // 10, 11, 12 - "get_energy_level", "do_jump", "get_ship_size", // 13, 14, 15 - "set_beacon_frequency", "get_dx", "get_dz", // 16, 17, 18 - "set_core_frequency", "is_in_space", "is_in_hyperspace", // 19, 20, 21 - "set_target_jumpgate", // 22 - "isAttached" // 23 - }; - - private int ticks = 0; - private final int BLOCK_UPDATE_INTERVAL = 20 * 3; // 3 seconds - - private TileEntityReactor core = null; - - @Override - public void updateEntity() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return; - } - - if (++ticks >= BLOCK_UPDATE_INTERVAL) { - core = findCoreBlock(); - if (core != null) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, mode, 1 + 2); // Activated - } else { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 1 + 2); // Inactive - } - - ticks = 0; - } - } - - private void setJumpDistance(int distance) { - System.out.println("Setting jump distance: " + distance); - this.distance = distance; - } - - private void setMode(int mode) { - // System.out.println("Setting mode: " + mode); - this.mode = mode; - } - - private void setDirection(int dir) { - if (dir == 1) { - this.direction = -1; - } else if (dir == 2) { - this.direction = -2; - } else if (dir == 255) { - this.direction = 270; - } else { - this.direction = dir; - } - //WarpDrive.debugPrint("" + this + " Direction set to " + this.direction); - } - - private void doJump() { - if (core != null) { - // Adding random ticks to warmup - core.randomWarmupAddition = worldObj.rand.nextInt(WarpDriveConfig.WC_WARMUP_RANDOM_TICKS); - } else { - WarpDrive.debugPrint("" + this + " doJump without a core"); - } - - setJumpFlag(true); - } - - @Override - public void readFromNBT(NBTTagCompound tag) { - super.readFromNBT(tag); - setMode(tag.getInteger("mode")); - setFront(tag.getInteger("front")); - setRight(tag.getInteger("right")); - setUp(tag.getInteger("up")); - setBack(tag.getInteger("back")); - setLeft(tag.getInteger("left")); - setDown(tag.getInteger("down")); - setDistance(tag.getInteger("distance")); - setDirection(tag.getInteger("direction")); - playersString = tag.getString("players"); - updatePlayersList(); - setBeaconFrequency(tag.getString("bfreq")); - } - - @Override - public void writeToNBT(NBTTagCompound tag) { - super.writeToNBT(tag); - updatePlayersString(); - tag.setString("players", playersString); - tag.setInteger("mode", this.mode); - tag.setInteger("front", this.front); - tag.setInteger("right", this.right); - tag.setInteger("up", this.up); - tag.setInteger("back", this.back); - tag.setInteger("left", this.left); - tag.setInteger("down", this.down); - tag.setInteger("distance", this.distance); - tag.setInteger("direction", this.direction); - tag.setString("bfreq", getBeaconFrequency()); - // FIXME: shouldn't we save boolean jumpFlag, boolean summonFlag, String toSummon, String targetJumpgateName? - } - - public void attachPlayer(EntityPlayer entityPlayer) { - for (int i = 0; i < players.size(); i++) { - String nick = players.get(i); - - if (entityPlayer.username.equals(nick)) { - entityPlayer.addChatMessage(getBlockType().getLocalizedName() + " Detached."); - players.remove(i); - return; - } - } - - entityPlayer.attackEntityFrom(DamageSource.generic, 1); - players.add(entityPlayer.username); - updatePlayersString(); - entityPlayer.addChatMessage(getBlockType().getLocalizedName() + " Successfully attached."); - } - - public void updatePlayersString() { - String nick; - this.playersString = ""; - - for (int i = 0; i < players.size(); i++) { - nick = players.get(i); - this.playersString += nick + "|"; - } - } - - public void updatePlayersList() { - String[] playersArray = playersString.split("\\|"); - - for (int i = 0; i < playersArray.length; i++) { - String nick = playersArray[i]; - - if (!nick.isEmpty()) { - players.add(nick); - } - } - } - - public String getAttachedPlayersList() { - StringBuilder list = new StringBuilder(""); - - for (int i = 0; i < this.players.size(); i++) { - String nick = this.players.get(i); - list.append(nick + ((i == this.players.size() - 1) ? "" : ", ")); - } - - if (players.isEmpty()) { - list = new StringBuilder(""); - } - - return list.toString(); - } - - /** - * @return the jumpFlag - */ - public boolean isJumpFlag() { - return jumpFlag; - } - - /** - * @param jumpFlag the jumpFlag to set - */ - public void setJumpFlag(boolean jumpFlag) { - WarpDrive.debugPrint("" + this + " setJumpFlag(" + jumpFlag + ")"); - this.jumpFlag = jumpFlag; - } - - /** - * @return the front - */ - public int getFront() { - return front; - } - - /** - * @param front the front to set - */ - public void setFront(int front) { - this.front = front; - } - - /** - * @return the right - */ - public int getRight() { - return right; - } - - /** - * @param right the right to set - */ - public void setRight(int right) { - this.right = right; - } - - /** - * @return the up - */ - public int getUp() { - return up; - } - - /** - * @param up the up to set - */ - public void setUp(int up) { - this.up = up; - } - - /** - * @return the back - */ - public int getBack() { - return back; - } - - /** - * @param back the back to set - */ - public void setBack(int back) { - this.back = back; - } - - /** - * @return the left - */ - public int getLeft() { - return left; - } - - /** - * @param left the left to set - */ - public void setLeft(int left) { - this.left = left; - } - - /** - * @return the down - */ - public int getDown() { - return down; - } - - /** - * @param down the down to set - */ - public void setDown(int down) { - this.down = down; - } - - public void setDistance(int distance) { - this.distance = distance; - } - - public int getDistance() - { - return this.distance; - } - - /** - * @return the mode - */ - public int getMode() { - return mode; - } - - /** - * @return the direction - */ - public int getDirection() { - return direction; - } - - /** - * @return the summonFlag - */ - public boolean isSummonAllFlag() { - return summonFlag; - } - - /** - * @param summonFlag the summonFlag to set - */ - public void setSummonAllFlag(boolean summonFlag) { - this.summonFlag = summonFlag; - } - - @Override - public String getType() { - return "warpcore"; - } - - @Override - public String[] getMethodNames() { - return methodsArray; - } - - @Override - public void attach(IComputerAccess computer) { - computer.mount("/warpcontroller", ComputerCraftAPI.createResourceMount(WarpDrive.class, "warpdrive", "lua/warpcontroller")); - computer.mount("/startup", ComputerCraftAPI.createResourceMount(WarpDrive.class, "warpdrive", "lua/warpcontroller/startup")); - } - - @Override - public void detach(IComputerAccess computer) { - } - - /** - * @return the toSummon - */ - public String getToSummon() { - return toSummon; - } - - /** - * @param toSummon the toSummon to set - */ - public void setToSummon(String toSummon) { - this.toSummon = toSummon; - } - - /** - * @return the beaconFrequency - */ - public String getBeaconFrequency() { - return beaconFrequency; - } - - /** - * @param beaconFrequency the beaconFrequency to set - */ - public void setBeaconFrequency(String beaconFrequency) { - //WarpDrive.debugPrint("Setting beacon frequency: " + beaconFrequency); - this.beaconFrequency = beaconFrequency; - } - - private TileEntityReactor findCoreBlock() { - TileEntity te; - - te = worldObj.getBlockTileEntity(xCoord + 1, yCoord, zCoord); - if (te != null && te instanceof TileEntityReactor) { - return (TileEntityReactor)te; - } - - te = worldObj.getBlockTileEntity(xCoord - 1, yCoord, zCoord); - if (te != null && te instanceof TileEntityReactor) { - return (TileEntityReactor)te; - } - - te = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord + 1); - if (te != null && te instanceof TileEntityReactor) { - return (TileEntityReactor)te; - } - - te = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord - 1); - if (te != null && te instanceof TileEntityReactor) { - return (TileEntityReactor)te; - } - - return null; - } - - @Override - public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception { - int argInt0, argInt1, argInt2; - //WarpDrive.debugPrint("[ProtoBlock] Method " + method + " " + methodsArray[method] + " called!"); - switch (method) { - case 0: // dim_getp () - return new Integer[] { getFront(), getRight(), getUp() }; - - case 1: // dim_setp (front, right, up) - if (arguments.length != 3) { - return new Integer[] { -1 }; - } - try { - argInt0 = ((Double)arguments[0]).intValue(); - argInt1 = ((Double)arguments[1]).intValue(); - argInt2 = ((Double)arguments[2]).intValue(); - } catch(Exception e) { - return new Integer[] { -1 }; - } - if (argInt0 < 0 || argInt1 < 0 || argInt2 < 0) { - return new Integer[] { -1 }; - } - - System.out.println("Setting positive gabarits: f: " + argInt0 + " r: " + argInt1 + " u: " + argInt2); - setFront(((Double)arguments[0]).intValue()); - setRight(((Double)arguments[1]).intValue()); - setUp(((Double)arguments[2]).intValue()); - WarpDrive.instance.warpCores.removeDeadCores(); - break; - - case 2: // dim_getn () - return new Integer[] { getBack(), getLeft(), getDown() }; - - case 3: // dim_setn (back, left, down) - if (arguments.length != 3) { - return new Integer[] { -1 }; - } - try { - argInt0 = ((Double)arguments[0]).intValue(); - argInt1 = ((Double)arguments[1]).intValue(); - argInt2 = ((Double)arguments[2]).intValue(); - } catch(Exception e) { - return new Integer[] { -1 }; - } - if (argInt0 < 0 || argInt1 < 0 || argInt2 < 0) { - return new Integer[] { -1 }; - } - - System.out.println("Setting negative gabarits: b: " + argInt0 + " l: " + argInt1 + " d: " + argInt2); - setBack(argInt0); - setLeft(argInt1); - setDown(argInt2); - WarpDrive.instance.warpCores.removeDeadCores(); - break; - - case 4: // set_mode (mode) - if (arguments.length != 1) { - return new Integer[] { -1 }; - } - try { - argInt0 = ((Double)arguments[0]).intValue(); - } catch(Exception e) { - return new Integer[] { -1 }; - } - - setMode(argInt0); - break; - - case 5: // set_distance (distance) - if (arguments.length != 1) { - return new Integer[] { -1 }; - } - try { - argInt0 = ((Double)arguments[0]).intValue(); - } catch(Exception e) { - return new Integer[] { -1 }; - } - - setJumpDistance(argInt0); - break; - - case 6: // set_direction (dir) - if (arguments.length != 1) { - return new Integer[] { -1 }; - } - try { - argInt0 = ((Double)arguments[0]).intValue(); - } catch(Exception e) { - return new Integer[] { -1 }; - } - - setDirection(argInt0); - break; - - case 7: // get_attached_players - String list = ""; - - for (int i = 0; i < this.players.size(); i++) { - String nick = this.players.get(i); - list += nick + ((i == this.players.size() - 1) ? "" : ","); - } - - if (players.isEmpty()) { - list = ""; - } - - return new Object[] { list }; - - case 8: // summon - if (arguments.length != 1) { - return new Integer[] { -1 }; - } - try { - argInt0 = ((Double)arguments[0]).intValue(); - } catch(Exception e) { - return new Integer[] { -1 }; - } - - if (argInt0 >= 0 && argInt0 < players.size()) { - setToSummon(players.get(argInt0)); - } - break; - - case 9: // summon_all - this.setSummonAllFlag(true); - break; - - case 10: // get_x - if (core == null) { - return null; - } - - return new Object[] { core.xCoord }; - - case 11: // get_y - if (core == null) { - return null; - } - - return new Object[] { core.yCoord }; - - case 12: // get_z - if (core == null) { - return null; - } - - return new Object[] { core.zCoord }; - - case 13: // get_energy_value - if (core == null) { - return null; - } - - return new Object[] { (core.getEnergyStored() ) }; - - case 14: // do_jump - doJump(); - break; - - case 15: // get_ship_size - if (core != null) { - StringBuilder reason = new StringBuilder(); - try { - if (!core.validateShipSpatialParameters(reason)) { - core.messageToAllPlayersOnShip(reason.toString()); - return null; - } - return new Object[] { core.shipVolume }; - } catch(Exception e) { - if (WarpDriveConfig.debugMode) { - e.printStackTrace(); - } - return null; - } - } - break; - - case 16: // set_beacon_frequency - if (arguments.length != 1) { - return new Integer[] { -1 }; - } - - setBeaconFrequency((String)arguments[0]); - break; - - case 17: // get_dx - if (core != null) { - return new Object[] { core.dx }; - } - break; - - case 18: // get_dz - if (core != null) { - return new Object[] { core.dz }; - } - break; - - case 19: // set_core_frequency - if (arguments.length == 1 && (core != null)) { - core.coreFrequency = ((String)arguments[0]).replace("/", "").replace(".", "").replace("\\", "."); - } - break; - - case 20: // is_in_space - return new Boolean[] { worldObj.provider.dimensionId == WarpDriveConfig.G_SPACE_DIMENSION_ID }; - - case 21: // is_in_hyperspace - return new Boolean[] { worldObj.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID }; - - case 22: // set_target_jumpgate - if (arguments.length == 1) { - setTargetJumpgateName((String)arguments[0]); - } - break; - - case 23: // isAttached - if (core != null) { - return new Object[] { (boolean)(core.controller != null) }; - } - break; - } - - return new Integer[] { 0 }; - } - - /** - * @return the targetJumpgateName - */ - public String getTargetJumpgateName() - { - return targetJumpgateName; - } - - /** - * @param targetJumpgateName the targetJumpgateName to set - */ - public void setTargetJumpgateName(String targetJumpgateName) - { - this.targetJumpgateName = targetJumpgateName; - } - - @Override - public boolean equals(IPeripheral other) { - return other == this; - } - - @Override - public String toString() { - return String.format("%s \'%s\' @ \'%s\' %d, %d, %d", new Object[] { - getClass().getSimpleName(), - core == null ? beaconFrequency : core.coreFrequency, - worldObj == null ? "~NULL~" : worldObj.getWorldInfo().getWorldName(), - Integer.valueOf(xCoord), Integer.valueOf(yCoord), Integer.valueOf(zCoord)}); - } -} diff --git a/src/cr0s/WarpDrive/machines/TileEntityRadar.java b/src/cr0s/WarpDrive/machines/TileEntityRadar.java deleted file mode 100644 index 8977268b..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityRadar.java +++ /dev/null @@ -1,174 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import dan200.computercraft.api.ComputerCraftAPI; -import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.api.lua.ILuaContext; -import dan200.computercraft.api.peripheral.IPeripheral; - -import java.util.ArrayList; - -import net.minecraft.nbt.NBTTagCompound; -import cr0s.WarpDrive.*; - -public class TileEntityRadar extends WarpEnergyTE implements IPeripheral { - private String[] methodsArray = - { - "scanRay", // 0 - "scanRadius", // 1 - "getResultsCount", // 2 - "getResult", // 3 - "getEnergyLevel", // 4 - "pos" // 5 - }; - - private ArrayList results; - - private int scanRadius = 0; - private int cooldownTime = 0; - - @Override - public void updateEntity() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return; - } - super.updateEntity(); - - try { - if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) == 2) { - cooldownTime++; - if (cooldownTime > (20 * ((scanRadius / 1000) + 1))) { - WarpDrive.debugPrint("" + this + " Scanning over " + scanRadius + " radius..."); - WarpDrive.instance.warpCores.removeDeadCores(); - results = WarpDrive.instance.warpCores.searchWarpCoresInRadius(xCoord, yCoord, zCoord, scanRadius); - WarpDrive.debugPrint("" + this + " Scan found " + results.size() + " results"); - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 1 + 2); - cooldownTime = 0; - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public void readFromNBT(NBTTagCompound tag) { - super.readFromNBT(tag); - } - - @Override - public void writeToNBT(NBTTagCompound tag) { - super.writeToNBT(tag); - } - - // IPeripheral methods implementation - @Override - public String getType() { - return "radar"; - } - - @Override - public String[] getMethodNames() { - return methodsArray; - } - - @Override - public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception { - switch (method) { - case 0: // scanRay (toX, toY, toZ) - return new Object[] { -1 }; - - case 1: // scanRadius (radius) - if (arguments.length != 1) { - return new Boolean[] { false }; - } - int radius; - try { - radius = ((Double)arguments[0]).intValue(); - } catch(Exception e) { - return new Boolean[] { false }; - } - - if (radius <= 0 || radius > 10000) { - scanRadius = 0; - results = null; - return new Boolean[] { false }; - } - if (!consumeEnergy(Math.max(radius, 100) * Math.max(radius, 100), false)) { - results = null; - return new Boolean[] { false }; - } - - // Begin searching - scanRadius = radius; - cooldownTime = 0; - results = null; - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 2, 1 + 2); - return new Boolean[] { true }; - - case 2: // getResultsCount - if (results != null) { - return new Integer[] { results.size() }; - } - return new Integer[] { 0 }; - - case 3: // getResult - if (arguments.length == 1 && (results != null)) { - int index; - try { - index = ((Double)arguments[0]).intValue(); - } catch(Exception e) { - return new Object[] { "FAIL", 0, 0, 0 }; - } - if (index >= 0 && index < results.size()) { - TileEntityReactor res = results.get(index); - if (res != null) - { - int yAddition = (res.worldObj.provider.dimensionId == WarpDriveConfig.G_SPACE_DIMENSION_ID) ? 256 : (res.worldObj.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID) ? 512 : 0; - return new Object[] { res.coreFrequency, res.xCoord, res.yCoord + yAddition, res.zCoord }; - } - } - } - return new Object[] { "FAIL", 0, 0, 0 }; - - case 4: // getEnergyLevel - return new Integer[] { getEnergyStored() }; - - case 5: // Pos - return new Integer[] { xCoord, yCoord, zCoord }; - } - - return null; - } - - @Override - public void attach(IComputerAccess computer) { - computer.mount("/radar", ComputerCraftAPI.createResourceMount(WarpDrive.class, "warpdrive", "lua/radar")); - computer.mount("/scan", ComputerCraftAPI.createResourceMount(WarpDrive.class, "warpdrive", "lua/radar/scan")); - computer.mount("/ping", ComputerCraftAPI.createResourceMount(WarpDrive.class, "warpdrive", "lua/radar/ping")); - if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) == 0) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 1 + 2); - } - } - - @Override - public void detach(IComputerAccess computer) { - // worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 1 + 2); - } - - @Override - public int getMaxEnergyStored() { - return WarpDriveConfig.WR_MAX_ENERGY_VALUE; - } - - // IEnergySink methods implementation - @Override - public int getMaxSafeInput() { - return Integer.MAX_VALUE; - } - - @Override - public boolean equals(IPeripheral other) { - return other == this; - } -} diff --git a/src/cr0s/WarpDrive/machines/TileEntityReactor.java b/src/cr0s/WarpDrive/machines/TileEntityReactor.java deleted file mode 100644 index cba74fc3..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityReactor.java +++ /dev/null @@ -1,1082 +0,0 @@ -package cr0s.WarpDrive.machines; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.server.MinecraftServer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityChest; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.MathHelper; -import net.minecraft.world.WorldServer; -import net.minecraftforge.common.DimensionManager; -import cpw.mods.fml.common.FMLCommonHandler; -import cr0s.WarpDrive.*; - -/** - * @author Cr0s - */ -public class TileEntityReactor extends WarpEnergyTE -{ - public Boolean ready; - - public Boolean launchState = false; - - public final int JUMP_UP = -1; - public final int JUMP_DOWN = -2; - int dx, dz; - int direction; - int distance; - - public int maxX, maxY, maxZ; - public int minX, minY, minZ; - - public int shipFront, shipBack; - public int shipLeft, shipRight; - public int shipUp, shipDown; - public int shipLength; - public int shipVolume; - private int currentMode = 0; - - private static final byte MODE_TELEPORT = 3; -// private static final byte MODE_IDLE = 0; - private static final byte MODE_BASIC_JUMP = 1; // 0-128 - private static final byte MODE_LONG_JUMP = 2; // 0-12800 - private static final byte MODE_BEACON_JUMP = 4; // Jump ship by beacon - private static final byte MODE_HYPERSPACE = 5; // Jump to Hyperspace - private static final byte MODE_GATE_JUMP = 6; // Jump via jumpgate - - private int warmupTime = 0; - private int cooldownTime = 0; - public int randomWarmupAddition = 0; - - private int chestTeleportUpdateTicks = 0; - private int registryUpdateTicks = 0; - public String coreFrequency = "default"; - - public int isolationBlocksCount = 0; - public int isolationUpdateTicks = 0; - - public TileEntityProtocol controller; - - private boolean soundPlayed = false; - - @Override - public void updateEntity() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return; - } - super.updateEntity(); - - // Always cooldown - if (cooldownTime > 0) { - cooldownTime--; - warmupTime = 0; - } - - // Update state - if (cooldownTime > 0) { // cooling down (2) - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 2, 1 + 2); - } else if (controller == null) { // not connected (0) - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 1 + 2); - } else if (controller.isJumpFlag() || this.controller.isSummonAllFlag() || !this.controller.getToSummon().isEmpty()) { // active (1) - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 1 + 2); - } else { // inactive - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 1 + 2); - } - - // Update warp core in cores registry - if (++registryUpdateTicks > WarpDriveConfig.WC_CORES_REGISTRY_UPDATE_INTERVAL_SECONDS * 20) { - registryUpdateTicks = 0; - WarpDrive.instance.warpCores.updateInRegistry(this); -// WarpDrive.instance.registry.printRegistry(); -// WarpDrive.debugPrint("" + this + " controller is " + controller + ", warmupTime " + warmupTime + ", currentMode " + currentMode + ", jumpFlag " + (controller == null ? "NA" : controller.isJumpFlag()) + ", cooldownTime " + cooldownTime); - - TileEntity c = findControllerBlock(); - if (c == null) { - controller = null; - warmupTime = 0; - soundPlayed = false; - return; - } - controller = (TileEntityProtocol)c; - } - - if (++isolationUpdateTicks > WarpDriveConfig.WC_ISOLATION_UPDATE_INTERVAL_SECONDS * 20) { - isolationUpdateTicks = 0; - updateIsolationState(); - } - - if (controller == null) { - return; - } - - currentMode = controller.getMode(); - - StringBuilder reason = new StringBuilder(); - - if ((controller.isJumpFlag() && (isolationUpdateTicks == 1)) || this.controller.isSummonAllFlag() || !this.controller.getToSummon().isEmpty()) { - if (!validateShipSpatialParameters(reason)) { - if (controller.isJumpFlag()) { - controller.setJumpFlag(false); - messageToAllPlayersOnShip(reason.toString()); - } - warmupTime = 0; - soundPlayed = false; - return; - } - - if (this.controller.isSummonAllFlag()) { - summonPlayers(); - controller.setSummonAllFlag(false); - } else if (!this.controller.getToSummon().isEmpty()) { - summonSinglePlayer(this.controller.getToSummon()); - this.controller.setToSummon(""); - } - } - - switch (currentMode) { - case MODE_TELEPORT: - if (worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) { - if (isChestSummonMode()) { - chestTeleportUpdateTicks++; - if (chestTeleportUpdateTicks >= 20) { - summonPlayersByChestCode(); - chestTeleportUpdateTicks = 0; - } - } else { - teleportPlayersToSpace(); - } - } else { - chestTeleportUpdateTicks = 0; - } - break; - - case MODE_BASIC_JUMP: - case MODE_LONG_JUMP: - case MODE_BEACON_JUMP: - case MODE_HYPERSPACE: - case MODE_GATE_JUMP: - if (controller.isJumpFlag()) { - // Compute warm-up time - int targetCooldown = 0; - switch (currentMode) { - case MODE_BASIC_JUMP: - case MODE_LONG_JUMP: - if (distance < 50) { - targetCooldown = (WarpDriveConfig.WC_WARMUP_SHORTJUMP_SECONDS) * 20 / 3; - } else { - targetCooldown = (WarpDriveConfig.WC_WARMUP_LONGJUMP_SECONDS) * 20; - } - break; - - case MODE_BEACON_JUMP: - case MODE_HYPERSPACE: - case MODE_GATE_JUMP: - default: - targetCooldown = (WarpDriveConfig.WC_WARMUP_LONGJUMP_SECONDS) * 20; - break; - } - // Select best sound file and adjust offset - int soundThreshold = 0; - String soundFile = ""; - if (targetCooldown < 10 * 20) { - soundThreshold = targetCooldown - 4 * 20; - soundFile = "warpdrive:warp_4s"; - } else if (targetCooldown > 29 * 20) { - soundThreshold = targetCooldown - 30 * 20; - soundFile = "warpdrive:warp_30s"; - } else { - soundThreshold = targetCooldown - 10 * 20; - soundFile = "warpdrive:warp_10s"; - } - // Add random duration - soundThreshold += randomWarmupAddition; - - // Check cooldown time - if (cooldownTime > 0) { - if (cooldownTime % 20 == 0) { - int seconds = cooldownTime / 20; - if ((seconds < 5) || ((seconds < 30) && (seconds % 5 == 0)) || (seconds % 10 == 0)) { - messageToAllPlayersOnShip("Warp core is cooling down... " + cooldownTime / 20 + "s to go..."); - } - } - return; - } - - // Set up activated animation - if (warmupTime == 0) { - messageToAllPlayersOnShip("Running pre-jump checklist..."); - - // update ship parameters - if (!validateShipSpatialParameters(reason)) { - controller.setJumpFlag(false); - messageToAllPlayersOnShip(reason.toString()); - return; - } - makePlayersOnShipDrunk(targetCooldown + WarpDriveConfig.WC_WARMUP_RANDOM_TICKS); - } - - if (!soundPlayed && (soundThreshold > warmupTime)) { - worldObj.playSoundEffect(xCoord + 0.5f, yCoord + 0.5f, zCoord + 0.5f, soundFile, 4F, 1F); - soundPlayed = true; - } - - // Awaiting cool-down time - if (warmupTime < (targetCooldown + randomWarmupAddition)) { - warmupTime++; - return; - } - - warmupTime = 0; - soundPlayed = false; - - if (!validateShipSpatialParameters(reason)) { - controller.setJumpFlag(false); - messageToAllPlayersOnShip(reason.toString()); - return; - } - - if (WarpDrive.instance.warpCores.isWarpCoreIntersectsWithOthers(this)) { - controller.setJumpFlag(false); - messageToAllPlayersOnShip("Warp field intersects with other ship's field. Cannot jump."); - return; - } - - if (WarpDrive.instance.cloaks.isInCloak(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, false)) { - controller.setJumpFlag(false); - messageToAllPlayersOnShip("Core is inside a cloaking field. Aborting. Disable cloaking field to jump!"); - return; - } - - doJump(); - cooldownTime = WarpDriveConfig.WC_COOLDOWN_INTERVAL_SECONDS * 20; - controller.setJumpFlag(false); - } else { - warmupTime = 0; - } - break; - } - } - - public void messageToAllPlayersOnShip(String msg) { - AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX + 0.99D, this.maxY + 0.99D, this.maxZ + 0.99D); - List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); - - System.out.println("" + (FMLCommonHandler.instance().getEffectiveSide().isClient() ? "Client":"Server") + this + " messageToAllPlayersOnShip: " + msg); - for (Object o : list) { - if (o == null || !(o instanceof EntityPlayer)) { - continue; - } - - ((EntityPlayer)o).addChatMessage("[" + (coreFrequency.length() > 0 ? coreFrequency : "WarpCore") + "] " + msg); - } - } - - private void updateIsolationState() - { - // Search block in cube around core with side 10 - int xmax, ymax, zmax, x1, x2, z1, z2; - int xmin, ymin, zmin; - final int ISOLATION_CUBE_SIDE = 6; - x1 = xCoord + ((ISOLATION_CUBE_SIDE / 2) - 1); - x2 = xCoord - ((ISOLATION_CUBE_SIDE / 2) - 1); - - if (x1 < x2) - { - xmin = x1; - xmax = x2; - } - else - { - xmin = x2; - xmax = x1; - } - - z1 = zCoord + ((ISOLATION_CUBE_SIDE / 2) - 1); - z2 = zCoord - ((ISOLATION_CUBE_SIDE / 2) - 1); - - if (z1 < z2) - { - zmin = z1; - zmax = z2; - } - else - { - zmin = z2; - zmax = z1; - } - - ymax = yCoord + ((ISOLATION_CUBE_SIDE / 2) - 1); - ymin = yCoord - ((ISOLATION_CUBE_SIDE / 2) - 1); - this.isolationBlocksCount = 0; - - // Search for warp isolation blocks - for (int y = ymin; y <= ymax; y++) - { - for (int x = xmin; x <= xmax; x++) - { - for (int z = zmin; z <= zmax; z++) - { - if (worldObj.getBlockId(x, y, z) == WarpDriveConfig.isolationID) - { - this.isolationBlocksCount++; - } - } - } - } - } - - private void makePlayersOnShipDrunk(int tickDuration) { - AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ); - List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); - - for (Object o : list) { - if (o == null || !(o instanceof EntityPlayer)) { - continue; - } - - // Set "drunk" effect - ((EntityPlayer)o).addPotionEffect(new PotionEffect(Potion.confusion.id, tickDuration, 0, true)); - } - } - - private void summonPlayers() - { - AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ); - - for (int i = 0; i < controller.players.size(); i++) - { - String nick = controller.players.get(i); - EntityPlayerMP player = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(nick); - - if (player != null && !testBB(aabb, MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ))) - { - summonPlayer(player, xCoord + dx, yCoord, zCoord + dz); - } - } - } - - private void summonSinglePlayer(String nickname) - { - AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ); - - for (int i = 0; i < controller.players.size(); i++) - { - String nick = controller.players.get(i); - EntityPlayerMP player = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(nick); - - if (player != null && nick.equals(nickname) && !testBB(aabb, MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ))) - { - summonPlayer(player, xCoord + dx, yCoord, zCoord + dz); - return; - } - } - } - - private void summonPlayer(EntityPlayerMP player, int x, int y, int z) { - if (consumeEnergy(WarpDriveConfig.WC_ENERGY_PER_ENTITY_TO_SPACE, false)) { - player.setPositionAndUpdate(x, y, z); - - if (player.dimension != worldObj.provider.dimensionId) { - player.mcServer.getConfigurationManager().transferPlayerToDimension(player, this.worldObj.provider.dimensionId, new SpaceTeleporter(DimensionManager.getWorld(this.worldObj.provider.dimensionId), 0, MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ))); - } - } - } - - public boolean validateShipSpatialParameters(StringBuilder reason) { - if (controller == null) { - reason.append("TileEntityReactor.validateShipSpatialParameters: no controller detected!"); - return false; - } - direction = controller.getDirection(); - shipFront = controller.getFront(); - shipRight = controller.getRight(); - shipUp = controller.getUp(); - shipBack = controller.getBack(); - shipLeft = controller.getLeft(); - shipDown = controller.getDown(); - distance = Math.min(WarpDriveConfig.WC_MAX_JUMP_DISTANCE, controller.getDistance()); - - int x1 = 0, x2 = 0, z1 = 0, z2 = 0; - - if (Math.abs(dx) > 0) { - if (dx == 1) { - x1 = xCoord - shipBack; - x2 = xCoord + shipFront; - z1 = zCoord - shipLeft; - z2 = zCoord + shipRight; - } else { - x1 = xCoord - shipFront; - x2 = xCoord + shipBack; - z1 = zCoord - shipRight; - z2 = zCoord + shipLeft; - } - } else if (Math.abs(dz) > 0) { - if (dz == 1) { - z1 = zCoord - shipBack; - z2 = zCoord + shipFront; - x1 = xCoord - shipRight; - x2 = xCoord + shipLeft; - } else { - z1 = zCoord - shipFront; - z2 = zCoord + shipBack; - x1 = xCoord - shipLeft; - x2 = xCoord + shipRight; - } - } - - if (x1 < x2) { - minX = x1; - maxX = x2; - } else { - minX = x2; - maxX = x1; - } - - if (z1 < z2) { - minZ = z1; - maxZ = z2; - } else { - minZ = z2; - maxZ = z1; - } - - minY = yCoord - shipDown; - maxY = yCoord + shipUp; - shipLength = 0; - - switch (direction) { - case 0: - case 180: - shipLength = shipBack + shipFront; - break; - - case 90: - case 270: - shipLength = shipLeft + shipRight; - break; - - case -1: - case -2: - shipLength = shipDown + shipUp; - break; - - default: - reason.append("Invalid jump direction " + direction); - return false; - } - - // Ship side is too big - if ((shipBack + shipFront) > WarpDriveConfig.WC_MAX_SHIP_SIDE || (shipLeft + shipRight) > WarpDriveConfig.WC_MAX_SHIP_SIDE || (shipDown + shipUp) > WarpDriveConfig.WC_MAX_SHIP_SIDE) { - reason.append("Ship is too big (max is " + WarpDriveConfig.WC_MAX_SHIP_SIDE + " per side)"); - return false; - } - - this.shipVolume = computeRealShipVolume(); - - if (shipVolume > WarpDriveConfig.WC_MAX_SHIP_VOLUME_ON_SURFACE && worldObj.provider.dimensionId == 0) { - reason.append("Ship is too big for the overworld (max is " + WarpDriveConfig.WC_MAX_SHIP_VOLUME_ON_SURFACE + " blocks)"); - return false; - } - - return true; - } - - private void doBeaconJump() - { - // Search beacon coordinates - String freq = controller.getBeaconFrequency(); - int beaconX = 0, beaconZ = 0; - boolean isBeaconFound = false; - EntityPlayerMP player; - - for (int i = 0; i < MinecraftServer.getServer().getConfigurationManager().playerEntityList.size(); i++) - { - player = (EntityPlayerMP)MinecraftServer.getServer().getConfigurationManager().playerEntityList.get(i); - - // Skip players from other dimensions - if (player.dimension != worldObj.provider.dimensionId) - { - continue; - } - - TileEntity te = worldObj.getBlockTileEntity(MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY) - 1, MathHelper.floor_double(player.posZ)); - - if (te != null && (te instanceof TileEntityProtocol)) - { - if (((TileEntityProtocol)te).getBeaconFrequency().equals(freq)) - { - beaconX = te.xCoord; - beaconZ = te.zCoord; - isBeaconFound = true; - break; - } - } - } - - // Now make jump to a beacon - if (isBeaconFound) { - // Consume energy - if (consumeEnergy(calculateRequiredEnergy(currentMode, shipVolume, distance), false)) { - System.out.println("" + this + " Moving ship to beacon (" + beaconX + "; " + yCoord + "; " + beaconZ + ")"); - EntityJump jump = new EntityJump(worldObj, xCoord, yCoord, zCoord, dx, dz, this, false, 1, 0, true, beaconX, yCoord, beaconZ); - jump.maxX = maxX; - jump.minX = minX; - jump.maxZ = maxZ; - jump.minZ = minZ; - jump.maxY = maxY; - jump.minY = minY; - jump.shipLength = shipLength; - jump.on = true; - worldObj.spawnEntityInWorld(jump); - } else { - messageToAllPlayersOnShip("Insufficient energy level"); - } - } else { - System.out.println("" + this + " Beacon '" + freq + "' is unknown."); - } - } - - private boolean isShipInJumpgate(JumpGate jg, StringBuilder reason) - { - AxisAlignedBB aabb = jg.getGateAABB(); - WarpDrive.debugPrint("[TEWarpCore] Jumpgate " + jg.name + " AABB is " + aabb); - int countBlocksInside = 0; - int countBlocksTotal = 0; - - if (aabb.isVecInside(worldObj.getWorldVec3Pool().getVecFromPool(maxX - minX, maxY - minY, maxZ - minZ))) - { - return true; - } - - for (int x = minX; x <= maxX; x++) - { - for (int z = minZ; z <= maxZ; z++) - { - for (int y = minY; y <= maxY; y++) - { - int blockID = worldObj.getBlockId(x, y, z); - - if (worldObj.isAirBlock(x, y, z) && (blockID != WarpDriveConfig.airID)) - { - continue; - } - if (aabb.minX <= x && aabb.maxX >= x && aabb.minY <= y && aabb.maxY >= y && aabb.minZ <= z && aabb.maxZ >= z) - { - countBlocksInside++; - } - countBlocksTotal++; - } - } - } - - float percent = 0F; - if (shipVolume != 0) - { - percent = Math.round((((countBlocksInside * 1.0F) / shipVolume) * 100.0F) * 10.0F) / 10.0F; - } - if (shipVolume != countBlocksTotal) - { - System.out.println("" + this + " Ship volume has changed from " + shipVolume + " to " + countBlocksTotal + " blocks"); - } - WarpDrive.debugPrint("Ship has " + countBlocksInside + " / " + shipVolume + " blocks (" + percent + "%) in jumpgate '" + jg.name + "'"); - // At least 80% of ship must be inside jumpgate - if (percent > 80F) - { - return true; - } - else if (percent <= 0.001) - { - reason.append("Ship is not inside a jumpgate. Jump rejected. Nearest jumpgate is " + jg.toNiceString()); - return false; - } - else - { - reason.append("Ship is only " + percent + "% inside a jumpgate. Sorry, we'll loose too much crew as is, jump rejected."); - return false; - } - } - - private boolean isFreePlaceForShip(int destX, int destY, int destZ) - { - int newX, newY, newZ; - - if (destY + shipUp > 255 || destY - shipDown < 5) - { - return false; - } - - int moveX = destX - xCoord; - int moveY = destY - yCoord; - int moveZ = destZ - zCoord; - - for (int x = minX; x <= maxX; x++) - { - for (int z = minZ; z <= maxZ; z++) - { - for (int y = minY; y <= maxY; y++) - { - if (!worldObj.isAirBlock(x, y, z)) - { - newX = moveX + x; - newY = moveY + y; - newZ = moveZ + z; - - if (!worldObj.isAirBlock(newX, newY, newZ)) - { - return false; - } - } - } - } - } - - return true; - } - - private void doGateJump() - { - // Search nearest jump-gate - String gateName = controller.getTargetJumpgateName(); - JumpGate targetGate = WarpDrive.instance.jumpGates.findGateByName(gateName); - - if (targetGate == null) - { - messageToAllPlayersOnShip("Destination jumpgate '" + gateName + "' is unknown. Check jumpgate name."); - this.controller.setJumpFlag(false); - return; - } - - // Now make jump to a beacon - int gateX = targetGate.xCoord; - int gateY = targetGate.yCoord; - int gateZ = targetGate.zCoord; - int destX = gateX; - int destY = gateY; - int destZ = gateZ; - JumpGate nearestGate = WarpDrive.instance.jumpGates.findNearestGate(xCoord, yCoord, zCoord); - - StringBuilder reason = new StringBuilder(); - if (!isShipInJumpgate(nearestGate, reason)) - { - messageToAllPlayersOnShip(reason.toString()); - this.controller.setJumpFlag(false); - return; - } - - // If gate is blocked by obstacle - if (!isFreePlaceForShip(gateX, gateY, gateZ)) - { - // Randomize destination coordinates and check for collision with obstacles around jumpgate - // Try to find good place for ship - int numTries = 10; // num tries to check for collision - boolean placeFound = false; - - for (; numTries > 0; numTries--) - { - // randomize destination coordinates around jumpgate - destX = gateX + ((worldObj.rand.nextBoolean()) ? -1 : 1) * (20 + worldObj.rand.nextInt(100)); - destZ = gateZ + ((worldObj.rand.nextBoolean()) ? -1 : 1) * (20 + worldObj.rand.nextInt(100)); - destY = gateY + ((worldObj.rand.nextBoolean()) ? -1 : 1) * (20 + worldObj.rand.nextInt(50)); - - // check for collision - if (isFreePlaceForShip(destX, destY, destZ)) - { - placeFound = true; - break; - } - } - - if (!placeFound) - { - messageToAllPlayersOnShip("Destination gate is blocked by obstacles. Aborting..."); - this.controller.setJumpFlag(false); - return; - } - - System.out.println("[GATE] Place found over " + (10 - numTries) + " tries."); - } - - // Consume energy - if (consumeEnergy(calculateRequiredEnergy(currentMode, shipVolume, distance), false)) { - System.out.println("[TE-WC] Moving ship to a place around gate '" + targetGate.name + "' (" + destX + "; " + destY + "; " + destZ + ")"); - EntityJump jump = new EntityJump(worldObj, xCoord, yCoord, zCoord, dx, dz, this, false, 1, 0, true, destX, destY, destZ); - jump.maxX = maxX; - jump.minX = minX; - jump.maxZ = maxZ; - jump.minZ = minZ; - jump.maxY = maxY; - jump.minY = minY; - jump.shipLength = shipLength; - jump.on = true; - worldObj.spawnEntityInWorld(jump); - } else { - messageToAllPlayersOnShip("Insufficient energy level"); - } - } - - private void doJump() { - int requiredEnergy = calculateRequiredEnergy(currentMode, shipVolume, distance); - - if (!consumeEnergy(requiredEnergy, true)) { - messageToAllPlayersOnShip("Insufficient energy to jump! Core is currently charged with " + getEnergyStored() + " EU while jump requires " + requiredEnergy + " EU"); - this.controller.setJumpFlag(false); - return; - } - - String shipInfo = "" + shipVolume + " blocks inside (" + minX + ", " + minY + ", " + minZ + ") to (" + maxX + ", " + maxY + ", " + maxZ + ")"; - if (currentMode == this.MODE_GATE_JUMP) { - System.out.println("" + this + " Performing gate jump of " + shipInfo); - doGateJump(); - return; - } else if (currentMode == this.MODE_BEACON_JUMP) { - System.out.println("" + this + " Performing beacon jump of " + shipInfo); - doBeaconJump(); - return; - } else if (currentMode == this.MODE_HYPERSPACE) { - System.out.println("" + this + " Performing hyperspace jump of " + shipInfo); - - // Check ship size for hyper-space jump - if (shipVolume < WarpDriveConfig.WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE) { - JumpGate nearestGate = null; - if (WarpDrive.instance.jumpGates == null) { - System.out.println("" + this + " WarpDrive.instance.jumpGates is NULL!"); - } else { - nearestGate = WarpDrive.instance.jumpGates.findNearestGate(xCoord, yCoord, zCoord); - } - - StringBuilder reason = new StringBuilder(); - if (nearestGate == null || !isShipInJumpgate(nearestGate, reason)) { - this.messageToAllPlayersOnShip("Ship is too small (" + shipVolume + "/" + WarpDriveConfig.WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE + "). Insufficient ship mass to open hyperspace portal. Use a jumpgate to reach or exit hyperspace."); - this.controller.setJumpFlag(false); - return; - } - } - } else if (currentMode == this.MODE_BASIC_JUMP) { - System.out.println("" + this + " Performing basic jump of " + shipInfo + " toward direction " + direction + " over " + distance + " blocks."); - } else if (currentMode == this.MODE_LONG_JUMP) { - System.out.println("" + this + " Performing long jump of " + shipInfo + " toward direction " + direction + " over " + distance + " blocks."); - } else { - System.out.println("" + this + " Performing some jump #" + currentMode + " of " + shipInfo); - } - - if (currentMode == this.MODE_BASIC_JUMP || currentMode == this.MODE_LONG_JUMP || currentMode == MODE_HYPERSPACE) { - if (!consumeEnergy(requiredEnergy, false)) { - messageToAllPlayersOnShip("Insufficient energy level"); - return; - } - - if (this.currentMode == this.MODE_BASIC_JUMP) { - distance += shipLength; - } - - if (currentMode == this.MODE_LONG_JUMP && (direction != -1) && (direction != -2)) { - if (worldObj.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID) { - distance *= 100; - } - } - - WarpDrive.debugPrint("" + this + " Distance adjusted to " + distance + " blocks."); - EntityJump jump = new EntityJump(worldObj, xCoord, yCoord, zCoord, dx, dz, this, (currentMode == MODE_HYPERSPACE), distance, direction, false, 0, 0, 0); - jump.maxX = maxX; - jump.minX = minX; - jump.maxZ = maxZ; - jump.minZ = minZ; - jump.maxY = maxY; - jump.minY = minY; - jump.shipLength = shipLength; - jump.on = true; - worldObj.spawnEntityInWorld(jump); - } - } - - private void teleportPlayersToSpace() { - if (worldObj.provider.dimensionId != WarpDriveConfig.G_SPACE_DIMENSION_ID) { - AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(xCoord - 2, yCoord - 1, zCoord - 2, xCoord + 2, yCoord + 4, zCoord + 2); - List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); - - WorldServer spaceWorld = DimensionManager.getWorld(WarpDriveConfig.G_SPACE_DIMENSION_ID); - for (Object o : list) { - if (!consumeEnergy(WarpDriveConfig.WC_ENERGY_PER_ENTITY_TO_SPACE, false)) { - return; - } - - Entity entity = (Entity) o; - int x = MathHelper.floor_double(entity.posX); - int z = MathHelper.floor_double(entity.posZ); - //int y = MathHelper.floor_double(entity.posY); - final int WOOL_BLOCK_ID = 35; - int newY; - - for (newY = 254; newY > 0; newY--) { - if (spaceWorld.getBlockId(x, newY, z) == WOOL_BLOCK_ID) { - break; - } - } - - if (newY <= 0) { - newY = 254; - } - - if (entity instanceof EntityPlayerMP) { - ((EntityPlayerMP) entity).mcServer.getConfigurationManager().transferPlayerToDimension(((EntityPlayerMP) entity), WarpDriveConfig.G_SPACE_DIMENSION_ID, new SpaceTeleporter(DimensionManager.getWorld(WarpDriveConfig.G_SPACE_DIMENSION_ID), 0, x, 256, z)); - - if (spaceWorld.isAirBlock(x, newY, z)) { - spaceWorld.setBlock(x , newY, z , Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x + 1, newY, z , Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x - 1, newY, z , Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x , newY, z + 1, Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x , newY, z - 1, Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x + 1, newY, z + 1, Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x - 1, newY, z - 1, Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x + 1, newY, z - 1, Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x - 1, newY, z + 1, Block.stone.blockID, 0, 2); - } - - ((EntityPlayerMP) entity).setPositionAndUpdate(x + 0.5D, newY + 2.0D, z + 0.5D); - } - } - } - } - - private void summonPlayersByChestCode() - { - if (worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord) == null) - { - return; - } - - TileEntityChest chest = (TileEntityChest)worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord); - EntityPlayerMP player; - - for (int i = 0; i < MinecraftServer.getServer().getConfigurationManager().playerEntityList.size(); i++) - { - player = (EntityPlayerMP)MinecraftServer.getServer().getConfigurationManager().playerEntityList.get(i); - - if (checkPlayerInventory(chest, player)) - { - System.out.println("" + this + " Summoning " + player.username); - summonPlayer(player, xCoord, yCoord + 2, zCoord); - } - } - } - - private static boolean checkPlayerInventory(TileEntityChest chest, EntityPlayerMP player) { - Boolean result = false; - final int MIN_KEY_LENGTH = 5; - int keyLength = 0; - - for (int index = 0; index < chest.getSizeInventory(); index++) { - ItemStack chestItem = chest.getStackInSlot(index); - ItemStack playerItem = player.inventory.getStackInSlot(9 + index); - - if (chestItem == null) { - continue; - } - - if (playerItem == null || chestItem.itemID != playerItem.itemID || chestItem.getItemDamage() != playerItem.getItemDamage() || chestItem.stackSize != playerItem.stackSize) { - return false; - } else { - result = true; - } - - keyLength++; - } - - if (keyLength < MIN_KEY_LENGTH) { - System.out.println("[ChestCode] Key is too short: " + keyLength + " < " + MIN_KEY_LENGTH); - return false; - } - - return result; - } - - private Boolean isChestSummonMode() - { - TileEntity te = worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord); - - if (te != null) - { - return (te instanceof TileEntityChest); - } - - return false; - } - - private static boolean testBB(AxisAlignedBB axisalignedbb, int x, int y, int z) - { - return axisalignedbb.minX <= x && axisalignedbb.maxX >= x && axisalignedbb.minY <= y && axisalignedbb.maxY >= y && axisalignedbb.minZ <= z && axisalignedbb.maxZ >= z; - } - - @Override - public String getStatus() { - return getBlockType().getLocalizedName() + " '" + coreFrequency + "' energy level is " + getEnergyStored() + " EU." + ((cooldownTime <= 0) ? "" : (" " + (cooldownTime / 20) + " s left of cooldown.")); - } - - private static int calculateRequiredEnergy(int currentMode, int shipVolume, int jumpDistance) { - switch (currentMode) { - case MODE_TELEPORT: - return WarpDriveConfig.WC_ENERGY_PER_ENTITY_TO_SPACE; - - case MODE_BASIC_JUMP: - return (WarpDriveConfig.WC_ENERGY_PER_BLOCK_MODE1 * shipVolume) + (WarpDriveConfig.WC_ENERGY_PER_DISTANCE_MODE1 * jumpDistance); - - case MODE_LONG_JUMP: - return (WarpDriveConfig.WC_ENERGY_PER_BLOCK_MODE2 * shipVolume) + (WarpDriveConfig.WC_ENERGY_PER_DISTANCE_MODE2 * jumpDistance); - - case MODE_HYPERSPACE: - return WarpDriveConfig.WC_MAX_ENERGY_VALUE / 10; // 10% of maximum - - case MODE_BEACON_JUMP: - return WarpDriveConfig.WC_MAX_ENERGY_VALUE / 2; // half of maximum - - case MODE_GATE_JUMP: - return 2 * shipVolume; - } - - return WarpDriveConfig.WC_MAX_ENERGY_VALUE; - } - - private int computeRealShipVolume() { - int realShipVolume = 0; - - try { - for (int x = minX; x <= maxX; x++) { - for (int z = minZ; z <= maxZ; z++) { - for (int y = minY; y <= maxY; y++) { - int blockID = worldObj.getBlockId(x, y, z); - - if (WarpDriveConfig.isAirBlock(worldObj, blockID, x, y, z) && (blockID != WarpDriveConfig.airID)) { - continue; - } - - realShipVolume++; - } - } - } - } catch(Exception e) { - e.printStackTrace(); - } - - return realShipVolume; - } - - private TileEntity findControllerBlock() - { - TileEntity result; - result = worldObj.getBlockTileEntity(xCoord + 1, yCoord, zCoord); - - if (result != null && result instanceof TileEntityProtocol) - { - dx = 1; - dz = 0; - return result; - } - - result = worldObj.getBlockTileEntity(xCoord - 1, yCoord, zCoord); - - if (result != null && result instanceof TileEntityProtocol) - { - dx = -1; - dz = 0; - return result; - } - - result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord + 1); - - if (result != null && result instanceof TileEntityProtocol) - { - dx = 0; - dz = 1; - return result; - } - - result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord - 1); - - if (result != null && result instanceof TileEntityProtocol) - { - dx = 0; - dz = -1; - return result; - } - - return null; - } - - public int getCooldown() { - return cooldownTime; - } - - @Override - public int getMaxEnergyStored() { - return WarpDriveConfig.WC_MAX_ENERGY_VALUE; - } - - @Override - public double demandedEnergyUnits() { - if (this.controller != null && controller.getMode() == 0) { - return 0.0D; - } - - return super.demandedEnergyUnits(); - } - - @Override - public int getMaxSafeInput() { - return Integer.MAX_VALUE; - } - - @Override - public void readFromNBT(NBTTagCompound tag) - { - super.readFromNBT(tag); - coreFrequency = tag.getString("corefrequency"); - isolationBlocksCount = tag.getInteger("isolation"); - cooldownTime = tag.getInteger("cooldownTime"); - WarpDrive.instance.warpCores.updateInRegistry(this); - } - - @Override - public void writeToNBT(NBTTagCompound tag) - { - super.writeToNBT(tag); - tag.setString("corefrequency", coreFrequency); - tag.setInteger("isolation", isolationBlocksCount); - tag.setInteger("cooldownTime", cooldownTime); - } - - @Override - public void onChunkUnload() { - WarpDrive.instance.warpCores.removeFromRegistry(this); - super.onChunkUnload(); - } - - @Override - public void validate() { - super.validate(); - WarpDrive.instance.warpCores.updateInRegistry(this); - } - - @Override - public void invalidate() { - WarpDrive.instance.warpCores.removeFromRegistry(this); - super.invalidate(); - } - - @Override - public String toString() { - return String.format("%s \'%s\' @ \'%s\' %d, %d, %d", new Object[] { - getClass().getSimpleName(), - coreFrequency, - worldObj == null ? "~NULL~" : worldObj.getWorldInfo().getWorldName(), - Integer.valueOf(xCoord), Integer.valueOf(yCoord), Integer.valueOf(zCoord)}); - } -} diff --git a/src/cr0s/WarpDrive/machines/TileEntityTransporter.java b/src/cr0s/WarpDrive/machines/TileEntityTransporter.java deleted file mode 100644 index 9c63a786..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityTransporter.java +++ /dev/null @@ -1,435 +0,0 @@ -package cr0s.WarpDrive.machines; - -import java.util.ArrayList; -import java.util.List; - -import cr0s.WarpDrive.Vector3; -import cr0s.WarpDrive.WarpDrive; -import cr0s.WarpDrive.WarpDriveConfig; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChatMessageComponent; -import net.minecraft.util.DamageSource; -import net.minecraftforge.common.ForgeDirection; -import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.api.lua.ILuaContext; -import dan200.computercraft.api.peripheral.IPeripheral; - -public class TileEntityTransporter extends WarpEnergyTE implements IPeripheral -{ - private double scanRange=2; - - private int scanDist = 4; - private double powerBoost = 1; - private double baseLockStrength=-1; - private double lockStrengthMul = 1; - private boolean isLocked=false; - - private final static Vector3 centreOnMe = new Vector3(0.5D, 1.0D, 0.5D); - private Vector3 sourceVec = new Vector3(); - private Vector3 destVec = new Vector3(); - - private TeleporterDamage teleDam = new TeleporterDamage("teleporter"); - - private String[] methodArray = { - "source", - "dest", - "lock", - "release", - "lockStrength", - "energize", - "energy", - "powerBoost", - "energyCost", - "help" }; - - @Override - public int getMaxEnergyStored() { - return WarpDriveConfig.TR_MAX_ENERGY; - } - - @Override - public void updateEntity() { - super.updateEntity(); - - if(isLocked) { - if(lockStrengthMul > 0.8) { - lockStrengthMul *= 0.995; - } else { - lockStrengthMul*= 0.98; - } - } - } - - // IPeripheral overrides - @Override - public String getType() { - return "transporter"; - } - - private static String helpStr(Object[] function) { - if (function != null && function.length > 0) { - String fun = function[0].toString().toLowerCase(); - if(fun.equals("source")) { - if(WarpDriveConfig.TR_RELATIVE_COORDS) { - return "source(x,y,z): sets the coordinates (relative to the transporter) to teleport from\ndest(): returns the relative x,y,z coordinates of the source"; - } else { - return "source(x,y,z): sets the absolute coordinates to teleport from\ndest(): returns the x,y,z coordinates of the source"; - } - } else if(fun.equals("dest")) { - if(WarpDriveConfig.TR_RELATIVE_COORDS) { - return "dest(x,y,z): sets the coordinates (relative to the transporter) to teleport to\ndest(): returns the relative x,y,z coordinates of the destination"; - } else { - return "dest(x,y,z): sets the absolute coordinates to teleport to\ndest(): returns the x,y,z coordinates of the destination"; - } - } else if(fun.equals("lock")) { - return "lock(): locks the source and dest coordinates in and returns the lock strength (float)"; - } else if(fun.equals("release")) { - return "release(): releases the current lock"; - } else if(fun.equals("lockstrength")) { - return "lockStrength(): returns the current lock strength (float)"; - } else if(fun.equals("energize")) { - return "energize(): attempts to teleport all entities at source to dest. Returns the number of entities transported (-1 indicates a problem)."; - } else if(fun.equals("powerboost")) { - return "powerBoost(boostAmount): sets the level of power to use (1 being default), returns the level of power\npowerBoost(): returns the level of power"; - } else if(fun.equals("energycost")) { - return "energyCost(): returns the amount of energy it will take for a single entity to transport with the current settings"; - } - } - return WarpDrive.defHelpStr; - } - - @Override - public String[] getMethodNames() { - return methodArray; - } - - private Object[] setVec3(boolean src,Object... arguments) { - Vector3 vec = src ? sourceVec : destVec; - - if (vec == null) { - Vector3 sV = WarpDriveConfig.TR_RELATIVE_COORDS ? new Vector3(this) : new Vector3(0,0,0); - if(src) - sourceVec = sV; - else - destVec = sV; - vec = src ? sourceVec : destVec; - } - - try { - if (arguments.length >= 3) { - unlock(); - vec.x = toDouble(arguments[0]); - vec.y = toDouble(arguments[1]); - vec.z = toDouble(arguments[2]); - } else if(arguments.length == 1) { - unlock(); - if(WarpDriveConfig.TR_RELATIVE_COORDS) { - vec.x = centreOnMe.x; - vec.y = centreOnMe.y; - vec.z = centreOnMe.z; - } else { - vec.x = xCoord + centreOnMe.x; - vec.y = yCoord + centreOnMe.y; - vec.z = zCoord + centreOnMe.z; - } - } - } catch(NumberFormatException e) { - return setVec3(src,"this"); - } - return new Object[] { vec.x, vec.y, vec.z }; - } - - @Override - public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception { - String str = methodArray[method]; - if (str == "energy") { - return new Object[] { getEnergyStored(), getMaxEnergyStored() }; - } - - if (str == "source") { - return setVec3(true,arguments); - } - - if (str == "dest") { - return setVec3(false,arguments); - } - - if (str == "lock") { - return new Object[] { lock(sourceVec, destVec) }; - } - - if(str == "release") - { - unlock(); - return null; - } - - if(str == "lockStrength") { - return new Object[] { getLockStrength() }; - } - - if(str == "energize") { - return new Object[] { energize () }; - } - - if(str == "powerBoost") { - try - { - if(arguments.length >= 1) - powerBoost = clamp(toDouble(arguments[0]),1,WarpDriveConfig.TR_MAX_BOOST_MUL); - } - catch(NumberFormatException e) - { - powerBoost = 1; - } - return new Object[] { powerBoost }; - } - - if (str == "energyCost") { - return new Object[] { energyCost() }; - } - - if (str == "help") { - return new Object[] { helpStr(arguments) }; - } - - return null; - } - - private Integer energyCost() { - if (sourceVec != null && destVec != null) { - return (int) Math.ceil(Math.pow(3, powerBoost - 1) * WarpDriveConfig.TR_EU_PER_METRE * sourceVec.distanceTo(destVec)); - } - return null; - } - - private int energize() { - if (isLocked) { - int count = 0; - double ls = getLockStrength(); - WarpDrive.debugPrint("LS:" + getLockStrength()); - ArrayList entitiesToTransport = findEntities(sourceVec, ls); - Integer energyReq = energyCost(); - if (energyReq == null) { - return -1; - } - Vector3 modDest = destVec.clone().translate(centreOnMe); - for(Entity ent : entitiesToTransport) { - WarpDrive.debugPrint("" + this + " Handling entity " + ent.getEntityName()); - if (consumeEnergy(energyReq, false)) { - WarpDrive.debugPrint("" + this + " Energy taken"); - inflictNegativeEffect(ent, ls); - transportEnt(ent, modDest); - count++; - } else { - break; - } - } - return count; - } - return -1; - } - - private void transportEnt(Entity ent, Vector3 dest) { - if (ent instanceof EntityLivingBase) { - EntityLivingBase livingEnt = (EntityLivingBase) ent; - if (WarpDriveConfig.TR_RELATIVE_COORDS) { - livingEnt.setPositionAndUpdate(xCoord+dest.x, yCoord+dest.y, zCoord+dest.z); - } else { - livingEnt.setPositionAndUpdate(dest.x, dest.y, dest.z); - } - } else { - if (WarpDriveConfig.TR_RELATIVE_COORDS) { - ent.setPosition(xCoord+dest.x, yCoord+dest.y, zCoord+dest.z); - } else { - ent.setPosition(dest.x, dest.y, dest.z); - } - } - } - - private void inflictNegativeEffect(Entity ent, double lockStrength) { - double value = Math.random() + lockStrength; - - WarpDrive.debugPrint("TRANSPORTER INFLICTION: " + value); - if (value < 0.1) { - ent.attackEntityFrom(teleDam, 1000); - } - - if (value < 0.2) { - ent.attackEntityFrom(teleDam, 10); - } - - if (value < 0.5) { - ent.attackEntityFrom(teleDam, 1); - } - } - - private double beaconScan(int xV, int yV, int zV) // FIXME: never used - { - double beacon = 0; - for(int x=xV-scanDist;x<=xV+scanDist;x++) - { - for(int y=yV-scanDist;y<=yV+scanDist;y++) - { - if(y < 0 || y > 254) - continue; - - for(int z=xV-scanDist;z<=xV+scanDist;z++) - { - if(worldObj.getBlockId(x, y, z) != WarpDriveConfig.transportBeaconID) - continue; - double dist = Math.abs(x - xV) + Math.abs(y - yV) + Math.abs(z - zV); - - if(worldObj.getBlockMetadata(x, y, z) == 0) - beacon += 1/dist; - else - beacon -= 1/dist; - } - } - } - return beacon; - } - - private double calculatePower(Vector3 d) - { - Vector3 myCoords; - if(WarpDriveConfig.TR_RELATIVE_COORDS) - myCoords = centreOnMe; - else - myCoords = new Vector3(this).translate(centreOnMe); - return calculatePower(myCoords,d); - } - - private static double calculatePower(Vector3 s, Vector3 d) - { - double dist = s.distanceTo(d); - return clamp(Math.pow(Math.E, -dist / 100) * (1/dist),0,1); - } - - private static double min(double... ds) - { - double curMin = Double.MAX_VALUE; - for(double d: ds) - curMin = Math.min(curMin, d); - return curMin; - } - - private double getLockStrength() { - if (isLocked) { - return clamp(baseLockStrength * lockStrengthMul * Math.pow(2, powerBoost - 1), 0, 1); - } - return -1; - } - - private void unlock() { - isLocked = false; - baseLockStrength = 0; - } - - private double lock(Vector3 source,Vector3 dest) { - if (source != null && dest != null) { - double basePower = min(calculatePower(source),calculatePower(dest),calculatePower(source,dest)); - baseLockStrength = basePower; - lockStrengthMul = 1; - isLocked = true; - WarpDrive.debugPrint(baseLockStrength + "," + getLockStrength()); - return getLockStrength(); - } else { - unlock(); - return 0; - } - } - - private AxisAlignedBB getAABB() { - Vector3 tS = new Vector3(this); - Vector3 bS = new Vector3(this); - Vector3 scanPos = new Vector3( scanRange/2, 2, scanRange/2); - Vector3 scanNeg = new Vector3(-scanRange/2,-1,-scanRange/2); - if(WarpDriveConfig.TR_RELATIVE_COORDS) { - tS.translate(sourceVec).translate(scanPos); - bS.translate(sourceVec).translate(scanNeg); - } else { - tS = sourceVec.clone().translate(scanPos); - bS = sourceVec.clone().translate(scanNeg); - } - return AxisAlignedBB.getBoundingBox(bS.x,bS.y,bS.z,tS.x,tS.y,tS.z); - } - - private ArrayList findEntities(Vector3 source, double lockStrength) { - AxisAlignedBB bb = getAABB(); - WarpDrive.debugPrint("Transporter:" +bb.toString()); - List data = worldObj.getEntitiesWithinAABBExcludingEntity(null, bb); - ArrayList output = new ArrayList(data.size()); - for(Object ent : data) { - if (lockStrength >= 1 || worldObj.rand.nextDouble() < lockStrength) {// If weak lock, don't transport - WarpDrive.debugPrint("" + this + " Entity '" + ent.toString() + "' found and added"); - if (ent instanceof Entity) { - output.add((Entity) ent); - } - } else { - WarpDrive.debugPrint("" + this + " Entity '" + ent.toString() + "' discarded"); - } - } - return output; - } - - @Override - public void attach(IComputerAccess computer) {} - - @Override - public void detach(IComputerAccess computer) {} - - @Override - public boolean acceptsEnergyFrom(TileEntity emitter, ForgeDirection direction) { - if (direction.equals(ForgeDirection.UP)) - return false; - return super.acceptsEnergyFrom(emitter, direction); - } - - @Override - public int getMaxSafeInput() { - return Integer.MAX_VALUE; - } - - @Override - public void writeToNBT(NBTTagCompound tag) { - super.writeToNBT(tag); - tag.setDouble("powerBoost", powerBoost); - } - - @Override - public void readFromNBT(NBTTagCompound tag) { - super.readFromNBT(tag); - powerBoost = tag.getDouble("powerBoost"); - } - - class TeleporterDamage extends DamageSource { - protected TeleporterDamage(String par1Str) { - super(par1Str); - } - - @Override - public ChatMessageComponent getDeathMessage(EntityLivingBase e) { - String mess = ""; - if(e instanceof EntityPlayer || e instanceof EntityPlayerMP) { - mess = ((EntityPlayer) e).username + " was killed by a teleporter malfunction"; - } else { - mess = e.getEntityName() + " was killed by a teleporter malfunction"; - } - - WarpDrive.debugPrint(mess); - return ChatMessageComponent.createFromText(mess); - } - } - - @Override - public boolean equals(IPeripheral other) { - return other == this; - } -} diff --git a/src/cr0s/WarpDrive/machines/WarpChunkTE.java b/src/cr0s/WarpDrive/machines/WarpChunkTE.java deleted file mode 100644 index 6c56fd5e..00000000 --- a/src/cr0s/WarpDrive/machines/WarpChunkTE.java +++ /dev/null @@ -1,177 +0,0 @@ -package cr0s.WarpDrive.machines; - -import java.util.ArrayList; -import com.google.common.collect.ImmutableSet; - -import cr0s.WarpDrive.WarpDrive; - -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraftforge.common.ForgeChunkManager; -import net.minecraftforge.common.ForgeChunkManager.Ticket; - -public abstract class WarpChunkTE extends WarpEnergyTE -{ - private ArrayList ticketList = new ArrayList(); - - public abstract boolean shouldChunkLoad(); - protected ChunkCoordIntPair minChunk = null; - protected ChunkCoordIntPair maxChunk = null; - - boolean areChunksLoaded = false; - boolean isRefreshing = false; - - public void refreshLoading(boolean force) - { - if(isRefreshing) - return; - - isRefreshing = true; - boolean load = shouldChunkLoad(); - if(ticketList.size() != 0) - { - if(load && (!areChunksLoaded || force)) - { - int ticketSize = ticketList.get(0).getMaxChunkListDepth(); - ArrayList chunkList = getChunksToLoad(); - int numTicketsRequired = (int) Math.ceil((double) chunkList.size() / ticketSize); - if(ticketList.size() != numTicketsRequired) - { - for(int i=ticketList.size();i= ticketSize) - { - chunkInTick = 0; - tickNum++; - t = ticketList.get(tickNum); - } - - WarpDrive.debugPrint("Attempting to force chunk" + chunk); - ForgeChunkManager.forceChunk(t, chunk); - chunkInTick++; - } - areChunksLoaded = true; - } - else if(!load) - { - for(Ticket ticket:ticketList) - { - ImmutableSet chunks = ticket.getChunkList(); - for(ChunkCoordIntPair chunk:chunks) - ForgeChunkManager.unforceChunk(ticket, chunk); - - ForgeChunkManager.releaseTicket(ticket); - WarpDrive.instance.removeTicket(ticket); - } - ticketList.clear(); - areChunksLoaded = false; - } - } - else if(load) - { - WarpDrive.instance.registerChunkLoadTE(this); - } - isRefreshing = false; - } - - public void refreshLoading() - { - refreshLoading(false); - } - - public void giveTicket(Ticket t) - { - ticketList.add(t); - } - - private static int dX(int dir) - { - if (dir == 1) - return 1; - else if (dir == 3) - return -1; - return 0; - } - - private static int dZ(int dir) - { - if (dir == 0) - return 1; - else if (dir == 2) - return -1; - return 0; - } - - public ArrayList getChunksFromCentre(ChunkCoordIntPair chunkA,ChunkCoordIntPair chunkB) - { - if(!shouldChunkLoad()) - return null; - int minX = Math.min(chunkA.chunkXPos, chunkB.chunkXPos); - int maxX = Math.max(chunkA.chunkXPos, chunkB.chunkXPos); - int minZ = Math.min(chunkA.chunkZPos, chunkB.chunkZPos); - int maxZ = Math.max(chunkA.chunkZPos, chunkB.chunkZPos); - WarpDrive.debugPrint("From " + minX + "," + minZ + " to " + maxX + "," + maxZ); - - //REMOVE ODD SIZES - int deltaX = (maxX - minX + 1); - int deltaZ = (maxZ - minZ + 1); - WarpDrive.debugPrint("Allocating Block: " + deltaX + "," + deltaZ); - - maxX = minX + deltaX - 1; - maxZ = minZ + deltaZ - 1; - WarpDrive.debugPrint("From " + minX + "," + minZ + " to " + maxX + "," + maxZ); - - int maxEnts = (deltaX) * (deltaZ); - ArrayList chunkList = new ArrayList(maxEnts); - - int dir = 1; - int x = minX; - int z = maxZ; - for(int i=0;i maxX || x+dX < minX || z+dZ > maxZ || z+dZ < minZ) - { - dir++; - if(dir >= 4) - dir = 0; - dX = dX(dir); - dZ = dZ(dir); - - if(dX == 1) - minX++; - if(dX == -1) - maxX--; - if(dZ == 1) - minZ++; - if(dZ == -1) - maxZ--; - - } - x += dX; - z += dZ; - } - - return chunkList; - } - - public ArrayList getChunksToLoad() - { - if(minChunk == null || maxChunk == null) - { - ArrayList chunkList = new ArrayList(1); - chunkList.add(this.worldObj.getChunkFromBlockCoords(xCoord, zCoord).getChunkCoordIntPair()); - return chunkList; - } - return getChunksFromCentre(minChunk,maxChunk); - } -} diff --git a/src/cr0s/WarpDrive/machines/WarpEnergyTE.java b/src/cr0s/WarpDrive/machines/WarpEnergyTE.java deleted file mode 100644 index f6ee99d3..00000000 --- a/src/cr0s/WarpDrive/machines/WarpEnergyTE.java +++ /dev/null @@ -1,167 +0,0 @@ -package cr0s.WarpDrive.machines; - -import ic2.api.energy.event.EnergyTileLoadEvent; -import ic2.api.energy.event.EnergyTileUnloadEvent; -import ic2.api.energy.tile.IEnergySink; -import cofh.api.energy.IEnergyHandler; -import cpw.mods.fml.common.FMLCommonHandler; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.ForgeDirection; -import net.minecraftforge.common.MinecraftForge; - -public abstract class WarpEnergyTE extends WarpTE implements IEnergyHandler, IEnergySink { - protected boolean addedToEnergyNet = false; - protected int energyStored_internal = 0; - protected static final double EU_PER_INTERNAL = 1.0D; - protected static final double RF_PER_INTERNAL = 1800.0D / 437.5D; - - // WarpDrive methods - public int getEnergyStored() { - return energyStored_internal; - } - - public int getMaxEnergyStored() { - return 0; - } - - protected boolean consumeEnergy(int amount, boolean simulate) { - if(getEnergyStored() >= amount) { - if (!simulate) { - energyStored_internal -= amount; - } - return true; - } - return false; - } - - protected int consumeAllEnergy() { - int temp = energyStored_internal; - energyStored_internal = 0; - return temp; - } - - public Object[] getEnergyObject() { - return new Object[]{ getEnergyStored(), getMaxEnergyStored() }; - } - - public String getStatus() { - if (getMaxEnergyStored() != 0) { - return getBlockType().getLocalizedName() + " energy level is " + getEnergyStored() + "/" + getMaxEnergyStored() + " EU."; - } else { - return getBlockType().getLocalizedName(); - } - } - - // Common overrides - @Override - public void updateEntity() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return; - } - - if (!addedToEnergyNet) { - MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(this)); - addedToEnergyNet = true; - } - } - - @Override - public void onChunkUnload() { - if (addedToEnergyNet) { - MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); - addedToEnergyNet = false; - } - - super.onChunkUnload(); - } - - @Override - public void invalidate() { - if (addedToEnergyNet) { - MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); - addedToEnergyNet = false; - } - - super.invalidate(); - } - - // IndustrialCraft overrides - @Override - public double demandedEnergyUnits() { - return Math.max(0.0D, getMaxEnergyStored() - energyStored_internal) * EU_PER_INTERNAL; - } - - @Override - public double injectEnergyUnits(ForgeDirection directionFrom, double amount) { - double leftover = 0; - energyStored_internal += Math.round(amount) / EU_PER_INTERNAL; - - if (energyStored_internal > getMaxEnergyStored()) { - leftover = (energyStored_internal - getMaxEnergyStored()); - energyStored_internal = getMaxEnergyStored(); - } - - return leftover * EU_PER_INTERNAL; - } - - @Override - public int getMaxSafeInput() { - return 0; - } - - @Override - public boolean acceptsEnergyFrom(TileEntity emitter, ForgeDirection direction) { - return getMaxSafeInput() != 0; - } - - // ThermalExpansion overrides - @Override - public int getEnergyStored(ForgeDirection from) { - return (int)Math.round(getEnergyStored() * RF_PER_INTERNAL); - } - - @Override - public int getMaxEnergyStored(ForgeDirection from) { - return (int)Math.round(getMaxEnergyStored() * RF_PER_INTERNAL); - } - - @Override - public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) { - int maxStored = getMaxEnergyStored(from); - if (maxStored == 0) { - return 0; - } - int energyStored = getEnergyStored(from); - - int toAdd = Math.min(maxReceive, maxStored - energyStored); - if (!simulate) { - energyStored_internal = (int)Math.min(getMaxEnergyStored(), energyStored_internal + toAdd / RF_PER_INTERNAL); - } - - return toAdd; - } - - @Override - public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) { - return 0; - } - - @Override - public boolean canInterface(ForgeDirection from) { - return (getMaxEnergyStored() != 0); - } - - // Forge overrides - @Override - public void readFromNBT(NBTTagCompound tag) { - super.readFromNBT(tag); - this.energyStored_internal = tag.getInteger("energy"); - } - - @Override - public void writeToNBT(NBTTagCompound tag) { - super.writeToNBT(tag); - tag.setInteger("energy", this.energyStored_internal); - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/WarpTE.java b/src/cr0s/WarpDrive/machines/WarpTE.java deleted file mode 100644 index de31461a..00000000 --- a/src/cr0s/WarpDrive/machines/WarpTE.java +++ /dev/null @@ -1,51 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cr0s.WarpDrive.Vector3; -import net.minecraft.tileentity.TileEntity; - -public abstract class WarpTE extends TileEntity -{ - public static final Vector3[] adjacentSideOffsets = new Vector3[6]; - static - { - adjacentSideOffsets[0] = new Vector3( 0, 0, 1); - adjacentSideOffsets[1] = new Vector3( 0, 0,-1); - adjacentSideOffsets[2] = new Vector3( 0, 1, 0); - adjacentSideOffsets[3] = new Vector3( 0,-1, 0); - adjacentSideOffsets[4] = new Vector3( 1, 0, 0); - adjacentSideOffsets[5] = new Vector3(-1, 0, 0); - } - - protected static int toInt(double d) { - return (int) Math.round(d); - } - - protected static int toInt(Object o) { - return toInt(toDouble(o)); - } - - protected static double toDouble(Object o) { - return Double.parseDouble(o.toString()); - } - - protected static boolean toBool(Object o) { - if (o == null) { - return false; - } - if (o instanceof Boolean) { - return ((Boolean) o); - } - if (o.toString() == "true" || o.toString() == "1.0" || o.toString() == "1" || o.toString() == "y" || o.toString() == "yes") { - return true; - } - return false; - } - - protected static int clamp(int a, int min, int max) { - return Math.min(max, Math.max(a, min)); - } - - protected static double clamp(double a, double min, double max) { - return Math.min(max, Math.max(a, min)); - } -} diff --git a/src/cr0s/serverMods/AntiFallDamage.java b/src/cr0s/serverMods/AntiFallDamage.java new file mode 100644 index 00000000..059fa6c3 --- /dev/null +++ b/src/cr0s/serverMods/AntiFallDamage.java @@ -0,0 +1,42 @@ +package cr0s.serverMods; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.MathHelper; +import net.minecraftforge.event.ForgeSubscribe; +import net.minecraftforge.event.entity.living.LivingFallEvent; + +/** + * Гашение урона при падении с джетпаком или квантовыми бутсами + * @author Cr0s + */ +public class AntiFallDamage +{ + private final int JETPACK_ID = 29954; + private final int ELECTRIC_JETPACK_ID = 29953; + private final int QUANTUM_BOOTS_ID = 29915; + + @ForgeSubscribe + public void livingFall(LivingFallEvent event) + { + EntityLivingBase entity = event.entityLiving; + float distance = event.distance; + + if (entity instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) entity; + int check = MathHelper.ceiling_float_int(distance - 3.0F); + + if (check > 0) // Падение может нанести урон + { + // Проверяем наличие защиты + if ((player.getCurrentArmor(0) != null && player.getCurrentArmor(0).itemID == QUANTUM_BOOTS_ID) || + (player.getCurrentArmor(2) != null && player.getCurrentArmor(2).itemID == JETPACK_ID) || + (player.getCurrentArmor(2) != null && player.getCurrentArmor(2).itemID == ELECTRIC_JETPACK_ID)) + { + event.setCanceled(true); // Блокируем падение, если защита есть + } + } + } + } +} diff --git a/src/cr0s/serverMods/CommonProxy.java b/src/cr0s/serverMods/CommonProxy.java new file mode 100644 index 00000000..36d96e05 --- /dev/null +++ b/src/cr0s/serverMods/CommonProxy.java @@ -0,0 +1,9 @@ +package cr0s.serverMods; + +public class CommonProxy +{ + // some code goes here + public void setupLoginHook() + { + } +} \ No newline at end of file diff --git a/src/cr0s/serverMods/LoginHookClass.java b/src/cr0s/serverMods/LoginHookClass.java new file mode 100644 index 00000000..db624d92 --- /dev/null +++ b/src/cr0s/serverMods/LoginHookClass.java @@ -0,0 +1,135 @@ +package cr0s.serverMods; + +import cpw.mods.fml.common.network.IConnectionHandler; +import cpw.mods.fml.common.network.Player; +import java.io.*; +import java.util.logging.Level; +import java.util.logging.Logger; +import net.minecraft.network.INetworkManager; +import net.minecraft.network.NetLoginHandler; +import net.minecraft.network.packet.NetHandler; +import net.minecraft.network.packet.Packet1Login; +import net.minecraft.server.MinecraftServer; +import com.google.common.base.Strings; + +public class LoginHookClass implements IConnectionHandler +{ + private String checkLogin(String s) throws FileNotFoundException, IOException + { + if (s.indexOf(".") == -1 || s.split("\\.").length != 2) + return "Никнейм и пароль должны быть разделены точками."; + + if (!s.matches("^[a-zA-Z0-9_.]+$")) + return "Имя пользователя или пароль содержат недопустимые символы."; + + String s4 = s.split("\\.")[0].trim(); + String s5 = s.split("\\.")[1].trim(); + + if (s4.length() < 2 && !s4.equals("Q")) + return "Имя пользователя слишком короткое."; + + if (s5.length() < 3) + return "Пароль слишком короткий."; + + if (s4.length() > 15) + return "Слишком длинный логин! (>15)"; + + BufferedReader bufferedreader = new BufferedReader(new FileReader(MinecraftServer.getServer().getFile("users.txt"))); + + String s1; + + while ((s1 = bufferedreader.readLine()) != null) + { + String s2; + String s3; + + try + { + s2 = s1.split("\\.")[0]; + s3 = s1.split("\\.")[1]; + } + catch (Exception exception) + { + bufferedreader.close(); + return "login.password error, database is corrupted."; + } + + if (s2.toLowerCase().equals(s4.toLowerCase())) + { + if (!s3.equals(s5)) + { + System.out.println((new StringBuilder()).append(s).append(" failed to login (pwd: ").append(s3).append(")").toString()); + bufferedreader.close(); + return "Неправильный пароль!"; + } + else + { + bufferedreader.close(); + return ""; + } + } + } + + bufferedreader.close(); + PrintWriter printwriter = new PrintWriter(new FileWriter(MinecraftServer.getServer().getFile("users.txt"), true)); + printwriter.println(s); + printwriter.close(); + return ""; + } + + @Override + public void playerLoggedIn(Player player, NetHandler netHandler, INetworkManager manager) + { + //throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String connectionReceived(NetLoginHandler netHandler, INetworkManager manager) + { + String kickReason = ""; + String s = netHandler.clientUsername; + + try + { + kickReason = checkLogin(s); + System.out.println("[SERVER MODS] Logging in user: " + s + " Result: " + kickReason); + } + catch (FileNotFoundException ex) + { + Logger.getLogger(LoginHookClass.class.getName()).log(Level.SEVERE, null, ex); + } + catch (IOException ex) + { + Logger.getLogger(LoginHookClass.class.getName()).log(Level.SEVERE, null, ex); + } + + if (Strings.isNullOrEmpty(kickReason)) + netHandler.clientUsername = s.split("\\.")[0]; + + return kickReason; + } + + @Override + public void connectionOpened(NetHandler netClientHandler, String server, int port, INetworkManager manager) + { + //throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void connectionOpened(NetHandler netClientHandler, MinecraftServer server, INetworkManager manager) + { + //throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void connectionClosed(INetworkManager manager) + { + //throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void clientLoggedIn(NetHandler clientHandler, INetworkManager manager, Packet1Login login) + { + //throw new UnsupportedOperationException("Not supported yet."); + } +} \ No newline at end of file diff --git a/src/cr0s/serverMods/ServerMods.java b/src/cr0s/serverMods/ServerMods.java new file mode 100644 index 00000000..0b043886 --- /dev/null +++ b/src/cr0s/serverMods/ServerMods.java @@ -0,0 +1,47 @@ +package cr0s.serverMods; + +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Mod.Init; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.Mod.PostInit; +import cpw.mods.fml.common.Mod.PreInit; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.network.NetworkMod; +import net.minecraftforge.common.MinecraftForge; +import cr0s.WarpDrive.SpaceEventHandler; + +@Mod(modid = "ServerMods", name = "ServerMods", version = "0.0.1") +@NetworkMod(clientSideRequired = false, serverSideRequired = true, connectionHandler = LoginHookClass.class) + +/** + * @author Cr0s + */ +public class ServerMods +{ + // The instance of your mod that Forge uses. + @Instance("ServerMods") + public static ServerMods instance; + + @PreInit + public void preInit(FMLPreInitializationEvent event) + { + // Stub Method + } + + @Init + public void load(FMLInitializationEvent event) + { + // Включить авторизацию (включается автоматически) + //proxy.setupLoginHook(); + // Снять урон от падения с джетпаком и крузис-тапками + MinecraftForge.EVENT_BUS.register(new AntiFallDamage()); + } + + @PostInit + public void postInit(FMLPostInitializationEvent event) + { + // Stub Method + } +} \ No newline at end of file diff --git a/src/mcmod.info b/src/mcmod.info deleted file mode 100644 index 478681d9..00000000 --- a/src/mcmod.info +++ /dev/null @@ -1,21 +0,0 @@ -[ -{ - "modid": "warpdrive", - "name": "WarpDrive", - "description": "Create your own space ship from any blocks (excluding bedrock) and sail it trough space. -Explore the space dimension: asteroids (filled with ores), asteroid fields, gas clouds, planetoids, stars, and NPC-ships. -Jump to hyperspace for long-range traveling! -Set up laser cannons on your ship to fight with other players' ships, or craft a mining laser to collect valuable resources on Earth or in space. -Cloak your ship, base or a space station from your enemies! -And lots more!", - "version": "1.2.5.0", - "mcversion": "1.6.4", - "url": "http://www.minecraftforum.net/topic/1444954-", - "updateUrl": "http://files.minecraftforge.net/SecretRoomsMod/SecretRoomsMod-universal-latest.zip", - "authors": ["Cr0s", "DarkholmeTenk", "drpepper240", "ZLOFENIX", "LemADEC"], - "credits": "Original concept and implementation by Cr0s, modified by ZLOFENIX, DarkholmeTenk & drpepper240. Merged, bugfixed and ported to WWM by LemADEC.", - "logoFile": "", - "screenshots": [], - "dependencies": [] -} -] From 748d7e08b1caa34bdca574809eb2fb25770d4acd Mon Sep 17 00:00:00 2001 From: drPepper Date: Fri, 8 Aug 2014 20:50:15 +0400 Subject: [PATCH 2/5] getFirstHit fix --- src/cr0s/WarpDrive/TileEntityLaser.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cr0s/WarpDrive/TileEntityLaser.java b/src/cr0s/WarpDrive/TileEntityLaser.java index c0234152..306f36b6 100644 --- a/src/cr0s/WarpDrive/TileEntityLaser.java +++ b/src/cr0s/WarpDrive/TileEntityLaser.java @@ -66,7 +66,7 @@ public class TileEntityLaser extends TileEntity implements IPeripheral private int hitZ = 0; private int hitBlockId = 0; private int hitBlockMeta = 0; - private float hitBlockResistance = 0; + private float hitBlockResistance = -1; private int camUpdateTicks = 20; private int registryUpdateTicks = 20 * 10; @@ -649,9 +649,9 @@ public class TileEntityLaser extends TileEntity implements IPeripheral case 3: // getFirstHit() if (firstHit != null) { - int blockID = worldObj.getBlockId(firstHit.blockX, firstHit.blockY, firstHit.blockZ); - int blockMeta = worldObj.getBlockMetadata(firstHit.blockX, firstHit.blockY, firstHit.blockZ); - float blockResistance = Block.blocksList[blockID].blockResistance; + int blockID = hitBlockId; + int blockMeta = hitBlockMeta; + float blockResistance = hitBlockResistance; Object[] info = { hitX, hitY, hitZ, hitBlockId, hitBlockMeta, (Float)hitBlockResistance }; return info; } From 965730076420cca9cbb4ada75be6114a0b8fb0cc Mon Sep 17 00:00:00 2001 From: drPepper Date: Fri, 8 Aug 2014 20:52:26 +0400 Subject: [PATCH 3/5] getFirstHit fix --- src/cr0s/WarpDrive/TileEntityLaser.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/cr0s/WarpDrive/TileEntityLaser.java b/src/cr0s/WarpDrive/TileEntityLaser.java index 306f36b6..761a21f3 100644 --- a/src/cr0s/WarpDrive/TileEntityLaser.java +++ b/src/cr0s/WarpDrive/TileEntityLaser.java @@ -649,9 +649,6 @@ public class TileEntityLaser extends TileEntity implements IPeripheral case 3: // getFirstHit() if (firstHit != null) { - int blockID = hitBlockId; - int blockMeta = hitBlockMeta; - float blockResistance = hitBlockResistance; Object[] info = { hitX, hitY, hitZ, hitBlockId, hitBlockMeta, (Float)hitBlockResistance }; return info; } From e6ea013df49ded5a77e3d6b49cc06f3fc6f3734e Mon Sep 17 00:00:00 2001 From: p1rx Date: Wed, 13 Aug 2014 07:21:02 +0400 Subject: [PATCH 4/5] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BA=D0=B0=D0=BD=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B3=D1=80=D0=B5=D0=B3?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D1=88=D0=B8=D0=BD=20=D1=88=D0=B8=D0=BF=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=D0=BD=D0=B5=D1=80=D0=BE=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cr0s/WarpDrive/TileEntityShipScanner.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/cr0s/WarpDrive/TileEntityShipScanner.java b/src/cr0s/WarpDrive/TileEntityShipScanner.java index 0884c61f..efc88ff6 100644 --- a/src/cr0s/WarpDrive/TileEntityShipScanner.java +++ b/src/cr0s/WarpDrive/TileEntityShipScanner.java @@ -369,16 +369,29 @@ public class TileEntityShipScanner extends TileEntity implements IEnergySink, if (blockID != 0) { TileEntity te = worldObj.getBlockTileEntity(core.minX + x, core.minY + y, core.minZ + z); - if (te != null && !(te instanceof IInventory)) + if (te != null/* && !(te instanceof IInventory)*/) { try { NBTTagCompound tileTag = new NBTTagCompound(); te.writeToNBT(tileTag); + // Clear inventory. + if (te instanceof IInventory) { + TileEntity tmp_te = TileEntity.createAndLoadEntity(tileTag); + if (tmp_te instanceof IInventory) + for (int i = 0; i < ((IInventory)tmp_te).getSizeInventory(); i++) + ((IInventory)tmp_te).setInventorySlotContents(i, null); + tmp_te.writeToNBT(tileTag); + } + // Remove energy from energy storages if (te instanceof IEnergyTile) { + // IC2 if (tileTag.hasKey("energy")) tileTag.setInteger("energy", 0); + // Gregtech + if (tileTag.hasKey("mStoredEnergy")) + tileTag.setInteger("mStoredEnergy", 0); } // Transform TE's coordinates from local axis to .schematic offset-axis From 97df0feb29e5a5cdc9412ecf5452411a8fcb6a7b Mon Sep 17 00:00:00 2001 From: Cr0s Date: Wed, 27 Aug 2014 16:53:59 +0400 Subject: [PATCH 5/5] Fixed regression that broke IC2 reactors and some machines IC2 reactors was fixed in 86e96a43ee2b990875723ba11415d3244023e1d8 but fix is regressed by last pull-requests. --- src/cr0s/WarpDrive/EntityJump.java | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/cr0s/WarpDrive/EntityJump.java b/src/cr0s/WarpDrive/EntityJump.java index 64055e2c..e040355c 100644 --- a/src/cr0s/WarpDrive/EntityJump.java +++ b/src/cr0s/WarpDrive/EntityJump.java @@ -989,8 +989,6 @@ public class EntityJump extends Entity newTileEntity = TileEntity.createAndLoadEntity(oldnbt); newTileEntity.invalidate(); } - else if (blockID == WarpDriveConfig.i.GT_Machine) - newTileEntity = TileEntity.createAndLoadEntity(oldnbt); else if (blockID == WarpDriveConfig.i.AS_Turbine) { if (oldnbt.hasKey("zhuYao")) @@ -1001,21 +999,17 @@ public class EntityJump extends Entity nbt1.setDouble("z", newZ); oldnbt.setTag("zhuYao", nbt1); } + newTileEntity = TileEntity.createAndLoadEntity(oldnbt); } - else - { - newTileEntity = targetWorld.getBlockTileEntity(newX, newY, newZ); - if (newTileEntity == null) - { - System.out.println("[EJ] Error moving tileEntity! TE is null"); - return false; - } - newTileEntity.invalidate(); - newTileEntity.readFromNBT(oldnbt); + + if (newTileEntity == null) { + newTileEntity = TileEntity.createAndLoadEntity(oldnbt); } + newTileEntity.worldObj = targetWorld; newTileEntity.validate(); + worldObj.removeBlockTileEntity(oldX, oldY, oldZ); targetWorld.setBlockTileEntity(newX, newY, newZ, newTileEntity); } @@ -1220,4 +1214,4 @@ public class EntityJump extends Entity e.printStackTrace(); } } -} \ No newline at end of file +}