From dffbbd154884c37c8cc9b6bbd8c71710b2831050 Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Wed, 9 Nov 2022 22:15:45 +0100 Subject: [PATCH] feat: initial port --- .gitignore | 4 + austri3Fix.md | 16 + build.gradle | 28 +- gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 0 .../java/atomicscience/api/AtomicScience.java | 17 + .../atomicscience/api/BlockRadioactive.java | 144 ++++ .../atomicscience/api/IAntiPoisonArmor.java | 14 + .../atomicscience/api/IAntiPoisonBlock.java | 9 + .../atomicscience/api/IElectromagnet.java | 8 + .../atomicscience/api/IFissileMaterial.java | 8 + .../java/atomicscience/api/IHeatSource.java | 6 + src/main/java/atomicscience/api/IReactor.java | 7 + .../atomicscience/api/ISteamReceptor.java | 7 + .../java/atomicscience/api/ITemperature.java | 9 + src/main/java/atomicscience/api/Plasma.java | 17 + .../java/atomicscience/api/poison/Poison.java | 77 +++ .../api/poison/PoisonRadiation.java | 66 ++ .../api/poison/PotionRadiation.java | 38 ++ src/main/java/calclavia/lib/Calclavia.java | 32 + .../java/calclavia/lib/CalculationHelper.java | 111 ++++ src/main/java/calclavia/lib/IPlayerUsing.java | 8 + .../calclavia/lib/IUniversalEnergyTile.java | 7 + .../lib/TileEntityUniversalProducer.java | 25 + .../lib/TileEntityUniversalRunnable.java | 28 + .../lib/TileEntityUniversalStorable.java | 28 + .../java/calclavia/lib/UniversalRecipes.java | 102 +++ .../java/calclavia/lib/gui/ContainerBase.java | 96 +++ .../calclavia/lib/gui/GuiContainerBase.java | 296 +++++++++ .../java/calclavia/lib/gui/GuiScreenBase.java | 271 ++++++++ .../java/calclavia/lib/gui/GuiSlotType.java | 23 + .../lib/render/CalclaviaRenderHelper.java | 111 ++++ .../java/calclavia/lib/render/ITagRender.java | 9 + .../lib/render/RenderTaggedTile.java | 64 ++ .../computercraft/api/ComputerCraftAPI.java | 315 +++++++++ .../computercraft/api/filesystem/IMount.java | 57 ++ .../api/filesystem/IWritableMount.java | 52 ++ .../api/filesystem/package-info.java | 10 + .../computercraft/api/lua/ILuaContext.java | 58 ++ .../computercraft/api/lua/ILuaObject.java | 26 + .../computercraft/api/lua/ILuaTask.java | 12 + .../computercraft/api/lua/LuaException.java | 36 + .../computercraft/api/lua/package-info.java | 10 + .../computercraft/api/media/IMedia.java | 59 ++ .../api/media/IMediaProvider.java | 23 + .../computercraft/api/media/package-info.java | 10 + .../computercraft/api/package-info.java | 10 + .../api/peripheral/IComputerAccess.java | 102 +++ .../api/peripheral/IPeripheral.java | 100 +++ .../api/peripheral/IPeripheralProvider.java | 23 + .../api/peripheral/package-info.java | 10 + .../ITurtlePermissionProvider.java | 19 + .../api/permissions/package-info.java | 10 + .../redstone/IBundledRedstoneProvider.java | 23 + .../api/redstone/package-info.java | 10 + .../api/turtle/ITurtleAccess.java | 168 +++++ .../api/turtle/ITurtleCommand.java | 25 + .../api/turtle/ITurtleUpgrade.java | 94 +++ .../api/turtle/TurtleAnimation.java | 22 + .../api/turtle/TurtleCommandResult.java | 73 +++ .../computercraft/api/turtle/TurtleSide.java | 23 + .../api/turtle/TurtleUpgradeType.java | 27 + .../computercraft/api/turtle/TurtleVerb.java | 26 + .../api/turtle/package-info.java | 10 + src/main/java/icbm/api/IAmmunition.java | 10 + src/main/java/icbm/api/IBlockFrequency.java | 9 + src/main/java/icbm/api/ICBM.java | 41 ++ src/main/java/icbm/api/ICBMFlags.java | 11 + .../java/icbm/api/ICamouflageMaterial.java | 5 + src/main/java/icbm/api/IHackable.java | 10 + src/main/java/icbm/api/IItemFrequency.java | 10 + .../java/icbm/api/ILauncherContainer.java | 13 + .../java/icbm/api/ILauncherController.java | 28 + src/main/java/icbm/api/IMissile.java | 26 + src/main/java/icbm/api/IMissileLockable.java | 11 + src/main/java/icbm/api/ITracker.java | 11 + src/main/java/icbm/api/LauncherType.java | 14 + src/main/java/icbm/api/RadarRegistry.java | 110 ++++ .../icbm/api/explosion/ExplosionEvent.java | 36 + .../java/icbm/api/explosion/IEMPBlock.java | 10 + .../java/icbm/api/explosion/IEMPItem.java | 11 + .../java/icbm/api/explosion/IExplosive.java | 23 + .../api/explosion/IExplosiveContainer.java | 8 + .../icbm/api/explosion/IExplosiveIgnore.java | 8 + src/main/java/icbm/api/sentry/IAATarget.java | 13 + src/main/java/icbm/core/BSulfurOre.java | 38 ++ src/main/java/icbm/core/GenSulfur.java | 97 +++ src/main/java/icbm/core/HaoMa.java | 26 + src/main/java/icbm/core/ICBMTab.java | 31 + src/main/java/icbm/core/MainBase.java | 182 +++++ src/main/java/icbm/core/Pair.java | 33 + src/main/java/icbm/core/di/BICBM.java | 75 +++ .../java/icbm/core/di/ItElectricICBM.java | 13 + src/main/java/icbm/core/di/ItICBM.java | 13 + src/main/java/icbm/core/di/MICBM.java | 10 + src/main/java/icbm/gangshao/ClientProxy.java | 86 +++ src/main/java/icbm/gangshao/CommonProxy.java | 63 ++ src/main/java/icbm/gangshao/IAmmunition.java | 13 + src/main/java/icbm/gangshao/IAutoSentry.java | 16 + src/main/java/icbm/gangshao/ICBMSentry.java | 230 +++++++ src/main/java/icbm/gangshao/ISentry.java | 18 + .../java/icbm/gangshao/ISpecialAccess.java | 18 + .../java/icbm/gangshao/ITurretUpgrade.java | 8 + .../java/icbm/gangshao/ProjectileType.java | 9 + src/main/java/icbm/gangshao/SlotTurret.java | 22 + .../icbm/gangshao/access/AccessLevel.java | 30 + .../gangshao/access/GlobalAccessLoader.java | 50 ++ .../gangshao/access/GlobalAccessManager.java | 135 ++++ .../java/icbm/gangshao/access/UserAccess.java | 78 +++ .../gangshao/container/ContainerTerminal.java | 26 + .../container/ContainerTurretPlatform.java | 98 +++ .../gangshao/damage/EntityTileDamagable.java | 189 ++++++ .../icbm/gangshao/damage/IHealthTile.java | 18 + .../gangshao/damage/TileDamageSource.java | 28 + .../java/icbm/gangshao/muoxing/MLeiShe.java | 329 ++++++++++ .../icbm/gangshao/muoxing/ModelAATurret.java | 371 +++++++++++ .../icbm/gangshao/muoxing/ModelGunTurret.java | 338 ++++++++++ .../icbm/gangshao/muoxing/ModelRailgun.java | 109 +++ .../gangshao/muoxing/ModelSentryCannon.java | 209 ++++++ .../icbm/gangshao/muoxing/ModelTurretMed.java | 224 +++++++ .../gangshao/packet/PacketHandlerTurret.java | 26 + .../icbm/gangshao/packet/PacketTurret.java | 92 +++ .../platform/BlockTurretPlatform.java | 130 ++++ .../icbm/gangshao/platform/TPlatform.java | 347 ++++++++++ .../render/BlockRenderingHandler.java | 77 +++ .../java/icbm/gangshao/render/FXBeam.java | 182 +++++ .../java/icbm/gangshao/render/RAATurret.java | 68 ++ .../java/icbm/gangshao/render/RESeat.java | 16 + .../java/icbm/gangshao/render/RGunTurret.java | 67 ++ .../icbm/gangshao/render/RLaserTurret.java | 74 +++ .../java/icbm/gangshao/render/RRailgun.java | 41 ++ .../java/icbm/gangshao/saving/INbtSave.java | 11 + .../icbm/gangshao/saving/SaveManager.java | 50 ++ .../icbm/gangshao/shimian/GuiButtonArrow.java | 44 ++ .../icbm/gangshao/shimian/GuiButtonImage.java | 61 ++ .../gangshao/shimian/GuiPlatformAccess.java | 202 ++++++ .../gangshao/shimian/GuiPlatformBase.java | 174 +++++ .../shimian/GuiPlatformContainer.java | 161 +++++ .../gangshao/shimian/GuiPlatformSlots.java | 58 ++ .../gangshao/shimian/GuiPlatformTerminal.java | 141 ++++ .../java/icbm/gangshao/shimian/IScroll.java | 9 + .../java/icbm/gangshao/task/LookHelper.java | 78 +++ src/main/java/icbm/gangshao/task/Task.java | 30 + .../icbm/gangshao/task/TaskKillTarget.java | 25 + .../java/icbm/gangshao/task/TaskManager.java | 55 ++ .../icbm/gangshao/task/TaskSearchTarget.java | 66 ++ .../icbm/gangshao/terminal/ITerminal.java | 11 + .../gangshao/terminal/TerminalCommand.java | 23 + .../gangshao/terminal/TileEntityTerminal.java | 270 ++++++++ .../terminal/command/CommandAccess.java | 87 +++ .../terminal/command/CommandDestroy.java | 59 ++ .../gangshao/terminal/command/CommandGet.java | 74 +++ .../terminal/command/CommandHelp.java | 77 +++ .../terminal/command/CommandRegistry.java | 48 ++ .../terminal/command/CommandTarget.java | 99 +++ .../terminal/command/CommandUser.java | 89 +++ .../icbm/gangshao/turret/BlockTurret.java | 229 +++++++ .../java/icbm/gangshao/turret/ItemAmmo.java | 113 ++++ .../icbm/gangshao/turret/ItemBlockTurret.java | 21 + .../icbm/gangshao/turret/TTurretBase.java | 381 +++++++++++ .../icbm/gangshao/turret/mount/ESeat.java | 108 +++ .../icbm/gangshao/turret/mount/TPaoTaiQi.java | 97 +++ .../gangshao/turret/mount/TRailgunTurret.java | 224 +++++++ .../gangshao/turret/sentries/TAATurret.java | 89 +++ .../turret/sentries/TAutomaticTurret.java | 296 +++++++++ .../turret/sentries/TLaserTurret.java | 108 +++ .../turret/sentries/TMachineGunTurret.java | 51 ++ .../turret/upgrades/ItPaoTaiUpgrades.java | 76 +++ src/main/java/icbm/wanyi/ClientProxy.java | 37 ++ src/main/java/icbm/wanyi/CommonProxy.java | 31 + src/main/java/icbm/wanyi/IBSpikes.java | 25 + src/main/java/icbm/wanyi/ICBMContraption.java | 195 ++++++ src/main/java/icbm/wanyi/ItAntidote.java | 37 ++ .../java/icbm/wanyi/ItSignalDisrupter.java | 63 ++ src/main/java/icbm/wanyi/ItTracker.java | 122 ++++ src/main/java/icbm/wanyi/ItemTracker.java | 6 + .../wanyi/ProximityDetectorModePacket.java | 110 ++++ .../ProximityDetectorModePacketHandler.java | 26 + .../SetSignalDisrupterFrequencyPacket.java | 22 + ...SignalDisrupterFrequencyPacketHandler.java | 24 + src/main/java/icbm/wanyi/TextureTracker.java | 96 +++ src/main/java/icbm/wanyi/b/BCamouflage.java | 179 +++++ src/main/java/icbm/wanyi/b/BConcrete.java | 99 +++ src/main/java/icbm/wanyi/b/BGlassButton.java | 36 + .../icbm/wanyi/b/BGlassPressurePlate.java | 64 ++ .../java/icbm/wanyi/b/BGlassReinforced.java | 71 ++ .../java/icbm/wanyi/b/BProximityDetector.java | 61 ++ src/main/java/icbm/wanyi/b/BSpikes.java | 177 +++++ src/main/java/icbm/wanyi/b/IBConcrete.java | 31 + src/main/java/icbm/wanyi/b/TCamouflage.java | 139 ++++ .../java/icbm/wanyi/b/TProximityDetector.java | 178 +++++ .../icbm/wanyi/gui/GProximityDetector.java | 251 +++++++ .../java/icbm/wanyi/gui/GSignalDisrupter.java | 76 +++ src/main/java/icbm/zhapin/ClientProxy.java | 203 ++++++ src/main/java/icbm/zhapin/CommonProxy.java | 97 +++ src/main/java/icbm/zhapin/Du.java | 44 ++ src/main/java/icbm/zhapin/EGravityBlock.java | 175 +++++ src/main/java/icbm/zhapin/ELightBeam.java | 92 +++ src/main/java/icbm/zhapin/ESuiPian.java | 426 ++++++++++++ src/main/java/icbm/zhapin/ICBMCommand.java | 73 +++ src/main/java/icbm/zhapin/ICBMExplosion.java | 554 ++++++++++++++++ src/main/java/icbm/zhapin/ItemUsePacket.java | 46 ++ .../icbm/zhapin/ItemUsePacketHandler.java | 66 ++ src/main/java/icbm/zhapin/TickHandler.java | 33 + src/main/java/icbm/zhapin/cart/ECart.java | 109 +++ src/main/java/icbm/zhapin/cart/ItCart.java | 69 ++ .../icbm/zhapin/daodan/DAntiBallistic.java | 81 +++ .../java/icbm/zhapin/daodan/DCluster.java | 49 ++ src/main/java/icbm/zhapin/daodan/DHoming.java | 109 +++ src/main/java/icbm/zhapin/daodan/DModule.java | 13 + .../icbm/zhapin/daodan/DNuclearCluster.java | 51 ++ .../java/icbm/zhapin/daodan/EMissile.java | 619 ++++++++++++++++++ .../java/icbm/zhapin/daodan/ItMissile.java | 36 + .../icbm/zhapin/daodan/ItModuleMissile.java | 43 ++ .../java/icbm/zhapin/daodan/MissileBase.java | 117 ++++ .../java/icbm/zhapin/daodan/MissileSound.java | 124 ++++ .../java/icbm/zhapin/dianqi/ItDefuser.java | 72 ++ .../icbm/zhapin/dianqi/ItLaserDesignator.java | 287 ++++++++ .../java/icbm/zhapin/dianqi/ItRadarGun.java | 144 ++++ .../icbm/zhapin/dianqi/ItRemoteDetonator.java | 159 +++++ .../icbm/zhapin/dianqi/ItRocketLauncher.java | 79 +++ .../java/icbm/zhapin/fx/FXAntimatter.java | 109 +++ src/main/java/icbm/zhapin/fx/FXPortal.java | 23 + src/main/java/icbm/zhapin/fx/FXShockwave.java | 65 ++ src/main/java/icbm/zhapin/fx/FXSmoke.java | 30 + src/main/java/icbm/zhapin/gui/GEmpTower.java | 149 +++++ src/main/java/icbm/zhapin/gui/GFaSheDi.java | 46 ++ .../icbm/zhapin/gui/GMissileLauncher.java | 186 ++++++ .../java/icbm/zhapin/gui/GRadarTower.java | 244 +++++++ .../java/icbm/zhapin/gui/GXiaoFaSheQi.java | 154 +++++ src/main/java/icbm/zhapin/jiqi/BMachine.java | 331 ++++++++++ src/main/java/icbm/zhapin/jiqi/IBMachine.java | 75 +++ .../icbm/zhapin/jiqi/LauncherManager.java | 48 ++ .../icbm/zhapin/jiqi/TCruiseLauncher.java | 393 +++++++++++ src/main/java/icbm/zhapin/jiqi/TEmpTower.java | 166 +++++ src/main/java/icbm/zhapin/jiqi/TLauncher.java | 137 ++++ .../zhapin/jiqi/TLauncherControlPanel.java | 267 ++++++++ .../icbm/zhapin/jiqi/TLauncherController.java | 149 +++++ .../icbm/zhapin/jiqi/TLauncherPlatform.java | 441 +++++++++++++ .../icbm/zhapin/jiqi/TMissileCoordinator.java | 41 ++ .../java/icbm/zhapin/jiqi/TRadarTower.java | 426 ++++++++++++ .../icbm/zhapin/muoxing/daodan/MMBingDan.java | 260 ++++++++ .../zhapin/muoxing/daodan/MMChaoShengBuo.java | 297 +++++++++ .../icbm/zhapin/muoxing/daodan/MMDianCi.java | 268 ++++++++ .../icbm/zhapin/muoxing/daodan/MMDuQi.java | 132 ++++ .../icbm/zhapin/muoxing/daodan/MMFanDan.java | 260 ++++++++ .../icbm/zhapin/muoxing/daodan/MMFanWuSu.java | 260 ++++++++ .../zhapin/muoxing/daodan/MMFenZiDan.java | 284 ++++++++ .../zhapin/muoxing/daodan/MMGanRanDu.java | 276 ++++++++ .../icbm/zhapin/muoxing/daodan/MMHongSu.java | 260 ++++++++ .../zhapin/muoxing/daodan/MMHuanYuan.java | 284 ++++++++ .../icbm/zhapin/muoxing/daodan/MMHuo.java | 164 +++++ .../java/icbm/zhapin/muoxing/daodan/MMLa.java | 164 +++++ .../icbm/zhapin/muoxing/daodan/MMLiZi.java | 332 ++++++++++ .../icbm/zhapin/muoxing/daodan/MMPiaoFu.java | 108 +++ .../java/icbm/zhapin/muoxing/daodan/MMQi.java | 188 ++++++ .../icbm/zhapin/muoxing/daodan/MMQunDan.java | 284 ++++++++ .../zhapin/muoxing/daodan/MMShengBuo.java | 236 +++++++ .../icbm/zhapin/muoxing/daodan/MMTaiYang.java | 252 +++++++ .../icbm/zhapin/muoxing/daodan/MMTuPuo.java | 228 +++++++ .../icbm/zhapin/muoxing/daodan/MMTui.java | 164 +++++ .../icbm/zhapin/muoxing/daodan/MMWan.java | 300 +++++++++ .../zhapin/muoxing/daodan/MMXiaoQunDan.java | 164 +++++ .../icbm/zhapin/muoxing/daodan/MMYaSuo.java | 148 +++++ .../icbm/zhapin/muoxing/daodan/MMYuanZi.java | 236 +++++++ .../icbm/zhapin/muoxing/daodan/MMZhen.java | 188 ++++++ .../zhapin/muoxing/daodan/MMZhuiZhong.java | 148 +++++ .../icbm/zhapin/muoxing/jiqi/MDianCiQi.java | 119 ++++ .../icbm/zhapin/muoxing/jiqi/MFaSheDi0.java | 57 ++ .../icbm/zhapin/muoxing/jiqi/MFaSheDi1.java | 57 ++ .../icbm/zhapin/muoxing/jiqi/MFaSheDi2.java | 41 ++ .../zhapin/muoxing/jiqi/MFaSheDiRail0.java | 113 ++++ .../zhapin/muoxing/jiqi/MFaSheDiRail1.java | 135 ++++ .../zhapin/muoxing/jiqi/MFaSheDiRail2.java | 69 ++ .../icbm/zhapin/muoxing/jiqi/MFaSheJia.java | 41 ++ .../zhapin/muoxing/jiqi/MFaSheShiMuo0.java | 41 ++ .../zhapin/muoxing/jiqi/MFaSheShiMuo1.java | 41 ++ .../zhapin/muoxing/jiqi/MFaSheShiMuo2.java | 57 ++ .../java/icbm/zhapin/muoxing/jiqi/MLeiDa.java | 146 +++++ .../icbm/zhapin/muoxing/jiqi/MLeiShePao.java | 96 +++ .../icbm/zhapin/muoxing/jiqi/MLeiShePao2.java | 132 ++++ .../java/icbm/zhapin/muoxing/jiqi/MSMine.java | 63 ++ .../zhapin/muoxing/jiqi/MShouFaSheQi.java | 222 +++++++ .../zhapin/muoxing/jiqi/MXiaoFaSheQi.java | 104 +++ .../zhapin/muoxing/jiqi/MXiaoFaSheQiJia.java | 88 +++ .../icbm/zhapin/muoxing/jiqi/MYinDaoQi.java | 303 +++++++++ src/main/java/icbm/zhapin/po/PChuanRanDu.java | 76 +++ src/main/java/icbm/zhapin/po/PDaDu.java | 30 + src/main/java/icbm/zhapin/po/PDongShang.java | 46 ++ src/main/java/icbm/zhapin/po/PICBM.java | 12 + .../java/icbm/zhapin/render/REZhaDan.java | 82 +++ .../java/icbm/zhapin/render/REmpTower.java | 36 + .../java/icbm/zhapin/render/RFaSheDi.java | 69 ++ .../java/icbm/zhapin/render/RFaSheJia.java | 46 ++ .../java/icbm/zhapin/render/RFeiBlock.java | 113 ++++ .../java/icbm/zhapin/render/RGuangBang.java | 95 +++ src/main/java/icbm/zhapin/render/RHJiQi.java | 125 ++++ .../java/icbm/zhapin/render/RHZhaPin.java | 77 +++ .../java/icbm/zhapin/render/RItDaoDan.java | 80 +++ .../icbm/zhapin/render/RItRocketLauncher.java | 64 ++ .../zhapin/render/RLauncherControlPanel.java | 71 ++ .../java/icbm/zhapin/render/RMissile.java | 108 +++ .../java/icbm/zhapin/render/RRadarTower.java | 36 + src/main/java/icbm/zhapin/render/RSMine.java | 30 + .../java/icbm/zhapin/render/RShouLiuDan.java | 61 ++ .../java/icbm/zhapin/render/RSuiPian.java | 120 ++++ .../java/icbm/zhapin/render/RXiaoFaSheQi.java | 43 ++ .../java/icbm/zhapin/render/RYinDaoQi.java | 71 ++ src/main/java/icbm/zhapin/render/RZhaPin.java | 161 +++++ .../java/icbm/zhapin/rongqi/CFaShiDi.java | 67 ++ .../java/icbm/zhapin/rongqi/CXiaoFaSheQi.java | 78 +++ .../java/icbm/zhapin/zhapin/BExplosives.java | 372 +++++++++++ .../java/icbm/zhapin/zhapin/EExplosion.java | 154 +++++ .../java/icbm/zhapin/zhapin/EExplosive.java | 167 +++++ .../java/icbm/zhapin/zhapin/EGrenade.java | 244 +++++++ .../java/icbm/zhapin/zhapin/IBExplosive.java | 45 ++ .../java/icbm/zhapin/zhapin/ItGrenade.java | 134 ++++ .../java/icbm/zhapin/zhapin/TExplosive.java | 86 +++ src/main/java/icbm/zhapin/zhapin/ZhaPin.java | 444 +++++++++++++ .../zhapin/zhapin/ex/ExAntiGravitational.java | 178 +++++ .../icbm/zhapin/zhapin/ex/ExAntimatter.java | 122 ++++ .../icbm/zhapin/zhapin/ex/ExBreaching.java | 166 +++++ .../icbm/zhapin/zhapin/ex/ExChemical.java | 112 ++++ .../icbm/zhapin/zhapin/ex/ExCondensed.java | 171 +++++ .../icbm/zhapin/zhapin/ex/ExDebilitation.java | 99 +++ .../icbm/zhapin/zhapin/ex/ExDecayLand.java | 77 +++ .../java/icbm/zhapin/zhapin/ex/ExEmp.java | 62 ++ .../icbm/zhapin/zhapin/ex/ExEmpSignal.java | 85 +++ .../java/icbm/zhapin/zhapin/ex/ExEmpWave.java | 93 +++ .../java/icbm/zhapin/zhapin/ex/ExEnder.java | 156 +++++ .../icbm/zhapin/zhapin/ex/ExEndothermic.java | 212 ++++++ .../icbm/zhapin/zhapin/ex/ExEndothermic2.java | 149 +++++ .../icbm/zhapin/zhapin/ex/ExExothermic.java | 195 ++++++ .../icbm/zhapin/zhapin/ex/ExExothermic2.java | 188 ++++++ .../icbm/zhapin/zhapin/ex/ExHypersonic.java | 225 +++++++ .../icbm/zhapin/zhapin/ex/ExIncendiary.java | 127 ++++ .../icbm/zhapin/zhapin/ex/ExMutateLiving.java | 61 ++ .../java/icbm/zhapin/zhapin/ex/ExNuclear.java | 147 +++++ .../icbm/zhapin/zhapin/ex/ExPushPull.java | 187 ++++++ .../icbm/zhapin/zhapin/ex/ExRedMatter.java | 224 +++++++ .../icbm/zhapin/zhapin/ex/ExRejuvenation.java | 91 +++ .../java/icbm/zhapin/zhapin/ex/ExSMine.java | 119 ++++ .../icbm/zhapin/zhapin/ex/ExShrapnel.java | 110 ++++ .../java/icbm/zhapin/zhapin/ex/ExSonic.java | 201 ++++++ .../icbm/zhapin/zhapin/ex/ExThermobaric.java | 124 ++++ .../java/icbm/zhapin/zhapin/ex/ExThr.java | 32 + .../icbm/zhapin/zhapin/ex/ThrSheXian.java | 84 +++ src/main/java/mffs/api/Blacklist.java | 19 + src/main/java/mffs/api/IActivatable.java | 8 + .../mffs/api/IBiometricIdentifierLink.java | 11 + src/main/java/mffs/api/ICache.java | 10 + src/main/java/mffs/api/IFieldInteraction.java | 41 ++ src/main/java/mffs/api/IForceFieldBlock.java | 11 + src/main/java/mffs/api/IProjector.java | 14 + .../mffs/api/ISpecialForceManipulation.java | 10 + src/main/java/mffs/api/card/ICard.java | 5 + .../mffs/api/card/ICardIdentification.java | 17 + .../java/mffs/api/card/ICardInfinite.java | 5 + src/main/java/mffs/api/card/ICardLink.java | 11 + .../mffs/api/fortron/IFortronCapacitor.java | 12 + .../mffs/api/fortron/IFortronFrequency.java | 7 + .../mffs/api/fortron/IFortronStorage.java | 14 + .../modules/IInterdictionMatrixModule.java | 9 + src/main/java/mffs/api/modules/IModule.java | 22 + .../mffs/api/modules/IModuleAcceptor.java | 17 + .../java/mffs/api/modules/IProjectorMode.java | 17 + .../api/security/IBiometricIdentifier.java | 12 + .../api/security/IInterdictionMatrix.java | 24 + .../java/mffs/api/security/Permission.java | 45 ++ .../resources/assets/icbm/lang/de_DE.lang | 132 ++++ .../resources/assets/icbm/lang/en_US.lang | 166 +++++ .../resources/assets/icbm/lang/es_ES.lang | 133 ++++ .../resources/assets/icbm/lang/zh_CN.lang | 131 ++++ .../assets/icbm/textures/antimatter.png | Bin 0 -> 60138 bytes .../assets/icbm/textures/blackhole.png | Bin 0 -> 156774 bytes .../icbm/textures/blocks/barbedWire.png | Bin 0 -> 1332 bytes .../icbm/textures/blocks/camouflage.png | Bin 0 -> 4824 bytes .../assets/icbm/textures/blocks/concrete.png | Bin 0 -> 2741 bytes .../icbm/textures/blocks/concreteCompact.png | Bin 0 -> 2792 bytes .../textures/blocks/concreteReinforced.png | Bin 0 -> 2733 bytes .../explosive_antiGravitational_bottom.png | Bin 0 -> 4903 bytes .../explosive_antiGravitational_side.png | Bin 0 -> 4780 bytes .../explosive_antiGravitational_top.png | Bin 0 -> 4750 bytes .../blocks/explosive_antimatter_side.png | Bin 0 -> 16125 bytes .../explosive_antimatter_side.png.mcmeta | 8 + .../blocks/explosive_antimatter_top.png | Bin 0 -> 9439 bytes .../explosive_antimatter_top.png.mcmeta | 8 + .../textures/blocks/explosive_anvil_side.png | Bin 0 -> 5201 bytes .../textures/blocks/explosive_anvil_top.png | Bin 0 -> 4810 bytes .../blocks/explosive_attractive_side.png | Bin 0 -> 4582 bytes .../blocks/explosive_attractive_top.png | Bin 0 -> 4704 bytes .../icbm/textures/blocks/explosive_base_1.png | Bin 0 -> 4357 bytes .../icbm/textures/blocks/explosive_base_2.png | Bin 0 -> 4579 bytes .../icbm/textures/blocks/explosive_base_3.png | Bin 0 -> 4383 bytes .../textures/blocks/explosive_bottom_1.png | Bin 0 -> 4598 bytes .../textures/blocks/explosive_bottom_2.png | Bin 0 -> 4657 bytes .../textures/blocks/explosive_bottom_3.png | Bin 0 -> 4601 bytes .../textures/blocks/explosive_bottom_4.png | Bin 0 -> 4126 bytes .../blocks/explosive_breaching_side.png | Bin 0 -> 4687 bytes .../blocks/explosive_breaching_top.png | Bin 0 -> 5052 bytes .../blocks/explosive_chemical_side.png | Bin 0 -> 4833 bytes .../blocks/explosive_chemical_top.png | Bin 0 -> 4869 bytes .../blocks/explosive_condensed_side.png | Bin 0 -> 4590 bytes .../blocks/explosive_condensed_top.png | Bin 0 -> 4776 bytes .../blocks/explosive_contagious_side.png | Bin 0 -> 5112 bytes .../blocks/explosive_contagious_top.png | Bin 0 -> 4890 bytes .../blocks/explosive_debilitation_side.png | Bin 0 -> 4556 bytes .../blocks/explosive_debilitation_top.png | Bin 0 -> 4668 bytes .../textures/blocks/explosive_emp_side.png | Bin 0 -> 4775 bytes .../textures/blocks/explosive_emp_top.png | Bin 0 -> 4839 bytes .../textures/blocks/explosive_ender_side.png | Bin 0 -> 4326 bytes .../textures/blocks/explosive_ender_top.png | Bin 0 -> 4518 bytes .../blocks/explosive_endothermic_side.png | Bin 0 -> 4850 bytes .../blocks/explosive_endothermic_top.png | Bin 0 -> 4602 bytes .../blocks/explosive_exothermic_side.png | Bin 0 -> 5037 bytes .../blocks/explosive_exothermic_top.png | Bin 0 -> 4723 bytes .../blocks/explosive_fragmentation_side.png | Bin 0 -> 4706 bytes .../blocks/explosive_fragmentation_top.png | Bin 0 -> 4743 bytes .../blocks/explosive_hypersonic_side.png | Bin 0 -> 4667 bytes .../blocks/explosive_hypersonic_top.png | Bin 0 -> 4789 bytes .../blocks/explosive_incendiary_side.png | Bin 0 -> 5159 bytes .../blocks/explosive_incendiary_top.png | Bin 0 -> 4546 bytes .../blocks/explosive_nuclear_side.png | Bin 0 -> 5007 bytes .../textures/blocks/explosive_nuclear_top.png | Bin 0 -> 4671 bytes .../blocks/explosive_redMatter_side.png | Bin 0 -> 8358 bytes .../explosive_redMatter_side.png.mcmeta | 8 + .../blocks/explosive_redMatter_top.png | Bin 0 -> 5850 bytes .../blocks/explosive_redMatter_top.png.mcmeta | 8 + .../blocks/explosive_rejuvenation_side.png | Bin 0 -> 4892 bytes .../blocks/explosive_rejuvenation_top.png | Bin 0 -> 5038 bytes .../blocks/explosive_repulsive_side.png | Bin 0 -> 4597 bytes .../blocks/explosive_repulsive_top.png | Bin 0 -> 4663 bytes .../blocks/explosive_shrapnel_side.png | Bin 0 -> 4496 bytes .../blocks/explosive_shrapnel_top.png | Bin 0 -> 4668 bytes .../textures/blocks/explosive_sonic_side.png | Bin 0 -> 4847 bytes .../textures/blocks/explosive_sonic_top.png | Bin 0 -> 4905 bytes .../blocks/explosive_thermobaric_side.png | Bin 0 -> 4845 bytes .../blocks/explosive_thermobaric_top.png | Bin 0 -> 4860 bytes .../icbm/textures/blocks/glassButton.png | Bin 0 -> 2991 bytes .../textures/blocks/glassPressurePlate.png | Bin 0 -> 2991 bytes .../icbm/textures/blocks/glassReinforced.png | Bin 0 -> 623 bytes .../assets/icbm/textures/blocks/machine.png | Bin 0 -> 4557 bytes .../assets/icbm/textures/blocks/oreSulfur.png | Bin 0 -> 3380 bytes .../blocks/proximityDetector_bottom.png | Bin 0 -> 5166 bytes .../blocks/proximityDetector_side.png | Bin 0 -> 4655 bytes .../textures/blocks/proximityDetector_top.png | Bin 0 -> 4971 bytes .../icbm/textures/blocks/radioactive.png | Bin 0 -> 5561 bytes .../textures/blocks/radioactive_bottom.png | Bin 0 -> 5030 bytes .../icbm/textures/blocks/radioactive_top.png | Bin 0 -> 5951 bytes .../assets/icbm/textures/blocks/spikes.png | Bin 0 -> 2895 bytes .../icbm/textures/blocks/spikesFlammable.png | Bin 0 -> 2977 bytes .../icbm/textures/blocks/spikesPoison.png | Bin 0 -> 2914 bytes .../textures/blocks/turretPlatform_bottom.png | Bin 0 -> 4557 bytes .../textures/blocks/turretPlatform_side.png | Bin 0 -> 4630 bytes .../textures/blocks/turretPlatform_top.png | Bin 0 -> 4599 bytes .../assets/icbm/textures/gui/greendot.png | Bin 0 -> 2798 bytes .../assets/icbm/textures/gui/gui@.png | Bin 0 -> 20215 bytes .../assets/icbm/textures/gui/gui_base.png | Bin 0 -> 124561 bytes .../icbm/textures/gui/gui_cruise_launcher.png | Bin 0 -> 117582 bytes .../assets/icbm/textures/gui/gui_empty.png | Bin 0 -> 125076 bytes .../assets/icbm/textures/gui/gui_launcher.png | Bin 0 -> 117320 bytes .../icbm/textures/gui/gui_platform_slot.png | Bin 0 -> 5034 bytes .../textures/gui/gui_platform_terminal.png | Bin 0 -> 4563 bytes .../assets/icbm/textures/gui/gui_radar.png | Bin 0 -> 131916 bytes .../assets/icbm/textures/gui/reddot.png | Bin 0 -> 2796 bytes .../assets/icbm/textures/gui/whitedot.png | Bin 0 -> 2800 bytes .../assets/icbm/textures/gui/yellowdot.png | Bin 0 -> 2798 bytes .../assets/icbm/textures/items/EnergyCap.png | Bin 0 -> 1730 bytes .../assets/icbm/textures/items/ammoCase.png | Bin 0 -> 1853 bytes .../assets/icbm/textures/items/antidote.png | Bin 0 -> 2910 bytes .../assets/icbm/textures/items/bullet.png | Bin 0 -> 3947 bytes .../icbm/textures/items/bulletAntimatter.png | Bin 0 -> 3918 bytes .../icbm/textures/items/bulletInfinite.png | Bin 0 -> 3993 bytes .../icbm/textures/items/bulletRailgun.png | Bin 0 -> 3959 bytes .../icbm/textures/items/bulletShell.png | Bin 0 -> 3629 bytes .../assets/icbm/textures/items/defuser.png | Bin 0 -> 3529 bytes .../icbm/textures/items/grenade_anvil.png | Bin 0 -> 4688 bytes .../textures/items/grenade_attractive.png | Bin 0 -> 4487 bytes .../icbm/textures/items/grenade_chemical.png | Bin 0 -> 4242 bytes .../icbm/textures/items/grenade_condensed.png | Bin 0 -> 4761 bytes .../textures/items/grenade_debilitation.png | Bin 0 -> 4688 bytes .../textures/items/grenade_incendiary.png | Bin 0 -> 4461 bytes .../icbm/textures/items/grenade_repulsive.png | Bin 0 -> 4601 bytes .../icbm/textures/items/grenade_shrapnel.png | Bin 0 -> 4307 bytes .../icbm/textures/items/laserDesignator.png | Bin 0 -> 3114 bytes .../icbm/textures/items/missileModule.png | Bin 0 -> 3549 bytes .../icbm/textures/items/poisonPowder.png | Bin 0 -> 3099 bytes .../assets/icbm/textures/items/radarGun.png | Bin 0 -> 3439 bytes .../assets/icbm/textures/items/radioCard.png | Bin 0 -> 1366 bytes .../icbm/textures/items/remoteDetonator.png | Bin 0 -> 2992 bytes .../icbm/textures/items/shellCollector.png | Bin 0 -> 1704 bytes .../icbm/textures/items/signalDisrupter.png | Bin 0 -> 4117 bytes .../assets/icbm/textures/items/sulfur.png | Bin 0 -> 3087 bytes .../assets/icbm/textures/items/targetCard.png | Bin 0 -> 1371 bytes .../assets/icbm/textures/items/tracker.png | Bin 0 -> 7203 bytes .../icbm/textures/items/tracker.png.mcmeta | 5 + .../textures/models/aa_turret_friendly.png | Bin 0 -> 4867 bytes .../textures/models/aa_turret_hostile.png | Bin 0 -> 4884 bytes .../textures/models/aa_turret_neutral.png | Bin 0 -> 4862 bytes .../icbm/textures/models/cannon_friendly.png | Bin 0 -> 1048 bytes .../icbm/textures/models/cannon_hostile.png | Bin 0 -> 1047 bytes .../icbm/textures/models/cannon_neutral.png | Bin 0 -> 1000 bytes .../icbm/textures/models/cruise_launcher.png | Bin 0 -> 869 bytes .../assets/icbm/textures/models/emp_tower.png | Bin 0 -> 804 bytes .../assets/icbm/textures/models/fragment.png | Bin 0 -> 2942 bytes .../textures/models/gun_turret_friendly.png | Bin 0 -> 33765 bytes .../textures/models/gun_turret_hostile.png | Bin 0 -> 33753 bytes .../textures/models/gun_turret_neutral.png | Bin 0 -> 33756 bytes .../textures/models/laser_turret_friendly.png | Bin 0 -> 2991 bytes .../textures/models/laser_turret_hostile.png | Bin 0 -> 2872 bytes .../textures/models/laser_turret_neutral.png | Bin 0 -> 3012 bytes .../icbm/textures/models/launcher_0.png | Bin 0 -> 1623 bytes .../icbm/textures/models/launcher_1.png | Bin 0 -> 1584 bytes .../icbm/textures/models/launcher_2.png | Bin 0 -> 2261 bytes .../textures/models/missile_antiBallistic.png | Bin 0 -> 910 bytes .../models/missile_antiGravitational.png | Bin 0 -> 1319 bytes .../textures/models/missile_antimatter.png | Bin 0 -> 930 bytes .../icbm/textures/models/missile_anvil.png | Bin 0 -> 4176 bytes .../textures/models/missile_attractive.png | Bin 0 -> 1846 bytes .../textures/models/missile_breaching.png | Bin 0 -> 868 bytes .../icbm/textures/models/missile_chemical.png | Bin 0 -> 2155 bytes .../icbm/textures/models/missile_cluster.png | Bin 0 -> 905 bytes .../textures/models/missile_condensed.png | Bin 0 -> 1798 bytes .../textures/models/missile_contagious.png | Bin 0 -> 1605 bytes .../models/missile_coordinator_off.png | Bin 0 -> 13453 bytes .../models/missile_coordinator_on.png | Bin 0 -> 13747 bytes .../textures/models/missile_corrosive.png | Bin 0 -> 1890 bytes .../textures/models/missile_debilitation.png | Bin 0 -> 1768 bytes .../icbm/textures/models/missile_emp.png | Bin 0 -> 2091 bytes .../icbm/textures/models/missile_ender.png | Bin 0 -> 1977 bytes .../textures/models/missile_endothermic.png | Bin 0 -> 1383 bytes .../textures/models/missile_exothermic.png | Bin 0 -> 1885 bytes .../textures/models/missile_fragmentation.png | Bin 0 -> 1087 bytes .../icbm/textures/models/missile_homing.png | Bin 0 -> 1903 bytes .../textures/models/missile_hypersonic.png | Bin 0 -> 1137 bytes .../textures/models/missile_incendiary.png | Bin 0 -> 1936 bytes .../textures/models/missile_missileModule.png | Bin 0 -> 1798 bytes .../icbm/textures/models/missile_nuclear.png | Bin 0 -> 1023 bytes .../models/missile_nuclearCluster.png | Bin 0 -> 900 bytes .../textures/models/missile_redMatter.png | Bin 0 -> 1068 bytes .../textures/models/missile_rejuvenation.png | Bin 0 -> 1184 bytes .../textures/models/missile_repulsive.png | Bin 0 -> 1894 bytes .../icbm/textures/models/missile_shrapnel.png | Bin 0 -> 2161 bytes .../icbm/textures/models/missile_sonic.png | Bin 0 -> 1874 bytes .../textures/models/missile_thermobaric.png | Bin 0 -> 1259 bytes .../assets/icbm/textures/models/radar.png | Bin 0 -> 865 bytes .../assets/icbm/textures/models/railgun.png | Bin 0 -> 838 bytes .../icbm/textures/models/rocket_launcher.png | Bin 0 -> 1826 bytes .../assets/icbm/textures/models/s-mine.png | Bin 0 -> 262 bytes .../icbm/textures/models/sentry_med.png | Bin 0 -> 566 bytes .../resources/assets/icbm/textures/noise.png | Bin 0 -> 4748 bytes src/main/resources/icbm_at.cfg | 2 + src/main/resources/icbm_logo.png | Bin 0 -> 33811 bytes 553 files changed, 37290 insertions(+), 5 deletions(-) create mode 100644 austri3Fix.md mode change 100644 => 100755 gradlew create mode 100644 src/main/java/atomicscience/api/AtomicScience.java create mode 100644 src/main/java/atomicscience/api/BlockRadioactive.java create mode 100644 src/main/java/atomicscience/api/IAntiPoisonArmor.java create mode 100644 src/main/java/atomicscience/api/IAntiPoisonBlock.java create mode 100644 src/main/java/atomicscience/api/IElectromagnet.java create mode 100644 src/main/java/atomicscience/api/IFissileMaterial.java create mode 100644 src/main/java/atomicscience/api/IHeatSource.java create mode 100644 src/main/java/atomicscience/api/IReactor.java create mode 100644 src/main/java/atomicscience/api/ISteamReceptor.java create mode 100644 src/main/java/atomicscience/api/ITemperature.java create mode 100644 src/main/java/atomicscience/api/Plasma.java create mode 100644 src/main/java/atomicscience/api/poison/Poison.java create mode 100644 src/main/java/atomicscience/api/poison/PoisonRadiation.java create mode 100644 src/main/java/atomicscience/api/poison/PotionRadiation.java create mode 100644 src/main/java/calclavia/lib/Calclavia.java create mode 100644 src/main/java/calclavia/lib/CalculationHelper.java create mode 100644 src/main/java/calclavia/lib/IPlayerUsing.java create mode 100644 src/main/java/calclavia/lib/IUniversalEnergyTile.java create mode 100644 src/main/java/calclavia/lib/TileEntityUniversalProducer.java create mode 100644 src/main/java/calclavia/lib/TileEntityUniversalRunnable.java create mode 100644 src/main/java/calclavia/lib/TileEntityUniversalStorable.java create mode 100644 src/main/java/calclavia/lib/UniversalRecipes.java create mode 100644 src/main/java/calclavia/lib/gui/ContainerBase.java create mode 100644 src/main/java/calclavia/lib/gui/GuiContainerBase.java create mode 100644 src/main/java/calclavia/lib/gui/GuiScreenBase.java create mode 100644 src/main/java/calclavia/lib/gui/GuiSlotType.java create mode 100644 src/main/java/calclavia/lib/render/CalclaviaRenderHelper.java create mode 100644 src/main/java/calclavia/lib/render/ITagRender.java create mode 100644 src/main/java/calclavia/lib/render/RenderTaggedTile.java create mode 100644 src/main/java/dan200/computercraft/api/ComputerCraftAPI.java create mode 100644 src/main/java/dan200/computercraft/api/filesystem/IMount.java create mode 100644 src/main/java/dan200/computercraft/api/filesystem/IWritableMount.java create mode 100644 src/main/java/dan200/computercraft/api/filesystem/package-info.java create mode 100644 src/main/java/dan200/computercraft/api/lua/ILuaContext.java create mode 100644 src/main/java/dan200/computercraft/api/lua/ILuaObject.java create mode 100644 src/main/java/dan200/computercraft/api/lua/ILuaTask.java create mode 100644 src/main/java/dan200/computercraft/api/lua/LuaException.java create mode 100644 src/main/java/dan200/computercraft/api/lua/package-info.java create mode 100644 src/main/java/dan200/computercraft/api/media/IMedia.java create mode 100644 src/main/java/dan200/computercraft/api/media/IMediaProvider.java create mode 100644 src/main/java/dan200/computercraft/api/media/package-info.java create mode 100644 src/main/java/dan200/computercraft/api/package-info.java create mode 100644 src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java create mode 100644 src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java create mode 100644 src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java create mode 100644 src/main/java/dan200/computercraft/api/peripheral/package-info.java create mode 100644 src/main/java/dan200/computercraft/api/permissions/ITurtlePermissionProvider.java create mode 100644 src/main/java/dan200/computercraft/api/permissions/package-info.java create mode 100644 src/main/java/dan200/computercraft/api/redstone/IBundledRedstoneProvider.java create mode 100644 src/main/java/dan200/computercraft/api/redstone/package-info.java create mode 100644 src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java create mode 100644 src/main/java/dan200/computercraft/api/turtle/ITurtleCommand.java create mode 100644 src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java create mode 100644 src/main/java/dan200/computercraft/api/turtle/TurtleAnimation.java create mode 100644 src/main/java/dan200/computercraft/api/turtle/TurtleCommandResult.java create mode 100644 src/main/java/dan200/computercraft/api/turtle/TurtleSide.java create mode 100644 src/main/java/dan200/computercraft/api/turtle/TurtleUpgradeType.java create mode 100644 src/main/java/dan200/computercraft/api/turtle/TurtleVerb.java create mode 100644 src/main/java/dan200/computercraft/api/turtle/package-info.java create mode 100644 src/main/java/icbm/api/IAmmunition.java create mode 100644 src/main/java/icbm/api/IBlockFrequency.java create mode 100644 src/main/java/icbm/api/ICBM.java create mode 100644 src/main/java/icbm/api/ICBMFlags.java create mode 100644 src/main/java/icbm/api/ICamouflageMaterial.java create mode 100644 src/main/java/icbm/api/IHackable.java create mode 100644 src/main/java/icbm/api/IItemFrequency.java create mode 100644 src/main/java/icbm/api/ILauncherContainer.java create mode 100644 src/main/java/icbm/api/ILauncherController.java create mode 100644 src/main/java/icbm/api/IMissile.java create mode 100644 src/main/java/icbm/api/IMissileLockable.java create mode 100644 src/main/java/icbm/api/ITracker.java create mode 100644 src/main/java/icbm/api/LauncherType.java create mode 100644 src/main/java/icbm/api/RadarRegistry.java create mode 100644 src/main/java/icbm/api/explosion/ExplosionEvent.java create mode 100644 src/main/java/icbm/api/explosion/IEMPBlock.java create mode 100644 src/main/java/icbm/api/explosion/IEMPItem.java create mode 100644 src/main/java/icbm/api/explosion/IExplosive.java create mode 100644 src/main/java/icbm/api/explosion/IExplosiveContainer.java create mode 100644 src/main/java/icbm/api/explosion/IExplosiveIgnore.java create mode 100644 src/main/java/icbm/api/sentry/IAATarget.java create mode 100644 src/main/java/icbm/core/BSulfurOre.java create mode 100644 src/main/java/icbm/core/GenSulfur.java create mode 100644 src/main/java/icbm/core/HaoMa.java create mode 100644 src/main/java/icbm/core/ICBMTab.java create mode 100644 src/main/java/icbm/core/MainBase.java create mode 100644 src/main/java/icbm/core/Pair.java create mode 100644 src/main/java/icbm/core/di/BICBM.java create mode 100644 src/main/java/icbm/core/di/ItElectricICBM.java create mode 100644 src/main/java/icbm/core/di/ItICBM.java create mode 100644 src/main/java/icbm/core/di/MICBM.java create mode 100644 src/main/java/icbm/gangshao/ClientProxy.java create mode 100644 src/main/java/icbm/gangshao/CommonProxy.java create mode 100644 src/main/java/icbm/gangshao/IAmmunition.java create mode 100644 src/main/java/icbm/gangshao/IAutoSentry.java create mode 100644 src/main/java/icbm/gangshao/ICBMSentry.java create mode 100644 src/main/java/icbm/gangshao/ISentry.java create mode 100644 src/main/java/icbm/gangshao/ISpecialAccess.java create mode 100644 src/main/java/icbm/gangshao/ITurretUpgrade.java create mode 100644 src/main/java/icbm/gangshao/ProjectileType.java create mode 100644 src/main/java/icbm/gangshao/SlotTurret.java create mode 100644 src/main/java/icbm/gangshao/access/AccessLevel.java create mode 100644 src/main/java/icbm/gangshao/access/GlobalAccessLoader.java create mode 100644 src/main/java/icbm/gangshao/access/GlobalAccessManager.java create mode 100644 src/main/java/icbm/gangshao/access/UserAccess.java create mode 100644 src/main/java/icbm/gangshao/container/ContainerTerminal.java create mode 100644 src/main/java/icbm/gangshao/container/ContainerTurretPlatform.java create mode 100644 src/main/java/icbm/gangshao/damage/EntityTileDamagable.java create mode 100644 src/main/java/icbm/gangshao/damage/IHealthTile.java create mode 100644 src/main/java/icbm/gangshao/damage/TileDamageSource.java create mode 100644 src/main/java/icbm/gangshao/muoxing/MLeiShe.java create mode 100644 src/main/java/icbm/gangshao/muoxing/ModelAATurret.java create mode 100644 src/main/java/icbm/gangshao/muoxing/ModelGunTurret.java create mode 100644 src/main/java/icbm/gangshao/muoxing/ModelRailgun.java create mode 100644 src/main/java/icbm/gangshao/muoxing/ModelSentryCannon.java create mode 100644 src/main/java/icbm/gangshao/muoxing/ModelTurretMed.java create mode 100644 src/main/java/icbm/gangshao/packet/PacketHandlerTurret.java create mode 100644 src/main/java/icbm/gangshao/packet/PacketTurret.java create mode 100644 src/main/java/icbm/gangshao/platform/BlockTurretPlatform.java create mode 100644 src/main/java/icbm/gangshao/platform/TPlatform.java create mode 100644 src/main/java/icbm/gangshao/render/BlockRenderingHandler.java create mode 100644 src/main/java/icbm/gangshao/render/FXBeam.java create mode 100644 src/main/java/icbm/gangshao/render/RAATurret.java create mode 100644 src/main/java/icbm/gangshao/render/RESeat.java create mode 100644 src/main/java/icbm/gangshao/render/RGunTurret.java create mode 100644 src/main/java/icbm/gangshao/render/RLaserTurret.java create mode 100644 src/main/java/icbm/gangshao/render/RRailgun.java create mode 100644 src/main/java/icbm/gangshao/saving/INbtSave.java create mode 100644 src/main/java/icbm/gangshao/saving/SaveManager.java create mode 100644 src/main/java/icbm/gangshao/shimian/GuiButtonArrow.java create mode 100644 src/main/java/icbm/gangshao/shimian/GuiButtonImage.java create mode 100644 src/main/java/icbm/gangshao/shimian/GuiPlatformAccess.java create mode 100644 src/main/java/icbm/gangshao/shimian/GuiPlatformBase.java create mode 100644 src/main/java/icbm/gangshao/shimian/GuiPlatformContainer.java create mode 100644 src/main/java/icbm/gangshao/shimian/GuiPlatformSlots.java create mode 100644 src/main/java/icbm/gangshao/shimian/GuiPlatformTerminal.java create mode 100644 src/main/java/icbm/gangshao/shimian/IScroll.java create mode 100644 src/main/java/icbm/gangshao/task/LookHelper.java create mode 100644 src/main/java/icbm/gangshao/task/Task.java create mode 100644 src/main/java/icbm/gangshao/task/TaskKillTarget.java create mode 100644 src/main/java/icbm/gangshao/task/TaskManager.java create mode 100644 src/main/java/icbm/gangshao/task/TaskSearchTarget.java create mode 100644 src/main/java/icbm/gangshao/terminal/ITerminal.java create mode 100644 src/main/java/icbm/gangshao/terminal/TerminalCommand.java create mode 100644 src/main/java/icbm/gangshao/terminal/TileEntityTerminal.java create mode 100644 src/main/java/icbm/gangshao/terminal/command/CommandAccess.java create mode 100644 src/main/java/icbm/gangshao/terminal/command/CommandDestroy.java create mode 100644 src/main/java/icbm/gangshao/terminal/command/CommandGet.java create mode 100644 src/main/java/icbm/gangshao/terminal/command/CommandHelp.java create mode 100644 src/main/java/icbm/gangshao/terminal/command/CommandRegistry.java create mode 100644 src/main/java/icbm/gangshao/terminal/command/CommandTarget.java create mode 100644 src/main/java/icbm/gangshao/terminal/command/CommandUser.java create mode 100644 src/main/java/icbm/gangshao/turret/BlockTurret.java create mode 100644 src/main/java/icbm/gangshao/turret/ItemAmmo.java create mode 100644 src/main/java/icbm/gangshao/turret/ItemBlockTurret.java create mode 100644 src/main/java/icbm/gangshao/turret/TTurretBase.java create mode 100644 src/main/java/icbm/gangshao/turret/mount/ESeat.java create mode 100644 src/main/java/icbm/gangshao/turret/mount/TPaoTaiQi.java create mode 100644 src/main/java/icbm/gangshao/turret/mount/TRailgunTurret.java create mode 100644 src/main/java/icbm/gangshao/turret/sentries/TAATurret.java create mode 100644 src/main/java/icbm/gangshao/turret/sentries/TAutomaticTurret.java create mode 100644 src/main/java/icbm/gangshao/turret/sentries/TLaserTurret.java create mode 100644 src/main/java/icbm/gangshao/turret/sentries/TMachineGunTurret.java create mode 100644 src/main/java/icbm/gangshao/turret/upgrades/ItPaoTaiUpgrades.java create mode 100644 src/main/java/icbm/wanyi/ClientProxy.java create mode 100644 src/main/java/icbm/wanyi/CommonProxy.java create mode 100644 src/main/java/icbm/wanyi/IBSpikes.java create mode 100644 src/main/java/icbm/wanyi/ICBMContraption.java create mode 100644 src/main/java/icbm/wanyi/ItAntidote.java create mode 100644 src/main/java/icbm/wanyi/ItSignalDisrupter.java create mode 100644 src/main/java/icbm/wanyi/ItTracker.java create mode 100644 src/main/java/icbm/wanyi/ItemTracker.java create mode 100644 src/main/java/icbm/wanyi/ProximityDetectorModePacket.java create mode 100644 src/main/java/icbm/wanyi/ProximityDetectorModePacketHandler.java create mode 100644 src/main/java/icbm/wanyi/SetSignalDisrupterFrequencyPacket.java create mode 100644 src/main/java/icbm/wanyi/SetSignalDisrupterFrequencyPacketHandler.java create mode 100644 src/main/java/icbm/wanyi/TextureTracker.java create mode 100644 src/main/java/icbm/wanyi/b/BCamouflage.java create mode 100644 src/main/java/icbm/wanyi/b/BConcrete.java create mode 100644 src/main/java/icbm/wanyi/b/BGlassButton.java create mode 100644 src/main/java/icbm/wanyi/b/BGlassPressurePlate.java create mode 100644 src/main/java/icbm/wanyi/b/BGlassReinforced.java create mode 100644 src/main/java/icbm/wanyi/b/BProximityDetector.java create mode 100644 src/main/java/icbm/wanyi/b/BSpikes.java create mode 100644 src/main/java/icbm/wanyi/b/IBConcrete.java create mode 100644 src/main/java/icbm/wanyi/b/TCamouflage.java create mode 100644 src/main/java/icbm/wanyi/b/TProximityDetector.java create mode 100644 src/main/java/icbm/wanyi/gui/GProximityDetector.java create mode 100644 src/main/java/icbm/wanyi/gui/GSignalDisrupter.java create mode 100644 src/main/java/icbm/zhapin/ClientProxy.java create mode 100644 src/main/java/icbm/zhapin/CommonProxy.java create mode 100644 src/main/java/icbm/zhapin/Du.java create mode 100644 src/main/java/icbm/zhapin/EGravityBlock.java create mode 100644 src/main/java/icbm/zhapin/ELightBeam.java create mode 100644 src/main/java/icbm/zhapin/ESuiPian.java create mode 100644 src/main/java/icbm/zhapin/ICBMCommand.java create mode 100644 src/main/java/icbm/zhapin/ICBMExplosion.java create mode 100644 src/main/java/icbm/zhapin/ItemUsePacket.java create mode 100644 src/main/java/icbm/zhapin/ItemUsePacketHandler.java create mode 100644 src/main/java/icbm/zhapin/TickHandler.java create mode 100644 src/main/java/icbm/zhapin/cart/ECart.java create mode 100644 src/main/java/icbm/zhapin/cart/ItCart.java create mode 100644 src/main/java/icbm/zhapin/daodan/DAntiBallistic.java create mode 100644 src/main/java/icbm/zhapin/daodan/DCluster.java create mode 100644 src/main/java/icbm/zhapin/daodan/DHoming.java create mode 100644 src/main/java/icbm/zhapin/daodan/DModule.java create mode 100644 src/main/java/icbm/zhapin/daodan/DNuclearCluster.java create mode 100644 src/main/java/icbm/zhapin/daodan/EMissile.java create mode 100644 src/main/java/icbm/zhapin/daodan/ItMissile.java create mode 100644 src/main/java/icbm/zhapin/daodan/ItModuleMissile.java create mode 100644 src/main/java/icbm/zhapin/daodan/MissileBase.java create mode 100644 src/main/java/icbm/zhapin/daodan/MissileSound.java create mode 100644 src/main/java/icbm/zhapin/dianqi/ItDefuser.java create mode 100644 src/main/java/icbm/zhapin/dianqi/ItLaserDesignator.java create mode 100644 src/main/java/icbm/zhapin/dianqi/ItRadarGun.java create mode 100644 src/main/java/icbm/zhapin/dianqi/ItRemoteDetonator.java create mode 100644 src/main/java/icbm/zhapin/dianqi/ItRocketLauncher.java create mode 100644 src/main/java/icbm/zhapin/fx/FXAntimatter.java create mode 100644 src/main/java/icbm/zhapin/fx/FXPortal.java create mode 100644 src/main/java/icbm/zhapin/fx/FXShockwave.java create mode 100644 src/main/java/icbm/zhapin/fx/FXSmoke.java create mode 100644 src/main/java/icbm/zhapin/gui/GEmpTower.java create mode 100644 src/main/java/icbm/zhapin/gui/GFaSheDi.java create mode 100644 src/main/java/icbm/zhapin/gui/GMissileLauncher.java create mode 100644 src/main/java/icbm/zhapin/gui/GRadarTower.java create mode 100644 src/main/java/icbm/zhapin/gui/GXiaoFaSheQi.java create mode 100644 src/main/java/icbm/zhapin/jiqi/BMachine.java create mode 100644 src/main/java/icbm/zhapin/jiqi/IBMachine.java create mode 100644 src/main/java/icbm/zhapin/jiqi/LauncherManager.java create mode 100644 src/main/java/icbm/zhapin/jiqi/TCruiseLauncher.java create mode 100644 src/main/java/icbm/zhapin/jiqi/TEmpTower.java create mode 100644 src/main/java/icbm/zhapin/jiqi/TLauncher.java create mode 100644 src/main/java/icbm/zhapin/jiqi/TLauncherControlPanel.java create mode 100644 src/main/java/icbm/zhapin/jiqi/TLauncherController.java create mode 100644 src/main/java/icbm/zhapin/jiqi/TLauncherPlatform.java create mode 100644 src/main/java/icbm/zhapin/jiqi/TMissileCoordinator.java create mode 100644 src/main/java/icbm/zhapin/jiqi/TRadarTower.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMBingDan.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMChaoShengBuo.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMDianCi.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMDuQi.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMFanDan.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMFanWuSu.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMFenZiDan.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMGanRanDu.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMHongSu.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMHuanYuan.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMHuo.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMLa.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMLiZi.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMPiaoFu.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMQi.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMQunDan.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMShengBuo.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMTaiYang.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMTuPuo.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMTui.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMWan.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMXiaoQunDan.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMYaSuo.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMYuanZi.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMZhen.java create mode 100644 src/main/java/icbm/zhapin/muoxing/daodan/MMZhuiZhong.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MDianCiQi.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDi0.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDi1.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDi2.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDiRail0.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDiRail1.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDiRail2.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheJia.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheShiMuo0.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheShiMuo1.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheShiMuo2.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MLeiDa.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MLeiShePao.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MLeiShePao2.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MSMine.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MShouFaSheQi.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MXiaoFaSheQi.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MXiaoFaSheQiJia.java create mode 100644 src/main/java/icbm/zhapin/muoxing/jiqi/MYinDaoQi.java create mode 100644 src/main/java/icbm/zhapin/po/PChuanRanDu.java create mode 100644 src/main/java/icbm/zhapin/po/PDaDu.java create mode 100644 src/main/java/icbm/zhapin/po/PDongShang.java create mode 100644 src/main/java/icbm/zhapin/po/PICBM.java create mode 100644 src/main/java/icbm/zhapin/render/REZhaDan.java create mode 100644 src/main/java/icbm/zhapin/render/REmpTower.java create mode 100644 src/main/java/icbm/zhapin/render/RFaSheDi.java create mode 100644 src/main/java/icbm/zhapin/render/RFaSheJia.java create mode 100644 src/main/java/icbm/zhapin/render/RFeiBlock.java create mode 100644 src/main/java/icbm/zhapin/render/RGuangBang.java create mode 100644 src/main/java/icbm/zhapin/render/RHJiQi.java create mode 100644 src/main/java/icbm/zhapin/render/RHZhaPin.java create mode 100644 src/main/java/icbm/zhapin/render/RItDaoDan.java create mode 100644 src/main/java/icbm/zhapin/render/RItRocketLauncher.java create mode 100644 src/main/java/icbm/zhapin/render/RLauncherControlPanel.java create mode 100644 src/main/java/icbm/zhapin/render/RMissile.java create mode 100644 src/main/java/icbm/zhapin/render/RRadarTower.java create mode 100644 src/main/java/icbm/zhapin/render/RSMine.java create mode 100644 src/main/java/icbm/zhapin/render/RShouLiuDan.java create mode 100644 src/main/java/icbm/zhapin/render/RSuiPian.java create mode 100644 src/main/java/icbm/zhapin/render/RXiaoFaSheQi.java create mode 100644 src/main/java/icbm/zhapin/render/RYinDaoQi.java create mode 100644 src/main/java/icbm/zhapin/render/RZhaPin.java create mode 100644 src/main/java/icbm/zhapin/rongqi/CFaShiDi.java create mode 100644 src/main/java/icbm/zhapin/rongqi/CXiaoFaSheQi.java create mode 100644 src/main/java/icbm/zhapin/zhapin/BExplosives.java create mode 100644 src/main/java/icbm/zhapin/zhapin/EExplosion.java create mode 100644 src/main/java/icbm/zhapin/zhapin/EExplosive.java create mode 100644 src/main/java/icbm/zhapin/zhapin/EGrenade.java create mode 100644 src/main/java/icbm/zhapin/zhapin/IBExplosive.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ItGrenade.java create mode 100644 src/main/java/icbm/zhapin/zhapin/TExplosive.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ZhaPin.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExAntiGravitational.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExAntimatter.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExBreaching.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExChemical.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExCondensed.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExDebilitation.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExDecayLand.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExEmp.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExEmpSignal.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExEmpWave.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExEnder.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExEndothermic.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExEndothermic2.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExExothermic.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExExothermic2.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExHypersonic.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExIncendiary.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExMutateLiving.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExNuclear.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExPushPull.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExRedMatter.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExRejuvenation.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExSMine.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExShrapnel.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExSonic.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExThermobaric.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ExThr.java create mode 100644 src/main/java/icbm/zhapin/zhapin/ex/ThrSheXian.java create mode 100644 src/main/java/mffs/api/Blacklist.java create mode 100644 src/main/java/mffs/api/IActivatable.java create mode 100644 src/main/java/mffs/api/IBiometricIdentifierLink.java create mode 100644 src/main/java/mffs/api/ICache.java create mode 100644 src/main/java/mffs/api/IFieldInteraction.java create mode 100644 src/main/java/mffs/api/IForceFieldBlock.java create mode 100644 src/main/java/mffs/api/IProjector.java create mode 100644 src/main/java/mffs/api/ISpecialForceManipulation.java create mode 100644 src/main/java/mffs/api/card/ICard.java create mode 100644 src/main/java/mffs/api/card/ICardIdentification.java create mode 100644 src/main/java/mffs/api/card/ICardInfinite.java create mode 100644 src/main/java/mffs/api/card/ICardLink.java create mode 100644 src/main/java/mffs/api/fortron/IFortronCapacitor.java create mode 100644 src/main/java/mffs/api/fortron/IFortronFrequency.java create mode 100644 src/main/java/mffs/api/fortron/IFortronStorage.java create mode 100644 src/main/java/mffs/api/modules/IInterdictionMatrixModule.java create mode 100644 src/main/java/mffs/api/modules/IModule.java create mode 100644 src/main/java/mffs/api/modules/IModuleAcceptor.java create mode 100644 src/main/java/mffs/api/modules/IProjectorMode.java create mode 100644 src/main/java/mffs/api/security/IBiometricIdentifier.java create mode 100644 src/main/java/mffs/api/security/IInterdictionMatrix.java create mode 100644 src/main/java/mffs/api/security/Permission.java create mode 100644 src/main/resources/assets/icbm/lang/de_DE.lang create mode 100644 src/main/resources/assets/icbm/lang/en_US.lang create mode 100644 src/main/resources/assets/icbm/lang/es_ES.lang create mode 100644 src/main/resources/assets/icbm/lang/zh_CN.lang create mode 100644 src/main/resources/assets/icbm/textures/antimatter.png create mode 100644 src/main/resources/assets/icbm/textures/blackhole.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/barbedWire.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/camouflage.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/concrete.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/concreteCompact.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/concreteReinforced.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_antiGravitational_bottom.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_antiGravitational_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_antiGravitational_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_antimatter_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_antimatter_side.png.mcmeta create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_antimatter_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_antimatter_top.png.mcmeta create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_anvil_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_anvil_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_attractive_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_attractive_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_base_1.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_base_2.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_base_3.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_bottom_1.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_bottom_2.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_bottom_3.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_bottom_4.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_breaching_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_breaching_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_chemical_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_chemical_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_condensed_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_condensed_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_contagious_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_contagious_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_debilitation_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_debilitation_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_emp_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_emp_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_ender_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_ender_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_endothermic_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_endothermic_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_exothermic_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_exothermic_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_fragmentation_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_fragmentation_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_hypersonic_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_hypersonic_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_incendiary_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_incendiary_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_nuclear_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_nuclear_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_redMatter_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_redMatter_side.png.mcmeta create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_redMatter_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_redMatter_top.png.mcmeta create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_rejuvenation_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_rejuvenation_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_repulsive_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_repulsive_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_shrapnel_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_shrapnel_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_sonic_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_sonic_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_thermobaric_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/explosive_thermobaric_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/glassButton.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/glassPressurePlate.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/glassReinforced.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/machine.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/oreSulfur.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/proximityDetector_bottom.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/proximityDetector_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/proximityDetector_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/radioactive.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/radioactive_bottom.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/radioactive_top.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/spikes.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/spikesFlammable.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/spikesPoison.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/turretPlatform_bottom.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/turretPlatform_side.png create mode 100644 src/main/resources/assets/icbm/textures/blocks/turretPlatform_top.png create mode 100644 src/main/resources/assets/icbm/textures/gui/greendot.png create mode 100644 src/main/resources/assets/icbm/textures/gui/gui@.png create mode 100644 src/main/resources/assets/icbm/textures/gui/gui_base.png create mode 100644 src/main/resources/assets/icbm/textures/gui/gui_cruise_launcher.png create mode 100644 src/main/resources/assets/icbm/textures/gui/gui_empty.png create mode 100644 src/main/resources/assets/icbm/textures/gui/gui_launcher.png create mode 100644 src/main/resources/assets/icbm/textures/gui/gui_platform_slot.png create mode 100644 src/main/resources/assets/icbm/textures/gui/gui_platform_terminal.png create mode 100644 src/main/resources/assets/icbm/textures/gui/gui_radar.png create mode 100644 src/main/resources/assets/icbm/textures/gui/reddot.png create mode 100644 src/main/resources/assets/icbm/textures/gui/whitedot.png create mode 100644 src/main/resources/assets/icbm/textures/gui/yellowdot.png create mode 100644 src/main/resources/assets/icbm/textures/items/EnergyCap.png create mode 100644 src/main/resources/assets/icbm/textures/items/ammoCase.png create mode 100644 src/main/resources/assets/icbm/textures/items/antidote.png create mode 100644 src/main/resources/assets/icbm/textures/items/bullet.png create mode 100644 src/main/resources/assets/icbm/textures/items/bulletAntimatter.png create mode 100644 src/main/resources/assets/icbm/textures/items/bulletInfinite.png create mode 100644 src/main/resources/assets/icbm/textures/items/bulletRailgun.png create mode 100644 src/main/resources/assets/icbm/textures/items/bulletShell.png create mode 100644 src/main/resources/assets/icbm/textures/items/defuser.png create mode 100644 src/main/resources/assets/icbm/textures/items/grenade_anvil.png create mode 100644 src/main/resources/assets/icbm/textures/items/grenade_attractive.png create mode 100644 src/main/resources/assets/icbm/textures/items/grenade_chemical.png create mode 100644 src/main/resources/assets/icbm/textures/items/grenade_condensed.png create mode 100644 src/main/resources/assets/icbm/textures/items/grenade_debilitation.png create mode 100644 src/main/resources/assets/icbm/textures/items/grenade_incendiary.png create mode 100644 src/main/resources/assets/icbm/textures/items/grenade_repulsive.png create mode 100644 src/main/resources/assets/icbm/textures/items/grenade_shrapnel.png create mode 100644 src/main/resources/assets/icbm/textures/items/laserDesignator.png create mode 100644 src/main/resources/assets/icbm/textures/items/missileModule.png create mode 100644 src/main/resources/assets/icbm/textures/items/poisonPowder.png create mode 100644 src/main/resources/assets/icbm/textures/items/radarGun.png create mode 100644 src/main/resources/assets/icbm/textures/items/radioCard.png create mode 100644 src/main/resources/assets/icbm/textures/items/remoteDetonator.png create mode 100644 src/main/resources/assets/icbm/textures/items/shellCollector.png create mode 100644 src/main/resources/assets/icbm/textures/items/signalDisrupter.png create mode 100644 src/main/resources/assets/icbm/textures/items/sulfur.png create mode 100644 src/main/resources/assets/icbm/textures/items/targetCard.png create mode 100644 src/main/resources/assets/icbm/textures/items/tracker.png create mode 100644 src/main/resources/assets/icbm/textures/items/tracker.png.mcmeta create mode 100644 src/main/resources/assets/icbm/textures/models/aa_turret_friendly.png create mode 100644 src/main/resources/assets/icbm/textures/models/aa_turret_hostile.png create mode 100644 src/main/resources/assets/icbm/textures/models/aa_turret_neutral.png create mode 100644 src/main/resources/assets/icbm/textures/models/cannon_friendly.png create mode 100644 src/main/resources/assets/icbm/textures/models/cannon_hostile.png create mode 100644 src/main/resources/assets/icbm/textures/models/cannon_neutral.png create mode 100644 src/main/resources/assets/icbm/textures/models/cruise_launcher.png create mode 100644 src/main/resources/assets/icbm/textures/models/emp_tower.png create mode 100644 src/main/resources/assets/icbm/textures/models/fragment.png create mode 100644 src/main/resources/assets/icbm/textures/models/gun_turret_friendly.png create mode 100644 src/main/resources/assets/icbm/textures/models/gun_turret_hostile.png create mode 100644 src/main/resources/assets/icbm/textures/models/gun_turret_neutral.png create mode 100644 src/main/resources/assets/icbm/textures/models/laser_turret_friendly.png create mode 100644 src/main/resources/assets/icbm/textures/models/laser_turret_hostile.png create mode 100644 src/main/resources/assets/icbm/textures/models/laser_turret_neutral.png create mode 100644 src/main/resources/assets/icbm/textures/models/launcher_0.png create mode 100644 src/main/resources/assets/icbm/textures/models/launcher_1.png create mode 100644 src/main/resources/assets/icbm/textures/models/launcher_2.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_antiBallistic.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_antiGravitational.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_antimatter.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_anvil.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_attractive.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_breaching.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_chemical.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_cluster.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_condensed.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_contagious.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_coordinator_off.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_coordinator_on.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_corrosive.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_debilitation.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_emp.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_ender.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_endothermic.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_exothermic.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_fragmentation.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_homing.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_hypersonic.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_incendiary.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_missileModule.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_nuclear.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_nuclearCluster.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_redMatter.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_rejuvenation.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_repulsive.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_shrapnel.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_sonic.png create mode 100644 src/main/resources/assets/icbm/textures/models/missile_thermobaric.png create mode 100644 src/main/resources/assets/icbm/textures/models/radar.png create mode 100644 src/main/resources/assets/icbm/textures/models/railgun.png create mode 100644 src/main/resources/assets/icbm/textures/models/rocket_launcher.png create mode 100644 src/main/resources/assets/icbm/textures/models/s-mine.png create mode 100644 src/main/resources/assets/icbm/textures/models/sentry_med.png create mode 100644 src/main/resources/assets/icbm/textures/noise.png create mode 100644 src/main/resources/icbm_at.cfg create mode 100644 src/main/resources/icbm_logo.png diff --git a/.gitignore b/.gitignore index 8d16946..bbc8ac8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +.project +.classpath +bin +.settings .gradle .idea build diff --git a/austri3Fix.md b/austri3Fix.md new file mode 100644 index 0000000..e3ddca7 --- /dev/null +++ b/austri3Fix.md @@ -0,0 +1,16 @@ +- glass button doesn't render in inventory +- tons of missing packets (mostly gui stuff) +- can't apply camouflage texture +- turret UI textures completely fürn oasch +- sounds completely fürn oasch +- unable to mount turret afte dismounting +- turret gui kekt +- no electricity in guis +- EMP tower drops nonsense +- no proper update on multiblock destroy +- condensed explosives doesn't break blocks and explodes instantly +- can push explosive entities +- flying blocks dont properly render +- black hole doesn't suck in blocks +- no missiles?? +- remote detonator doesnt work diff --git a/build.gradle b/build.gradle index 7c2d31b..1a56803 100644 --- a/build.gradle +++ b/build.gradle @@ -11,23 +11,43 @@ buildscript { } } dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT' + classpath ('com.anatawa12.forge:ForgeGradle:1.2-1.0.+') { + changing = true + } } } apply plugin: 'forge' +sourceCompatibility = JavaVersion.VERSION_1_8 +targetCompatibility = JavaVersion.VERSION_1_8 + +sourceSets { + api {} +} + version = "1.0" -group= "modgroup" -archivesBaseName = "modid" +group = "universalelectricity" +archivesBaseName = "icbm" + +jar { + manifest { + attributes "FMLAT": "icbm_at.cfg" + } +} minecraft { version = "1.7.10-10.13.4.1614-1.7.10" runDir = "run" } -dependencies { +repositories { + maven { url = "https://maven.tilera.xyz" } +} +dependencies { + implementation "universalelectricity:basiccomponents:1.0.2-dirty:deobf" + implementation "universalelectricity:atomicscience:1.0.1:deobf" } processResources diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d4a0bb8..f6a15a7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.1-bin.zip diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/atomicscience/api/AtomicScience.java b/src/main/java/atomicscience/api/AtomicScience.java new file mode 100644 index 0000000..1fdc223 --- /dev/null +++ b/src/main/java/atomicscience/api/AtomicScience.java @@ -0,0 +1,17 @@ +package atomicscience.api; + +import cpw.mods.fml.common.Loader; +import net.minecraftforge.common.config.Configuration; + +import java.io.File; + +public class AtomicScience { + + public static final String MAJOR_VERSION = "0"; + public static final String MINOR_VERSION = "6"; + public static final String REVISION_VERSION = "2"; + public static final String BUILD_VERSION = "117"; + public static final String VERSION = "0.6.2"; + public static final String NAME = "Atomic Science"; + public static final Configuration CONFIGURATION = new Configuration(new File(Loader.instance().getConfigDir(), "AtomicScience.cfg")); +} diff --git a/src/main/java/atomicscience/api/BlockRadioactive.java b/src/main/java/atomicscience/api/BlockRadioactive.java new file mode 100644 index 0000000..e6fcfcc --- /dev/null +++ b/src/main/java/atomicscience/api/BlockRadioactive.java @@ -0,0 +1,144 @@ +package atomicscience.api; + +import atomicscience.api.poison.PoisonRadiation; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.EntitySmokeFX; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class BlockRadioactive extends Block { + public boolean canSpread; + public float radius; + public int amplifier; + public boolean canWalkPoison; + public boolean isRandomlyRadioactive; + private IIcon iconTop; + private IIcon iconBottom; + + public BlockRadioactive(Material material) { + super(material); + this.canSpread = true; + this.radius = 5.0F; + this.amplifier = 2; + this.canWalkPoison = true; + this.isRandomlyRadioactive = true; + this.setTickRandomly(true); + this.setHardness(0.2F); + this.setLightLevel(0.1F); + } + + public BlockRadioactive() { + this(Material.rock); + } + + @Override + public IIcon getIcon(int side, int metadata) { + return side == 1 ? this.iconTop + : (side == 0 ? this.iconBottom : this.blockIcon); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.blockIcon = iconRegister.registerIcon( + this.getUnlocalizedName().replace("tile.", "")); + this.iconTop = iconRegister.registerIcon( + this.getUnlocalizedName().replace("tile.", "") + "_top"); + this.iconBottom = iconRegister.registerIcon( + this.getUnlocalizedName().replace("tile.", "") + "_bottom"); + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, + EntityPlayer par5EntityPlayer) { + if ((double) world.rand.nextFloat() > 0.8D) { + this.updateTick(world, x, y, z, world.rand); + } + } + + @Override + public void updateTick(World world, int x, int y, int z, Random rand) { + if (!world.isRemote) { + if (this.isRandomlyRadioactive) { + AxisAlignedBB i = AxisAlignedBB.getBoundingBox( + (double) ((float) x - this.radius), (double) ((float) y - this.radius), + (double) ((float) z - this.radius), (double) ((float) x + this.radius), + (double) ((float) y + this.radius), (double) ((float) z + this.radius)); + List newX = world.getEntitiesWithinAABB(EntityLiving.class, i); + + for (EntityLiving newZ : newX) { + PoisonRadiation.INSTANCE.poisonEntity( + new Vector3((double) x, (double) y, (double) z), newZ, + this.amplifier); + } + } + + if (this.canSpread) { + for (int var11 = 0; var11 < 4; ++var11) { + int xOffset = x + rand.nextInt(3) - 1; + int yOffset = y + rand.nextInt(5) - 3; + int zOffset = z + rand.nextInt(3) - 1; + Block block = world.getBlock(xOffset, yOffset, zOffset); + if ((double) rand.nextFloat() > 0.4D && + (block == Blocks.farmland || block == Blocks.grass)) { + world.setBlock(xOffset, yOffset, zOffset, this); + } + } + + if ((double) rand.nextFloat() > 0.85D) { + world.setBlock(x, y, z, Blocks.mycelium); + } + } + } + } + + @Override + public void onEntityWalking(World par1World, int x, int y, int z, + Entity par5Entity) { + if (par5Entity instanceof EntityLiving && this.canWalkPoison) { + PoisonRadiation.INSTANCE.poisonEntity( + new Vector3((double) x, (double) y, (double) z), + (EntityLiving) par5Entity); + } + } + + @Override + public int quantityDropped(Random par1Random) { + return 0; + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, int x, int y, int z, + Random par5Random) { + if (Minecraft.getMinecraft().gameSettings.particleSetting == 0) { + byte radius = 3; + + for (int i = 0; i < 2; ++i) { + Vector3 diDian = new Vector3((double) x, (double) y, (double) z); + diDian.x += Math.random() * (double) radius - (double) (radius / 2); + diDian.y += Math.random() * (double) radius - (double) (radius / 2); + diDian.z += Math.random() * (double) radius - (double) (radius / 2); + EntitySmokeFX fx = new EntitySmokeFX( + world, diDian.x, diDian.y, diDian.z, (Math.random() - 0.5D) / 2.0D, + (Math.random() - 0.5D) / 2.0D, (Math.random() - 0.5D) / 2.0D); + fx.setRBGColorF(0.2F, 0.8F, 0.0F); + Minecraft.getMinecraft().effectRenderer.addEffect(fx); + } + } + } +} diff --git a/src/main/java/atomicscience/api/IAntiPoisonArmor.java b/src/main/java/atomicscience/api/IAntiPoisonArmor.java new file mode 100644 index 0000000..fc05b65 --- /dev/null +++ b/src/main/java/atomicscience/api/IAntiPoisonArmor.java @@ -0,0 +1,14 @@ +package atomicscience.api; + +import atomicscience.api.poison.Poison; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; + +public interface IAntiPoisonArmor { + + boolean isProtectedFromPoison(ItemStack var1, EntityLivingBase var2, Poison var3); + + void onProtectFromPoison(ItemStack var1, EntityLivingBase var2, Poison var3); + + Poison.ArmorType getArmorType(); +} diff --git a/src/main/java/atomicscience/api/IAntiPoisonBlock.java b/src/main/java/atomicscience/api/IAntiPoisonBlock.java new file mode 100644 index 0000000..c013b03 --- /dev/null +++ b/src/main/java/atomicscience/api/IAntiPoisonBlock.java @@ -0,0 +1,9 @@ +package atomicscience.api; + +import atomicscience.api.poison.Poison; +import net.minecraft.world.World; + +public interface IAntiPoisonBlock { + + boolean isPoisonPrevention(World var1, int var2, int var3, int var4, Poison var5); +} diff --git a/src/main/java/atomicscience/api/IElectromagnet.java b/src/main/java/atomicscience/api/IElectromagnet.java new file mode 100644 index 0000000..7b92be0 --- /dev/null +++ b/src/main/java/atomicscience/api/IElectromagnet.java @@ -0,0 +1,8 @@ +package atomicscience.api; + +import net.minecraft.world.World; + +public interface IElectromagnet { + + boolean isRunning(World var1, int var2, int var3, int var4); +} diff --git a/src/main/java/atomicscience/api/IFissileMaterial.java b/src/main/java/atomicscience/api/IFissileMaterial.java new file mode 100644 index 0000000..174c7e7 --- /dev/null +++ b/src/main/java/atomicscience/api/IFissileMaterial.java @@ -0,0 +1,8 @@ +package atomicscience.api; + +import atomicscience.api.ITemperature; + +public interface IFissileMaterial { + + int onFissile(ITemperature var1); +} diff --git a/src/main/java/atomicscience/api/IHeatSource.java b/src/main/java/atomicscience/api/IHeatSource.java new file mode 100644 index 0000000..14a3f7d --- /dev/null +++ b/src/main/java/atomicscience/api/IHeatSource.java @@ -0,0 +1,6 @@ +package atomicscience.api; + +import atomicscience.api.ITemperature; + +public interface IHeatSource extends ITemperature { +} diff --git a/src/main/java/atomicscience/api/IReactor.java b/src/main/java/atomicscience/api/IReactor.java new file mode 100644 index 0000000..1e85b0e --- /dev/null +++ b/src/main/java/atomicscience/api/IReactor.java @@ -0,0 +1,7 @@ +package atomicscience.api; + + +public interface IReactor { + + boolean isOverToxic(); +} diff --git a/src/main/java/atomicscience/api/ISteamReceptor.java b/src/main/java/atomicscience/api/ISteamReceptor.java new file mode 100644 index 0000000..057cbed --- /dev/null +++ b/src/main/java/atomicscience/api/ISteamReceptor.java @@ -0,0 +1,7 @@ +package atomicscience.api; + + +public interface ISteamReceptor { + + void onReceiveSteam(int var1); +} diff --git a/src/main/java/atomicscience/api/ITemperature.java b/src/main/java/atomicscience/api/ITemperature.java new file mode 100644 index 0000000..943e2fa --- /dev/null +++ b/src/main/java/atomicscience/api/ITemperature.java @@ -0,0 +1,9 @@ +package atomicscience.api; + + +public interface ITemperature { + + float getTemperature(); + + void setTemperature(float var1); +} diff --git a/src/main/java/atomicscience/api/Plasma.java b/src/main/java/atomicscience/api/Plasma.java new file mode 100644 index 0000000..4505c99 --- /dev/null +++ b/src/main/java/atomicscience/api/Plasma.java @@ -0,0 +1,17 @@ +package atomicscience.api; + +import net.minecraft.world.World; + +public class Plasma { + + public static Plasma.IPlasma blockPlasma; + + + + public interface IPlasma { + + void spawn(World var1, int var2, int var3, int var4, byte var5); + + boolean canPlace(World var1, int var2, int var3, int var4); + } +} diff --git a/src/main/java/atomicscience/api/poison/Poison.java b/src/main/java/atomicscience/api/poison/Poison.java new file mode 100644 index 0000000..81abe27 --- /dev/null +++ b/src/main/java/atomicscience/api/poison/Poison.java @@ -0,0 +1,77 @@ +package atomicscience.api.poison; + +import atomicscience.api.IAntiPoisonArmor; +import java.util.EnumSet; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import universalelectricity.core.vector.Vector3; + +public abstract class Poison { + + public static Poison[] list = new Poison[32]; + protected String name; + protected EnumSet armorRequired; + + public Poison(String name, int id) { + this.armorRequired = EnumSet.range(Poison.ArmorType.HELM, Poison.ArmorType.BOOTS); + this.name = name; + if (list == null) { + list = new Poison[32]; + } + + list[0] = this; + } + + public String getName() { + return this.name; + } + + public EnumSet getArmorRequired() { + return this.armorRequired; + } + + public void poisonEntity(Vector3 emitPosition, EntityLivingBase entity, + int amplifier) { + EnumSet armorWorn = EnumSet.of(Poison.ArmorType.UNKNOWN); + if (entity instanceof EntityPlayer) { + EntityPlayer entityPlayer = (EntityPlayer) entity; + + for (int i = 0; i < entityPlayer.inventory.armorInventory.length; ++i) { + if (entityPlayer.inventory.armorInventory[i] != null && + entityPlayer.inventory.armorInventory[i].getItem() instanceof IAntiPoisonArmor && + ((IAntiPoisonArmor) entityPlayer.inventory.armorInventory[i] + .getItem()) + .isProtectedFromPoison(entityPlayer.inventory.armorInventory[i], + entity, this)) { + ((IAntiPoisonArmor) entityPlayer.inventory.armorInventory[i].getItem()) + .onProtectFromPoison(entityPlayer.inventory.armorInventory[i], + entity, this); + armorWorn.add( + ((IAntiPoisonArmor) entityPlayer.inventory.armorInventory[i] + .getItem()) + .getArmorType()); + } + } + } + + if (!armorWorn.containsAll(this.armorRequired)) { + this.doPoisonEntity(emitPosition, entity, armorWorn, amplifier); + } + } + + public void poisonEntity(Vector3 emitPosition, EntityLivingBase entity) { + this.poisonEntity(emitPosition, entity, 0); + } + + protected abstract void doPoisonEntity(Vector3 var1, EntityLivingBase var2, + EnumSet var3, int var4); + + public static enum ArmorType { + HELM, + BODY, + LEGGINGS, + BOOTS, + UNKNOWN; + } +} diff --git a/src/main/java/atomicscience/api/poison/PoisonRadiation.java b/src/main/java/atomicscience/api/poison/PoisonRadiation.java new file mode 100644 index 0000000..21fc3af --- /dev/null +++ b/src/main/java/atomicscience/api/poison/PoisonRadiation.java @@ -0,0 +1,66 @@ +package atomicscience.api.poison; + +import atomicscience.api.IAntiPoisonBlock; +import java.util.EnumSet; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.CustomDamageSource; +import universalelectricity.prefab.potion.CustomPotionEffect; + +public class PoisonRadiation extends Poison { + + public static final Poison INSTANCE = new PoisonRadiation("radiation", 0); + public static final CustomDamageSource damageSource = (CustomDamageSource) (new CustomDamageSource("radiation")) + .setDamageBypassesArmor(); + public static boolean disabled = false; + + public PoisonRadiation(String name, int id) { + super(name, id); + } + + @Override + protected void doPoisonEntity(Vector3 emitPosition, EntityLivingBase entity, + EnumSet armorWorn, + int amplifier) { + if (!disabled) { + if (emitPosition == null) { + entity.addPotionEffect( + new CustomPotionEffect(PotionRadiation.INSTANCE.getId(), + 300 * (amplifier + 1), amplifier, null)); + return; + } + + if (this.getAntiRadioactiveCount(entity.worldObj, emitPosition, + new Vector3(entity)) <= amplifier) { + entity.addPotionEffect( + new CustomPotionEffect(PotionRadiation.INSTANCE.getId(), + 400 * (amplifier + 1), amplifier, null)); + } + } + } + + public int getAntiRadioactiveCount(World world, Vector3 startingPosition, + Vector3 endingPosition) { + Vector3 delta = Vector3.subtract(endingPosition, startingPosition).normalize(); + Vector3 targetPosition = startingPosition.clone(); + double totalDistance = startingPosition.distanceTo(endingPosition); + int count = 0; + if (totalDistance > 1.0D) { + for (; targetPosition.distanceTo(endingPosition) <= totalDistance; targetPosition.add(delta)) { + Block block = targetPosition.getBlock(world); + if (block != Blocks.air && block instanceof IAntiPoisonBlock && + ((IAntiPoisonBlock) block) + .isPoisonPrevention(world, targetPosition.intX(), + targetPosition.intY(), + targetPosition.intZ(), this)) { + ++count; + } + } + } + + return count; + } +} diff --git a/src/main/java/atomicscience/api/poison/PotionRadiation.java b/src/main/java/atomicscience/api/poison/PotionRadiation.java new file mode 100644 index 0000000..416ba3e --- /dev/null +++ b/src/main/java/atomicscience/api/poison/PotionRadiation.java @@ -0,0 +1,38 @@ +package atomicscience.api.poison; + +import atomicscience.api.AtomicScience; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import universalelectricity.prefab.potion.CustomPotion; + +public class PotionRadiation extends CustomPotion { + public static final PotionRadiation INSTANCE; + + public PotionRadiation(int id, boolean isBadEffect, int color, String name) { + super(AtomicScience.CONFIGURATION.get("Potion", name + " potion ID", id) + .getInt(id), + isBadEffect, color, name); + this.setIconIndex(6, 0); + } + + @Override + public void performEffect(EntityLivingBase entity, int amplifier) { + if ((double) entity.worldObj.rand.nextFloat() > 0.9D - (double) amplifier * 0.08D) { + entity.attackEntityFrom(PoisonRadiation.damageSource, 1); + if (entity instanceof EntityPlayer) { + ((EntityPlayer) entity) + .addExhaustion(0.01F * (float) (amplifier + 1)); + } + } + } + + public boolean isReady(int duration, int amplifier) { + return duration % 10 == 0; + } + + static { + AtomicScience.CONFIGURATION.load(); + INSTANCE = new PotionRadiation(21, true, 5149489, "radiation"); + AtomicScience.CONFIGURATION.save(); + } +} diff --git a/src/main/java/calclavia/lib/Calclavia.java b/src/main/java/calclavia/lib/Calclavia.java new file mode 100644 index 0000000..ff6b180 --- /dev/null +++ b/src/main/java/calclavia/lib/Calclavia.java @@ -0,0 +1,32 @@ +package calclavia.lib; + +import java.util.ArrayList; +import java.util.List; + +public class Calclavia { + + public static final String RESOURCE_DIRECTORY = "/mods/calclavia/"; + public static final String TEXTURE_DIRECTORY = "/mods/calclavia/textures/"; + public static final String GUI_DIRECTORY = "/mods/calclavia/textures/gui/"; + public static final String GUI_COMPONENTS = "/mods/calclavia/textures/gui/gui_components.png"; + public static final String GUI_BASE_FILE = "/mods/calclavia/textures/gui/gui_base.png"; + public static final String GUI_EMPTY_FILE = "/mods/calclavia/textures/gui/gui_empty.png"; + + + public static List splitStringPerWord(String string, int wordsPerLine) { + String[] words = string.split(" "); + ArrayList lines = new ArrayList<>(); + + for(int lineCount = 0; (double)lineCount < Math.ceil((double)((float)words.length / (float)wordsPerLine)); ++lineCount) { + String stringInLine = ""; + + for(int i = lineCount * wordsPerLine; i < Math.min(wordsPerLine + lineCount * wordsPerLine, words.length); ++i) { + stringInLine = stringInLine + words[i] + " "; + } + + lines.add(stringInLine.trim()); + } + + return lines; + } +} diff --git a/src/main/java/calclavia/lib/CalculationHelper.java b/src/main/java/calclavia/lib/CalculationHelper.java new file mode 100644 index 0000000..1748b8b --- /dev/null +++ b/src/main/java/calclavia/lib/CalculationHelper.java @@ -0,0 +1,111 @@ +package calclavia.lib; + +import java.util.Iterator; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class CalculationHelper { + + public static void rotateByAngle(Vector3 vector, double yaw) { + double yawRadians = Math.toRadians(yaw); + double x = vector.x; + double z = vector.z; + if(yaw != 0.0D) { + vector.x = x * Math.cos(yawRadians) - z * Math.sin(yawRadians); + vector.z = x * Math.sin(yawRadians) + z * Math.cos(yawRadians); + } + + } + + public static void rotateByAngle(Vector3 vector, double yaw, double pitch) { + rotateByAngle(vector, yaw, pitch, 0.0D); + } + + public static void rotateByAngle(Vector3 vector, double yaw, double pitch, double roll) { + double yawRadians = Math.toRadians(yaw); + double pitchRadians = Math.toRadians(pitch); + double rollRadians = Math.toRadians(roll); + double x = vector.x; + double y = vector.y; + double z = vector.z; + vector.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)); + vector.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)); + vector.y = -x * Math.sin(pitchRadians) + z * Math.cos(pitchRadians) * Math.sin(rollRadians) + y * Math.cos(pitchRadians) * Math.cos(rollRadians); + } + + public static Vector3 getDeltaPositionFromRotation(float rotationYaw, float rotationPitch) { + rotationYaw += 90.0F; + rotationPitch = -rotationPitch; + return new Vector3(Math.cos(Math.toRadians((double)rotationYaw)), Math.sin(Math.toRadians((double)rotationPitch)), Math.sin(Math.toRadians((double)rotationYaw))); + } + + public static MovingObjectPosition raytraceEntities(World world, Vector3 startPosition, float rotationYaw, float rotationPitch, boolean collisionFlag, double reachDistance) { + MovingObjectPosition pickedEntity = null; + Vec3 startingPosition = startPosition.toVec3(); + Vec3 look = getDeltaPositionFromRotation(rotationYaw, rotationPitch).toVec3(); + Vec3 reachPoint = Vec3.createVectorHelper(startingPosition.xCoord + look.xCoord * reachDistance, startingPosition.yCoord + look.yCoord * reachDistance, startingPosition.zCoord + look.zCoord * reachDistance); + double playerBorder = 1.1D * reachDistance; + AxisAlignedBB boxToScan = AxisAlignedBB.getBoundingBox(-playerBorder, -playerBorder, -playerBorder, playerBorder, playerBorder, playerBorder); + List entitiesHit = world.getEntitiesWithinAABBExcludingEntity((Entity)null, boxToScan); + double closestEntity = reachDistance; + if(entitiesHit != null && !entitiesHit.isEmpty()) { + Iterator i$ = entitiesHit.iterator(); + + while(i$.hasNext()) { + Entity entityHit = (Entity)i$.next(); + 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(startingPosition, reachPoint); + if(hitMOP != null) { + if(aabb.isVecInside(startingPosition)) { + if(0.0D < closestEntity || closestEntity == 0.0D) { + pickedEntity = new MovingObjectPosition(entityHit); + if(pickedEntity != null) { + pickedEntity.hitVec = hitMOP.hitVec; + closestEntity = 0.0D; + } + } + } else { + double distance = startingPosition.distanceTo(hitMOP.hitVec); + if(distance < closestEntity || closestEntity == 0.0D) { + pickedEntity = new MovingObjectPosition(entityHit); + pickedEntity.hitVec = hitMOP.hitVec; + closestEntity = distance; + } + } + } + } + } + + return pickedEntity; + } else { + return null; + } + } + + public static MovingObjectPosition raytraceBlocks(World world, Vector3 startPosition, float rotationYaw, float rotationPitch, boolean collisionFlag, double reachDistance) { + Vector3 lookVector = getDeltaPositionFromRotation(rotationYaw, rotationPitch); + Vector3 reachPoint = Vector3.add(startPosition, Vector3.multiply(lookVector, reachDistance)); + return world.rayTraceBlocks(startPosition.toVec3(), reachPoint.toVec3(), collisionFlag); + } + + public static MovingObjectPosition doCustomRayTrace(World world, Vector3 startPosition, float rotationYaw, float rotationPitch, boolean collisionFlag, double reachDistance) { + MovingObjectPosition pickedBlock = raytraceBlocks(world, startPosition, rotationYaw, rotationPitch, collisionFlag, reachDistance); + MovingObjectPosition pickedEntity = raytraceEntities(world, startPosition, rotationYaw, rotationPitch, collisionFlag, reachDistance); + if(pickedBlock == null) { + return pickedEntity; + } else if(pickedEntity == null) { + return pickedBlock; + } else { + double dBlock = startPosition.distanceTo(new Vector3(pickedBlock.hitVec)); + double dEntity = startPosition.distanceTo(new Vector3(pickedEntity.hitVec)); + return dEntity < dBlock?pickedEntity:pickedBlock; + } + } +} diff --git a/src/main/java/calclavia/lib/IPlayerUsing.java b/src/main/java/calclavia/lib/IPlayerUsing.java new file mode 100644 index 0000000..c7681eb --- /dev/null +++ b/src/main/java/calclavia/lib/IPlayerUsing.java @@ -0,0 +1,8 @@ +package calclavia.lib; + +import java.util.HashSet; + +public interface IPlayerUsing { + + HashSet getPlayersUsing(); +} diff --git a/src/main/java/calclavia/lib/IUniversalEnergyTile.java b/src/main/java/calclavia/lib/IUniversalEnergyTile.java new file mode 100644 index 0000000..ed5452c --- /dev/null +++ b/src/main/java/calclavia/lib/IUniversalEnergyTile.java @@ -0,0 +1,7 @@ +package calclavia.lib; + +import universalelectricity.core.block.IConnector; +import universalelectricity.core.block.IVoltage; + +public interface IUniversalEnergyTile extends IConnector, IVoltage { +} diff --git a/src/main/java/calclavia/lib/TileEntityUniversalProducer.java b/src/main/java/calclavia/lib/TileEntityUniversalProducer.java new file mode 100644 index 0000000..e90c0c9 --- /dev/null +++ b/src/main/java/calclavia/lib/TileEntityUniversalProducer.java @@ -0,0 +1,25 @@ +package calclavia.lib; + +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.electricity.ElectricityNetworkHelper; +import universalelectricity.core.electricity.ElectricityPack; +import universalelectricity.prefab.implement.IRotatable; +import universalelectricity.prefab.tile.TileEntityElectrical; + +public class TileEntityUniversalProducer extends TileEntityElectrical { + public ElectricityPack produce(double watts) { + ElectricityPack pack = + new ElectricityPack(watts / this.getVoltage(), this.getVoltage()); + ElectricityPack remaining = + ElectricityNetworkHelper.produceFromMultipleSides(this, pack); + + return remaining; + } + + @Override + public boolean canConnect(ForgeDirection direction) { + return this instanceof IRotatable + ? direction.ordinal() == this.getBlockMetadata() + : true; + } +} diff --git a/src/main/java/calclavia/lib/TileEntityUniversalRunnable.java b/src/main/java/calclavia/lib/TileEntityUniversalRunnable.java new file mode 100644 index 0000000..19387fb --- /dev/null +++ b/src/main/java/calclavia/lib/TileEntityUniversalRunnable.java @@ -0,0 +1,28 @@ +package calclavia.lib; + +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.prefab.implement.IRotatable; +import universalelectricity.prefab.tile.TileEntityElectricityRunnable; + +public abstract class TileEntityUniversalRunnable + extends TileEntityElectricityRunnable implements IUniversalEnergyTile { + @Override + public boolean canConnect(ForgeDirection direction) { + return this instanceof IRotatable + ? direction == ForgeDirection.getOrientation(this.getBlockMetadata()) + .getOpposite() + : true; + } + + public ForgeDirection getDirection(IBlockAccess world, int x, int y, int z) { + return ForgeDirection.getOrientation(this.getBlockMetadata()); + } + + public void setDirection(World world, int x, int y, int z, + ForgeDirection facingDirection) { + this.worldObj.setBlockMetadataWithNotify( + this.xCoord, this.yCoord, this.zCoord, facingDirection.ordinal(), 2); + } +} diff --git a/src/main/java/calclavia/lib/TileEntityUniversalStorable.java b/src/main/java/calclavia/lib/TileEntityUniversalStorable.java new file mode 100644 index 0000000..a5a1978 --- /dev/null +++ b/src/main/java/calclavia/lib/TileEntityUniversalStorable.java @@ -0,0 +1,28 @@ +package calclavia.lib; + +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.prefab.implement.IRotatable; +import universalelectricity.prefab.tile.TileEntityElectricityStorage; + +public abstract class TileEntityUniversalStorable + extends TileEntityElectricityStorage implements IUniversalEnergyTile { + @Override + public boolean canConnect(ForgeDirection direction) { + return this instanceof IRotatable + ? direction == ForgeDirection.getOrientation(this.getBlockMetadata()) + .getOpposite() + : true; + } + + public ForgeDirection getDirection(IBlockAccess world, int x, int y, int z) { + return ForgeDirection.getOrientation(this.getBlockMetadata()); + } + + public void setDirection(World world, int x, int y, int z, + ForgeDirection facingDirection) { + this.worldObj.setBlockMetadataWithNotify( + this.xCoord, this.yCoord, this.zCoord, facingDirection.ordinal(), 2); + } +} diff --git a/src/main/java/calclavia/lib/UniversalRecipes.java b/src/main/java/calclavia/lib/UniversalRecipes.java new file mode 100644 index 0000000..198b506 --- /dev/null +++ b/src/main/java/calclavia/lib/UniversalRecipes.java @@ -0,0 +1,102 @@ +package calclavia.lib; + +import cpw.mods.fml.common.FMLLog; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +public class UniversalRecipes { + public static final String PRIMARY_METAL = "ingotSteel"; + public static final String PRIMARY_PLATE = "plateSteel"; + public static final String SECONDARY_METAL = "ingotBronze"; + public static final String SECONDARY_PLATE = "plateBronze"; + public static final String CIRCUIT_T1 = "calclavia:CIRCUIT_T1"; + public static final String CIRCUIT_T2 = "calclavia:CIRCUIT_T2"; + public static final String CIRCUIT_T3 = "calclavia:CIRCUIT_T3"; + public static String ADVANCED_BATTERY = "calclavia:ADVANCED_BATTERY"; + public static String BATTERY = "calclavia:BATTERY"; + public static String BATTERY_BOX = "calclavia:BATTERY_BOX"; + public static final String WRENCH = "calclavia:WRENCH"; + public static final String WIRE = "calclavia:WIRE"; + public static final String MOTOR = "calclavia:MOTOR"; + public static boolean isInit = false; + + public static void init() { + if (!isInit) { + // TODO: WTF + // register("calclavia:CIRCUIT_T1", new Object[]{"circuitBasic", + // Items.getItem("electronicCircuit"), new + // ItemStack(Blocks.redstone_torch)}); register("calclavia:CIRCUIT_T2", + // new Object[]{"circuitAdvanced", Items.getItem("advancedCircuit"), new + // ItemStack(Items.repeater)}); register("calclavia:CIRCUIT_T3", new + // Object[]{"circuitElite", Items.getItem("iridiumPlate"), new + // ItemStack(Block.field_94346_cn)}); register(ADVANCED_BATTERY, new + // Object[]{"advancedBattery", Items.getItem("energyCrystal"), "battery", + // new ItemStack(Items.repeater)}); register(BATTERY, new + // Object[]{"battery", Items.getItem("reBattery"), new + // ItemStack(Items.repeater)}); + // register(BATTERY_BOX, new Object[]{"batteryBox", + // Items.getItem("batBox"), new ItemStack(Block.field_72105_ah)}); + // register("calclavia:WRENCH", new Object[]{"wrench", + // Items.getItem("wrench"), new ItemStack(Item.field_77708_h)}); + // register("calclavia:WIRE", new Object[]{"copperWire", + // "copperCableBlock", new ItemStack(Item.field_77767_aC)}); + // register("calclavia:MOTOR", new Object[]{"motor", + // Items.getItem("generator"), new ItemStack(Block.field_71963_Z)}); + isInit = true; + } + } + + public static void register(String name, Object... possiblities) { + Object[] arr$ = possiblities; + int len$ = possiblities.length; + + for (int i$ = 0; i$ < len$; ++i$) { + Object possiblity = arr$[i$]; + if (possiblity instanceof ItemStack) { + if (registerItemStacksToDictionary( + name, new ItemStack[] {(ItemStack)possiblity})) { + break; + } + } else if (possiblity instanceof String) { + if (registerItemStacksToDictionary(name, (String)possiblity)) { + break; + } + } else { + FMLLog.severe("Universal Recipes: Error Registering " + name, + new Object[0]); + } + } + } + + public static boolean registerItemStacksToDictionary(String name, + List itemStacks) { + boolean returnValue = false; + if (itemStacks != null && itemStacks.size() > 0) { + Iterator i$ = itemStacks.iterator(); + + while (i$.hasNext()) { + ItemStack stack = (ItemStack)i$.next(); + if (stack != null) { + OreDictionary.registerOre(name, stack); + returnValue = true; + } + } + } + + return returnValue; + } + + public static boolean + registerItemStacksToDictionary(String name, ItemStack... itemStacks) { + return registerItemStacksToDictionary(name, Arrays.asList(itemStacks)); + } + + public static boolean registerItemStacksToDictionary(String name, + String stackName) { + return registerItemStacksToDictionary( + name, (List)OreDictionary.getOres(stackName)); + } +} diff --git a/src/main/java/calclavia/lib/gui/ContainerBase.java b/src/main/java/calclavia/lib/gui/ContainerBase.java new file mode 100644 index 0000000..d2c20d4 --- /dev/null +++ b/src/main/java/calclavia/lib/gui/ContainerBase.java @@ -0,0 +1,96 @@ +package calclavia.lib.gui; + +import calclavia.lib.IPlayerUsing; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerBase extends Container { + + protected int slotCount = 0; + private IInventory inventory; + + + public ContainerBase(IInventory inventory) { + this.inventory = inventory; + this.slotCount = inventory.getSizeInventory(); + } + + public void onContainerClosed(EntityPlayer player) { + if(this.inventory instanceof IPlayerUsing) { + ((IPlayerUsing)this.inventory).getPlayersUsing().remove(player); + } + + } + + public void addPlayerInventory(EntityPlayer player) { + if(this.inventory instanceof IPlayerUsing) { + ((IPlayerUsing)this.inventory).getPlayersUsing().add(player); + } + + int var3; + for(var3 = 0; var3 < 3; ++var3) { + for(int var4 = 0; var4 < 9; ++var4) { + this.addSlotToContainer(new Slot(player.inventory, var4 + var3 * 9 + 9, 8 + var4 * 18, 135 + var3 * 18)); + } + } + + for(var3 = 0; var3 < 9; ++var3) { + this.addSlotToContainer(new Slot(player.inventory, var3, 8 + var3 * 18, 193)); + } + + } + + public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int slotID) { + ItemStack var2 = null; + Slot var3 = (Slot)super.inventorySlots.get(slotID); + if(var3 != null && var3.getHasStack()) { + ItemStack itemStack = var3.getStack(); + var2 = itemStack.copy(); + if(slotID >= this.slotCount) { + boolean didTry = false; + + for(int i = 0; i < this.slotCount; ++i) { + if(this.getSlot(i).isItemValid(itemStack)) { + didTry = true; + if(this.mergeItemStack(itemStack, i, i + 1, false)) { + break; + } + } + } + + if(!didTry) { + if(slotID < 27 + this.slotCount) { + if(!this.mergeItemStack(itemStack, 27 + this.slotCount, 36 + this.slotCount, false)) { + return null; + } + } else if(slotID >= 27 + this.slotCount && slotID < 36 + this.slotCount && !this.mergeItemStack(itemStack, this.slotCount, 27 + this.slotCount, false)) { + return null; + } + } + } else if(!this.mergeItemStack(itemStack, this.slotCount, 36 + this.slotCount, false)) { + return null; + } + + if(itemStack.stackSize == 0) { + var3.putStack((ItemStack)null); + } else { + var3.onSlotChanged(); + } + + if(itemStack.stackSize == var2.stackSize) { + return null; + } + + var3.onPickupFromSlot(par1EntityPlayer, itemStack); + } + + return var2; + } + + public boolean canInteractWith(EntityPlayer entityplayer) { + return this.inventory.isUseableByPlayer(entityplayer); + } +} diff --git a/src/main/java/calclavia/lib/gui/GuiContainerBase.java b/src/main/java/calclavia/lib/gui/GuiContainerBase.java new file mode 100644 index 0000000..8d2cad3 --- /dev/null +++ b/src/main/java/calclavia/lib/gui/GuiContainerBase.java @@ -0,0 +1,296 @@ +package calclavia.lib.gui; + +import calclavia.lib.Calclavia; +import java.util.HashMap; +import java.util.Map.Entry; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidStack; +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; +import universalelectricity.core.vector.Vector2; +import universalelectricity.prefab.TranslationHelper; +import universalelectricity.prefab.vector.Region2; + +public class GuiContainerBase extends GuiContainer { + + //private static final int METER_X = 54; + public static final int METER_HEIGHT = 49; + public static final int METER_WIDTH = 14; + public static final int METER_END = 68; + public String tooltip = ""; + protected HashMap tooltips = new HashMap<>(); + protected int containerWidth; + protected int containerHeight; + + public GuiContainerBase(Container container) { + super(container); + this.ySize = 217; + } + + @Override + public void initGui() { + super.initGui(); + } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + super.onGuiClosed(); + } + + @Override + protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { + for (Entry entry : this.tooltips.entrySet()) { + if (((Region2)entry.getKey()) + .isIn(new Vector2((double)(mouseX - this.guiLeft), + (double)(mouseY - this.guiTop)))) { + this.tooltip = (String)entry.getValue(); + break; + } + } + + if (this.tooltip != null && this.tooltip != "") { + this.drawTooltip(mouseX - this.guiLeft, mouseY - this.guiTop, + (String[])Calclavia.splitStringPerWord(this.tooltip, 5) + .toArray(new String[0])); + } + + this.tooltip = ""; + } + + @Override + protected void drawGuiContainerBackgroundLayer(float var1, int x, int y) { + this.containerWidth = (this.width - this.xSize) / 2; + this.containerHeight = (this.height - this.ySize) / 2; + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_base.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.drawTexturedModalRect(this.containerWidth, this.containerHeight, 0, 0, + this.xSize, this.ySize); + } + + protected void drawBulb(int x, int y, boolean isOn) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_base.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + if (isOn) { + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 161, 0, 6, 6); + } else { + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 161, 4, 6, 6); + } + } + + protected void drawSlot(int x, int y, ItemStack itemStack) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_base.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 0, 0, 18, 18); + this.drawItemStack(itemStack, this.containerWidth + x, + this.containerHeight + y); + } + + protected void drawItemStack(ItemStack itemStack, int x, int y) { + ++x; + ++y; + GL11.glTranslatef(0.0F, 0.0F, 32.0F); + itemRender.renderItemAndEffectIntoGUI( + this.fontRendererObj, this.mc.renderEngine, itemStack, x, y); + } + + protected void drawTextWithTooltip(String textName, String format, int x, + int y, int mouseX, int mouseY) { + this.drawTextWithTooltip(textName, format, x, y, mouseX, mouseY, 4210752); + } + + protected void drawTextWithTooltip(String textName, String format, int x, + int y, int mouseX, int mouseY, int color) { + String name = TranslationHelper.getLocal("gui." + textName + ".name"); + String text = format.replaceAll("%1", name); + this.fontRendererObj.drawString(text, x, y, color); + String tooltip = TranslationHelper.getLocal("gui." + textName + ".tooltip"); + if (tooltip != null && tooltip != "" && + this.func_146978_c(x, y, (int)((double)text.length() * 4.8D), 12, + mouseX, mouseY)) { + this.tooltip = tooltip; + } + } + + protected void drawTextWithTooltip(String textName, int x, int y, int mouseX, + int mouseY) { + this.drawTextWithTooltip(textName, "%1", x, y, mouseX, mouseY); + } + + protected void drawSlot(int x, int y, GuiSlotType type, float r, float g, + float b) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_components.png")); + GL11.glColor4f(r, g, b, 1.0F); + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 0, 0, 18, 18); + if (type != GuiSlotType.NONE) { + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 0, + 18 * type.ordinal(), 18, 18); + } + } + + protected void drawSlot(int x, int y, GuiSlotType type) { + this.drawSlot(x, y, type, 1.0F, 1.0F, 1.0F); + } + + protected void drawSlot(int x, int y) { + this.drawSlot(x, y, GuiSlotType.NONE); + } + + protected void drawBar(int x, int y, float scale) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_components.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 18, 0, 22, 15); + if (scale > 0.0F) { + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 18, 15, + 22 - (int)(scale * 22.0F), 15); + } + } + + protected void drawForce(int x, int y, float scale) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_components.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 54, 0, 107, 11); + if (scale > 0.0F) { + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 54, 11, + (int)(scale * 107.0F), 11); + } + } + + protected void drawElectricity(int x, int y, float scale) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_components.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 54, 0, 107, 11); + if (scale > 0.0F) { + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 54, 22, + (int)(scale * 107.0F), 11); + } + } + + protected void drawMeter(int x, int y, float scale, FluidStack liquidStack) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_base.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 40, 0, 14, 49); + this.displayGauge(this.containerWidth + x, this.containerHeight + y, 0, 0, + (int)(48.0F * scale), liquidStack); + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_base.png")); + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 40, 98, 14, 49); + } + + public void drawTooltip(int x, int y, String... toolTips) { + if (!GuiScreen.isShiftKeyDown()) { + GL11.glDisable('\u803a'); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(2896); + GL11.glDisable(2929); + if (toolTips != null) { + int var5 = 0; + + int var6; + int var7; + for (var6 = 0; var6 < toolTips.length; ++var6) { + var7 = this.fontRendererObj.getStringWidth(toolTips[var6]); + if (var7 > var5) { + var5 = var7; + } + } + + var6 = x + 12; + var7 = y - 12; + int var9 = 8; + if (toolTips.length > 1) { + var9 += 2 + (toolTips.length - 1) * 10; + } + + if (this.guiTop + var7 + var9 + 6 > this.height) { + var7 = this.height - var9 - this.guiTop - 6; + } + + super.zLevel = 300.0F; + int var10 = -267386864; + this.drawGradientRect(var6 - 3, var7 - 4, var6 + var5 + 3, var7 - 3, + var10, var10); + this.drawGradientRect(var6 - 3, var7 + var9 + 3, var6 + var5 + 3, + var7 + var9 + 4, var10, var10); + this.drawGradientRect(var6 - 3, var7 - 3, var6 + var5 + 3, + var7 + var9 + 3, var10, var10); + this.drawGradientRect(var6 - 4, var7 - 3, var6 - 3, var7 + var9 + 3, + var10, var10); + this.drawGradientRect(var6 + var5 + 3, var7 - 3, var6 + var5 + 4, + var7 + var9 + 3, var10, var10); + int var11 = 1347420415; + int var12 = (var11 & 16711422) >> 1 | var11 & -16777216; + this.drawGradientRect(var6 - 3, var7 - 3 + 1, var6 - 3 + 1, + var7 + var9 + 3 - 1, var11, var12); + this.drawGradientRect(var6 + var5 + 2, var7 - 3 + 1, var6 + var5 + 3, + var7 + var9 + 3 - 1, var11, var12); + this.drawGradientRect(var6 - 3, var7 - 3, var6 + var5 + 3, var7 - 3 + 1, + var11, var11); + this.drawGradientRect(var6 - 3, var7 + var9 + 2, var6 + var5 + 3, + var7 + var9 + 3, var12, var12); + + for (int var13 = 0; var13 < toolTips.length; ++var13) { + String var14 = toolTips[var13]; + this.fontRendererObj.drawStringWithShadow(var14, var6, var7, -1); + var7 += 10; + } + + super.zLevel = 0.0F; + GL11.glEnable(2929); + GL11.glEnable(2896); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable('\u803a'); + } + } + } + + protected void displayGauge(int j, int k, int line, int col, int squaled, + FluidStack liquid) { + if (liquid != null) { + int start = 0; + IIcon liquidIcon = liquid.getFluid().getIcon(); + + int x1; + do { + if (squaled > 16) { + x1 = 16; + squaled -= 16; + } else { + x1 = squaled; + squaled = 0; + } + + this.drawTexturedModelRectFromIcon(j + col, k + line + 58 - x1 - start, + liquidIcon, 16, 16 - (16 - x1)); + start += 16; + } while (x1 != 0 && squaled != 0); + } + } +} diff --git a/src/main/java/calclavia/lib/gui/GuiScreenBase.java b/src/main/java/calclavia/lib/gui/GuiScreenBase.java new file mode 100644 index 0000000..10e570a --- /dev/null +++ b/src/main/java/calclavia/lib/gui/GuiScreenBase.java @@ -0,0 +1,271 @@ +package calclavia.lib.gui; + +import calclavia.lib.Calclavia; +import java.util.HashMap; +import java.util.Map.Entry; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidStack; +import org.lwjgl.opengl.GL11; +import universalelectricity.core.vector.Vector2; +import universalelectricity.prefab.GuiBase; +import universalelectricity.prefab.TranslationHelper; +import universalelectricity.prefab.vector.Region2; + +public class GuiScreenBase extends GuiBase { + + // private static final int METER_X = 54; + public static final int METER_HEIGHT = 49; + public static final int METER_WIDTH = 14; + public static final int METER_END = 68; + public String tooltip = ""; + protected HashMap tooltips = new HashMap<>(); + protected int containerWidth; + protected int containerHeight; + + public GuiScreenBase() { super.ySize = 217; } + + @Override + protected void drawForegroundLayer(int mouseX, int mouseY, float var1) { + for (Entry entry : this.tooltips.entrySet()) { + if (((Region2)entry.getKey()) + .isIn(new Vector2((double)(mouseX - this.guiLeft), + (double)(mouseY - this.guiTop)))) { + this.tooltip = (String)entry.getValue(); + break; + } + } + + if (this.tooltip != null && this.tooltip != "") { + this.drawTooltip(mouseX - this.guiLeft, mouseY - this.guiTop, + (String[])Calclavia.splitStringPerWord(this.tooltip, 5) + .toArray(new String[0])); + } + + this.tooltip = ""; + } + + @Override + protected void drawBackgroundLayer(int x, int y, float var1) { + this.containerWidth = (this.width - this.xSize) / 2; + this.containerHeight = (this.height - this.ySize) / 2; + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_base.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.drawTexturedModalRect(this.containerWidth, this.containerHeight, 0, 0, + this.xSize, this.ySize); + } + + protected void drawBulb(int x, int y, boolean isOn) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_base.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + if (isOn) { + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 161, 0, 6, 6); + } else { + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 161, 4, 6, 6); + } + } + + protected void drawTextWithTooltip(String textName, String format, int x, + int y, int mouseX, int mouseY) { + this.drawTextWithTooltip(textName, format, x, y, mouseX, mouseY, 4210752); + } + + protected void drawTextWithTooltip(String textName, String format, int x, + int y, int mouseX, int mouseY, int color) { + String name = TranslationHelper.getLocal("gui." + textName + ".name"); + String text = format.replaceAll("%1", name); + this.fontRendererObj.drawString(text, x, y, color); + String tooltip = TranslationHelper.getLocal("gui." + textName + ".tooltip"); + if (tooltip != null && tooltip != "" && + this.isPointInRegion(x, y, (int)((double)text.length() * 4.8D), 12, + mouseX, mouseY)) { + this.tooltip = tooltip; + } + } + + protected boolean isPointInRegion(int par1, int par2, int par3, int par4, + int par5, int par6) { + int k1 = super.guiLeft; + int l1 = super.guiTop; + par5 -= k1; + par6 -= l1; + return par5 >= par1 - 1 && par5 < par1 + par3 + 1 && par6 >= par2 - 1 && + par6 < par2 + par4 + 1; + } + + protected void drawTextWithTooltip(String textName, int x, int y, int mouseX, + int mouseY) { + this.drawTextWithTooltip(textName, "%1", x, y, mouseX, mouseY); + } + + protected void drawSlot(int x, int y, GuiSlotType type, float r, float g, + float b) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_empty.png")); + GL11.glColor4f(r, g, b, 1.0F); + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 0, 0, 18, 18); + if (type != GuiSlotType.NONE) { + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 0, + 18 * type.ordinal(), 18, 18); + } + } + + protected void drawSlot(int x, int y, GuiSlotType type) { + this.drawSlot(x, y, type, 1.0F, 1.0F, 1.0F); + } + + protected void drawSlot(int x, int y) { + this.drawSlot(x, y, GuiSlotType.NONE); + } + + protected void drawBar(int x, int y, float scale) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_empty.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 18, 0, 22, 15); + if (scale > 0.0F) { + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 18, 15, + 22 - (int)(scale * 22.0F), 15); + } + } + + protected void drawForce(int x, int y, float scale) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_empty.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 54, 0, 107, 11); + if (scale > 0.0F) { + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 54, 11, + (int)(scale * 107.0F), 11); + } + } + + protected void drawElectricity(int x, int y, float scale) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_empty.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 54, 0, 107, 11); + if (scale > 0.0F) { + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 54, 22, + (int)(scale * 107.0F), 11); + } + } + + protected void drawMeter(int x, int y, float scale, FluidStack liquidStack) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_empty.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 40, 0, 14, 49); + this.displayGauge(this.containerWidth + x, this.containerHeight + y, 0, 0, + (int)(48.0F * scale), liquidStack); + this.mc.renderEngine.bindTexture( + new ResourceLocation("calclavia", "textures/gui/gui_empty.png")); + this.drawTexturedModalRect(this.containerWidth + x, + this.containerHeight + y, 40, 98, 14, 49); + } + + public void drawTooltip(int x, int y, String... toolTips) { + if (!GuiScreen.isShiftKeyDown()) { + GL11.glDisable('\u803a'); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(2896); + GL11.glDisable(2929); + if (toolTips != null) { + int var5 = 0; + + int var6; + int var7; + for (var6 = 0; var6 < toolTips.length; ++var6) { + var7 = this.fontRendererObj.getStringWidth(toolTips[var6]); + if (var7 > var5) { + var5 = var7; + } + } + + var6 = x + 12; + var7 = y - 12; + int var9 = 8; + if (toolTips.length > 1) { + var9 += 2 + (toolTips.length - 1) * 10; + } + + if (super.guiTop + var7 + var9 + 6 > this.height) { + var7 = this.height - var9 - super.guiTop - 6; + } + + super.zLevel = 300.0F; + int var10 = -267386864; + this.drawGradientRect(var6 - 3, var7 - 4, var6 + var5 + 3, var7 - 3, + var10, var10); + this.drawGradientRect(var6 - 3, var7 + var9 + 3, var6 + var5 + 3, + var7 + var9 + 4, var10, var10); + this.drawGradientRect(var6 - 3, var7 - 3, var6 + var5 + 3, + var7 + var9 + 3, var10, var10); + this.drawGradientRect(var6 - 4, var7 - 3, var6 - 3, var7 + var9 + 3, + var10, var10); + this.drawGradientRect(var6 + var5 + 3, var7 - 3, var6 + var5 + 4, + var7 + var9 + 3, var10, var10); + int var11 = 1347420415; + int var12 = (var11 & 16711422) >> 1 | var11 & -16777216; + this.drawGradientRect(var6 - 3, var7 - 3 + 1, var6 - 3 + 1, + var7 + var9 + 3 - 1, var11, var12); + this.drawGradientRect(var6 + var5 + 2, var7 - 3 + 1, var6 + var5 + 3, + var7 + var9 + 3 - 1, var11, var12); + this.drawGradientRect(var6 - 3, var7 - 3, var6 + var5 + 3, var7 - 3 + 1, + var11, var11); + this.drawGradientRect(var6 - 3, var7 + var9 + 2, var6 + var5 + 3, + var7 + var9 + 3, var12, var12); + + for (int var13 = 0; var13 < toolTips.length; ++var13) { + String var14 = toolTips[var13]; + this.fontRendererObj.drawStringWithShadow(var14, var6, var7, -1); + var7 += 10; + } + + super.zLevel = 0.0F; + GL11.glEnable(2929); + GL11.glEnable(2896); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable('\u803a'); + } + } + } + + protected void displayGauge(int j, int k, int line, int col, int squaled, + FluidStack liquid) { + if (liquid != null) { + int start = 0; + IIcon liquidIcon = liquid.getFluid().getIcon(); + + int x1; + do { + if (squaled > 16) { + x1 = 16; + squaled -= 16; + } else { + x1 = squaled; + squaled = 0; + } + + this.drawTexturedModelRectFromIcon(j + col, k + line + 58 - x1 - start, + liquidIcon, 16, 16 - (16 - x1)); + start += 16; + } while (x1 != 0 && squaled != 0); + } + } +} diff --git a/src/main/java/calclavia/lib/gui/GuiSlotType.java b/src/main/java/calclavia/lib/gui/GuiSlotType.java new file mode 100644 index 0000000..02757f0 --- /dev/null +++ b/src/main/java/calclavia/lib/gui/GuiSlotType.java @@ -0,0 +1,23 @@ +package calclavia.lib.gui; + + +public enum GuiSlotType { + + NONE("NONE", 0), + BATTERY("BATTERY", 1), + LIQUID("LIQUID", 2), + ARR_UP("ARR_UP", 3), + ARR_DOWN("ARR_DOWN", 4), + ARR_LEFT("ARR_LEFT", 5), + ARR_RIGHT("ARR_RIGHT", 6), + ARR_UP_RIGHT("ARR_UP_RIGHT", 7), + ARR_UP_LEFT("ARR_UP_LEFT", 8), + ARR_DOWN_LEFT("ARR_DOWN_LEFT", 9), + ARR_DOWN_RIGHT("ARR_DOWN_RIGHT", 10); + // $FF: synthetic field + private static final GuiSlotType[] $VALUES = new GuiSlotType[]{NONE, BATTERY, LIQUID, ARR_UP, ARR_DOWN, ARR_LEFT, ARR_RIGHT, ARR_UP_RIGHT, ARR_UP_LEFT, ARR_DOWN_LEFT, ARR_DOWN_RIGHT}; + + + private GuiSlotType(String var1, int var2) {} + +} diff --git a/src/main/java/calclavia/lib/render/CalclaviaRenderHelper.java b/src/main/java/calclavia/lib/render/CalclaviaRenderHelper.java new file mode 100644 index 0000000..120743d --- /dev/null +++ b/src/main/java/calclavia/lib/render/CalclaviaRenderHelper.java @@ -0,0 +1,111 @@ +package calclavia.lib.render; + +import net.minecraft.block.Block; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderManager; +import org.lwjgl.opengl.GL11; + +public class CalclaviaRenderHelper { + + public static void enableBlending() { + GL11.glShadeModel(7425); + GL11.glEnable(3042); + GL11.glBlendFunc(770, 771); + } + + public static void disableBlending() { + GL11.glShadeModel(7424); + GL11.glDisable(2848); + GL11.glDisable(2881); + GL11.glDisable(3042); + } + + public static void enableLighting() { + RenderHelper.enableStandardItemLighting(); + } + + public static void disableLighting() { + RenderHelper.disableStandardItemLighting(); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240.0F, 240.0F); + } + + public static void renderNormalBlockAsItem(Block block, int metadata, RenderBlocks renderer) { + Tessellator tessellator = Tessellator.instance; + block.setBlockBoundsForItemRender(); + renderer.setRenderBoundsFromBlock(block); + GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, -1.0F, 0.0F); + renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 0, metadata)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 1, metadata)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, -1.0F); + renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 2, metadata)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, 1.0F); + renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 3, metadata)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(-1.0F, 0.0F, 0.0F); + renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 4, metadata)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(1.0F, 0.0F, 0.0F); + renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 5, metadata)); + tessellator.draw(); + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + } + + public static void renderFloatingText(String text, float x, float y, float z) { + renderFloatingText(text, x, y, z, 16777215); + } + + public static void renderFloatingText(String text, float x, float y, float z, int color) { + RenderManager renderManager = RenderManager.instance; + FontRenderer fontRenderer = renderManager.getFontRenderer(); + float scale = 0.027F; + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); + GL11.glPushMatrix(); + GL11.glTranslatef(x + 0.0F, y + 2.3F, z); + GL11.glNormal3f(0.0F, 1.0F, 0.0F); + GL11.glRotatef(-renderManager.playerViewY, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(renderManager.playerViewX, 1.0F, 0.0F, 0.0F); + GL11.glScalef(-scale, -scale, scale); + GL11.glDisable(2896); + GL11.glDepthMask(false); + GL11.glDisable(2929); + GL11.glEnable(3042); + GL11.glBlendFunc(770, 771); + Tessellator tessellator = Tessellator.instance; + byte yOffset = 0; + GL11.glDisable(3553); + tessellator.startDrawingQuads(); + int stringMiddle = fontRenderer.getStringWidth(text) / 2; + tessellator.setColorRGBA_F(0.0F, 0.0F, 0.0F, 0.5F); + tessellator.addVertex((double)(-stringMiddle - 1), (double)(-1 + yOffset), 0.0D); + tessellator.addVertex((double)(-stringMiddle - 1), (double)(8 + yOffset), 0.0D); + tessellator.addVertex((double)(stringMiddle + 1), (double)(8 + yOffset), 0.0D); + tessellator.addVertex((double)(stringMiddle + 1), (double)(-1 + yOffset), 0.0D); + tessellator.draw(); + GL11.glEnable(3553); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); + fontRenderer.drawString(text, -fontRenderer.getStringWidth(text) / 2, yOffset, color); + GL11.glEnable(2929); + GL11.glDepthMask(true); + fontRenderer.drawString(text, -fontRenderer.getStringWidth(text) / 2, yOffset, color); + GL11.glEnable(2896); + GL11.glDisable(3042); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/calclavia/lib/render/ITagRender.java b/src/main/java/calclavia/lib/render/ITagRender.java new file mode 100644 index 0000000..dad2bb7 --- /dev/null +++ b/src/main/java/calclavia/lib/render/ITagRender.java @@ -0,0 +1,9 @@ +package calclavia.lib.render; + +import java.util.HashMap; +import net.minecraft.entity.player.EntityPlayer; + +public interface ITagRender { + + float addInformation(HashMap var1, EntityPlayer var2); +} diff --git a/src/main/java/calclavia/lib/render/RenderTaggedTile.java b/src/main/java/calclavia/lib/render/RenderTaggedTile.java new file mode 100644 index 0000000..bd1c55c --- /dev/null +++ b/src/main/java/calclavia/lib/render/RenderTaggedTile.java @@ -0,0 +1,64 @@ +package calclavia.lib.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map.Entry; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityClientPlayerMP; +import net.minecraft.client.renderer.entity.RendererLivingEntity; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; + +@SideOnly(Side.CLIENT) +public abstract class RenderTaggedTile extends TileEntitySpecialRenderer { + @Override + public void renderTileEntityAt(TileEntity t, double x, double y, double z, + float f) { + if (t != null && t instanceof ITagRender && + this.getPlayer().getDistance((double)t.xCoord, (double)t.yCoord, + (double)t.zCoord) <= + (double)RendererLivingEntity.NAME_TAG_RANGE) { + HashMap tags = new HashMap(); + float height = ((ITagRender)t).addInformation(tags, this.getPlayer()); + EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; + if (player.ridingEntity == null) { + MovingObjectPosition objectPosition = player.rayTrace(8.0D, 1.0F); + if (objectPosition != null) { + boolean isLooking = false; + + for (int it = 0; (float)it < height; ++it) { + if (objectPosition.blockX == t.xCoord && + objectPosition.blockY == t.yCoord + it && + objectPosition.blockZ == t.zCoord) { + isLooking = true; + } + } + + if (isLooking) { + Iterator var17 = tags.entrySet().iterator(); + + for (int i = 0; var17.hasNext(); ++i) { + Entry entry = (Entry)var17.next(); + if (entry.getKey() != null) { + CalclaviaRenderHelper.renderFloatingText( + (String)entry.getKey(), (float)x + 0.5F, + (float)y + (float)i * 0.25F - 2.0F + height, + (float)z + 0.5F, ((Integer)entry.getValue()).intValue()); + } + } + } + } + } + } + } + + public EntityPlayer getPlayer() { + EntityLivingBase entity = this.field_147501_a.field_147551_g; + return entity instanceof EntityPlayer ? (EntityPlayer)entity : null; + } +} diff --git a/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java b/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java new file mode 100644 index 0000000..4f84caa --- /dev/null +++ b/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java @@ -0,0 +1,315 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api; + +import dan200.computercraft.api.filesystem.IMount; +import dan200.computercraft.api.filesystem.IWritableMount; +import dan200.computercraft.api.media.IMediaProvider; +import dan200.computercraft.api.peripheral.IPeripheralProvider; +import dan200.computercraft.api.permissions.ITurtlePermissionProvider; +import dan200.computercraft.api.redstone.IBundledRedstoneProvider; +import dan200.computercraft.api.turtle.ITurtleUpgrade; +import net.minecraft.world.World; + +import java.lang.reflect.Method; + +/** + * The static entry point to the ComputerCraft API. + * Members in this class must be called after mod_ComputerCraft has been initialised, + * but may be called before it is fully loaded. + */ +public final class ComputerCraftAPI +{ + public static boolean isInstalled() + { + findCC(); + return computerCraft != null; + } + + public static String getInstalledVersion() + { + findCC(); + if( computerCraft_getVersion != null ) + { + try { + return (String)computerCraft_getVersion.invoke( null ); + } catch (Exception e) { + // It failed + } + } + return ""; + } + + public static String getAPIVersion() + { + return "1.75"; + } + + /** + * Creates a numbered directory in a subfolder of the save directory for a given world, and returns that number.
+ * Use in conjuction with createSaveDirMount() to create a unique place for your peripherals or media items to store files.
+ * @param world The world for which the save dir should be created. This should be the serverside world object. + * @param parentSubPath The folder path within the save directory where the new directory should be created. eg: "computercraft/disk" + * @return The numerical value of the name of the new folder, or -1 if the folder could not be created for some reason.
+ * eg: if createUniqueNumberedSaveDir( world, "computer/disk" ) was called returns 42, then "computer/disk/42" is now available for writing. + * @see #createSaveDirMount(World, String, long) + */ + public static int createUniqueNumberedSaveDir( World world, String parentSubPath ) + { + findCC(); + if( computerCraft_createUniqueNumberedSaveDir != null ) + { + try { + return (Integer)computerCraft_createUniqueNumberedSaveDir.invoke( null, world, parentSubPath ); + } catch (Exception e) { + // It failed + } + } + return -1; + } + + /** + * Creates a file system mount that maps to a subfolder of the save directory for a given world, and returns it.
+ * Use in conjuction with IComputerAccess.mount() or IComputerAccess.mountWritable() to mount a folder from the + * users save directory onto a computers file system.
+ * @param world The world for which the save dir can be found. This should be the serverside world object. + * @param subPath The folder path within the save directory that the mount should map to. eg: "computer/disk/42".
+ * Use createUniqueNumberedSaveDir() to create a new numbered folder to use. + * @param capacity The ammount of data that can be stored in the directory before it fills up, in bytes. + * @return The mount, or null if it could be created for some reason. Use IComputerAccess.mount() or IComputerAccess.mountWritable() + * to mount this on a Computers' file system. + * @see #createUniqueNumberedSaveDir(World, String) + * @see dan200.computercraft.api.peripheral.IComputerAccess#mount(String, dan200.computercraft.api.filesystem.IMount) + * @see dan200.computercraft.api.peripheral.IComputerAccess#mountWritable(String, dan200.computercraft.api.filesystem.IWritableMount) + * @see dan200.computercraft.api.filesystem.IMount + * @see IWritableMount + */ + public static IWritableMount createSaveDirMount( World world, String subPath, long capacity ) + { + findCC(); + if( computerCraft_createSaveDirMount != null ) + { + try { + return (IWritableMount)computerCraft_createSaveDirMount.invoke( null, world, subPath, capacity ); + } catch (Exception e){ + // It failed + } + } + return null; + } + + /** + * Creates a file system mount to a resource folder, and returns it.
+ * Use in conjuction with IComputerAccess.mount() or IComputerAccess.mountWritable() to mount a resource folder onto a computers file system.
+ * The files in this mount will be a combination of files in the specified mod jar, and resource packs that contain resources with the same domain and path.
+ * @param modClass A class in whose jar to look first for the resources to mount. Using your main mod class is recommended. eg: MyMod.class + * @param domain The domain under which to look for resources. eg: "mymod" + * @param subPath The domain under which to look for resources. eg: "mymod/lua/myfiles" + * @return The mount, or null if it could be created for some reason. Use IComputerAccess.mount() or IComputerAccess.mountWritable() + * to mount this on a Computers' file system. + * @see dan200.computercraft.api.peripheral.IComputerAccess#mount(String, dan200.computercraft.api.filesystem.IMount) + * @see dan200.computercraft.api.peripheral.IComputerAccess#mountWritable(String, IWritableMount) + * @see dan200.computercraft.api.filesystem.IMount + */ + public static IMount createResourceMount( Class modClass, String domain, String subPath ) + { + findCC(); + if( computerCraft_createResourceMount != null ) + { + try { + return (IMount)computerCraft_createResourceMount.invoke( null, modClass, domain, subPath ); + } catch (Exception e){ + // It failed + } + } + return null; + } + + /** + * Registers a peripheral handler to convert blocks into IPeripheral implementations. + * @see dan200.computercraft.api.peripheral.IPeripheral + * @see dan200.computercraft.api.peripheral.IPeripheralProvider + */ + public static void registerPeripheralProvider( IPeripheralProvider handler ) + { + findCC(); + if ( computerCraft_registerPeripheralProvider != null) + { + try { + computerCraft_registerPeripheralProvider.invoke( null, handler ); + } catch (Exception e){ + // It failed + } + } + } + + /** + * Registers a new turtle turtle for use in ComputerCraft. After calling this, + * users should be able to craft Turtles with your new turtle. It is recommended to call + * this during the load() method of your mod. + * @see dan200.computercraft.api.turtle.ITurtleUpgrade + */ + public static void registerTurtleUpgrade( ITurtleUpgrade upgrade ) + { + if( upgrade != null ) + { + findCC(); + if( computerCraft_registerTurtleUpgrade != null ) + { + try { + computerCraft_registerTurtleUpgrade.invoke( null, upgrade ); + } catch( Exception e ) { + // It failed + } + } + } + } + + /** + * Registers a bundled redstone handler to provide bundled redstone output for blocks + * @see dan200.computercraft.api.redstone.IBundledRedstoneProvider + */ + public static void registerBundledRedstoneProvider( IBundledRedstoneProvider handler ) + { + findCC(); + if( computerCraft_registerBundledRedstoneProvider != null ) + { + try { + computerCraft_registerBundledRedstoneProvider.invoke( null, handler ); + } catch (Exception e) { + // It failed + } + } + } + + /** + * If there is a Computer or Turtle at a certain position in the world, get it's bundled redstone output. + * @see dan200.computercraft.api.redstone.IBundledRedstoneProvider + * @return If there is a block capable of emitting bundled redstone at the location, it's signal (0-65535) will be returned. + * If there is no block capable of emitting bundled redstone at the location, -1 will be returned. + */ + public static int getBundledRedstoneOutput( World world, int x, int y, int z, int side ) + { + findCC(); + if( computerCraft_getDefaultBundledRedstoneOutput != null ) + { + try { + return (Integer)computerCraft_getDefaultBundledRedstoneOutput.invoke( null, world, x, y, z, side ); + } catch (Exception e){ + // It failed + } + } + return -1; + } + + /** + * Registers a media handler to provide IMedia implementations for Items + * @see dan200.computercraft.api.media.IMediaProvider + */ + public static void registerMediaProvider( IMediaProvider handler ) + { + findCC(); + if( computerCraft_registerMediaProvider != null ) + { + try { + computerCraft_registerMediaProvider.invoke( null, handler ); + } catch (Exception e){ + // It failed + } + } + } + + /** + * Registers a permission handler to restrict where turtles can move or build + * @see dan200.computercraft.api.permissions.ITurtlePermissionProvider + */ + public static void registerPermissionProvider( ITurtlePermissionProvider handler ) + { + findCC(); + if( computerCraft_registerPermissionProvider != null ) + { + try { + computerCraft_registerPermissionProvider.invoke( null, handler ); + } catch (Exception e) { + // It failed + } + } + } + + // The functions below here are private, and are used to interface with the non-API ComputerCraft classes. + // Reflection is used here so you can develop your mod without decompiling ComputerCraft and including + // it in your solution, and so your mod won't crash if ComputerCraft is installed. + + private static void findCC() + { + if( !ccSearched ) { + try { + computerCraft = Class.forName( "dan200.computercraft.ComputerCraft" ); + computerCraft_getVersion = findCCMethod( "getVersion", new Class[]{ + } ); + computerCraft_createUniqueNumberedSaveDir = findCCMethod( "createUniqueNumberedSaveDir", new Class[]{ + World.class, String.class + } ); + computerCraft_createSaveDirMount = findCCMethod( "createSaveDirMount", new Class[] { + World.class, String.class, Long.TYPE + } ); + computerCraft_createResourceMount = findCCMethod( "createResourceMount", new Class[] { + Class.class, String.class, String.class + } ); + computerCraft_registerPeripheralProvider = findCCMethod( "registerPeripheralProvider", new Class[] { + IPeripheralProvider.class + } ); + computerCraft_registerTurtleUpgrade = findCCMethod( "registerTurtleUpgrade", new Class[] { + ITurtleUpgrade.class + } ); + computerCraft_registerBundledRedstoneProvider = findCCMethod( "registerBundledRedstoneProvider", new Class[] { + IBundledRedstoneProvider.class + } ); + computerCraft_getDefaultBundledRedstoneOutput = findCCMethod( "getDefaultBundledRedstoneOutput", new Class[] { + World.class, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE + } ); + computerCraft_registerMediaProvider = findCCMethod( "registerMediaProvider", new Class[] { + IMediaProvider.class + } ); + computerCraft_registerPermissionProvider = findCCMethod( "registerPermissionProvider", new Class[] { + ITurtlePermissionProvider.class + } ); + } catch( Exception e ) { + System.out.println( "ComputerCraftAPI: ComputerCraft not found." ); + } finally { + ccSearched = true; + } + } + } + + private static Method findCCMethod( String name, Class[] args ) + { + try { + if( computerCraft != null ) + { + return computerCraft.getMethod( name, args ); + } + return null; + } catch( NoSuchMethodException e ) { + System.out.println( "ComputerCraftAPI: ComputerCraft method " + name + " not found." ); + return null; + } + } + + private static boolean ccSearched = false; + private static Class computerCraft = null; + private static Method computerCraft_getVersion = null; + private static Method computerCraft_createUniqueNumberedSaveDir = null; + private static Method computerCraft_createSaveDirMount = null; + private static Method computerCraft_createResourceMount = null; + private static Method computerCraft_registerPeripheralProvider = null; + private static Method computerCraft_registerTurtleUpgrade = null; + private static Method computerCraft_registerBundledRedstoneProvider = null; + private static Method computerCraft_getDefaultBundledRedstoneOutput = null; + private static Method computerCraft_registerMediaProvider = null; + private static Method computerCraft_registerPermissionProvider = null; +} diff --git a/src/main/java/dan200/computercraft/api/filesystem/IMount.java b/src/main/java/dan200/computercraft/api/filesystem/IMount.java new file mode 100644 index 0000000..cf884d9 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/filesystem/IMount.java @@ -0,0 +1,57 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.filesystem; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +/** + * Represents a read only part of a virtual filesystem that can be mounted onto a computercraft using IComputerAccess.mount(). + * Ready made implementations of this interface can be created using ComputerCraftAPI.createSaveDirMount() or ComputerCraftAPI.createResourceMount(), or you're free to implement it yourselves! + * @see dan200.computercraft.api.ComputerCraftAPI#createSaveDirMount(World, String) + * @see dan200.computercraft.api.ComputerCraftAPI#createResourceMount(Class, String, String) + * @see dan200.computercraft.api.peripheral.IComputerAccess#mount(String, IMount) + * @see IWritableMount + */ +public interface IMount +{ + /** + * Returns whether a file with a given path exists or not. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprogram" + * @return true if the file exists, false otherwise + */ + public boolean exists( String path ) throws IOException; + + /** + * Returns whether a file with a given path is a directory or not. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprograms" + * @return true if the file exists and is a directory, false otherwise + */ + public boolean isDirectory( String path ) throws IOException; + + /** + * Returns the file names of all the files in a directory. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprograms" + * @param contents A list of strings. Add all the file names to this list + */ + public void list( String path, List contents ) throws IOException; + + /** + * Returns the size of a file with a given path, in bytes + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprogram" + * @return the size of the file, in bytes + */ + public long getSize( String path ) throws IOException; + + /** + * Opens a file with a given path, and returns an inputstream representing it's contents. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprogram" + * @return a stream representing the contents of the file + */ + public InputStream openForRead( String path ) throws IOException; +} diff --git a/src/main/java/dan200/computercraft/api/filesystem/IWritableMount.java b/src/main/java/dan200/computercraft/api/filesystem/IWritableMount.java new file mode 100644 index 0000000..ffe3290 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/filesystem/IWritableMount.java @@ -0,0 +1,52 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.filesystem; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * Represents a part of a virtual filesystem that can be mounted onto a computercraft using IComputerAccess.mount() or IComputerAccess.mountWritable(), that can also be written to. + * Ready made implementations of this interface can be created using ComputerCraftAPI.createSaveDirMount(), or you're free to implement it yourselves! + * @see dan200.computercraft.api.ComputerCraftAPI#createSaveDirMount(World, String) + * @see dan200.computercraft.api.peripheral.IComputerAccess#mountWritable(String, dan200.computercraft.api.filesystem.IMount) + * @see dan200.computercraft.api.filesystem.IMount + */ +public interface IWritableMount extends IMount +{ + /** + * Creates a directory at a given path inside the virtual file system. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/mynewprograms" + */ + public void makeDirectory( String path ) throws IOException; + + /** + * Deletes a directory at a given path inside the virtual file system. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myoldprograms" + */ + public void delete( String path ) throws IOException; + + /** + * Opens a file with a given path, and returns an outputstream for writing to it. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprogram" + * @return a stream for writing to + */ + public OutputStream openForWrite( String path ) throws IOException; + + /** + * Opens a file with a given path, and returns an outputstream for appending to it. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprogram" + * @return a stream for writing to + */ + public OutputStream openForAppend( String path ) throws IOException; + + /** + * Get the ammount of free space on the mount, in bytes. You should decrease this value as the user writes to the mount, and write operations should fail once it reaches zero. + * @return The ammount of free space, in bytes. + */ + public long getRemainingSpace() throws IOException; +} diff --git a/src/main/java/dan200/computercraft/api/filesystem/package-info.java b/src/main/java/dan200/computercraft/api/filesystem/package-info.java new file mode 100644 index 0000000..d7a2d59 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/filesystem/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API|FileSystem", apiVersion="1.75" ) +package dan200.computercraft.api.filesystem; + +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/src/main/java/dan200/computercraft/api/lua/ILuaContext.java b/src/main/java/dan200/computercraft/api/lua/ILuaContext.java new file mode 100644 index 0000000..1ffbeea --- /dev/null +++ b/src/main/java/dan200/computercraft/api/lua/ILuaContext.java @@ -0,0 +1,58 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.lua; + +/** + * An interface passed to peripherals and ILuaObjects' by computers or turtles, providing methods + * that allow the peripheral call to wait for events before returning, just like in lua. + * This is very useful if you need to signal work to be performed on the main thread, and don't want to return + * until the work has been completed. + */ +public interface ILuaContext +{ + /** + * Wait for an event to occur on the computercraft, suspending the thread until it arises. This method is exactly equivalent to os.pullEvent() in lua. + * @param filter A specific event to wait for, or null to wait for any event + * @return An object array containing the name of the event that occurred, and any event parameters + * @throws Exception If the user presses CTRL+T to terminate the current program while pullEvent() is waiting for an event, a "Terminated" exception will be thrown here. + * Do not attempt to common this exception, unless you wish to prevent termination, which is not recommended. + * @throws InterruptedException If the user shuts down or reboots the computercraft while pullEvent() is waiting for an event, InterruptedException will be thrown. This exception must not be caught or intercepted, or the computercraft will leak memory and end up in a broken state. + */ + public Object[] pullEvent( String filter ) throws LuaException, InterruptedException; + + /** + * The same as pullEvent(), except "terminated" events are ignored. Only use this if you want to prevent program termination, which is not recommended. This method is exactly equivalent to os.pullEventRaw() in lua. + * @param filter A specific event to wait for, or null to wait for any event + * @return An object array containing the name of the event that occurred, and any event parameters + * @throws InterruptedException If the user shuts down or reboots the computercraft while pullEventRaw() is waiting for an event, InterruptedException will be thrown. This exception must not be caught or intercepted, or the computercraft will leak memory and end up in a broken state. + * @see #pullEvent(String) + */ + public Object[] pullEventRaw( String filter ) throws InterruptedException; + + /** + * Yield the current coroutine with some arguments until it is resumed. This method is exactly equivalent to coroutine.yield() in lua. Use pullEvent() if you wish to wait for events. + * @param arguments An object array containing the arguments to pass to coroutine.yield() + * @return An object array containing the return values from coroutine.yield() + * @throws InterruptedException If the user shuts down or reboots the computercraft the coroutine is suspended, InterruptedException will be thrown. This exception must not be caught or intercepted, or the computercraft will leak memory and end up in a broken state. + * @see #pullEvent(String) + */ + public Object[] yield( Object[] arguments ) throws InterruptedException; + + /** + * TODO: Document me + * @param task + * @return + */ + public Object[] executeMainThreadTask( ILuaTask task ) throws LuaException, InterruptedException; + + /** + * TODO: Document me + * @param task + * @return + */ + public long issueMainThreadTask( ILuaTask task ) throws LuaException; +} diff --git a/src/main/java/dan200/computercraft/api/lua/ILuaObject.java b/src/main/java/dan200/computercraft/api/lua/ILuaObject.java new file mode 100644 index 0000000..abd8b40 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/lua/ILuaObject.java @@ -0,0 +1,26 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.lua; + +/** + * An interface for representing custom objects returned by IPeripheral.callMethod() calls. + * Return objects implementing this interface to expose objects with methods to lua. + */ +public interface ILuaObject +{ + /** + * Get the names of the methods that this object implements. This works the same as IPeripheral.getMethodNames(). See that method for detailed documentation. + * @see dan200.computercraft.api.peripheral.IPeripheral#getMethodNames() + */ + public String[] getMethodNames(); + + /** + * Called when a user calls one of the methods that this object implements. This works the same as IPeripheral.callMethod(). See that method for detailed documentation. + * @see dan200.computercraft.api.peripheral.IPeripheral#callMethod(dan200.computercraft.api.peripheral.IComputerAccess, ILuaContext, int, Object[]) + */ + public Object[] callMethod( ILuaContext context, int method, Object[] arguments ) throws LuaException, InterruptedException; +} diff --git a/src/main/java/dan200/computercraft/api/lua/ILuaTask.java b/src/main/java/dan200/computercraft/api/lua/ILuaTask.java new file mode 100644 index 0000000..45feead --- /dev/null +++ b/src/main/java/dan200/computercraft/api/lua/ILuaTask.java @@ -0,0 +1,12 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.lua; + +public interface ILuaTask +{ + public Object[] execute() throws LuaException; +} diff --git a/src/main/java/dan200/computercraft/api/lua/LuaException.java b/src/main/java/dan200/computercraft/api/lua/LuaException.java new file mode 100644 index 0000000..6683c4b --- /dev/null +++ b/src/main/java/dan200/computercraft/api/lua/LuaException.java @@ -0,0 +1,36 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.lua; + +/** + * An exception representing an error in Lua, like that raised by the error() function + */ +public class LuaException extends Exception +{ + private final int m_level; + + public LuaException() + { + this( "error", 1 ); + } + + public LuaException( String message ) + { + this( message, 1 ); + } + + public LuaException( String message, int level ) + { + super( message ); + m_level = level; + } + + public int getLevel() + { + return m_level; + } +} diff --git a/src/main/java/dan200/computercraft/api/lua/package-info.java b/src/main/java/dan200/computercraft/api/lua/package-info.java new file mode 100644 index 0000000..3ea3d91 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/lua/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API|Lua", apiVersion="1.75" ) +package dan200.computercraft.api.lua; + +import cpw.mods.fml.common.API; diff --git a/src/main/java/dan200/computercraft/api/media/IMedia.java b/src/main/java/dan200/computercraft/api/media/IMedia.java new file mode 100644 index 0000000..57ebc08 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/media/IMedia.java @@ -0,0 +1,59 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.media; + +import dan200.computercraft.api.filesystem.IMount; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +/** + * Represents an item that can be placed in a disk drive and used by a Computer. + * Implement this interface on your Item class to allow it to be used in the drive. + */ +public interface IMedia +{ + /** + * Get a string representing the label of this item. Will be called vi disk.getLabel() in lua. + * @param stack The itemstack to inspect + * @return The label. ie: "Dan's Programs" + */ + public String getLabel( ItemStack stack ); + + /** + * Set a string representing the label of this item. Will be called vi disk.setLabel() in lua. + * @param stack The itemstack to modify. + * @param label The string to set the label to. + * @return true if the label was updated, false if the label may not be modified. + */ + public boolean setLabel( ItemStack stack, String label ); + + /** + * If this disk represents an item with audio (like a record), get the readable name of the audio track. ie: "Jonathon Coulton - Still Alive" + * @param stack The itemstack to inspect. + * @return The name, or null if this item does not represent an item with audio. + */ + public String getAudioTitle( ItemStack stack ); + + /** + * If this disk represents an item with audio (like a record), get the resource name of the audio track to play. + * @param stack The itemstack to inspect. + * @return The name, or null if this item does not represent an item with audio. + */ + public String getAudioRecordName( ItemStack stack ); + + /** + * If this disk represents an item with data (like a floppy disk), get a mount representing it's contents. This will be mounted onto the filesystem of the computercraft while the media is in the disk drive. + * @param stack The itemstack to inspect. + * @param world The world in which the item and disk drive reside. + * @return The mount, or null if this item does not represent an item with data. If the IMount returned also implements IWritableMount, it will mounted using mountWritable() + * @see dan200.computercraft.api.filesystem.IMount + * @see dan200.computercraft.api.filesystem.IWritableMount + * @see dan200.computercraft.api.ComputerCraftAPI#createSaveDirMount(World, String, long) + * @see dan200.computercraft.api.ComputerCraftAPI#createResourceMount(Class, String, String) + */ + public IMount createDataMount( ItemStack stack, World world ); +} diff --git a/src/main/java/dan200/computercraft/api/media/IMediaProvider.java b/src/main/java/dan200/computercraft/api/media/IMediaProvider.java new file mode 100644 index 0000000..c0aabd5 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/media/IMediaProvider.java @@ -0,0 +1,23 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.media; + +import net.minecraft.item.ItemStack; + +/** + * This interface is used to provide IMedia implementations for ItemStack + * @see dan200.computercraft.api.ComputerCraftAPI#registerMediaProvider(IMediaProvider) + */ +public interface IMediaProvider +{ + /** + * Produce an IMedia implementation from an ItemStack. + * @see dan200.computercraft.api.ComputerCraftAPI#registerMediaProvider(IMediaProvider) + * @return an IMedia implementation, or null if the item is not something you wish to handle + */ + public IMedia getMedia( ItemStack stack ); +} diff --git a/src/main/java/dan200/computercraft/api/media/package-info.java b/src/main/java/dan200/computercraft/api/media/package-info.java new file mode 100644 index 0000000..9e2f507 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/media/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API|Media", apiVersion="1.75" ) +package dan200.computercraft.api.media; + +import cpw.mods.fml.common.API; diff --git a/src/main/java/dan200/computercraft/api/package-info.java b/src/main/java/dan200/computercraft/api/package-info.java new file mode 100644 index 0000000..f3a706a --- /dev/null +++ b/src/main/java/dan200/computercraft/api/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API", apiVersion="1.75" ) +package dan200.computercraft.api; + +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java b/src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java new file mode 100644 index 0000000..2458c06 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java @@ -0,0 +1,102 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.peripheral; + +import dan200.computercraft.api.filesystem.IMount; +import dan200.computercraft.api.filesystem.IWritableMount; + +/** + * The interface passed to peripherals by computers or turtles, providing methods + * that they can call. This should not be implemented by your classes. Do not interact + * with computers except via this interface. + */ +public interface IComputerAccess +{ + /** + * Mount a mount onto the computers' file system in a read only mode.
+ * @param desiredLocation The location on the computercraft's file system where you would like the mount to be mounted. + * @param mount The mount object to mount on the computercraft. These can be obtained by calling ComputerCraftAPI.createSaveDirMount(), ComputerCraftAPI.createResourceMount() or by creating your own objects that implement the IMount interface. + * @return The location on the computercraft's file system where you the mount mounted, or null if there was already a file in the desired location. Store this value if you wish to unmount the mount later. + * @see dan200.computercraft.api.ComputerCraftAPI#createSaveDirMount(World, String) + * @see dan200.computercraft.api.ComputerCraftAPI#createResourceMount(Class, String, String) + * @see #mountWritable(String, dan200.computercraft.api.filesystem.IWritableMount) + * @see #unmount(String) + * @see dan200.computercraft.api.filesystem.IMount + */ + public String mount( String desiredLocation, IMount mount ); + + /** + * TODO: Document me + */ + public String mount( String desiredLocation, IMount mount, String driveName ); + + /** + * Mount a mount onto the computers' file system in a writable mode.
+ * @param desiredLocation The location on the computercraft's file system where you would like the mount to be mounted. + * @param mount The mount object to mount on the computercraft. These can be obtained by calling ComputerCraftAPI.createSaveDirMount() or by creating your own objects that implement the IWritableMount interface. + * @return The location on the computercraft's file system where you the mount mounted, or null if there was already a file in the desired location. Store this value if you wish to unmount the mount later. + * @see dan200.computercraft.api.ComputerCraftAPI#createSaveDirMount(World, String) + * @see dan200.computercraft.api.ComputerCraftAPI#createResourceMount(Class, String, String) + * @see #mount(String, IMount) + * @see #unmount(String) + * @see IMount + */ + public String mountWritable( String desiredLocation, IWritableMount mount ); + + /** + * TODO: Document me + */ + public String mountWritable( String desiredLocation, IWritableMount mount, String driveName ); + + /** + * Unmounts a directory previously mounted onto the computers file system by mount() or mountWritable().
+ * When a directory is unmounted, it will disappear from the computers file system, and the user will no longer be able to + * access it. All directories mounted by a mount or mountWritable are automatically unmounted when the peripheral + * is attached if they have not been explicitly unmounted. + * @param location The desired location in the computers file system of the directory to unmount. + * This must be the location of a directory previously mounted by mount() or mountWritable(), as + * indicated by their return value. + * @see #mount(String, IMount) + * @see #mountWritable(String, IWritableMount) + */ + public void unmount( String location ); + + /** + * Returns the numerical ID of this computercraft.
+ * This is the same number obtained by calling os.getComputerID() or running the "id" program from lua, + * and is guarunteed unique. This number will be positive. + * @return The identifier. + */ + public int getID(); + + /** + * Causes an event to be raised on this computercraft, which the computercraft can respond to by calling + * os.pullEvent(). This can be used to notify the computercraft when things happen in the world or to + * this peripheral. + * @param event A string identifying the type of event that has occurred, this will be + * returned as the first value from os.pullEvent(). It is recommended that you + * you choose a name that is unique, and recognisable as originating from your + * peripheral. eg: If your peripheral type is "button", a suitable event would be + * "button_pressed". + * @param arguments In addition to a name, you may pass an array of extra arguments to the event, that will + * be supplied as extra return values to os.pullEvent(). Objects in the array will be converted + * to lua data types in the same fashion as the return values of IPeripheral.callMethod().
+ * You may supply null to indicate that no arguments are to be supplied. + * @see dan200.computercraft.api.peripheral.IPeripheral#callMethod + */ + public void queueEvent( String event, Object[] arguments ); + + /** + * Get a string, unique to the computercraft, by which the computercraft refers to this peripheral. + * For directly attached peripherals this will be "left","right","front","back",etc, but + * for peripherals attached remotely it will be different. It is good practice to supply + * this string when raising events to the computercraft, so that the computercraft knows from + * which peripheral the event came. + * @return A string unique to the computercraft, but not globally. + */ + public String getAttachmentName(); +} diff --git a/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java b/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java new file mode 100644 index 0000000..a28d656 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java @@ -0,0 +1,100 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.peripheral; + +import dan200.computercraft.api.lua.ILuaContext; +import dan200.computercraft.api.lua.LuaException; + +/** + * The interface that defines a peripheral. This should be implemented by the + * TileEntity of any common that you wish to be interacted with by + * computercraft or turtle. + */ +public interface IPeripheral +{ + /** + * Should return a string that uniquely identifies this type of peripheral. + * This can be queried from lua by calling peripheral.getType() + * @return A string identifying the type of peripheral. + */ + public String getType(); + + /** + * Should return an array of strings that identify the methods that this + * peripheral exposes to Lua. This will be called once before each attachment, + * and should not change when called multiple times. + * @return An array of strings representing method names. + * @see #callMethod + */ + public String[] getMethodNames(); + + /** + * This is called when a lua program on an attached computercraft calls peripheral.call() with + * one of the methods exposed by getMethodNames().
+ *
+ * Be aware that this will be called from the ComputerCraft Lua thread, and must be thread-safe + * when interacting with minecraft objects. + * @param computer The interface to the computercraft that is making the call. Remember that multiple + * computers can be attached to a peripheral at once. + * @param context The context of the currently running lua thread. This can be used to wait for events + * or otherwise yield. + * @param method An integer identifying which of the methods from getMethodNames() the computercraft + * wishes to call. The integer indicates the index into the getMethodNames() table + * that corresponds to the string passed into peripheral.call() + * @param arguments An array of objects, representing the arguments passed into peripheral.call().
+ * Lua values of type "string" will be represented by Object type String.
+ * Lua values of type "number" will be represented by Object type Double.
+ * Lua values of type "boolean" will be represented by Object type Boolean.
+ * Lua values of any other type will be represented by a null object.
+ * This array will be empty if no arguments are passed. + * @return An array of objects, representing values you wish to return to the lua program.
+ * Integers, Doubles, Floats, Strings, Booleans and null be converted to their corresponding lua type.
+ * All other types will be converted to nil.
+ * You may return null to indicate no values should be returned. + * @throws Exception If you throw any exception from this function, a lua error will be raised with the + * same message as your exception. Use this to throw appropriate errors if the wrong + * arguments are supplied to your method. + * @see #getMethodNames + */ + public Object[] callMethod( IComputerAccess computer, ILuaContext context, int method, Object[] arguments ) throws LuaException, InterruptedException; + + /** + * Is called when canAttachToSide has returned true, and a computercraft is attaching to the peripheral. + * This will occur when a peripheral is placed next to an active computercraft, when a computercraft is turned on next to a peripheral, + * or when a turtle travels into a square next to a peripheral. + * Between calls to attach() and detach(), the attached computercraft can make method calls on the peripheral using peripheral.call(). + * This method can be used to keep track of which computers are attached to the peripheral, or to take action when attachment + * occurs.
+ *
+ * Be aware that this will be called from the ComputerCraft Lua thread, and must be thread-safe + * when interacting with minecraft objects. + * @param computer The interface to the computercraft that is being attached. Remember that multiple + * computers can be attached to a peripheral at once. + * @see #detach + */ + public void attach( IComputerAccess computer ); + + /** + * Is called when a computercraft is detaching from the peripheral. + * This will occur when a computercraft shuts down, when the peripheral is removed while attached to computers, + * or when a turtle moves away from a square attached to a peripheral. + * This method can be used to keep track of which computers are attached to the peripheral, or to take action when detachment + * occurs.
+ *
+ * Be aware that this will be called from the ComputerCraft Lua thread, and must be thread-safe + * when interacting with minecraft objects. + * @param computer The interface to the computercraft that is being detached. Remember that multiple + * computers can be attached to a peripheral at once. + * @see #detach + */ + public void detach( IComputerAccess computer ); + + /** + * TODO: Document me + */ + public boolean equals( IPeripheral other ); +} diff --git a/src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java b/src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java new file mode 100644 index 0000000..a2775f9 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java @@ -0,0 +1,23 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.peripheral; + +import net.minecraft.world.World; + +/** + * This interface is used to create peripheral implementations for blocks + * @see dan200.computercraft.api.ComputerCraftAPI#registerPeripheralProvider(IPeripheralProvider) + */ +public interface IPeripheralProvider +{ + /** + * Produce an peripheral implementation from a block location. + * @see dan200.computercraft.api.ComputerCraftAPI#registerPeripheralProvider(IPeripheralProvider) + * @return a peripheral, or null if there is not a peripheral here you'd like to handle. + */ + public IPeripheral getPeripheral( World world, int x, int y, int z, int side ); +} diff --git a/src/main/java/dan200/computercraft/api/peripheral/package-info.java b/src/main/java/dan200/computercraft/api/peripheral/package-info.java new file mode 100644 index 0000000..10ea4da --- /dev/null +++ b/src/main/java/dan200/computercraft/api/peripheral/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API|Peripheral", apiVersion="1.75" ) +package dan200.computercraft.api.peripheral; + +import cpw.mods.fml.common.API; diff --git a/src/main/java/dan200/computercraft/api/permissions/ITurtlePermissionProvider.java b/src/main/java/dan200/computercraft/api/permissions/ITurtlePermissionProvider.java new file mode 100644 index 0000000..476b4fc --- /dev/null +++ b/src/main/java/dan200/computercraft/api/permissions/ITurtlePermissionProvider.java @@ -0,0 +1,19 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.permissions; + +import net.minecraft.world.World; + +/** + * This interface is used to restrict where turtles can move or build + * @see dan200.computercraft.api.ComputerCraftAPI#registerPermissionProvider(ITurtlePermissionProvider) + */ +public interface ITurtlePermissionProvider +{ + public boolean isBlockEnterable( World world, int x, int y, int z ); + public boolean isBlockEditable( World world, int x, int y, int z ); +} diff --git a/src/main/java/dan200/computercraft/api/permissions/package-info.java b/src/main/java/dan200/computercraft/api/permissions/package-info.java new file mode 100644 index 0000000..a51e7ec --- /dev/null +++ b/src/main/java/dan200/computercraft/api/permissions/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API|Permissions", apiVersion="1.75" ) +package dan200.computercraft.api.permissions; + +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/src/main/java/dan200/computercraft/api/redstone/IBundledRedstoneProvider.java b/src/main/java/dan200/computercraft/api/redstone/IBundledRedstoneProvider.java new file mode 100644 index 0000000..b85f2ef --- /dev/null +++ b/src/main/java/dan200/computercraft/api/redstone/IBundledRedstoneProvider.java @@ -0,0 +1,23 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.redstone; + +import net.minecraft.world.World; + +/** + * This interface is used to provide bundled redstone output for blocks + * @see dan200.computercraft.api.ComputerCraftAPI#registerBundledRedstoneProvider(IBundledRedstoneProvider) + */ +public interface IBundledRedstoneProvider +{ + /** + * Produce an bundled redstone output from a block location. + * @see dan200.computercraft.api.ComputerCraftAPI#registerBundledRedstoneProvider(IBundledRedstoneProvider) + * @return a number in the range 0-65535 to indicate this block is providing output, or -1 if you do not wish to handle this block + */ + public int getBundledRedstoneOutput( World world, int x, int y, int z, int side ); +} diff --git a/src/main/java/dan200/computercraft/api/redstone/package-info.java b/src/main/java/dan200/computercraft/api/redstone/package-info.java new file mode 100644 index 0000000..e01c623 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/redstone/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API|Redstone", apiVersion="1.75" ) +package dan200.computercraft.api.redstone; + +import cpw.mods.fml.common.API; diff --git a/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java b/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java new file mode 100644 index 0000000..96c6159 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java @@ -0,0 +1,168 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +import dan200.computercraft.api.lua.ILuaContext; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.peripheral.IPeripheral; +import net.minecraft.inventory.IInventory; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +/** + * The interface passed to turtle by turtles, providing methods that they can call. + * This should not be implemented by your classes. Do not interact with turtles except via this interface and ITurtleUpgrade. + */ +public interface ITurtleAccess +{ + /** + * Returns the world in which the turtle resides. + * @return the world in which the turtle resides. + */ + public World getWorld(); + + /** + * Returns a vector containing the integer co-ordinates at which the turtle resides. + * @return a vector containing the integer co-ordinates at which the turtle resides. + */ + public ChunkCoordinates getPosition(); + + /** + * TODO: Document me + */ + public boolean teleportTo( World world, int x, int y, int z ); + + /** + * Returns a vector containing the floating point co-ordinates at which the turtle is rendered. + * This will shift when the turtle is moving. + * @param f The subframe fraction + * @return a vector containing the floating point co-ordinates at which the turtle resides. + */ + public Vec3 getVisualPosition( float f ); + + /** + * TODO: Document me + */ + public float getVisualYaw( float f ); + + /** + * Returns the world direction the turtle is currently facing. + * @return the world direction the turtle is currently facing. + */ + public int getDirection(); + + /** + * TODO: Document me + */ + public void setDirection( int dir ); + + /** + * TODO: Document me + */ + public int getSelectedSlot(); + + /** + * TODO: Document me + */ + public void setSelectedSlot( int slot ); + + /** + * Sets the colour of the turtle, as if the player had dyed it with a dye item. + * @param dyeColour 0-15 to dye the turtle one of the 16 standard minecraft colours, or -1 to remove the dye from the turtle. + */ + public void setDyeColour( int dyeColour ); + + /** + * Gets the colour the turtle has been dyed. + * @return 0-15 if the turtle has been dyed one of the 16 standard minecraft colours, -1 if the turtle is clean. + */ + public int getDyeColour(); + + /** + * TODO: Document me + */ + public IInventory getInventory(); + + /** + * TODO: Document me + */ + public boolean isFuelNeeded(); + + /** + * TODO: Document me + */ + public int getFuelLevel(); + + /** + * TODO: Document me + */ + public void setFuelLevel( int fuel ); + + /** + * TODO: Document me + */ + public int getFuelLimit(); + + /** + * Removes some fuel from the turtles fuel supply. Negative numbers can be passed in to INCREASE the fuel level of the turtle. + * @return Whether the turtle was able to consume the ammount of fuel specified. Will return false if you supply a number + * greater than the current fuel level of the turtle. + */ + public boolean consumeFuel( int fuel ); + + /** + * TODO: Document me + */ + public void addFuel( int fuel ); + + /** + * Adds a custom command to the turtles command queue. Unlike peripheral methods, these custom commands will be executed + * on the main thread, so are guaranteed to be able to access Minecraft objects safely, and will be queued up + * with the turtles standard movement and tool commands. An issued command will return an unique integer, which will + * be supplied as a parameter to a "turtle_response" event issued to the turtle after the command has completed. Look at the + * lua source code for "rom/apis/turtle" for how to build a lua wrapper around this functionality. + * @param command an object which will execute the custom command when its point in the queue is reached + * @return the objects the command returned when executed. you should probably return these to the player + * unchanged if called from a peripheral method. + * @see ITurtleCommand + */ + public Object[] executeCommand( ILuaContext context, ITurtleCommand command ) throws LuaException, InterruptedException; + + /** + * TODO: Document me + */ + public void playAnimation( TurtleAnimation animation ); + + /** + * Returns the turtle on the specified side of the turtle, if there is one. + * @return the turtle on the specified side of the turtle, if there is one. + */ + public ITurtleUpgrade getUpgrade( TurtleSide side ); + + /** + * TODO: Document me + */ + public void setUpgrade( TurtleSide side, ITurtleUpgrade upgrade ); + + /** + * Returns the peripheral created by the upgrade on the specified side of the turtle, if there is one. + * @return the peripheral created by the upgrade on the specified side of the turtle, if there is one. + */ + public IPeripheral getPeripheral( TurtleSide side ); + + /** + * TODO: Document me + */ + public NBTTagCompound getUpgradeNBTData( TurtleSide side ); + + /** + * TODO: Document me + */ + public void updateUpgradeNBTData( TurtleSide side ); +} diff --git a/src/main/java/dan200/computercraft/api/turtle/ITurtleCommand.java b/src/main/java/dan200/computercraft/api/turtle/ITurtleCommand.java new file mode 100644 index 0000000..17d113e --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/ITurtleCommand.java @@ -0,0 +1,25 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +/** + * An interface for objects executing custom turtle commands, used with ITurtleAccess.issueCommand + * @see ITurtleAccess#executeCommand(dan200.computercraft.api.lua.ILuaContext,ITurtleCommand) + */ +public interface ITurtleCommand +{ + /** + * Will be called by the turtle on the main thread when it is time to execute the custom command. + * The handler should either perform the work of the command, and return success, or return + * failure with an error message to indicate the command cannot be executed at this time. + * @param turtle access to the turtle for whom the command was issued + * @return TurtleCommandResult.success() or TurtleCommandResult.failure( errorMessage ) + * @see ITurtleAccess#executeCommand(dan200.computercraft.api.lua.ILuaContext,ITurtleCommand) + * @see dan200.computercraft.api.turtle.TurtleCommandResult + */ + public TurtleCommandResult execute( ITurtleAccess turtle ); +} diff --git a/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java b/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java new file mode 100644 index 0000000..0dcc6e6 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java @@ -0,0 +1,94 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +import dan200.computercraft.api.peripheral.IPeripheral; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +/** + * The primary interface for defining an turtle for Turtles. A turtle turtle + * can either be a new tool, or a new peripheral. + * @see dan200.computercraft.api.ComputerCraftAPI#registerTurtleUpgrade( dan200.computercraft.api.turtle.ITurtleUpgrade ) + */ +public interface ITurtleUpgrade +{ + /** + * Gets a unique numerical identifier representing this type of turtle turtle. + * Like Minecraft common and item IDs, you should strive to make this number unique + * among all turtle turtle that have been released for ComputerCraft. + * The ID must be in the range 64 to 255, as the ID is stored as an 8-bit value, + * and 0-64 is reserved for future use by ComputerCraft. The turtle will + * fail registration if an already used ID is specified. + * @see dan200.computercraft.api.ComputerCraftAPI#registerTurtleUpgrade( dan200.computercraft.api.turtle.ITurtleUpgrade ) + */ + public int getUpgradeID(); + + /** + * Return a String to describe this type of turtle in turtle item names. + * Examples of built-in adjectives are "Wireless", "Mining" and "Crafty". + */ + public String getUnlocalisedAdjective(); + + /** + * Return whether this turtle adds a tool or a peripheral to the turtle. + * Currently, turtle crafting is restricted to one tool & one peripheral per turtle. + * @see TurtleUpgradeType for the differences between the two. + */ + public TurtleUpgradeType getType(); + + /** + * Return an item stack representing the type of item that a turtle must be crafted + * with to create a turtle which holds this turtle. + * Currently, turtle crafting is restricted to one tool & one peripheral per turtle. + */ + public ItemStack getCraftingItem(); + + /** + * Will only be called for Peripheral turtle. Creates a peripheral for a turtle + * being placed using this turtle. The peripheral created will be stored + * for the lifetime of the turtle, will have update() called once-per-tick, and will be + * attach'd detach'd and have methods called in the same manner as a Computer peripheral. + * + * @param turtle Access to the turtle that the peripheral is being created for. + * @param side Which side of the turtle (left or right) that the turtle resides on. + * @return The newly created peripheral. You may return null if this turtle is a Tool + * and this method is not expected to be called. + */ + public IPeripheral createPeripheral( ITurtleAccess turtle, TurtleSide side ); + + /** + * Will only be called for Tool turtle. Called when turtle.dig() or turtle.attack() is called + * by the turtle, and the tool is required to do some work. + * @param turtle Access to the turtle that the tool resides on. + * @param side Which side of the turtle (left or right) the tool resides on. + * @param verb Which action (dig or attack) the turtle is being called on to perform. + * @param direction Which world direction the action should be performed in, relative to the turtles + * position. This will either be up, down, or the direction the turtle is facing, depending on + * whether dig, digUp or digDown was called. + * @return Whether the turtle was able to perform the action, and hence whether the turtle.dig() + * or turtle.attack() lua method should return true. If true is returned, the tool will perform + * a swinging animation. You may return null if this turtle is a Peripheral + * and this method is not expected to be called. + */ + public TurtleCommandResult useTool( ITurtleAccess turtle, TurtleSide side, TurtleVerb verb, int direction ); + + /** + * Called to obtain the IIcon to be used when rendering a turtle peripheral. Needs to be a "common" + * type IIcon for now, as there is no way to determine which texture sheet an IIcon is from by the + * IIcon itself. + * @param turtle Access to the turtle that the peripheral resides on. + * @param side Which side of the turtle (left or right) the peripheral resides on. + * @return The IIcon that you wish to be used to render your turtle peripheral. + */ + public IIcon getIcon( ITurtleAccess turtle, TurtleSide side ); + + /** + * TODO: Document me + */ + public void update( ITurtleAccess turtle, TurtleSide side ); +} diff --git a/src/main/java/dan200/computercraft/api/turtle/TurtleAnimation.java b/src/main/java/dan200/computercraft/api/turtle/TurtleAnimation.java new file mode 100644 index 0000000..abb4134 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/TurtleAnimation.java @@ -0,0 +1,22 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +public enum TurtleAnimation +{ + None, + MoveForward, + MoveBack, + MoveUp, + MoveDown, + TurnLeft, + TurnRight, + SwingLeftTool, + SwingRightTool, + Wait, + ShortWait, +} diff --git a/src/main/java/dan200/computercraft/api/turtle/TurtleCommandResult.java b/src/main/java/dan200/computercraft/api/turtle/TurtleCommandResult.java new file mode 100644 index 0000000..67046bd --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/TurtleCommandResult.java @@ -0,0 +1,73 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +public final class TurtleCommandResult +{ + private static final TurtleCommandResult s_success = new TurtleCommandResult( true, null, null ); + private static final TurtleCommandResult s_emptyFailure = new TurtleCommandResult( false, null, null ); + + public static TurtleCommandResult success() + { + return success( null ); + } + + public static TurtleCommandResult success( Object[] results ) + { + if( results == null || results.length == 0 ) + { + return s_success; + } + else + { + return new TurtleCommandResult( true, null, results ); + } + } + + public static TurtleCommandResult failure() + { + return failure( null ); + } + + public static TurtleCommandResult failure( String errorMessage ) + { + if( errorMessage == null ) + { + return s_emptyFailure; + } + else + { + return new TurtleCommandResult( false, errorMessage, null ); + } + } + + private final boolean m_success; + private final String m_errorMessage; + private final Object[] m_results; + + private TurtleCommandResult( boolean success, String errorMessage, Object[] results ) + { + m_success = success; + m_errorMessage = errorMessage; + m_results = results; + } + + public boolean isSuccess() + { + return m_success; + } + + public String getErrorMessage() + { + return m_errorMessage; + } + + public Object[] getResults() + { + return m_results; + } +} diff --git a/src/main/java/dan200/computercraft/api/turtle/TurtleSide.java b/src/main/java/dan200/computercraft/api/turtle/TurtleSide.java new file mode 100644 index 0000000..5fc7c61 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/TurtleSide.java @@ -0,0 +1,23 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +/** + * An enum representing the two sides of the turtle that a turtle turtle might reside. + */ +public enum TurtleSide +{ + /** + * The turtles left side (where the pickaxe usually is on a Wireless Mining Turtle) + */ + Left, + + /** + * The turtles right side (where the modem usually is on a Wireless Mining Turtle) + */ + Right, +} diff --git a/src/main/java/dan200/computercraft/api/turtle/TurtleUpgradeType.java b/src/main/java/dan200/computercraft/api/turtle/TurtleUpgradeType.java new file mode 100644 index 0000000..e5fd1af --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/TurtleUpgradeType.java @@ -0,0 +1,27 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +/** + * An enum representing the two different types of turtle that an ITurtleUpgrade + * implementation can add to a turtle. + * @see ITurtleUpgrade + */ +public enum TurtleUpgradeType +{ + /** + * A tool is rendered as an item on the side of the turtle, and responds to the turtle.dig() + * and turtle.attack() methods (Such as pickaxe or sword on Mining and Melee turtles). + */ + Tool, + + /** + * A peripheral adds a special peripheral which is attached to the side of the turtle, + * and can be interacted with the peripheral API (Such as the modem on Wireless Turtles). + */ + Peripheral, +} diff --git a/src/main/java/dan200/computercraft/api/turtle/TurtleVerb.java b/src/main/java/dan200/computercraft/api/turtle/TurtleVerb.java new file mode 100644 index 0000000..566fa48 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/TurtleVerb.java @@ -0,0 +1,26 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +/** + * An enum representing the two different actions that an ITurtleUpgrade of type + * Tool may be called on to perform by a turtle. + * @see ITurtleUpgrade + * @see ITurtleUpgrade#useTool + */ +public enum TurtleVerb +{ + /** + * The turtle called turtle.dig(), turtle.digUp() or turtle.digDown() + */ + Dig, + + /** + * The turtle called turtle.attack(), turtle.attackUp() or turtle.attackDown() + */ + Attack, +} diff --git a/src/main/java/dan200/computercraft/api/turtle/package-info.java b/src/main/java/dan200/computercraft/api/turtle/package-info.java new file mode 100644 index 0000000..7825971 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API|Turtle", apiVersion="1.75" ) +package dan200.computercraft.api.turtle; + +import cpw.mods.fml.common.API; diff --git a/src/main/java/icbm/api/IAmmunition.java b/src/main/java/icbm/api/IAmmunition.java new file mode 100644 index 0000000..34b3071 --- /dev/null +++ b/src/main/java/icbm/api/IAmmunition.java @@ -0,0 +1,10 @@ +package icbm.api; + +import net.minecraft.item.ItemStack; + +public interface IAmmunition { + + boolean hasAmmunition(ItemStack var1); + + boolean useAmmunition(ItemStack var1); +} diff --git a/src/main/java/icbm/api/IBlockFrequency.java b/src/main/java/icbm/api/IBlockFrequency.java new file mode 100644 index 0000000..d831270 --- /dev/null +++ b/src/main/java/icbm/api/IBlockFrequency.java @@ -0,0 +1,9 @@ +package icbm.api; + + +public interface IBlockFrequency { + + int getFrequency(); + + void setFrequency(int var1); +} diff --git a/src/main/java/icbm/api/ICBM.java b/src/main/java/icbm/api/ICBM.java new file mode 100644 index 0000000..5e8e014 --- /dev/null +++ b/src/main/java/icbm/api/ICBM.java @@ -0,0 +1,41 @@ +package icbm.api; + +import icbm.api.explosion.IExplosive; +import java.lang.reflect.Method; +import net.minecraft.entity.Entity; +import net.minecraft.world.World; + +public class ICBM { + + public static final String NAME = "ICBM"; + public static final String VERSION = "1.1.1"; + public static final int BLOCK_ID_PREFIX = 3880; + public static final int ITEM_ID_PREFIX = 3900; + public static Class explosionManager; + + + public static void createExplosion(World worldObj, double x, double y, double z, Entity entity, int explosiveID) { + try { + Method e = explosionManager.getMethod("createExplosion", new Class[]{World.class, Double.class, Double.class, Double.class, Entity.class, Integer.class}); + e.invoke((Object)null, new Object[]{worldObj, Double.valueOf(x), Double.valueOf(y), Double.valueOf(z), entity, Integer.valueOf(explosiveID)}); + } catch (Exception var10) { + System.out.println("ICBM: Failed to create an ICBM explosion with the ID: " + explosiveID); + var10.printStackTrace(); + } + + } + + public static IExplosive getExplosive(String name) { + if(name != null) { + try { + Method e = explosionManager.getMethod("getExplosiveByName", new Class[]{String.class}); + return (IExplosive)e.invoke((Object)null, new Object[]{name}); + } catch (Exception var2) { + System.out.println("ICBM: Failed to get explosive with the name: " + name); + var2.printStackTrace(); + } + } + + return null; + } +} diff --git a/src/main/java/icbm/api/ICBMFlags.java b/src/main/java/icbm/api/ICBMFlags.java new file mode 100644 index 0000000..5ee39df --- /dev/null +++ b/src/main/java/icbm/api/ICBMFlags.java @@ -0,0 +1,11 @@ +package icbm.api; + +import universalelectricity.prefab.flag.FlagRegistry; + +public class ICBMFlags { + public static final String FLAG_BAN_GLOBAL = FlagRegistry.registerFlag("ban_icbm"); + public static final String FLAG_BAN_EXPLOSIVE = FlagRegistry.registerFlag("ban_explosive"); + public static final String FLAG_BAN_GRENADE = FlagRegistry.registerFlag("ban_grenade"); + public static final String FLAG_BAN_MISSILE = FlagRegistry.registerFlag("ban_missile"); + public static final String FLAG_BAN_MINECART = FlagRegistry.registerFlag("ban_minecart"); +} diff --git a/src/main/java/icbm/api/ICamouflageMaterial.java b/src/main/java/icbm/api/ICamouflageMaterial.java new file mode 100644 index 0000000..d47aebb --- /dev/null +++ b/src/main/java/icbm/api/ICamouflageMaterial.java @@ -0,0 +1,5 @@ +package icbm.api; + + +public interface ICamouflageMaterial { +} diff --git a/src/main/java/icbm/api/IHackable.java b/src/main/java/icbm/api/IHackable.java new file mode 100644 index 0000000..63d4909 --- /dev/null +++ b/src/main/java/icbm/api/IHackable.java @@ -0,0 +1,10 @@ +package icbm.api; + +import net.minecraft.entity.player.EntityPlayer; + +public interface IHackable { + + void generateNewKey(); + + boolean tryForAccess(EntityPlayer var1, String var2); +} diff --git a/src/main/java/icbm/api/IItemFrequency.java b/src/main/java/icbm/api/IItemFrequency.java new file mode 100644 index 0000000..3ac4618 --- /dev/null +++ b/src/main/java/icbm/api/IItemFrequency.java @@ -0,0 +1,10 @@ +package icbm.api; + +import net.minecraft.item.ItemStack; + +public interface IItemFrequency { + + int getFrequency(ItemStack var1); + + void setFrequency(int var1, ItemStack var2); +} diff --git a/src/main/java/icbm/api/ILauncherContainer.java b/src/main/java/icbm/api/ILauncherContainer.java new file mode 100644 index 0000000..a462a3b --- /dev/null +++ b/src/main/java/icbm/api/ILauncherContainer.java @@ -0,0 +1,13 @@ +package icbm.api; + +import icbm.api.ILauncherController; +import icbm.api.IMissile; + +public interface ILauncherContainer { + + IMissile getContainingMissile(); + + void setContainingMissile(IMissile var1); + + ILauncherController getController(); +} diff --git a/src/main/java/icbm/api/ILauncherController.java b/src/main/java/icbm/api/ILauncherController.java new file mode 100644 index 0000000..cdb9bb0 --- /dev/null +++ b/src/main/java/icbm/api/ILauncherController.java @@ -0,0 +1,28 @@ +package icbm.api; + +import icbm.api.IBlockFrequency; +import icbm.api.IMissile; +import icbm.api.LauncherType; +import net.minecraft.item.ItemStack; +import universalelectricity.core.block.IElectricityStorage; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.implement.IRedstoneReceptor; + +public interface ILauncherController extends IElectricityStorage, IRedstoneReceptor, IBlockFrequency { + + LauncherType getLauncherType(); + + void launch(); + + boolean canLaunch(); + + String getStatus(); + + Vector3 getTarget(); + + void setTarget(Vector3 var1); + + void placeMissile(ItemStack var1); + + IMissile getMissile(); +} diff --git a/src/main/java/icbm/api/IMissile.java b/src/main/java/icbm/api/IMissile.java new file mode 100644 index 0000000..6ea09cd --- /dev/null +++ b/src/main/java/icbm/api/IMissile.java @@ -0,0 +1,26 @@ +package icbm.api; + +import icbm.api.ILauncherContainer; +import icbm.api.explosion.IExplosiveContainer; +import universalelectricity.core.vector.Vector3; + +public interface IMissile extends IExplosiveContainer { + + void explode(); + + void setExplode(); + + void normalExplode(); + + void setNormalExplode(); + + void dropMissileAsItem(); + + int getTicksInAir(); + + ILauncherContainer getLauncher(); + + void launch(Vector3 var1); + + void launch(Vector3 var1, int var2); +} diff --git a/src/main/java/icbm/api/IMissileLockable.java b/src/main/java/icbm/api/IMissileLockable.java new file mode 100644 index 0000000..4474c02 --- /dev/null +++ b/src/main/java/icbm/api/IMissileLockable.java @@ -0,0 +1,11 @@ +package icbm.api; + +import icbm.api.IMissile; +import universalelectricity.core.vector.Vector3; + +public interface IMissileLockable { + + boolean canLock(IMissile var1); + + Vector3 getPredictedPosition(int var1); +} diff --git a/src/main/java/icbm/api/ITracker.java b/src/main/java/icbm/api/ITracker.java new file mode 100644 index 0000000..a3a8b6d --- /dev/null +++ b/src/main/java/icbm/api/ITracker.java @@ -0,0 +1,11 @@ +package icbm.api; + +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface ITracker { + void setTrackingEntity(final ItemStack p0, final Entity p1); + + Entity getTrackingEntity(final World p0, final ItemStack p1); +} diff --git a/src/main/java/icbm/api/LauncherType.java b/src/main/java/icbm/api/LauncherType.java new file mode 100644 index 0000000..1c8d1c3 --- /dev/null +++ b/src/main/java/icbm/api/LauncherType.java @@ -0,0 +1,14 @@ +package icbm.api; + + +public enum LauncherType { + + TRADITIONAL("TRADITIONAL", 0), + CRUISE("CRUISE", 1); + // $FF: synthetic field + private static final LauncherType[] $VALUES = new LauncherType[]{TRADITIONAL, CRUISE}; + + + private LauncherType(String var1, int var2) {} + +} diff --git a/src/main/java/icbm/api/RadarRegistry.java b/src/main/java/icbm/api/RadarRegistry.java new file mode 100644 index 0000000..83b2bb9 --- /dev/null +++ b/src/main/java/icbm/api/RadarRegistry.java @@ -0,0 +1,110 @@ +package icbm.api; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import universalelectricity.core.vector.Vector2; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.vector.Region2; + +public class RadarRegistry { + private static Set detectableTileEntities = new HashSet<>(); + private static Set detectableEntities = new HashSet<>(); + + public static void register(TileEntity tileEntity) { + if (!detectableTileEntities.contains(tileEntity)) { + detectableTileEntities.add(tileEntity); + } + } + + public static void unregister(TileEntity tileEntity) { + if (detectableTileEntities.contains(tileEntity)) { + detectableTileEntities.remove(tileEntity); + } + } + + public static void register(Entity entity) { + if (!detectableEntities.contains(entity)) { + detectableEntities.add(entity); + } + } + + public static void unregister(Entity entity) { + if (detectableEntities.contains(entity)) { + detectableEntities.remove(entity); + } + } + + public static List getTileEntitiesInArea(Vector2 minVector, + Vector2 maxVector) { + ArrayList returnArray = new ArrayList<>(); + cleanUpArray(); + for (TileEntity tileEntity : detectableTileEntities) { + if ((new Region2(minVector, maxVector)) + .isIn((new Vector3(tileEntity)).toVector2())) { + returnArray.add(tileEntity); + } + } + + return returnArray; + } + + public static List getEntitiesWithinRadius(Vector2 vector, + int radius) { + cleanUpArray(); + ArrayList returnArray = new ArrayList<>(); + for (Entity entity : detectableEntities) { + if (Vector2.distance(vector, (new Vector3(entity)).toVector2()) <= + (double)radius) { + returnArray.add(entity); + } + } + + return returnArray; + } + + public static Set getTileEntities() { + cleanUpArray(); + return detectableTileEntities; + } + + public static Set getEntities() { + cleanUpArray(); + return detectableEntities; + } + + public static void cleanUpArray() { + try { + Iterator e = detectableTileEntities.iterator(); + + while (e.hasNext()) { + TileEntity it2 = e.next(); + if (it2 == null) { + e.remove(); + } else if (it2.isInvalid()) { + e.remove(); + } else if (it2.getWorldObj().getTileEntity(it2.xCoord, it2.yCoord, + it2.zCoord) != it2) { + e.remove(); + } + } + + Iterator it21 = detectableEntities.iterator(); + while (it21.hasNext()) { + Entity entity = (Entity)it21.next(); + if (entity == null) { + it21.remove(); + } else if (entity.isDead) { + it21.remove(); + } + } + } catch (Exception var3) { + System.out.println("Failed to clean up radar list properly."); + var3.printStackTrace(); + } + } +} diff --git a/src/main/java/icbm/api/explosion/ExplosionEvent.java b/src/main/java/icbm/api/explosion/ExplosionEvent.java new file mode 100644 index 0000000..b3fd936 --- /dev/null +++ b/src/main/java/icbm/api/explosion/ExplosionEvent.java @@ -0,0 +1,36 @@ +package icbm.api.explosion; + +import cpw.mods.fml.common.eventhandler.Event; +import net.minecraft.world.World; + +public class ExplosionEvent extends Event { + + public final World world; + public final double x; + public final double y; + public final double z; + public IExplosive explosive; + + + public ExplosionEvent(World world, double x, double y, double z, IExplosive explosive) { + this.world = world; + this.x = x; + this.y = y; + this.z = z; + this.explosive = explosive; + } + + public static class PostExplosionEvent extends ExplosionEvent { + + public PostExplosionEvent(World world, double x, double y, double z, IExplosive explosive) { + super(world, x, y, z, explosive); + } + } + + public static class PreExplosionEvent extends ExplosionEvent { + + public PreExplosionEvent(World world, double x, double y, double z, IExplosive explosive) { + super(world, x, y, z, explosive); + } + } +} diff --git a/src/main/java/icbm/api/explosion/IEMPBlock.java b/src/main/java/icbm/api/explosion/IEMPBlock.java new file mode 100644 index 0000000..c74d838 --- /dev/null +++ b/src/main/java/icbm/api/explosion/IEMPBlock.java @@ -0,0 +1,10 @@ +package icbm.api.explosion; + +import icbm.api.explosion.IExplosive; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public interface IEMPBlock { + + void onEMP(World var1, Vector3 var2, IExplosive var3); +} diff --git a/src/main/java/icbm/api/explosion/IEMPItem.java b/src/main/java/icbm/api/explosion/IEMPItem.java new file mode 100644 index 0000000..32b4e4a --- /dev/null +++ b/src/main/java/icbm/api/explosion/IEMPItem.java @@ -0,0 +1,11 @@ +package icbm.api.explosion; + +import icbm.api.explosion.IExplosive; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import universalelectricity.core.item.IItemElectric; + +public interface IEMPItem extends IItemElectric { + + void onEMP(ItemStack var1, Entity var2, IExplosive var3); +} diff --git a/src/main/java/icbm/api/explosion/IExplosive.java b/src/main/java/icbm/api/explosion/IExplosive.java new file mode 100644 index 0000000..d923615 --- /dev/null +++ b/src/main/java/icbm/api/explosion/IExplosive.java @@ -0,0 +1,23 @@ +package icbm.api.explosion; + + +public interface IExplosive { + + int getID(); + + String getUnlocalizedName(); + + String getExplosiveName(); + + String getGrenadeName(); + + String getMissileName(); + + String getMinecartName(); + + float getRadius(); + + int getTier(); + + double getEnergy(); +} diff --git a/src/main/java/icbm/api/explosion/IExplosiveContainer.java b/src/main/java/icbm/api/explosion/IExplosiveContainer.java new file mode 100644 index 0000000..72f54b6 --- /dev/null +++ b/src/main/java/icbm/api/explosion/IExplosiveContainer.java @@ -0,0 +1,8 @@ +package icbm.api.explosion; + +import icbm.api.explosion.IExplosive; + +public interface IExplosiveContainer { + + IExplosive getExplosiveType(); +} diff --git a/src/main/java/icbm/api/explosion/IExplosiveIgnore.java b/src/main/java/icbm/api/explosion/IExplosiveIgnore.java new file mode 100644 index 0000000..093a592 --- /dev/null +++ b/src/main/java/icbm/api/explosion/IExplosiveIgnore.java @@ -0,0 +1,8 @@ +package icbm.api.explosion; + +import icbm.api.explosion.ExplosionEvent; + +public interface IExplosiveIgnore { + + boolean canIgnore(ExplosionEvent var1); +} diff --git a/src/main/java/icbm/api/sentry/IAATarget.java b/src/main/java/icbm/api/sentry/IAATarget.java new file mode 100644 index 0000000..95ccf40 --- /dev/null +++ b/src/main/java/icbm/api/sentry/IAATarget.java @@ -0,0 +1,13 @@ +// +// Decompiled by Procyon v0.6.0 +// + +package icbm.api.sentry; + +public interface IAATarget { + void destroyCraft(); + + int doDamage(final int p0); + + boolean canBeTargeted(final Object p0); +} diff --git a/src/main/java/icbm/core/BSulfurOre.java b/src/main/java/icbm/core/BSulfurOre.java new file mode 100644 index 0000000..135623d --- /dev/null +++ b/src/main/java/icbm/core/BSulfurOre.java @@ -0,0 +1,38 @@ +package icbm.core; + +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; + +public class BSulfurOre extends Block { + public BSulfurOre() { + super(Material.rock); + this.setBlockName("icbm:oreSulfur"); + this.setHardness(3.0f); + this.setCreativeTab((CreativeTabs) ICBMTab.INSTANCE); + } + + @Override + public void registerBlockIcons(IIconRegister p_149651_1_) { + this.blockIcon = p_149651_1_.registerIcon("icbm:oreSulfur"); + } + + @Override + public Item getItemDropped(int p_149650_1_, Random p_149650_2_, + int p_149650_3_) { + return MainBase.itSulfur; + } + + @Override + public int quantityDropped(final Random par1Random) { + return 3 + par1Random.nextInt(3); + } + + @Override + public int quantityDroppedWithBonus(final int par1, final Random par2Random) { + return this.quantityDropped(par2Random) + par2Random.nextInt(par1 + 1); + } +} diff --git a/src/main/java/icbm/core/GenSulfur.java b/src/main/java/icbm/core/GenSulfur.java new file mode 100644 index 0000000..7d6d8cc --- /dev/null +++ b/src/main/java/icbm/core/GenSulfur.java @@ -0,0 +1,97 @@ +package icbm.core; + +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.ore.OreGenReplace; + +public class GenSulfur extends OreGenReplace { + public GenSulfur(final String name, final String oreDiectionaryName, + final ItemStack stack, final Block replaceID, + final int minGenerateLevel, final int maxGenerateLevel, + final int amountPerChunk, final int amountPerBranch, + final String harvestTool, final int harvestLevel) { + super(name, oreDiectionaryName, stack, replaceID, minGenerateLevel, + maxGenerateLevel, amountPerChunk, amountPerBranch, harvestTool, + harvestLevel); + } + + public GenSulfur(final String name, final String oreDiectionaryName, + final ItemStack stack, final Block replaceID, + final int maxGenerateLevel, final int amountPerChunk, + final int amountPerBranch) { + this(name, oreDiectionaryName, stack, replaceID, 0, maxGenerateLevel, + amountPerChunk, amountPerBranch, "pickaxe", 1); + } + + @Override + public void generate(final World world, final Random random, final int varX, + final int varZ) { + for (int y = super.minGenerateLevel; y < super.maxGenerateLevel; ++y) { + for (int x = 0; x < 16; ++x) { + for (int z = 0; z < 16; ++z) { + this.generateReplace(world, random, varX + x, y, varZ + z); + } + } + } + } + + @Override + public boolean generateReplace(final World world, final Random rand, + final int x, final int y, final int z) { + if (this.nearLava(world, x, y, z)) { + this.placeOre(world, rand, x, y, z); + return true; + } + return false; + } + + private void placeOre(final World world, final Random rand, final int x, + final int y, final int z) { + final Vector3 position = new Vector3(x, y, z); + for (int amount = 0; amount < super.amountPerBranch; ++amount) { + final Block block = world.getBlock(x, y, z); + //TODO: WTF + if (block != null /*&& + block.isGenMineableReplaceable(world, x, y, z, + Blocks.stone)*/) { + world.setBlock(x, y, z, super.oreID, super.oreMeta, 2); + } + final ForgeDirection dir = ForgeDirection.values()[rand.nextInt(6)]; + position.modifyPositionFromSide(dir); + } + } + + private boolean nearLava(final World world, final int x, final int y, + final int z) { + for (int side = 2; side < 6; ++side) { + final Vector3 position = new Vector3(x, y, z); + final ForgeDirection s = ForgeDirection.values()[side]; + position.modifyPositionFromSide(s); + if (world.blockExists(position.intX(), position.intY(), + position.intZ())) { + final Block id = world.getBlock(position.intX(), position.intY(), + position.intZ()); + if (id == Blocks.lava || + id == Blocks.flowing_lava) { + return true; + } + } + } + for (int j = 0; j < 4; ++j) { + final Block id2 = world.getBlock(x, y - j, z); + if (id2 == Blocks.lava || + id2 == Blocks.flowing_lava) { + return true; + } + if (id2 != Blocks.air) { + return false; + } + } + return false; + } +} diff --git a/src/main/java/icbm/core/HaoMa.java b/src/main/java/icbm/core/HaoMa.java new file mode 100644 index 0000000..b897ebb --- /dev/null +++ b/src/main/java/icbm/core/HaoMa.java @@ -0,0 +1,26 @@ +package icbm.core; + +import java.util.HashMap; + +public class HaoMa +{ + private static final HashMap IDS; + + public static int getID(final String name, final int defaultID) { + int id = defaultID; + if (HaoMa.IDS.containsKey(name)) { + id = HaoMa.IDS.get(name); + ++id; + } + HaoMa.IDS.put(name, id); + return id; + } + + public static int getID(final String name) { + return getID(name, 0); + } + + static { + IDS = new HashMap<>(); + } +} diff --git a/src/main/java/icbm/core/ICBMTab.java b/src/main/java/icbm/core/ICBMTab.java new file mode 100644 index 0000000..e5cf0d8 --- /dev/null +++ b/src/main/java/icbm/core/ICBMTab.java @@ -0,0 +1,31 @@ +package icbm.core; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class ICBMTab extends CreativeTabs { + public static final ICBMTab INSTANCE; + public static ItemStack itemStack; + + public ICBMTab() { super(CreativeTabs.getNextID(), "ICBM"); } + + @Override + public Item getTabIconItem() { + if (ICBMTab.itemStack == null) { + return Item.getItemFromBlock(Blocks.tnt); + } + + return ICBMTab.itemStack.getItem(); + } + + public ItemStack getIconItemStack() { + if (ICBMTab.itemStack == null) { + ICBMTab.itemStack = new ItemStack(Blocks.tnt); + } + return ICBMTab.itemStack; + } + + static { INSTANCE = new ICBMTab(); } +} diff --git a/src/main/java/icbm/core/MainBase.java b/src/main/java/icbm/core/MainBase.java new file mode 100644 index 0000000..db3402f --- /dev/null +++ b/src/main/java/icbm/core/MainBase.java @@ -0,0 +1,182 @@ +package icbm.core; + +import atomicscience.api.poison.PotionRadiation; +import calclavia.lib.UniversalRecipes; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.ModMetadata; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.event.FMLServerStartingEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.registry.GameRegistry; +import icbm.core.di.ItICBM; +import java.io.File; +import java.util.Arrays; +import java.util.logging.Logger; +import net.minecraft.block.Block; +import net.minecraft.command.ICommand; +import net.minecraft.command.ICommandManager; +import net.minecraft.command.ServerCommandManager; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.MathHelper; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.oredict.OreDictionary; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.flag.CommandFlag; +import universalelectricity.prefab.flag.FlagRegistry; +import universalelectricity.prefab.flag.ModFlag; +import universalelectricity.prefab.flag.NBTFileLoader; +import universalelectricity.prefab.multiblock.BlockMulti; +import universalelectricity.prefab.multiblock.TileEntityMulti; +import universalelectricity.prefab.ore.OreGenBase; +import universalelectricity.prefab.ore.OreGenerator; + +public class MainBase { + public static final MainBase INSTANCE; + public static boolean ZAI_KUAI; + public static Block bLiu; + public static BlockMulti bJia; + public static Item itSulfur; + public static Item itDu; + public static OreGenBase liuGenData; + public static final String PREFIX = "icbm:"; + public static final String RESOURCE_PATH = "/mods/icbm/"; + public static final String TEXTURE_PATH = "/mods/icbm/textures/"; + public static final String GUI_PATH = "/mods/icbm/textures/gui/"; + public static final String MODEL_PATH = "/mods/icbm/textures/models/"; + public static final String SMINE_TEXTURE = "/mods/icbm/textures/models/s-mine.png"; + public static final String BLOCK_PATH = "/mods/icbm/textures/blocks/"; + public static final String ITEM_PATH = "/mods/icbm/textures/items/"; + public static final String YU_YAN_PATH = "/mods/icbm/yuyan/"; + public static int DAO_DAN_ZUI_YUAN; + public static final int GUI_XIA_FA_SHE_QI = 1; + public static final int GUI_FA_SHE_SHI_MUO = 2; + public static final int GUI_LEI_DA_TAI = 3; + public static final int GUI_YIN_GAN_QI = 4; + public static final int GUI_SHENG_BUO = 5; + public static final int GUI_DIAN_CI_QI = 6; + public static final int GUI_FA_SHE_DI = 7; + private static boolean isPreInit; + private static boolean isPostInit; + public static final Configuration CONFIGURATION; + public static final Logger LOGGER; + + @Mod.EventHandler + public void preInit(final FMLPreInitializationEvent event) { + if (!MainBase.isPreInit) { + MinecraftForge.EVENT_BUS.register((Object) MainBase.INSTANCE); + MainBase.CONFIGURATION.load(); + PotionRadiation.INSTANCE.getId(); + MainBase.ZAI_KUAI = MainBase.CONFIGURATION.get("general", "Allow Chunk Loading", true) + .getBoolean(true); + MainBase.DAO_DAN_ZUI_YUAN = MainBase.CONFIGURATION + .get("general", "Max Missile Distance", MainBase.DAO_DAN_ZUI_YUAN) + .getInt(MainBase.DAO_DAN_ZUI_YUAN); + MainBase.bLiu = (Block) new BSulfurOre(); + MainBase.bJia = new BlockMulti() + .setTextureName("icbm:machine") + .setChannel(this.getChannel()); + MainBase.itDu = new ItICBM("poisonPowder"); + MainBase.itSulfur = new ItICBM("sulfur"); + GameRegistry.registerBlock(MainBase.bLiu, "bLiu"); + GameRegistry.registerBlock((Block) MainBase.bJia, "bJia"); + MainBase.liuGenData = new GenSulfur("Sulfur Ore", "oreSulfur", new ItemStack(MainBase.bLiu), + Blocks.air, 40, 20, 4) + .enable(MainBase.CONFIGURATION); + + MainBase.CONFIGURATION.save(); + OreDictionary.registerOre("dustSulfur", MainBase.itSulfur); + OreGenerator.addOre(MainBase.liuGenData); + GameRegistry.registerTileEntity(TileEntityMulti.class, "ICBMMulti"); + MainBase.isPreInit = true; + } + } + + @Mod.EventHandler + public void postInit(final FMLPostInitializationEvent event) { + if (!MainBase.isPostInit) { + UniversalRecipes.init(); + GameRegistry.addSmelting(MainBase.bLiu, + new ItemStack(MainBase.itSulfur, 4), 0.8f); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(Items.gunpowder, 3), + new Object[] { "@@@", "@?@", "@@@", '@', "dustSulfur", '?', + Items.coal })); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(Items.gunpowder, 3), + new Object[] { "@@@", "@?@", "@@@", '@', "dustSulfur", '?', + new ItemStack(Items.coal, 1, 1) })); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + Blocks.tnt, new Object[] { "@@@", "@R@", "@@@", '@', Items.gunpowder, + 'R', Items.redstone })); + GameRegistry.addRecipe((IRecipe) new ShapelessOreRecipe( + new ItemStack(MainBase.itDu, 3), + new Object[] { Items.spider_eye, Items.rotten_flesh })); + MainBase.isPostInit = true; + } + } + + @Mod.EventHandler + public void serverStarting(final FMLServerStartingEvent event) { + FlagRegistry.registerModFlag( + "ModFlags", new ModFlag(NBTFileLoader.loadData("ModFlags"))); + final ICommandManager commandManager = FMLCommonHandler.instance() + .getMinecraftServerInstance() + .getCommandManager(); + final ServerCommandManager serverCommandManager = (ServerCommandManager) commandManager; + serverCommandManager.registerCommand( + (ICommand) new CommandFlag(FlagRegistry.getModFlag("ModFlags"))); + } + + @SubscribeEvent + public void worldSave(final WorldEvent.Save evt) { + if (!((WorldEvent) evt).world.isRemote) { + NBTFileLoader.saveData("ModFlags", + FlagRegistry.getModFlag("ModFlags").getNBT()); + } + } + + public static Vector3 getLook(final float rotationYaw, + final float rotationPitch) { + final float var2 = MathHelper.cos(-rotationYaw * 0.017453292f - 3.1415927f); + final float var3 = MathHelper.sin(-rotationYaw * 0.017453292f - 3.1415927f); + final float var4 = -MathHelper.cos(-rotationPitch * 0.017453292f); + final float var5 = MathHelper.sin(-rotationPitch * 0.017453292f); + return new Vector3(var3 * var4, var5, var2 * var4); + } + + public static void setModMetadata(final String id, + final ModMetadata metadata) { + metadata.modId = id; + metadata.name = "ICBM"; + metadata.description = "ICBM is a Minecraft Mod that introduces intercontinental ballistic missiles to Minecraft. But the fun doesn't end there! This mod also features many different explosives, missiles and machines classified in three different tiers. If strategic warfare, carefully coordinated airstrikes, messing with matter and general destruction are up your alley, then this mod is for you!"; + metadata.url = "http://www.universalelectricity.com/icbm/"; + metadata.logoFile = "/icbm_logo.png"; + metadata.version = "1.2.1"; + metadata.authorList = Arrays.asList("Calclavia"); + metadata.credits = "Please visit the website."; + metadata.autogenerated = false; + } + + protected String getChannel() { + return null; + } + + static { + INSTANCE = new MainBase(); + MainBase.DAO_DAN_ZUI_YUAN = 10000; + CONFIGURATION = new Configuration( + new File(Loader.instance().getConfigDir(), "ICBM.cfg")); + LOGGER = Logger.getLogger("ICBM"); + } +} diff --git a/src/main/java/icbm/core/Pair.java b/src/main/java/icbm/core/Pair.java new file mode 100644 index 0000000..83a32ac --- /dev/null +++ b/src/main/java/icbm/core/Pair.java @@ -0,0 +1,33 @@ +package icbm.core; + +public class Pair { + private final T left; + private final T right; + + public Pair(final T left, final T right) { + this.left = left; + this.right = right; + } + + public T getKey() { return this.left; } + + public T getValue() { return this.right; } + + @Override + public int hashCode() { + return this.left.hashCode() ^ this.right.hashCode(); + } + + @Override + public boolean equals(final Object o) { + if (o == null) { + return false; + } + if (!(o instanceof Pair)) { + return false; + } + final Pair pairo = (Pair)o; + return this.left.equals(pairo.getKey()) && + this.right.equals(pairo.getValue()); + } +} diff --git a/src/main/java/icbm/core/di/BICBM.java b/src/main/java/icbm/core/di/BICBM.java new file mode 100644 index 0000000..e5f5cdc --- /dev/null +++ b/src/main/java/icbm/core/di/BICBM.java @@ -0,0 +1,75 @@ +package icbm.core.di; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.ICBMTab; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.prefab.block.BlockAdvanced; +import universalelectricity.prefab.implement.IRedstoneProvider; + +public abstract class BICBM extends BlockAdvanced { + protected IIcon iconTop; + protected IIcon iconSide; + protected IIcon iconBottom; + protected boolean requireSidedTextures; + + public BICBM(final String name, final Material material) { + super(material); + this.requireSidedTextures = false; + this.setBlockName("icbm:" + name); + this.setCreativeTab((CreativeTabs)ICBMTab.INSTANCE); + } + + @Override + public int damageDropped(final int metadata) { + return metadata; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(final IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + if (this.requireSidedTextures) { + this.iconTop = iconRegister.registerIcon( + this.getUnlocalizedName().replace("tile.", "") + "_top"); + this.iconSide = iconRegister.registerIcon( + this.getUnlocalizedName().replace("tile.", "") + "_side"); + this.iconBottom = iconRegister.registerIcon( + this.getUnlocalizedName().replace("tile.", "") + "_bottom"); + } + } + + @Override + public int isProvidingStrongPower(final IBlockAccess par1IBlockAccess, + final int x, final int y, final int z, + final int side) { + final TileEntity tileEntity = par1IBlockAccess.getTileEntity(x, y, z); + if (tileEntity instanceof IRedstoneProvider) { + return ((IRedstoneProvider)tileEntity) + .isPoweringTo(ForgeDirection.getOrientation(side)) + ? 15 + : 0; + } + return 0; + } + + @Override + public int isProvidingWeakPower(final IBlockAccess par1IBlockAccess, + final int x, final int y, final int z, + final int side) { + final TileEntity tileEntity = par1IBlockAccess.getTileEntity(x, y, z); + if (tileEntity instanceof IRedstoneProvider) { + return ((IRedstoneProvider)tileEntity) + .isIndirectlyPoweringTo(ForgeDirection.getOrientation(side)) + ? 15 + : 0; + } + return 0; + } +} diff --git a/src/main/java/icbm/core/di/ItElectricICBM.java b/src/main/java/icbm/core/di/ItElectricICBM.java new file mode 100644 index 0000000..17c5dad --- /dev/null +++ b/src/main/java/icbm/core/di/ItElectricICBM.java @@ -0,0 +1,13 @@ +package icbm.core.di; + +import icbm.core.ICBMTab; +import net.minecraft.creativetab.CreativeTabs; +import universalelectricity.core.item.ItemElectric; + +public abstract class ItElectricICBM extends ItemElectric { + public ItElectricICBM(final String name) { + super(); + this.setUnlocalizedName("icbm:" + name); + this.setCreativeTab((CreativeTabs)ICBMTab.INSTANCE); + } +} diff --git a/src/main/java/icbm/core/di/ItICBM.java b/src/main/java/icbm/core/di/ItICBM.java new file mode 100644 index 0000000..0a62cb7 --- /dev/null +++ b/src/main/java/icbm/core/di/ItICBM.java @@ -0,0 +1,13 @@ +package icbm.core.di; + +import icbm.core.ICBMTab; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; + +public class ItICBM extends Item { + public ItICBM(final String name) { + super(); + this.setUnlocalizedName("icbm:" + name); + this.setCreativeTab((CreativeTabs)ICBMTab.INSTANCE); + } +} diff --git a/src/main/java/icbm/core/di/MICBM.java b/src/main/java/icbm/core/di/MICBM.java new file mode 100644 index 0000000..13e0309 --- /dev/null +++ b/src/main/java/icbm/core/di/MICBM.java @@ -0,0 +1,10 @@ +package icbm.core.di; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; + +@SideOnly(Side.CLIENT) +public abstract class MICBM extends ModelBase { + public void render(final float f5) {} +} diff --git a/src/main/java/icbm/gangshao/ClientProxy.java b/src/main/java/icbm/gangshao/ClientProxy.java new file mode 100644 index 0000000..265a762 --- /dev/null +++ b/src/main/java/icbm/gangshao/ClientProxy.java @@ -0,0 +1,86 @@ +// +// Decompiled by Procyon v0.6.0 +// + +package icbm.gangshao; + +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import cpw.mods.fml.client.registry.RenderingRegistry; +import icbm.gangshao.platform.TPlatform; +import icbm.gangshao.render.BlockRenderingHandler; +import icbm.gangshao.render.FXBeam; +import icbm.gangshao.render.RAATurret; +import icbm.gangshao.render.RESeat; +import icbm.gangshao.render.RGunTurret; +import icbm.gangshao.render.RLaserTurret; +import icbm.gangshao.render.RRailgun; +import icbm.gangshao.shimian.GuiPlatformAccess; +import icbm.gangshao.shimian.GuiPlatformSlots; +import icbm.gangshao.shimian.GuiPlatformTerminal; +import icbm.gangshao.turret.mount.ESeat; +import icbm.gangshao.turret.mount.TRailgunTurret; +import icbm.gangshao.turret.sentries.TAATurret; +import icbm.gangshao.turret.sentries.TLaserTurret; +import icbm.gangshao.turret.sentries.TMachineGunTurret; +import net.minecraft.client.particle.EntityFX; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class ClientProxy extends CommonProxy { + @Override + public void preInit() { + super.preInit(); + } + + @Override + public void init() { + super.init(); + ClientRegistry.bindTileEntitySpecialRenderer( + TMachineGunTurret.class, (TileEntitySpecialRenderer) new RGunTurret()); + ClientRegistry.bindTileEntitySpecialRenderer( + TAATurret.class, (TileEntitySpecialRenderer) new RAATurret()); + ClientRegistry.bindTileEntitySpecialRenderer( + TRailgunTurret.class, (TileEntitySpecialRenderer) new RRailgun()); + ClientRegistry.bindTileEntitySpecialRenderer( + TLaserTurret.class, (TileEntitySpecialRenderer) new RLaserTurret()); + RenderingRegistry.registerEntityRenderingHandler(ESeat.class, + (Render) new RESeat()); + RenderingRegistry.registerBlockHandler( + (ISimpleBlockRenderingHandler) new BlockRenderingHandler()); + } + + @Override + public Object getClientGuiElement(final int ID, final EntityPlayer player, + final World world, final int x, final int y, + final int z) { + final TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity != null) { + switch (ID) { + case 0: { + return new GuiPlatformSlots(player.inventory, (TPlatform) tileEntity); + } + case 1: { + return new GuiPlatformTerminal(player, (TPlatform) tileEntity); + } + case 2: { + return new GuiPlatformAccess(player, (TPlatform) tileEntity); + } + } + } + return null; + } + + @Override + public void renderBeam(final World world, final Vector3 position, + final Vector3 target, final float red, + final float green, final float blue, final int age) { + FMLClientHandler.instance().getClient().effectRenderer.addEffect( + (EntityFX) new FXBeam(world, position, target, red, green, blue, age)); + } +} diff --git a/src/main/java/icbm/gangshao/CommonProxy.java b/src/main/java/icbm/gangshao/CommonProxy.java new file mode 100644 index 0000000..ce720fc --- /dev/null +++ b/src/main/java/icbm/gangshao/CommonProxy.java @@ -0,0 +1,63 @@ +package icbm.gangshao; + +import cpw.mods.fml.common.network.IGuiHandler; +import cpw.mods.fml.common.registry.GameRegistry; +import icbm.gangshao.container.ContainerTurretPlatform; +import icbm.gangshao.platform.TPlatform; +import icbm.gangshao.turret.mount.TRailgunTurret; +import icbm.gangshao.turret.sentries.TAATurret; +import icbm.gangshao.turret.sentries.TLaserTurret; +import icbm.gangshao.turret.sentries.TMachineGunTurret; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.multiblock.TileEntityMulti; + +public class CommonProxy implements IGuiHandler { + public static final int GUI_PLATFORM_ID = 0; + public static final int GUI_PLATFORM_TERMINAL_ID = 1; + public static final int GUI_PLATFORM_ACCESS_ID = 2; + + public void init() { + GameRegistry.registerTileEntity(TMachineGunTurret.class, "ICBMGunTurret"); + GameRegistry.registerTileEntity(TAATurret.class, "ICBMAATurret"); + GameRegistry.registerTileEntity(TRailgunTurret.class, "ICBMRailgun"); + GameRegistry.registerTileEntity(TLaserTurret.class, "ICBMLeiSheF"); + GameRegistry.registerTileEntity(TPlatform.class, "ICBMPlatform"); + GameRegistry.registerTileEntity(TileEntityMulti.class, "ICBMMultiblock"); + } + + public void preInit() { + } + + public Object getServerGuiElement(final int ID, final EntityPlayer player, + final World world, final int x, final int y, + final int z) { + final TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity != null) { + switch (ID) { + case 0: { + return new ContainerTurretPlatform(player.inventory, + (TPlatform) tileEntity); + } + } + } + return null; + } + + public Object getClientGuiElement(final int ID, final EntityPlayer player, + final World world, final int x, final int y, + final int z) { + return null; + } + + public void renderTracer(final World world, final Vector3 position, + final Vector3 target) { + } + + public void renderBeam(final World world, final Vector3 position, + final Vector3 target, final float red, + final float green, final float blue, final int age) { + } +} diff --git a/src/main/java/icbm/gangshao/IAmmunition.java b/src/main/java/icbm/gangshao/IAmmunition.java new file mode 100644 index 0000000..168c90d --- /dev/null +++ b/src/main/java/icbm/gangshao/IAmmunition.java @@ -0,0 +1,13 @@ +package icbm.gangshao; + +import net.minecraft.item.ItemStack; + +public interface IAmmunition { + boolean canDrop(final int p0); + + ItemStack onDroppedIntoWorld(final ItemStack p0); + + ProjectileType getType(final ItemStack p0); + + int getDamage(); +} diff --git a/src/main/java/icbm/gangshao/IAutoSentry.java b/src/main/java/icbm/gangshao/IAutoSentry.java new file mode 100644 index 0000000..dc4448c --- /dev/null +++ b/src/main/java/icbm/gangshao/IAutoSentry.java @@ -0,0 +1,16 @@ +package icbm.gangshao; + +import net.minecraft.entity.Entity; +import net.minecraft.util.AxisAlignedBB; + +public interface IAutoSentry extends ISentry { + AxisAlignedBB getTargetingBox(); + + Entity getTarget(); + + void setTarget(final Entity p0); + + boolean isValidTarget(final Entity p0); + + double getDetectRange(); +} diff --git a/src/main/java/icbm/gangshao/ICBMSentry.java b/src/main/java/icbm/gangshao/ICBMSentry.java new file mode 100644 index 0000000..533e9a6 --- /dev/null +++ b/src/main/java/icbm/gangshao/ICBMSentry.java @@ -0,0 +1,230 @@ +package icbm.gangshao; + +import calclavia.lib.UniversalRecipes; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.ModMetadata; +import cpw.mods.fml.common.SidedProxy; +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.event.FMLServerStartingEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.network.IGuiHandler; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; +import cpw.mods.fml.common.registry.EntityRegistry; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import icbm.api.ICBMFlags; +import icbm.core.ICBMTab; +import icbm.core.MainBase; +import icbm.gangshao.damage.EntityTileDamagable; +import icbm.gangshao.packet.PacketHandlerTurret; +import icbm.gangshao.packet.PacketTurret; +import icbm.gangshao.platform.BlockTurretPlatform; +import icbm.gangshao.terminal.command.CommandAccess; +import icbm.gangshao.terminal.command.CommandDestroy; +import icbm.gangshao.terminal.command.CommandGet; +import icbm.gangshao.terminal.command.CommandHelp; +import icbm.gangshao.terminal.command.CommandRegistry; +import icbm.gangshao.terminal.command.CommandTarget; +import icbm.gangshao.terminal.command.CommandUser; +import icbm.gangshao.turret.BlockTurret; +import icbm.gangshao.turret.ItemAmmo; +import icbm.gangshao.turret.ItemBlockTurret; +import icbm.gangshao.turret.mount.ESeat; +import icbm.gangshao.turret.upgrades.ItPaoTaiUpgrades; +import net.minecraft.block.Block; +import net.minecraft.command.ICommand; +import net.minecraft.command.ICommandManager; +import net.minecraft.command.ServerCommandManager; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.flag.CommandFlag; +import universalelectricity.prefab.flag.FlagRegistry; +import universalelectricity.prefab.flag.ModFlag; +import universalelectricity.prefab.flag.NBTFileLoader; + +@Mod(modid = "ICBM|Sentry", name = "ICBM|Sentry", version = "1.2.1", useMetadata = true) +public class ICBMSentry extends MainBase { + public static final String NAME = "ICBM|Sentry"; + public static final String CHANNEL = "ICBM"; + @SidedProxy(clientSide = "icbm.gangshao.ClientProxy", serverSide = "icbm.gangshao.CommonProxy") + public static CommonProxy proxy; + @Mod.Instance("ICBM|Sentry") + public static ICBMSentry instance; + @Mod.Metadata("ICBM|Sentry") + public static ModMetadata metadata; + public static final int BLOCK_ID_PREFIX = 3517; + public static final int ITEM_ID_PREFIX = 20948; + public static final int ENTITY_ID_PREFIX = 50; + public static Block blockTurret; + public static Block blockPlatform; + public static Item itemAmmo; + public static Item itemUpgrade; + public static ItemStack conventionalBullet; + public static ItemStack railgunBullet; + public static ItemStack antimatterBullet; + public static ItemStack bulletShell; + public static final String FLAG_RAILGUN; + public static SimpleNetworkWrapper channel; + + @Mod.EventHandler + @Override + public void preInit(final FMLPreInitializationEvent event) { + super.preInit(event); + NetworkRegistry.INSTANCE.registerGuiHandler((Object) this, + (IGuiHandler) ICBMSentry.proxy); + MinecraftForge.EVENT_BUS.register((Object) this); + MainBase.CONFIGURATION.load(); + ICBMSentry.blockTurret = (Block) new BlockTurret(); + ICBMSentry.blockPlatform = (Block) new BlockTurretPlatform(); + ICBMSentry.itemAmmo = new ItemAmmo(); + ICBMSentry.itemUpgrade = new ItPaoTaiUpgrades(); + MainBase.CONFIGURATION.save(); + ICBMSentry.bulletShell = new ItemStack(ICBMSentry.itemAmmo, 1, 0); + ICBMSentry.conventionalBullet = new ItemStack(ICBMSentry.itemAmmo, 1, 1); + ICBMSentry.railgunBullet = new ItemStack(ICBMSentry.itemAmmo, 1, 2); + ICBMSentry.antimatterBullet = new ItemStack(ICBMSentry.itemAmmo, 1, 3); + GameRegistry.registerBlock(ICBMSentry.blockTurret, ItemBlockTurret.class, + "ICBMTurret"); + GameRegistry.registerBlock(ICBMSentry.blockPlatform, "ICBMPlatform"); + EntityRegistry.registerGlobalEntityID( + ESeat.class, "ICBMFake", EntityRegistry.findGlobalUniqueEntityId()); + EntityRegistry.registerModEntity(ESeat.class, "ICBMFake", 57, (Object) this, + 50, 5, true); + EntityRegistry.registerGlobalEntityID( + EntityTileDamagable.class, "ICBMFakeTile", + EntityRegistry.findGlobalUniqueEntityId()); + EntityRegistry.registerModEntity(EntityTileDamagable.class, "ICBMFakeTile", + 58, (Object) this, 50, 5, true); + + GameRegistry.registerItem(itemAmmo, "icbm:itemAmmo"); + GameRegistry.registerItem(itemUpgrade, "icbm:itemUpgrade"); + + ICBMTab.itemStack = new ItemStack(ICBMSentry.blockTurret); + + ICBMSentry.proxy.preInit(); + + channel = NetworkRegistry.INSTANCE.newSimpleChannel("icbm_sentry"); + int pktId = 0; + + channel.registerMessage(PacketHandlerTurret.class, PacketTurret.class, + pktId++, Side.CLIENT); + } + + @Mod.EventHandler + public void init(final FMLInitializationEvent event) { + MainBase.setModMetadata("ICBM|Sentry", ICBMSentry.metadata); + } + + @Mod.EventHandler + @Override + public void postInit(final FMLPostInitializationEvent event) { + super.postInit(event); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMSentry.itemAmmo, 16, 0), + new Object[] { "T", "T", 'T', "ingotTin" })); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMSentry.itemAmmo, 16, 1), + new Object[] { "SBS", "SGS", "SSS", 'B', Items.iron_ingot, 'G', + Items.gunpowder, 'S', ICBMSentry.bulletShell.copy() })); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMSentry.itemAmmo, 2, 2), + new Object[] { "D", "B", "B", 'D', Items.diamond, 'B', + ICBMSentry.conventionalBullet })); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + ICBMSentry.antimatterBullet, + new Object[] { "A", "B", 'A', "antimatterGram", 'B', + ICBMSentry.railgunBullet })); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + ICBMSentry.blockPlatform, + new Object[] { "SPS", "CBC", "SAS", 'P', Blocks.piston, 'A', + UniversalRecipes.BATTERY, 'S', "plateSteel", 'C', + Blocks.chest, 'B', "calclavia:CIRCUIT_T1" })); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMSentry.blockTurret, 1, 0), + new Object[] { "SSS", "CS ", 'C', "calclavia:CIRCUIT_T1", 'S', + "ingotSteel" })); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMSentry.blockTurret, 1, 1), + new Object[] { "DDD", "CS ", "GS ", 'D', Items.diamond, 'S', + "plateSteel", 'C', "calclavia:CIRCUIT_T3", 'G', + new ItemStack(ICBMSentry.blockTurret, 1, 0) })); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMSentry.blockTurret, 1, 2), + new Object[] { "DDS", "CS ", "GS ", 'D', "plateBronze", 'S', + "plateSteel", 'C', "calclavia:CIRCUIT_T2", 'G', + new ItemStack(ICBMSentry.blockTurret, 1, 0) })); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMSentry.blockTurret, 1, 3), + new Object[] { "DDG", "CS ", "GS ", 'D', "plateBronze", 'S', + "plateSteel", 'C', "calclavia:CIRCUIT_T1", 'D', + Blocks.glass, 'G', Blocks.glass })); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMSentry.itemUpgrade, 3, + ItPaoTaiUpgrades.TurretUpgradeType.RANGE.ordinal()), + new Object[] { "B", "I", 'B', Items.bow, 'I', Items.iron_ingot })); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMSentry.itemUpgrade, 1, + ItPaoTaiUpgrades.TurretUpgradeType.COLLECTOR.ordinal()), + new Object[] { "BBB", " I ", "BBB", 'B', Items.bucket, 'I', + Items.bowl })); + CommandRegistry.register(new CommandAccess()); + CommandRegistry.register(new CommandDestroy()); + CommandRegistry.register(new CommandUser()); + CommandRegistry.register(new CommandHelp()); + CommandRegistry.register(new CommandGet()); + CommandRegistry.register(new CommandTarget()); + ICBMSentry.proxy.init(); + } + + public static boolean isProtected(final World world, final Vector3 diDian, + final String banFlag) { + return FlagRegistry.getModFlag("ModFlags") != null && + (FlagRegistry.getModFlag("ModFlags") + .containsValue(world, ICBMFlags.FLAG_BAN_GLOBAL, "true", diDian) || + FlagRegistry.getModFlag("ModFlags") + .containsValue(world, banFlag, "true", diDian)); + } + + @Mod.EventHandler + @Override + public void serverStarting(final FMLServerStartingEvent event) { + FlagRegistry.registerModFlag( + "ModFlags", new ModFlag(NBTFileLoader.loadData("ModFlags"))); + final ICommandManager commandManager = FMLCommonHandler.instance() + .getMinecraftServerInstance() + .getCommandManager(); + final ServerCommandManager serverCommandManager = (ServerCommandManager) commandManager; + serverCommandManager.registerCommand( + (ICommand) new CommandFlag(FlagRegistry.getModFlag("ModFlags"))); + } + + @SubscribeEvent + @Override + public void worldSave(final WorldEvent.Save evt) { + if (!((WorldEvent) evt).world.isRemote) { + NBTFileLoader.saveData("ModFlags", + FlagRegistry.getModFlag("ModFlags").getNBT()); + } + } + + @Override + protected String getChannel() { + return "ICBM"; + } + + static { + FLAG_RAILGUN = FlagRegistry.registerFlag("ban_railgun"); + } +} diff --git a/src/main/java/icbm/gangshao/ISentry.java b/src/main/java/icbm/gangshao/ISentry.java new file mode 100644 index 0000000..df7b6dc --- /dev/null +++ b/src/main/java/icbm/gangshao/ISentry.java @@ -0,0 +1,18 @@ +package icbm.gangshao; + +import net.minecraft.tileentity.TileEntity; +import universalelectricity.core.vector.Vector3; + +public interface ISentry { + void setRotation(final float p0, final float p1); + + Vector3 getMuzzle(); + + void onWeaponActivated(); + + boolean canActivateWeapon(); + + TileEntity getPlatform(); + + String getName(); +} diff --git a/src/main/java/icbm/gangshao/ISpecialAccess.java b/src/main/java/icbm/gangshao/ISpecialAccess.java new file mode 100644 index 0000000..a27e3f2 --- /dev/null +++ b/src/main/java/icbm/gangshao/ISpecialAccess.java @@ -0,0 +1,18 @@ +package icbm.gangshao; + +import icbm.gangshao.access.AccessLevel; +import icbm.gangshao.access.UserAccess; +import java.util.List; + +public interface ISpecialAccess { + AccessLevel getUserAccess(final String p0); + + List getUsers(); + + boolean addUserAccess(final String p0, final AccessLevel p1, + final boolean p2); + + boolean removeUserAccess(final String p0); + + List getUsersWithAcess(final AccessLevel p0); +} diff --git a/src/main/java/icbm/gangshao/ITurretUpgrade.java b/src/main/java/icbm/gangshao/ITurretUpgrade.java new file mode 100644 index 0000000..8ad25f6 --- /dev/null +++ b/src/main/java/icbm/gangshao/ITurretUpgrade.java @@ -0,0 +1,8 @@ +package icbm.gangshao; + +import icbm.gangshao.turret.upgrades.ItPaoTaiUpgrades; +import net.minecraft.item.ItemStack; + +public interface ITurretUpgrade { + ItPaoTaiUpgrades.TurretUpgradeType getType(final ItemStack p0); +} diff --git a/src/main/java/icbm/gangshao/ProjectileType.java b/src/main/java/icbm/gangshao/ProjectileType.java new file mode 100644 index 0000000..68301cc --- /dev/null +++ b/src/main/java/icbm/gangshao/ProjectileType.java @@ -0,0 +1,9 @@ +package icbm.gangshao; + +public enum ProjectileType { + UNKNOWN, + CONVENTIONAL, + RAILGUN, + MISSILE, + EXPLOSIVE; +} diff --git a/src/main/java/icbm/gangshao/SlotTurret.java b/src/main/java/icbm/gangshao/SlotTurret.java new file mode 100644 index 0000000..2329130 --- /dev/null +++ b/src/main/java/icbm/gangshao/SlotTurret.java @@ -0,0 +1,22 @@ +package icbm.gangshao; + +import icbm.gangshao.access.AccessLevel; +import icbm.gangshao.terminal.ITerminal; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import universalelectricity.prefab.SlotSpecific; + +public class SlotTurret extends SlotSpecific { + public SlotTurret(final IInventory par2iInventory, final int par3, + final int par4, final int par5, + final Class... validClasses) { + super(par2iInventory, par3, par4, par5, validClasses); + } + + public boolean canTakeStack(final EntityPlayer entityPlayer) { + return super.inventory instanceof ITerminal && + ((ITerminal) super.inventory) + .getUserAccess(entityPlayer.getDisplayName()) + .ordinal() > AccessLevel.NONE.ordinal(); + } +} diff --git a/src/main/java/icbm/gangshao/access/AccessLevel.java b/src/main/java/icbm/gangshao/access/AccessLevel.java new file mode 100644 index 0000000..5162a5c --- /dev/null +++ b/src/main/java/icbm/gangshao/access/AccessLevel.java @@ -0,0 +1,30 @@ +package icbm.gangshao.access; + +public enum AccessLevel { + NONE("None"), + USER("User"), + ADMIN("Admin"), + OWNER("Owner"); + + public String displayName; + + private AccessLevel(final String name) { this.displayName = name; } + + public static AccessLevel get(final Object ob) { + if (ob instanceof String) { + for (final AccessLevel access : values()) { + if (access.displayName.equalsIgnoreCase((String)ob) || + access.name().equalsIgnoreCase((String)ob)) { + return access; + } + } + } + if (ob instanceof Integer) { + final int i = (int)ob % values().length; + if (i >= 0 && i < values().length) { + return values()[i]; + } + } + return AccessLevel.NONE; + } +} diff --git a/src/main/java/icbm/gangshao/access/GlobalAccessLoader.java b/src/main/java/icbm/gangshao/access/GlobalAccessLoader.java new file mode 100644 index 0000000..8d120f9 --- /dev/null +++ b/src/main/java/icbm/gangshao/access/GlobalAccessLoader.java @@ -0,0 +1,50 @@ +package icbm.gangshao.access; + +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.event.FMLServerStartingEvent; +import icbm.gangshao.saving.INbtSave; +import icbm.gangshao.saving.SaveManager; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.MinecraftForge; + +public class GlobalAccessLoader implements INbtSave { + public static boolean isInitialized; + public static GlobalAccessLoader intance; + public static final String SAVE_NAME = "Global_Access_List"; + + public void initiate() { + if (!GlobalAccessLoader.isInitialized) { + MinecraftForge.EVENT_BUS.register((Object)this); + SaveManager.intance.registerNbtSave(this); + GlobalAccessLoader.isInitialized = true; + } + } + + @Mod.EventHandler + public void serverStarting(final FMLServerStartingEvent event) { + if (!GlobalAccessManager.hasLoaded) { + GlobalAccessManager.getMasterSaveFile(); + } + } + + @Override + public String saveFileName() { + return "global-access-list"; + } + + @Override + public NBTTagCompound getSaveData() { + return GlobalAccessManager.getMasterSaveFile(); + } + + @Override + public boolean shouldSave(final boolean isServer) { + return isServer && GlobalAccessManager.hasLoaded && + !GlobalAccessManager.loading; + } + + static { + GlobalAccessLoader.isInitialized = false; + GlobalAccessLoader.intance = new GlobalAccessLoader(); + } +} diff --git a/src/main/java/icbm/gangshao/access/GlobalAccessManager.java b/src/main/java/icbm/gangshao/access/GlobalAccessManager.java new file mode 100644 index 0000000..9db3c30 --- /dev/null +++ b/src/main/java/icbm/gangshao/access/GlobalAccessManager.java @@ -0,0 +1,135 @@ +package icbm.gangshao.access; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import net.minecraft.nbt.NBTTagCompound; +import universalelectricity.prefab.flag.NBTFileLoader; + +public class GlobalAccessManager { + private static Map> globalUserLists; + private static NBTTagCompound masterSaveNbt; + public static boolean loading; + public static boolean hasLoaded; + public static boolean needsSaving; + + public static List getOrCreateList(final String name, + final String owner) { + if (name.toCharArray().length < 5 || owner.isEmpty() || + name.startsWith("Default#")) { + return null; + } + List list = getList(name); + if (list == null) { + list = createList(name, owner); + } + return list; + } + + public static List getUsersLists(final String username) { + final List lists = new ArrayList<>(); + for (final Map.Entry> entry : + GlobalAccessManager.globalUserLists.entrySet()) { + final List list = entry.getValue(); + for (final UserAccess access : list) { + if (access.username.equalsIgnoreCase(username) && + access.level.ordinal() >= AccessLevel.ADMIN.ordinal()) { + lists.add(entry.getKey()); + break; + } + } + } + return lists; + } + + public static List createList(final String name, + final String owner) { + final List list = new ArrayList<>(); + list.add(new UserAccess(owner, AccessLevel.OWNER, true)); + GlobalAccessManager.globalUserLists.put(name, list); + saveList(name, list); + GlobalAccessManager.needsSaving = true; + return list; + } + + public static List getList(final String name) { + if (GlobalAccessManager.globalUserLists.containsKey(name)) { + return GlobalAccessManager.globalUserLists.get(name); + } + final List list = loadList(name); + if (list != null) { + GlobalAccessManager.globalUserLists.put(name, list); + } + return list; + } + + public boolean addUser(final String listName, final UserAccess user) { + if (user == null) { + return false; + } + List userList = getList(listName); + if (userList != null) { + if (userList.contains(user)) { + userList = UserAccess.removeUserAccess(user.username, userList); + } + if (userList.add(user)) { + GlobalAccessManager.globalUserLists.put(listName, userList); + saveList(listName, userList); + return GlobalAccessManager.needsSaving = true; + } + } + return false; + } + + public boolean removeUser(final String listName, final UserAccess user) { + if (user == null) { + return false; + } + List userList = getList(listName); + if (userList != null && userList.contains(user)) { + userList = UserAccess.removeUserAccess(user.username, userList); + GlobalAccessManager.globalUserLists.put(listName, userList); + saveList(listName, userList); + return GlobalAccessManager.needsSaving = true; + } + return false; + } + + private static List loadList(final String name) { + final NBTTagCompound masterSave = getMasterSaveFile(); + if (masterSave != null && masterSave.hasKey(name)) { + final NBTTagCompound accessSave = masterSave.getCompoundTag(name); + return UserAccess.readListFromNBT(accessSave, "Users"); + } + return null; + } + + private static void saveList(final String name, final List list) { + final NBTTagCompound masterSave = getMasterSaveFile(); + if (masterSave != null) { + final NBTTagCompound accessSave = masterSave.getCompoundTag(name); + UserAccess.writeListToNBT(accessSave, list); + masterSave.setTag(name, accessSave); + } + } + + public static NBTTagCompound getMasterSaveFile() { + if (GlobalAccessManager.masterSaveNbt.hasNoTags() && + !GlobalAccessManager.loading) { + GlobalAccessManager.hasLoaded = true; + GlobalAccessManager.loading = true; + NBTFileLoader.loadData("Global_Access_List"); + GlobalAccessManager.loading = false; + } + return GlobalAccessManager.masterSaveNbt; + } + + static { + GlobalAccessManager.globalUserLists = new HashMap<>(); + GlobalAccessManager.masterSaveNbt = new NBTTagCompound(); + GlobalAccessManager.loading = false; + GlobalAccessManager.hasLoaded = false; + GlobalAccessManager.needsSaving = false; + } +} diff --git a/src/main/java/icbm/gangshao/access/UserAccess.java b/src/main/java/icbm/gangshao/access/UserAccess.java new file mode 100644 index 0000000..a6252ae --- /dev/null +++ b/src/main/java/icbm/gangshao/access/UserAccess.java @@ -0,0 +1,78 @@ +package icbm.gangshao.access; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +public class UserAccess { + public String username; + public AccessLevel level; + public boolean shouldSave; + + public UserAccess(final String user, final AccessLevel level, + final boolean save) { + this.username = user; + this.level = level; + this.shouldSave = save; + } + + public NBTTagCompound writeToNBT(final NBTTagCompound nbt) { + nbt.setString("username", this.username); + nbt.setInteger("ID", this.level.ordinal()); + return nbt; + } + + public void readFromNBT(final NBTTagCompound nbt) { + this.username = nbt.getString("username"); + this.level = AccessLevel.get(nbt.getInteger("ID")); + } + + public static UserAccess loadFromNBT(final NBTTagCompound nbt) { + final UserAccess access = new UserAccess("", AccessLevel.NONE, true); + access.readFromNBT(nbt); + return access; + } + + public static List readListFromNBT(final NBTTagCompound nbt, + final String tagName) { + final NBTTagList userList = nbt.getTagList(tagName, 10); + final List users = new ArrayList<>(); + for (int i = 0; i < userList.tagCount(); ++i) { + final NBTTagCompound var4 = (NBTTagCompound)userList.getCompoundTagAt(i); + users.add(loadFromNBT(var4)); + } + return users; + } + + public static void writeListToNBT(final NBTTagCompound save, + final List users) { + final NBTTagList usersTag = new NBTTagList(); + for (int player = 0; player < users.size(); ++player) { + final UserAccess access = users.get(player); + if (access != null && access.shouldSave) { + final NBTTagCompound accessData = new NBTTagCompound(); + access.writeToNBT(accessData); + usersTag.appendTag((NBTBase)accessData); + } + } + save.setTag("Users", (NBTBase)usersTag); + } + + public static List + removeUserAccess(final String player, final List users) { + final List removeList = new ArrayList(); + final List returnList = users; + for (int i = 0; i < users.size(); ++i) { + final UserAccess ref = (UserAccess)users.get(i); + if (ref.username.equalsIgnoreCase(player)) { + removeList.add(ref); + } + } + if (removeList != null && removeList.size() > 0) { + returnList.removeAll(removeList); + } + return returnList; + } +} diff --git a/src/main/java/icbm/gangshao/container/ContainerTerminal.java b/src/main/java/icbm/gangshao/container/ContainerTerminal.java new file mode 100644 index 0000000..8a8173a --- /dev/null +++ b/src/main/java/icbm/gangshao/container/ContainerTerminal.java @@ -0,0 +1,26 @@ +package icbm.gangshao.container; + +import net.minecraft.inventory.IInventory; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import icbm.gangshao.terminal.TileEntityTerminal; +import net.minecraft.inventory.Container; + +public abstract class ContainerTerminal extends Container +{ + private TileEntityTerminal tileEntity; + + public ContainerTerminal(final InventoryPlayer inventoryPlayer, final TileEntityTerminal tileEntity) { + this.tileEntity = tileEntity; + this.tileEntity.playersUsing.add(inventoryPlayer.player); + } + + public void onContainerClosed(final EntityPlayer par1EntityPlayer) { + this.tileEntity.playersUsing.remove(par1EntityPlayer); + super.onContainerClosed(par1EntityPlayer); + } + + public boolean canInteractWith(final EntityPlayer par1EntityPlayer) { + return !(this.tileEntity instanceof IInventory) || ((IInventory)this.tileEntity).isUseableByPlayer(par1EntityPlayer); + } +} diff --git a/src/main/java/icbm/gangshao/container/ContainerTurretPlatform.java b/src/main/java/icbm/gangshao/container/ContainerTurretPlatform.java new file mode 100644 index 0000000..f6b2e30 --- /dev/null +++ b/src/main/java/icbm/gangshao/container/ContainerTurretPlatform.java @@ -0,0 +1,98 @@ +package icbm.gangshao.container; + +import icbm.gangshao.IAmmunition; +import icbm.gangshao.ITurretUpgrade; +import icbm.gangshao.SlotTurret; +import icbm.gangshao.access.AccessLevel; +import icbm.gangshao.platform.TPlatform; +import icbm.gangshao.turret.ItemAmmo; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import universalelectricity.core.item.IItemElectric; + +public class ContainerTurretPlatform extends ContainerTerminal { + private TPlatform tileEntity; + + public ContainerTurretPlatform(final InventoryPlayer inventoryPlayer, + final TPlatform tileEntity) { + super(inventoryPlayer, tileEntity); + this.tileEntity = tileEntity; + for (int row = 0; row < 3; ++row) { + for (int column = 0; column < 4; ++column) { + this.addSlotToContainer((Slot) new SlotTurret( + (IInventory)tileEntity, column + row * 4, 8 + column * 18, + 40 + row * 18, + new Class[] {IAmmunition.class, IItemElectric.class})); + } + } + for (int i = 0; i < 4; ++i) { + this.addSlotToContainer( + (Slot) new SlotTurret((IInventory)tileEntity, i + 12, 89 + i * 18, 77, + new Class[] {ITurretUpgrade.class})); + } + for (int row = 0; row < 3; ++row) { + for (int slot = 0; slot < 9; ++slot) { + this.addSlotToContainer(new Slot((IInventory)inventoryPlayer, + slot + row * 9 + 9, 8 + slot * 18, + 97 + row * 18)); + } + } + for (int row = 0; row < 9; ++row) { + this.addSlotToContainer( + new Slot((IInventory)inventoryPlayer, row, 8 + row * 18, 155)); + } + } + + public ItemStack transferStackInSlot(final EntityPlayer entityPlayer, + final int slotID) { + ItemStack var2 = null; + final Slot slot = (Slot) super.inventorySlots.get(slotID); + if (slot != null && slot.getHasStack()) { + final ItemStack itemStack = slot.getStack(); + var2 = itemStack.copy(); + if (slotID > this.tileEntity.containingItems.length - 1) { + if (this.tileEntity.getUserAccess(entityPlayer.getDisplayName()) + .ordinal() > AccessLevel.NONE.ordinal()) { + if (itemStack.getItem() instanceof ItemAmmo || + itemStack.getItem() instanceof IItemElectric) { + if (!this.mergeItemStack(itemStack, 0, 12, false)) { + return null; + } + } else if (itemStack.getItem() instanceof ITurretUpgrade && + !this.mergeItemStack( + itemStack, 12, this.tileEntity.containingItems.length, + false)) { + return null; + } + } else if (slotID < this.tileEntity.containingItems.length + 27) { + if (!this.mergeItemStack( + itemStack, this.tileEntity.containingItems.length + 27, + this.tileEntity.containingItems.length + 36, false)) { + return null; + } + } else if (!this.mergeItemStack( + itemStack, this.tileEntity.containingItems.length, + this.tileEntity.containingItems.length + 27, false)) { + return null; + } + } else if (!this.mergeItemStack( + itemStack, this.tileEntity.containingItems.length, + 36 + this.tileEntity.containingItems.length, false)) { + return null; + } + if (itemStack.stackSize == 0) { + slot.putStack((ItemStack)null); + } else { + slot.onSlotChanged(); + } + if (itemStack.stackSize == var2.stackSize) { + return null; + } + slot.onPickupFromSlot(entityPlayer, itemStack); + } + return var2; + } +} diff --git a/src/main/java/icbm/gangshao/damage/EntityTileDamagable.java b/src/main/java/icbm/gangshao/damage/EntityTileDamagable.java new file mode 100644 index 0000000..4efb721 --- /dev/null +++ b/src/main/java/icbm/gangshao/damage/EntityTileDamagable.java @@ -0,0 +1,189 @@ +package icbm.gangshao.damage; + +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.gangshao.turret.TTurretBase; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.PotionEffect; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; + +public class EntityTileDamagable + extends EntityLiving implements IEntityAdditionalSpawnData { + private TTurretBase host; + + public EntityTileDamagable(final World par1World) { + super(par1World); + this.isImmuneToFire = true; + this.setSize(1.1f, 1.1f); + } + + public EntityTileDamagable(final TTurretBase host) { + this(host.getWorldObj()); + this.setPosition(host.xCoord + 0.5, (double)host.yCoord, host.zCoord + 0.5); + this.host = host; + } + + @Override + public boolean attackEntityFrom(final DamageSource source, + final float amount) { + return !(this.host instanceof IHealthTile) || + this.host.onDamageTaken(source, (int)amount); + } + + @Override + public boolean isPotionApplicable(final PotionEffect par1PotionEffect) { + return par1PotionEffect != null && this.host instanceof IHealthTile && + this.host.canApplyPotion(par1PotionEffect); + } + + // public void addPotionEffect(final PotionEffect par1PotionEffect) { + // if (this.isPotionApplicable(par1PotionEffect)) { + // if (this.isPotionActive(par1PotionEffect.getPotionID())) { + // //((PotionEffect)this.activePotionsMap.get( + // // par1PotionEffect.getPotionID())) + // // .combine(par1PotionEffect); + // //this.func_70695_b((PotionEffect)this.activePotionsMap.get( + // // par1PotionEffect.getPotionID())); + // } else { + // ((EntityLivingBase)this) + // .activePotionsMap.put(par1PotionEffect.getPotionID(), + // par1PotionEffect); + // this.onNewPotionEffect(par1PotionEffect); + // } + // } + // } + + @Override + public String getCustomNameTag() { + if (this.host == null) { + return "EntityTileTarget"; + } + if (this.host.getPlatform() != null) { + return this.host.getPlatform().getInventoryName(); + } + return this.host.getName(); + } + + @Override + public void writeSpawnData(final ByteBuf data) { + if (this.host != null) { + data.writeInt(this.host.xCoord); + data.writeInt(this.host.yCoord); + data.writeInt(this.host.zCoord); + } + } + + @Override + public void readSpawnData(final ByteBuf data) { + try { + final TileEntity tileEntity = + ((Entity)this) + .worldObj.getTileEntity(data.readInt(), data.readInt(), + data.readInt()); + if (tileEntity instanceof TTurretBase) { + this.host = (TTurretBase)tileEntity; + } + } catch (final Exception e) { + e.printStackTrace(); + } + } + + @Override + public void onUpdate() { + if (!((Entity)this).worldObj.isRemote) { + if (this.host == null || this.host.isInvalid()) { + this.setDead(); + } else if (this.host instanceof IHealthTile && !this.host.isAlive()) { + this.setDead(); + } else { + this.updatePotionEffects(); + this.setPosition(this.host.xCoord + 0.5, (double)this.host.yCoord, + this.host.zCoord + 0.5); + } + } + } + + @Override + public void readEntityFromNBT(final NBTTagCompound nbttagcompound) {} + + @Override + public void moveEntity(final double par1, final double par3, + final double par5) {} + + @Override + public void writeEntityToNBT(final NBTTagCompound nbttagcompound) {} + + @Override + protected boolean canTriggerWalking() { + return false; + } + + @Override + public AxisAlignedBB getCollisionBox(final Entity par1Entity) { + return AxisAlignedBB.getBoundingBox( + ((Entity)this).posX - 0.6, ((Entity)this).posY - 0.6, + ((Entity)this).posZ - 0.6, ((Entity)this).posX + 0.6, + ((Entity)this).posY + 0.6, ((Entity)this).posZ + 0.6); + } + + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean isInRangeToRender3d(double x, double y, double z) { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean isInRangeToRenderDist(final double par1) { + return false; + } + + @Override + + public void setVelocity(final double par1, final double par3, + final double par5) {} + + @Override + public boolean isInsideOfMaterial(final Material par1Material) { + return false; + } + + @Override + public boolean interact(final EntityPlayer player) { + if (this.host != null && player != null) { + final Block block = + ((Entity)this) + .worldObj.getBlock(this.host.xCoord, this.host.yCoord, + this.host.zCoord); + if (block != null) { + return block.onBlockActivated(((Entity)this).worldObj, this.host.xCoord, + this.host.yCoord, this.host.zCoord, + player, 0, 0.0f, 0.0f, 0.0f); + } + } + return false; + } + + // TODO: WTF + // @Override + // public float getMaxHealth() { + // return (this.host != null && this.host instanceof IHealthTile) + // ? this.host.getMaxHealth() + // : 100; + // } +} diff --git a/src/main/java/icbm/gangshao/damage/IHealthTile.java b/src/main/java/icbm/gangshao/damage/IHealthTile.java new file mode 100644 index 0000000..64af432 --- /dev/null +++ b/src/main/java/icbm/gangshao/damage/IHealthTile.java @@ -0,0 +1,18 @@ +package icbm.gangshao.damage; + +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.DamageSource; + +public interface IHealthTile { + boolean onDamageTaken(final DamageSource p0, final int p1); + + boolean isAlive(); + + int getHealth(); + + void setHealth(final int p0, final boolean p1); + + int getMaxHealth(); + + boolean canApplyPotion(final PotionEffect p0); +} diff --git a/src/main/java/icbm/gangshao/damage/TileDamageSource.java b/src/main/java/icbm/gangshao/damage/TileDamageSource.java new file mode 100644 index 0000000..9848509 --- /dev/null +++ b/src/main/java/icbm/gangshao/damage/TileDamageSource.java @@ -0,0 +1,28 @@ +package icbm.gangshao.damage; + +import icbm.gangshao.turret.TTurretBase; +import net.minecraft.entity.Entity; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EntityDamageSource; + +public class TileDamageSource extends EntityDamageSource { + public TileDamageSource(final String damageName, + final TTurretBase tileEntity) { + super(damageName, (Entity)tileEntity.getDamageEntity()); + } + + public static TileDamageSource doBulletDamage(final TTurretBase tileEntity) { + return (TileDamageSource) new TileDamageSource("bullet", tileEntity) + .setProjectile(); + } + + public static TileDamageSource doLaserDamage(final TTurretBase tileEntity) { + return (TileDamageSource) new TileDamageSource("laser", tileEntity) + .setDamageBypassesArmor() + .setProjectile(); + } + + public DamageSource setDamageBypassesArmor() { + return super.setDamageBypassesArmor(); + } +} diff --git a/src/main/java/icbm/gangshao/muoxing/MLeiShe.java b/src/main/java/icbm/gangshao/muoxing/MLeiShe.java new file mode 100644 index 0000000..8302278 --- /dev/null +++ b/src/main/java/icbm/gangshao/muoxing/MLeiShe.java @@ -0,0 +1,329 @@ +package icbm.gangshao.muoxing; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class MLeiShe extends ModelBase { + ModelRenderer basePlate; + ModelRenderer leftMount; + ModelRenderer rightMount; + ModelRenderer body; + ModelRenderer bodyTop; + ModelRenderer bodyRight; + ModelRenderer bodyLeft; + ModelRenderer leftBarrel; + ModelRenderer rightBarrel; + ModelRenderer l1; + ModelRenderer l2; + ModelRenderer l3; + ModelRenderer l4; + ModelRenderer l5; + ModelRenderer r1; + ModelRenderer r2; + ModelRenderer r3; + ModelRenderer r4; + ModelRenderer r5; + ModelRenderer lCap; + ModelRenderer rCap; + ModelRenderer Hat; + ModelRenderer LowerHat; + ModelRenderer BatteryPack; + ModelRenderer MiddleWire; + ModelRenderer BatWire; + ModelRenderer HatWire; + ModelRenderer Details; + ModelRenderer RightFootStrength; + ModelRenderer LeftFootStrength; + ModelRenderer FrontDetail; + ModelRenderer LeftFootBase; + ModelRenderer RightFootBase; + ModelRenderer lEar1; + ModelRenderer lEar2; + ModelRenderer rEar1; + ModelRenderer rEar2; + + public MLeiShe() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.basePlate = new ModelRenderer((ModelBase) this, 0, 67)) + .addBox(-5.5f, 0.0f, -5.5f, 11, 1, 11); + this.basePlate.setRotationPoint(0.0f, 23.0f, 0.0f); + this.basePlate.setTextureSize(128, 128); + this.basePlate.mirror = true; + this.setRotation(this.basePlate, 0.0f, 0.0f, 0.0f); + (this.leftMount = new ModelRenderer((ModelBase) this, 0, 53)) + .addBox(4.0f, -8.0f, -2.0f, 1, 8, 4); + this.leftMount.setRotationPoint(0.0f, 23.0f, 0.0f); + this.leftMount.setTextureSize(128, 128); + this.leftMount.mirror = true; + this.setRotation(this.leftMount, 0.0f, 0.0f, 0.0f); + (this.rightMount = new ModelRenderer((ModelBase) this, 11, 53)) + .addBox(-5.0f, -8.0f, -2.0f, 1, 8, 4); + this.rightMount.setRotationPoint(0.0f, 23.0f, 0.0f); + this.rightMount.setTextureSize(128, 128); + this.rightMount.mirror = true; + this.setRotation(this.rightMount, 0.0f, 0.0f, 0.0f); + (this.body = new ModelRenderer((ModelBase) this, 0, 37)) + .addBox(-3.0f, -2.8f, -4.0f, 6, 5, 9); + this.body.setRotationPoint(0.0f, 17.0f, 0.0f); + this.body.setTextureSize(128, 128); + this.body.mirror = true; + this.setRotation(this.body, 0.0f, 0.0f, 0.0f); + (this.bodyTop = new ModelRenderer((ModelBase) this, 36, 51)) + .addBox(-2.0f, -4.0f, -3.0f, 4, 2, 7); + this.bodyTop.setRotationPoint(0.0f, 17.0f, 0.0f); + this.bodyTop.setTextureSize(128, 128); + this.bodyTop.mirror = true; + this.setRotation(this.bodyTop, 0.0f, 0.0f, 0.0f); + (this.bodyRight = new ModelRenderer((ModelBase) this, 31, 37)) + .addBox(-4.0f, -2.5f, -3.0f, 1, 4, 7); + this.bodyRight.setRotationPoint(0.0f, 17.0f, 0.0f); + this.bodyRight.setTextureSize(128, 128); + this.bodyRight.mirror = true; + this.setRotation(this.bodyRight, 0.0f, 0.0f, 0.0f); + (this.bodyLeft = new ModelRenderer((ModelBase) this, 48, 37)) + .addBox(3.0f, -2.5f, -3.0f, 1, 4, 7); + this.bodyLeft.setRotationPoint(0.0f, 17.0f, 0.0f); + this.bodyLeft.setTextureSize(128, 128); + this.bodyLeft.mirror = true; + this.setRotation(this.bodyLeft, 0.0f, 0.0f, 0.0f); + (this.leftBarrel = new ModelRenderer((ModelBase) this, 29, 81)) + .addBox(2.0f, -1.0f, -17.0f, 1, 1, 13); + this.leftBarrel.setRotationPoint(0.0f, 17.0f, 0.0f); + this.leftBarrel.setTextureSize(128, 128); + this.leftBarrel.mirror = true; + this.setRotation(this.leftBarrel, 0.0f, 0.0f, 0.0f); + (this.rightBarrel = new ModelRenderer((ModelBase) this, 0, 81)) + .addBox(-3.0f, -1.0f, -17.0f, 1, 1, 13); + this.rightBarrel.setRotationPoint(0.0f, 17.0f, 0.0f); + this.rightBarrel.setTextureSize(128, 128); + this.rightBarrel.mirror = true; + this.setRotation(this.rightBarrel, 0.0f, 0.0f, 0.0f); + (this.l1 = new ModelRenderer((ModelBase) this, 1, 14)) + .addBox(0.9f, -2.0f, -6.0f, 3, 3, 3); + this.l1.setRotationPoint(0.0f, 17.0f, 0.0f); + this.l1.setTextureSize(128, 128); + this.l1.mirror = true; + this.setRotation(this.l1, 0.0f, 0.0f, 0.0f); + (this.l2 = new ModelRenderer((ModelBase) this, 9, 28)) + .addBox(-1.5f, -1.5f, 0.0f, 3, 3, 1); + this.l2.setRotationPoint(2.5f, 16.5f, -8.0f); + this.l2.setTextureSize(128, 128); + this.l2.mirror = true; + this.setRotation(this.l2, 0.0f, 0.0f, 0.0f); + (this.l3 = new ModelRenderer((ModelBase) this, 9, 28)) + .addBox(-1.5f, -1.5f, 0.0f, 3, 3, 1); + this.l3.setRotationPoint(2.5f, 16.5f, -10.0f); + this.l3.setTextureSize(128, 128); + this.l3.mirror = true; + this.setRotation(this.l3, 0.0f, 0.0f, 0.0f); + (this.l4 = new ModelRenderer((ModelBase) this, 9, 28)) + .addBox(-1.5f, -1.5f, 0.0f, 3, 3, 1); + this.l4.setRotationPoint(2.5f, 16.5f, -12.0f); + this.l4.setTextureSize(128, 128); + this.l4.mirror = true; + this.setRotation(this.l4, 0.0f, 0.0f, 0.0f); + (this.l5 = new ModelRenderer((ModelBase) this, 9, 28)) + .addBox(-1.5f, -1.5f, 0.0f, 3, 3, 1); + this.l5.setRotationPoint(2.5f, 16.5f, -14.0f); + this.l5.setTextureSize(128, 128); + this.l5.mirror = true; + this.setRotation(this.l5, 0.0f, 0.0f, 0.0f); + (this.r1 = new ModelRenderer((ModelBase) this, 14, 14)) + .addBox(-3.9f, -2.0f, -6.0f, 3, 3, 3); + this.r1.setRotationPoint(0.0f, 17.0f, 0.0f); + this.r1.setTextureSize(128, 128); + this.r1.mirror = true; + this.setRotation(this.r1, 0.0f, 0.0f, 0.0f); + (this.r2 = new ModelRenderer((ModelBase) this, 9, 28)) + .addBox(-1.5f, -1.5f, 0.0f, 3, 3, 1); + this.r2.setRotationPoint(-2.5f, 16.5f, -8.0f); + this.r2.setTextureSize(128, 128); + this.r2.mirror = true; + this.setRotation(this.r2, 0.0f, 0.0f, 0.0f); + (this.r3 = new ModelRenderer((ModelBase) this, 9, 28)) + .addBox(-1.5f, -1.5f, -2.0f, 3, 3, 1); + this.r3.setRotationPoint(-2.5f, 16.5f, -8.0f); + this.r3.setTextureSize(128, 128); + this.r3.mirror = true; + this.setRotation(this.r3, 0.0f, 0.0f, 0.0f); + (this.r4 = new ModelRenderer((ModelBase) this, 9, 28)) + .addBox(-1.5f, -1.5f, -4.0f, 3, 3, 1); + this.r4.setRotationPoint(-2.5f, 16.5f, -8.0f); + this.r4.setTextureSize(128, 128); + this.r4.mirror = true; + this.setRotation(this.r4, 0.0f, 0.0f, 0.0f); + (this.r5 = new ModelRenderer((ModelBase) this, 9, 28)) + .addBox(-1.5f, -1.5f, -6.0f, 3, 3, 1); + this.r5.setRotationPoint(-2.5f, 16.5f, -8.0f); + this.r5.setTextureSize(128, 128); + this.r5.mirror = true; + this.setRotation(this.r5, 0.0f, 0.0f, 0.0f); + (this.lCap = new ModelRenderer((ModelBase) this, 33, 25)) + .addBox(1.0f, -2.0f, -20.0f, 3, 3, 4); + this.lCap.setRotationPoint(0.0f, 17.0f, 0.0f); + this.lCap.setTextureSize(128, 128); + this.lCap.mirror = true; + this.setRotation(this.lCap, 0.0f, 0.0f, 0.0f); + (this.rCap = new ModelRenderer((ModelBase) this, 18, 25)) + .addBox(-4.0f, -2.0f, -20.0f, 3, 3, 4); + this.rCap.setRotationPoint(0.0f, 17.0f, 0.0f); + this.rCap.setTextureSize(128, 128); + this.rCap.mirror = true; + this.setRotation(this.rCap, 0.0f, 0.0f, 0.0f); + (this.Hat = new ModelRenderer((ModelBase) this, 28, 0)) + .addBox(0.0f, 0.0f, 0.0f, 3, 1, 7); + this.Hat.setRotationPoint(-1.5f, 12.0f, -2.0f); + this.Hat.setTextureSize(128, 128); + this.Hat.mirror = true; + this.setRotation(this.Hat, 0.0f, 0.0f, 0.0f); + (this.LowerHat = new ModelRenderer((ModelBase) this, 50, 0)) + .addBox(0.0f, 0.0f, 0.0f, 3, 1, 1); + this.LowerHat.setRotationPoint(-1.5f, 13.0f, 4.0f); + this.LowerHat.setTextureSize(128, 128); + this.LowerHat.mirror = true; + this.setRotation(this.LowerHat, 0.0f, 0.0f, 0.0f); + (this.BatteryPack = new ModelRenderer((ModelBase) this, 50, 3)) + .addBox(0.0f, 0.0f, 0.0f, 4, 4, 1); + this.BatteryPack.setRotationPoint(-2.0f, 15.0f, 5.0f); + this.BatteryPack.setTextureSize(128, 128); + this.BatteryPack.mirror = true; + this.setRotation(this.BatteryPack, 0.0f, 0.0f, 0.0f); + (this.MiddleWire = new ModelRenderer((ModelBase) this, 64, 0)) + .addBox(0.0f, 0.0f, 0.0f, 1, 4, 1); + this.MiddleWire.setRotationPoint(-0.5f, 13.0f, 7.0f); + this.MiddleWire.setTextureSize(128, 128); + this.MiddleWire.mirror = true; + this.setRotation(this.MiddleWire, 0.0f, 0.0f, 0.0f); + (this.BatWire = new ModelRenderer((ModelBase) this, 64, 6)) + .addBox(0.0f, 0.0f, 0.0f, 1, 1, 1); + this.BatWire.setRotationPoint(-0.5f, 16.0f, 6.0f); + this.BatWire.setTextureSize(128, 128); + this.BatWire.mirror = true; + this.setRotation(this.BatWire, 0.0f, 0.0f, 0.0f); + (this.HatWire = new ModelRenderer((ModelBase) this, 69, 0)) + .addBox(0.0f, 0.0f, 0.0f, 1, 1, 2); + this.HatWire.setRotationPoint(-0.5f, 13.0f, 5.0f); + this.HatWire.setTextureSize(128, 128); + this.HatWire.mirror = true; + this.setRotation(this.HatWire, 0.0f, 0.0f, 0.0f); + (this.Details = new ModelRenderer((ModelBase) this, 28, 10)) + .addBox(0.0f, 0.0f, 0.0f, 3, 1, 1); + this.Details.setRotationPoint(-1.5f, 22.0f, -5.5f); + this.Details.setTextureSize(128, 128); + this.Details.mirror = true; + this.setRotation(this.Details, 0.0f, 0.0f, 0.0f); + (this.RightFootStrength = new ModelRenderer((ModelBase) this, 28, 14)) + .addBox(0.0f, 0.0f, 0.0f, 1, 2, 4); + this.RightFootStrength.setRotationPoint(3.0f, 20.0f, -2.0f); + this.RightFootStrength.setTextureSize(128, 128); + this.RightFootStrength.mirror = true; + this.setRotation(this.RightFootStrength, 0.0f, 0.0f, 0.0f); + (this.LeftFootStrength = new ModelRenderer((ModelBase) this, 28, 14)) + .addBox(0.0f, 0.0f, 0.0f, 1, 2, 4); + this.LeftFootStrength.setRotationPoint(-4.0f, 20.0f, -2.0f); + this.LeftFootStrength.setTextureSize(128, 128); + this.LeftFootStrength.mirror = true; + this.setRotation(this.LeftFootStrength, 0.0f, 0.0f, 0.0f); + (this.FrontDetail = new ModelRenderer((ModelBase) this, 40, 10)) + .addBox(0.0f, 0.0f, 0.0f, 3, 3, 1); + this.FrontDetail.setRotationPoint(-1.5f, 21.0f, -6.5f); + this.FrontDetail.setTextureSize(128, 128); + this.FrontDetail.mirror = true; + this.setRotation(this.FrontDetail, 0.0f, 0.0f, 0.0f); + (this.LeftFootBase = new ModelRenderer((ModelBase) this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 3, 1, 6); + this.LeftFootBase.setRotationPoint(-5.5f, 22.0f, -3.0f); + this.LeftFootBase.setTextureSize(128, 128); + this.LeftFootBase.mirror = true; + this.setRotation(this.LeftFootBase, 0.0f, 0.0f, 0.0f); + (this.RightFootBase = new ModelRenderer((ModelBase) this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 3, 1, 6); + this.RightFootBase.setRotationPoint(2.5f, 22.0f, -3.0f); + this.RightFootBase.setTextureSize(128, 128); + this.RightFootBase.mirror = true; + this.setRotation(this.RightFootBase, 0.0f, 0.0f, 0.0f); + (this.lEar1 = new ModelRenderer((ModelBase) this, 28, 56)) + .addBox(2.0f, -5.0f, -4.0f, 1, 5, 1); + this.lEar1.setRotationPoint(0.0f, 17.0f, 5.0f); + this.lEar1.setTextureSize(128, 128); + this.lEar1.mirror = true; + this.setRotation(this.lEar1, -0.6632251f, 0.0f, 0.0f); + (this.lEar2 = new ModelRenderer((ModelBase) this, 28, 56)) + .addBox(2.0f, -5.0f, -4.0f, 1, 5, 1); + this.lEar2.setRotationPoint(0.0f, 17.0f, 0.0f); + this.lEar2.setTextureSize(128, 128); + this.lEar2.mirror = true; + this.setRotation(this.lEar2, -0.6632251f, 0.0f, 0.0f); + (this.rEar1 = new ModelRenderer((ModelBase) this, 23, 56)) + .addBox(-3.0f, -5.0f, -4.0f, 1, 5, 1); + this.rEar1.setRotationPoint(0.0f, 17.0f, 5.0f); + this.rEar1.setTextureSize(128, 128); + this.rEar1.mirror = true; + this.setRotation(this.rEar1, -0.6632251f, 0.0f, 0.0f); + (this.rEar2 = new ModelRenderer((ModelBase) this, 23, 56)) + .addBox(-3.0f, -5.0f, -4.0f, 1, 5, 1); + this.rEar2.setRotationPoint(0.0f, 17.0f, 0.0f); + this.rEar2.setTextureSize(128, 128); + this.rEar2.mirror = true; + this.setRotation(this.rEar2, -0.6632251f, 0.0f, 0.0f); + } + + public void renderYaw(final float f5) { + this.basePlate.render(f5); + this.leftMount.render(f5); + this.rightMount.render(f5); + this.Details.render(f5); + this.FrontDetail.render(f5); + this.RightFootStrength.render(f5); + this.LeftFootStrength.render(f5); + this.LeftFootBase.render(f5); + this.RightFootBase.render(f5); + } + + public void renderYawPitch(final float f5, final float rotation) { + this.body.render(f5); + this.bodyTop.render(f5); + this.bodyRight.render(f5); + this.bodyLeft.render(f5); + this.leftBarrel.render(f5); + this.rightBarrel.render(f5); + this.l1.render(f5); + this.r1.render(f5); + this.l2.rotateAngleZ = -rotation; + this.l2.render(f5); + this.l3.rotateAngleZ = -rotation; + this.l3.render(f5); + this.l4.rotateAngleZ = -rotation; + this.l4.render(f5); + this.l5.rotateAngleZ = -rotation; + this.l5.render(f5); + this.r2.rotateAngleZ = rotation; + this.r2.render(f5); + this.r3.rotateAngleZ = rotation; + this.r3.render(f5); + this.r4.rotateAngleZ = rotation; + this.r4.render(f5); + this.r5.rotateAngleZ = rotation; + this.r5.render(f5); + this.lCap.render(f5); + this.rCap.render(f5); + this.Hat.render(f5); + this.LowerHat.render(f5); + this.BatteryPack.render(f5); + this.MiddleWire.render(f5); + this.BatWire.render(f5); + this.HatWire.render(f5); + this.lEar1.render(f5); + this.lEar2.render(f5); + this.rEar1.render(f5); + this.rEar2.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/gangshao/muoxing/ModelAATurret.java b/src/main/java/icbm/gangshao/muoxing/ModelAATurret.java new file mode 100644 index 0000000..bc91003 --- /dev/null +++ b/src/main/java/icbm/gangshao/muoxing/ModelAATurret.java @@ -0,0 +1,371 @@ +package icbm.gangshao.muoxing; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class ModelAATurret extends ModelBase { + ModelRenderer rot1; + ModelRenderer radarNeck; + ModelRenderer radarBase; + ModelRenderer radarBack; + ModelRenderer radarRight; + ModelRenderer radarLeft; + ModelRenderer baseEdge4; + ModelRenderer base; + ModelRenderer baseEdge3; + ModelRenderer baseEdge1; + ModelRenderer baseEdge2; + ModelRenderer body; + ModelRenderer bodyFace; + ModelRenderer bodyTop; + ModelRenderer bodyEdge; + ModelRenderer bodyArmRight; + ModelRenderer bodyBack; + ModelRenderer bodyBubble; + ModelRenderer bodyArmLeft; + ModelRenderer cannonRight; + ModelRenderer cannonFaceRight; + ModelRenderer cannonBarrelTopRight; + ModelRenderer cannonBarrelBotRight; + ModelRenderer cannonCapTopRight; + ModelRenderer cannonCapBotRight; + ModelRenderer cannonInFaceRight; + ModelRenderer cannonBarrelCouple; + ModelRenderer cannonBarrelNeck; + ModelRenderer cannonCapBotLeft; + ModelRenderer cannonCapTopLeft; + ModelRenderer cannonFaceLeft; + ModelRenderer cannonLeft; + ModelRenderer cannonInFaceLeft; + ModelRenderer cannonBarrelNeckLeft; + ModelRenderer cannonBarrelBotLeft; + ModelRenderer cannonBarrelCoupleLeft; + ModelRenderer cannonBarrelTopLeft; + + public ModelAATurret() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.rot1 = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-8.0f, 0.0f, -8.0f, 16, 2, 18); + this.rot1.setRotationPoint(0.0f, 19.0f, 0.0f); + this.rot1.setTextureSize(128, 128); + this.rot1.mirror = true; + this.setRotation(this.rot1, 0.0f, 0.0f, 0.0f); + (this.radarNeck = new ModelRenderer((ModelBase)this, 69, 0)) + .addBox(-1.5f, -1.0f, -0.5f, 3, 3, 2); + this.radarNeck.setRotationPoint(0.0f, -3.0f, 2.0f); + this.radarNeck.setTextureSize(128, 128); + this.radarNeck.mirror = true; + this.setRotation(this.radarNeck, 0.0f, 0.0f, 0.0f); + (this.radarBase = new ModelRenderer((ModelBase)this, 81, 0)) + .addBox(-3.0f, -1.0f, -3.0f, 6, 1, 6); + this.radarBase.setRotationPoint(0.0f, 0.0f, 2.0f); + this.radarBase.setTextureSize(128, 128); + this.radarBase.mirror = true; + this.setRotation(this.radarBase, 0.0f, 0.0f, 0.0f); + (this.radarBack = new ModelRenderer((ModelBase)this, 68, 6)) + .addBox(-2.5f, -1.0f, -0.5f, 5, 3, 1); + this.radarBack.setRotationPoint(0.0f, -4.0f, 2.0f); + this.radarBack.setTextureSize(128, 128); + this.radarBack.mirror = true; + this.setRotation(this.radarBack, 0.0f, 0.0f, 0.0f); + (this.radarRight = new ModelRenderer((ModelBase)this, 68, 6)) + .addBox(0.5f, -1.0f, 1.5f, 5, 3, 1); + this.radarRight.setRotationPoint(0.0f, -4.0f, 2.0f); + this.radarRight.setTextureSize(128, 128); + this.radarRight.mirror = true; + this.setRotation(this.radarRight, 0.0f, 0.7853982f, 0.0f); + this.radarRight.mirror = false; + (this.radarLeft = new ModelRenderer((ModelBase)this, 68, 6)) + .addBox(-5.5f, -1.0f, 1.5f, 5, 3, 1); + this.radarLeft.setRotationPoint(0.0f, -4.0f, 2.0f); + this.radarLeft.setTextureSize(128, 128); + this.radarLeft.mirror = true; + this.setRotation(this.radarLeft, 0.0f, -0.7853982f, 0.0f); + (this.baseEdge4 = new ModelRenderer((ModelBase)this, 73, 70)) + .addBox(-7.0f, 0.0f, -11.0f, 14, 3, 2); + this.baseEdge4.setRotationPoint(0.0f, 21.0f, 0.0f); + this.baseEdge4.setTextureSize(128, 128); + this.baseEdge4.mirror = true; + this.setRotation(this.baseEdge4, 0.0f, 3.141593f, 0.0f); + (this.base = new ModelRenderer((ModelBase)this, 0, 70)) + .addBox(-9.0f, 0.0f, -9.0f, 18, 3, 18); + this.base.setRotationPoint(0.0f, 21.0f, 0.0f); + this.base.setTextureSize(128, 128); + this.base.mirror = true; + this.setRotation(this.base, 0.0f, 0.0f, 0.0f); + (this.baseEdge3 = new ModelRenderer((ModelBase)this, 73, 70)) + .addBox(-7.0f, 0.0f, -11.0f, 14, 3, 2); + this.baseEdge3.setRotationPoint(0.0f, 21.0f, 0.0f); + this.baseEdge3.setTextureSize(128, 128); + this.baseEdge3.mirror = true; + this.setRotation(this.baseEdge3, 0.0f, -1.570796f, 0.0f); + (this.baseEdge1 = new ModelRenderer((ModelBase)this, 73, 70)) + .addBox(-7.0f, 0.0f, -11.0f, 14, 3, 2); + this.baseEdge1.setRotationPoint(0.0f, 21.0f, 0.0f); + this.baseEdge1.setTextureSize(128, 128); + this.baseEdge1.mirror = true; + this.setRotation(this.baseEdge1, 0.0f, 0.0f, 0.0f); + (this.baseEdge2 = new ModelRenderer((ModelBase)this, 73, 70)) + .addBox(-7.0f, 0.0f, -11.0f, 14, 3, 2); + this.baseEdge2.setRotationPoint(0.0f, 21.0f, 0.0f); + this.baseEdge2.setTextureSize(128, 128); + this.baseEdge2.mirror = true; + this.setRotation(this.baseEdge2, 0.0f, 1.570796f, 0.0f); + (this.body = new ModelRenderer((ModelBase)this, 0, 92)) + .addBox(-7.0f, 0.0f, -6.0f, 14, 17, 16); + this.body.setRotationPoint(0.0f, 2.0f, 0.0f); + this.body.setTextureSize(128, 128); + this.body.mirror = true; + this.setRotation(this.body, 0.0f, 0.0f, 0.0f); + (this.bodyFace = new ModelRenderer((ModelBase)this, 61, 106)) + .addBox(-5.0f, 0.0f, -8.0f, 10, 17, 2); + this.bodyFace.setRotationPoint(0.0f, 2.0f, 0.0f); + this.bodyFace.setTextureSize(128, 128); + this.bodyFace.mirror = true; + this.setRotation(this.bodyFace, 0.0f, 0.0f, 0.0f); + (this.bodyTop = new ModelRenderer((ModelBase)this, 73, 85)) + .addBox(-5.0f, -2.0f, -7.0f, 10, 2, 16); + this.bodyTop.setRotationPoint(0.0f, 2.0f, 0.0f); + this.bodyTop.setTextureSize(128, 128); + this.bodyTop.mirror = true; + this.setRotation(this.bodyTop, 0.0f, 0.0f, 0.0f); + (this.bodyEdge = new ModelRenderer((ModelBase)this, 65, 126)) + .addBox(-4.5f, -1.0f, -7.0f, 9, 1, 1); + this.bodyEdge.setRotationPoint(0.0f, 2.0f, 0.0f); + this.bodyEdge.setTextureSize(128, 128); + this.bodyEdge.mirror = true; + this.setRotation(this.bodyEdge, 0.0f, 0.0f, 0.0f); + (this.bodyArmRight = new ModelRenderer((ModelBase)this, 86, 104)) + .addBox(-1.0f, -3.5f, -3.5f, 2, 16, 7); + this.bodyArmRight.setRotationPoint(-8.0f, 6.0f, 1.0f); + this.bodyArmRight.setTextureSize(128, 128); + this.bodyArmRight.mirror = true; + this.setRotation(this.bodyArmRight, 0.0f, 0.0f, 0.0f); + (this.bodyBack = new ModelRenderer((ModelBase)this, 61, 104)) + .addBox(-5.0f, 0.0f, 10.0f, 10, 19, 2); + this.bodyBack.setRotationPoint(0.0f, 2.0f, 0.0f); + this.bodyBack.setTextureSize(128, 128); + this.bodyBack.mirror = true; + this.setRotation(this.bodyBack, 0.0f, 0.0f, 0.0f); + (this.bodyBubble = new ModelRenderer((ModelBase)this, 105, 106)) + .addBox(-4.0f, 3.0f, -10.0f, 8, 8, 2); + this.bodyBubble.setRotationPoint(0.0f, 2.0f, 0.0f); + this.bodyBubble.setTextureSize(128, 128); + this.bodyBubble.mirror = true; + this.setRotation(this.bodyBubble, 0.0f, 0.0f, 0.0f); + (this.bodyArmLeft = new ModelRenderer((ModelBase)this, 86, 104)) + .addBox(-1.0f, -3.5f, -3.5f, 2, 16, 7); + this.bodyArmLeft.setRotationPoint(8.0f, 6.0f, 1.0f); + this.bodyArmLeft.setTextureSize(128, 128); + this.bodyArmLeft.mirror = true; + this.setRotation(this.bodyArmLeft, 0.0f, 0.0f, 0.0f); + (this.cannonRight = new ModelRenderer((ModelBase)this, 69, 11)) + .addBox(-4.0f, -5.5f, -10.5f, 4, 11, 20); + this.cannonRight.setRotationPoint(-10.0f, 7.0f, 1.0f); + this.cannonRight.setTextureSize(128, 128); + this.cannonRight.mirror = true; + this.setRotation(this.cannonRight, -0.6108652f, 0.0f, 0.0f); + (this.cannonFaceRight = new ModelRenderer((ModelBase)this, 0, 43)) + .addBox(-5.0f, -4.0f, -9.5f, 1, 8, 18); + this.cannonFaceRight.setRotationPoint(-5.0f, 7.0f, 1.0f); + this.cannonFaceRight.setTextureSize(128, 128); + this.cannonFaceRight.mirror = true; + this.setRotation(this.cannonFaceRight, -0.6108652f, 0.0f, 0.0f); + (this.cannonBarrelTopRight = new ModelRenderer((ModelBase)this, 42, 52)) + .addBox(-3.0f, -4.0f, -25.5f, 2, 2, 15); + this.cannonBarrelTopRight.setRotationPoint(-10.0f, 7.0f, 1.0f); + this.cannonBarrelTopRight.setTextureSize(128, 128); + this.cannonBarrelTopRight.mirror = true; + this.setRotation(this.cannonBarrelTopRight, -0.6108652f, 0.0f, 0.0f); + (this.cannonBarrelBotRight = new ModelRenderer((ModelBase)this, 42, 52)) + .addBox(-3.0f, 1.0f, -25.5f, 2, 2, 15); + this.cannonBarrelBotRight.setRotationPoint(-10.0f, 7.0f, 1.0f); + this.cannonBarrelBotRight.setTextureSize(128, 128); + this.cannonBarrelBotRight.mirror = true; + this.setRotation(this.cannonBarrelBotRight, -0.6108652f, 0.0f, 0.0f); + (this.cannonCapTopRight = new ModelRenderer((ModelBase)this, 73, 77)) + .addBox(-3.5f, -4.5f, -29.5f, 3, 3, 4); + this.cannonCapTopRight.setRotationPoint(-10.0f, 7.0f, 1.0f); + this.cannonCapTopRight.setTextureSize(128, 128); + this.cannonCapTopRight.mirror = true; + this.setRotation(this.cannonCapTopRight, -0.6108652f, 0.0f, 0.0f); + (this.cannonCapBotRight = new ModelRenderer((ModelBase)this, 73, 77)) + .addBox(-3.5f, 0.5f, -29.5f, 3, 3, 4); + this.cannonCapBotRight.setRotationPoint(-10.0f, 7.0f, 1.0f); + this.cannonCapBotRight.setTextureSize(128, 128); + this.cannonCapBotRight.mirror = true; + this.setRotation(this.cannonCapBotRight, -0.6108652f, 0.0f, 0.0f); + (this.cannonInFaceRight = new ModelRenderer((ModelBase)this, 77, 43)) + .addBox(-5.0f, -4.0f, -9.5f, 1, 8, 18); + this.cannonInFaceRight.setRotationPoint(-10.0f, 7.0f, 1.0f); + this.cannonInFaceRight.setTextureSize(128, 128); + this.cannonInFaceRight.mirror = true; + this.setRotation(this.cannonInFaceRight, -0.6108652f, 0.0f, 0.0f); + (this.cannonBarrelCouple = new ModelRenderer((ModelBase)this, 89, 77)) + .addBox(-2.5f, -4.0f, -14.5f, 1, 4, 3); + this.cannonBarrelCouple.setRotationPoint(-10.0f, 9.0f, 1.0f); + this.cannonBarrelCouple.setTextureSize(128, 128); + this.cannonBarrelCouple.mirror = true; + this.setRotation(this.cannonBarrelCouple, -0.6108652f, 0.0f, 0.0f); + (this.cannonBarrelNeck = new ModelRenderer((ModelBase)this, 106, 70)) + .addBox(-3.5f, -6.0f, -13.3f, 3, 8, 2); + this.cannonBarrelNeck.setRotationPoint(-10.0f, 9.0f, 1.0f); + this.cannonBarrelNeck.setTextureSize(128, 128); + this.cannonBarrelNeck.mirror = true; + this.setRotation(this.cannonBarrelNeck, -0.6108652f, 0.0f, 0.0f); + (this.cannonCapBotLeft = new ModelRenderer((ModelBase)this, 73, 77)) + .addBox(0.5f, 0.5f, -29.5f, 3, 3, 4); + this.cannonCapBotLeft.setRotationPoint(10.0f, 7.0f, 1.0f); + this.cannonCapBotLeft.setTextureSize(128, 128); + this.cannonCapBotLeft.mirror = true; + this.setRotation(this.cannonCapBotLeft, -0.6108652f, 0.0f, 0.0f); + (this.cannonCapTopLeft = new ModelRenderer((ModelBase)this, 73, 77)) + .addBox(0.7f, -4.5f, -29.5f, 3, 3, 4); + this.cannonCapTopLeft.setRotationPoint(10.0f, 7.0f, 1.0f); + this.cannonCapTopLeft.setTextureSize(128, 128); + this.cannonCapTopLeft.mirror = true; + this.setRotation(this.cannonCapTopLeft, -0.6108652f, 0.0f, 0.0f); + (this.cannonFaceLeft = new ModelRenderer((ModelBase)this, 0, 43)) + .addBox(-1.0f, -4.0f, -9.5f, 1, 8, 18); + this.cannonFaceLeft.setRotationPoint(10.0f, 7.0f, 1.0f); + this.cannonFaceLeft.setTextureSize(128, 128); + this.cannonFaceLeft.mirror = true; + this.setRotation(this.cannonFaceLeft, -0.6108652f, 0.0f, 0.0f); + (this.cannonLeft = new ModelRenderer((ModelBase)this, 69, 11)) + .addBox(0.0f, -5.5f, -10.5f, 4, 11, 20); + this.cannonLeft.setRotationPoint(10.0f, 7.0f, 1.0f); + this.cannonLeft.setTextureSize(128, 128); + this.cannonLeft.mirror = true; + this.setRotation(this.cannonLeft, -0.6108652f, 0.0f, 0.0f); + (this.cannonInFaceLeft = new ModelRenderer((ModelBase)this, 77, 43)) + .addBox(4.0f, -4.0f, -9.5f, 1, 8, 18); + this.cannonInFaceLeft.setRotationPoint(10.0f, 7.0f, 1.0f); + this.cannonInFaceLeft.setTextureSize(128, 128); + this.cannonInFaceLeft.mirror = true; + this.setRotation(this.cannonInFaceLeft, -0.6108652f, 0.0f, 0.0f); + (this.cannonBarrelNeckLeft = new ModelRenderer((ModelBase)this, 106, 70)) + .addBox(0.5f, -6.0f, -13.3f, 3, 8, 2); + this.cannonBarrelNeckLeft.setRotationPoint(10.0f, 9.0f, 1.0f); + this.cannonBarrelNeckLeft.setTextureSize(128, 128); + this.cannonBarrelNeckLeft.mirror = true; + this.setRotation(this.cannonBarrelNeckLeft, -0.6108652f, 0.0f, 0.0f); + (this.cannonBarrelBotLeft = new ModelRenderer((ModelBase)this, 42, 52)) + .addBox(1.0f, 1.0f, -25.5f, 2, 2, 15); + this.cannonBarrelBotLeft.setRotationPoint(10.0f, 7.0f, 1.0f); + this.cannonBarrelBotLeft.setTextureSize(128, 128); + this.cannonBarrelBotLeft.mirror = true; + this.setRotation(this.cannonBarrelBotLeft, -0.6108652f, 0.0f, 0.0f); + (this.cannonBarrelCoupleLeft = new ModelRenderer((ModelBase)this, 89, 77)) + .addBox(1.5f, -4.0f, -14.5f, 1, 4, 3); + this.cannonBarrelCoupleLeft.setRotationPoint(10.0f, 9.0f, 1.0f); + this.cannonBarrelCoupleLeft.setTextureSize(128, 128); + this.cannonBarrelCoupleLeft.mirror = true; + this.setRotation(this.cannonBarrelCoupleLeft, -0.6108652f, 0.0f, 0.0f); + (this.cannonBarrelTopLeft = new ModelRenderer((ModelBase)this, 42, 52)) + .addBox(1.0f, -4.0f, -25.5f, 2, 2, 15); + this.cannonBarrelTopLeft.setRotationPoint(10.0f, 7.0f, 1.0f); + this.cannonBarrelTopLeft.setTextureSize(128, 128); + this.cannonBarrelTopLeft.mirror = true; + this.setRotation(this.cannonBarrelTopLeft, -0.6108652f, 0.0f, 0.0f); + } + + public void render(final float f5) { + this.rot1.render(f5); + this.radarNeck.render(f5); + this.radarBase.render(f5); + this.radarBack.render(f5); + this.radarRight.render(f5); + this.radarLeft.render(f5); + this.baseEdge4.render(f5); + this.base.render(f5); + this.baseEdge3.render(f5); + this.baseEdge1.render(f5); + this.baseEdge2.render(f5); + this.body.render(f5); + this.bodyFace.render(f5); + this.bodyTop.render(f5); + this.bodyEdge.render(f5); + this.bodyArmRight.render(f5); + this.bodyBack.render(f5); + this.bodyBubble.render(f5); + this.bodyArmLeft.render(f5); + this.cannonRight.render(f5); + this.cannonFaceRight.render(f5); + this.cannonBarrelTopRight.render(f5); + this.cannonBarrelBotRight.render(f5); + this.cannonCapTopRight.render(f5); + this.cannonCapBotRight.render(f5); + this.cannonInFaceRight.render(f5); + this.cannonBarrelCouple.render(f5); + this.cannonBarrelNeck.render(f5); + this.cannonCapBotLeft.render(f5); + this.cannonCapTopLeft.render(f5); + this.cannonFaceLeft.render(f5); + this.cannonLeft.render(f5); + this.cannonInFaceLeft.render(f5); + this.cannonBarrelNeckLeft.render(f5); + this.cannonBarrelBotLeft.render(f5); + this.cannonBarrelCoupleLeft.render(f5); + this.cannonBarrelTopLeft.render(f5); + } + + public void renderBody(final float f5) { + this.rot1.render(f5); + this.baseEdge4.render(f5); + this.base.render(f5); + this.baseEdge3.render(f5); + this.baseEdge1.render(f5); + this.baseEdge2.render(f5); + this.body.render(f5); + this.bodyFace.render(f5); + this.bodyTop.render(f5); + this.bodyEdge.render(f5); + this.bodyArmRight.render(f5); + this.bodyBack.render(f5); + this.bodyBubble.render(f5); + this.bodyArmLeft.render(f5); + this.radarBase.render(f5); + } + + public void renderCannon(final float f5, final float rot) { + final ModelRenderer[] cannon = {this.cannonRight, + this.cannonFaceRight, + this.cannonBarrelTopRight, + this.cannonBarrelBotRight, + this.cannonCapTopRight, + this.cannonCapBotRight, + this.cannonInFaceRight, + this.cannonBarrelCouple, + this.cannonBarrelNeck, + this.cannonCapBotLeft, + this.cannonCapTopLeft, + this.cannonFaceLeft, + this.cannonLeft, + this.cannonInFaceLeft, + this.cannonBarrelNeckLeft, + this.cannonBarrelBotLeft, + this.cannonBarrelCoupleLeft, + this.cannonBarrelTopLeft}; + for (int i = 0; i < cannon.length; ++i) { + cannon[i].rotateAngleX = rot; + } + for (int i = 0; i < cannon.length; ++i) { + cannon[i].render(f5); + } + } + + public void renderRadar(final float f5) { + this.radarNeck.render(f5); + this.radarBack.render(f5); + this.radarRight.render(f5); + this.radarLeft.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/gangshao/muoxing/ModelGunTurret.java b/src/main/java/icbm/gangshao/muoxing/ModelGunTurret.java new file mode 100644 index 0000000..93a3570 --- /dev/null +++ b/src/main/java/icbm/gangshao/muoxing/ModelGunTurret.java @@ -0,0 +1,338 @@ +package icbm.gangshao.muoxing; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class ModelGunTurret extends ModelBase { + ModelRenderer BasePlate; + ModelRenderer neck; + ModelRenderer neck2; + ModelRenderer neck3; + ModelRenderer neck4; + ModelRenderer Base; + ModelRenderer LeftSide; + ModelRenderer LeftSideB; + ModelRenderer RightSide; + ModelRenderer RightSideB; + ModelRenderer CannonBackStoper; + ModelRenderer CannonBarrelBrace; + ModelRenderer CannonS1; + ModelRenderer CannonS2; + ModelRenderer CannonS3; + ModelRenderer CannonS4; + ModelRenderer CannonBarrel; + ModelRenderer CannonBrace; + ModelRenderer CannonLBeam; + ModelRenderer CannonRBeam; + ModelRenderer CannonBody; + ModelRenderer AmmoCase; + ModelRenderer AmmoB1; + ModelRenderer AmmoB2; + ModelRenderer AmmoB3; + ModelRenderer AmmoB3B; + ModelRenderer AmmoB2B; + ModelRenderer AmmoB1B; + ModelRenderer Shell1Tip; + ModelRenderer Shell1Body; + ModelRenderer Shell1Tip2; + ModelRenderer Shell1Body2; + ModelRenderer Shell1Tip3; + ModelRenderer Shell1Body3; + ModelRenderer Shell1Tip4; + ModelRenderer Shell1Body4; + ModelRenderer Shell1Tip5; + ModelRenderer Shell1Body5; + ModelRenderer AmmoCaseT; + + public ModelGunTurret() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.BasePlate = new ModelRenderer((ModelBase)this, 0, 113)) + .addBox(-7.5f, 3.0f, -6.5f, 15, 2, 13); + this.BasePlate.setRotationPoint(0.0f, 20.0f, 0.0f); + this.BasePlate.setTextureSize(128, 128); + this.BasePlate.mirror = true; + this.setRotation(this.BasePlate, 0.0f, 0.0f, 0.0f); + (this.neck = new ModelRenderer((ModelBase)this, 19, 0)) + .addBox(-4.0f, 0.0f, -4.0f, 8, 5, 8); + this.neck.setRotationPoint(0.0f, 19.0f, 0.0f); + this.neck.setTextureSize(128, 128); + this.neck.mirror = true; + this.setRotation(this.neck, 0.0f, 0.3926991f, 0.0f); + (this.neck2 = new ModelRenderer((ModelBase)this, 19, 0)) + .addBox(-4.0f, 0.0f, -4.0f, 8, 5, 8); + this.neck2.setRotationPoint(0.0f, 19.0f, 0.0f); + this.neck2.setTextureSize(128, 128); + this.neck2.mirror = true; + this.setRotation(this.neck2, 0.0f, 0.0f, 0.0f); + (this.neck3 = new ModelRenderer((ModelBase)this, 19, 0)) + .addBox(-4.0f, 0.0f, -4.0f, 8, 5, 8); + this.neck3.setRotationPoint(0.0f, 19.0f, 0.0f); + this.neck3.setTextureSize(128, 128); + this.neck3.mirror = true; + this.setRotation(this.neck3, 0.0f, 1.178097f, 0.0f); + (this.neck4 = new ModelRenderer((ModelBase)this, 19, 0)) + .addBox(-4.0f, 0.0f, -4.0f, 8, 5, 8); + this.neck4.setRotationPoint(0.0f, 19.0f, 0.0f); + this.neck4.setTextureSize(128, 128); + this.neck4.mirror = true; + this.setRotation(this.neck4, 0.0f, 0.7853982f, 0.0f); + (this.Base = new ModelRenderer((ModelBase)this, 0, 97)) + .addBox(-7.5f, -2.0f, -6.5f, 15, 2, 13); + this.Base.setRotationPoint(0.0f, 19.0f, 0.0f); + this.Base.setTextureSize(128, 128); + this.Base.mirror = true; + this.setRotation(this.Base, 0.0f, 0.0f, 0.0f); + (this.LeftSide = new ModelRenderer((ModelBase)this, 0, 59)) + .addBox(5.5f, -13.0f, -5.5f, 2, 2, 11); + this.LeftSide.setRotationPoint(0.0f, 19.0f, 0.0f); + this.LeftSide.setTextureSize(128, 128); + this.LeftSide.mirror = true; + this.setRotation(this.LeftSide, 0.0f, 0.0f, 0.0f); + (this.LeftSideB = new ModelRenderer((ModelBase)this, 0, 73)) + .addBox(5.5f, -11.0f, -6.5f, 2, 9, 13); + this.LeftSideB.setRotationPoint(0.0f, 19.0f, 0.0f); + this.LeftSideB.setTextureSize(128, 128); + this.LeftSideB.mirror = true; + this.setRotation(this.LeftSideB, 0.0f, 0.0f, 0.0f); + (this.RightSide = new ModelRenderer((ModelBase)this, 26, 59)) + .addBox(-5.5f, -13.0f, -5.5f, 2, 2, 11); + this.RightSide.setRotationPoint(0.0f, 19.0f, 0.0f); + this.RightSide.setTextureSize(128, 128); + this.RightSide.mirror = true; + this.setRotation(this.RightSide, 0.0f, 0.0f, 0.0f); + (this.RightSideB = new ModelRenderer((ModelBase)this, 31, 73)) + .addBox(-5.5f, -11.0f, -6.5f, 2, 9, 13); + this.RightSideB.setRotationPoint(0.0f, 19.0f, 0.0f); + this.RightSideB.setTextureSize(128, 128); + this.RightSideB.mirror = true; + this.setRotation(this.RightSideB, 0.0f, 0.0f, 0.0f); + (this.CannonBackStoper = new ModelRenderer((ModelBase)this, 0, 22)) + .addBox(-2.5f, -3.0f, 7.5f, 7, 7, 4); + this.CannonBackStoper.setRotationPoint(0.0f, 10.0f, 0.0f); + this.CannonBackStoper.setTextureSize(128, 128); + this.CannonBackStoper.mirror = true; + this.setRotation(this.CannonBackStoper, -0.1745329f, 0.0f, 0.0f); + (this.CannonBarrelBrace = new ModelRenderer((ModelBase)this, 63, 61)) + .addBox(0.0f, 2.5f, -16.5f, 2, 2, 13); + this.CannonBarrelBrace.setRotationPoint(0.0f, 10.0f, 0.0f); + this.CannonBarrelBrace.setTextureSize(128, 128); + this.CannonBarrelBrace.mirror = true; + this.setRotation(this.CannonBarrelBrace, -0.1745329f, 0.0f, 0.0f); + (this.CannonS1 = new ModelRenderer((ModelBase)this, 101, 44)) + .addBox(2.5f, -2.5f, -19.5f, 2, 5, 3); + this.CannonS1.setRotationPoint(0.0f, 10.0f, 0.0f); + this.CannonS1.setTextureSize(128, 128); + this.CannonS1.mirror = true; + this.setRotation(this.CannonS1, -0.1745329f, 0.0f, 0.0f); + (this.CannonS2 = new ModelRenderer((ModelBase)this, 92, 53)) + .addBox(-1.5f, 1.5f, -19.5f, 5, 2, 3); + this.CannonS2.setRotationPoint(0.0f, 10.0f, 0.0f); + this.CannonS2.setTextureSize(128, 128); + this.CannonS2.mirror = true; + this.setRotation(this.CannonS2, -0.1745329f, 0.0f, 0.0f); + (this.CannonS3 = new ModelRenderer((ModelBase)this, 89, 44)) + .addBox(-2.5f, -2.5f, -19.5f, 2, 5, 3); + this.CannonS3.setRotationPoint(0.0f, 10.0f, 0.0f); + this.CannonS3.setTextureSize(128, 128); + this.CannonS3.mirror = true; + this.setRotation(this.CannonS3, -0.1745329f, 0.0f, 0.0f); + (this.CannonS4 = new ModelRenderer((ModelBase)this, 92, 38)) + .addBox(-1.5f, -3.5f, -19.5f, 5, 2, 3); + this.CannonS4.setRotationPoint(0.0f, 10.0f, 0.0f); + this.CannonS4.setTextureSize(128, 128); + this.CannonS4.mirror = true; + this.setRotation(this.CannonS4, -0.1745329f, 0.0f, 0.0f); + (this.CannonBarrel = new ModelRenderer((ModelBase)this, 53, 45)) + .addBox(-1.5f, -2.5f, -16.5f, 5, 5, 8); + this.CannonBarrel.setRotationPoint(0.0f, 10.0f, 0.0f); + this.CannonBarrel.setTextureSize(128, 128); + this.CannonBarrel.mirror = true; + this.setRotation(this.CannonBarrel, -0.1745329f, 0.0f, 0.0f); + (this.CannonBrace = new ModelRenderer((ModelBase)this, 43, 34)) + .addBox(-2.0f, -3.0f, -8.5f, 6, 6, 4); + this.CannonBrace.setRotationPoint(0.0f, 10.0f, 0.0f); + this.CannonBrace.setTextureSize(128, 128); + this.CannonBrace.mirror = true; + this.setRotation(this.CannonBrace, -0.1745329f, 0.0f, 0.0f); + (this.CannonLBeam = new ModelRenderer((ModelBase)this, 66, 34)) + .addBox(5.0f, -2.0f, -2.0f, 2, 4, 4); + this.CannonLBeam.setRotationPoint(0.0f, 10.0f, 0.0f); + this.CannonLBeam.setTextureSize(128, 128); + this.CannonLBeam.mirror = true; + this.setRotation(this.CannonLBeam, -0.1745329f, 0.0f, 0.0f); + (this.CannonRBeam = new ModelRenderer((ModelBase)this, 66, 34)) + .addBox(-4.0f, -2.0f, -2.0f, 2, 4, 4); + this.CannonRBeam.setRotationPoint(0.0f, 10.0f, 0.0f); + this.CannonRBeam.setTextureSize(128, 128); + this.CannonRBeam.mirror = true; + this.setRotation(this.CannonRBeam, -0.1745329f, 0.0f, 0.0f); + (this.CannonBody = new ModelRenderer((ModelBase)this, 0, 34)) + .addBox(-3.0f, -4.0f, -4.5f, 8, 9, 12); + this.CannonBody.setRotationPoint(0.0f, 10.0f, 0.0f); + this.CannonBody.setTextureSize(128, 128); + this.CannonBody.mirror = true; + this.setRotation(this.CannonBody, -0.1745329f, 0.0f, 0.0f); + (this.AmmoCase = new ModelRenderer((ModelBase)this, 91, 105)) + .addBox(-10.5f, -5.0f, -6.5f, 5, 9, 14); + this.AmmoCase.setRotationPoint(0.0f, 20.0f, 0.0f); + this.AmmoCase.setTextureSize(128, 128); + this.AmmoCase.mirror = true; + this.setRotation(this.AmmoCase, 0.0f, 0.0f, 0.0f); + (this.AmmoB1 = new ModelRenderer((ModelBase)this, 114, 98)) + .addBox(-0.5f, -7.0f, -3.5f, 3, 5, 1); + this.AmmoB1.setRotationPoint(0.0f, 9.0f, 0.0f); + this.AmmoB1.setTextureSize(128, 128); + this.AmmoB1.mirror = true; + this.setRotation(this.AmmoB1, -0.1745329f, 0.0f, 0.0f); + (this.AmmoB2 = new ModelRenderer((ModelBase)this, 96, 93)) + .addBox(-8.5f, -9.0f, -3.5f, 10, 3, 1); + this.AmmoB2.setRotationPoint(0.0f, 9.0f, 0.0f); + this.AmmoB2.setTextureSize(128, 128); + this.AmmoB2.mirror = true; + this.setRotation(this.AmmoB2, -0.1745329f, 0.0f, 0.0f); + (this.AmmoB3 = new ModelRenderer((ModelBase)this, 91, 98)) + .addBox(-9.5f, -7.0f, -3.5f, 3, 5, 1); + this.AmmoB3.setRotationPoint(0.0f, 9.0f, 0.0f); + this.AmmoB3.setTextureSize(128, 128); + this.AmmoB3.mirror = true; + this.setRotation(this.AmmoB3, -0.1745329f, 0.0f, 0.0f); + (this.AmmoB3B = new ModelRenderer((ModelBase)this, 91, 98)) + .addBox(-9.5f, -7.0f, 6.5f, 3, 5, 1); + this.AmmoB3B.setRotationPoint(0.0f, 9.0f, 0.0f); + this.AmmoB3B.setTextureSize(128, 128); + this.AmmoB3B.mirror = true; + this.setRotation(this.AmmoB3B, -0.1745329f, 0.0f, 0.0f); + (this.AmmoB2B = new ModelRenderer((ModelBase)this, 96, 93)) + .addBox(-8.5f, -9.0f, 6.5f, 10, 3, 1); + this.AmmoB2B.setRotationPoint(0.0f, 9.0f, 0.0f); + this.AmmoB2B.setTextureSize(128, 128); + this.AmmoB2B.mirror = true; + this.setRotation(this.AmmoB2B, -0.1745329f, 0.0f, 0.0f); + (this.AmmoB1B = new ModelRenderer((ModelBase)this, 114, 98)) + .addBox(-0.5f, -7.0f, 6.5f, 3, 5, 1); + this.AmmoB1B.setRotationPoint(0.0f, 9.0f, 0.0f); + this.AmmoB1B.setTextureSize(128, 128); + this.AmmoB1B.mirror = true; + this.setRotation(this.AmmoB1B, -0.1745329f, 0.0f, 0.0f); + (this.Shell1Tip = new ModelRenderer((ModelBase)this, 112, 82)) + .addBox(-9.0f, -6.5f, -2.5f, 2, 2, 2); + this.Shell1Tip.setRotationPoint(0.0f, 10.0f, 0.0f); + this.Shell1Tip.setTextureSize(128, 128); + this.Shell1Tip.mirror = true; + this.setRotation(this.Shell1Tip, -0.1745329f, 0.0f, 0.0f); + (this.Shell1Body = new ModelRenderer((ModelBase)this, 91, 82)) + .addBox(-9.5f, -7.0f, -0.5f, 3, 3, 7); + this.Shell1Body.setRotationPoint(0.0f, 10.0f, 0.0f); + this.Shell1Body.setTextureSize(128, 128); + this.Shell1Body.mirror = true; + this.setRotation(this.Shell1Body, -0.1745329f, 0.0f, 0.0f); + (this.Shell1Tip2 = new ModelRenderer((ModelBase)this, 112, 82)) + .addBox(-8.0f, -9.5f, -2.5f, 2, 2, 2); + this.Shell1Tip2.setRotationPoint(0.0f, 10.0f, 0.0f); + this.Shell1Tip2.setTextureSize(128, 128); + this.Shell1Tip2.mirror = true; + this.setRotation(this.Shell1Tip2, -0.1745329f, 0.0f, 0.0f); + (this.Shell1Body2 = new ModelRenderer((ModelBase)this, 91, 82)) + .addBox(-8.5f, -10.0f, -0.5f, 3, 3, 7); + this.Shell1Body2.setRotationPoint(0.0f, 10.0f, 0.0f); + this.Shell1Body2.setTextureSize(128, 128); + this.Shell1Body2.mirror = true; + this.setRotation(this.Shell1Body2, -0.1745329f, 0.0f, 0.0f); + (this.Shell1Tip3 = new ModelRenderer((ModelBase)this, 112, 82)) + .addBox(-4.5f, -9.5f, -2.5f, 2, 2, 2); + this.Shell1Tip3.setRotationPoint(0.0f, 10.0f, 0.0f); + this.Shell1Tip3.setTextureSize(128, 128); + this.Shell1Tip3.mirror = true; + this.setRotation(this.Shell1Tip3, -0.1745329f, 0.0f, 0.0f); + (this.Shell1Body3 = new ModelRenderer((ModelBase)this, 91, 82)) + .addBox(-5.0f, -10.0f, -0.5f, 3, 3, 7); + this.Shell1Body3.setRotationPoint(0.0f, 10.0f, 0.0f); + this.Shell1Body3.setTextureSize(128, 128); + this.Shell1Body3.mirror = true; + this.setRotation(this.Shell1Body3, -0.1745329f, 0.0f, 0.0f); + (this.Shell1Tip4 = new ModelRenderer((ModelBase)this, 112, 82)) + .addBox(-1.0f, -9.5f, -2.5f, 2, 2, 2); + this.Shell1Tip4.setRotationPoint(0.0f, 10.0f, 0.0f); + this.Shell1Tip4.setTextureSize(128, 128); + this.Shell1Tip4.mirror = true; + this.setRotation(this.Shell1Tip4, -0.1745329f, 0.0f, 0.0f); + (this.Shell1Body4 = new ModelRenderer((ModelBase)this, 91, 82)) + .addBox(-1.5f, -10.0f, -0.5f, 3, 3, 7); + this.Shell1Body4.setRotationPoint(0.0f, 10.0f, 0.0f); + this.Shell1Body4.setTextureSize(128, 128); + this.Shell1Body4.mirror = true; + this.setRotation(this.Shell1Body4, -0.1745329f, 0.0f, 0.0f); + (this.Shell1Tip5 = new ModelRenderer((ModelBase)this, 112, 82)) + .addBox(0.0f, -6.5f, -2.5f, 2, 2, 2); + this.Shell1Tip5.setRotationPoint(0.0f, 10.0f, 0.0f); + this.Shell1Tip5.setTextureSize(128, 128); + this.Shell1Tip5.mirror = true; + this.setRotation(this.Shell1Tip5, -0.1745329f, 0.0f, 0.0f); + (this.Shell1Body5 = new ModelRenderer((ModelBase)this, 91, 82)) + .addBox(-0.5f, -7.0f, -0.5f, 3, 3, 7); + this.Shell1Body5.setRotationPoint(0.0f, 10.0f, 0.0f); + this.Shell1Body5.setTextureSize(128, 128); + this.Shell1Body5.mirror = true; + this.setRotation(this.Shell1Body5, -0.1745329f, 0.0f, 0.0f); + (this.AmmoCaseT = new ModelRenderer((ModelBase)this, 55, 0)) + .addBox(-10.5f, -2.0f, -4.5f, 5, 9, 13); + this.AmmoCaseT.setRotationPoint(0.0f, 9.0f, 0.0f); + this.AmmoCaseT.setTextureSize(128, 128); + this.AmmoCaseT.mirror = true; + this.setRotation(this.AmmoCaseT, -0.1745329f, 0.0f, 0.0f); + } + + public void render(final float f5) { this.BasePlate.render(f5); } + + public void renderBody(final float f5) { + this.neck.render(f5); + this.neck2.render(f5); + this.neck3.render(f5); + this.neck4.render(f5); + this.Base.render(f5); + this.LeftSide.render(f5); + this.LeftSideB.render(f5); + this.RightSide.render(f5); + this.RightSideB.render(f5); + this.AmmoCase.render(f5); + } + + public void renderCannon(final float f5) { + this.CannonBackStoper.render(f5); + this.CannonBarrelBrace.render(f5); + this.CannonS1.render(f5); + this.CannonS2.render(f5); + this.CannonS3.render(f5); + this.CannonS4.render(f5); + this.CannonBarrel.render(f5); + this.CannonBrace.render(f5); + this.CannonLBeam.render(f5); + this.CannonRBeam.render(f5); + this.CannonBody.render(f5); + this.AmmoB1.render(f5); + this.AmmoB2.render(f5); + this.AmmoB3.render(f5); + this.AmmoB3B.render(f5); + this.AmmoB2B.render(f5); + this.AmmoB1B.render(f5); + this.Shell1Tip.render(f5); + this.Shell1Body.render(f5); + this.Shell1Tip2.render(f5); + this.Shell1Body2.render(f5); + this.Shell1Tip3.render(f5); + this.Shell1Body3.render(f5); + this.Shell1Tip4.render(f5); + this.Shell1Body4.render(f5); + this.Shell1Tip5.render(f5); + this.Shell1Body5.render(f5); + this.AmmoCaseT.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/gangshao/muoxing/ModelRailgun.java b/src/main/java/icbm/gangshao/muoxing/ModelRailgun.java new file mode 100644 index 0000000..d41f020 --- /dev/null +++ b/src/main/java/icbm/gangshao/muoxing/ModelRailgun.java @@ -0,0 +1,109 @@ +package icbm.gangshao.muoxing; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +@SideOnly(Side.CLIENT) +public class ModelRailgun extends ModelBase { + ModelRenderer BASE; + ModelRenderer NECK; + ModelRenderer SUPPORT_1_ROTATES; + ModelRenderer MAIN_TURRET_ROTATES; + ModelRenderer BATTERY_PACK_ROTATES; + ModelRenderer MAIN_CANNON_ROTATES; + ModelRenderer NOZZLE_ROTATES; + ModelRenderer SUPPORT_2_ROTATES; + ModelRenderer SUPPORT_PLATFORM_ROTATES; + + public ModelRailgun() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.BASE = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 10, 4, 10); + this.BASE.setRotationPoint(-5.0f, 20.0f, -5.0f); + this.BASE.setTextureSize(128, 128); + this.BASE.mirror = true; + this.setRotation(this.BASE, 0.0f, 0.0f, 0.0f); + (this.NECK = new ModelRenderer((ModelBase)this, 0, 19)) + .addBox(0.0f, 0.0f, 0.0f, 6, 2, 6); + this.NECK.setRotationPoint(-3.0f, 18.0f, -3.0f); + this.NECK.setTextureSize(128, 128); + this.NECK.mirror = true; + this.setRotation(this.NECK, 0.0f, 0.0f, 0.0f); + (this.SUPPORT_1_ROTATES = new ModelRenderer((ModelBase)this, 41, 10)) + .addBox(3.0f, 0.0f, -2.0f, 1, 7, 4); + this.SUPPORT_1_ROTATES.setRotationPoint(0.0f, 10.0f, 0.0f); + this.SUPPORT_1_ROTATES.setTextureSize(128, 128); + this.SUPPORT_1_ROTATES.mirror = true; + this.setRotation(this.SUPPORT_1_ROTATES, 0.0f, 0.0f, 0.0f); + (this.MAIN_TURRET_ROTATES = new ModelRenderer((ModelBase)this, 75, 0)) + .addBox(-3.0f, -3.0f, -5.0f, 6, 6, 12); + this.MAIN_TURRET_ROTATES.setRotationPoint(0.0f, 10.0f, 0.0f); + this.MAIN_TURRET_ROTATES.setTextureSize(128, 128); + this.MAIN_TURRET_ROTATES.mirror = true; + this.setRotation(this.MAIN_TURRET_ROTATES, 0.0f, 0.0f, 0.0f); + (this.BATTERY_PACK_ROTATES = new ModelRenderer((ModelBase)this, 53, 10)) + .addBox(-4.0f, -4.0f, 2.0f, 4, 4, 6); + this.BATTERY_PACK_ROTATES.setRotationPoint(0.0f, 10.0f, 0.0f); + this.BATTERY_PACK_ROTATES.setTextureSize(128, 128); + this.BATTERY_PACK_ROTATES.mirror = true; + this.setRotation(this.BATTERY_PACK_ROTATES, 0.0f, 0.0f, 0.0f); + (this.MAIN_CANNON_ROTATES = new ModelRenderer((ModelBase)this, 41, 22)) + .addBox(-1.0f, -2.0f, -15.0f, 2, 2, 10); + this.MAIN_CANNON_ROTATES.setRotationPoint(0.0f, 10.0f, 0.0f); + this.MAIN_CANNON_ROTATES.setTextureSize(128, 128); + this.MAIN_CANNON_ROTATES.mirror = true; + this.setRotation(this.MAIN_CANNON_ROTATES, 0.0f, 0.0f, 0.0f); + (this.NOZZLE_ROTATES = new ModelRenderer((ModelBase)this, 66, 22)) + .addBox(-1.0f, -2.0f, -19.0f, 2, 3, 4); + this.NOZZLE_ROTATES.setRotationPoint(0.0f, 10.0f, 0.0f); + this.NOZZLE_ROTATES.setTextureSize(128, 128); + this.NOZZLE_ROTATES.mirror = true; + this.setRotation(this.NOZZLE_ROTATES, 0.0f, 0.0f, 0.0f); + (this.SUPPORT_2_ROTATES = new ModelRenderer((ModelBase)this, 41, 10)) + .addBox(-4.0f, 0.0f, -2.0f, 1, 7, 4); + this.SUPPORT_2_ROTATES.setRotationPoint(0.0f, 10.0f, 0.0f); + this.SUPPORT_2_ROTATES.setTextureSize(128, 128); + this.SUPPORT_2_ROTATES.mirror = true; + this.setRotation(this.SUPPORT_2_ROTATES, 0.0f, 0.0f, 0.0f); + (this.SUPPORT_PLATFORM_ROTATES = new ModelRenderer((ModelBase)this, 41, 0)) + .addBox(-4.0f, 0.0f, -4.0f, 8, 1, 8); + this.SUPPORT_PLATFORM_ROTATES.setRotationPoint(0.0f, 17.0f, 0.0f); + this.SUPPORT_PLATFORM_ROTATES.setTextureSize(128, 128); + this.SUPPORT_PLATFORM_ROTATES.mirror = true; + this.setRotation(this.SUPPORT_PLATFORM_ROTATES, 0.0f, 0.0f, 0.0f); + } + + public void render(final float rotationYaw, final float rotationPitch, + final float f5) { + this.BASE.render(f5); + this.NECK.render(f5); + this.SUPPORT_1_ROTATES.rotateAngleY = rotationYaw; + this.SUPPORT_1_ROTATES.render(f5); + this.SUPPORT_2_ROTATES.rotateAngleY = rotationYaw; + this.SUPPORT_2_ROTATES.render(f5); + this.SUPPORT_PLATFORM_ROTATES.rotateAngleY = rotationYaw; + this.SUPPORT_PLATFORM_ROTATES.render(f5); + this.MAIN_TURRET_ROTATES.rotateAngleY = rotationYaw; + this.MAIN_TURRET_ROTATES.rotateAngleX = rotationPitch; + this.MAIN_TURRET_ROTATES.render(f5); + this.BATTERY_PACK_ROTATES.rotateAngleY = rotationYaw; + this.BATTERY_PACK_ROTATES.rotateAngleX = rotationPitch; + this.BATTERY_PACK_ROTATES.render(f5); + this.MAIN_CANNON_ROTATES.rotateAngleY = rotationYaw; + this.MAIN_CANNON_ROTATES.rotateAngleX = rotationPitch; + this.MAIN_CANNON_ROTATES.render(f5); + this.NOZZLE_ROTATES.rotateAngleY = rotationYaw; + this.NOZZLE_ROTATES.rotateAngleX = rotationPitch; + this.NOZZLE_ROTATES.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/gangshao/muoxing/ModelSentryCannon.java b/src/main/java/icbm/gangshao/muoxing/ModelSentryCannon.java new file mode 100644 index 0000000..2b9c684 --- /dev/null +++ b/src/main/java/icbm/gangshao/muoxing/ModelSentryCannon.java @@ -0,0 +1,209 @@ +package icbm.gangshao.muoxing; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class ModelSentryCannon extends ModelBase { + ModelRenderer BaseYawR; + ModelRenderer BaseYawRPlate; + ModelRenderer RightBrace; + ModelRenderer RightBraceF; + ModelRenderer RightBraceF2; + ModelRenderer LeftBrace; + ModelRenderer LeftBraceF; + ModelRenderer LeftBraceF2; + ModelRenderer FrontPlate; + ModelRenderer SideDecor; + ModelRenderer midPlate; + ModelRenderer AmmoBox; + ModelRenderer rod; + ModelRenderer radioIntena; + ModelRenderer Camera; + ModelRenderer Camera2; + ModelRenderer Camera3; + ModelRenderer CannonBody; + ModelRenderer CannonBody2; + ModelRenderer CannonBody3; + ModelRenderer CannonBody4; + ModelRenderer Barrel; + ModelRenderer BarrelCap; + + public ModelSentryCannon() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.BaseYawR = new ModelRenderer((ModelBase)this, 0, 119)) + .addBox(-3.0f, -3.0f, -3.0f, 6, 3, 6); + this.BaseYawR.setRotationPoint(0.0f, 24.0f, 0.0f); + this.BaseYawR.setTextureSize(128, 128); + this.BaseYawR.mirror = true; + this.setRotation(this.BaseYawR, 0.0f, 0.0f, 0.0f); + (this.BaseYawRPlate = new ModelRenderer((ModelBase)this, 0, 104)) + .addBox(-5.0f, -3.0f, -5.0f, 10, 4, 10); + this.BaseYawRPlate.setRotationPoint(0.0f, 20.0f, 0.0f); + this.BaseYawRPlate.setTextureSize(128, 128); + this.BaseYawRPlate.mirror = true; + this.setRotation(this.BaseYawRPlate, 0.0f, 0.0f, 0.0f); + (this.RightBrace = new ModelRenderer((ModelBase)this, 0, 77)) + .addBox(-5.0f, -3.0f, -3.0f, 1, 8, 8); + this.RightBrace.setRotationPoint(0.0f, 12.0f, 0.0f); + this.RightBrace.setTextureSize(128, 128); + this.RightBrace.mirror = true; + this.setRotation(this.RightBrace, 0.0f, 0.0f, 0.0f); + (this.RightBraceF = new ModelRenderer((ModelBase)this, 19, 85)) + .addBox(-5.0f, -2.0f, -4.0f, 1, 7, 1); + this.RightBraceF.setRotationPoint(0.0f, 12.0f, 0.0f); + this.RightBraceF.setTextureSize(128, 128); + this.RightBraceF.mirror = true; + this.setRotation(this.RightBraceF, 0.0f, 0.0f, 0.0f); + (this.RightBraceF2 = new ModelRenderer((ModelBase)this, 24, 86)) + .addBox(-5.0f, -1.0f, -5.0f, 1, 6, 1); + this.RightBraceF2.setRotationPoint(0.0f, 12.0f, 0.0f); + this.RightBraceF2.setTextureSize(128, 128); + this.RightBraceF2.mirror = true; + this.setRotation(this.RightBraceF2, 0.0f, 0.0f, 0.0f); + (this.LeftBrace = new ModelRenderer((ModelBase)this, 41, 77)) + .addBox(4.0f, -3.0f, -3.0f, 1, 8, 8); + this.LeftBrace.setRotationPoint(0.0f, 12.0f, 0.0f); + this.LeftBrace.setTextureSize(128, 128); + this.LeftBrace.mirror = true; + this.setRotation(this.LeftBrace, 0.0f, 0.0f, 0.0f); + (this.LeftBraceF = new ModelRenderer((ModelBase)this, 35, 85)) + .addBox(4.0f, -2.0f, -4.0f, 1, 7, 1); + this.LeftBraceF.setRotationPoint(0.0f, 12.0f, 0.0f); + this.LeftBraceF.setTextureSize(128, 128); + this.LeftBraceF.mirror = true; + this.setRotation(this.LeftBraceF, 0.0f, 0.0f, 0.0f); + (this.LeftBraceF2 = new ModelRenderer((ModelBase)this, 30, 86)) + .addBox(4.0f, -1.0f, -5.0f, 1, 6, 1); + this.LeftBraceF2.setRotationPoint(0.0f, 12.0f, 0.0f); + this.LeftBraceF2.setTextureSize(128, 128); + this.LeftBraceF2.mirror = true; + this.setRotation(this.LeftBraceF2, 0.0f, 0.0f, 0.0f); + (this.FrontPlate = new ModelRenderer((ModelBase)this, 42, 108)) + .addBox(-4.0f, -2.0f, -6.0f, 8, 4, 1); + this.FrontPlate.setRotationPoint(0.0f, 20.0f, 0.0f); + this.FrontPlate.setTextureSize(128, 128); + this.FrontPlate.mirror = true; + this.setRotation(this.FrontPlate, 0.0f, 0.0f, 0.0f); + (this.SideDecor = new ModelRenderer((ModelBase)this, 61, 92)) + .addBox(-6.0f, -3.0f, -3.0f, 1, 4, 7); + this.SideDecor.setRotationPoint(0.0f, 20.0f, 0.0f); + this.SideDecor.setTextureSize(128, 128); + this.SideDecor.mirror = true; + this.setRotation(this.SideDecor, 0.0f, 0.0f, 0.0f); + (this.midPlate = new ModelRenderer((ModelBase)this, 0, 94)) + .addBox(-4.0f, -4.0f, -4.0f, 8, 1, 8); + this.midPlate.setRotationPoint(0.0f, 20.0f, 0.0f); + this.midPlate.setTextureSize(128, 128); + this.midPlate.mirror = true; + this.setRotation(this.midPlate, 0.0f, 0.0f, 0.0f); + (this.AmmoBox = new ModelRenderer((ModelBase)this, 61, 79)) + .addBox(5.0f, -5.0f, -3.0f, 3, 5, 7); + this.AmmoBox.setRotationPoint(0.0f, 20.0f, 0.0f); + this.AmmoBox.setTextureSize(128, 128); + this.AmmoBox.mirror = true; + this.setRotation(this.AmmoBox, 0.0f, 0.0f, 0.0f); + (this.rod = new ModelRenderer((ModelBase)this, 33, 34)) + .addBox(-6.0f, -1.5f, -1.5f, 12, 3, 3); + this.rod.setRotationPoint(0.0f, 12.0f, 1.0f); + this.rod.setTextureSize(128, 128); + this.rod.mirror = true; + this.setRotation(this.rod, 0.0f, 0.0f, 0.0f); + (this.radioIntena = new ModelRenderer((ModelBase)this, 66, 43)) + .addBox(2.0f, -8.0f, 6.0f, 1, 6, 1); + this.radioIntena.setRotationPoint(0.0f, 12.0f, 0.0f); + this.radioIntena.setTextureSize(128, 128); + this.radioIntena.mirror = true; + this.setRotation(this.radioIntena, 0.0f, 0.0f, 0.0f); + (this.Camera = new ModelRenderer((ModelBase)this, 41, 16)) + .addBox(-9.5f, -2.5f, -2.0f, 4, 4, 4); + this.Camera.setRotationPoint(0.0f, 12.0f, 1.0f); + this.Camera.setTextureSize(128, 128); + this.Camera.mirror = true; + this.setRotation(this.Camera, 0.0f, 0.0f, 0.0f); + (this.Camera2 = new ModelRenderer((ModelBase)this, 41, 11)) + .addBox(-9.0f, -1.5f, -2.5f, 3, 2, 1); + this.Camera2.setRotationPoint(0.0f, 12.0f, 1.0f); + this.Camera2.setTextureSize(128, 128); + this.Camera2.mirror = true; + this.setRotation(this.Camera2, 0.0f, 0.0f, 0.0f); + (this.Camera3 = new ModelRenderer((ModelBase)this, 59, 18)) + .addBox(-9.0f, 1.5f, -2.0f, 3, 1, 4); + this.Camera3.setRotationPoint(0.0f, 12.0f, 1.0f); + this.Camera3.setTextureSize(128, 128); + this.Camera3.mirror = true; + this.setRotation(this.Camera3, 0.0f, 0.0f, 0.0f); + (this.CannonBody = new ModelRenderer((ModelBase)this, 0, 31)) + .addBox(-3.5f, -2.5f, -1.5f, 7, 5, 9); + this.CannonBody.setRotationPoint(0.0f, 12.0f, 0.0f); + this.CannonBody.setTextureSize(128, 128); + this.CannonBody.mirror = true; + this.setRotation(this.CannonBody, 0.0f, 0.0f, 0.0f); + (this.CannonBody2 = new ModelRenderer((ModelBase)this, 19, 46)) + .addBox(-2.5f, -1.5f, -6.5f, 5, 3, 5); + this.CannonBody2.setRotationPoint(0.0f, 12.0f, 0.0f); + this.CannonBody2.setTextureSize(128, 128); + this.CannonBody2.mirror = true; + this.setRotation(this.CannonBody2, 0.0f, 0.0f, 0.0f); + (this.CannonBody3 = new ModelRenderer((ModelBase)this, 0, 47)) + .addBox(-2.0f, -2.1f, -6.5f, 4, 1, 5); + this.CannonBody3.setRotationPoint(0.0f, 12.0f, 0.0f); + this.CannonBody3.setTextureSize(128, 128); + this.CannonBody3.mirror = true; + this.setRotation(this.CannonBody3, 0.0f, 0.0f, 0.0f); + (this.CannonBody4 = new ModelRenderer((ModelBase)this, 40, 47)) + .addBox(-2.0f, 1.0f, -6.5f, 4, 1, 5); + this.CannonBody4.setRotationPoint(0.0f, 12.0f, 0.0f); + this.CannonBody4.setTextureSize(128, 128); + this.CannonBody4.mirror = true; + this.setRotation(this.CannonBody4, 0.0f, 0.0f, 0.0f); + (this.Barrel = new ModelRenderer((ModelBase)this, 10, 55)) + .addBox(-1.0f, -1.0f, -14.5f, 2, 2, 8); + this.Barrel.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Barrel.setTextureSize(128, 128); + this.Barrel.mirror = true; + this.setRotation(this.Barrel, 0.0f, 0.0f, 0.0f); + (this.BarrelCap = new ModelRenderer((ModelBase)this, 32, 56)) + .addBox(-1.5f, -1.5f, -16.5f, 3, 3, 2); + this.BarrelCap.setRotationPoint(0.0f, 12.0f, 0.0f); + this.BarrelCap.setTextureSize(128, 128); + this.BarrelCap.mirror = true; + this.setRotation(this.BarrelCap, 0.0f, 0.0f, 0.0f); + } + + public void renderYaw(final float f5) { + this.BaseYawR.render(f5); + this.BaseYawRPlate.render(f5); + this.RightBrace.render(f5); + this.RightBraceF.render(f5); + this.RightBraceF2.render(f5); + this.LeftBrace.render(f5); + this.LeftBraceF.render(f5); + this.LeftBraceF2.render(f5); + this.FrontPlate.render(f5); + this.SideDecor.render(f5); + this.midPlate.render(f5); + this.AmmoBox.render(f5); + } + + public void renderYawPitch(final float f5) { + this.rod.render(f5); + this.radioIntena.render(f5); + this.Camera.render(f5); + this.Camera2.render(f5); + this.Camera3.render(f5); + this.CannonBody.render(f5); + this.CannonBody2.render(f5); + this.CannonBody3.render(f5); + this.CannonBody4.render(f5); + this.Barrel.render(f5); + this.BarrelCap.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/gangshao/muoxing/ModelTurretMed.java b/src/main/java/icbm/gangshao/muoxing/ModelTurretMed.java new file mode 100644 index 0000000..c97ac40 --- /dev/null +++ b/src/main/java/icbm/gangshao/muoxing/ModelTurretMed.java @@ -0,0 +1,224 @@ +package icbm.gangshao.muoxing; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class ModelTurretMed extends ModelBase { + ModelRenderer Center; + ModelRenderer FRBrace; + ModelRenderer BRBrace; + ModelRenderer FLBrace; + ModelRenderer BLBrace; + ModelRenderer FLBrace2; + ModelRenderer FLBrace3; + ModelRenderer FRBrace2; + ModelRenderer FRBrace3; + ModelRenderer BRBrace2; + ModelRenderer BRBrace3; + ModelRenderer BLBrace3; + ModelRenderer BLBrace2; + ModelRenderer neck; + ModelRenderer LeftFace; + ModelRenderer RightFace; + ModelRenderer Head; + ModelRenderer Barrel; + ModelRenderer Center2; + ModelRenderer BarrelBrace; + ModelRenderer BarrelCap; + + public ModelTurretMed() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Center = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-2.0f, 0.0f, -2.0f, 4, 5, 4); + this.Center.setRotationPoint(0.0f, 14.0f, 0.0f); + this.Center.setTextureSize(128, 128); + this.Center.mirror = true; + this.setRotation(this.Center, 0.0f, 0.7853982f, 0.0f); + (this.FRBrace = new ModelRenderer((ModelBase)this, 0, 20)) + .addBox(-1.0f, 14.5f, -8.5f, 2, 3, 6); + this.FRBrace.setRotationPoint(0.0f, 0.0f, 0.0f); + this.FRBrace.setTextureSize(128, 128); + this.FRBrace.mirror = true; + this.setRotation(this.FRBrace, 0.1745329f, 0.7853982f, 0.0f); + (this.BRBrace = new ModelRenderer((ModelBase)this, 0, 20)) + .addBox(-1.0f, 14.5f, -8.5f, 2, 3, 6); + this.BRBrace.setRotationPoint(0.0f, 0.0f, 0.0f); + this.BRBrace.setTextureSize(128, 128); + this.BRBrace.mirror = true; + this.setRotation(this.BRBrace, 0.1745329f, -3.926991f, 0.0f); + (this.FLBrace = new ModelRenderer((ModelBase)this, 0, 20)) + .addBox(-1.0f, 14.5f, -8.5f, 2, 3, 6); + this.FLBrace.setRotationPoint(0.0f, 0.0f, 0.0f); + this.FLBrace.setTextureSize(128, 128); + this.FLBrace.mirror = true; + this.setRotation(this.FLBrace, 0.1745329f, -0.7853982f, 0.0f); + (this.BLBrace = new ModelRenderer((ModelBase)this, 0, 20)) + .addBox(-1.0f, 14.5f, -8.5f, 2, 3, 6); + this.BLBrace.setRotationPoint(0.0f, 0.0f, 0.0f); + this.BLBrace.setTextureSize(128, 128); + this.BLBrace.mirror = true; + this.setRotation(this.BLBrace, 0.1745329f, -2.356194f, 0.0f); + (this.FLBrace2 = new ModelRenderer((ModelBase)this, 0, 20)) + .addBox(-1.0f, 7.0f, -21.0f, 2, 3, 6); + this.FLBrace2.setRotationPoint(0.0f, 0.0f, 0.0f); + this.FLBrace2.setTextureSize(128, 128); + this.FLBrace2.mirror = true; + this.setRotation(this.FLBrace2, 0.7853982f, -0.7853982f, 0.0f); + (this.FLBrace3 = new ModelRenderer((ModelBase)this, 20, 20)) + .addBox(-2.0f, -10.0f, -24.0f, 4, 3, 4); + this.FLBrace3.setRotationPoint(0.0f, 0.0f, 0.0f); + this.FLBrace3.setTextureSize(128, 128); + this.FLBrace3.mirror = true; + this.setRotation(this.FLBrace3, 1.570796f, -0.7853982f, 0.0f); + (this.FRBrace2 = new ModelRenderer((ModelBase)this, 0, 20)) + .addBox(-1.0f, 7.0f, -21.0f, 2, 3, 6); + this.FRBrace2.setRotationPoint(0.0f, 0.0f, 0.0f); + this.FRBrace2.setTextureSize(128, 128); + this.FRBrace2.mirror = true; + this.setRotation(this.FRBrace2, 0.7853982f, 0.7853982f, 0.0f); + (this.FRBrace3 = new ModelRenderer((ModelBase)this, 20, 20)) + .addBox(-2.0f, -10.03333f, -24.0f, 4, 3, 4); + this.FRBrace3.setRotationPoint(0.0f, 0.0f, 0.0f); + this.FRBrace3.setTextureSize(128, 128); + this.FRBrace3.mirror = true; + this.setRotation(this.FRBrace3, 1.570796f, 0.7853982f, 0.0f); + (this.BRBrace2 = new ModelRenderer((ModelBase)this, 0, 20)) + .addBox(-1.0f, 7.0f, -21.0f, 2, 3, 6); + this.BRBrace2.setRotationPoint(0.0f, 0.0f, 0.0f); + this.BRBrace2.setTextureSize(128, 128); + this.BRBrace2.mirror = true; + this.setRotation(this.BRBrace2, 0.7853982f, -3.926991f, 0.0f); + (this.BRBrace3 = new ModelRenderer((ModelBase)this, 20, 20)) + .addBox(-2.0f, -10.0f, -24.0f, 4, 3, 4); + this.BRBrace3.setRotationPoint(0.0f, 0.0f, 0.0f); + this.BRBrace3.setTextureSize(128, 128); + this.BRBrace3.mirror = true; + this.setRotation(this.BRBrace3, 1.570796f, -3.926991f, 0.0f); + (this.BLBrace3 = new ModelRenderer((ModelBase)this, 20, 20)) + .addBox(-2.0f, -10.0f, -24.0f, 4, 3, 4); + this.BLBrace3.setRotationPoint(0.0f, 0.0f, 0.0f); + this.BLBrace3.setTextureSize(128, 128); + this.BLBrace3.mirror = true; + this.setRotation(this.BLBrace3, 1.570796f, -2.356194f, 0.0f); + (this.BLBrace2 = new ModelRenderer((ModelBase)this, 0, 20)) + .addBox(-1.0f, 7.0f, -21.0f, 2, 3, 6); + this.BLBrace2.setRotationPoint(0.0f, 0.0f, 0.0f); + this.BLBrace2.setTextureSize(128, 128); + this.BLBrace2.mirror = true; + this.setRotation(this.BLBrace2, 0.7853982f, -2.356194f, 0.0f); + (this.neck = new ModelRenderer((ModelBase)this, 19, 0)) + .addBox(-1.5f, 0.0f, -1.5f, 3, 5, 3); + this.neck.setRotationPoint(0.0f, 11.0f, 0.0f); + this.neck.setTextureSize(128, 128); + this.neck.mirror = true; + this.setRotation(this.neck, 0.0f, 0.0f, 0.0f); + (this.LeftFace = new ModelRenderer((ModelBase)this, 17, 69)) + .addBox(3.0f, -1.0f, -1.0f, 2, 2, 6); + this.LeftFace.setRotationPoint(0.0f, 11.0f, 0.0f); + this.LeftFace.setTextureSize(128, 128); + this.LeftFace.mirror = true; + this.setRotation(this.LeftFace, 0.0f, 0.0f, 0.0f); + (this.RightFace = new ModelRenderer((ModelBase)this, 0, 69)) + .addBox(-5.0f, -1.0f, -1.0f, 2, 2, 6); + this.RightFace.setRotationPoint(0.0f, 11.0f, 0.0f); + this.RightFace.setTextureSize(128, 128); + this.RightFace.mirror = true; + this.setRotation(this.RightFace, 0.0f, 0.0f, 0.0f); + (this.Head = new ModelRenderer((ModelBase)this, 0, 55)) + .addBox(-3.0f, -2.0f, -2.0f, 6, 4, 8); + this.Head.setRotationPoint(0.0f, 11.0f, 0.0f); + this.Head.setTextureSize(128, 128); + this.Head.mirror = true; + this.setRotation(this.Head, 0.0f, 0.0f, 0.0f); + (this.Barrel = new ModelRenderer((ModelBase)this, 0, 42)) + .addBox(-1.0f, -1.0f, -6.0f, 2, 2, 2); + this.Barrel.setRotationPoint(0.0f, 11.0f, 0.0f); + this.Barrel.setTextureSize(128, 128); + this.Barrel.mirror = true; + this.setRotation(this.Barrel, 0.0f, 0.0f, 0.0f); + (this.Center2 = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-2.0f, 0.0f, -2.0f, 4, 5, 4); + this.Center2.setRotationPoint(0.0f, 14.0f, 0.0f); + this.Center2.setTextureSize(128, 128); + this.Center2.mirror = true; + this.setRotation(this.Center2, 0.0f, 0.0f, 0.0f); + (this.BarrelBrace = new ModelRenderer((ModelBase)this, 0, 36)) + .addBox(-2.0f, -1.5f, -4.0f, 4, 3, 2); + this.BarrelBrace.setRotationPoint(0.0f, 11.0f, 0.0f); + this.BarrelBrace.setTextureSize(128, 128); + this.BarrelBrace.mirror = true; + this.setRotation(this.BarrelBrace, 0.0f, 0.0f, 0.0f); + (this.BarrelCap = new ModelRenderer((ModelBase)this, 0, 47)) + .addBox(-1.5f, -1.5f, -7.0f, 3, 3, 2); + this.BarrelCap.setRotationPoint(0.0f, 11.0f, 0.0f); + this.BarrelCap.setTextureSize(128, 128); + this.BarrelCap.mirror = true; + this.setRotation(this.BarrelCap, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity par1Entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + this.setRotationAngles(f, f1, f2, f3, f4, f5); + this.LeftFace.render(f5); + this.RightFace.render(f5); + this.Head.render(f5); + this.Barrel.render(f5); + this.BarrelBrace.render(f5); + this.BarrelCap.render(f5); + } + + public void renderLegs(final float f5) { + this.FRBrace.render(f5); + this.BRBrace.render(f5); + this.FLBrace.render(f5); + this.BLBrace.render(f5); + this.FLBrace2.render(f5); + this.FLBrace3.render(f5); + this.FRBrace2.render(f5); + this.FRBrace3.render(f5); + this.BRBrace2.render(f5); + this.BRBrace3.render(f5); + this.BLBrace3.render(f5); + this.BLBrace2.render(f5); + this.neck.render(f5); + this.Center.render(f5); + this.Center2.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(final float par1, final float par2, + final float par3, final float par4, + final float par5, final float par6) { + final ModelRenderer[] Body = {this.Center, this.FRBrace, this.BRBrace, + this.FLBrace, this.BLBrace, this.FLBrace2, + this.FLBrace3, this.FRBrace2, this.FRBrace3, + this.BRBrace2, this.BRBrace3, this.BLBrace3, + this.BLBrace2, this.neck}; + for (int i = 0; i < Body.length; ++i) { + } + this.LeftFace.rotateAngleY = par4 / 57.295776f; + this.LeftFace.rotateAngleX = par5 / 57.295776f; + this.RightFace.rotateAngleY = par4 / 57.295776f; + this.RightFace.rotateAngleX = par5 / 57.295776f; + this.Head.rotateAngleY = par4 / 57.295776f; + this.Head.rotateAngleX = par5 / 57.295776f; + this.Barrel.rotateAngleY = par4 / 57.295776f; + this.Barrel.rotateAngleX = par5 / 57.295776f; + this.BarrelBrace.rotateAngleY = par4 / 57.295776f; + this.BarrelBrace.rotateAngleX = par5 / 57.295776f; + this.BarrelCap.rotateAngleY = par4 / 57.295776f; + this.BarrelCap.rotateAngleX = par5 / 57.295776f; + } +} diff --git a/src/main/java/icbm/gangshao/packet/PacketHandlerTurret.java b/src/main/java/icbm/gangshao/packet/PacketHandlerTurret.java new file mode 100644 index 0000000..e985d7f --- /dev/null +++ b/src/main/java/icbm/gangshao/packet/PacketHandlerTurret.java @@ -0,0 +1,26 @@ +package icbm.gangshao.packet; + +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import icbm.gangshao.turret.TTurretBase; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class PacketHandlerTurret + implements IMessageHandler { + + @Override + public IMessage onMessage(PacketTurret message, MessageContext ctx) { + World world = FMLClientHandler.instance().getWorldClient(); + + TileEntity te = message.turretPos.getTileEntity(world); + + if (te instanceof TTurretBase) { + ((TTurretBase) te).onTurretPacket(message.type, message.data); + } + + return null; + } +} diff --git a/src/main/java/icbm/gangshao/packet/PacketTurret.java b/src/main/java/icbm/gangshao/packet/PacketTurret.java new file mode 100644 index 0000000..13c7171 --- /dev/null +++ b/src/main/java/icbm/gangshao/packet/PacketTurret.java @@ -0,0 +1,92 @@ +package icbm.gangshao.packet; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufInputStream; +import io.netty.buffer.ByteBufOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; +import universalelectricity.core.vector.Vector3; + +public class PacketTurret implements IMessage { + Type type; + Vector3 turretPos; + NBTTagCompound data; + + public PacketTurret() { + this(null, null, null); + } + + public PacketTurret(Vector3 turretPos, Type type, NBTTagCompound data) { + this.type = type; + this.data = data; + this.turretPos = turretPos; + } + + public static PacketTurret rotation(Vector3 turretPos, float yaw, + float pitch) { + NBTTagCompound data = new NBTTagCompound(); + + data.setFloat("yaw", yaw); + data.setFloat("pitch", pitch); + + return new PacketTurret(turretPos, Type.ROTATION, data); + } + + public static PacketTurret shot(Vector3 turretPos, Vector3 target, float yaw, + float pitch) { + NBTTagCompound data = new NBTTagCompound(); + + data.setTag("target", target.writeToNBT(new NBTTagCompound())); + data.setFloat("yaw", yaw); + data.setFloat("pitch", pitch); + + return new PacketTurret(turretPos, Type.SHOT, data); + } + + public static PacketTurret stats(Vector3 turretPos, int health) { + NBTTagCompound data = new NBTTagCompound(); + + data.setInteger("health", health); + + return new PacketTurret(turretPos, Type.STATS, data); + } + + @Override + public void fromBytes(ByteBuf buf) { + try { + this.data = CompressedStreamTools.readCompressed( + new DataInputStream(new ByteBufInputStream(buf))); + + this.turretPos = Vector3.readFromNBT(this.data); + + if (this.data.getInteger("type") >= Type.values().length) + throw new IllegalArgumentException("Type out of bounds"); + this.type = Type.values()[this.data.getInteger("type")]; + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void toBytes(ByteBuf buf) { + this.data.setInteger("type", this.type.ordinal()); + this.turretPos.writeToNBT(this.data); + + try { + CompressedStreamTools.writeCompressed( + this.data, new DataOutputStream(new ByteBufOutputStream(buf))); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static enum Type { + ROTATION, + SHOT, + STATS; + } +} diff --git a/src/main/java/icbm/gangshao/platform/BlockTurretPlatform.java b/src/main/java/icbm/gangshao/platform/BlockTurretPlatform.java new file mode 100644 index 0000000..926c967 --- /dev/null +++ b/src/main/java/icbm/gangshao/platform/BlockTurretPlatform.java @@ -0,0 +1,130 @@ +package icbm.gangshao.platform; + +import icbm.core.ICBMTab; +import icbm.core.di.BICBM; +import icbm.gangshao.IAmmunition; +import icbm.gangshao.ISpecialAccess; +import icbm.gangshao.ICBMSentry; +import icbm.gangshao.access.AccessLevel; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +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.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import universalelectricity.core.UniversalElectricity; + +public class BlockTurretPlatform extends BICBM { + public BlockTurretPlatform() { + super("turretPlatform", UniversalElectricity.machine); + this.setHardness(100.0f); + this.setResistance(50.0f); + this.setCreativeTab((CreativeTabs) ICBMTab.INSTANCE); + super.requireSidedTextures = true; + } + + @Override + public IIcon getIcon(final int side, final int metadata) { + return (side == 0) ? super.iconBottom + : ((side == 1) ? super.iconTop : super.iconSide); + } + + @Override + public void onBlockPlacedBy(final World world, final int x, final int y, + final int z, final EntityLivingBase entity, + final ItemStack itemStack) { + if (entity instanceof EntityPlayer && !world.isRemote) { + final TileEntity ent = world.getTileEntity(x, y, z); + if (ent instanceof ISpecialAccess) { + ((ISpecialAccess) ent) + .addUserAccess(((EntityPlayer) entity).getDisplayName(), + AccessLevel.OWNER, true); + } + } + } + + @Override + public boolean onMachineActivated(final World world, final int x, final int y, + final int z, final EntityPlayer player, + final int side, final float hitX, + final float hitY, final float hitZ) { + final TileEntity tileEntity = world.getTileEntity(x, y, z); + if (!(tileEntity instanceof TPlatform)) { + return false; + } + if (player.getCurrentEquippedItem() != null && + side == ((TPlatform) tileEntity).deployDirection.ordinal() && + player.getCurrentEquippedItem().getItem() == Item.getItemFromBlock(ICBMSentry.blockTurret)) { + return false; + } + if (((TPlatform) tileEntity).getTurret(false) != null && !world.isRemote) { + player.openGui((Object) ICBMSentry.instance, 0, world, x, y, z); + } + return true; + } + + @Override + public TileEntity createNewTileEntity(final World var1, int meta) { + return new TPlatform(); + } + + @Override + public void dropEntireInventory(final World world, final int x, final int y, + final int z, final Block par5, + final int par6) { + final TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity != null && tileEntity instanceof IInventory) { + final IInventory inventory = (IInventory) tileEntity; + for (int slot = 0; slot < inventory.getSizeInventory(); ++slot) { + ItemStack itemStack = inventory.getStackInSlot(slot); + if (itemStack != null) { + boolean flag = true; + final Item item = itemStack.getItem(); + if (item instanceof IAmmunition) { + if (((IAmmunition) item).canDrop(itemStack.getItemDamage())) { + flag = true; + itemStack = ((IAmmunition) item).onDroppedIntoWorld(itemStack.copy()); + } else { + flag = false; + } + } + if (flag) { + final Random random = new Random(); + final float var8 = random.nextFloat() * 0.8f + 0.1f; + final float var9 = random.nextFloat() * 0.8f + 0.1f; + final float var10 = random.nextFloat() * 0.8f + 0.1f; + while (itemStack.stackSize > 0) { + int var11 = random.nextInt(21) + 10; + if (var11 > itemStack.stackSize) { + var11 = itemStack.stackSize; + } + final ItemStack itemStack2 = itemStack; + itemStack2.stackSize -= var11; + final EntityItem var12 = new EntityItem(world, (double) (x + var8), (double) (y + var9), + (double) (z + var10), + new ItemStack(itemStack.getItem(), var11, + itemStack.getItemDamage())); + if (itemStack.hasTagCompound()) { + var12.getEntityItem().setTagCompound( + (NBTTagCompound) itemStack.getTagCompound().copy()); + } + final float var13 = 0.05f; + ((Entity) var12).motionX = (float) random.nextGaussian() * var13; + ((Entity) var12).motionY = (float) random.nextGaussian() * var13 + 0.2f; + ((Entity) var12).motionZ = (float) random.nextGaussian() * var13; + world.spawnEntityInWorld((Entity) var12); + } + } + } + } + } + } +} diff --git a/src/main/java/icbm/gangshao/platform/TPlatform.java b/src/main/java/icbm/gangshao/platform/TPlatform.java new file mode 100644 index 0000000..a4facc3 --- /dev/null +++ b/src/main/java/icbm/gangshao/platform/TPlatform.java @@ -0,0 +1,347 @@ +package icbm.gangshao.platform; + +import icbm.gangshao.IAmmunition; +import icbm.gangshao.ITurretUpgrade; +import icbm.gangshao.ProjectileType; +import icbm.gangshao.damage.IHealthTile; +import icbm.gangshao.terminal.TileEntityTerminal; +import icbm.gangshao.turret.ItemAmmo; +import icbm.gangshao.turret.TTurretBase; +import icbm.gangshao.turret.upgrades.ItPaoTaiUpgrades; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.DamageSource; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.UniversalElectricity; +import universalelectricity.core.electricity.ElectricityPack; +import universalelectricity.core.item.ElectricItemHelper; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.CustomDamageSource; + +public class TPlatform extends TileEntityTerminal implements IInventory { + private TTurretBase turret; + public ForgeDirection deployDirection; + public static final int UPGRADE_START_INDEX = 12; + private static final int TURRET_UPGADE_SLOTS = 3; + public ItemStack[] containingItems; + + public TPlatform() { + this.turret = null; + this.deployDirection = ForgeDirection.UP; + this.containingItems = new ItemStack[16]; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (super.prevWatts != super.wattsReceived) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + } + if (!this.worldObj.isRemote) { + for (int i = 0; i < 12; ++i) { + if (super.wattsReceived >= this.getRequest().getWatts()) { + break; + } + super.wattsReceived += ElectricItemHelper.dechargeItem( + this.getStackInSlot(i), Math.ceil(this.getRequest().getWatts()), + this.getVoltage()); + } + } + } + + @Override + public void onReceive(final ElectricityPack electricityPack) { + if (UniversalElectricity.isVoltageSensitive && + electricityPack.voltage > this.getVoltage()) { + final TTurretBase turret = this.getTurret(false); + if (turret != null && turret instanceof IHealthTile) { + this.turret.onDamageTaken(CustomDamageSource.electrocution, + Integer.MAX_VALUE); + } + return; + } + super.wattsReceived = Math.min( + super.wattsReceived + electricityPack.getWatts(), this.getWattBuffer()); + if (super.prevWatts <= this.getRequest().getWatts() && + super.wattsReceived >= this.getRequest().getWatts() && + super.prevWatts != super.wattsReceived) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + } + } + + @Override + public ElectricityPack getRequest() { + if (this.getTurret(false) != null && + super.wattsReceived < this.getTurret(false).getFiringRequest()) { + return ElectricityPack.getFromWatts( + Math.max(this.turret.getFiringRequest(), 0.0), + this.getTurret(false).getVoltage()); + } + return new ElectricityPack(); + } + + @Override + public double getWattBuffer() { + if (this.getTurret(false) != null) { + return new ElectricityPack( + Math.max(this.turret.getFiringRequest() / + this.getTurret(false).getVoltage(), + 0.0), + this.getTurret(false).getVoltage()) + .getWatts() * + 2.0; + } + return 0.0; + } + + public TTurretBase getTurret(final boolean getNew) { + final Vector3 position = new Vector3(this); + if (getNew || this.turret == null || this.turret.isInvalid() || + !new Vector3(this.turret) + .equals(position.clone().modifyPositionFromSide( + this.deployDirection))) { + final TileEntity tileEntity = position.clone() + .modifyPositionFromSide(this.deployDirection) + .getTileEntity((IBlockAccess) this.worldObj); + if (tileEntity instanceof TTurretBase) { + this.turret = (TTurretBase) tileEntity; + } else { + this.turret = null; + } + } + return this.turret; + } + + public boolean destroyTurret() { + final TileEntity ent = this.worldObj.getTileEntity(this.xCoord + this.deployDirection.offsetX, + this.yCoord + this.deployDirection.offsetY, + this.zCoord + this.deployDirection.offsetZ); + if (ent instanceof TTurretBase) { + this.turret = null; + ((TTurretBase) ent).destroy(false); + return true; + } + return false; + } + + public boolean destroy(final boolean doExplosion) { + if (doExplosion) { + this.worldObj.createExplosion((Entity) null, (double) this.xCoord, + (double) this.yCoord, (double) this.zCoord, + 2.0f, true); + } + if (!this.worldObj.isRemote) { + this.getBlockType().dropBlockAsItem(this.worldObj, this.xCoord, + this.yCoord, this.zCoord, + this.getBlockMetadata(), 0); + } + return this.worldObj.setBlockToAir(this.xCoord, this.yCoord, this.zCoord); + } + + @Override + public String getInventoryName() { + return this.getBlockType().getLocalizedName(); + } + + public boolean isRunning() { + return !this.isDisabled() && this.getTurret(false) != null && + super.wattsReceived >= this.getTurret(false).getFiringRequest(); + } + + public ItemStack hasAmmunition(final ProjectileType projectileType) { + for (int i = 0; i < 12; ++i) { + final ItemStack itemStack = this.containingItems[i]; + if (itemStack != null) { + final Item item = itemStack.getItem(); + if (item instanceof IAmmunition && + ((IAmmunition) item).getType(itemStack) == projectileType) { + return itemStack; + } + } + } + return null; + } + + public boolean useAmmunition(final ItemStack ammoStack) { + if (ammoStack != null) { + if (ammoStack.getItemDamage() == ItemAmmo.AmmoType.BULLETINF.ordinal()) { + return true; + } + for (int i = 0; i < 12; ++i) { + final ItemStack itemStack = this.containingItems[i]; + if (itemStack != null && itemStack.isItemEqual(ammoStack)) { + this.decrStackSize(i, 1); + return true; + } + } + } + return false; + } + + public int getUpgradeCount(final ItPaoTaiUpgrades.TurretUpgradeType type) { + int count = 0; + for (int i = 12; i < 15; ++i) { + final ItemStack itemStack = this.getStackInSlot(i); + if (itemStack != null && itemStack.getItem() instanceof ITurretUpgrade && + ((ITurretUpgrade) itemStack.getItem()).getType(itemStack) == type) { + ++count; + } + } + return count; + } + + @Override + public void readFromNBT(final NBTTagCompound nbt) { + super.readFromNBT(nbt); + super.wattsReceived = nbt.getDouble("wattsReceived"); + final NBTTagList var2 = nbt.getTagList("Items", 10); + this.containingItems = new ItemStack[this.getSizeInventory()]; + for (int var3 = 0; var3 < var2.tagCount(); ++var3) { + final NBTTagCompound var4 = (NBTTagCompound) var2.getCompoundTagAt(var3); + final byte var5 = var4.getByte("Slot"); + if (var5 >= 0 && var5 < this.containingItems.length) { + this.containingItems[var5] = ItemStack.loadItemStackFromNBT(var4); + } + } + } + + @Override + public void writeToNBT(final NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setDouble("wattsReceived", super.wattsReceived); + final NBTTagList itemTag = new NBTTagList(); + for (int slots = 0; slots < this.containingItems.length; ++slots) { + if (this.containingItems[slots] != null) { + final NBTTagCompound itemNbtData = new NBTTagCompound(); + itemNbtData.setByte("Slot", (byte) slots); + this.containingItems[slots].writeToNBT(itemNbtData); + itemTag.appendTag((NBTBase) itemNbtData); + } + } + nbt.setTag("Items", (NBTBase) itemTag); + } + + @Override + public int getSizeInventory() { + return this.containingItems.length; + } + + @Override + public ItemStack getStackInSlot(final int par1) { + return this.containingItems[par1]; + } + + @Override + public ItemStack getStackInSlotOnClosing(final int par1) { + if (this.containingItems[par1] != null) { + final ItemStack var2 = this.containingItems[par1]; + this.containingItems[par1] = null; + return var2; + } + return null; + } + + @Override + public ItemStack decrStackSize(final int par1, final int par2) { + if (this.containingItems[par1] == null) { + return null; + } + if (this.containingItems[par1].stackSize <= par2) { + final ItemStack var3 = this.containingItems[par1]; + this.containingItems[par1] = null; + return var3; + } + final ItemStack var3 = this.containingItems[par1].splitStack(par2); + if (this.containingItems[par1].stackSize == 0) { + this.containingItems[par1] = null; + } + return var3; + } + + @Override + public void setInventorySlotContents(final int par1, + final ItemStack par2ItemStack) { + this.containingItems[par1] = par2ItemStack; + if (par2ItemStack != null && + par2ItemStack.stackSize > this.getInventoryStackLimit()) { + par2ItemStack.stackSize = this.getInventoryStackLimit(); + } + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(final EntityPlayer par1EntityPlayer) { + return true; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public boolean canConnect(final ForgeDirection direction) { + return true; + } + + @Override + public boolean hasCustomInventoryName() { + return true; + } + + @Override + public boolean isItemValidForSlot(final int slotID, + final ItemStack itemStack) { + return slotID < 12 && itemStack.getItem() instanceof IAmmunition; + } + + @Override + public void markDirty() { + super.markDirty(); + } + + @Override + public String getChannel() { + return "ICBM"; + } + + //TODO: WTF + //@Override + public boolean addStackToInventory(final ItemStack itemStack) { + for (int i = 0; i < 12; ++i) { + final ItemStack checkStack = this.getStackInSlot(i); + if (itemStack.stackSize <= 0) { + return true; + } + if (checkStack == null) { + this.setInventorySlotContents(i, itemStack); + return true; + } + if (checkStack.isItemEqual(itemStack)) { + final int inputStack = Math.min(checkStack.stackSize + itemStack.stackSize, + checkStack.getMaxStackSize()) - + checkStack.stackSize; + itemStack.stackSize -= inputStack; + final ItemStack itemStack2 = checkStack; + itemStack2.stackSize += inputStack; + this.setInventorySlotContents(i, checkStack); + } + } + return false; + } +} diff --git a/src/main/java/icbm/gangshao/render/BlockRenderingHandler.java b/src/main/java/icbm/gangshao/render/BlockRenderingHandler.java new file mode 100644 index 0000000..4dd1534 --- /dev/null +++ b/src/main/java/icbm/gangshao/render/BlockRenderingHandler.java @@ -0,0 +1,77 @@ +package icbm.gangshao.render; + +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.gangshao.turret.BlockTurret; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class BlockRenderingHandler implements ISimpleBlockRenderingHandler { + public static final int ID; + + @Override + public void renderInventoryBlock(final Block block, final int metadata, + final int modelID, + final RenderBlocks renderer) { + if (modelID == BlockRenderingHandler.ID) { + GL11.glPushMatrix(); + if (metadata == BlockTurret.TurretType.GUN.ordinal()) { + GL11.glTranslatef(0.1f, 1.0f, 0.0f); + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation("icbm", + "textures/models/gun_turret_neutral.png")); + RGunTurret.render(0.0f, 0.0f); + } + if (metadata == BlockTurret.TurretType.LASER.ordinal()) { + GL11.glTranslatef(0.4f, 1.4f, 0.0f); + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation("icbm", + "textures/models/laser_turret_neutral.png")); + RLaserTurret.render(0.0f, 0.0f); + } else if (metadata == BlockTurret.TurretType.AA.ordinal()) { + GL11.glTranslatef(0.2f, 0.3f, 0.0f); + GL11.glScalef(0.45f, 0.45f, 0.45f); + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation("icbm", + "textures/models/aa_turret_neutral.png")); + RAATurret.render(0.0f, 0.0f); + } else if (metadata == BlockTurret.TurretType.RAILGUN.ordinal()) { + GL11.glTranslatef(0.0f, 0.9f, 0.0f); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/models/railgun.png")); + RRailgun.MODEL.render(90.0f, 0.0f, 0.0625f); + } + GL11.glPopMatrix(); + } + } + + @Override + public boolean renderWorldBlock(final IBlockAccess iBlockAccess, final int x, + final int y, final int z, final Block block, + final int modelID, + final RenderBlocks renderer) { + return false; + } + + @Override + public boolean shouldRender3DInInventory(int id) { + return true; + } + + @Override + public int getRenderId() { + return BlockRenderingHandler.ID; + } + + static { + ID = RenderingRegistry.getNextAvailableRenderId(); + } +} diff --git a/src/main/java/icbm/gangshao/render/FXBeam.java b/src/main/java/icbm/gangshao/render/FXBeam.java new file mode 100644 index 0000000..d7daa4b --- /dev/null +++ b/src/main/java/icbm/gangshao/render/FXBeam.java @@ -0,0 +1,182 @@ +package icbm.gangshao.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.EntityFX; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import org.lwjgl.opengl.GL11; +import universalelectricity.core.vector.Vector3; + +@SideOnly(Side.CLIENT) +public class FXBeam extends EntityFX { + double movX; + double movY; + double movZ; + private float length; + private float rotYaw; + private float rotPitch; + private float prevYaw; + private float prevPitch; + private Vector3 target; + private float endModifier; + private boolean reverse; + private boolean pulse; + private int rotationSpeed; + private float prevSize; + + public FXBeam(final World par1World, final Vector3 position, + final Vector3 target, final float red, final float green, + final float blue, final int age) { + super(par1World, position.x, position.y, position.z, 0.0, 0.0, 0.0); + this.movX = 0.0; + this.movY = 0.0; + this.movZ = 0.0; + this.length = 0.0f; + this.rotYaw = 0.0f; + this.rotPitch = 0.0f; + this.prevYaw = 0.0f; + this.prevPitch = 0.0f; + this.target = new Vector3(); + this.endModifier = 1.0f; + this.reverse = false; + this.pulse = true; + this.rotationSpeed = 20; + this.prevSize = 0.0f; + this.setRGB(red, green, blue); + this.setSize(0.02f, 0.02f); + ((Entity) this).noClip = true; + ((Entity) this).motionX = 0.0; + ((Entity) this).motionY = 0.0; + ((Entity) this).motionZ = 0.0; + this.target = target; + final float xd = (float) (((Entity) this).posX - this.target.x); + final float yd = (float) (((Entity) this).posY - this.target.y); + final float zd = (float) (((Entity) this).posZ - this.target.z); + this.length = (float) new Vector3((Entity) this).distanceTo(this.target); + final double var7 = MathHelper.sqrt_double((double) (xd * xd + zd * zd)); + this.rotYaw = (float) (Math.atan2(xd, zd) * 180.0 / 3.141592653589793); + this.rotPitch = (float) (Math.atan2(yd, var7) * 180.0 / 3.141592653589793); + this.prevYaw = this.rotYaw; + this.prevPitch = this.rotPitch; + super.particleMaxAge = age; + final EntityLivingBase renderentity = Minecraft.getMinecraft().renderViewEntity; + int visibleDistance = 50; + if (!Minecraft.getMinecraft().gameSettings.fancyGraphics) { + visibleDistance = 25; + } + if (renderentity.getDistance(((Entity) this).posX, ((Entity) this).posY, + ((Entity) this).posZ) > visibleDistance) { + super.particleMaxAge = 0; + } + } + + public void onUpdate() { + ((Entity) this).prevPosX = ((Entity) this).posX; + ((Entity) this).prevPosY = ((Entity) this).posY; + ((Entity) this).prevPosZ = ((Entity) this).posZ; + this.prevYaw = this.rotYaw; + this.prevPitch = this.rotPitch; + final float xd = (float) (((Entity) this).posX - this.target.x); + final float yd = (float) (((Entity) this).posY - this.target.y); + final float zd = (float) (((Entity) this).posZ - this.target.z); + this.length = MathHelper.sqrt_float(xd * xd + yd * yd + zd * zd); + final double var7 = MathHelper.sqrt_double((double) (xd * xd + zd * zd)); + this.rotYaw = (float) (Math.atan2(xd, zd) * 180.0 / 3.141592653589793); + this.rotPitch = (float) (Math.atan2(yd, var7) * 180.0 / 3.141592653589793); + if (super.particleAge++ >= super.particleMaxAge) { + this.setDead(); + } + } + + public void setRGB(final float r, final float g, final float b) { + super.particleRed = r; + super.particleGreen = g; + super.particleBlue = b; + } + + public void renderParticle(final Tessellator tessellator, final float f, + final float f1, final float f2, final float f3, + final float f4, final float f5) { + tessellator.draw(); + GL11.glPushMatrix(); + final float var9 = 1.0f; + final float slide = (float) ((Entity) this).worldObj.getTotalWorldTime(); + final float rot = ((Entity) this).worldObj.provider.getWorldTime() % + (360 / this.rotationSpeed) * this.rotationSpeed + + this.rotationSpeed * f; + float size = 1.0f; + if (this.pulse) { + size = Math.min(super.particleAge / 4.0f, 1.0f); + size = this.prevSize + (size - this.prevSize) * f; + } + float op = 0.5f; + if (this.pulse && super.particleMaxAge - super.particleAge <= 4) { + op = 0.5f - (4 - (super.particleMaxAge - super.particleAge)) * 0.1f; + } + Minecraft.getMinecraft().renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/noise.png")); + GL11.glTexParameterf(3553, 10242, 10497.0f); + GL11.glTexParameterf(3553, 10243, 10497.0f); + GL11.glDisable(2884); + float var10 = slide + f; + if (this.reverse) { + var10 *= -1.0f; + } + final float var11 = -var10 * 0.2f - MathHelper.floor_float(-var10 * 0.1f); + GL11.glEnable(3042); + GL11.glBlendFunc(770, 1); + GL11.glDepthMask(false); + final float xx = (float) (((Entity) this).prevPosX + + (((Entity) this).posX - ((Entity) this).prevPosX) * f - + EntityFX.interpPosX); + final float yy = (float) (((Entity) this).prevPosY + + (((Entity) this).posY - ((Entity) this).prevPosY) * f - + EntityFX.interpPosY); + final float zz = (float) (((Entity) this).prevPosZ + + (((Entity) this).posZ - ((Entity) this).prevPosZ) * f - + EntityFX.interpPosZ); + GL11.glTranslated((double) xx, (double) yy, (double) zz); + final float ry = this.prevYaw + (this.rotYaw - this.prevYaw) * f; + final float rp = this.prevPitch + (this.rotPitch - this.prevPitch) * f; + GL11.glRotatef(90.0f, 1.0f, 0.0f, 0.0f); + GL11.glRotatef(180.0f + ry, 0.0f, 0.0f, -1.0f); + GL11.glRotatef(rp, 1.0f, 0.0f, 0.0f); + final double var12 = -0.15 * size; + final double var13 = 0.15 * size; + final double var44b = -0.15 * size * this.endModifier; + final double var17b = 0.15 * size * this.endModifier; + GL11.glRotatef(rot, 0.0f, 1.0f, 0.0f); + for (int t = 0; t < 3; ++t) { + final double var14 = this.length * size * var9; + final double var15 = 0.0; + final double var16 = 1.0; + final double var17 = -1.0f + var11 + t / 3.0f; + final double var18 = this.length * size * var9 + var17; + GL11.glRotatef(60.0f, 0.0f, 1.0f, 0.0f); + tessellator.startDrawingQuads(); + tessellator.setBrightness(200); + tessellator.setColorRGBA_F(super.particleRed, super.particleGreen, + super.particleBlue, op); + tessellator.addVertexWithUV(var44b, var14, 0.0, var16, var18); + tessellator.addVertexWithUV(var12, 0.0, 0.0, var16, var17); + tessellator.addVertexWithUV(var13, 0.0, 0.0, var15, var17); + tessellator.addVertexWithUV(var17b, var14, 0.0, var15, var18); + tessellator.draw(); + } + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GL11.glDepthMask(true); + GL11.glDisable(3042); + GL11.glEnable(2884); + GL11.glPopMatrix(); + tessellator.startDrawingQuads(); + this.prevSize = size; + Minecraft.getMinecraft().renderEngine.bindTexture( + new ResourceLocation("particles/particles.png")); + } +} diff --git a/src/main/java/icbm/gangshao/render/RAATurret.java b/src/main/java/icbm/gangshao/render/RAATurret.java new file mode 100644 index 0000000..c690784 --- /dev/null +++ b/src/main/java/icbm/gangshao/render/RAATurret.java @@ -0,0 +1,68 @@ +package icbm.gangshao.render; + +import calclavia.lib.render.RenderTaggedTile; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.gangshao.access.AccessLevel; +import icbm.gangshao.muoxing.ModelAATurret; +import icbm.gangshao.turret.TTurretBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RAATurret extends RenderTaggedTile { + public static final String TEXTURE_FILE = "aa_turret_neutral.png"; + public static final String TEXTURE_FILE_FRIENDLY = "aa_turret_friendly.png"; + public static final String TEXTURE_FILE_HOSTILE = "aa_turret_hostile.png"; + public static final ModelAATurret MODEL; + + @Override + public void renderTileEntityAt(final TileEntity t, final double x, + final double y, final double z, + final float f) { + super.renderTileEntityAt(t, x, y, z, f); + if (t instanceof TTurretBase) { + final TTurretBase tileEntity = (TTurretBase) t; + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5f, (float) y + 1.0f, (float) z + 0.5f); + GL11.glScalef(0.7f, 0.7f, 0.7f); + this.setTextureBaseOnState(tileEntity); + render(tileEntity.currentRotationYaw, tileEntity.currentRotationPitch); + GL11.glPopMatrix(); + } + } + + public static void render(final float renderYaw, final float renderPitch) { + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + GL11.glRotatef(180.0f, 0.0f, 1.0f, 0.0f); + GL11.glRotatef(renderYaw, 0.0f, 1.0f, 0.0f); + RAATurret.MODEL.renderBody(0.0625f); + RAATurret.MODEL.renderRadar(0.0625f); + RAATurret.MODEL.renderCannon(0.0625f, (float) Math.toRadians(renderPitch)); + } + + public void setTextureBaseOnState(final TTurretBase tileEntity) { + final EntityPlayer player = this.getPlayer(); + if (tileEntity.getPlatform() != null) { + final AccessLevel level = tileEntity.getPlatform().getUserAccess(player.getDisplayName()); + if (level == AccessLevel.ADMIN) { + this.bindTexture(new ResourceLocation( + "icbm", "textures/models/aa_turret_neutral.png")); + return; + } + if (level.ordinal() >= AccessLevel.USER.ordinal()) { + this.bindTexture(new ResourceLocation( + "icbm", "textures/models/aa_turret_friendly.png")); + return; + } + } + this.bindTexture( + new ResourceLocation("icbm", "textures/models/aa_turret_hostile.png")); + } + + static { + MODEL = new ModelAATurret(); + } +} diff --git a/src/main/java/icbm/gangshao/render/RESeat.java b/src/main/java/icbm/gangshao/render/RESeat.java new file mode 100644 index 0000000..949ab55 --- /dev/null +++ b/src/main/java/icbm/gangshao/render/RESeat.java @@ -0,0 +1,16 @@ +package icbm.gangshao.render; + +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RESeat extends Render { + public void doRender(final Entity var1, final double var2, final double var4, + final double var6, final float var8, final float var9) { + } + + @Override + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + return null; + } +} diff --git a/src/main/java/icbm/gangshao/render/RGunTurret.java b/src/main/java/icbm/gangshao/render/RGunTurret.java new file mode 100644 index 0000000..df961a5 --- /dev/null +++ b/src/main/java/icbm/gangshao/render/RGunTurret.java @@ -0,0 +1,67 @@ +package icbm.gangshao.render; + +import calclavia.lib.render.RenderTaggedTile; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.gangshao.access.AccessLevel; +import icbm.gangshao.muoxing.ModelSentryCannon; +import icbm.gangshao.turret.TTurretBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RGunTurret extends RenderTaggedTile { + public static final String TEXTURE_FILE = "gun_turret_neutral.png"; + public static final String TEXTURE_FILE_FRIENDLY = "gun_turret_friendly.png"; + public static final String TEXTURE_FILE_HOSTILE = "gun_turret_hostile.png"; + public static final ModelSentryCannon MODEL; + + @Override + public void renderTileEntityAt(final TileEntity t, final double x, + final double y, final double z, + final float f) { + super.renderTileEntityAt(t, x, y, z, f); + if (t instanceof TTurretBase) { + final TTurretBase tileEntity = (TTurretBase) t; + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5f, (float) y + 1.5f, (float) z + 0.5f); + this.setTextureBaseOnState(tileEntity); + render(tileEntity.currentRotationYaw, tileEntity.currentRotationPitch); + GL11.glPopMatrix(); + } + } + + public static void render(final float renderYaw, final float renderPitch) { + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + GL11.glRotatef(180.0f, 0.0f, 1.0f, 0.0f); + GL11.glRotatef(renderYaw, 0.0f, 1.0f, 0.0f); + RGunTurret.MODEL.renderYaw(0.0625f); + GL11.glRotatef(renderPitch, 1.0f, 0.0f, 0.0f); + RGunTurret.MODEL.renderYawPitch(0.0625f); + } + + public void setTextureBaseOnState(final TTurretBase tileEntity) { + final EntityPlayer player = this.getPlayer(); + if (tileEntity.getPlatform() != null) { + final AccessLevel level = tileEntity.getPlatform().getUserAccess(player.getDisplayName()); + if (level == AccessLevel.ADMIN) { + this.bindTexture(new ResourceLocation( + "icbm", "textures/models/gun_turret_neutral.png")); + return; + } + if (level.ordinal() >= AccessLevel.USER.ordinal()) { + this.bindTexture(new ResourceLocation( + "icbm", "textures/models/gun_turret_friendly.png")); + return; + } + } + this.bindTexture( + new ResourceLocation("icbm", "textures/models/gun_turret_hostile.png")); + } + + static { + MODEL = new ModelSentryCannon(); + } +} diff --git a/src/main/java/icbm/gangshao/render/RLaserTurret.java b/src/main/java/icbm/gangshao/render/RLaserTurret.java new file mode 100644 index 0000000..0805a3e --- /dev/null +++ b/src/main/java/icbm/gangshao/render/RLaserTurret.java @@ -0,0 +1,74 @@ +package icbm.gangshao.render; + +import calclavia.lib.render.RenderTaggedTile; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.gangshao.access.AccessLevel; +import icbm.gangshao.muoxing.MLeiShe; +import icbm.gangshao.turret.TTurretBase; +import icbm.gangshao.turret.sentries.TLaserTurret; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RLaserTurret extends RenderTaggedTile { + public static final String TEXTURE_FILE = "laser_turret_neutral.png"; + public static final String TEXTURE_FILE_FRIENDLY = "laser_turret_friendly.png"; + public static final String TEXTURE_FILE_HOSTILE = "laser_turret_hostile.png"; + public static final MLeiShe MODEL; + + @Override + public void renderTileEntityAt(final TileEntity t, final double x, + final double y, final double z, + final float f) { + super.renderTileEntityAt(t, x, y, z, f); + if (t instanceof TLaserTurret) { + final TLaserTurret tileEntity = (TLaserTurret) t; + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5f, (float) y + 1.5f, (float) z + 0.5f); + this.setTextureBaseOnState(tileEntity); + render(tileEntity.currentRotationYaw, tileEntity.currentRotationPitch, + tileEntity.barrelRotation); + GL11.glPopMatrix(); + } + } + + public static void render(final float renderYaw, final float renderPitch) { + render(renderYaw, renderPitch, 0.0f); + } + + public static void render(final float renderYaw, final float renderPitch, + final float barrelRotation) { + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + GL11.glRotatef(180.0f, 0.0f, 1.0f, 0.0f); + GL11.glRotatef(renderYaw, 0.0f, 1.0f, 0.0f); + RLaserTurret.MODEL.renderYaw(0.0625f); + GL11.glRotatef(renderPitch, 1.0f, 0.0f, 0.0f); + RLaserTurret.MODEL.renderYawPitch(0.0625f, barrelRotation); + } + + public void setTextureBaseOnState(final TTurretBase tileEntity) { + final EntityPlayer player = this.getPlayer(); + if (tileEntity.getPlatform() != null) { + final AccessLevel level = tileEntity.getPlatform().getUserAccess(player.getDisplayName()); + if (level == AccessLevel.ADMIN) { + this.bindTexture(new ResourceLocation( + "icbm", "textures/models/laser_turret_neutral.png")); + return; + } + if (level.ordinal() >= AccessLevel.USER.ordinal()) { + this.bindTexture(new ResourceLocation( + "icbm", "textures/models/laser_turret_friendly.png")); + return; + } + } + this.bindTexture(new ResourceLocation( + "icbm", "textures/models/laser_turret_hostile.png")); + } + + static { + MODEL = new MLeiShe(); + } +} diff --git a/src/main/java/icbm/gangshao/render/RRailgun.java b/src/main/java/icbm/gangshao/render/RRailgun.java new file mode 100644 index 0000000..b574088 --- /dev/null +++ b/src/main/java/icbm/gangshao/render/RRailgun.java @@ -0,0 +1,41 @@ +package icbm.gangshao.render; + +import calclavia.lib.render.RenderTaggedTile; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.gangshao.muoxing.ModelRailgun; +import icbm.gangshao.turret.mount.TRailgunTurret; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RRailgun extends RenderTaggedTile { + public static final String TEXTURE_FILE = "railgun.png"; + public static final ModelRailgun MODEL; + + @Override + public void renderTileEntityAt(final TileEntity t, final double x, + final double y, final double z, + final float f) { + super.renderTileEntityAt(t, x, y, z, f); + if (t instanceof TRailgunTurret) { + final TRailgunTurret tileEntity = (TRailgunTurret) t; + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5f, (float) y + 2.2f, (float) z + 0.5f); + GL11.glScalef(1.5f, 1.5f, 1.5f); + this.bindTexture( + new ResourceLocation("icbm", "textures/models/railgun.png")); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + GL11.glRotatef(180.0f, 0.0f, 1.0f, 0.0f); + RRailgun.MODEL.render( + (float) Math.toRadians(tileEntity.currentRotationYaw), + (float) Math.toRadians(tileEntity.currentRotationPitch), 0.0625f); + GL11.glPopMatrix(); + } + } + + static { + MODEL = new ModelRailgun(); + } +} diff --git a/src/main/java/icbm/gangshao/saving/INbtSave.java b/src/main/java/icbm/gangshao/saving/INbtSave.java new file mode 100644 index 0000000..4b1711a --- /dev/null +++ b/src/main/java/icbm/gangshao/saving/INbtSave.java @@ -0,0 +1,11 @@ +package icbm.gangshao.saving; + +import net.minecraft.nbt.NBTTagCompound; + +public interface INbtSave { + String saveFileName(); + + NBTTagCompound getSaveData(); + + boolean shouldSave(final boolean p0); +} diff --git a/src/main/java/icbm/gangshao/saving/SaveManager.java b/src/main/java/icbm/gangshao/saving/SaveManager.java new file mode 100644 index 0000000..2a6b55e --- /dev/null +++ b/src/main/java/icbm/gangshao/saving/SaveManager.java @@ -0,0 +1,50 @@ +package icbm.gangshao.saving; + +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.event.FMLServerStoppingEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import java.util.ArrayList; +import java.util.List; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.world.WorldEvent; +import universalelectricity.prefab.flag.NBTFileLoader; + +public class SaveManager { + public static List nbtSaveList; + public static boolean isInitialized; + public static SaveManager intance; + + public void registerNbtSave(final INbtSave saveClass) { + if (!SaveManager.isInitialized) { + MinecraftForge.EVENT_BUS.register((Object) this); + SaveManager.isInitialized = true; + } + if (saveClass != null && !SaveManager.nbtSaveList.contains(saveClass)) { + SaveManager.nbtSaveList.add(saveClass); + } + } + + @SubscribeEvent + public void onWorldSave(final WorldEvent.Save event) { + this.save(!((WorldEvent) event).world.isRemote); + } + + @Mod.EventHandler + public void serverStopping(final FMLServerStoppingEvent event) { + this.save(true); + } + + public void save(final boolean isServer) { + for (final INbtSave save : SaveManager.nbtSaveList) { + if (save.shouldSave(isServer)) { + NBTFileLoader.saveData(save.saveFileName(), save.getSaveData()); + } + } + } + + static { + SaveManager.nbtSaveList = new ArrayList<>(); + SaveManager.isInitialized = false; + SaveManager.intance = new SaveManager(); + } +} diff --git a/src/main/java/icbm/gangshao/shimian/GuiButtonArrow.java b/src/main/java/icbm/gangshao/shimian/GuiButtonArrow.java new file mode 100644 index 0000000..7ec1481 --- /dev/null +++ b/src/main/java/icbm/gangshao/shimian/GuiButtonArrow.java @@ -0,0 +1,44 @@ +package icbm.gangshao.shimian; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class GuiButtonArrow extends GuiButton { + boolean isLeft; + + public GuiButtonArrow(final int par1, final int par2, final int par3, + final boolean left) { + super(par1, par2, par3, 10, 10, ""); + this.isLeft = false; + this.isLeft = left; + } + + @Override + public void drawButton(final Minecraft par1Minecraft, final int width, + final int hight) { + // TODO: WTF + // if (this.drawButton) { + par1Minecraft.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/gui@.png")); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + final boolean var4 = width >= this.xPosition && hight >= this.yPosition && + width < this.xPosition + this.width && + hight < this.yPosition + this.height; + int var5 = 126; + int varWid = 20; + if (this.isLeft) { + varWid += 10; + } + if (var4) { + var5 += this.height; + } + this.drawTexturedModalRect(this.xPosition, this.yPosition, varWid, var5, + this.width, this.height); + // } + } +} diff --git a/src/main/java/icbm/gangshao/shimian/GuiButtonImage.java b/src/main/java/icbm/gangshao/shimian/GuiButtonImage.java new file mode 100644 index 0000000..fabb39f --- /dev/null +++ b/src/main/java/icbm/gangshao/shimian/GuiButtonImage.java @@ -0,0 +1,61 @@ +package icbm.gangshao.shimian; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class GuiButtonImage extends GuiButton { + private int type; + + public GuiButtonImage(final int par1, final int par2, final int par3, + final int type) { + super(par1, par2, par3, 20, 20, ""); + this.type = 0; + this.type = type; + } + + public void func_73737_a(final Minecraft par1Minecraft, final int width, + final int hight) { + // TODO: WTf + // if (this.drawButton) { + par1Minecraft.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/gui@.png")); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + final boolean var4 = width >= this.xPosition && hight >= this.yPosition && + width < this.xPosition + this.width && + hight < this.yPosition + this.height; + int var5 = 106; + int var6 = 0; + if (var4) { + var5 += this.height; + } + switch (this.type) { + case 0: { + var5 += 40; + break; + } + case 1: { + var5 += 40; + var6 += 20; + break; + } + case 2: { + var5 += 40; + var6 += 40; + break; + } + } + this.drawTexturedModalRect(this.xPosition, this.yPosition, var6, var5, + this.width, this.height); + // } + } + + public boolean isIntersect(final int x, final int y) { + return x >= this.xPosition && y >= this.yPosition && + x < this.xPosition + this.width && y < this.yPosition + this.height; + } +} diff --git a/src/main/java/icbm/gangshao/shimian/GuiPlatformAccess.java b/src/main/java/icbm/gangshao/shimian/GuiPlatformAccess.java new file mode 100644 index 0000000..b1d9b60 --- /dev/null +++ b/src/main/java/icbm/gangshao/shimian/GuiPlatformAccess.java @@ -0,0 +1,202 @@ +package icbm.gangshao.shimian; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.gangshao.access.AccessLevel; +import icbm.gangshao.access.UserAccess; +import icbm.gangshao.platform.TPlatform; +import java.util.HashMap; +import java.util.Map; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; +import universalelectricity.core.vector.Vector2; +import universalelectricity.prefab.vector.Region2; + +@SideOnly(Side.CLIENT) +public class GuiPlatformAccess extends GuiPlatformBase implements IScroll { + private GuiTextField commandLine; + private int scroll; + private final HashMap outputMap; + + public GuiPlatformAccess(final EntityPlayer entityPlayer, + final TPlatform tileEntity) { + super(entityPlayer, tileEntity); + this.scroll = 0; + this.outputMap = new HashMap<>(); + } + + @Override + public void initGui() { + super.initGui(); + final int width = (this.width - super.xSize) / 2; + final int height = (this.height - super.ySize) / 2; + (this.commandLine = new GuiTextField(this.fontRendererObj, width + 12, + height + 165, 135, 11)) + .setMaxStringLength(30); + this.buttonList.add(new GuiButtonArrow(4, width + 151, height + 21, false)); + this.buttonList.add(new GuiButtonArrow(5, width + 151, height + 152, true)); + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onGuiClosed() { + super.onGuiClosed(); + Keyboard.enableRepeatEvents(false); + } + + @Override + public void updateScreen() { + super.updateScreen(); + this.commandLine.setFocused(true); + } + + @Override + public void handleMouseInput() { + super.handleMouseInput(); + final int wheel = Mouse.getEventDWheel(); + if (wheel > 0) { + this.scroll(-2); + } else if (wheel < 0) { + this.scroll(2); + } + } + + @Override + protected void actionPerformed(final GuiButton button) { + super.actionPerformed(button); + switch (button.id) { + case 4: { + this.scroll(-1); + break; + } + case 5: { + this.scroll(1); + break; + } + } + } + + @Override + protected void keyTyped(final char character, final int keycode) { + if (keycode == 1) { + this.mc.thePlayer.closeScreen(); + } else if (keycode == 200) { + this.scroll(-1); + } else if (keycode == 208) { + this.scroll(1); + } else if (keycode == 28) { + String command = "users add"; + final String username = this.commandLine.getText(); + for (final UserAccess access : super.tileEntity.getUsers()) { + if (access.username.equalsIgnoreCase(username)) { + command = "users remove"; + break; + } + } + // TODO: WTF + // super.tileEntity.sendCommandToServer(super.entityPlayer, + // command + " " + username); + this.commandLine.setText(""); + } else { + this.commandLine.textboxKeyTyped(character, keycode); + } + } + + protected void mouseClicked(final int x, final int y, final int type) { + super.mouseClicked(x, y, type); + if (type == 0) { + for (final Map.Entry entry : this.outputMap.entrySet()) { + final Vector2 vector2; + final Vector2 minPos = vector2 = entry.getValue(); + vector2.x -= 2.0; + final Vector2 vector3 = minPos; + vector3.y -= 2.0; + final Vector2 clone; + final Vector2 maxPos = clone = minPos.clone(); + clone.x += 132.0; + final Vector2 vector4 = maxPos; + vector4.y += 12.0; + if (new Region2(minPos, maxPos) + .isIn(new Vector2(x - super.guiLeft, y - super.guiTop))) { + final UserAccess access = entry.getKey(); + int newLevelOrdinal = access.level.ordinal() + 1; + if (newLevelOrdinal >= AccessLevel.values().length) { + newLevelOrdinal -= AccessLevel.values().length; + } + if (newLevelOrdinal <= 0) { + newLevelOrdinal = 1; + } + final AccessLevel newLevel = AccessLevel.get(newLevelOrdinal); + // TODO: WTF + // super.tileEntity.sendCommandToServer(super.entityPlayer, + // "access set " + access.username + + // " " + newLevel.displayName); + break; + } + } + } + this.commandLine.mouseClicked(x, y, type); + } + + @Override + protected void drawForegroundLayer(final int x, final int y, + final float var1) { + final String title = "User Access"; + this.fontRendererObj.drawString( + "§7" + title, super.xSize / 2 - title.length() * 3, 4, 4210752); + this.drawConsole(15, 25, 15); + super.drawForegroundLayer(x, y, var1); + } + + public void drawConsole(final int x, final int y, final int lines) { + final int color = 14737632; + this.outputMap.clear(); + for (int i = 0; i < lines; ++i) { + final int currentLine = i + this.getScroll(); + if (currentLine < super.tileEntity.getUsers().size() && + currentLine >= 0) { + final UserAccess accesInfo = super.tileEntity.getUsers().get(currentLine); + final String line = accesInfo.username + " (" + accesInfo.level.displayName + ")"; + if (line != null && line != "") { + final Vector2 drawPosition = new Vector2(x, 10 * i + y); + this.outputMap.put(accesInfo, drawPosition); + this.fontRendererObj.drawString(line, drawPosition.intX(), + drawPosition.intY(), color); + } + } + } + } + + @Override + protected void drawBackgroundLayer(final int x, final int y, + final float var1) { + super.drawBackgroundLayer(x, y, var1); + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/gui_platform_terminal.png")); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + final int var2 = (this.width - super.xSize) / 2; + final int var3 = (this.height - super.ySize) / 2; + this.drawTexturedModalRect(var2, var3, 0, 0, super.xSize, super.ySize); + this.commandLine.drawTextBox(); + } + + @Override + public void scroll(final int amount) { + this.setScroll(this.scroll + amount); + } + + @Override + public void setScroll(final int length) { + this.scroll = Math.max(Math.min(length, super.tileEntity.getUsers().size()), 0); + } + + @Override + public int getScroll() { + return this.scroll; + } +} diff --git a/src/main/java/icbm/gangshao/shimian/GuiPlatformBase.java b/src/main/java/icbm/gangshao/shimian/GuiPlatformBase.java new file mode 100644 index 0000000..ba828ea --- /dev/null +++ b/src/main/java/icbm/gangshao/shimian/GuiPlatformBase.java @@ -0,0 +1,174 @@ +package icbm.gangshao.shimian; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.gangshao.ICBMSentry; +import icbm.gangshao.platform.TPlatform; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import universalelectricity.prefab.GuiBase; + +@SideOnly(Side.CLIENT) +public abstract class GuiPlatformBase extends GuiBase { + protected static final int MAX_BUTTON_ID = 3; + protected TPlatform tileEntity; + protected EntityPlayer entityPlayer; + + public GuiPlatformBase(final EntityPlayer player, + final TPlatform tileEntity) { + this.tileEntity = tileEntity; + this.entityPlayer = player; + super.ySize = 190; + } + + @Override + public void initGui() { + super.initGui(); + this.buttonList.clear(); + this.buttonList.add( + new GuiButtonImage(0, (this.width - super.xSize) / 2 - 22, + (this.height - super.ySize) / 2 + 0, 3)); + this.buttonList.add( + new GuiButtonImage(1, (this.width - super.xSize) / 2 - 22, + (this.height - super.ySize) / 2 + 22, 0)); + this.buttonList.add( + new GuiButtonImage(2, (this.width - super.xSize) / 2 - 22, + (this.height - super.ySize) / 2 + 44, 2)); + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket( + // "ICBM", this.tileEntity, + // TileEntityTerminal.TerminalPacketType.GUI_EVENT.ordinal(), + // true)); + } + + @Override + public void updateScreen() { + super.updateScreen(); + if (this.tileEntity.getTurret(false) == null) { + this.mc.thePlayer.closeScreen(); + } + } + + @Override + protected void actionPerformed(final GuiButton button) { + if (this.tileEntity.getTurret(false) != null) { + switch (button.id) { + case 0: { + this.entityPlayer.openGui( + (Object) ICBMSentry.instance, 1, this.tileEntity.getWorldObj(), + this.tileEntity.xCoord, this.tileEntity.yCoord, + this.tileEntity.zCoord); + break; + } + case 1: { + this.entityPlayer.openGui( + (Object) ICBMSentry.instance, 2, this.tileEntity.getWorldObj(), + this.tileEntity.xCoord, this.tileEntity.yCoord, + this.tileEntity.zCoord); + break; + } + case 2: { + this.entityPlayer.openGui( + (Object) ICBMSentry.instance, 0, this.tileEntity.getWorldObj(), + this.tileEntity.xCoord, this.tileEntity.yCoord, + this.tileEntity.zCoord); + break; + } + } + } + } + + @Override + public void onGuiClosed() { + super.onGuiClosed(); + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket( + // "ICBM", this.tileEntity, + // TileEntityTerminal.TerminalPacketType.GUI_EVENT.ordinal(), + // false)); + } + + @Override + protected void drawForegroundLayer(final int x, final int y, + final float var1) { + if (((GuiButtonImage) this.buttonList.get(0)).isIntersect(x, y)) { + this.drawTooltip(x - super.guiLeft, y - super.guiTop + 10, "Terminal"); + } else if (((GuiButtonImage) this.buttonList.get(1)).isIntersect(x, y)) { + this.drawTooltip(x - super.guiLeft, y - super.guiTop + 10, "Access"); + } else if (((GuiButtonImage) this.buttonList.get(2)).isIntersect(x, y)) { + this.drawTooltip(x - super.guiLeft, y - super.guiTop + 10, "Ammunition"); + } + } + + @Override + protected void drawBackgroundLayer(final int x, final int y, + final float var1) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/gui_base.png")); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + final int containerWidth = (this.width - super.xSize) / 2; + final int containerHeight = (this.height - super.ySize) / 2; + this.drawTexturedModalRect(containerWidth, containerHeight, 0, 0, + super.xSize, super.ySize); + } + + @Override + public void drawTooltip(final int x, final int y, final String... toolTips) { + GL11.glDisable(32826); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(2896); + GL11.glDisable(2929); + if (toolTips != null) { + int var5 = 0; + for (int var6 = 0; var6 < toolTips.length; ++var6) { + final int var7 = this.fontRendererObj.getStringWidth(toolTips[var6]); + if (var7 > var5) { + var5 = var7; + } + } + int var6 = x + 12; + int var7 = y - 12; + int var8 = 8; + if (toolTips.length > 1) { + var8 += 2 + (toolTips.length - 1) * 10; + } + if (super.guiTop + var7 + var8 + 6 > this.height) { + var7 = this.height - var8 - super.guiTop - 6; + } + this.zLevel = 300.0f; + final int var9 = -267386864; + this.drawGradientRect(var6 - 3, var7 - 4, var6 + var5 + 3, var7 - 3, var9, + var9); + this.drawGradientRect(var6 - 3, var7 + var8 + 3, var6 + var5 + 3, + var7 + var8 + 4, var9, var9); + this.drawGradientRect(var6 - 3, var7 - 3, var6 + var5 + 3, + var7 + var8 + 3, var9, var9); + this.drawGradientRect(var6 - 4, var7 - 3, var6 - 3, var7 + var8 + 3, var9, + var9); + this.drawGradientRect(var6 + var5 + 3, var7 - 3, var6 + var5 + 4, + var7 + var8 + 3, var9, var9); + final int var10 = 1347420415; + final int var11 = (var10 & 0xFEFEFE) >> 1 | (var10 & 0xFF000000); + this.drawGradientRect(var6 - 3, var7 - 3 + 1, var6 - 3 + 1, + var7 + var8 + 3 - 1, var10, var11); + this.drawGradientRect(var6 + var5 + 2, var7 - 3 + 1, var6 + var5 + 3, + var7 + var8 + 3 - 1, var10, var11); + this.drawGradientRect(var6 - 3, var7 - 3, var6 + var5 + 3, var7 - 3 + 1, + var10, var10); + this.drawGradientRect(var6 - 3, var7 + var8 + 2, var6 + var5 + 3, + var7 + var8 + 3, var11, var11); + for (int var12 = 0; var12 < toolTips.length; ++var12) { + final String var13 = "§7" + toolTips[var12]; + this.fontRendererObj.drawStringWithShadow(var13, var6, var7, -1); + if (var12 == 0) { + var7 += 2; + } + var7 += 10; + } + this.zLevel = 0.0f; + } + } +} diff --git a/src/main/java/icbm/gangshao/shimian/GuiPlatformContainer.java b/src/main/java/icbm/gangshao/shimian/GuiPlatformContainer.java new file mode 100644 index 0000000..9985e86 --- /dev/null +++ b/src/main/java/icbm/gangshao/shimian/GuiPlatformContainer.java @@ -0,0 +1,161 @@ +package icbm.gangshao.shimian; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.gangshao.ICBMSentry; +import icbm.gangshao.container.ContainerTurretPlatform; +import icbm.gangshao.platform.TPlatform; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public abstract class GuiPlatformContainer extends GuiContainer { + protected static final int MAX_BUTTON_ID = 3; + protected TPlatform tileEntity; + protected EntityPlayer entityPlayer; + + public GuiPlatformContainer(final InventoryPlayer inventoryPlayer, + final TPlatform tileEntity) { + super((Container) new ContainerTurretPlatform(inventoryPlayer, tileEntity)); + this.tileEntity = tileEntity; + this.entityPlayer = inventoryPlayer.player; + this.ySize = 190; + } + + public void initGui() { + super.initGui(); + this.buttonList.clear(); + this.buttonList.add( + new GuiButtonImage(0, (this.width - this.xSize) / 2 - 22, + (this.height - this.ySize) / 2 + 0, 3)); + this.buttonList.add( + new GuiButtonImage(1, (this.width - this.xSize) / 2 - 22, + (this.height - this.ySize) / 2 + 22, 0)); + this.buttonList.add( + new GuiButtonImage(2, (this.width - this.xSize) / 2 - 22, + (this.height - this.ySize) / 2 + 44, 2)); + } + + public void updateScreen() { + super.updateScreen(); + if (this.tileEntity.getTurret(false) == null) { + this.mc.thePlayer.closeScreen(); + } + } + + protected void func_73875_a(final GuiButton button) { + if (this.tileEntity.getTurret(false) != null) { + switch (button.id) { + case 0: { + this.entityPlayer.openGui( + (Object) ICBMSentry.instance, 1, this.tileEntity.getWorldObj(), + this.tileEntity.xCoord, this.tileEntity.yCoord, + this.tileEntity.zCoord); + break; + } + case 1: { + this.entityPlayer.openGui( + (Object) ICBMSentry.instance, 2, this.tileEntity.getWorldObj(), + this.tileEntity.xCoord, this.tileEntity.yCoord, + this.tileEntity.zCoord); + break; + } + case 2: { + this.entityPlayer.openGui( + (Object) ICBMSentry.instance, 0, this.tileEntity.getWorldObj(), + this.tileEntity.xCoord, this.tileEntity.yCoord, + this.tileEntity.zCoord); + break; + } + } + } + } + + protected void func_74189_g(final int x, final int y) { + if (this.tileEntity.getTurret(false) != null) { + final String title = this.tileEntity.getTurret(false).getName(); + this.fontRendererObj.drawString( + "§7" + title, (int) (this.xSize / 2 - title.length() * 2.5), 4, + 4210752); + if (((GuiButtonImage) this.buttonList.get(0)).isIntersect(x, y)) { + this.drawTooltip(x - this.guiLeft, y - this.guiTop + 10, "Terminal"); + } else if (((GuiButtonImage) this.buttonList.get(1)).isIntersect(x, y)) { + this.drawTooltip(x - this.guiLeft, y - this.guiTop + 10, "Access"); + } else if (((GuiButtonImage) this.buttonList.get(2)).isIntersect(x, y)) { + this.drawTooltip(x - this.guiLeft, y - this.guiTop + 10, "Ammunition"); + } + } + } + + protected void func_74185_a(final float par1, final int x, final int y) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/gui_base.png")); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + final int containerWidth = (this.width - this.xSize) / 2; + final int containerHeight = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(containerWidth, containerHeight, 0, 0, + this.xSize, this.ySize); + } + + public void drawTooltip(final int x, final int y, final String... toolTips) { + GL11.glDisable(32826); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(2896); + GL11.glDisable(2929); + if (toolTips != null) { + int var5 = 0; + for (int var6 = 0; var6 < toolTips.length; ++var6) { + final int var7 = this.fontRendererObj.getStringWidth(toolTips[var6]); + if (var7 > var5) { + var5 = var7; + } + } + int var6 = x + 12; + int var7 = y - 12; + int var8 = 8; + if (toolTips.length > 1) { + var8 += 2 + (toolTips.length - 1) * 10; + } + if (this.guiTop + var7 + var8 + 6 > this.height) { + var7 = this.height - var8 - this.guiTop - 6; + } + this.zLevel = 300.0f; + final int var9 = -267386864; + this.drawGradientRect(var6 - 3, var7 - 4, var6 + var5 + 3, var7 - 3, var9, + var9); + this.drawGradientRect(var6 - 3, var7 + var8 + 3, var6 + var5 + 3, + var7 + var8 + 4, var9, var9); + this.drawGradientRect(var6 - 3, var7 - 3, var6 + var5 + 3, + var7 + var8 + 3, var9, var9); + this.drawGradientRect(var6 - 4, var7 - 3, var6 - 3, var7 + var8 + 3, var9, + var9); + this.drawGradientRect(var6 + var5 + 3, var7 - 3, var6 + var5 + 4, + var7 + var8 + 3, var9, var9); + final int var10 = 1347420415; + final int var11 = (var10 & 0xFEFEFE) >> 1 | (var10 & 0xFF000000); + this.drawGradientRect(var6 - 3, var7 - 3 + 1, var6 - 3 + 1, + var7 + var8 + 3 - 1, var10, var11); + this.drawGradientRect(var6 + var5 + 2, var7 - 3 + 1, var6 + var5 + 3, + var7 + var8 + 3 - 1, var10, var11); + this.drawGradientRect(var6 - 3, var7 - 3, var6 + var5 + 3, var7 - 3 + 1, + var10, var10); + this.drawGradientRect(var6 - 3, var7 + var8 + 2, var6 + var5 + 3, + var7 + var8 + 3, var11, var11); + for (int var12 = 0; var12 < toolTips.length; ++var12) { + final String var13 = "§7" + toolTips[var12]; + this.fontRendererObj.drawStringWithShadow(var13, var6, var7, -1); + if (var12 == 0) { + var7 += 2; + } + var7 += 10; + } + this.zLevel = 0.0f; + } + } +} diff --git a/src/main/java/icbm/gangshao/shimian/GuiPlatformSlots.java b/src/main/java/icbm/gangshao/shimian/GuiPlatformSlots.java new file mode 100644 index 0000000..ab00043 --- /dev/null +++ b/src/main/java/icbm/gangshao/shimian/GuiPlatformSlots.java @@ -0,0 +1,58 @@ +package icbm.gangshao.shimian; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.gangshao.platform.TPlatform; +import icbm.gangshao.turret.TTurretBase; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import universalelectricity.core.electricity.ElectricityDisplay; + +@SideOnly(Side.CLIENT) +public class GuiPlatformSlots extends GuiPlatformContainer { + public GuiPlatformSlots(final InventoryPlayer inventoryPlayer, + final TPlatform tileEntity) { + super(inventoryPlayer, tileEntity); + } + + @Override + protected void drawGuiContainerForegroundLayer(final int x, final int y) { + this.fontRendererObj.drawString("Ammunition", 8, 30, 4210752); + final TTurretBase turret = super.tileEntity.getTurret(false); + if (turret != null && turret.getFiringRequest() > 0.0) { + String color = "§4"; + if (super.tileEntity.isRunning()) { + color = "§a"; + } + this.fontRendererObj.drawString("Energy Per Shot", 85, 33, 4210752); + this.fontRendererObj.drawString( + color + ElectricityDisplay.getDisplayShort( + Math.min(super.tileEntity.wattsReceived, + turret.getFiringRequest()), + ElectricityDisplay.ElectricUnit.JOULES), + 87, 43, 4210752); + this.fontRendererObj.drawString( + color + "of " + + ElectricityDisplay.getDisplayShort( + super.tileEntity.getTurret(false).getFiringRequest(), + ElectricityDisplay.ElectricUnit.JOULES), + 87, 53, 4210752); + } + this.fontRendererObj.drawString("Upgrades", 87, 66, 4210752); + super.drawGuiContainerForegroundLayer(x, y); + } + + @Override + protected void drawGuiContainerBackgroundLayer(final float par1, final int x, + final int y) { + // super.drawGuiContainerBackgroundLayer(par1, x, y); + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/gui_platform_slot.png")); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + final int containerWidth = (this.width - this.xSize) / 2; + final int containerHeight = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(containerWidth, containerHeight, 0, 0, + this.xSize, this.ySize); + } +} diff --git a/src/main/java/icbm/gangshao/shimian/GuiPlatformTerminal.java b/src/main/java/icbm/gangshao/shimian/GuiPlatformTerminal.java new file mode 100644 index 0000000..d9273b6 --- /dev/null +++ b/src/main/java/icbm/gangshao/shimian/GuiPlatformTerminal.java @@ -0,0 +1,141 @@ +package icbm.gangshao.shimian; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.gangshao.platform.TPlatform; +import icbm.gangshao.terminal.TileEntityTerminal; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class GuiPlatformTerminal extends GuiPlatformBase { + private TileEntityTerminal tileEntity; + private GuiTextField commandLine; + + public GuiPlatformTerminal(final EntityPlayer entityPlayer, + final TPlatform tileEntity) { + super(entityPlayer, tileEntity); + this.tileEntity = tileEntity; + } + + @Override + public void initGui() { + super.initGui(); + final int width = (this.width - super.xSize) / 2; + final int height = (this.height - super.ySize) / 2; + (this.commandLine = new GuiTextField(this.fontRendererObj, width + 12, + height + 165, 135, 11)) + .setMaxStringLength(30); + this.buttonList.add(new GuiButtonArrow(4, width + 151, height + 21, false)); + this.buttonList.add(new GuiButtonArrow(5, width + 151, height + 152, true)); + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onGuiClosed() { + super.onGuiClosed(); + Keyboard.enableRepeatEvents(false); + } + + @Override + public void updateScreen() { + super.updateScreen(); + this.commandLine.setFocused(true); + } + + public void handleMouseInput() { + super.handleMouseInput(); + final int wheel = Mouse.getEventDWheel(); + if (wheel > 0) { + this.tileEntity.scroll(-2); + } else if (wheel < 0) { + this.tileEntity.scroll(2); + } + } + + @Override + protected void actionPerformed(final GuiButton button) { + super.actionPerformed(button); + switch (button.id) { + case 4: { + this.tileEntity.scroll(-1); + break; + } + case 5: { + this.tileEntity.scroll(1); + break; + } + } + } + + @Override + protected void keyTyped(final char character, final int keycode) { + if (keycode == 1) { + this.mc.thePlayer.closeScreen(); + } else if (keycode == 200) { + this.tileEntity.scroll(-1); + } else if (keycode == 208) { + this.tileEntity.scroll(1); + } else if (keycode == 28) { + //TODO: WTF + //this.tileEntity.sendCommandToServer(super.entityPlayer, + // this.commandLine.getText()); + this.commandLine.setText(""); + } else { + this.commandLine.textboxKeyTyped(character, keycode); + } + } + + protected void mouseClicked(final int par1, final int par2, final int par3) { + super.mouseClicked(par1, par2, par3); + this.commandLine.mouseClicked(par1, par2, par3); + } + + @Override + protected void drawForegroundLayer(final int x, final int y, + final float var1) { + final String title = "Terminal"; + this.fontRendererObj.drawString( + "§7" + title, (int) (super.xSize / 2 - title.length() * 2.5), 4, + 4210752); + this.drawConsole(25, 16, 15); + super.drawForegroundLayer(x, y, var1); + } + + public void drawConsole(final int x, final int y, final int lines) { + final int spacing = 10; + final int color = 14737632; + GL11.glPushMatrix(); + final float scale = 0.92f; + GL11.glScalef(scale, scale, scale); + for (int i = 0; i < lines; ++i) { + final int currentLine = i + this.tileEntity.getScroll(); + if (currentLine < this.tileEntity.getTerminalOuput().size() && + currentLine >= 0) { + final String line = this.tileEntity.getTerminalOuput().get(currentLine); + if (line != null && line != "") { + this.fontRendererObj.drawString(line, y, spacing * i + x, color); + } + } + } + GL11.glPopMatrix(); + } + + @Override + protected void drawBackgroundLayer(final int x, final int y, + final float var1) { + super.drawBackgroundLayer(x, y, var1); + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/gui_platform_terminal.png")); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + final int var2 = (this.width - super.xSize) / 2; + final int var3 = (this.height - super.ySize) / 2; + this.drawTexturedModalRect(var2, var3, 0, 0, super.xSize, super.ySize); + this.commandLine.drawTextBox(); + } +} diff --git a/src/main/java/icbm/gangshao/shimian/IScroll.java b/src/main/java/icbm/gangshao/shimian/IScroll.java new file mode 100644 index 0000000..29b2f40 --- /dev/null +++ b/src/main/java/icbm/gangshao/shimian/IScroll.java @@ -0,0 +1,9 @@ +package icbm.gangshao.shimian; + +public interface IScroll { + void scroll(final int p0); + + void setScroll(final int p0); + + int getScroll(); +} diff --git a/src/main/java/icbm/gangshao/task/LookHelper.java b/src/main/java/icbm/gangshao/task/LookHelper.java new file mode 100644 index 0000000..2d7c7a1 --- /dev/null +++ b/src/main/java/icbm/gangshao/task/LookHelper.java @@ -0,0 +1,78 @@ +package icbm.gangshao.task; + +import icbm.gangshao.turret.TTurretBase; +import net.minecraft.entity.Entity; +import net.minecraft.util.MathHelper; +import universalelectricity.core.vector.Vector3; + +public class LookHelper { + public static final int PITCH_DISPLACEMENT = 0; + TTurretBase sentry; + + public LookHelper(final TTurretBase turret) { + this.sentry = turret; + } + + public void lookAt(final Vector3 target) { + this.sentry.rotateTo(getYaw(this.sentry.getMuzzle(), target), + getPitch(this.sentry.getMuzzle(), target)); + } + + public float[] getDeltaRotations(final Vector3 target) { + return new float[] { getYaw(this.sentry.getMuzzle(), target), + getPitch(this.sentry.getMuzzle(), target) }; + } + + public void lookAtEntity(final Entity entity) { + this.lookAt(Vector3.add(new Vector3(entity), + new Vector3(0.0, entity.getEyeHeight(), 0.0))); + } + + public boolean isLookingAt(final Vector3 target, final float allowedError) { + final float yaw = getYaw(this.sentry.getCenter(), target); + final float pitch = getPitch(this.sentry.getCenter(), target); + return Math.abs(getAngleDif(this.sentry.currentRotationYaw, yaw)) <= allowedError && + Math.abs(getAngleDif(this.sentry.currentRotationPitch, pitch)) <= allowedError; + } + + public boolean isLookingAt(final Entity entity, final float allowedError) { + return this.isLookingAt(new Vector3(entity.posX, + entity.posY + entity.getEyeHeight(), + entity.posZ), + allowedError); + } + + public static float getPitch(final Vector3 position, final Vector3 target) { + final Vector3 difference = Vector3.subtract(target, position); + final double verticleDistance = MathHelper.sqrt_double( + difference.x * difference.x + difference.z * difference.z); + return -MathHelper.wrapAngleTo180_float( + (float) (Math.atan2(difference.y, verticleDistance) * 180.0 / + 3.141592653589793) + + 0.0f); + } + + public static float getYaw(final Vector3 position, final Vector3 target) { + final Vector3 difference = Vector3.subtract(target, position); + return MathHelper.wrapAngleTo180_float( + (float) (Math.atan2(difference.z, difference.x) * 180.0 / + 3.141592653589793) - + 90.0f); + } + + public static float getAngleDif(final float angleOne, final float angleTwo) { + final double dif = Math.max(angleOne, angleTwo) - Math.min(angleOne, angleTwo); + return MathHelper.wrapAngleTo180_float((float) dif); + } + + public boolean canPositionBeSeen(final Vector3 target) { + return this.sentry.getWorldObj().rayTraceBlocks( + this.sentry.getMuzzle().toVec3(), target.toVec3()) == null; + } + + public boolean canEntityBeSeen(final Entity entity) { + final Vector3 target = Vector3.add( + new Vector3(entity), new Vector3(0.0, entity.getEyeHeight(), 0.0)); + return this.canPositionBeSeen(target); + } +} diff --git a/src/main/java/icbm/gangshao/task/Task.java b/src/main/java/icbm/gangshao/task/Task.java new file mode 100644 index 0000000..a524bac --- /dev/null +++ b/src/main/java/icbm/gangshao/task/Task.java @@ -0,0 +1,30 @@ +package icbm.gangshao.task; + +import icbm.gangshao.turret.sentries.TAutomaticTurret; +import net.minecraft.world.World; + +public abstract class Task { + protected int ticks; + public World world; + public TAutomaticTurret tileEntity; + public TaskManager taskManager; + + public Task() { + this.ticks = 0; + } + + protected boolean onUpdateTask() { + ++this.ticks; + return false; + } + + public void onTaskStart() { + } + + public void onTaskEnd() { + } + + public int getTickInterval() { + return 1; + } +} diff --git a/src/main/java/icbm/gangshao/task/TaskKillTarget.java b/src/main/java/icbm/gangshao/task/TaskKillTarget.java new file mode 100644 index 0000000..aa84d33 --- /dev/null +++ b/src/main/java/icbm/gangshao/task/TaskKillTarget.java @@ -0,0 +1,25 @@ +package icbm.gangshao.task; + +import icbm.gangshao.IAutoSentry; + +public class TaskKillTarget extends TaskSearchTarget { + @Override + protected boolean onUpdateTask() { + super.onUpdateTask(); + if (super.tileEntity instanceof IAutoSentry) { + if (!super.tileEntity.isValidTarget(super.tileEntity.getTarget())) { + super.tileEntity.setTarget(null); + super.tileEntity.cancelRotation(); + return false; + } + if (super.tileEntity.canActivateWeapon()) { + super.tileEntity.onWeaponActivated(); + } else { + final float[] rotations = super.tileEntity.lookHelper.getDeltaRotations( + super.tileEntity.getTargetPosition()); + super.tileEntity.rotateTo(rotations[0], rotations[1]); + } + } + return true; + } +} diff --git a/src/main/java/icbm/gangshao/task/TaskManager.java b/src/main/java/icbm/gangshao/task/TaskManager.java new file mode 100644 index 0000000..cc0a193 --- /dev/null +++ b/src/main/java/icbm/gangshao/task/TaskManager.java @@ -0,0 +1,55 @@ +package icbm.gangshao.task; + +import icbm.core.MainBase; +import icbm.gangshao.turret.sentries.TAutomaticTurret; +import java.util.ArrayList; +import java.util.List; + +public class TaskManager { + private final List tasks; + public TAutomaticTurret tileEntity; + + public TaskManager(final TAutomaticTurret tileEntity) { + this.tasks = new ArrayList<>(); + this.tileEntity = tileEntity; + } + + public void onUpdate() { + try { + if (this.tasks.size() > 0) { + final int taskIndex = 0; + final Task currentTask = this.tasks.get(taskIndex); + if (currentTask != null && !currentTask.onUpdateTask()) { + currentTask.onTaskEnd(); + this.tasks.remove(taskIndex); + } + } + } catch (final Exception e) { + MainBase.LOGGER.severe("Failed to execute AI tasks!"); + e.printStackTrace(); + } + } + + public void addTask(final Task task) { + task.taskManager = this; + task.world = this.tileEntity.getWorldObj(); + task.tileEntity = this.tileEntity; + this.tasks.add(task); + } + + public boolean hasTasks() { + return this.tasks.size() > 0; + } + + public List getTasks() { + return this.tasks; + } + + public void clear() { + this.tasks.clear(); + } + + public int getTaskCount() { + return this.tasks.size(); + } +} diff --git a/src/main/java/icbm/gangshao/task/TaskSearchTarget.java b/src/main/java/icbm/gangshao/task/TaskSearchTarget.java new file mode 100644 index 0000000..49da39e --- /dev/null +++ b/src/main/java/icbm/gangshao/task/TaskSearchTarget.java @@ -0,0 +1,66 @@ +package icbm.gangshao.task; + +import icbm.gangshao.IAutoSentry; +import icbm.gangshao.access.AccessLevel; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.AxisAlignedBB; +import universalelectricity.core.vector.Vector3; + +public class TaskSearchTarget extends Task { + @Override + protected boolean onUpdateTask() { + super.onUpdateTask(); + if (super.tileEntity instanceof IAutoSentry) { + final IAutoSentry sentry = super.tileEntity; + if (sentry.getTarget() == null || + !sentry.isValidTarget(sentry.getTarget())) { + final AxisAlignedBB bounds = sentry.getTargetingBox(); + final List entities = super.tileEntity.getWorldObj().getEntitiesWithinAABB(Entity.class, + bounds); + Entity currentTarget = null; + for (final Entity entity : entities) { + if (entity instanceof EntityPlayer) { + final EntityPlayer player = (EntityPlayer) entity; + final AccessLevel level = super.tileEntity.getPlatform().getUserAccess( + player.getDisplayName()); + if (level.ordinal() >= AccessLevel.USER.ordinal() && + player.getLastAttacker() != null && + sentry.isValidTarget((Entity) player.getLastAttacker()) && + !((Entity) player.getLastAttacker()).isDead) { + currentTarget = (Entity) player.getLastAttacker(); + break; + } + continue; + } + } + if (currentTarget == null) { + double smallestDis = sentry.getDetectRange(); + for (final Entity entity2 : entities) { + final double distance = super.tileEntity.getCenter().distanceTo(new Vector3(entity2)); + if (sentry.isValidTarget(entity2) && distance <= smallestDis) { + currentTarget = entity2; + smallestDis = distance; + } + } + } + if (currentTarget != null) { + super.tileEntity.cancelRotation(); + super.taskManager.addTask(new TaskKillTarget()); + sentry.setTarget(currentTarget); + return false; + } + if (super.tileEntity.lastRotateTick > super.world.rand.nextInt(30) + 10) { + super.tileEntity.rotateTo( + (float) (super.world.rand.nextInt(360) - 180), + (float) (super.world.rand.nextInt(30) - 10)); + } + return true; + } else { + super.taskManager.addTask(new TaskKillTarget()); + } + } + return false; + } +} diff --git a/src/main/java/icbm/gangshao/terminal/ITerminal.java b/src/main/java/icbm/gangshao/terminal/ITerminal.java new file mode 100644 index 0000000..c75b308 --- /dev/null +++ b/src/main/java/icbm/gangshao/terminal/ITerminal.java @@ -0,0 +1,11 @@ +package icbm.gangshao.terminal; + +import icbm.gangshao.ISpecialAccess; +import icbm.gangshao.shimian.IScroll; +import java.util.List; + +public interface ITerminal extends ISpecialAccess, IScroll { + List getTerminalOuput(); + + boolean addToConsole(final String p0); +} diff --git a/src/main/java/icbm/gangshao/terminal/TerminalCommand.java b/src/main/java/icbm/gangshao/terminal/TerminalCommand.java new file mode 100644 index 0000000..4bdccb1 --- /dev/null +++ b/src/main/java/icbm/gangshao/terminal/TerminalCommand.java @@ -0,0 +1,23 @@ +package icbm.gangshao.terminal; + +import icbm.gangshao.ISpecialAccess; +import java.util.List; +import net.minecraft.entity.player.EntityPlayer; + +public abstract class TerminalCommand { + public abstract String getCommandPrefix(); + + public abstract boolean processCommand(final EntityPlayer p0, + final ITerminal p1, final String[] p2); + + public abstract boolean canPlayerUse(final EntityPlayer p0, + final ISpecialAccess p1); + + public abstract boolean showOnHelp(final EntityPlayer p0, + final ISpecialAccess p1); + + public abstract List getCmdUses(final EntityPlayer p0, + final ISpecialAccess p1); + + public abstract boolean canMachineUse(final ISpecialAccess p0); +} diff --git a/src/main/java/icbm/gangshao/terminal/TileEntityTerminal.java b/src/main/java/icbm/gangshao/terminal/TileEntityTerminal.java new file mode 100644 index 0000000..6613f47 --- /dev/null +++ b/src/main/java/icbm/gangshao/terminal/TileEntityTerminal.java @@ -0,0 +1,270 @@ +package icbm.gangshao.terminal; + +import calclavia.lib.TileEntityUniversalRunnable; +import icbm.gangshao.access.AccessLevel; +import icbm.gangshao.access.UserAccess; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; + +public abstract class TileEntityTerminal + extends TileEntityUniversalRunnable implements ITerminal { + private final List terminalOutput; + private final List users; + public static final int SCROLL_SIZE = 15; + private int scroll; + public final Set playersUsing; + + public TileEntityTerminal() { + this.terminalOutput = new ArrayList<>(); + this.users = new ArrayList<>(); + this.scroll = 0; + this.playersUsing = new HashSet<>(); + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!this.worldObj.isRemote && super.ticks % 3L == 0L) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + } + } + + public abstract String getChannel(); + + @Override + public Packet getDescriptionPacket() { + final NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, + this.getBlockMetadata(), nbt); + } + + public void sendTerminalOutputToClients() { + // TODO: WTF + // final List data = new ArrayList(); + // data.add(TerminalPacketType.TERMINAL_OUTPUT.ordinal()); + // data.add(this.getTerminalOuput().size()); + // data.addAll(this.getTerminalOuput()); + // final Packet packet = PacketManager.getPacket(this.getChannel(), this, + // data.toArray()); for (final EntityPlayer player : this.playersUsing) { + // PacketDispatcher.sendPacketToPlayer(packet, (Player) player); + // } + } + + // TODO: WTF + // public void sendCommandToServer(final EntityPlayer entityPlayer, + // final String cmdInput) { + // if (this.worldObj.isRemote) { + // final Packet packet = PacketManager.getPacket( + // this.getChannel(), this, + // TerminalPacketType.GUI_COMMAND.ordinal(), + // entityPlayer.getDisplayName(), cmdInput); + // PacketDispatcher.sendPacketToServer(packet); + // } + // } + + // TODO: WHAT THE ACTUAL FUCK! + // @Override + // public void handlePacketData(final INetworkManager network, + // final int packetID, + // final Packet250CustomPayload packet, + // final EntityPlayer player, + // final ByteArrayDataInput dataStream) { + // try { + // final TerminalPacketType packetType = + // TerminalPacketType.values()[dataStream.readInt()]; switch + // (packetType) { + // case DESCRIPTION_DATA: { + // if (this.worldObj.isRemote) { + // final short size = dataStream.readShort(); + // if (size > 0) { + // final byte[] byteCode = new byte[size]; + // dataStream.readFully(byteCode); + // this.func_70307_a(CompressedStreamTools.func_74792_a(byteCode)); + // } + // break; + // } + // break; + // } + // case GUI_COMMAND: { + // if (!this.field_70331_k.isRemote) { + // CommandRegistry.onCommand( + // this.field_70331_k.getPlayerEntityByName(dataStream.readUTF()), + // this, dataStream.readUTF()); + // this.sendTerminalOutputToClients(); + // break; + // } + // break; + // } + // case GUI_EVENT: { + // if (this.field_70331_k.isRemote) { + // break; + // } + // if (dataStream.readBoolean()) { + // this.playersUsing.add(player); + // this.sendTerminalOutputToClients(); + // break; + // } + // this.playersUsing.remove(player); + // break; + // } + // case TERMINAL_OUTPUT: { + // if (this.field_70331_k.isRemote) { + // final int size2 = dataStream.readInt(); + // final List oldTerminalOutput = new + // ArrayList(this.terminalOutput); + // this.terminalOutput.clear(); + // for (int i = 0; i < size2; ++i) { + // this.terminalOutput.add(dataStream.readUTF()); + // } + // if (!this.terminalOutput.equals(oldTerminalOutput) && + // this.terminalOutput.size() != + // oldTerminalOutput.size()) { + // this.setScroll(this.getTerminalOuput().size() - + // 15); + // } + // break; + // } + // break; + // } + // } + // } catch (final Exception e) { + // ZhuYaoBase.LOGGER.severe("Terminal error: " + this.toString()); + // e.printStackTrace(); + // } + // } + + @Override + public AccessLevel getUserAccess(final String username) { + for (int i = 0; i < this.users.size(); ++i) { + if (this.users.get(i).username.equalsIgnoreCase(username)) { + return this.users.get(i).level; + } + } + return AccessLevel.NONE; + } + + public boolean canUserAccess(final String username) { + return this.getUserAccess(username).ordinal() >= AccessLevel.USER.ordinal(); + } + + @Override + public List getUsers() { + return this.users; + } + + @Override + public List getUsersWithAcess(final AccessLevel level) { + final List players = new ArrayList<>(); + for (int i = 0; i < this.users.size(); ++i) { + final UserAccess ref = this.users.get(i); + if (ref.level == level) { + players.add(ref); + } + } + return players; + } + + @Override + public boolean addUserAccess(final String player, final AccessLevel lvl, + final boolean save) { + this.removeUserAccess(player); + final boolean bool = this.users.add(new UserAccess(player, lvl, save)); + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + return bool; + } + + @Override + public boolean removeUserAccess(final String player) { + final List removeList = new ArrayList<>(); + for (int i = 0; i < this.users.size(); ++i) { + final UserAccess ref = this.users.get(i); + if (ref.username.equalsIgnoreCase(player)) { + removeList.add(ref); + } + } + if (removeList != null && removeList.size() > 0) { + final boolean bool = this.users.removeAll(removeList); + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + return bool; + } + return false; + } + + @Override + public List getTerminalOuput() { + return this.terminalOutput; + } + + @Override + public boolean addToConsole(String msg) { + if (!this.worldObj.isRemote) { + msg.trim(); + if (msg.length() > 23) { + msg = msg.substring(0, 22); + } + this.getTerminalOuput().add(msg); + this.sendTerminalOutputToClients(); + return true; + } + return false; + } + + @Override + public void scroll(final int amount) { + this.setScroll(this.scroll + amount); + } + + @Override + public void setScroll(final int length) { + this.scroll = Math.max(Math.min(length, this.getTerminalOuput().size()), 0); + } + + @Override + public int getScroll() { + return this.scroll; + } + + public void readFromNBT(final NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.users.clear(); + final NBTTagList userList = nbt.getTagList("Users", 10); + for (int i = 0; i < userList.tagCount(); ++i) { + final NBTTagCompound var4 = (NBTTagCompound) userList.getCompoundTagAt(i); + this.users.add(UserAccess.loadFromNBT(var4)); + } + } + + public void writeToNBT(final NBTTagCompound nbt) { + super.writeToNBT(nbt); + final NBTTagList usersTag = new NBTTagList(); + for (int player = 0; player < this.users.size(); ++player) { + final UserAccess access = this.users.get(player); + if (access != null && access.shouldSave) { + final NBTTagCompound accessData = new NBTTagCompound(); + access.writeToNBT(accessData); + usersTag.appendTag((NBTBase) accessData); + } + } + nbt.setTag("Users", (NBTBase) usersTag); + } + + public enum TerminalPacketType { + GUI_EVENT("GUI_EVENT", 0), + GUI_COMMAND("GUI_COMMAND", 1), + TERMINAL_OUTPUT("TERMINAL_OUTPUT", 2), + DESCRIPTION_DATA("DESCRIPTION_DATA", 3); + + private TerminalPacketType(final String name, final int ordinal) { + } + } +} diff --git a/src/main/java/icbm/gangshao/terminal/command/CommandAccess.java b/src/main/java/icbm/gangshao/terminal/command/CommandAccess.java new file mode 100644 index 0000000..818086e --- /dev/null +++ b/src/main/java/icbm/gangshao/terminal/command/CommandAccess.java @@ -0,0 +1,87 @@ +package icbm.gangshao.terminal.command; + +import icbm.gangshao.ISpecialAccess; +import icbm.gangshao.access.AccessLevel; +import icbm.gangshao.platform.TPlatform; +import icbm.gangshao.terminal.ITerminal; +import icbm.gangshao.terminal.TerminalCommand; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.entity.player.EntityPlayer; + +public class CommandAccess extends TerminalCommand { + @Override + public String getCommandPrefix() { + return "access"; + } + + @Override + public boolean processCommand(final EntityPlayer player, + final ITerminal terminal, final String[] args) { + if (args[0].equalsIgnoreCase("access") && args.length > 1 && + args[1] != null && terminal instanceof TPlatform) { + final TPlatform platform = (TPlatform) terminal; + final AccessLevel userAccess = terminal.getUserAccess(player.getDisplayName()); + if (args[1].equalsIgnoreCase("?")) { + terminal.addToConsole( + "Access Level: " + + platform.getUserAccess(player.getDisplayName()).displayName); + return true; + } + if (args[1].equalsIgnoreCase("set") && args.length > 3 && + userAccess.ordinal() >= AccessLevel.ADMIN.ordinal()) { + final String username = args[2]; + final AccessLevel currentAccess = terminal.getUserAccess(username); + final AccessLevel playerAccess = terminal.getUserAccess(player.getDisplayName()); + if (playerAccess.ordinal() < AccessLevel.ADMIN.ordinal() || + playerAccess.ordinal() < currentAccess.ordinal() || + (player.getDisplayName().equalsIgnoreCase(username) && + playerAccess != AccessLevel.OWNER)) { + terminal.addToConsole("Access denied!"); + return true; + } + if (currentAccess != AccessLevel.NONE) { + final AccessLevel newAccess = AccessLevel.get(args[3]); + if ((currentAccess != AccessLevel.OWNER || + platform.getUsersWithAcess(AccessLevel.OWNER).size() > 1) && + newAccess != AccessLevel.NONE && + terminal.addUserAccess(username, newAccess, true)) { + terminal.addToConsole(username + " set to " + + newAccess.displayName); + platform.getWorldObj().markBlockForUpdate( + platform.xCoord, platform.yCoord, platform.zCoord); + return true; + } + } + } + } + return false; + } + + @Override + public boolean canPlayerUse(final EntityPlayer var1, + final ISpecialAccess mm) { + return mm.getUserAccess(var1.getDisplayName()).ordinal() >= AccessLevel.USER.ordinal() || + var1.capabilities.isCreativeMode; + } + + @Override + public boolean showOnHelp(final EntityPlayer player, + final ISpecialAccess mm) { + return this.canPlayerUse(player, mm); + } + + @Override + public List getCmdUses(final EntityPlayer player, + final ISpecialAccess mm) { + final List cmds = new ArrayList<>(); + cmds.add("access set username level"); + cmds.add("access ?"); + return cmds; + } + + @Override + public boolean canMachineUse(final ISpecialAccess mm) { + return mm instanceof TPlatform; + } +} diff --git a/src/main/java/icbm/gangshao/terminal/command/CommandDestroy.java b/src/main/java/icbm/gangshao/terminal/command/CommandDestroy.java new file mode 100644 index 0000000..f508378 --- /dev/null +++ b/src/main/java/icbm/gangshao/terminal/command/CommandDestroy.java @@ -0,0 +1,59 @@ +package icbm.gangshao.terminal.command; + +import icbm.gangshao.ISpecialAccess; +import icbm.gangshao.access.AccessLevel; +import icbm.gangshao.platform.TPlatform; +import icbm.gangshao.terminal.ITerminal; +import icbm.gangshao.terminal.TerminalCommand; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.entity.player.EntityPlayer; + +public class CommandDestroy extends TerminalCommand { + @Override + public String getCommandPrefix() { + return "destroy"; + } + + @Override + public boolean processCommand(final EntityPlayer player, + final ITerminal terminal, final String[] args) { + if (!(terminal instanceof TPlatform)) { + return false; + } + final TPlatform turret = (TPlatform) terminal; + if (args.length > 1) { + turret.destroyTurret(); + terminal.addToConsole("Destroyed Turret"); + return true; + } + turret.destroy(false); + return true; + } + + @Override + public boolean canPlayerUse(final EntityPlayer var1, + final ISpecialAccess mm) { + return mm.getUserAccess(var1.getDisplayName()).ordinal() >= AccessLevel.ADMIN.ordinal(); + } + + @Override + public boolean showOnHelp(final EntityPlayer player, + final ISpecialAccess mm) { + return this.canPlayerUse(player, mm); + } + + @Override + public List getCmdUses(final EntityPlayer player, + final ISpecialAccess mm) { + final List cmds = new ArrayList<>(); + cmds.add("destroy"); + cmds.add("destroy turret"); + return cmds; + } + + @Override + public boolean canMachineUse(final ISpecialAccess mm) { + return mm instanceof TPlatform; + } +} diff --git a/src/main/java/icbm/gangshao/terminal/command/CommandGet.java b/src/main/java/icbm/gangshao/terminal/command/CommandGet.java new file mode 100644 index 0000000..30d02f6 --- /dev/null +++ b/src/main/java/icbm/gangshao/terminal/command/CommandGet.java @@ -0,0 +1,74 @@ +package icbm.gangshao.terminal.command; + +import icbm.gangshao.ISpecialAccess; +import icbm.gangshao.access.AccessLevel; +import icbm.gangshao.access.UserAccess; +import icbm.gangshao.platform.TPlatform; +import icbm.gangshao.terminal.ITerminal; +import icbm.gangshao.terminal.TerminalCommand; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.entity.player.EntityPlayer; + +public class CommandGet extends TerminalCommand { + @Override + public String getCommandPrefix() { + return "get"; + } + + @Override + public boolean processCommand(final EntityPlayer player, final ITerminal TE, + final String[] args) { + if (args[0].equalsIgnoreCase("get") && args.length > 1 && args[1] != null && + TE instanceof TPlatform) { + final TPlatform turret = (TPlatform) TE; + if (args[1].equalsIgnoreCase("owner")) { + final List userList = turret.getUsersWithAcess(AccessLevel.OWNER); + if (userList.size() > 0) { + for (final UserAccess access : userList) { + TE.addToConsole("" + access.username); + } + } else { + TE.addToConsole("No owners"); + } + return true; + } + if (args[1].equalsIgnoreCase("position")) { + TE.addToConsole("position: " + turret.xCoord + "x " + + turret.yCoord + "y " + turret.zCoord + + "z "); + return true; + } + if (args[1].equalsIgnoreCase("kills")) { + TE.addToConsole("Not yet useable"); + return true; + } + } + return false; + } + + @Override + public boolean canPlayerUse(final EntityPlayer var1, + final ISpecialAccess mm) { + return true; + } + + @Override + public boolean showOnHelp(final EntityPlayer player, + final ISpecialAccess mm) { + return true; + } + + @Override + public List getCmdUses(final EntityPlayer player, final ISpecialAccess mm) { + final List cmds = new ArrayList<>(); + cmds.add("get owner"); + cmds.add("get position"); + return cmds; + } + + @Override + public boolean canMachineUse(final ISpecialAccess mm) { + return mm instanceof TPlatform; + } +} diff --git a/src/main/java/icbm/gangshao/terminal/command/CommandHelp.java b/src/main/java/icbm/gangshao/terminal/command/CommandHelp.java new file mode 100644 index 0000000..246a06f --- /dev/null +++ b/src/main/java/icbm/gangshao/terminal/command/CommandHelp.java @@ -0,0 +1,77 @@ +package icbm.gangshao.terminal.command; + +import icbm.gangshao.ISpecialAccess; +import icbm.gangshao.terminal.ITerminal; +import icbm.gangshao.terminal.TerminalCommand; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.entity.player.EntityPlayer; + +public class CommandHelp extends TerminalCommand { + @Override + public String getCommandPrefix() { + return "help"; + } + + @Override + public boolean processCommand(final EntityPlayer player, final ITerminal te, + final String[] args) { + if (args.length > 1) { + final List displayed = new ArrayList<>(); + for (final TerminalCommand cc : CommandRegistry.COMMANDS) { + if (cc.getCommandPrefix().equalsIgnoreCase(args[1]) && + cc.showOnHelp(player, te) && cc.canMachineUse(te)) { + te.addToConsole("----------------------"); + te.addToConsole(args[1] + " commands"); + te.addToConsole("----------------------"); + final List ccList = cc.getCmdUses(player, te); + for (final String cm : ccList) { + if (!displayed.contains(cm.toLowerCase())) { + te.addToConsole(cm); + displayed.add(cm.toLowerCase()); + } + } + te.addToConsole("----------------------"); + } + } + return true; + } + te.addToConsole("----------------------"); + te.addToConsole("Listing commands"); + te.addToConsole("----------------------"); + te.addToConsole("Help command"); + for (final TerminalCommand cc2 : CommandRegistry.COMMANDS) { + if (cc2.showOnHelp(player, te) && cc2.canMachineUse(te)) { + final List ccList2 = cc2.getCmdUses(player, te); + for (final String cm2 : ccList2) { + te.addToConsole(cm2); + } + } + } + te.addToConsole("-----------------------"); + return true; + } + + @Override + public boolean canPlayerUse(final EntityPlayer var1, + final ISpecialAccess mm) { + return true; + } + + @Override + public boolean showOnHelp(final EntityPlayer player, + final ISpecialAccess mm) { + return false; + } + + @Override + public List getCmdUses(final EntityPlayer player, + final ISpecialAccess mm) { + return null; + } + + @Override + public boolean canMachineUse(final ISpecialAccess mm) { + return true; + } +} diff --git a/src/main/java/icbm/gangshao/terminal/command/CommandRegistry.java b/src/main/java/icbm/gangshao/terminal/command/CommandRegistry.java new file mode 100644 index 0000000..397f847 --- /dev/null +++ b/src/main/java/icbm/gangshao/terminal/command/CommandRegistry.java @@ -0,0 +1,48 @@ +package icbm.gangshao.terminal.command; + +import icbm.gangshao.terminal.ITerminal; +import icbm.gangshao.terminal.TerminalCommand; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.entity.player.EntityPlayer; + +public class CommandRegistry { + public static final List COMMANDS; + + public static void register(final TerminalCommand cmd) { + if (!CommandRegistry.COMMANDS.contains(cmd)) { + CommandRegistry.COMMANDS.add(cmd); + } + } + + public static void onCommand(final EntityPlayer player, + final ITerminal terminal, final String cmd) { + if (cmd != null && cmd != "") { + final String[] args = cmd.split(" "); + terminal.addToConsole("§A" + player.getDisplayName() + ": " + cmd); + if (args[0] != null) { + for (final TerminalCommand command : CommandRegistry.COMMANDS) { + if (command.getCommandPrefix().equalsIgnoreCase(args[0])) { + if (!command.canMachineUse(terminal)) { + terminal.addToConsole("N/A"); + return; + } + if (!command.canPlayerUse(player, terminal)) { + terminal.addToConsole("Access Denied."); + return; + } + if (command.processCommand(player, terminal, args)) { + return; + } + continue; + } + } + } + terminal.addToConsole("Unknown Command."); + } + } + + static { + COMMANDS = new ArrayList<>(); + } +} diff --git a/src/main/java/icbm/gangshao/terminal/command/CommandTarget.java b/src/main/java/icbm/gangshao/terminal/command/CommandTarget.java new file mode 100644 index 0000000..4c55a5b --- /dev/null +++ b/src/main/java/icbm/gangshao/terminal/command/CommandTarget.java @@ -0,0 +1,99 @@ +package icbm.gangshao.terminal.command; + +import icbm.gangshao.ISpecialAccess; +import icbm.gangshao.access.AccessLevel; +import icbm.gangshao.platform.TPlatform; +import icbm.gangshao.terminal.ITerminal; +import icbm.gangshao.terminal.TerminalCommand; +import icbm.gangshao.turret.sentries.TAutomaticTurret; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.entity.player.EntityPlayer; + +public class CommandTarget extends TerminalCommand { + @Override + public String getCommandPrefix() { + return "target"; + } + + @Override + public boolean processCommand(final EntityPlayer player, + final ITerminal terminal, final String[] args) { + if (terminal instanceof TPlatform) { + final TPlatform turret = (TPlatform) terminal; + if (turret.getTurret(false) instanceof TAutomaticTurret) { + final TAutomaticTurret sentry = (TAutomaticTurret) turret.getTurret(false); + if (args.length > 1) { + final String obj = args[1]; + String bool = ""; + boolean change = false; + if (args.length > 2) { + bool = args[2]; + change = Boolean.getBoolean(bool); + } + if (obj.equalsIgnoreCase("player")) { + if (!bool.isEmpty()) { + sentry.targetPlayers = change; + } else { + sentry.targetPlayers = !sentry.targetPlayers; + } + return true; + } + if (obj.equalsIgnoreCase("hostile")) { + if (!bool.isEmpty()) { + sentry.targetHostile = change; + } else { + sentry.targetHostile = !sentry.targetHostile; + } + return true; + } + if (obj.equalsIgnoreCase("friendly")) { + if (!bool.isEmpty()) { + sentry.targetFriendly = change; + } else { + sentry.targetFriendly = !sentry.targetFriendly; + } + return true; + } + if (obj.equalsIgnoreCase("air")) { + if (!bool.isEmpty()) { + sentry.targetAir = change; + } else { + sentry.targetAir = !sentry.targetAir; + } + return true; + } + } + terminal.addToConsole("[player|hostile|friendly|air] [true|false]"); + return false; + } + } + return false; + } + + @Override + public boolean canPlayerUse(final EntityPlayer var1, + final ISpecialAccess mm) { + return mm.getUserAccess(var1.getDisplayName()).ordinal() >= AccessLevel.ADMIN.ordinal() || + var1.capabilities.isCreativeMode; + } + + @Override + public boolean showOnHelp(final EntityPlayer player, + final ISpecialAccess mm) { + return this.canPlayerUse(player, mm); + } + + @Override + public List getCmdUses(final EntityPlayer player, + final ISpecialAccess mm) { + final List cmds = new ArrayList<>(); + cmds.add("target [bool]"); + return cmds; + } + + @Override + public boolean canMachineUse(final ISpecialAccess mm) { + return mm instanceof TPlatform && ((TPlatform) mm).getTurret(false) instanceof TAutomaticTurret; + } +} diff --git a/src/main/java/icbm/gangshao/terminal/command/CommandUser.java b/src/main/java/icbm/gangshao/terminal/command/CommandUser.java new file mode 100644 index 0000000..92c3acb --- /dev/null +++ b/src/main/java/icbm/gangshao/terminal/command/CommandUser.java @@ -0,0 +1,89 @@ +package icbm.gangshao.terminal.command; + +import icbm.gangshao.ISpecialAccess; +import icbm.gangshao.access.AccessLevel; +import icbm.gangshao.terminal.ITerminal; +import icbm.gangshao.terminal.TerminalCommand; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.entity.player.EntityPlayer; + +public class CommandUser extends TerminalCommand { + @Override + public String getCommandPrefix() { + return "users"; + } + + @Override + public boolean processCommand(final EntityPlayer player, + final ITerminal terminal, final String[] args) { + if (!args[0].equalsIgnoreCase("users") || args.length <= 1 || + args[1] == null || !(terminal instanceof ISpecialAccess)) { + return false; + } + final ISpecialAccess turret = terminal; + if (args[1].equalsIgnoreCase("List")) { + terminal.addToConsole(""); + terminal.addToConsole("Listing Users"); + for (int i = 0; i < turret.getUsers().size(); ++i) { + terminal.addToConsole(" " + i + ") " + + turret.getUsers().get(i).username); + } + return true; + } + if (args[1].equalsIgnoreCase("remove") && args.length > 2) { + if (args[2] == null) { + terminal.addToConsole("Invalid username."); + return true; + } + if (turret.removeUserAccess(args[2])) { + terminal.addToConsole("Removed: " + args[2]); + return true; + } + terminal.addToConsole(" User not found."); + return true; + } else { + if (!args[1].equalsIgnoreCase("add") || args.length <= 2) { + return false; + } + if (args[2] == null) { + terminal.addToConsole("Invalid username."); + return true; + } + if (turret.addUserAccess(args[2], AccessLevel.USER, true)) { + terminal.addToConsole("Added: " + args[2]); + return true; + } + terminal.addToConsole("User already exists."); + return true; + } + } + + @Override + public boolean canPlayerUse(final EntityPlayer var1, + final ISpecialAccess mm) { + return mm.getUsers().size() <= 0 || + mm.getUserAccess(var1.getDisplayName()).ordinal() >= AccessLevel.ADMIN.ordinal(); + } + + @Override + public boolean showOnHelp(final EntityPlayer player, + final ISpecialAccess mm) { + return this.canPlayerUse(player, mm); + } + + @Override + public List getCmdUses(final EntityPlayer player, + final ISpecialAccess mm) { + final List cmds = new ArrayList<>(); + cmds.add("users list"); + cmds.add("users add [player]"); + cmds.add("users remove [player]"); + return cmds; + } + + @Override + public boolean canMachineUse(final ISpecialAccess mm) { + return mm instanceof ISpecialAccess; + } +} diff --git a/src/main/java/icbm/gangshao/turret/BlockTurret.java b/src/main/java/icbm/gangshao/turret/BlockTurret.java new file mode 100644 index 0000000..366ab10 --- /dev/null +++ b/src/main/java/icbm/gangshao/turret/BlockTurret.java @@ -0,0 +1,229 @@ +package icbm.gangshao.turret; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.ICBMTab; +import icbm.core.di.BICBM; +import icbm.gangshao.ICBMSentry; +import icbm.gangshao.damage.EntityTileDamagable; +import icbm.gangshao.render.BlockRenderingHandler; +import icbm.gangshao.turret.mount.TRailgunTurret; +import icbm.gangshao.turret.sentries.TAATurret; +import icbm.gangshao.turret.sentries.TLaserTurret; +import icbm.gangshao.turret.sentries.TMachineGunTurret; +import java.util.List; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.UniversalElectricity; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.block.BlockAdvanced; +import universalelectricity.prefab.implement.IRedstoneReceptor; +import universalelectricity.prefab.implement.IRotatable; +import universalelectricity.prefab.multiblock.IBlockActivate; +import universalelectricity.prefab.multiblock.IMultiBlock; + +public class BlockTurret extends BICBM { + public BlockTurret() { + super("turret", UniversalElectricity.machine); + this.setCreativeTab((CreativeTabs) ICBMTab.INSTANCE); + this.setHardness(100.0f); + this.setResistance(50.0f); + } + + @Override + public void setBlockBoundsBasedOnState(final IBlockAccess world, final int x, + final int y, final int z) { + final TileEntity ent = world.getTileEntity(x, y, z); + if (ent instanceof TTurretBase) { + final EntityTileDamagable dEnt = ((TTurretBase) ent).getDamageEntity(); + if (dEnt != null) { + this.setBlockBounds(0.2f, 0.0f, 0.2f, 0.8f, 0.4f, 0.8f); + } else { + this.setBlockBounds(0.2f, 0.0f, 0.2f, 0.8f, 0.8f, 0.8f); + } + } + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(final IIconRegister iconRegister) { + this.blockIcon = iconRegister.registerIcon("icbm:machine"); + } + + @Override + public void onBlockPlacedBy(final World world, final int x, final int y, + final int z, + final EntityLivingBase par5EntityLiving, + final ItemStack itemStack) { + final int angle = MathHelper.floor_double( + ((Entity) par5EntityLiving).rotationYaw * 4.0f / 360.0f + 0.5) & + 0x3; + final TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof IRotatable) { + final IRotatable rotatableEntity = (IRotatable) tileEntity; + switch (angle) { + case 0: { + rotatableEntity.setDirection(world, x, y, z, + ForgeDirection.getOrientation(3)); + break; + } + case 1: { + rotatableEntity.setDirection(world, x, y, z, + ForgeDirection.getOrientation(4)); + break; + } + case 2: { + rotatableEntity.setDirection(world, x, y, z, + ForgeDirection.getOrientation(2)); + break; + } + case 3: { + rotatableEntity.setDirection(world, x, y, z, + ForgeDirection.getOrientation(5)); + break; + } + } + } + if (tileEntity instanceof IMultiBlock) { + ((IMultiBlock) tileEntity).onCreate(new Vector3(x, y, z)); + } + } + + @Override + public boolean onUseWrench(final World world, final int x, final int y, + final int z, final EntityPlayer entityPlayer, + final int side, final float hitX, final float hitY, + final float hitZ) { + final TileEntity ent = world.getTileEntity(x, y, z); + if (ent instanceof TTurretBase) { + final Random random = new Random(); + ((TTurretBase) ent).setHealth(5 + random.nextInt(7), true); + return true; + } + return false; + } + + @Override + public boolean onMachineActivated(final World world, final int x, final int y, final int z, + final EntityPlayer entityPlayer, final int side, + final float hitX, final float hitY, final float hitZ) { + final TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof IBlockActivate) { + return ((IBlockActivate) tileEntity).onActivated(entityPlayer); + } + final Block block = world.getBlock(x, y - 1, z); + return block instanceof BlockAdvanced && + ((BlockAdvanced) block) + .onMachineActivated(world, x, y - 1, z, entityPlayer, side, hitX, + hitY, hitZ); + } + + @Override + public void onNeighborBlockChange(final World world, final int x, final int y, + final int z, Block block) { + final TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof TTurretBase) { + if (this.canBlockStay(world, x, y, z)) { + if (tileEntity instanceof IRedstoneReceptor) { + if (world.isBlockIndirectlyGettingPowered(x, y, z)) { + ((IRedstoneReceptor) tileEntity).onPowerOn(); + } else { + ((IRedstoneReceptor) tileEntity).onPowerOff(); + } + } + } else if (tileEntity != null) { + ((TTurretBase) tileEntity).destroy(false); + } + } + } + + @Override + public void breakBlock(final World par1World, final int x, final int y, + final int z, final Block par5, final int par6) { + final TileEntity tileEntity = par1World.getTileEntity(x, y, z); + if (tileEntity instanceof IMultiBlock) { + ((IMultiBlock) tileEntity).onDestroy(tileEntity); + } + super.breakBlock(par1World, x, y, z, par5, par6); + } + + @Override + public TileEntity createNewTileEntity(final World world, final int meta) { + if (meta < TurretType.values().length) { + try { + return TurretType.values()[meta].tileEntity.newInstance(); + } catch (final Exception e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int damageDropped(final int metadata) { + return metadata; + } + + @Override + public boolean canPlaceBlockAt(final World world, final int x, final int y, + final int z) { + return super.canPlaceBlockAt(world, x, y, z) && + this.canBlockStay(world, x, y, z); + } + + @Override + public boolean canBlockStay(final World world, final int x, final int y, + final int z) { + return world.getBlock(x, y - 1, z) == ICBMSentry.blockPlatform; + } + + @Override + public void getSubBlocks(final Item par1, final CreativeTabs par2CreativeTabs, + final List list) { + for (int i = 0; i < TurretType.values().length; ++i) { + list.add(new ItemStack(par1, 1, i)); + } + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderType() { + return BlockRenderingHandler.ID; + } + + public enum TurretType { + GUN(TMachineGunTurret.class), + RAILGUN(TRailgunTurret.class), + AA(TAATurret.class), + LASER(TLaserTurret.class); + + public Class tileEntity; + + private TurretType(final Class tile) { + this.tileEntity = tile; + } + } +} diff --git a/src/main/java/icbm/gangshao/turret/ItemAmmo.java b/src/main/java/icbm/gangshao/turret/ItemAmmo.java new file mode 100644 index 0000000..979089f --- /dev/null +++ b/src/main/java/icbm/gangshao/turret/ItemAmmo.java @@ -0,0 +1,113 @@ +package icbm.gangshao.turret; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.ItICBM; +import icbm.gangshao.IAmmunition; +import icbm.gangshao.ProjectileType; +import java.util.List; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class ItemAmmo extends ItICBM implements IAmmunition { + public static final IIcon[] ICONS; + + public ItemAmmo() { + super("ammunition"); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + @Override + public int getMetadata(final int damage) { + return damage; + } + + @Override + public String getUnlocalizedName(final ItemStack itemStack) { + return "item.icbm:" + AmmoType.values()[itemStack.getItemDamage()].iconName; + } + + @Override + public IIcon getIconFromDamage(final int i) { + return ItemAmmo.ICONS[i]; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(final IIconRegister iconRegister) { + for (int i = 0; i < AmmoType.values().length; ++i) { + ItemAmmo.ICONS[i] = iconRegister.registerIcon("icbm:" + AmmoType.values()[i].iconName); + } + } + + @Override + public ProjectileType getType(final ItemStack itemStack) { + if (itemStack.getItemDamage() < AmmoType.values().length) { + return AmmoType.values()[itemStack.getItemDamage()].type; + } + return null; + } + + @Override + public boolean canDrop(final int meta) { + return meta != AmmoType.BULLETINF.ordinal(); + } + + @Override + public ItemStack onDroppedIntoWorld(final ItemStack stack) { + return stack; + } + + @Override + public int getEntityLifespan(final ItemStack itemStack, final World world) { + if (itemStack != null && + itemStack.getItemDamage() == AmmoType.BULLETINF.ordinal()) { + return 40; + } + return super.getEntityLifespan(itemStack, world); + } + + @Override + public void getSubItems(final Item par1, final CreativeTabs par2CreativeTabs, + final List par3List) { + for (int i = 0; i < AmmoType.values().length; ++i) { + par3List.add(new ItemStack((Item) this, 1, i)); + } + } + + @Override + public int getDamage() { + return 8; + } + + static { + ICONS = new IIcon[AmmoType.values().length]; + } + + public enum AmmoType { + SHELL("SHELL", 0, "bulletShell", ProjectileType.UNKNOWN, true), + BULLET("BULLET", 1, "bullet", ProjectileType.CONVENTIONAL, true), + BULLETRAIL("BULLETRAIL", 2, "bulletRailgun", ProjectileType.RAILGUN, true), + BULLETANTI("BULLETANTI", 3, "bulletAntimatter", ProjectileType.RAILGUN, + true), + BULLETINF("BULLETINF", 4, "bulletInfinite", ProjectileType.CONVENTIONAL, + false); + + public String iconName; + public ProjectileType type; + public boolean consume; + + private AmmoType(final String name, final int ordinal, + final String iconName, final ProjectileType type, + final boolean consume) { + this.iconName = iconName; + this.type = type; + this.consume = consume; + } + } +} diff --git a/src/main/java/icbm/gangshao/turret/ItemBlockTurret.java b/src/main/java/icbm/gangshao/turret/ItemBlockTurret.java new file mode 100644 index 0000000..1053696 --- /dev/null +++ b/src/main/java/icbm/gangshao/turret/ItemBlockTurret.java @@ -0,0 +1,21 @@ +package icbm.gangshao.turret; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemBlockTurret extends ItemBlock { + public ItemBlockTurret(final Block par1) { + super(par1); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + public int getMetadata(final int par1) { + return par1; + } + + public String getUnlocalizedName(final ItemStack par1ItemStack) { + return this.getUnlocalizedName() + "." + par1ItemStack.getItemDamage(); + } +} diff --git a/src/main/java/icbm/gangshao/turret/TTurretBase.java b/src/main/java/icbm/gangshao/turret/TTurretBase.java new file mode 100644 index 0000000..3e31901 --- /dev/null +++ b/src/main/java/icbm/gangshao/turret/TTurretBase.java @@ -0,0 +1,381 @@ +package icbm.gangshao.turret; + +import calclavia.lib.CalculationHelper; +import calclavia.lib.render.ITagRender; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import icbm.gangshao.ICBMSentry; +import icbm.gangshao.ISentry; +import icbm.gangshao.damage.EntityTileDamagable; +import icbm.gangshao.damage.IHealthTile; +import icbm.gangshao.packet.PacketTurret; +import icbm.gangshao.platform.TPlatform; +import icbm.gangshao.task.LookHelper; +import java.util.HashMap; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.block.IVoltage; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.tile.TileEntityAdvanced; + +public abstract class TTurretBase extends TileEntityAdvanced + implements ITagRender, IVoltage, ISentry, IHealthTile { + public float maxPitch; + public float minPitch; + protected boolean allowFreePitch; + private ForgeDirection platformDirection; + public LookHelper lookHelper; + protected boolean speedUpRotation; + public int health; + public int baseFiringDelay; + public int tickSinceFired; + public int minFiringDelay; + private EntityTileDamagable damageEntity; + public float wantedRotationYaw; + public float wantedRotationPitch; + public float currentRotationYaw; + public float currentRotationPitch; + public int lastRotateTick; + + public TTurretBase() { + this.maxPitch = 35.0f; + this.minPitch = -35.0f; + this.allowFreePitch = false; + this.platformDirection = ForgeDirection.DOWN; + this.lookHelper = new LookHelper(this); + this.speedUpRotation = false; + this.health = -1; + this.baseFiringDelay = 10; + this.tickSinceFired = 0; + this.minFiringDelay = 5; + this.wantedRotationPitch = 0.0f; + this.currentRotationPitch = 0.0f; + this.lastRotateTick = 0; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (this.tickSinceFired > 0) { + --this.tickSinceFired; + } + if (!this.worldObj.isRemote && !this.isInvul() && + this.getDamageEntity() == null && this.getHealth() > 0) { + this.setDamageEntity(new EntityTileDamagable(this)); + this.worldObj.spawnEntityInWorld((Entity) this.getDamageEntity()); + } + this.updateRotation(); + } + + public void onTurretPacket(PacketTurret.Type type, NBTTagCompound data) { + if (type == PacketTurret.Type.ROTATION) { + this.setRotation(data.getFloat("yaw"), data.getFloat("pitch")); + } else if (type == PacketTurret.Type.STATS) { + this.health = data.getInteger("health"); + } + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + + this.readFromNBT(nbt); + } + + public PacketTurret getStatsPacket() { + return PacketTurret.stats(new Vector3(this), this.health); + } + + public PacketTurret getRotationPacket() { + return PacketTurret.rotation(new Vector3(this), this.wantedRotationYaw, + this.wantedRotationPitch); + } + + @Override + public Packet getDescriptionPacket() { + final NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, + this.getBlockMetadata(), nbt); + } + + @Override + public void writeToNBT(final NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setFloat("yaw", this.wantedRotationYaw); + nbt.setFloat("pitch", this.wantedRotationPitch); + nbt.setFloat("cYaw", this.currentRotationYaw); + nbt.setFloat("cPitch", this.currentRotationPitch); + nbt.setInteger("dir", this.platformDirection.ordinal()); + nbt.setInteger("health", this.getHealth()); + } + + @Override + public void readFromNBT(final NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.wantedRotationYaw = nbt.getFloat("yaw"); + this.wantedRotationPitch = nbt.getFloat("pitch"); + this.currentRotationYaw = nbt.getFloat("cYaw"); + this.currentRotationPitch = nbt.getFloat("cPitch"); + this.platformDirection = ForgeDirection.getOrientation(nbt.getInteger("dir")); + if (nbt.hasKey("health")) { + this.health = nbt.getInteger("health"); + } + } + + public abstract double getFiringRequest(); + + public boolean isRunning() { + return this.getPlatform() != null && this.getPlatform().isRunning() && + this.isAlive(); + } + + public TPlatform getPlatform() { + final TileEntity tileEntity = this.worldObj.getTileEntity( + this.xCoord + this.platformDirection.offsetX, + this.yCoord + this.platformDirection.offsetY, + this.zCoord + this.platformDirection.offsetZ); + if (tileEntity instanceof TPlatform) { + return (TPlatform) tileEntity; + } + return null; + } + + public void destroy(final boolean doExplosion) { + if (doExplosion) { + if (!this.isInvalid()) { + this.worldObj.setBlockToAir(this.xCoord, this.yCoord, this.zCoord); + this.worldObj.createExplosion((Entity) this.getDamageEntity(), + (double) this.xCoord, (double) this.yCoord, + (double) this.zCoord, 2.0f, true); + } else { + this.worldObj.setBlockToAir(this.xCoord, this.yCoord, this.zCoord); + } + } else if (!this.worldObj.isRemote) { + this.getBlockType().dropBlockAsItem(this.worldObj, this.xCoord, + this.yCoord, this.zCoord, + this.getBlockMetadata(), 0); + this.worldObj.setBlockToAir(this.xCoord, this.yCoord, this.zCoord); + } + } + + public int getBarrels() { + return 1; + } + + public void setDeploySide(final ForgeDirection side) { + this.platformDirection = side.getOpposite(); + } + + @Override + public float addInformation(final HashMap map, final EntityPlayer player) { + map.put(this.getName(), 8978312); + return 1.0f; + } + + @Override + public String getName() { + return new ItemStack(this.getBlockType(), 1, this.getBlockMetadata()) + .getDisplayName() + + " " + this.getHealth() + "/" + this.getMaxHealth(); + } + + @Override + public Vector3 getMuzzle() { + return this.getCenter().add(Vector3.multiply( + CalculationHelper.getDeltaPositionFromRotation( + this.currentRotationYaw, this.currentRotationPitch), + 1.0)); + } + + @Override + public void onWeaponActivated() { + this.tickSinceFired += this.getFireDelay(); + } + + public int getFireDelay() { + return this.baseFiringDelay; + } + + public abstract int getMaxHealth(); + + public boolean isInvul() { + return false; + } + + @Override + public int getHealth() { + if (this.health == -1) { + this.health = this.getMaxHealth(); + } + return this.health; + } + + @Override + public void setHealth(int i, final boolean increase) { + if (increase) { + i += this.health; + } + this.health = Math.min(Math.max(i, 0), this.getMaxHealth()); + if (!this.worldObj.isRemote) { + ICBMSentry.channel.sendToAllAround( + this.getStatsPacket(), + new TargetPoint(this.worldObj.provider.dimensionId, this.xCoord, + this.yCoord, this.zCoord, 100.0)); + } + } + + @Override + public boolean isAlive() { + return this.getHealth() > 0 || this.isInvul(); + } + + @Override + public boolean onDamageTaken(final DamageSource source, final int amount) { + if (this.isInvul()) { + return false; + } + if (source != null && source.equals(DamageSource.onFire)) { + return true; + } + this.health -= amount; + if (this.health <= 0) { + this.destroy(true); + } else { + ICBMSentry.channel.sendToAllAround( + this.getStatsPacket(), + new TargetPoint(this.worldObj.provider.dimensionId, this.xCoord, + this.yCoord, this.zCoord, 100.0)); + } + return true; + } + + public EntityTileDamagable getDamageEntity() { + return this.damageEntity; + } + + public void setDamageEntity(final EntityTileDamagable damageEntity) { + this.damageEntity = damageEntity; + } + + public void updateRotation() { + final float yawDifference = Math.abs(LookHelper.getAngleDif( + this.currentRotationYaw, this.wantedRotationYaw)); + if (yawDifference > 0.001f) { + final float speedYaw = Math.min(this.getRotationSpeed(), yawDifference); + if (this.currentRotationYaw > this.wantedRotationYaw) { + this.currentRotationYaw -= speedYaw; + } else { + this.currentRotationYaw += speedYaw; + } + if (Math.abs(this.currentRotationYaw - this.wantedRotationYaw) <= speedYaw + 0.1) { + this.currentRotationYaw = this.wantedRotationYaw; + } + } + final float pitchDifference = Math.abs(LookHelper.getAngleDif( + this.currentRotationPitch, this.wantedRotationPitch)); + if (pitchDifference > 0.001f) { + final float speedPitch = Math.min(this.getRotationSpeed(), pitchDifference); + if (this.currentRotationPitch > this.wantedRotationPitch) { + this.currentRotationPitch -= speedPitch; + } else { + this.currentRotationPitch += speedPitch; + } + if (Math.abs(this.currentRotationPitch - this.wantedRotationPitch) <= speedPitch + 0.1) { + this.currentRotationPitch = this.wantedRotationPitch; + } + } + if (Math.abs(this.currentRotationPitch - this.wantedRotationPitch) <= 0.001f && + Math.abs(this.currentRotationYaw - this.wantedRotationYaw) <= 0.001f) { + ++this.lastRotateTick; + } + this.currentRotationPitch = MathHelper.wrapAngleTo180_float(this.currentRotationPitch); + this.wantedRotationYaw = MathHelper.wrapAngleTo180_float(this.wantedRotationYaw); + this.wantedRotationPitch = MathHelper.wrapAngleTo180_float(this.wantedRotationPitch); + } + + public float getRotationSpeed() { + return Float.MAX_VALUE; + } + + @Override + public void setRotation(final float yaw, final float pitch) { + this.wantedRotationYaw = MathHelper.wrapAngleTo180_float(yaw); + if (!this.allowFreePitch) { + this.wantedRotationPitch = Math.max( + Math.min(MathHelper.wrapAngleTo180_float(pitch), this.maxPitch), + this.minPitch); + } else { + this.wantedRotationPitch = MathHelper.wrapAngleTo180_float(pitch); + } + } + + public void rotateTo(final float wantedRotationYaw, + final float wantedRotationPitch) { + if (!this.worldObj.isRemote && this.lastRotateTick > 0 && + (this.wantedRotationYaw != wantedRotationYaw || + this.wantedRotationPitch != wantedRotationPitch)) { + this.setRotation(wantedRotationYaw, wantedRotationPitch); + this.lastRotateTick = 0; + if (!this.worldObj.isRemote) { + ICBMSentry.channel.sendToAllAround( + this.getRotationPacket(), + new TargetPoint(this.worldObj.provider.dimensionId, this.xCoord, + this.yCoord, this.zCoord, 50.0)); + } + } + } + + public void cancelRotation() { + this.setRotation(this.currentRotationYaw, this.currentRotationPitch); + } + + public void drawParticleStreamTo(final Vector3 endPosition) { + if (this.worldObj.isRemote) { + final Vector3 startPosition = this.getMuzzle(); + final Vector3 direction = CalculationHelper.getDeltaPositionFromRotation( + this.currentRotationYaw, this.currentRotationPitch); + final double xoffset = 0.0; + final double yoffset = 0.0; + final double zoffset = 0.0; + Vector3 horzdir = direction.normalize(); + horzdir.y = 0.0; + horzdir = horzdir.normalize(); + for (double cx = startPosition.x + direction.x * xoffset - + direction.y * horzdir.x * yoffset - horzdir.z * zoffset, + cy = startPosition.y + direction.y * xoffset + + (1.0 - Math.abs(direction.y)) * yoffset, + cz = startPosition.z + direction.x * xoffset - + direction.y * horzdir.x * yoffset + horzdir.x * zoffset, + dx = endPosition.x - cx, dy = endPosition.y - cy, + dz = endPosition.z - cz, + ratio = Math.sqrt(dx * dx + dy * dy + dz * dz); Math.abs(cx - endPosition.x) > Math + .abs(dx / ratio); cx += dx * 0.1 / ratio, cy += dy * 0.1 / ratio, cz += dz * 0.1 / ratio) { + this.worldObj.spawnParticle("townaura", cx, cy, cz, 0.0, 0.0, 0.0); + } + } + } + + public abstract void renderShot(final Vector3 p0); + + public abstract void playFiringSound(); + + @Override + public AxisAlignedBB getRenderBoundingBox() { + return TileEntity.INFINITE_EXTENT_AABB; + } + + public Vector3 getCenter() { + return new Vector3(this).add(0.5); + } +} diff --git a/src/main/java/icbm/gangshao/turret/mount/ESeat.java b/src/main/java/icbm/gangshao/turret/mount/ESeat.java new file mode 100644 index 0000000..ed51332 --- /dev/null +++ b/src/main/java/icbm/gangshao/turret/mount/ESeat.java @@ -0,0 +1,108 @@ +package icbm.gangshao.turret.mount; + +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import icbm.core.MainBase; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.Entity; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class ESeat extends Entity implements IEntityAdditionalSpawnData { + private TileEntity controller; + private boolean shouldSit; + + public ESeat(final World par1World) { + super(par1World); + this.shouldSit = false; + this.setSize(1.0f, 1.0f); + super.noClip = true; + } + + public ESeat(final World par1World, final Vector3 position, + final TileEntity controller, final boolean sit) { + this(par1World); + super.isImmuneToFire = true; + this.setPosition(position.x, position.y, position.z); + this.controller = controller; + this.shouldSit = sit; + } + + // TODO: WTF + // @Override + public String getEntityName() { + return "Seat"; + } + + @Override + public void writeSpawnData(final ByteBuf data) { + if (this.controller != null) { + data.writeInt(this.controller.xCoord); + data.writeInt(this.controller.yCoord); + data.writeInt(this.controller.zCoord); + } else { + MainBase.LOGGER.severe("Failed to send ridable turret packet!"); + } + data.writeBoolean(this.shouldSit); + } + + @Override + public void readSpawnData(final ByteBuf data) { + try { + this.controller = super.worldObj.getTileEntity( + data.readInt(), data.readInt(), data.readInt()); + this.shouldSit = data.readBoolean(); + } catch (final Exception e) { + e.printStackTrace(); + } + } + + @Override + public void onUpdate() { + if (this.controller == null) { + this.setDead(); + return; + } + if (this.controller.isInvalid()) { + this.setDead(); + return; + } + if (this.controller instanceof TPaoTaiQi) { + ((TPaoTaiQi) this.controller).entityFake = this; + } + if (super.worldObj.isRemote && super.riddenByEntity != null) { + super.riddenByEntity.updateRiderPosition(); + } + super.posY = this.controller.yCoord + 1.2; + } + + @Override + public double getMountedYOffset() { + return -0.5; + } + + @Override + protected boolean canTriggerWalking() { + return false; + } + + @Override + public boolean shouldRiderSit() { + return this.shouldSit; + } + + @Override + protected void entityInit() { + } + + @Override + protected void readEntityFromNBT(final NBTTagCompound nbt) { + this.shouldSit = nbt.getBoolean("shouldSit"); + } + + @Override + protected void writeEntityToNBT(final NBTTagCompound nbt) { + nbt.setBoolean("shouldSit", this.shouldSit); + } +} diff --git a/src/main/java/icbm/gangshao/turret/mount/TPaoTaiQi.java b/src/main/java/icbm/gangshao/turret/mount/TPaoTaiQi.java new file mode 100644 index 0000000..999170c --- /dev/null +++ b/src/main/java/icbm/gangshao/turret/mount/TPaoTaiQi.java @@ -0,0 +1,97 @@ +package icbm.gangshao.turret.mount; + +import calclavia.lib.CalculationHelper; +import icbm.gangshao.turret.TTurretBase; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.MovingObjectPosition; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.multiblock.IMultiBlock; + +public abstract class TPaoTaiQi extends TTurretBase implements IMultiBlock { + protected ESeat entityFake; + + public TPaoTaiQi() { + this.entityFake = null; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (this.entityFake != null && this.entityFake.riddenByEntity instanceof EntityPlayer) { + final EntityPlayer mountedPlayer = (EntityPlayer) this.entityFake.riddenByEntity; + if (((Entity) mountedPlayer).rotationPitch > super.maxPitch) { + ((Entity) mountedPlayer).rotationPitch = super.maxPitch; + } + if (((Entity) mountedPlayer).rotationPitch < super.minPitch) { + ((Entity) mountedPlayer).rotationPitch = super.minPitch; + } + final float rotationPitch = ((Entity) mountedPlayer).rotationPitch; + super.wantedRotationPitch = rotationPitch; + super.currentRotationPitch = rotationPitch; + final float rotationYaw = ((Entity) mountedPlayer).rotationYaw; + super.wantedRotationYaw = rotationYaw; + super.currentRotationYaw = rotationYaw; + } + } + + public MovingObjectPosition rayTrace(final double distance) { + return CalculationHelper.doCustomRayTrace( + this.worldObj, this.getMuzzle(), super.wantedRotationYaw, + super.wantedRotationPitch, true, distance); + } + + @Override + public boolean onActivated(final EntityPlayer entityPlayer) { + if (entityPlayer.isSneaking()) { + this.tryActivateWeapon(); + } else { + if (this.entityFake != null) { + if (this.entityFake.riddenByEntity instanceof EntityPlayer) { + final EntityPlayer mountedPlayer = (EntityPlayer) this.entityFake.riddenByEntity; + if (entityPlayer == mountedPlayer) { + if (!this.worldObj.isRemote) { + // TODO: WTF + // PacketManager.sendPacketToClients(this.getRotationPacket()); + } + // TODO: WTF + // entityPlayer.unmountEntity((Entity) this.entityFake); + this.entityFake.setDead(); + this.entityFake = null; + return true; + } + } + return false; + } + this.mount(entityPlayer); + } + return true; + } + + public void mount(final EntityPlayer entityPlayer) { + if (!this.worldObj.isRemote) { + if (this.entityFake == null) { + this.entityFake = new ESeat(this.worldObj, + new Vector3(this.xCoord + 0.5, this.yCoord + 1.2, + this.zCoord + 0.5), + this, true); + this.worldObj.spawnEntityInWorld((Entity) this.entityFake); + } + ((Entity) entityPlayer).rotationYaw = super.currentRotationYaw; + ((Entity) entityPlayer).rotationPitch = super.currentRotationPitch; + entityPlayer.mountEntity((Entity) this.entityFake); + } + } + + public void tryActivateWeapon() { + if (this.canActivateWeapon()) { + this.onWeaponActivated(); + } + } + + @Override + public boolean canApplyPotion(final PotionEffect par1PotionEffect) { + return false; + } +} diff --git a/src/main/java/icbm/gangshao/turret/mount/TRailgunTurret.java b/src/main/java/icbm/gangshao/turret/mount/TRailgunTurret.java new file mode 100644 index 0000000..1448abe --- /dev/null +++ b/src/main/java/icbm/gangshao/turret/mount/TRailgunTurret.java @@ -0,0 +1,224 @@ +package icbm.gangshao.turret.mount; + +import calclavia.lib.CalculationHelper; +import icbm.api.explosion.IExplosive; +import icbm.core.MainBase; +import icbm.gangshao.ProjectileType; +import icbm.gangshao.ICBMSentry; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.IBlockAccess; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.implement.IRedstoneReceptor; +import universalelectricity.prefab.multiblock.IMultiBlock; +import universalelectricity.prefab.multiblock.TileEntityMulti; + +public class TRailgunTurret extends TPaoTaiQi implements IRedstoneReceptor { + private int gunChargingTicks; + private boolean redstonePowerOn; + private boolean isAntimatter; + private float explosionSize; + private int explosionDepth; + private int endTicks; + + public TRailgunTurret() { + this.gunChargingTicks = 0; + this.redstonePowerOn = false; + this.endTicks = 0; + super.baseFiringDelay = 80; + super.minFiringDelay = 50; + super.maxPitch = 60.0f; + super.minPitch = -60.0f; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (this.getPlatform() != null) { + if (this.redstonePowerOn) { + this.tryActivateWeapon(); + } + if (this.gunChargingTicks > 0) { + ++this.gunChargingTicks; + if (this.gunChargingTicks >= this.getFireDelay()) { + this.onFire(); + this.gunChargingTicks = 0; + } + } + if (this.worldObj.isRemote && this.endTicks-- > 0) { + final MovingObjectPosition objectMouseOver = this.rayTrace(2000.0); + if (objectMouseOver != null && objectMouseOver.hitVec != null) { + this.drawParticleStreamTo(new Vector3(objectMouseOver.hitVec)); + } + } + } + } + + @Override + public void tryActivateWeapon() { + if (this.canActivateWeapon() && this.gunChargingTicks == 0) { + this.onWeaponActivated(); + } + } + + public void onFire() { + if (!this.worldObj.isRemote) { + while (this.explosionDepth > 0) { + final MovingObjectPosition objectMouseOver = this.rayTrace(2000.0); + if (objectMouseOver != null && + !ICBMSentry.isProtected(this.worldObj, + new Vector3(objectMouseOver), + ICBMSentry.FLAG_RAILGUN)) { + if (this.isAntimatter) { + final int radius = 50; + final AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox( + (double) (objectMouseOver.blockX - radius), + (double) (objectMouseOver.blockY - radius), + (double) (objectMouseOver.blockZ - radius), + (double) (objectMouseOver.blockX + radius), + (double) (objectMouseOver.blockY + radius), + (double) (objectMouseOver.blockZ + radius)); + final List missilesNearby = this.worldObj.getEntitiesWithinAABB(Entity.class, bounds); + for (final Entity entity : missilesNearby) { + if (entity instanceof IExplosive) { + entity.setDead(); + } + } + } + final Vector3 blockPosition = new Vector3(objectMouseOver.hitVec); + final Block block = blockPosition.getBlock((IBlockAccess) this.worldObj); + if (block != null && + block.getBlockHardness(this.worldObj, blockPosition.intX(), + blockPosition.intY(), + blockPosition.intZ()) != -1.0f) { + this.worldObj.setBlock(objectMouseOver.blockX, + objectMouseOver.blockY, + objectMouseOver.blockZ, Blocks.air, 0, 2); + } + final Entity responsibleEntity = (super.entityFake != null) + ? super.entityFake.riddenByEntity + : null; + this.worldObj.newExplosion(responsibleEntity, blockPosition.x, + blockPosition.y, blockPosition.z, + this.explosionSize, true, true); + } + --this.explosionDepth; + } + } + } + + @Override + public void renderShot(final Vector3 target) { + this.endTicks = 20; + } + + @Override + public void playFiringSound() { + this.worldObj.playSoundEffect((double) this.xCoord, (double) this.yCoord, + (double) this.zCoord, "icbm.railgun", 5.0f, + 1.0f); + } + + @Override + public double getVoltage() { + return 220.0; + } + + @Override + public void onDestroy(final TileEntity callingBlock) { + this.worldObj.setBlockToAir(this.xCoord, this.yCoord, this.zCoord); + this.worldObj.setBlockToAir(this.xCoord, this.yCoord + 1, this.zCoord); + } + + @Override + public void onCreate(final Vector3 position) { + this.worldObj.setBlock(position.intX(), position.intY() + 1, + position.intZ(), + MainBase.bJia, 0, 2); + ((TileEntityMulti) this.worldObj.getTileEntity( + position.intX(), position.intY() + 1, position.intZ())) + .setMainBlock(position); + } + + @Override + public Vector3 getCenter() { + return new Vector3(this).add(new Vector3(0.5, 1.5, 0.5)); + } + + @Override + public Vector3 getMuzzle() { + return this.getCenter().add(Vector3.multiply( + CalculationHelper.getDeltaPositionFromRotation( + super.currentRotationYaw, super.currentRotationPitch), + 1.6)); + } + + @Override + public void onPowerOn() { + this.redstonePowerOn = true; + } + + @Override + public void onPowerOff() { + this.redstonePowerOn = false; + } + + @Override + public double getFiringRequest() { + return 1000000.0; + } + + @Override + public void onWeaponActivated() { + super.onWeaponActivated(); + this.gunChargingTicks = 1; + this.redstonePowerOn = false; + this.isAntimatter = false; + final ItemStack ammoStack = this.getPlatform().hasAmmunition(ProjectileType.RAILGUN); + if (ammoStack != null) { + if (ammoStack.equals(ICBMSentry.antimatterBullet) && + this.getPlatform().useAmmunition(ammoStack)) { + this.isAntimatter = true; + } else { + this.getPlatform().useAmmunition(ammoStack); + } + } + this.getPlatform().wattsReceived = 0.0; + this.explosionSize = 5.0f; + this.explosionDepth = 5; + if (this.isAntimatter) { + this.explosionSize = 8.0f; + this.explosionDepth = 10; + } + this.worldObj.playSoundEffect( + (double) this.xCoord, (double) this.yCoord, + (double) this.zCoord, "icbm.railgun", 5.0f, 1.0f); + } + + @Override + public boolean canActivateWeapon() { + return this.getPlatform() != null && + this.getPlatform().hasAmmunition(ProjectileType.RAILGUN) != null && + this.getPlatform().wattsReceived >= this.getFiringRequest(); + } + + @Override + public float addInformation(final HashMap map, final EntityPlayer player) { + super.addInformation(map, player); + return 2.0f; + } + + @Override + public int getMaxHealth() { + return 450; + } +} diff --git a/src/main/java/icbm/gangshao/turret/sentries/TAATurret.java b/src/main/java/icbm/gangshao/turret/sentries/TAATurret.java new file mode 100644 index 0000000..28a5fcb --- /dev/null +++ b/src/main/java/icbm/gangshao/turret/sentries/TAATurret.java @@ -0,0 +1,89 @@ +package icbm.gangshao.turret.sentries; + +import calclavia.lib.CalculationHelper; +import icbm.gangshao.ICBMSentry; +import net.minecraft.util.AxisAlignedBB; +import universalelectricity.core.vector.Vector3; + +public class TAATurret extends TAutomaticTurret { + public TAATurret() { + super.targetAir = true; + super.canTargetAir = true; + super.baseTargetRange = 80; + super.maxTargetRange = 120; + super.rotationSpeed = 9.0f; + super.minFiringDelay = 8; + super.baseFiringDelay = 15; + super.minPitch = 40.0f; + super.maxPitch = 90.0f; + super.allowFreePitch = true; + } + + @Override + public AxisAlignedBB getTargetingBox() { + return AxisAlignedBB.getBoundingBox(this.xCoord - this.getDetectRange(), + this.yCoord - this.getDetectRange(), + this.zCoord - this.getDetectRange(), + this.xCoord + this.getDetectRange(), + this.yCoord + this.getDetectRange(), + this.zCoord + this.getDetectRange()); + } + + @Override + public double getVoltage() { + return 240.0; + } + + @Override + public double getFiringRequest() { + return 8000.0; + } + + @Override + public int getMaxHealth() { + return 180; + } + + @Override + public void playFiringSound() { + this.worldObj.playSoundEffect((double) this.xCoord, (double) this.yCoord, + (double) this.zCoord, "icbm.aagun", 5.0f, + 1.0f); + } + + @Override + public void renderShot(final Vector3 target) { + final Vector3 center = this.getCenter(); + ICBMSentry.proxy.renderBeam( + this.worldObj, + Vector3.add(center, CalculationHelper + .getDeltaPositionFromRotation( + super.currentRotationYaw - 25.0f, + super.currentRotationPitch * 1.4f) + .multiply(1.15)), + target, 1.0f, 1.0f, 1.0f, 5); + ICBMSentry.proxy.renderBeam( + this.worldObj, + Vector3.add(center, CalculationHelper + .getDeltaPositionFromRotation( + super.currentRotationYaw + 25.0f, + super.currentRotationPitch * 1.4f) + .multiply(1.15)), + target, 1.0f, 1.0f, 1.0f, 5); + } + + @Override + public Vector3 getCenter() { + return new Vector3(this).add(new Vector3(0.5, 0.75, 0.5)); + } + + @Override + public Vector3 getMuzzle() { + return new Vector3(this) + .add(new Vector3(0.5, 0.75, 0.5)) + .add(CalculationHelper + .getDeltaPositionFromRotation(super.currentRotationYaw, + super.currentRotationPitch) + .multiply(1.0)); + } +} diff --git a/src/main/java/icbm/gangshao/turret/sentries/TAutomaticTurret.java b/src/main/java/icbm/gangshao/turret/sentries/TAutomaticTurret.java new file mode 100644 index 0000000..8ddd465 --- /dev/null +++ b/src/main/java/icbm/gangshao/turret/sentries/TAutomaticTurret.java @@ -0,0 +1,296 @@ +package icbm.gangshao.turret.sentries; + +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import icbm.api.sentry.IAATarget; +import icbm.gangshao.IAmmunition; +import icbm.gangshao.IAutoSentry; +import icbm.gangshao.ICBMSentry; +import icbm.gangshao.ProjectileType; +import icbm.gangshao.damage.TileDamageSource; +import icbm.gangshao.packet.PacketTurret; +import icbm.gangshao.packet.PacketTurret.Type; +import icbm.gangshao.platform.TPlatform; +import icbm.gangshao.task.TaskManager; +import icbm.gangshao.task.TaskSearchTarget; +import icbm.gangshao.turret.TTurretBase; +import icbm.gangshao.turret.upgrades.ItPaoTaiUpgrades; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityFlying; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.IMerchant; +import net.minecraft.entity.INpc; +import net.minecraft.entity.boss.EntityDragon; +import net.minecraft.entity.boss.EntityWither; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.monster.IMob; +import net.minecraft.entity.passive.IAnimals; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import universalelectricity.core.vector.Vector3; + +public abstract class TAutomaticTurret + extends TTurretBase implements IAutoSentry { + public Entity target; + public boolean targetPlayers; + public boolean targetAir; + public boolean targetHostile; + public boolean targetFriendly; + public boolean canTargetAir; + public final TaskManager taskManager; + public int baseTargetRange; + public int maxTargetRange; + public float rotationSpeed; + public ProjectileType projectileType; + + public TAutomaticTurret() { + this.targetPlayers = false; + this.targetAir = false; + this.targetHostile = false; + this.targetFriendly = false; + this.canTargetAir = false; + this.taskManager = new TaskManager(this); + this.baseTargetRange = 20; + this.maxTargetRange = 90; + this.rotationSpeed = 3.0f; + this.projectileType = ProjectileType.CONVENTIONAL; + } + + @Override + public void onTurretPacket(Type type, NBTTagCompound data) { + super.onTurretPacket(type, data); + if (type == PacketTurret.Type.SHOT) { + Vector3 target = Vector3.readFromNBT(data.getCompoundTag("target")); + + this.renderShot(target); + + super.currentRotationYaw = data.getFloat("yaw"); + super.currentRotationPitch = data.getFloat("pitch"); + + this.playFiringSound(); + } + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!this.worldObj.isRemote && this.isRunning()) { + this.taskManager.onUpdate(); + if (!this.taskManager.hasTasks()) { + this.taskManager.addTask(new TaskSearchTarget()); + } + } + } + + @Override + public float getRotationSpeed() { + return this.rotationSpeed; + } + + @Override + public AxisAlignedBB getTargetingBox() { + return AxisAlignedBB.getBoundingBox( + this.xCoord - this.getDetectRange(), (double) (this.yCoord - 5), + this.zCoord - this.getDetectRange(), + this.xCoord + this.getDetectRange(), (double) (this.yCoord + 5), + this.zCoord + this.getDetectRange()); + } + + @Override + public Entity getTarget() { + return this.target; + } + + @Override + public void setTarget(final Entity target) { + this.target = target; + } + + @Override + public boolean isValidTarget(final Entity entity) { + if (entity != null && !entity.isDead && !entity.isEntityInvulnerable() && + this.getCenter().distanceTo(new Vector3(entity)) <= this.getDetectRange()) { + final float[] rotations = super.lookHelper.getDeltaRotations(new Vector3(entity).add( + new Vector3(0.0, entity.getEyeHeight(), 0.0))); + if (((rotations[1] <= super.maxPitch && rotations[1] >= super.minPitch) || + super.allowFreePitch) && + super.lookHelper.canEntityBeSeen(entity)) { + if (this.targetAir && this.canTargetAir && this.isAir(entity)) { + return true; + } + if (this.targetPlayers && + (entity instanceof EntityPlayer || entity.riddenByEntity instanceof EntityPlayer)) { + EntityPlayer player; + if (entity.riddenByEntity instanceof EntityPlayer) { + player = (EntityPlayer) entity.riddenByEntity; + } else { + player = (EntityPlayer) entity; + } + if (!player.capabilities.isCreativeMode && + this.getPlatform() != null && + !this.getPlatform().canUserAccess(player.getDisplayName())) { + return true; + } + } + if (this.targetHostile && entity instanceof IMob && + !this.isAir(entity)) { + return true; + } + if (this.targetFriendly && + (entity instanceof IAnimals || entity instanceof INpc || + entity instanceof IMerchant) + && + !this.isAir(entity)) { + return true; + } + } + } + return false; + } + + protected boolean isAir(final Entity entity) { + return (entity instanceof IMob && entity instanceof EntityFlying) || + (entity instanceof IAATarget && + ((IAATarget) entity).canBeTargeted(this)) + || + entity instanceof EntityWither || entity instanceof EntityDragon; + } + + @Override + public boolean canActivateWeapon() { + return this.isValidTarget(this.target) && this.getPlatform() != null && + super.lookHelper.isLookingAt(this.target, 5.0f) && + super.tickSinceFired == 0 && + this.getPlatform().wattsReceived >= this.getFiringRequest() && + (this.getPlatform().hasAmmunition(this.projectileType) != null || + this.projectileType == ProjectileType.UNKNOWN); + } + + public void sendShotToClient(final Vector3 position) { + ICBMSentry.channel.sendToAllAround( + PacketTurret.shot(new Vector3(this), position, super.currentRotationYaw, + super.currentRotationPitch), + new TargetPoint(this.worldObj.provider.dimensionId, this.xCoord, + this.yCoord, this.zCoord, 40.0)); + } + + @Override + public void onWeaponActivated() { + super.onWeaponActivated(); + if (!this.worldObj.isRemote && this.onFire()) { + this.sendShotToClient(this.getTargetPosition()); + this.playFiringSound(); + this.getPlatform().wattsReceived = Math.max( + this.getPlatform().wattsReceived - this.getFiringRequest(), 0.0); + } + } + + @Override + public void renderShot(final Vector3 target) { + this.drawParticleStreamTo(target); + } + + protected boolean onFire() { + if (!this.worldObj.isRemote) { + final ItemStack ammoStack = this.getPlatform().hasAmmunition(this.projectileType); + if (this.getPlatform() != null && ammoStack != null) { + boolean fired = false; + final IAmmunition bullet = (IAmmunition) ammoStack.getItem(); + if (this.target instanceof EntityLiving) { + final TPlatform platform = this.getPlatform(); + platform.wattsReceived -= this.getFiringRequest(); + if (bullet.getType(ammoStack) == ProjectileType.CONVENTIONAL) { + this.target.attackEntityFrom( + (DamageSource) TileDamageSource.doBulletDamage(this), + bullet.getDamage()); + } + fired = true; + } else if (this.target instanceof IAATarget) { + if (this.worldObj.rand.nextFloat() > 0.2) { + final int damage = ((IAATarget) this.target).doDamage(8); + if (damage == -1 && this.worldObj.rand.nextFloat() > 0.7) { + ((IAATarget) this.target).destroyCraft(); + } else if (damage <= 0) { + ((IAATarget) this.target).destroyCraft(); + } + } + fired = true; + } + if (fired && this.projectileType != ProjectileType.UNKNOWN && + this.getPlatform().useAmmunition(ammoStack)) { + boolean drop = true; + if (this.getPlatform().getUpgradeCount( + ItPaoTaiUpgrades.TurretUpgradeType.COLLECTOR) > 0 && + this.getPlatform().addStackToInventory( + ICBMSentry.bulletShell.copy())) { + drop = false; + } + if (drop && this.worldObj.rand.nextFloat() < 0.9) { + final Vector3 spawnPos = this.getMuzzle(); + final EntityItem entityShell = new EntityItem(this.worldObj, spawnPos.x, spawnPos.y, + spawnPos.z, ICBMSentry.bulletShell.copy()); + entityShell.delayBeforeCanPickup = 20; + this.worldObj.spawnEntityInWorld((Entity) entityShell); + } + } + return fired; + } + } + return false; + } + + @Override + public void writeToNBT(final NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setBoolean("targetPlayers", this.targetPlayers); + nbt.setBoolean("targetAir", this.targetAir); + nbt.setBoolean("targetHostile", this.targetHostile); + nbt.setBoolean("targetFriendly", this.targetFriendly); + } + + @Override + public void readFromNBT(final NBTTagCompound nbt) { + super.readFromNBT(nbt); + if (nbt.hasKey("targetPlayers")) { + this.targetPlayers = nbt.getBoolean("targetPlayers"); + } + if (nbt.hasKey("targetAir")) { + this.targetAir = nbt.getBoolean("targetAir"); + } + if (nbt.hasKey("targetHostile")) { + this.targetHostile = nbt.getBoolean("targetHostile"); + } + if (nbt.hasKey("targetFriendly")) { + this.targetFriendly = nbt.getBoolean("targetFriendly"); + } + } + + @Override + public double getDetectRange() { + if (this.getPlatform() != null) { + return Math.min(this.baseTargetRange + + (this.maxTargetRange - this.baseTargetRange) * + (this.getPlatform().getUpgradeCount( + ItPaoTaiUpgrades.TurretUpgradeType.RANGE) / + 64.0f), + (float) this.maxTargetRange); + } + return this.baseTargetRange; + } + + @Override + public boolean canApplyPotion(final PotionEffect par1PotionEffect) { + return false; + } + + public Vector3 getTargetPosition() { + if (this.getTarget() != null) { + return new Vector3(this.getTarget()) + .add(new Vector3(0.0, this.getTarget().getEyeHeight(), 0.0)); + } + return null; + } +} diff --git a/src/main/java/icbm/gangshao/turret/sentries/TLaserTurret.java b/src/main/java/icbm/gangshao/turret/sentries/TLaserTurret.java new file mode 100644 index 0000000..cb81d9b --- /dev/null +++ b/src/main/java/icbm/gangshao/turret/sentries/TLaserTurret.java @@ -0,0 +1,108 @@ +package icbm.gangshao.turret.sentries; + +import calclavia.lib.CalculationHelper; +import icbm.api.sentry.IAATarget; +import icbm.gangshao.ProjectileType; +import icbm.gangshao.ICBMSentry; +import icbm.gangshao.damage.TileDamageSource; +import icbm.gangshao.platform.TPlatform; +import net.minecraft.entity.EntityLiving; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import universalelectricity.core.vector.Vector3; + +public class TLaserTurret extends TAutomaticTurret { + public float barrelRotation; + public float barrelRotationVelocity; + + public TLaserTurret() { + super.targetPlayers = true; + super.targetHostile = true; + super.baseTargetRange = 20; + super.maxTargetRange = 35; + super.rotationSpeed = 3.0f; + super.baseFiringDelay = 12; + super.minFiringDelay = 5; + super.projectileType = ProjectileType.UNKNOWN; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (this.worldObj.isRemote) { + this.barrelRotation = MathHelper.wrapAngleTo180_float( + this.barrelRotation + this.barrelRotationVelocity); + this.barrelRotationVelocity = Math.max(this.barrelRotationVelocity - 0.1f, 0.0f); + } + } + + @Override + public double getFiringRequest() { + return 20000.0; + } + + @Override + public double getVoltage() { + return 480.0; + } + + @Override + public int getMaxHealth() { + return 130; + } + + @Override + public void playFiringSound() { + this.worldObj.playSoundEffect((double) this.xCoord, (double) this.yCoord, + (double) this.zCoord, "icbm.lasershot", 5.0f, + 1.0f - this.worldObj.rand.nextFloat() * 0.2f); + } + + @Override + public void renderShot(final Vector3 target) { + final Vector3 center = this.getCenter(); + ICBMSentry.proxy.renderBeam( + this.worldObj, + Vector3.add(center, CalculationHelper + .getDeltaPositionFromRotation( + super.currentRotationYaw - 6.0f, + super.currentRotationPitch * 1.4f) + .multiply(1.2)), + target, 1.0f, 0.4f, 0.4f, 5); + ICBMSentry.proxy.renderBeam( + this.worldObj, + Vector3.add(center, CalculationHelper + .getDeltaPositionFromRotation( + super.currentRotationYaw + 6.0f, + super.currentRotationPitch * 1.4f) + .multiply(1.2)), + target, 1.0f, 0.4f, 0.4f, 5); + ++this.barrelRotationVelocity; + } + + @Override + protected boolean onFire() { + if (!this.worldObj.isRemote && this.getPlatform() != null) { + if (super.target instanceof EntityLiving) { + final TPlatform platform = this.getPlatform(); + platform.wattsReceived -= this.getFiringRequest(); + super.target.attackEntityFrom( + (DamageSource) TileDamageSource.doLaserDamage(this), 2); + super.target.setFire(3); + return true; + } + if (super.target instanceof IAATarget) { + if (this.worldObj.rand.nextFloat() > 0.2) { + final int damage = ((IAATarget) super.target).doDamage(10); + if (damage == -1 && this.worldObj.rand.nextFloat() > 0.7) { + ((IAATarget) super.target).destroyCraft(); + } else if (damage <= 0) { + ((IAATarget) super.target).destroyCraft(); + } + } + return true; + } + } + return false; + } +} diff --git a/src/main/java/icbm/gangshao/turret/sentries/TMachineGunTurret.java b/src/main/java/icbm/gangshao/turret/sentries/TMachineGunTurret.java new file mode 100644 index 0000000..97ba930 --- /dev/null +++ b/src/main/java/icbm/gangshao/turret/sentries/TMachineGunTurret.java @@ -0,0 +1,51 @@ +package icbm.gangshao.turret.sentries; + +import calclavia.lib.CalculationHelper; +import universalelectricity.core.vector.Vector3; + +public class TMachineGunTurret extends TAutomaticTurret { + public TMachineGunTurret() { + super.targetPlayers = true; + super.targetHostile = true; + super.baseTargetRange = 13; + super.maxTargetRange = 25; + super.rotationSpeed = 2.0f; + super.baseFiringDelay = 18; + super.minFiringDelay = 10; + } + + @Override + public double getVoltage() { + return 240.0; + } + + @Override + public int getMaxHealth() { + return 200; + } + + @Override + public double getFiringRequest() { + return 1000.0; + } + + @Override + public void playFiringSound() { + this.worldObj.playSoundEffect((double) this.xCoord, (double) this.yCoord, + (double) this.zCoord, "icbm.machinegun", 5.0f, + 1.0f); + } + + @Override + public Vector3 getMuzzle() { + return this.getCenter().add(Vector3.multiply( + CalculationHelper.getDeltaPositionFromRotation( + super.currentRotationYaw, super.currentRotationPitch), + 1.0)); + } + + @Override + public Vector3 getCenter() { + return new Vector3(this).add(new Vector3(0.5, 0.65, 0.5)); + } +} diff --git a/src/main/java/icbm/gangshao/turret/upgrades/ItPaoTaiUpgrades.java b/src/main/java/icbm/gangshao/turret/upgrades/ItPaoTaiUpgrades.java new file mode 100644 index 0000000..8e6d1bb --- /dev/null +++ b/src/main/java/icbm/gangshao/turret/upgrades/ItPaoTaiUpgrades.java @@ -0,0 +1,76 @@ +package icbm.gangshao.turret.upgrades; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.ItICBM; +import icbm.gangshao.ITurretUpgrade; +import java.util.List; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +public class ItPaoTaiUpgrades extends ItICBM implements ITurretUpgrade { + public static final IIcon[] ICONS; + + public ItPaoTaiUpgrades() { + super("turretUpgrades"); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + @Override + public int getMetadata(final int damage) { + return damage; + } + + @Override + public String getUnlocalizedName(final ItemStack itemStack) { + return "item.icbm:" + + TurretUpgradeType.values()[itemStack.getItemDamage()].iconName; + } + + @Override + public IIcon getIconFromDamage(final int i) { + return ItPaoTaiUpgrades.ICONS[i]; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(final IIconRegister iconRegister) { + for (int i = 0; i < TurretUpgradeType.values().length; ++i) { + ItPaoTaiUpgrades.ICONS[i] = iconRegister.registerIcon( + "icbm:" + TurretUpgradeType.values()[i].iconName); + } + } + + @Override + public void getSubItems(final Item par1, final CreativeTabs par2CreativeTabs, + final List par3List) { + for (int i = 0; i < TurretUpgradeType.values().length; ++i) { + par3List.add(new ItemStack((Item) this, 1, i)); + } + } + + @Override + public TurretUpgradeType getType(final ItemStack itemstack) { + return TurretUpgradeType.values()[itemstack.getItemDamage()]; + } + + static { + ICONS = new IIcon[TurretUpgradeType.values().length]; + } + + public enum TurretUpgradeType { + RANGE("RANGE", 0, "targetCard"), + COLLECTOR("COLLECTOR", 1, "shellCollector"); + + String iconName; + + private TurretUpgradeType(final String name2, final int ordinal, + final String name) { + this.iconName = name; + } + } +} diff --git a/src/main/java/icbm/wanyi/ClientProxy.java b/src/main/java/icbm/wanyi/ClientProxy.java new file mode 100644 index 0000000..8257992 --- /dev/null +++ b/src/main/java/icbm/wanyi/ClientProxy.java @@ -0,0 +1,37 @@ +package icbm.wanyi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.wanyi.b.TProximityDetector; +import icbm.wanyi.gui.GSignalDisrupter; +import icbm.wanyi.gui.GProximityDetector; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +@SideOnly(Side.CLIENT) +public class ClientProxy extends CommonProxy { + @Override + public void preInit() { + super.preInit(); + } + + @Override + public Object getClientGuiElement(final int ID, + final EntityPlayer entityPlayer, + final World world, final int x, final int y, + final int z) { + final TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity != null || ID == 5) { + switch (ID) { + case 4: { + return new GProximityDetector((TProximityDetector)tileEntity); + } + case 5: { + return new GSignalDisrupter(entityPlayer.inventory.getCurrentItem()); + } + } + } + return null; + } +} diff --git a/src/main/java/icbm/wanyi/CommonProxy.java b/src/main/java/icbm/wanyi/CommonProxy.java new file mode 100644 index 0000000..0884b20 --- /dev/null +++ b/src/main/java/icbm/wanyi/CommonProxy.java @@ -0,0 +1,31 @@ +// +// Decompiled by Procyon v0.6.0 +// + +package icbm.wanyi; + +import net.minecraft.world.World; +import net.minecraft.entity.player.EntityPlayer; +import icbm.wanyi.b.TProximityDetector; +import cpw.mods.fml.common.registry.GameRegistry; +import icbm.wanyi.b.TCamouflage; +import cpw.mods.fml.common.network.IGuiHandler; + +public class CommonProxy implements IGuiHandler +{ + public void preInit() { + } + + public void init() { + GameRegistry.registerTileEntity((Class)TCamouflage.class, "ICBMYinXin"); + GameRegistry.registerTileEntity((Class)TProximityDetector.class, "ICBMYinGanQi"); + } + + public Object getClientGuiElement(final int ID, final EntityPlayer player, final World world, final int x, final int y, final int z) { + return null; + } + + public Object getServerGuiElement(final int ID, final EntityPlayer player, final World world, final int x, final int y, final int z) { + return null; + } +} diff --git a/src/main/java/icbm/wanyi/IBSpikes.java b/src/main/java/icbm/wanyi/IBSpikes.java new file mode 100644 index 0000000..614a968 --- /dev/null +++ b/src/main/java/icbm/wanyi/IBSpikes.java @@ -0,0 +1,25 @@ +package icbm.wanyi; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class IBSpikes extends ItemBlock { + public IBSpikes(Block block) { + super(block); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + public int getMetadata(final int damage) { + return damage; + } + + public String getUnlocalizedName(final ItemStack itemstack) { + return this.getUnlocalizedName() + "." + itemstack.getItemDamage(); + } + + public String getUnlocalizedName() { + return "tile.icbm:spikes"; + } +} diff --git a/src/main/java/icbm/wanyi/ICBMContraption.java b/src/main/java/icbm/wanyi/ICBMContraption.java new file mode 100644 index 0000000..5036fba --- /dev/null +++ b/src/main/java/icbm/wanyi/ICBMContraption.java @@ -0,0 +1,195 @@ +package icbm.wanyi; + +import calclavia.lib.UniversalRecipes; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.ModMetadata; +import cpw.mods.fml.common.SidedProxy; +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.IGuiHandler; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import icbm.core.ICBMTab; +import icbm.core.MainBase; +import icbm.wanyi.b.BCamouflage; +import icbm.wanyi.b.BConcrete; +import icbm.wanyi.b.BGlassButton; +import icbm.wanyi.b.BGlassPressurePlate; +import icbm.wanyi.b.BGlassReinforced; +import icbm.wanyi.b.BProximityDetector; +import icbm.wanyi.b.BSpikes; +import icbm.wanyi.b.IBConcrete; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraftforge.oredict.OreDictionary; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.item.ElectricItemHelper; +import universalelectricity.core.item.ItemElectric; + +@Mod(modid = "ICBM|Contraption", name = "ICBM|Contraption", version = "1.2.1", + dependencies = "required-after:AtomicScience", useMetadata = true) +public class ICBMContraption extends MainBase { + public static final String NAME = "ICBM|Contraption"; + public static final String CHANNEL = "ICBM|C"; + @Mod.Instance("ICBM|Contraption") public static ICBMContraption instance; + @Mod.Metadata("ICBM|Contraption") public static ModMetadata metadata; + @SidedProxy(clientSide = "icbm.wanyi.ClientProxy", + serverSide = "icbm.wanyi.CommonProxy") + public static CommonProxy proxy; + public static Block bGlassPressurePlate; + public static Block bGlassButton; + public static Block bProximityDetector; + public static Block bSpikes; + public static Block bCamouflage; + public static Block bConcrete; + public static Block bGlassReinforced; + public static Item itAntidote; + public static ItemElectric itSignalDisrupter; + public static ItemElectric itTracker; + + public static SimpleNetworkWrapper channel; + + @Mod.EventHandler + @Override + public void preInit(final FMLPreInitializationEvent event) { + super.preInit(event); + NetworkRegistry.INSTANCE.registerGuiHandler( + (Object)this, (IGuiHandler)ICBMContraption.proxy); + MainBase.CONFIGURATION.load(); + ICBMContraption.bGlassPressurePlate = (Block) new BGlassPressurePlate(); + ICBMContraption.bGlassButton = (Block) new BGlassButton(); + ICBMContraption.bProximityDetector = (Block) new BProximityDetector(); + ICBMContraption.bSpikes = (Block) new BSpikes(); + ICBMContraption.bCamouflage = (Block) new BCamouflage(); + ICBMContraption.bConcrete = (Block) new BConcrete(); + ICBMContraption.bGlassReinforced = (Block) new BGlassReinforced(); + ICBMContraption.itAntidote = new ItAntidote(); + ICBMContraption.itSignalDisrupter = new ItSignalDisrupter(); + ICBMContraption.itTracker = new ItTracker(); + MainBase.CONFIGURATION.save(); + + GameRegistry.registerBlock(ICBMContraption.bGlassPressurePlate, + "bGlassPressurePlate"); + GameRegistry.registerBlock(ICBMContraption.bGlassButton, "bGlassButton"); + GameRegistry.registerBlock(ICBMContraption.bProximityDetector, + "bProximityDetector"); + GameRegistry.registerBlock(ICBMContraption.bCamouflage, "bCamouflage"); + GameRegistry.registerBlock(ICBMContraption.bGlassReinforced, + "bGlassReinforced"); + GameRegistry.registerBlock(ICBMContraption.bSpikes, IBSpikes.class, + "bSpikes"); + GameRegistry.registerBlock(ICBMContraption.bConcrete, IBConcrete.class, + "bConcrete"); + + GameRegistry.registerItem(ICBMContraption.itAntidote, "itAntidote"); + GameRegistry.registerItem(ICBMContraption.itSignalDisrupter, + "itSignalDisrupter"); + GameRegistry.registerItem(ICBMContraption.itTracker, "itTracker"); + + ICBMTab.itemStack = new ItemStack(ICBMContraption.bProximityDetector); + ICBMContraption.proxy.preInit(); + + channel = NetworkRegistry.INSTANCE.newSimpleChannel("icbm_contraption"); + int pktId = 0; + channel.registerMessage(SetSignalDisrupterFrequencyPacketHandler.class, + SetSignalDisrupterFrequencyPacket.class, pktId++, + Side.SERVER); + channel.registerMessage(ProximityDetectorModePacketHandler.class, + ProximityDetectorModePacket.class, pktId++, + Side.SERVER); + } + + @Mod.EventHandler + public void load(final FMLInitializationEvent evt) { + MainBase.setModMetadata("ICBM|Contraption", ICBMContraption.metadata); + } + + @Mod.EventHandler + @Override + public void postInit(final FMLPostInitializationEvent event) { + super.postInit(event); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMContraption.bSpikes, 6), + new Object[] {"CCC", "BBB", 'C', Blocks.cactus, 'B', "ingotBronze"})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMContraption.bSpikes, 6), + new Object[] {"CCC", "BBB", 'C', Blocks.cactus, 'B', + Items.iron_ingot})); + GameRegistry.addRecipe(new ItemStack(ICBMContraption.bSpikes, 1, 1), + new Object[] {"E", "S", 'E', MainBase.itDu, 'S', + ICBMContraption.bSpikes}); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMContraption.bSpikes, 1, 2), + new Object[] {"E", "S", 'E', "dustSulfur", 'S', + ICBMContraption.bSpikes})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMContraption.bCamouflage, 12), + new Object[] {"WGW", "GCG", "WGW", 'C', "calclavia:CIRCUIT_T1", 'G', + Blocks.glass, 'W', + new ItemStack(Blocks.wool, 1, 32767)})); + if (OreDictionary.getOres(UniversalRecipes.BATTERY).size() > 0) { + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack((Item)ICBMContraption.itTracker), + new Object[] { + " Z ", "SBS", "SCS", 'Z', Items.compass, 'C', + "calclavia:CIRCUIT_T1", 'B', + ElectricItemHelper.getUncharged( + OreDictionary.getOres(UniversalRecipes.BATTERY).get(0)), + 'S', "ingotSteel"})); + } + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMContraption.bGlassPressurePlate, 1, 0), + new Object[] {"##", '#', Blocks.glass})); + GameRegistry.addRecipe(new ItemStack(ICBMContraption.bGlassButton, 2), + new Object[] {"G", "G", 'G', Blocks.glass}); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + ICBMContraption.bProximityDetector, + new Object[] { + "SSS", "S?S", "SSS", 'S', "ingotSteel", '?', + ElectricItemHelper.getUncharged(ICBMContraption.itTracker)})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + (Item)ICBMContraption.itSignalDisrupter, + new Object[] {"WWW", "SCS", "SSS", 'S', "ingotSteel", 'C', + "calclavia:CIRCUIT_T1", 'W', "calclavia:WIRE"})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMContraption.itAntidote, 6), + new Object[] {"@@@", "@@@", "@@@", '@', Items.pumpkin_seeds})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMContraption.itAntidote, 6), + new Object[] {"@@@", "@@@", "@@@", '@', Items.melon_seeds})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMContraption.itAntidote), + new Object[] {"@@@", "@@@", "@@@", '@', Items.wheat_seeds})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMContraption.bConcrete, 8, 0), + new Object[] {"SGS", "GWG", "SGS", 'G', Blocks.gravel, 'S', Blocks.sand, + 'W', Items.water_bucket})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMContraption.bConcrete, 8, 1), + new Object[] {"COC", "OCO", "COC", 'C', + new ItemStack(ICBMContraption.bConcrete, 1, 0), 'O', + Blocks.obsidian})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMContraption.bConcrete, 8, 2), + new Object[] {"COC", "OCO", "COC", 'C', + new ItemStack(ICBMContraption.bConcrete, 1, 1), 'O', + "ingotSteel"})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMContraption.bGlassReinforced, 8), + new Object[] {"IGI", "GIG", "IGI", 'G', Blocks.glass, 'I', + Items.iron_ingot})); + ICBMContraption.proxy.init(); + } + + @Override + protected String getChannel() { + return "ICBM|C"; + } +} diff --git a/src/main/java/icbm/wanyi/ItAntidote.java b/src/main/java/icbm/wanyi/ItAntidote.java new file mode 100644 index 0000000..1332bd9 --- /dev/null +++ b/src/main/java/icbm/wanyi/ItAntidote.java @@ -0,0 +1,37 @@ +package icbm.wanyi; + +import icbm.core.di.ItICBM; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ItAntidote extends ItICBM { + public ItAntidote() { + super("antidote"); + this.setTextureName("icbm:antidote"); + } + + public ItemStack onEaten(final ItemStack par1ItemStack, final World par2World, + final EntityPlayer par3EntityPlayer) { + --par1ItemStack.stackSize; + if (!par2World.isRemote) { + par3EntityPlayer.clearActivePotions(); + } + return par1ItemStack; + } + + public int getMaxItemUseDuration(final ItemStack par1ItemStack) { return 32; } + + public EnumAction getItemUseAction(final ItemStack par1ItemStack) { + return EnumAction.eat; + } + + public ItemStack onItemRightClick(final ItemStack par1ItemStack, + final World par2World, + final EntityPlayer par3EntityPlayer) { + par3EntityPlayer.setItemInUse(par1ItemStack, + this.getMaxItemUseDuration(par1ItemStack)); + return par1ItemStack; + } +} diff --git a/src/main/java/icbm/wanyi/ItSignalDisrupter.java b/src/main/java/icbm/wanyi/ItSignalDisrupter.java new file mode 100644 index 0000000..03eb5b0 --- /dev/null +++ b/src/main/java/icbm/wanyi/ItSignalDisrupter.java @@ -0,0 +1,63 @@ +package icbm.wanyi; + +import universalelectricity.core.electricity.ElectricityPack; +import net.minecraft.entity.Entity; +import net.minecraft.world.World; +import net.minecraft.nbt.NBTTagCompound; +import java.util.List; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import icbm.api.IItemFrequency; +import icbm.core.di.ItElectricICBM; + +public class ItSignalDisrupter extends ItElectricICBM implements IItemFrequency +{ + public ItSignalDisrupter() { + super("signalDisrupter"); + this.setTextureName("icbm:signalDisrupter"); + } + + @Override + public void addInformation(final ItemStack itemStack, final EntityPlayer par2EntityPlayer, final List par3List, final boolean par4) { + super.addInformation(itemStack, par2EntityPlayer, par3List, par4); + par3List.add("Frequency: " + this.getFrequency(itemStack)); + } + + @Override + public int getFrequency(final ItemStack itemStack) { + if (itemStack.stackTagCompound == null) { + return 0; + } + return itemStack.stackTagCompound.getInteger("frequency"); + } + + @Override + public void setFrequency(final int frequency, final ItemStack itemStack) { + if (itemStack.stackTagCompound == null) { + itemStack.setTagCompound(new NBTTagCompound()); + } + itemStack.stackTagCompound.setInteger("frequency", frequency); + } + + public void onUpdate(final ItemStack itemStack, final World par2World, final Entity par3Entity, final int par4, final boolean par5) { + if (!par2World.isRemote) { + super.onUpdate(itemStack, par2World, par3Entity, par4, par5); + if (this.getJoules(itemStack) > 1.0) { + this.onProvide(ElectricityPack.getFromWatts(1.0, this.getJoules(itemStack)), itemStack); + } + } + } + + public ItemStack onItemRightClick(final ItemStack par1ItemStack, final World par2World, final EntityPlayer par3EntityPlayer) { + par3EntityPlayer.openGui((Object)ICBMContraption.instance, 5, par2World, (int)((Entity)par3EntityPlayer).posX, (int)((Entity)par3EntityPlayer).posY, (int)((Entity)par3EntityPlayer).posZ); + return par1ItemStack; + } + + public double getVoltage(final ItemStack itemStack) { + return 25.0; + } + + public double getMaxJoules(final ItemStack itemStack) { + return 80000.0; + } +} diff --git a/src/main/java/icbm/wanyi/ItTracker.java b/src/main/java/icbm/wanyi/ItTracker.java new file mode 100644 index 0000000..4f7d5c9 --- /dev/null +++ b/src/main/java/icbm/wanyi/ItTracker.java @@ -0,0 +1,122 @@ +package icbm.wanyi; + +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.api.ITracker; +import icbm.core.di.ItElectricICBM; +import java.util.List; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChatComponentText; +import net.minecraft.world.World; +import universalelectricity.core.electricity.ElectricityPack; + +public class ItTracker extends ItElectricICBM implements ITracker { + public ItTracker() { + super("tracker"); + this.setTextureName("icbm:tracker"); + } + + @SideOnly(Side.CLIENT) + public void registerIcons(final IIconRegister par1IconRegister) { + if (par1IconRegister instanceof TextureMap) { + ((TextureMap) par1IconRegister) + .setTextureEntry(this.getUnlocalizedName().replace("item.", ""), + new TextureTracker()); + this.itemIcon = ((TextureMap) par1IconRegister) + .getTextureExtry(this.getUnlocalizedName().replace("item.", "")); + } + } + + @SideOnly(Side.CLIENT) + @Override + public void addInformation(final ItemStack itemStack, + final EntityPlayer par2EntityPlayer, + final List par3List, final boolean par4) { + super.addInformation(itemStack, par2EntityPlayer, par3List, par4); + final Entity trackingEntity = this.getTrackingEntity( + (World) FMLClientHandler.instance().getClient().theWorld, itemStack); + if (trackingEntity != null) { + par3List.add("Tracking: " + trackingEntity.getCommandSenderName()); + } + } + + @Override + public void setTrackingEntity(final ItemStack itemStack, + final Entity entity) { + if (itemStack.stackTagCompound == null) { + itemStack.setTagCompound(new NBTTagCompound()); + } + if (entity != null) { + itemStack.stackTagCompound.setInteger("trackingEntity", + entity.getEntityId()); + } + } + + @Override + public Entity getTrackingEntity(final World worldObj, + final ItemStack itemStack) { + if (worldObj != null && itemStack.stackTagCompound != null) { + final int trackingID = itemStack.stackTagCompound.getInteger("trackingEntity"); + return worldObj.getEntityByID(trackingID); + } + return null; + } + + @Override + public void onCreated(final ItemStack par1ItemStack, final World par2World, + final EntityPlayer par3EntityPlayer) { + super.onCreated(par1ItemStack, par2World, par3EntityPlayer); + this.setTrackingEntity(par1ItemStack, (Entity) par3EntityPlayer); + } + + public void onUpdate(final ItemStack itemStack, final World par2World, + final Entity par3Entity, final int par4, + final boolean par5) { + super.onUpdate(itemStack, par2World, par3Entity, par4, par5); + if (par3Entity instanceof EntityPlayer) { + final EntityPlayer player = (EntityPlayer) par3Entity; + if (player.inventory.getCurrentItem() != null && + player.inventory.getCurrentItem().getItem() == this) { + final Entity trackingEntity = this.getTrackingEntity(par2World, itemStack); + if (trackingEntity != null) { + this.onProvide(ElectricityPack.getFromWatts( + 0.10000000149011612, this.getVoltage(itemStack)), + itemStack); + if (this.getJoules(itemStack) < 0.10000000149011612) { + this.setTrackingEntity(itemStack, null); + } + } + } + } + } + + public boolean onLeftClickEntity(final ItemStack itemStack, + final EntityPlayer player, + final Entity entity) { + if (!((Entity) player).worldObj.isRemote) { + if (this.getJoules(itemStack) > 0.10000000149011612) { + this.setTrackingEntity(itemStack, entity); + player.addChatMessage(new ChatComponentText( + "Now tracking: " + entity.getCommandSenderName())); + return true; + } + player.addChatMessage( + new ChatComponentText("Tracker out of electricity!")); + } + return false; + } + + public double getVoltage(final ItemStack itemStack) { + return 20.0; + } + + public double getMaxJoules(final ItemStack itemStack) { + return 100000.0; + } +} diff --git a/src/main/java/icbm/wanyi/ItemTracker.java b/src/main/java/icbm/wanyi/ItemTracker.java new file mode 100644 index 0000000..08fa34c --- /dev/null +++ b/src/main/java/icbm/wanyi/ItemTracker.java @@ -0,0 +1,6 @@ +package icbm.wanyi; + +public class ItemTracker { + +} + diff --git a/src/main/java/icbm/wanyi/ProximityDetectorModePacket.java b/src/main/java/icbm/wanyi/ProximityDetectorModePacket.java new file mode 100644 index 0000000..94be380 --- /dev/null +++ b/src/main/java/icbm/wanyi/ProximityDetectorModePacket.java @@ -0,0 +1,110 @@ +package icbm.wanyi; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import io.netty.buffer.ByteBuf; +import java.util.Optional; +import universalelectricity.core.vector.Vector3; + +public class ProximityDetectorModePacket implements IMessage { + Vector3 pos; + + public Optional mode; + public Optional frequency; + public Optional minCoord; + public Optional maxCoord; + + public ProximityDetectorModePacket() { this(null); } + + public ProximityDetectorModePacket(Vector3 pos) { + this.pos = pos; + + this.mode = Optional.empty(); + this.frequency = Optional.empty(); + this.minCoord = Optional.empty(); + this.maxCoord = Optional.empty(); + } + + @Override + public void fromBytes(ByteBuf buf) { + this.pos = new Vector3(buf.readInt(), buf.readInt(), buf.readInt()); + + int ordinal = buf.readInt(); + if (ordinal < 0 || ordinal >= Type.values().length) + return; + + switch (Type.values()[ordinal]) { + case MODE: + this.mode = Optional.of(buf.readByte()); + break; + + case FREQUENCY: + this.frequency = Optional.of(buf.readShort()); + break; + + case MIN_COORD: + this.minCoord = Optional.of(new Vector3(clampCoord(buf.readInt()), + clampCoord(buf.readInt()), + clampCoord(buf.readInt()))); + break; + + case MAX_COORD: + this.maxCoord = Optional.of(new Vector3(clampCoord(buf.readInt()), + clampCoord(buf.readInt()), + clampCoord(buf.readInt()))); + break; + } + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(this.pos.intX()); + buf.writeInt(this.pos.intY()); + buf.writeInt(this.pos.intZ()); + + Type type = this.mode.isPresent() ? Type.MODE + : this.frequency.isPresent() ? Type.FREQUENCY + : this.minCoord.isPresent() ? Type.MIN_COORD + : this.maxCoord.isPresent() ? Type.MAX_COORD + : null; + + if (type == null) + throw new IllegalArgumentException("No field set!"); + + buf.writeInt(type.ordinal()); + + switch (type) { + case MODE: + buf.writeByte(this.mode.get()); + break; + + case FREQUENCY: + buf.writeShort(this.frequency.get()); + break; + + case MIN_COORD: { + Vector3 v = this.minCoord.get(); + buf.writeInt(v.intX()); + buf.writeInt(v.intY()); + buf.writeInt(v.intZ()); + break; + } + + case MAX_COORD: { + Vector3 v = this.maxCoord.get(); + buf.writeInt(v.intX()); + buf.writeInt(v.intY()); + buf.writeInt(v.intZ()); + break; + } + } + } + + static int clampCoord(int coord) { return Math.min(30, Math.max(0, coord)); } + + public static enum Type { + MODE, + FREQUENCY, + MIN_COORD, + MAX_COORD, + } +} diff --git a/src/main/java/icbm/wanyi/ProximityDetectorModePacketHandler.java b/src/main/java/icbm/wanyi/ProximityDetectorModePacketHandler.java new file mode 100644 index 0000000..4614301 --- /dev/null +++ b/src/main/java/icbm/wanyi/ProximityDetectorModePacketHandler.java @@ -0,0 +1,26 @@ +package icbm.wanyi; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import icbm.wanyi.b.TProximityDetector; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class ProximityDetectorModePacketHandler + implements IMessageHandler { + + @Override + public IMessage onMessage(ProximityDetectorModePacket message, + MessageContext ctx) { + World world = ctx.getServerHandler().playerEntity.worldObj; + + TileEntity te = message.pos.getTileEntity(world); + + if (te instanceof TProximityDetector) { + ((TProximityDetector)te).onModePacket(message); + } + + return null; + } +} diff --git a/src/main/java/icbm/wanyi/SetSignalDisrupterFrequencyPacket.java b/src/main/java/icbm/wanyi/SetSignalDisrupterFrequencyPacket.java new file mode 100644 index 0000000..ea22130 --- /dev/null +++ b/src/main/java/icbm/wanyi/SetSignalDisrupterFrequencyPacket.java @@ -0,0 +1,22 @@ +package icbm.wanyi; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import io.netty.buffer.ByteBuf; + +public class SetSignalDisrupterFrequencyPacket implements IMessage { + int freq; + + public SetSignalDisrupterFrequencyPacket() { this(0); } + + public SetSignalDisrupterFrequencyPacket(int freq) { this.freq = freq; } + + @Override + public void fromBytes(ByteBuf buf) { + this.freq = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(freq); + } +} diff --git a/src/main/java/icbm/wanyi/SetSignalDisrupterFrequencyPacketHandler.java b/src/main/java/icbm/wanyi/SetSignalDisrupterFrequencyPacketHandler.java new file mode 100644 index 0000000..1a46c67 --- /dev/null +++ b/src/main/java/icbm/wanyi/SetSignalDisrupterFrequencyPacketHandler.java @@ -0,0 +1,24 @@ +package icbm.wanyi; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import net.minecraft.item.ItemStack; + +public class SetSignalDisrupterFrequencyPacketHandler + implements IMessageHandler { + + @Override + public IMessage onMessage(SetSignalDisrupterFrequencyPacket message, + MessageContext ctx) { + ItemStack handStack = + ctx.getServerHandler().playerEntity.getCurrentEquippedItem(); + + if (handStack.getItem() instanceof ItSignalDisrupter) { + ((ItSignalDisrupter)handStack.getItem()) + .setFrequency(message.freq, handStack); + } + + return null; + } +} diff --git a/src/main/java/icbm/wanyi/TextureTracker.java b/src/main/java/icbm/wanyi/TextureTracker.java new file mode 100644 index 0000000..b387ba8 --- /dev/null +++ b/src/main/java/icbm/wanyi/TextureTracker.java @@ -0,0 +1,96 @@ +package icbm.wanyi; + +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.TextureUtil; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +@SideOnly(Side.CLIENT) +public class TextureTracker extends TextureAtlasSprite { + public double currentAngle; + public double angleDelta; + + public TextureTracker() { + super(ICBMContraption.itTracker.getUnlocalizedName().replace("item.", "")); + } + + @Override + public void updateAnimation() { + Minecraft minecraft = Minecraft.getMinecraft(); + World world = minecraft.theWorld; + EntityPlayer player = minecraft.thePlayer; + + double angel = 0; + + if (world != null) { + double xDifference = 0; + double zDifference = 0; + + ItemStack itemStack = player.getCurrentEquippedItem(); + + if (itemStack != null) { + if (itemStack.getItem() instanceof ItTracker) { + Entity trackingEntity = + ((ItTracker)itemStack.getItem()) + .getTrackingEntity( + FMLClientHandler.instance().getClient().theWorld, + itemStack); + + if (trackingEntity != null) { + xDifference = trackingEntity.posX - player.posX; + zDifference = trackingEntity.posZ - player.posZ; + } + } + } + + player.rotationYaw %= 360.0D; + angel = -((player.rotationYaw - 90.0D) * Math.PI / 180.0D - + Math.atan2(zDifference, xDifference)); + } + + double d6; + + for (d6 = angel - this.currentAngle; d6 < -Math.PI; d6 += (Math.PI * 2D)) { + ; + } + + while (d6 >= Math.PI) { + d6 -= (Math.PI * 2D); + } + + if (d6 < -1.0D) { + d6 = -1.0D; + } + + if (d6 > 1.0D) { + d6 = 1.0D; + } + + this.angleDelta += d6 * 0.1D; + this.angleDelta *= 0.8D; + this.currentAngle += this.angleDelta; + + int i; + + for (i = (int)((this.currentAngle / (Math.PI * 2D) + 1.0D) * + this.framesTextureData.size()) % + this.framesTextureData.size(); + i < 0; i = (i + this.framesTextureData.size()) % + this.framesTextureData.size()) { + ; + } + + if (i != this.frameCounter) { + this.frameCounter = i; + TextureUtil.uploadTextureMipmap( + (int[][])this.framesTextureData.get(this.frameCounter), this.width, + this.height, this.originX, this.originY, false, false); + } + } +} diff --git a/src/main/java/icbm/wanyi/b/BCamouflage.java b/src/main/java/icbm/wanyi/b/BCamouflage.java new file mode 100644 index 0000000..d6bf89a --- /dev/null +++ b/src/main/java/icbm/wanyi/b/BCamouflage.java @@ -0,0 +1,179 @@ +package icbm.wanyi.b; + +import icbm.api.ICamouflageMaterial; +import icbm.api.explosion.IEMPBlock; +import icbm.api.explosion.IExplosive; +import icbm.core.ICBMTab; +import icbm.core.di.BICBM; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.vector.Vector3; + +public class BCamouflage extends BICBM implements IEMPBlock { + public BCamouflage() { + super("camouflage", Material.cloth); + this.setHardness(0.3f); + this.setResistance(1.0f); + this.setStepSound(Block.soundTypeCloth); + this.setCreativeTab((CreativeTabs) ICBMTab.INSTANCE); + } + + @Override + public void onEMP(final World world, final Vector3 position, + final IExplosive empExplosive) { + final TileEntity tileEntity = position.getTileEntity((IBlockAccess) world); + if (tileEntity instanceof TCamouflage) { + ((TCamouflage) tileEntity).setCamoBlock(Blocks.air, 0); + ((TCamouflage) tileEntity).setTransparent(false); + world.markBlockRangeForRenderUpdate(position.intX(), position.intY(), + position.intZ(), position.intX(), + position.intY(), position.intZ()); + } + } + + @Override + public IIcon getIcon(final IBlockAccess par1IBlockAccess, final int x, + final int y, final int z, final int side) { + final TileEntity t = par1IBlockAccess.getTileEntity(x, y, z); + if (t != null && t instanceof TCamouflage) { + final TCamouflage tileEntity = (TCamouflage) t; + if (tileEntity.getTransparent(ForgeDirection.getOrientation(side))) { + return Blocks.glass.getBlockTextureFromSide(side); + } + final Block block = tileEntity.getCamoBlock(); + if (block != null) { + try { + final IIcon blockIcon = tileEntity.getCamoBlock().getIcon( + side, tileEntity.getJiaMetadata()); + if (blockIcon != null) { + return blockIcon; + } + } catch (final Exception e) { + e.printStackTrace(); + } + } + } + return this.blockIcon; + } + + @Override + public boolean onMachineActivated(final World par1World, final int x, + final int y, final int z, + final EntityPlayer par5EntityPlayer, + final int side, final float hitX, + final float hitY, final float hitZ) { + try { + if (par5EntityPlayer.getCurrentEquippedItem() != null) { + final Item item = par5EntityPlayer.getCurrentEquippedItem().getItem(); + final Block block = Block.getBlockFromItem(item); + if (block != Blocks.air && block != this && + (block instanceof ICamouflageMaterial || + (block.isNormalCube() && + (block.getRenderType() == 0 || block.getRenderType() == 31)))) { + ((TCamouflage) par1World.getTileEntity(x, y, z)) + .setCamoBlock( + block, + par5EntityPlayer.getCurrentEquippedItem().getItemDamage()); + par1World.markBlockRangeForRenderUpdate(x, y, z, x, y, z); + return true; + } + } + } catch (final Exception e) { + e.printStackTrace(); + } + return false; + } + + @Override + public boolean onUseWrench(final World par1World, final int x, final int y, + final int z, final EntityPlayer par5EntityPlayer, + final int side, final float hitX, final float hitY, + final float hitZ) { + final TileEntity t = par1World.getTileEntity(x, y, z); + if (t != null && t instanceof TCamouflage) { + ((TCamouflage) par1World.getTileEntity(x, y, z)) + .setTransparent(ForgeDirection.getOrientation(side)); + par1World.markBlockRangeForRenderUpdate(x, y, z, x, y, z); + } + return true; + } + + @Override + public boolean onSneakUseWrench(final World par1World, final int x, final int y, final int z, + final EntityPlayer par5EntityPlayer, final int side, + final float hitX, final float hitY, final float hitZ) { + final TileEntity t = par1World.getTileEntity(x, y, z); + if (t != null && t instanceof TCamouflage) { + ((TCamouflage) par1World.getTileEntity(x, y, z)).setSolid(); + } + return true; + } + + @Override + public int colorMultiplier(final IBlockAccess par1IBlockAccess, final int x, + final int y, final int z) { + try { + final TileEntity tileEntity = par1IBlockAccess.getTileEntity(x, y, z); + if (tileEntity instanceof TCamouflage) { + final Block block = ((TCamouflage) tileEntity).getCamoBlock(); + if (block != null) { + return block.colorMultiplier(par1IBlockAccess, x, y, x); + } + } + } catch (final Exception e) { + e.printStackTrace(); + } + return 16777215; + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(final World par1World, + final int x, final int y, + final int z) { + final TileEntity t = par1World.getTileEntity(x, y, z); + if (t != null && t instanceof TCamouflage && ((TCamouflage) t).getSolid()) { + return super.getCollisionBoundingBoxFromPool(par1World, x, y, z); + } + return null; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean shouldSideBeRendered(final IBlockAccess par1IBlockAccess, + final int par2, final int par3, + final int par4, final int par5) { + final Block var6 = par1IBlockAccess.getBlock(par2, par3, par4); + return var6 != this && + super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5); + } + + @Override + public TileEntity createNewTileEntity(final World var1, int meta) { + return new TCamouflage(); + } + + @Override + public void registerBlockIcons(IIconRegister iconRegister) { + this.blockIcon = iconRegister.registerIcon("icbm:camouflage"); + } +} diff --git a/src/main/java/icbm/wanyi/b/BConcrete.java b/src/main/java/icbm/wanyi/b/BConcrete.java new file mode 100644 index 0000000..b285409 --- /dev/null +++ b/src/main/java/icbm/wanyi/b/BConcrete.java @@ -0,0 +1,99 @@ +package icbm.wanyi.b; + +import atomicscience.api.IAntiPoisonBlock; +import atomicscience.api.poison.Poison; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.BICBM; +import java.util.List; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class BConcrete extends BICBM implements IAntiPoisonBlock { + private IIcon iconCompact; + private IIcon iconReinforced; + + public BConcrete() { + super("concrete", Material.rock); + this.setBlockTextureName("icbm:concrete"); + this.setHardness(3.8f); + this.setResistance(50.0f); + this.setStepSound(BConcrete.soundTypeMetal); + } + + @Override + public IIcon getIcon(final int side, final int metadata) { + switch (metadata) { + case 1: { + return this.iconCompact; + } + case 2: { + return this.iconReinforced; + } + default: { + return this.blockIcon; + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(final IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconCompact = iconRegister.registerIcon( + this.getUnlocalizedName().replace("tile.", "") + "Compact"); + this.iconReinforced = iconRegister.registerIcon( + this.getUnlocalizedName().replace("tile.", "") + "Reinforced"); + } + + @Override + public float getExplosionResistance(final Entity par1Entity, final World world, + final int x, final int y, final int z, + final double explosionX, final double explosionY, + final double explosionZ) { + final int metadata = world.getBlockMetadata(x, y, z); + switch (metadata) { + case 1: { + return 38.0f; + } + case 2: { + return 48.0f; + } + default: { + return this.getExplosionResistance(par1Entity); + } + } + } + + @Override + public void getSubBlocks(final Item par1, final CreativeTabs par2CreativeTabs, + final List par3List) { + for (int i = 0; i < 3; ++i) { + par3List.add(new ItemStack(par1, 1, i)); + } + } + + @Override + public boolean isPoisonPrevention(final World par1World, final int x, + final int y, final int z, + final Poison type) { + return true; + } + + @Override + public boolean hasTileEntity(final int metadata) { + return false; + } + + @Override + public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { + return null; + } +} diff --git a/src/main/java/icbm/wanyi/b/BGlassButton.java b/src/main/java/icbm/wanyi/b/BGlassButton.java new file mode 100644 index 0000000..9537ee4 --- /dev/null +++ b/src/main/java/icbm/wanyi/b/BGlassButton.java @@ -0,0 +1,36 @@ +package icbm.wanyi.b; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.ICBMTab; +import java.util.Random; +import net.minecraft.block.BlockButton; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; + +public class BGlassButton extends BlockButton { + public BGlassButton() { + super(true); + this.setTickRandomly(true); + this.setBlockName("icbm:glassButton"); + this.setStepSound(BGlassButton.soundTypeGlass); + this.setCreativeTab((CreativeTabs) ICBMTab.INSTANCE); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(final IIconRegister par1IconRegister) { + this.blockIcon = par1IconRegister.registerIcon( + this.getUnlocalizedName().replace("tile.", "")); + } + + @Override + public int quantityDropped(final Random par1Random) { + return 0; + } + + @Override + public boolean isOpaqueCube() { + return false; + } +} diff --git a/src/main/java/icbm/wanyi/b/BGlassPressurePlate.java b/src/main/java/icbm/wanyi/b/BGlassPressurePlate.java new file mode 100644 index 0000000..6a2aa00 --- /dev/null +++ b/src/main/java/icbm/wanyi/b/BGlassPressurePlate.java @@ -0,0 +1,64 @@ +package icbm.wanyi.b; + +import icbm.core.ICBMTab; +import java.util.Random; +import net.minecraft.block.BlockPressurePlate; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.world.World; + +public class BGlassPressurePlate extends BlockPressurePlate { + public BGlassPressurePlate() { + super("icbm:glassPressurePlate", Material.glass, + BlockPressurePlate.Sensitivity.everything); + this.setTickRandomly(true); + this.setResistance(1.0f); + this.setHardness(0.3f); + this.setStepSound(BGlassPressurePlate.soundTypeGlass); + this.setBlockName("icbm:glassPressurePlate"); + this.setCreativeTab((CreativeTabs) ICBMTab.INSTANCE); + } + + @Override + protected void func_150062_a(final World par1World, final int par2, + final int par3, final int par4, final int par5) { + super.func_150062_a(par1World, par2, par3, par4, par5); + final int i1 = this.func_150065_e(par1World, par2, par3, par4); + final boolean flag2 = i1 > 0; + if (par5 != i1) { + par1World.setBlockMetadataWithNotify(par2, par3, par4, + this.func_150066_d(i1), 2); + par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, + par4); + } + if (flag2) { + par1World.scheduleBlockUpdate(par2, par3, par4, this, + this.tickRate(par1World)); + } + } + + @Override + public int tickRate(final World world) { + return 10; + } + + @Override + public int quantityDropped(final Random par1Random) { + return 0; + } + + @Override + public int getRenderBlockPass() { + return 1; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public int getMobilityFlag() { + return 1; + } +} diff --git a/src/main/java/icbm/wanyi/b/BGlassReinforced.java b/src/main/java/icbm/wanyi/b/BGlassReinforced.java new file mode 100644 index 0000000..b428e50 --- /dev/null +++ b/src/main/java/icbm/wanyi/b/BGlassReinforced.java @@ -0,0 +1,71 @@ +package icbm.wanyi.b; + +import atomicscience.api.IAntiPoisonBlock; +import atomicscience.api.poison.Poison; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.ICBMTab; +import icbm.core.di.BICBM; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BGlassReinforced extends BICBM implements IAntiPoisonBlock { + public BGlassReinforced() { + super("glassReinforced", Material.glass); + this.setBlockTextureName("icbm:glassReinforced"); + this.setResistance(48.0f); + this.setCreativeTab((CreativeTabs)ICBMTab.INSTANCE); + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderBlockPass() { + return 0; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(final IBlockAccess par1IBlockAccess, + final int par2, final int par3, + final int par4, final int par5) { + final Block i1 = par1IBlockAccess.getBlock(par2, par3, par4); + return i1 != this && + super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + protected boolean canSilkHarvest() { + return true; + } + + @Override + public boolean isPoisonPrevention(final World par1World, final int x, + final int y, final int z, + final Poison type) { + return true; + } + + @Override + public boolean hasTileEntity(final int metadata) { + return false; + } + + @Override + public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { + return null; + } +} diff --git a/src/main/java/icbm/wanyi/b/BProximityDetector.java b/src/main/java/icbm/wanyi/b/BProximityDetector.java new file mode 100644 index 0000000..9a3b841 --- /dev/null +++ b/src/main/java/icbm/wanyi/b/BProximityDetector.java @@ -0,0 +1,61 @@ +package icbm.wanyi.b; + +import icbm.core.di.BICBM; +import icbm.wanyi.ICBMContraption; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import universalelectricity.core.UniversalElectricity; + +public class BProximityDetector extends BICBM { + public BProximityDetector() { + super("proximityDetector", UniversalElectricity.machine); + super.requireSidedTextures = true; + } + + @Override + public IIcon getIcon(final int side, final int metadata) { + return (side == 0) ? super.iconBottom + : ((side == 1) ? super.iconTop : super.iconSide); + } + + @Override + public boolean onMachineActivated(final World par1World, final int x, + final int y, final int z, + final EntityPlayer par5EntityPlayer, + final int side, final float hitX, + final float hitY, final float hitZ) { + par5EntityPlayer.openGui((Object) ICBMContraption.instance, 4, par1World, x, y, + z); + return true; + } + + @Override + public boolean onUseWrench(final World par1World, final int x, final int y, + final int z, final EntityPlayer par5EntityPlayer, + final int side, final float hitX, final float hitY, + final float hitZ) { + final TileEntity tileEntity = par1World.getTileEntity(x, y, z); + if (tileEntity instanceof TProximityDetector) { + ((TProximityDetector) tileEntity).isInverted = !((TProximityDetector) tileEntity).isInverted; + return true; + } + return false; + } + + @Override + public boolean canProvidePower() { + return true; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public TileEntity createNewTileEntity(final World world, int meta) { + return new TProximityDetector(); + } +} diff --git a/src/main/java/icbm/wanyi/b/BSpikes.java b/src/main/java/icbm/wanyi/b/BSpikes.java new file mode 100644 index 0000000..57dce28 --- /dev/null +++ b/src/main/java/icbm/wanyi/b/BSpikes.java @@ -0,0 +1,177 @@ +package icbm.wanyi.b; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.ICBMTab; +import icbm.core.di.BICBM; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class BSpikes extends BICBM { + private IIcon iconPoison; + private IIcon iconFlammable; + + public BSpikes() { + super("spikes", Material.cactus); + this.setBlockTextureName("icbm:spikes"); + this.setHardness(1.0f); + this.setCreativeTab((CreativeTabs) ICBMTab.INSTANCE); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(final IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconPoison = iconRegister.registerIcon( + this.getUnlocalizedName().replace("tile.", "") + "Poison"); + this.iconFlammable = iconRegister.registerIcon( + this.getUnlocalizedName().replace("tile.", "") + "Flammable"); + } + + @Override + public AxisAlignedBB getSelectedBoundingBoxFromPool(final World par1World, + final int x, final int y, + final int z) { + return AxisAlignedBB.getBoundingBox((double) x, (double) y, (double) z, + (double) (x + 1), (double) (y + 0.5f), + (double) (z + 1)); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(final World par1World, final int par2, + final int par3, final int par4) { + return null; + } + + @Override + public IIcon getIcon(final int par1, final int metadata) { + if (metadata == 2) { + return this.iconFlammable; + } + if (metadata == 1) { + return this.iconPoison; + } + return this.blockIcon; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public int getRenderType() { + return 1; + } + + @Override + public int getMobilityFlag() { + return 0; + } + + @Override + public boolean canPlaceBlockAt(final World par1World, final int par2, + final int par3, final int par4) { + return this.canBlockStay(par1World, par2, par3, par4); + } + + @Override + public void onNeighborBlockChange(final World par1World, final int par2, + final int par3, final int par4, + final Block par5) { + if (!this.canBlockStay(par1World, par2, par3, par4)) { + this.dropBlockAsItem(par1World, par2, par3, par4, + par1World.getBlockMetadata(par2, par3, par4), 0); + par1World.setBlock(par2, par3, par4, Blocks.air, 0, 2); + } + } + + @Override + public boolean canBlockStay(final World par1World, final int par2, + final int par3, final int par4) { + return par1World.isSideSolid(par2 - 1, par3, par4, + ForgeDirection.getOrientation(5)) || + par1World.isSideSolid(par2 + 1, par3, par4, + ForgeDirection.getOrientation(4)) + || + par1World.isSideSolid(par2, par3, par4 - 1, + ForgeDirection.getOrientation(3)) + || + par1World.isSideSolid(par2, par3, par4 + 1, + ForgeDirection.getOrientation(2)) + || + par1World.isSideSolid(par2, par3 + 1, par4, + ForgeDirection.getOrientation(1)) + || + par1World.isSideSolid(par2, par3 - 1, par4, + ForgeDirection.getOrientation(0)) + || + par1World.getBlock(par2 - 1, par3, par4) == Blocks.piston_head || + par1World.getBlock(par2 + 1, par3, par4) == Blocks.piston_head || + par1World.getBlock(par2, par3, par4 - 1) == Blocks.piston_head || + par1World.getBlock(par2, par3, par4 + 1) == Blocks.piston_head || + par1World.getBlock(par2, par3 + 1, par4) == Blocks.piston_head || + par1World.getBlock(par2, par3 - 1, par4) == Blocks.piston_head || + par1World.getBlock(par2 - 1, par3, par4) == Blocks.piston || + par1World.getBlock(par2 + 1, par3, par4) == Blocks.piston || + par1World.getBlock(par2, par3, par4 - 1) == Blocks.piston || + par1World.getBlock(par2, par3, par4 + 1) == Blocks.piston || + par1World.getBlock(par2, par3 + 1, par4) == Blocks.piston || + par1World.getBlock(par2, par3 - 1, par4) == Blocks.piston || + par1World.getBlock(par2 - 1, par3, par4) == Blocks.sticky_piston || + par1World.getBlock(par2 + 1, par3, par4) == Blocks.sticky_piston || + par1World.getBlock(par2, par3, par4 - 1) == Blocks.sticky_piston || + par1World.getBlock(par2, par3, par4 + 1) == Blocks.sticky_piston || + par1World.getBlock(par2, par3 + 1, par4) == Blocks.sticky_piston || + par1World.getBlock(par2, par3 - 1, par4) == Blocks.sticky_piston; + } + + @Override + public void onEntityCollidedWithBlock(final World par1World, final int par2, + final int par3, final int par4, + final Entity par5Entity) { + if (par5Entity instanceof EntityLiving) { + par5Entity.attackEntityFrom(DamageSource.cactus, 1); + if (par1World.getBlockMetadata(par2, par3, par4) == 1) { + ((EntityLiving) par5Entity) + .addPotionEffect(new PotionEffect(Potion.poison.id, 140, 0)); + } else if (par1World.getBlockMetadata(par2, par3, par4) == 2) { + ((EntityLiving) par5Entity).setFire(7); + } + } + } + + @Override + public void getSubBlocks(final Item par1, final CreativeTabs par2CreativeTabs, + final List par3List) { + for (int i = 0; i < 3; ++i) { + par3List.add(new ItemStack((Block) this, 1, i)); + } + } + + @Override + public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { + return null; + } +} diff --git a/src/main/java/icbm/wanyi/b/IBConcrete.java b/src/main/java/icbm/wanyi/b/IBConcrete.java new file mode 100644 index 0000000..b1375ba --- /dev/null +++ b/src/main/java/icbm/wanyi/b/IBConcrete.java @@ -0,0 +1,31 @@ +package icbm.wanyi.b; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class IBConcrete extends ItemBlock { + public IBConcrete(Block block) { + super(block); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + public int getMetadata(final int damage) { + return damage; + } + + public String getUnlocalizedName(final ItemStack itemstack) { + switch (itemstack.getItemDamage()) { + case 1: { + return this.getUnlocalizedName() + "Compact"; + } + case 2: { + return this.getUnlocalizedName() + "Reinforced"; + } + default: { + return this.getUnlocalizedName(); + } + } + } +} diff --git a/src/main/java/icbm/wanyi/b/TCamouflage.java b/src/main/java/icbm/wanyi/b/TCamouflage.java new file mode 100644 index 0000000..c10ccae --- /dev/null +++ b/src/main/java/icbm/wanyi/b/TCamouflage.java @@ -0,0 +1,139 @@ +package icbm.wanyi.b; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +public class TCamouflage extends TileEntity { + private Block camoBlock; + private int camoMetadata; + private boolean isSolid; + private final boolean[] transparentSides; + + public TCamouflage() { + this.camoBlock = Blocks.air; + this.camoMetadata = 0; + this.isSolid = true; + this.transparentSides = new boolean[] { false, false, false, false, false, false }; + } + + public boolean canUpdate() { + return false; + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + + this.setCamoBlock(Block.getBlockById(nbt.getInteger("camoId")), + nbt.getInteger("camoMeta")); + this.isSolid = nbt.getBoolean("isSolid"); + + for (int i = 0; i < this.transparentSides.length; i++) { + this.transparentSides[i] = nbt.getBoolean("transparent" + i); + } + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + + nbt.setInteger("camoId", Block.getIdFromBlock(this.camoBlock)); + nbt.setInteger("camoMeta", this.camoMetadata); + nbt.setBoolean("isSolid", this.isSolid); + + for (int i = 0; i < this.transparentSides.length; i++) { + nbt.setBoolean("transparent" + i, this.transparentSides[i]); + } + + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, + this.getBlockMetadata(), nbt); + } + + public boolean getSolid() { + return this.isSolid; + } + + public void setSolid(final boolean isSolid) { + this.isSolid = isSolid; + if (!this.worldObj.isRemote) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + } + } + + public void setSolid() { + this.setSolid(!this.isSolid); + } + + public Block getCamoBlock() { + return this.camoBlock; + } + + public int getJiaMetadata() { + return this.camoMetadata; + } + + public void setCamoBlock(final Block block, final int metadata) { + if (this.camoBlock != block || this.camoMetadata != metadata) { + this.camoBlock = block; + this.camoMetadata = Math.max(metadata, 0); + if (!this.worldObj.isRemote) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + } + } + } + + public boolean getTransparent(final ForgeDirection direction) { + return direction.ordinal() < this.transparentSides.length && + this.transparentSides[direction.ordinal()]; + } + + public void setTransparent(final ForgeDirection direction, + final boolean isTransparent) { + if (direction.ordinal() < this.transparentSides.length) { + this.transparentSides[direction.ordinal()] = isTransparent; + if (!this.worldObj.isRemote) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + } + } + } + + public void setTransparent(final ForgeDirection direction) { + this.setTransparent(direction, !this.getTransparent(direction)); + } + + public void setTransparent(final boolean isTransparent) { + for (int i = 0; i < this.transparentSides.length; ++i) { + this.setTransparent(ForgeDirection.getOrientation(i), isTransparent); + } + } + + @Override + public void readFromNBT(final NBTTagCompound par1NBTTagCompound) { + super.readFromNBT(par1NBTTagCompound); + this.camoBlock = Block.getBlockById(par1NBTTagCompound.getInteger("camoBlock")); + this.camoMetadata = par1NBTTagCompound.getInteger("camoMetadata"); + for (int i = 0; i < this.transparentSides.length; ++i) { + this.transparentSides[i] = par1NBTTagCompound.getBoolean("transparent" + i); + } + this.isSolid = par1NBTTagCompound.getBoolean("isSolid"); + } + + @Override + public void writeToNBT(final NBTTagCompound par1NBTTagCompound) { + super.writeToNBT(par1NBTTagCompound); + par1NBTTagCompound.setInteger("camoBlock", + Block.getIdFromBlock(this.camoBlock)); + par1NBTTagCompound.setInteger("camoMetadata", this.camoMetadata); + for (int i = 0; i < this.transparentSides.length; ++i) { + par1NBTTagCompound.setBoolean("transparent" + i, + this.transparentSides[i]); + } + par1NBTTagCompound.setBoolean("isSolid", this.isSolid); + } +} diff --git a/src/main/java/icbm/wanyi/b/TProximityDetector.java b/src/main/java/icbm/wanyi/b/TProximityDetector.java new file mode 100644 index 0000000..3843f23 --- /dev/null +++ b/src/main/java/icbm/wanyi/b/TProximityDetector.java @@ -0,0 +1,178 @@ +package icbm.wanyi.b; + +import calclavia.lib.TileEntityUniversalRunnable; +import icbm.wanyi.ItSignalDisrupter; +import icbm.wanyi.ProximityDetectorModePacket; +import java.util.List; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.electricity.ElectricityPack; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.implement.IRedstoneProvider; + +public class TProximityDetector + extends TileEntityUniversalRunnable implements IRedstoneProvider { + public short frequency; + public boolean isDetect; + public Vector3 minCoord; + public Vector3 maxCoord; + public byte mode; + public boolean isInverted; + + public TProximityDetector() { + this.frequency = 0; + this.isDetect = false; + this.minCoord = new Vector3(9.0, 9.0, 9.0); + this.maxCoord = new Vector3(9.0, 9.0, 9.0); + this.mode = 0; + this.isInverted = false; + } + + @Override + public void initiate() { + super.initiate(); + this.worldObj.notifyBlocksOfNeighborChange( + this.xCoord, this.yCoord, this.zCoord, this.getBlockType()); + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!this.worldObj.isRemote && super.ticks % 20L == 0L) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + if (!this.isDisabled()) { + boolean isDetectThisCheck = false; + if (super.wattsReceived >= this.getRequest().getWatts()) { + final AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox( + this.xCoord - this.minCoord.x, this.yCoord - this.minCoord.y, + this.zCoord - this.minCoord.z, + this.xCoord + this.maxCoord.x + 1.0, + this.yCoord + this.maxCoord.y + 1.0, + this.zCoord + this.maxCoord.z + 1.0); + final List entitiesNearby = + this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, + bounds); + for (final EntityLivingBase entity : entitiesNearby) { + if (entity instanceof EntityPlayer && + (this.mode == 0 || this.mode == 1)) { + boolean gotDisrupter = false; + for (final ItemStack inventory : + ((EntityPlayer)entity).inventory.mainInventory) { + if (inventory != null && + inventory.getItem() instanceof ItSignalDisrupter && + ((ItSignalDisrupter)inventory.getItem()) + .getFrequency(inventory) == this.frequency) { + gotDisrupter = true; + break; + } + } + if (gotDisrupter) { + if (this.isInverted) { + isDetectThisCheck = true; + break; + } + continue; + } else { + if (this.isInverted) { + continue; + } + isDetectThisCheck = true; + } + } else { + if (!this.isInverted && !(entity instanceof EntityPlayer) && + (this.mode == 0 || this.mode == 2)) { + isDetectThisCheck = true; + break; + } + continue; + } + } + if (!this.worldObj.isRemote) { + super.wattsReceived = 0.0; + } + } + if (isDetectThisCheck != this.isDetect) { + this.isDetect = isDetectThisCheck; + this.worldObj.notifyBlocksOfNeighborChange( + this.xCoord, this.yCoord, this.zCoord, this.getBlockType()); + } + } + } + } + + public void onModePacket(ProximityDetectorModePacket pkt) { + pkt.mode.ifPresent(x -> this.mode = x); + pkt.frequency.ifPresent(x -> this.frequency = x); + pkt.minCoord.ifPresent(x -> this.minCoord = x); + pkt.maxCoord.ifPresent(x -> this.maxCoord = x); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + + nbt.setDouble("wattsReceived", super.wattsReceived); + nbt.setShort("frequency", this.frequency); + nbt.setByte("mode", this.mode); + nbt.setBoolean("isInverted", this.isInverted); + nbt.setTag("minCoord", this.minCoord.writeToNBT(new NBTTagCompound())); + nbt.setTag("maxCoord", this.maxCoord.writeToNBT(new NBTTagCompound())); + + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, + this.getBlockMetadata(), nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + + super.wattsReceived = nbt.getDouble("wattsReceived"); + this.frequency = nbt.getShort("frequency"); + this.mode = nbt.getByte("mode"); + this.isInverted = nbt.getBoolean("isInverted"); + this.minCoord = Vector3.readFromNBT(nbt.getCompoundTag("minCoord")); + this.maxCoord = Vector3.readFromNBT(nbt.getCompoundTag("maxCoord")); + } + + @Override + public void readFromNBT(final NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.mode = nbt.getByte("mode"); + this.frequency = nbt.getShort("frequency"); + this.isInverted = nbt.getBoolean("isInverted"); + this.minCoord = Vector3.readFromNBT(nbt.getCompoundTag("minCoord")); + this.maxCoord = Vector3.readFromNBT(nbt.getCompoundTag("maxCoord")); + } + + @Override + public void writeToNBT(final NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setShort("frequency", this.frequency); + nbt.setByte("mode", this.mode); + nbt.setBoolean("isInverted", this.isInverted); + nbt.setTag("minCoord", this.minCoord.writeToNBT(new NBTTagCompound())); + nbt.setTag("maxCoord", this.maxCoord.writeToNBT(new NBTTagCompound())); + } + + @Override + public boolean isPoweringTo(final ForgeDirection side) { + return this.isDetect; + } + + @Override + public boolean isIndirectlyPoweringTo(final ForgeDirection side) { + return this.isDetect; + } + + @Override + public ElectricityPack getRequest() { + return new ElectricityPack(8.0 / this.getVoltage(), this.getVoltage()); + } +} diff --git a/src/main/java/icbm/wanyi/gui/GProximityDetector.java b/src/main/java/icbm/wanyi/gui/GProximityDetector.java new file mode 100644 index 0000000..c1a6deb --- /dev/null +++ b/src/main/java/icbm/wanyi/gui/GProximityDetector.java @@ -0,0 +1,251 @@ +package icbm.wanyi.gui; + +import icbm.wanyi.ICBMContraption; +import icbm.wanyi.ProximityDetectorModePacket; +import icbm.wanyi.b.TProximityDetector; +import java.util.Optional; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; +import universalelectricity.core.electricity.ElectricityDisplay; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.GuiBase; + +public class GProximityDetector extends GuiBase { + private TProximityDetector tileEntity; + private int containerWidth; + private int containerHeight; + private GuiTextField textFieldFreq; + private GuiTextField textFieldminX; + private GuiTextField textFieldminY; + private GuiTextField textFieldminZ; + private GuiTextField textFieldmaxX; + private GuiTextField textFieldmaxY; + private GuiTextField textFieldmaxZ; + + public GProximityDetector(final TProximityDetector tileEntity) { + this.tileEntity = tileEntity; + } + + @Override + public void initGui() { + super.initGui(); + this.buttonList.clear(); + String mode = "All"; + if (this.tileEntity.mode == 1) { + mode = "Players"; + } else if (this.tileEntity.mode == 2) { + mode = "Mobs"; + } + this.buttonList.add(new GuiButton(0, this.width / 2 - 15, + this.height / 2 + 32, 45, 20, mode)); + (this.textFieldFreq = + new GuiTextField(this.fontRendererObj, 75, 100, 40, 12)) + .setMaxStringLength(4); + this.textFieldFreq.setText(this.tileEntity.frequency + ""); + (this.textFieldminX = + new GuiTextField(this.fontRendererObj, 75, 50, 20, 12)) + .setMaxStringLength(2); + this.textFieldminX.setText(this.tileEntity.minCoord.intX() + ""); + (this.textFieldminY = + new GuiTextField(this.fontRendererObj, 75, 67, 20, 12)) + .setMaxStringLength(2); + this.textFieldminY.setText(this.tileEntity.minCoord.intY() + ""); + (this.textFieldminZ = + new GuiTextField(this.fontRendererObj, 75, 82, 20, 12)) + .setMaxStringLength(2); + this.textFieldminZ.setText(this.tileEntity.minCoord.intZ() + ""); + (this.textFieldmaxX = + new GuiTextField(this.fontRendererObj, 130, 50, 20, 12)) + .setMaxStringLength(2); + this.textFieldmaxX.setText(this.tileEntity.maxCoord.intX() + ""); + (this.textFieldmaxY = + new GuiTextField(this.fontRendererObj, 130, 67, 20, 12)) + .setMaxStringLength(2); + this.textFieldmaxY.setText(this.tileEntity.maxCoord.intY() + ""); + (this.textFieldmaxZ = + new GuiTextField(this.fontRendererObj, 130, 82, 20, 12)) + .setMaxStringLength(2); + this.textFieldmaxZ.setText(this.tileEntity.maxCoord.intZ() + ""); + } + + @Override + protected void actionPerformed(final GuiButton par1GuiButton) { + if (par1GuiButton.id == 0) { + final TProximityDetector tileEntity = this.tileEntity; + ++tileEntity.mode; + if (this.tileEntity.mode > 2) { + this.tileEntity.mode = 0; + } + + ProximityDetectorModePacket pkt = + new ProximityDetectorModePacket(new Vector3(this.tileEntity)); + + pkt.mode = Optional.of(this.tileEntity.mode); + + ICBMContraption.channel.sendToServer(pkt); + } + } + + @Override + public void keyTyped(final char par1, final int par2) { + super.keyTyped(par1, par2); + this.textFieldminX.textboxKeyTyped(par1, par2); + this.textFieldminY.textboxKeyTyped(par1, par2); + this.textFieldminZ.textboxKeyTyped(par1, par2); + this.textFieldmaxX.textboxKeyTyped(par1, par2); + this.textFieldmaxY.textboxKeyTyped(par1, par2); + this.textFieldmaxZ.textboxKeyTyped(par1, par2); + this.textFieldFreq.textboxKeyTyped(par1, par2); + try { + final Vector3 newMinCoord = + new Vector3(Integer.parseInt(this.textFieldminX.getText()), + Integer.parseInt(this.textFieldminY.getText()), + Integer.parseInt(this.textFieldminZ.getText())); + this.tileEntity.minCoord = newMinCoord; + ProximityDetectorModePacket pkt = + new ProximityDetectorModePacket(new Vector3(this.tileEntity)); + pkt.minCoord = Optional.of(this.tileEntity.minCoord); + ICBMContraption.channel.sendToServer(pkt); + } catch (final Exception ex) { + } + try { + final Vector3 newMaxCoord = + new Vector3(Integer.parseInt(this.textFieldmaxX.getText()), + Integer.parseInt(this.textFieldmaxY.getText()), + Integer.parseInt(this.textFieldmaxZ.getText())); + this.tileEntity.maxCoord = newMaxCoord; + + ProximityDetectorModePacket pkt = + new ProximityDetectorModePacket(new Vector3(this.tileEntity)); + pkt.maxCoord = Optional.of(this.tileEntity.maxCoord); + ICBMContraption.channel.sendToServer(pkt); + } catch (final Exception ex2) { + } + try { + final short newFrequency = (short)Math.max( + 0, Short.parseShort(this.textFieldFreq.getText())); + this.tileEntity.frequency = newFrequency; + + ProximityDetectorModePacket pkt = + new ProximityDetectorModePacket(new Vector3(this.tileEntity)); + pkt.frequency = Optional.of(this.tileEntity.frequency); + ICBMContraption.channel.sendToServer(pkt); + } catch (final Exception ex3) { + } + } + + @Override + public void mouseClicked(final int par1, final int par2, final int par3) { + super.mouseClicked(par1, par2, par3); + this.textFieldminX.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + this.textFieldminY.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + this.textFieldminZ.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + this.textFieldmaxX.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + this.textFieldmaxY.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + this.textFieldmaxZ.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + this.textFieldFreq.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + } + + @Override + protected void drawForegroundLayer(final int var2, final int var3, + final float var1) { + this.fontRendererObj.drawString("§7Proximity Detector", 48, 6, 4210752); + this.fontRendererObj.drawString("Detection Range", 12, 25, 4210752); + this.fontRendererObj.drawString("Min", 75, 40, 4210752); + this.fontRendererObj.drawString("Max", 130, 40, 4210752); + this.fontRendererObj.drawString("X-Coord:", 15, 51, 4210752); + this.fontRendererObj.drawString("Y-Coord:", 15, 68, 4210752); + this.fontRendererObj.drawString("Z-Coord:", 15, 83, 4210752); + this.textFieldminX.drawTextBox(); + this.textFieldminY.drawTextBox(); + this.textFieldminZ.drawTextBox(); + this.textFieldmaxX.drawTextBox(); + this.textFieldmaxY.drawTextBox(); + this.textFieldmaxZ.drawTextBox(); + this.fontRendererObj.drawString("Frequency:", 15, 102, 4210752); + if (!this.tileEntity.isInverted) { + this.fontRendererObj.drawString("Exclude", 120, 102, 4210752); + } else { + this.fontRendererObj.drawString("Include", 120, 102, 4210752); + } + this.fontRendererObj.drawString("Target:", 15, 120, 4210752); + this.textFieldFreq.drawTextBox(); + String color = "§4"; + String status = "Idle"; + if (this.tileEntity.isDisabled()) { + status = "Disabled"; + } else if (this.tileEntity.prevWatts < + this.tileEntity.getRequest().getWatts()) { + status = "Insufficient electricity!"; + } else { + color = "§2"; + status = "On"; + } + this.fontRendererObj.drawString(color + "Status: " + status, 12, 138, + 4210752); + this.fontRendererObj.drawString( + ElectricityDisplay.getDisplay(this.tileEntity.getRequest().getWatts() * + 20.0, + ElectricityDisplay.ElectricUnit.WATT) + + " " + + ElectricityDisplay.getDisplay( + this.tileEntity.getVoltage(), + ElectricityDisplay.ElectricUnit.VOLTAGE), + 12, 150, 4210752); + } + + @Override + protected void drawBackgroundLayer(final int var2, final int var3, + final float var1) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/gui_empty.png")); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + this.containerWidth = (this.width - super.xSize) / 2; + this.containerHeight = (this.height - super.ySize) / 2; + this.drawTexturedModalRect(this.containerWidth, this.containerHeight, 0, 0, + super.xSize, super.ySize); + } + + @Override + public void updateScreen() { + super.updateScreen(); + String mode = "All"; + if (this.tileEntity.mode == 1) { + mode = "Players"; + } else if (this.tileEntity.mode == 2) { + mode = "Mobs"; + } + ((GuiButton)this.buttonList.get(0)).displayString = mode; + if (!this.textFieldminX.isFocused()) { + this.textFieldminX.setText(this.tileEntity.minCoord.intX() + ""); + } + if (!this.textFieldminY.isFocused()) { + this.textFieldminY.setText(this.tileEntity.minCoord.intY() + ""); + } + if (!this.textFieldminZ.isFocused()) { + this.textFieldminZ.setText(this.tileEntity.minCoord.intZ() + ""); + } + if (!this.textFieldmaxX.isFocused()) { + this.textFieldmaxX.setText(this.tileEntity.maxCoord.intX() + ""); + } + if (!this.textFieldmaxY.isFocused()) { + this.textFieldmaxY.setText(this.tileEntity.maxCoord.intY() + ""); + } + if (!this.textFieldmaxZ.isFocused()) { + this.textFieldmaxZ.setText(this.tileEntity.maxCoord.intZ() + ""); + } + if (!this.textFieldFreq.isFocused()) { + this.textFieldFreq.setText(this.tileEntity.frequency + ""); + } + } +} diff --git a/src/main/java/icbm/wanyi/gui/GSignalDisrupter.java b/src/main/java/icbm/wanyi/gui/GSignalDisrupter.java new file mode 100644 index 0000000..5b15a61 --- /dev/null +++ b/src/main/java/icbm/wanyi/gui/GSignalDisrupter.java @@ -0,0 +1,76 @@ +package icbm.wanyi.gui; + +import icbm.api.IItemFrequency; +import icbm.wanyi.ICBMContraption; +import icbm.wanyi.SetSignalDisrupterFrequencyPacket; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import universalelectricity.prefab.GuiBase; + +public class GSignalDisrupter extends GuiBase { + private ItemStack itemStack; + private GuiTextField textFieldFrequency; + private int containerWidth; + private int containerHeight; + + public GSignalDisrupter(final ItemStack par1ItemStack) { + this.itemStack = par1ItemStack; + } + + @Override + public void initGui() { + super.initGui(); + (this.textFieldFrequency = + new GuiTextField(this.fontRendererObj, 80, 50, 40, 12)) + .setMaxStringLength(4); + this.textFieldFrequency.setText(((IItemFrequency)this.itemStack.getItem()) + .getFrequency(this.itemStack) + + ""); + } + + public void keyTyped(final char par1, final int par2) { + super.keyTyped(par1, par2); + this.textFieldFrequency.textboxKeyTyped(par1, par2); + try { + final short newFrequency = (short)Math.max( + 0, Short.parseShort(this.textFieldFrequency.getText())); + this.textFieldFrequency.setText(newFrequency + ""); + if (((IItemFrequency)this.itemStack.getItem()) + .getFrequency(this.itemStack) != newFrequency) { + ((IItemFrequency)this.itemStack.getItem()) + .setFrequency(newFrequency, this.itemStack); + ICBMContraption.channel.sendToServer( + new SetSignalDisrupterFrequencyPacket(newFrequency)); + } + } catch (final NumberFormatException ex) { + } + } + + public void mouseClicked(final int par1, final int par2, final int par3) { + super.mouseClicked(par1, par2, par3); + this.textFieldFrequency.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + } + + @Override + protected void drawForegroundLayer(final int var2, final int var3, + final float var1) { + this.fontRendererObj.drawString("§7Frequency", 62, 6, 4210752); + this.fontRendererObj.drawString("Frequency:", 15, 52, 4210752); + this.textFieldFrequency.drawTextBox(); + } + + @Override + protected void drawBackgroundLayer(final int var2, final int var3, + final float var1) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/gui_empty.png")); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + this.containerWidth = (this.width - super.xSize) / 2; + this.containerHeight = (this.height - super.ySize) / 2; + this.drawTexturedModalRect(this.containerWidth, this.containerHeight, 0, 0, + super.xSize, super.ySize); + } +} diff --git a/src/main/java/icbm/zhapin/ClientProxy.java b/src/main/java/icbm/zhapin/ClientProxy.java new file mode 100644 index 0000000..e93e429 --- /dev/null +++ b/src/main/java/icbm/zhapin/ClientProxy.java @@ -0,0 +1,203 @@ +package icbm.zhapin; + +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.zhapin.cart.ECart; +import icbm.zhapin.daodan.EMissile; +import icbm.zhapin.fx.FXAntimatter; +import icbm.zhapin.fx.FXPortal; +import icbm.zhapin.fx.FXShockwave; +import icbm.zhapin.fx.FXSmoke; +import icbm.zhapin.gui.GEmpTower; +import icbm.zhapin.gui.GFaSheDi; +import icbm.zhapin.gui.GMissileLauncher; +import icbm.zhapin.gui.GRadarTower; +import icbm.zhapin.gui.GXiaoFaSheQi; +import icbm.zhapin.jiqi.TCruiseLauncher; +import icbm.zhapin.jiqi.TEmpTower; +import icbm.zhapin.jiqi.TLauncher; +import icbm.zhapin.jiqi.TLauncherPlatform; +import icbm.zhapin.jiqi.TMissileCoordinator; +import icbm.zhapin.jiqi.TLauncherControlPanel; +import icbm.zhapin.jiqi.TRadarTower; +import icbm.zhapin.render.REZhaDan; +import icbm.zhapin.render.REmpTower; +import icbm.zhapin.render.RFaSheDi; +import icbm.zhapin.render.RFaSheJia; +import icbm.zhapin.render.RLauncherControlPanel; +import icbm.zhapin.render.RFeiBlock; +import icbm.zhapin.render.RGuangBang; +import icbm.zhapin.render.RHJiQi; +import icbm.zhapin.render.RHZhaPin; +import icbm.zhapin.render.RItDaoDan; +import icbm.zhapin.render.RItRocketLauncher; +import icbm.zhapin.render.RMissile; +import icbm.zhapin.render.RRadarTower; +import icbm.zhapin.render.RShouLiuDan; +import icbm.zhapin.render.RSuiPian; +import icbm.zhapin.render.RXiaoFaSheQi; +import icbm.zhapin.render.RYinDaoQi; +import icbm.zhapin.render.RSMine; +import icbm.zhapin.render.RZhaPin; +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.EExplosive; +import icbm.zhapin.zhapin.EGrenade; +import icbm.zhapin.zhapin.TExplosive; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.EntityDiggingFX; +import net.minecraft.client.particle.EntityFX; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.entity.RenderMinecart; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.server.gui.IUpdatePlayerListBox; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.MinecraftForgeClient; +import universalelectricity.core.vector.Vector3; + +@SideOnly(Side.CLIENT) +public class ClientProxy extends CommonProxy { + @Override + public void preInit() { + FMLCommonHandler.instance().bus().register(new TickHandler()); + } + + @Override + public void init() { + super.init(); + MinecraftForgeClient.registerItemRenderer( + ICBMExplosion.itFaSheQi, (IItemRenderer) new RItRocketLauncher()); + MinecraftForgeClient.registerItemRenderer(ICBMExplosion.itDaoDan, + (IItemRenderer) new RItDaoDan()); + MinecraftForgeClient.registerItemRenderer(ICBMExplosion.itTeBieDaoDan, + (IItemRenderer) new RItDaoDan()); + RenderingRegistry.registerBlockHandler( + (ISimpleBlockRenderingHandler) new RHZhaPin()); + RenderingRegistry.registerBlockHandler( + (ISimpleBlockRenderingHandler) new RHJiQi()); + RenderingRegistry.registerEntityRenderingHandler(EExplosive.class, + (Render) new REZhaDan()); + RenderingRegistry.registerEntityRenderingHandler( + EMissile.class, (Render) new RMissile(0.5f)); + RenderingRegistry.registerEntityRenderingHandler(EExplosion.class, + (Render) new RZhaPin()); + RenderingRegistry.registerEntityRenderingHandler(EGravityBlock.class, + (Render) new RFeiBlock()); + RenderingRegistry.registerEntityRenderingHandler(ELightBeam.class, + (Render) new RGuangBang()); + RenderingRegistry.registerEntityRenderingHandler(ESuiPian.class, + (Render) new RSuiPian()); + RenderingRegistry.registerEntityRenderingHandler( + EGrenade.class, (Render) new RShouLiuDan()); + RenderingRegistry.registerEntityRenderingHandler( + ECart.class, (Render) new RenderMinecart()); + ClientRegistry.bindTileEntitySpecialRenderer( + TCruiseLauncher.class, (TileEntitySpecialRenderer) new RXiaoFaSheQi()); + ClientRegistry.bindTileEntitySpecialRenderer( + TLauncherPlatform.class, (TileEntitySpecialRenderer) new RFaSheDi()); + ClientRegistry.bindTileEntitySpecialRenderer( + TLauncherControlPanel.class, (TileEntitySpecialRenderer) new RLauncherControlPanel()); + ClientRegistry.bindTileEntitySpecialRenderer( + TLauncher.class, (TileEntitySpecialRenderer) new RFaSheJia()); + ClientRegistry.bindTileEntitySpecialRenderer( + TRadarTower.class, (TileEntitySpecialRenderer) new RRadarTower()); + ClientRegistry.bindTileEntitySpecialRenderer( + TEmpTower.class, (TileEntitySpecialRenderer) new REmpTower()); + ClientRegistry.bindTileEntitySpecialRenderer( + TExplosive.class, (TileEntitySpecialRenderer) new RSMine()); + ClientRegistry.bindTileEntitySpecialRenderer( + TMissileCoordinator.class, (TileEntitySpecialRenderer) new RYinDaoQi()); + } + + @Override + public Object getClientGuiElement(final int ID, + final EntityPlayer entityPlayer, + final World world, final int x, final int y, + final int z) { + final TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity != null || ID == 5) { + switch (ID) { + case 1: { + return new GXiaoFaSheQi(entityPlayer.inventory, + (TCruiseLauncher) tileEntity); + } + case 2: { + return new GMissileLauncher((TLauncherControlPanel) tileEntity); + } + case 3: { + return new GRadarTower((TRadarTower) tileEntity); + } + case 6: { + return new GEmpTower((TEmpTower) tileEntity); + } + case 7: { + return new GFaSheDi(entityPlayer.inventory, + (TLauncherPlatform) tileEntity); + } + } + } + return null; + } + + @Override + public boolean isGaoQing() { + return Minecraft.getMinecraft().gameSettings.fancyGraphics; + } + + @Override + public int getParticleSetting() { + return Minecraft.getMinecraft().gameSettings.particleSetting; + } + + @Override + public void spawnParticle(final String name, final World world, final Vector3 position, + final double motionX, final double motionY, + final double motionZ, final float red, final float green, + final float blue, final float scale, final double distance) { + EntityFX fx = null; + if (name == "smoke") { + fx = (EntityFX) new FXSmoke(world, position, red, green, blue, scale, + distance); + } else if (name == "missile_smoke") { + fx = (EntityFX) new FXSmoke(world, position, red, green, blue, scale, + distance) + .setAge(100); + } else if (name == "portal") { + fx = (EntityFX) new FXPortal(world, position, red, green, blue, scale, + distance); + } else if (name == "antimatter") { + fx = new FXAntimatter(world, position, red, green, blue, scale, distance); + } else if (name == "digging") { + fx = (EntityFX) new EntityDiggingFX( + world, position.x, position.y, position.z, motionX, motionY, motionZ, + Block.getBlockById((int) red), 0, (int) green); + fx.multipleParticleScaleBy(blue); + } else if (name == "shockwave") { + fx = new FXShockwave(world, position, red, green, blue, scale, distance); + } + if (fx != null) { + ((Entity) fx).motionX = motionX; + ((Entity) fx).motionY = motionY; + ((Entity) fx).motionZ = motionZ; + FMLClientHandler.instance().getClient().effectRenderer.addEffect(fx); + } + } + + @Override + public IUpdatePlayerListBox getDaoDanShengYin(final EMissile eDaoDan) { + // return (IUpdatePlayerListBox) new MissileSound( + // Minecraft.getMinecraft().sndManager, eDaoDan, + // (EntityPlayerSP)Minecraft.getMinecraft().thePlayer); + + return null; + } +} diff --git a/src/main/java/icbm/zhapin/CommonProxy.java b/src/main/java/icbm/zhapin/CommonProxy.java new file mode 100644 index 0000000..3bcb556 --- /dev/null +++ b/src/main/java/icbm/zhapin/CommonProxy.java @@ -0,0 +1,97 @@ +package icbm.zhapin; + +import cpw.mods.fml.common.network.IGuiHandler; +import cpw.mods.fml.common.registry.GameRegistry; +import icbm.zhapin.daodan.EMissile; +import icbm.zhapin.jiqi.TCruiseLauncher; +import icbm.zhapin.jiqi.TEmpTower; +import icbm.zhapin.jiqi.TLauncher; +import icbm.zhapin.jiqi.TLauncherPlatform; +import icbm.zhapin.jiqi.TMissileCoordinator; +import icbm.zhapin.jiqi.TLauncherControlPanel; +import icbm.zhapin.jiqi.TRadarTower; +import icbm.zhapin.rongqi.CFaShiDi; +import icbm.zhapin.rongqi.CXiaoFaSheQi; +import icbm.zhapin.zhapin.TExplosive; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.server.gui.IUpdatePlayerListBox; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class CommonProxy implements IGuiHandler { + public void preInit() { + } + + public void init() { + GameRegistry.registerTileEntity(TCruiseLauncher.class, + "ICBMCruiseLauncher"); + GameRegistry.registerTileEntity(TLauncherPlatform.class, + "ICBMLauncherPlatform"); + GameRegistry.registerTileEntity(TLauncherControlPanel.class, + "ICBMMissileLauncher"); + GameRegistry.registerTileEntity(TLauncher.class, "ICBMLauncher"); + GameRegistry.registerTileEntity(TRadarTower.class, "ICBMRadarTower"); + GameRegistry.registerTileEntity(TEmpTower.class, "ICBMEmpTower"); + GameRegistry.registerTileEntity(TMissileCoordinator.class, + "ICBMMissileCoordinator"); + GameRegistry.registerTileEntity(TExplosive.class, "ICBMExplosive"); + } + + public Object getClientGuiElement(final int ID, final EntityPlayer player, + final World world, final int x, final int y, + final int z) { + return null; + } + + public Object getServerGuiElement(final int ID, final EntityPlayer player, + final World world, final int x, final int y, + final int z) { + final TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity != null) { + switch (ID) { + case 1: { + return new CXiaoFaSheQi(player.inventory, (TCruiseLauncher) tileEntity); + } + case 7: { + return new CFaShiDi(player.inventory, (TLauncherPlatform) tileEntity); + } + } + } + return null; + } + + public boolean isGaoQing() { + return false; + } + + public void spawnParticle(final String name, final World world, + final Vector3 position, final float scale, + final double distance) { + this.spawnParticle(name, world, position, 0.0, 0.0, 0.0, scale, distance); + } + + public void spawnParticle(final String name, final World world, + final Vector3 position, final double motionX, + final double motionY, final double motionZ, + final float scale, final double distance) { + this.spawnParticle(name, world, position, motionX, motionY, motionZ, 1.0f, + 1.0f, 1.0f, scale, distance); + } + + public void spawnParticle(final String name, final World world, + final Vector3 position, final double motionX, + final double motionY, final double motionZ, + final float red, final float green, + final float blue, final float scale, + final double distance) { + } + + public IUpdatePlayerListBox getDaoDanShengYin(final EMissile eDaoDan) { + return null; + } + + public int getParticleSetting() { + return -1; + } +} diff --git a/src/main/java/icbm/zhapin/Du.java b/src/main/java/icbm/zhapin/Du.java new file mode 100644 index 0000000..77488c0 --- /dev/null +++ b/src/main/java/icbm/zhapin/Du.java @@ -0,0 +1,44 @@ +package icbm.zhapin; + +import atomicscience.api.poison.Poison; +import icbm.zhapin.po.PChuanRanDu; +import icbm.zhapin.po.PDaDu; +import java.util.EnumSet; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.potion.CustomPotionEffect; + +public class Du extends Poison { + private boolean isContagious; + + public Du(final String name, final int id, final boolean isContagious) { + super(name, id); + this.isContagious = isContagious; + } + + @Override + protected void doPoisonEntity(final Vector3 emitPosition, + final EntityLivingBase entity, + final EnumSet armorWorn, + final int amplifier) { + if (this.isContagious) { + entity.addPotionEffect((PotionEffect) new CustomPotionEffect( + PChuanRanDu.INSTANCE.getId(), 900, amplifier, null)); + entity.addPotionEffect((PotionEffect) new CustomPotionEffect( + Potion.blindness.id, 300, amplifier)); + } else { + entity.addPotionEffect((PotionEffect) new CustomPotionEffect( + PDaDu.INSTANCE.getId(), 600, amplifier, null)); + entity.addPotionEffect((PotionEffect) new CustomPotionEffect( + Potion.confusion.id, 600, amplifier)); + } + entity.addPotionEffect((PotionEffect) new CustomPotionEffect( + Potion.hunger.id, 600, amplifier)); + entity.addPotionEffect((PotionEffect) new CustomPotionEffect( + Potion.weakness.id, 700, amplifier)); + entity.addPotionEffect((PotionEffect) new CustomPotionEffect( + Potion.digSlowdown.id, 1200, amplifier)); + } +} diff --git a/src/main/java/icbm/zhapin/EGravityBlock.java b/src/main/java/icbm/zhapin/EGravityBlock.java new file mode 100644 index 0000000..14fb3b9 --- /dev/null +++ b/src/main/java/icbm/zhapin/EGravityBlock.java @@ -0,0 +1,175 @@ +package icbm.zhapin; + +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import icbm.core.MainBase; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class EGravityBlock + extends Entity implements IEntityAdditionalSpawnData { + public Block block; + public int metadata; + public float yawChange; + public float pitchChange; + public float gravity; + + public EGravityBlock(final World world) { + super(world); + this.block = Blocks.air; + this.metadata = 0; + this.yawChange = 0.0f; + this.pitchChange = 0.0f; + this.gravity = 0.045f; + super.ticksExisted = 0; + super.preventEntitySpawning = true; + super.isImmuneToFire = true; + this.setSize(1.0f, 1.0f); + } + + public EGravityBlock(final World world, final Vector3 position, + final Block block, final int metadata) { + super(world); + this.yawChange = 0.0f; + this.pitchChange = 0.0f; + this.gravity = 0.045f; + super.isImmuneToFire = true; + super.ticksExisted = 0; + this.setSize(0.98f, 0.98f); + super.yOffset = super.height / 2.0f; + this.setPosition(position.x + 0.5, position.y, position.z + 0.5); + super.motionX = 0.0; + super.motionY = 0.0; + super.motionZ = 0.0; + this.block = block; + this.metadata = metadata; + } + + public EGravityBlock(final World world, final Vector3 position, + final Block block, final int metadata, + final float gravity) { + this(world, position, block, metadata); + this.gravity = gravity; + } + + @Override + public String getCommandSenderName() { + return "Flying Block"; + } + + @Override + public void writeSpawnData(final ByteBuf data) { + data.writeInt(Block.getIdFromBlock(this.block)); + data.writeInt(this.metadata); + data.writeFloat(this.gravity); + } + + @Override + public void readSpawnData(final ByteBuf data) { + this.block = Block.getBlockById(data.readInt()); + this.metadata = data.readInt(); + this.gravity = data.readFloat(); + } + + @Override + protected void entityInit() { + } + + @Override + public void onUpdate() { + if (super.posY > 400.0 || this.block == null || + this.block == MainBase.bJia || this.block == Blocks.piston_head || + this.block == Blocks.flowing_water || + this.block == Blocks.flowing_lava) { + this.setDead(); + return; + } + super.motionY -= this.gravity; + if (super.isCollided) { + this.func_145771_j( + super.posX, (super.boundingBox.minY + super.boundingBox.maxY) / 2.0, + super.posZ); + } + this.moveEntity(super.motionX, super.motionY, super.motionZ); + if (this.yawChange > 0.0f) { + super.rotationYaw += this.yawChange; + this.yawChange -= 2.0f; + } + if (this.pitchChange > 0.0f) { + super.rotationPitch += this.pitchChange; + this.pitchChange -= 2.0f; + } + if ((super.onGround && super.ticksExisted > 20) || + super.ticksExisted > 2400) { + this.setBlock(); + return; + } + ++super.ticksExisted; + } + + public void setBlock() { + if (!super.worldObj.isRemote) { + final int i = MathHelper.floor_double(super.posX); + final int j = MathHelper.floor_double(super.posY); + final int k = MathHelper.floor_double(super.posZ); + super.worldObj.setBlock(i, j, k, this.block, this.metadata, 2); + } + this.setDead(); + } + + @Override + public AxisAlignedBB getCollisionBox(final Entity par1Entity) { + if (par1Entity instanceof EntityLiving && this.block != null && + !(this.block instanceof BlockLiquid) && + (super.motionX > 2.0 || super.motionY > 2.0 || super.motionZ > 2.0)) { + final int damage = (int) (1.2 * (Math.abs(super.motionX) + Math.abs(super.motionY) + + Math.abs(super.motionZ))); + ((EntityLiving) par1Entity) + .attackEntityFrom(DamageSource.fallingBlock, damage); + } + return null; + } + + @Override + protected void writeEntityToNBT(final NBTTagCompound nbttagcompound) { + nbttagcompound.setInteger("metadata", this.metadata); + nbttagcompound.setInteger("blockID", Block.getIdFromBlock(this.block)); + nbttagcompound.setFloat("gravity", this.gravity); + } + + @Override + protected void readEntityFromNBT(final NBTTagCompound nbttagcompound) { + this.metadata = nbttagcompound.getInteger("metadata"); + this.block = Block.getBlockById(nbttagcompound.getInteger("blockID")); + this.gravity = nbttagcompound.getFloat("gravity"); + } + + @Override + public float getShadowSize() { + return 0.5f; + } + + @Override + public boolean canBePushed() { + return true; + } + + @Override + protected boolean canTriggerWalking() { + return true; + } + + @Override + public boolean canBeCollidedWith() { + return true; + } +} diff --git a/src/main/java/icbm/zhapin/ELightBeam.java b/src/main/java/icbm/zhapin/ELightBeam.java new file mode 100644 index 0000000..411f620 --- /dev/null +++ b/src/main/java/icbm/zhapin/ELightBeam.java @@ -0,0 +1,92 @@ +package icbm.zhapin; + +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.Entity; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class ELightBeam extends Entity implements IEntityAdditionalSpawnData { + private int life; + public float red; + public float green; + public float blue; + + public ELightBeam(final World world) { + super(world); + this.setSize(1.0f, 1.0f); + super.preventEntitySpawning = true; + super.ignoreFrustumCheck = true; + super.renderDistanceWeight = 3.0; + } + + public ELightBeam(final World world, final Vector3 position, final int life, + final float red, final float green, final float blue) { + super(world); + this.setPosition(position.x, position.y, position.z); + this.red = red; + this.green = green; + this.blue = blue; + this.life = life; + } + + @Override + public String getCommandSenderName() { + return "Light Beam"; + } + + @Override + public void writeSpawnData(final ByteBuf data) { + data.writeInt(this.life); + data.writeFloat(this.red); + data.writeFloat(this.green); + data.writeFloat(this.blue); + } + + @Override + public void readSpawnData(final ByteBuf data) { + this.life = data.readInt(); + this.red = data.readFloat(); + this.green = data.readFloat(); + this.blue = data.readFloat(); + } + + @Override + protected void entityInit() {} + + @Override + public void onUpdate() { + if (this.life > 0) { + --this.life; + } else { + this.setDead(); + } + } + + @Override + public float getShadowSize() { + return 0.0f; + } + + @Override + public boolean canBePushed() { + return false; + } + + @Override + protected boolean canTriggerWalking() { + return false; + } + + @Override + public boolean canBeCollidedWith() { + return false; + } + + @Override + protected void readEntityFromNBT(final NBTTagCompound var1) {} + + @Override + protected void writeEntityToNBT(final NBTTagCompound var1) {} +} diff --git a/src/main/java/icbm/zhapin/ESuiPian.java b/src/main/java/icbm/zhapin/ESuiPian.java new file mode 100644 index 0000000..aa27c74 --- /dev/null +++ b/src/main/java/icbm/zhapin/ESuiPian.java @@ -0,0 +1,426 @@ +package icbm.zhapin; + +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import io.netty.buffer.ByteBuf; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EntityDamageSourceIndirect; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class ESuiPian + extends EntityArrow implements IEntityAdditionalSpawnData { + private int xTile; + private int yTile; + private int zTile; + private Block inTile; + private int inData; + private boolean inGround; + public boolean doesArrowBelongToPlayer; + public boolean isExplosive; + public boolean isAnvil; + private boolean isExploding; + public int arrowShake; + private int ticksInAir; + private int knowBackStrength; + public boolean arrowCritical; + public float explosionSize; + + public ESuiPian(final World par1World) { + super(par1World); + this.xTile = -1; + this.yTile = -1; + this.zTile = -1; + this.inTile = Blocks.air; + this.inData = 0; + this.inGround = false; + this.doesArrowBelongToPlayer = false; + this.isExploding = false; + this.arrowShake = 0; + this.ticksInAir = 0; + this.arrowCritical = false; + this.explosionSize = 1.5f; + this.setSize(0.5f, 0.5f); + } + + public ESuiPian(final World par1World, final double x, final double y, + final double z, final boolean isExplosive, + final boolean isAnvil) { + super(par1World); + this.xTile = -1; + this.yTile = -1; + this.zTile = -1; + this.inTile = Blocks.air; + this.inData = 0; + this.inGround = false; + this.doesArrowBelongToPlayer = false; + this.isExploding = false; + this.arrowShake = 0; + this.ticksInAir = 0; + this.arrowCritical = false; + this.explosionSize = 1.5f; + this.setPosition(x, y, z); + super.yOffset = 0.0f; + this.isExplosive = isExplosive; + this.isAnvil = isAnvil; + if (this.isAnvil) { + this.setSize(1.0f, 1.0f); + } else { + this.setSize(0.5f, 0.5f); + } + } + + @Override + public void writeSpawnData(final ByteBuf data) { + data.writeBoolean(this.isExplosive); + data.writeBoolean(this.isAnvil); + } + + @Override + public void readSpawnData(final ByteBuf data) { + this.isExplosive = data.readBoolean(); + this.isAnvil = data.readBoolean(); + } + + @Override + protected void entityInit() { + } + + @Override + public String getCommandSenderName() { + return "Fragments"; + } + + @Override + public void setThrowableHeading(double par1, double par3, double par5, + final float par7, final float par8) { + final float var9 = MathHelper.sqrt_double(par1 * par1 + par3 * par3 + par5 * par5); + par1 /= var9; + par3 /= var9; + par5 /= var9; + par1 += super.rand.nextGaussian() * 0.007499999832361937 * par8; + par3 += super.rand.nextGaussian() * 0.007499999832361937 * par8; + par5 += super.rand.nextGaussian() * 0.007499999832361937 * par8; + par1 *= par7; + par3 *= par7; + par5 *= par7; + super.motionX = par1; + super.motionY = par3; + super.motionZ = par5; + final float var10 = MathHelper.sqrt_double(par1 * par1 + par5 * par5); + final float n = (float) (Math.atan2(par1, par5) * 180.0 / 3.141592653589793); + super.rotationYaw = n; + super.prevRotationYaw = n; + final float n2 = (float) (Math.atan2(par3, var10) * 180.0 / 3.141592653589793); + super.rotationPitch = n2; + super.prevRotationPitch = n2; + } + + @Override + public void setVelocity(final double par1, final double par3, + final double par5) { + super.motionX = par1; + super.motionY = par3; + super.motionZ = par5; + if (super.prevRotationPitch == 0.0f && super.prevRotationYaw == 0.0f) { + final float var7 = MathHelper.sqrt_double(par1 * par1 + par5 * par5); + final float n = (float) (Math.atan2(par1, par5) * 180.0 / 3.141592653589793); + super.rotationYaw = n; + super.prevRotationYaw = n; + final float n2 = (float) (Math.atan2(par3, var7) * 180.0 / 3.141592653589793); + super.rotationPitch = n2; + super.prevRotationPitch = n2; + super.prevRotationPitch = super.rotationPitch; + super.prevRotationYaw = super.rotationYaw; + this.setLocationAndAngles(super.posX, super.posY, super.posZ, + super.rotationYaw, super.rotationPitch); + } + } + + private void explode() { + if (!this.isExploding && !super.worldObj.isRemote) { + this.isExploding = true; + super.worldObj.createExplosion((Entity) this, (double) this.xTile, + (double) this.yTile, (double) this.zTile, + this.explosionSize, true); + this.setDead(); + } + } + + @Override + public void onUpdate() { + //super.onUpdate(); + if (this.isAnvil) { + final ArrayList entities = new ArrayList<>(super.worldObj.getEntitiesWithinAABBExcludingEntity( + this, super.boundingBox)); + for (final Entity entity : entities) { + entity.attackEntityFrom(DamageSource.anvil, 15); + } + } + if (super.prevRotationPitch == 0.0f && super.prevRotationYaw == 0.0f) { + final float var6 = MathHelper.sqrt_double(super.motionX * super.motionX + + super.motionZ * super.motionZ); + final float n = (float) (Math.atan2(super.motionX, super.motionZ) * 180.0 / + 3.141592653589793); + super.rotationYaw = n; + super.prevRotationYaw = n; + final float n2 = (float) (Math.atan2(super.motionY, var6) * 180.0 / 3.141592653589793); + super.rotationPitch = n2; + super.prevRotationPitch = n2; + } + Block var7 = super.worldObj.getBlock(this.xTile, this.yTile, this.zTile); + if (var7 != Blocks.air) { + var7.setBlockBoundsBasedOnState((IBlockAccess) super.worldObj, this.xTile, + this.yTile, this.zTile); + final AxisAlignedBB var8 = var7.getCollisionBoundingBoxFromPool( + super.worldObj, this.xTile, this.yTile, this.zTile); + if (var8 != null && var8.isVecInside(Vec3.createVectorHelper( + super.posX, super.posY, super.posZ))) { + this.inGround = true; + } + } + if (this.arrowShake > 0) { + --this.arrowShake; + } + if (this.inGround) { + var7 = super.worldObj.getBlock(this.xTile, this.yTile, this.zTile); + final int var9 = super.worldObj.getBlockMetadata(this.xTile, this.yTile, this.zTile); + if (var7 == this.inTile && var9 == this.inData) { + if (this.isExplosive) { + this.explode(); + } else { + if (this.isAnvil && super.worldObj.rand.nextFloat() > 0.5f) { + super.worldObj.playAuxSFX(1022, (int) super.posX, (int) super.posY, + (int) super.posZ, 0); + } + this.setDead(); + } + } else { + this.inGround = false; + super.motionX *= super.rand.nextFloat() * 0.2f; + super.motionY *= super.rand.nextFloat() * 0.2f; + super.motionZ *= super.rand.nextFloat() * 0.2f; + this.ticksInAir = 0; + } + } else { + ++this.ticksInAir; + Vec3 var10 = Vec3.createVectorHelper(super.posX, super.posY, super.posZ); + Vec3 var11 = Vec3.createVectorHelper(super.posX + super.motionX, + super.posY + super.motionY, + super.posZ + super.motionZ); + // TODO: false? true? + MovingObjectPosition movingObjPos = super.worldObj.rayTraceBlocks(var10, var11, false); + var10 = Vec3.createVectorHelper(super.posX, super.posY, super.posZ); + var11 = Vec3.createVectorHelper(super.posX + super.motionX, + super.posY + super.motionY, + super.posZ + super.motionZ); + if (movingObjPos != null) { + var11 = Vec3.createVectorHelper(movingObjPos.hitVec.xCoord, + movingObjPos.hitVec.yCoord, + movingObjPos.hitVec.zCoord); + } + Entity var12 = null; + final List var13 = super.worldObj.getEntitiesWithinAABBExcludingEntity( + (Entity) this, + super.boundingBox + .addCoord(super.motionX, super.motionY, super.motionZ) + .expand(1.0, 1.0, 1.0)); + double var14 = 0.0; + for (int var15 = 0; var15 < var13.size(); ++var15) { + final Entity var16 = var13.get(var15); + if (var16.canBeCollidedWith() && this.ticksInAir >= 5) { + final float var17 = 0.3f; + final AxisAlignedBB var18 = var16.boundingBox.expand( + (double) var17, (double) var17, (double) var17); + final MovingObjectPosition var19 = var18.calculateIntercept(var10, var11); + if (var19 != null) { + final double var20 = var10.distanceTo(var19.hitVec); + if (var20 < var14 || var14 == 0.0) { + var12 = var16; + var14 = var20; + } + } + } + } + if (var12 != null) { + movingObjPos = new MovingObjectPosition(var12); + } + if (movingObjPos != null) { + if (movingObjPos.entityHit != null) { + final float sqrt_double; + final float speed = sqrt_double = MathHelper.sqrt_double( + super.motionX * super.motionX + super.motionY * super.motionY + + super.motionZ * super.motionZ); + this.getClass(); + int damage = (int) Math.ceil(sqrt_double * 11.0f); + if (this.arrowCritical) { + damage += super.rand.nextInt(damage / 2 + 2); + } + final DamageSource damageSource = new EntityDamageSourceIndirect("arrow", (Entity) this, + (Entity) this) + .setProjectile(); + if (this.isBurning()) { + movingObjPos.entityHit.setFire(5); + } + if (movingObjPos.entityHit.attackEntityFrom(damageSource, damage)) { + if (movingObjPos.entityHit instanceof EntityLiving) { + final EntityLiving var21 = (EntityLiving) movingObjPos.entityHit; + if (!super.worldObj.isRemote) { + var21.setArrowCountInEntity(var21.getArrowCountInEntity() + 1); + } + if (this.knowBackStrength > 0) { + final float var22 = MathHelper.sqrt_double(super.motionX * super.motionX + + super.motionZ * super.motionZ); + if (var22 > 0.0f) { + movingObjPos.entityHit.addVelocity( + super.motionX * this.knowBackStrength * + 0.6000000238418579 / var22, + 0.1, + super.motionZ * this.knowBackStrength * + 0.6000000238418579 / var22); + } + } + } + super.worldObj.playSoundAtEntity( + (Entity) this, "random.bowhit", 1.0f, + 1.2f / (super.rand.nextFloat() * 0.2f + 0.9f)); + this.setDead(); + } else { + super.motionX *= -0.10000000149011612; + super.motionY *= -0.10000000149011612; + super.motionZ *= -0.10000000149011612; + super.rotationYaw += 180.0f; + super.prevRotationYaw += 180.0f; + this.ticksInAir = 0; + } + } else { + this.xTile = movingObjPos.blockX; + this.yTile = movingObjPos.blockY; + this.zTile = movingObjPos.blockZ; + this.inTile = super.worldObj.getBlock(this.xTile, this.yTile, this.zTile); + this.inData = super.worldObj.getBlockMetadata(this.xTile, this.yTile, + this.zTile); + super.motionX = (float) (movingObjPos.hitVec.xCoord - super.posX); + super.motionY = (float) (movingObjPos.hitVec.yCoord - super.posY); + super.motionZ = (float) (movingObjPos.hitVec.zCoord - super.posZ); + final float speed = MathHelper.sqrt_double( + super.motionX * super.motionX + super.motionY * super.motionY + + super.motionZ * super.motionZ); + super.posX -= super.motionX / speed * 0.05000000074505806; + super.posY -= super.motionY / speed * 0.05000000074505806; + super.posZ -= super.motionZ / speed * 0.05000000074505806; + super.worldObj.playSoundAtEntity( + (Entity) this, "random.bowhit", 1.0f, + 1.2f / (super.rand.nextFloat() * 0.2f + 0.9f)); + this.inGround = true; + this.arrowShake = 7; + this.arrowCritical = false; + } + } + if (this.arrowCritical) { + for (int var15 = 0; var15 < 4; ++var15) { + super.worldObj.spawnParticle( + "crit", super.posX + super.motionX * var15 / 4.0, + super.posY + super.motionY * var15 / 4.0, + super.posZ + super.motionZ * var15 / 4.0, -super.motionX, + -super.motionY + 0.2, -super.motionZ); + } + } + super.posX += super.motionX; + super.posY += super.motionY; + super.posZ += super.motionZ; + final float speed = MathHelper.sqrt_double(super.motionX * super.motionX + + super.motionZ * super.motionZ); + super.rotationYaw = (float) (Math.atan2(super.motionX, super.motionZ) * + 180.0 / 3.141592653589793); + super.rotationPitch = (float) (Math.atan2(super.motionY, speed) * 180.0 / 3.141592653589793); + while (super.rotationPitch - super.prevRotationPitch < -180.0f) { + super.prevRotationPitch -= 360.0f; + } + while (super.rotationPitch - super.prevRotationPitch >= 180.0f) { + super.prevRotationPitch += 360.0f; + } + while (super.rotationYaw - super.prevRotationYaw < -180.0f) { + super.prevRotationYaw -= 360.0f; + } + while (super.rotationYaw - super.prevRotationYaw >= 180.0f) { + super.prevRotationYaw += 360.0f; + } + super.rotationPitch = super.prevRotationPitch + + (super.rotationPitch - super.prevRotationPitch) * 0.2f; + super.rotationYaw = super.prevRotationYaw + + (super.rotationYaw - super.prevRotationYaw) * 0.2f; + float var23 = 0.99f; + final float var17 = 0.05f; + if (this.isInWater()) { + for (int var24 = 0; var24 < 4; ++var24) { + final float var25 = 0.25f; + super.worldObj.spawnParticle( + "bubble", super.posX - super.motionX * var25, + super.posY - super.motionY * var25, + super.posZ - super.motionZ * var25, super.motionX, super.motionY, + super.motionZ); + } + var23 = 0.8f; + } + super.motionX *= var23; + super.motionY *= var23; + super.motionZ *= var23; + super.motionY -= var17; + this.setPosition(super.posX, super.posY, super.posZ); + } + } + + @Override + public void writeEntityToNBT(final NBTTagCompound par1NBTTagCompound) { + par1NBTTagCompound.setShort("xTile", (short) this.xTile); + par1NBTTagCompound.setShort("yTile", (short) this.yTile); + par1NBTTagCompound.setShort("zTile", (short) this.zTile); + par1NBTTagCompound.setInteger("inTile", Block.getIdFromBlock(this.inTile)); + par1NBTTagCompound.setByte("inData", (byte) this.inData); + par1NBTTagCompound.setByte("shake", (byte) this.arrowShake); + par1NBTTagCompound.setByte("inGround", (byte) (byte) (this.inGround ? 1 : 0)); + par1NBTTagCompound.setBoolean("isExplosive", this.isExplosive); + } + + @Override + public void readEntityFromNBT(final NBTTagCompound par1NBTTagCompound) { + this.xTile = par1NBTTagCompound.getShort("xTile"); + this.yTile = par1NBTTagCompound.getShort("yTile"); + this.zTile = par1NBTTagCompound.getShort("zTile"); + this.inTile = Block.getBlockById(par1NBTTagCompound.getInteger("inTile")); + this.inData = (par1NBTTagCompound.getByte("inData") & 0xFF); + this.arrowShake = (par1NBTTagCompound.getByte("shake") & 0xFF); + this.inGround = (par1NBTTagCompound.getByte("inGround") == 1); + this.isExplosive = par1NBTTagCompound.getBoolean("isExplosive"); + } + + @Override + public void applyEntityCollision(final Entity par1Entity) { + super.applyEntityCollision(par1Entity); + if (this.isExplosive && super.ticksExisted < 40) { + this.explode(); + } + } + + @Override + public float getShadowSize() { + return 0.0f; + } + + @Override + public boolean canAttackWithItem() { + return false; + } +} diff --git a/src/main/java/icbm/zhapin/ICBMCommand.java b/src/main/java/icbm/zhapin/ICBMCommand.java new file mode 100644 index 0000000..a08e96c --- /dev/null +++ b/src/main/java/icbm/zhapin/ICBMCommand.java @@ -0,0 +1,73 @@ +package icbm.zhapin; + +import icbm.zhapin.zhapin.EExplosion; +import java.util.Iterator; +import java.util.List; +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.command.WrongUsageException; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; + +public class ICBMCommand extends CommandBase { + @Override + public String getCommandName() { + return "icbm"; + } + + @Override + public String getCommandUsage(final ICommandSender par1ICommandSender) { + return "/icbm lag "; + } + + @Override + public void processCommand(final ICommandSender sender, final String[] args) { + try { + final EntityPlayer entityPlayer = (EntityPlayer) sender; + final int dimension = ((Entity) entityPlayer).worldObj.getWorldInfo().getVanillaDimension(); + if (args[0].equalsIgnoreCase("lag")) { + final int radius = parseInt(sender, args[1]); + if (radius > 0 && radius < Integer.MAX_VALUE) { + final EntityPlayer player = (EntityPlayer) sender; + final AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox( + ((Entity) player).posX - radius, ((Entity) player).posY - radius, + ((Entity) player).posZ - radius, ((Entity) player).posX + radius, + ((Entity) player).posY + radius, ((Entity) player).posZ + radius); + final List entitiesNearby = player.worldObj.getEntitiesWithinAABB(Entity.class, bounds); + for (final Entity entity : entitiesNearby) { + if (entity instanceof EGravityBlock) { + ((EGravityBlock) entity).setBlock(); + } else { + if (!(entity instanceof EExplosion)) { + continue; + } + entity.setDead(); + } + } + sender.addChatMessage(new ChatComponentText( + "Removed all ICBM lag sources within " + radius + " radius.")); + return; + } + throw new WrongUsageException("Radius not within range.", + new Object[0]); + } + } catch (final Exception ex) { + } + throw new WrongUsageException(this.getCommandUsage(sender), new Object[0]); + } + + @Override + public int getRequiredPermissionLevel() { + return 2; + } + + @Override + public List addTabCompletionOptions(final ICommandSender sender, + final String[] args) { + return (args.length == 1) + ? getListOfStringsMatchingLastWord(args, new String[] { "lag" }) + : null; + } +} diff --git a/src/main/java/icbm/zhapin/ICBMExplosion.java b/src/main/java/icbm/zhapin/ICBMExplosion.java new file mode 100644 index 0000000..4280e2e --- /dev/null +++ b/src/main/java/icbm/zhapin/ICBMExplosion.java @@ -0,0 +1,554 @@ +package icbm.zhapin; + +import calclavia.lib.UniversalRecipes; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.ModMetadata; +import cpw.mods.fml.common.SidedProxy; +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.event.FMLServerStartingEvent; +import cpw.mods.fml.common.network.IGuiHandler; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; +import cpw.mods.fml.common.registry.EntityRegistry; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import icbm.api.ICBM; +import icbm.api.ICBMFlags; +import icbm.core.ICBMTab; +import icbm.core.MainBase; +import icbm.zhapin.cart.ECart; +import icbm.zhapin.cart.ItCart; +import icbm.zhapin.daodan.EMissile; +import icbm.zhapin.daodan.ItMissile; +import icbm.zhapin.daodan.ItModuleMissile; +import icbm.zhapin.daodan.MissileBase; +import icbm.zhapin.dianqi.ItDefuser; +import icbm.zhapin.dianqi.ItLaserDesignator; +import icbm.zhapin.dianqi.ItRadarGun; +import icbm.zhapin.dianqi.ItRemoteDetonator; +import icbm.zhapin.dianqi.ItRocketLauncher; +import icbm.zhapin.jiqi.BMachine; +import icbm.zhapin.jiqi.IBMachine; +import icbm.zhapin.po.PChuanRanDu; +import icbm.zhapin.po.PDaDu; +import icbm.zhapin.po.PDongShang; +import icbm.zhapin.zhapin.BExplosives; +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.EExplosive; +import icbm.zhapin.zhapin.EGrenade; +import icbm.zhapin.zhapin.IBExplosive; +import icbm.zhapin.zhapin.ItGrenade; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.block.BlockDispenser; +import net.minecraft.block.BlockRailBase; +import net.minecraft.command.ICommand; +import net.minecraft.command.ICommandManager; +import net.minecraft.command.ServerCommandManager; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.IBehaviorDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.ForgeChunkManager.Ticket; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; +import universalelectricity.core.item.ElectricItemHelper; +import universalelectricity.core.item.ItemElectric; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; +import universalelectricity.prefab.flag.FlagRegistry; + +@Mod(modid = "ICBM|Explosion", name = "ICBM|Explosion", version = "1.2.1", + dependencies = "after:ICBM|Sentry;required-after:AtomicScience", useMetadata = true) +public class ICBMExplosion extends MainBase { + public static final String NAME = "ICBM|Explosion"; + public static final String CHANNEL = "ICBM|E"; + @Mod.Instance("ICBM|Explosion") public static ICBMExplosion instance; + @Mod.Metadata("ICBM|Explosion") public static ModMetadata metadata; + @SidedProxy(clientSide = "icbm.zhapin.ClientProxy", + serverSide = "icbm.zhapin.CommonProxy") + public static CommonProxy proxy; + public static Item Du; + public static final int ENTITY_ID_PREFIX = 50; + public static Block bExplosives; + public static Block bJiQi; + public static Item itDaoDan; + public static Item itTeBieDaoDan; + public static ItemElectric itJieJa; + public static ItemElectric itLeiDaQiang; + public static ItemElectric itYaoKong; + public static ItemElectric itLeiSheZhiBiao; + public static ItemElectric itFaSheQi; + public static Item itShouLiuDan; + public static Item itChe; + public static final Du DU_DU; + public static final Du DU_CHUAN_RAN; + public static boolean USE_FUEL; + public static SimpleNetworkWrapper channel; + + @Mod.EventHandler + @Override + public void preInit(final FMLPreInitializationEvent event) { + super.preInit(event); + NetworkRegistry.INSTANCE.registerGuiHandler( + (Object)this, (IGuiHandler)ICBMExplosion.proxy); + MainBase.CONFIGURATION.load(); + ICBMExplosion.USE_FUEL = + MainBase.CONFIGURATION + .get("general", "Use Fuel", ICBMExplosion.USE_FUEL) + .getBoolean(ICBMExplosion.USE_FUEL); + ICBMExplosion.bExplosives = (Block) new BExplosives(); + ICBMExplosion.bJiQi = (Block) new BMachine(); + ICBMExplosion.itDaoDan = new ItMissile("missile"); + ICBMExplosion.itTeBieDaoDan = new ItModuleMissile(); + ICBMExplosion.itJieJa = new ItDefuser(); + ICBMExplosion.itLeiDaQiang = new ItRadarGun(); + ICBMExplosion.itYaoKong = new ItRemoteDetonator(); + ICBMExplosion.itLeiSheZhiBiao = new ItLaserDesignator(); + ICBMExplosion.itFaSheQi = new ItRocketLauncher(); + ICBMExplosion.itShouLiuDan = new ItGrenade(); + ICBMExplosion.itChe = new ItCart(); + PDaDu.INSTANCE = new PDaDu(22, true, 5149489, "toxin"); + PChuanRanDu.INSTANCE = new PChuanRanDu(23, false, 5149489, "virus"); + PDongShang.INSTANCE = new PDongShang(24, false, 5149489, "frostBite"); + MainBase.CONFIGURATION.save(); + BlockDispenser.dispenseBehaviorRegistry.putObject( + (Object)ICBMExplosion.itShouLiuDan, + (Object) new IBehaviorDispenseItem() { + public ItemStack dispense(final IBlockSource blockSource, + final ItemStack itemStack) { + final World world = blockSource.getWorld(); + if (!world.isRemote) { + final int x = blockSource.getXInt(); + final int y = blockSource.getYInt(); + final int z = blockSource.getZInt(); + final EnumFacing enumFacing = + EnumFacing.getFront(blockSource.getBlockMetadata()); + final EGrenade entity = new EGrenade(world, new Vector3(x, y, z), + itemStack.getItemDamage()); + entity.setThrowableHeading( + enumFacing.getFrontOffsetX(), 0.10000000149011612, + enumFacing.getFrontOffsetZ(), 0.5f, 1.0f); + world.spawnEntityInWorld((Entity)entity); + } + --itemStack.stackSize; + return itemStack; + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject( + (Object)ICBMExplosion.itChe, (Object) new IBehaviorDispenseItem() { + private final BehaviorDefaultDispenseItem + defaultItemDispenseBehavior = new BehaviorDefaultDispenseItem(); + + public ItemStack dispense(final IBlockSource blockSource, + final ItemStack itemStack) { + final World world = blockSource.getWorld(); + if (!world.isRemote) { + final int x = blockSource.getXInt(); + final int y = blockSource.getYInt(); + final int z = blockSource.getZInt(); + final EnumFacing var3 = + EnumFacing.getFront(blockSource.getBlockMetadata()); + final World var4 = blockSource.getWorld(); + final double var5 = + blockSource.getX() + var3.getFrontOffsetX() * 1.125f; + final double var6 = blockSource.getY(); + final double var7 = + blockSource.getZ() + var3.getFrontOffsetZ() * 1.125f; + final int var8 = blockSource.getXInt() + var3.getFrontOffsetX(); + final int var9 = blockSource.getYInt(); + final int var10 = blockSource.getZInt() + var3.getFrontOffsetZ(); + final Block var11 = var4.getBlock(var8, var9, var10); + double var12; + if (BlockRailBase.func_150051_a(var11)) { + var12 = 0.0; + } else { + if (var11 != Blocks.air || + !BlockRailBase.func_150051_a( + var4.getBlock(var8, var9 - 1, var10))) { + return this.defaultItemDispenseBehavior.dispense(blockSource, + itemStack); + } + var12 = -1.0; + } + final ECart var13 = new ECart(world, var5, var6 + var12, var7, + itemStack.getItemDamage()); + world.spawnEntityInWorld((Entity)var13); + world.playAuxSFX(1000, x, y, z, 0); + } + --itemStack.stackSize; + return itemStack; + } + }); + GameRegistry.registerBlock(ICBMExplosion.bExplosives, IBExplosive.class, + "bExplosives"); + GameRegistry.registerBlock(ICBMExplosion.bJiQi, IBMachine.class, "bJiQi"); + ForgeChunkManager.setForcedChunkLoadingCallback( + (Object)this, + (ForgeChunkManager.LoadingCallback) new ForgeChunkManager + .LoadingCallback() { + public void ticketsLoaded(final List tickets, + final World world) { + for (final ForgeChunkManager.Ticket ticket : tickets) { + if (ticket.getEntity() != null) { + ((EMissile)ticket.getEntity()).daoDanInit(ticket); + } + } + } + }); + + GameRegistry.registerItem(itDaoDan, "icbm:itDaoDan"); + GameRegistry.registerItem(itTeBieDaoDan, "icbm:itTeBieDaoDan"); + GameRegistry.registerItem(itJieJa, "icbm:itJieJa"); + GameRegistry.registerItem(itLeiDaQiang, "icbm:itLeiDaQiang"); + GameRegistry.registerItem(itYaoKong, "icbm:itYaoKong"); + GameRegistry.registerItem(itLeiSheZhiBiao, "icbm:itLeiSheZhiBiao"); + GameRegistry.registerItem(itFaSheQi, "icbm:itFaSheQi"); + GameRegistry.registerItem(itShouLiuDan, "icbm:itShouLiuDan"); + GameRegistry.registerItem(itChe, "icbm:itChe"); + + ICBMTab.itemStack = new ItemStack(ICBMExplosion.bExplosives); + + ICBM.explosionManager = ZhaPin.class; + ICBMExplosion.proxy.preInit(); + + channel = NetworkRegistry.INSTANCE.newSimpleChannel("icbm_explosion"); + int pktId = 0; + channel.registerMessage(ItemUsePacketHandler.class, ItemUsePacket.class, + pktId++, Side.SERVER); + } + + @Mod.EventHandler + public void load(final FMLInitializationEvent evt) { + MainBase.setModMetadata("ICBM|Explosion", ICBMExplosion.metadata); + } + + @Mod.EventHandler + @Override + public void postInit(final FMLPostInitializationEvent event) { + super.postInit(event); + for (int i = 0; i < ZhaPin.list.length; ++i) { + if (ZhaPin.list[i] != null) { + ZhaPin.list[i].init(); + } + } + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + (Item)ICBMExplosion.itFaSheQi, + new Object[] {"SCR", "SB ", 'R', ICBMExplosion.itLeiDaQiang, 'C', + new ItemStack(ICBMExplosion.bJiQi, 1, + BMachine.JiQi.XiaoFaSheQi.ordinal() + 6), + 'B', Blocks.stone_button, 'S', "ingotSteel"})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack((Item)ICBMExplosion.itLeiDaQiang), + new Object[] {"@#!", " $!", " !", '@', Blocks.glass, '!', "ingotSteel", + '#', "calclavia:CIRCUIT_T1", '$', Blocks.stone_button})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack((Item)ICBMExplosion.itYaoKong), + new Object[] {"?@@", "@#$", "@@@", '@', "ingotSteel", '?', + Items.redstone, '#', "calclavia:CIRCUIT_T2", '$', + Blocks.stone_button})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack((Item)ICBMExplosion.itLeiSheZhiBiao), + new Object[] { + "! ", " ? ", " @", '@', + ElectricItemHelper.getUncharged(ICBMExplosion.itYaoKong), '?', + "calclavia:CIRCUIT_T3", '!', + ElectricItemHelper.getUncharged(ICBMExplosion.itLeiDaQiang)})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack((Item)ICBMExplosion.itJieJa), + new Object[] {"I ", " W ", " C", 'C', "calclavia:CIRCUIT_T2", 'W', + "calclavia:WRENCH", 'I', "calclavia:WIRE"})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.bJiQi, 1, 0), + new Object[] {"! !", "!C!", "!!!", '!', "ingotBronze", 'C', + "calclavia:CIRCUIT_T1"})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.bJiQi, 1, 1), + new Object[] {"! !", "!C!", "!@!", '@', + new ItemStack(ICBMExplosion.bJiQi, 1, 0), '!', + "ingotSteel", 'C', "calclavia:CIRCUIT_T2"})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.bJiQi, 1, 2), + new Object[] {"! !", "!C!", "!@!", '@', + new ItemStack(ICBMExplosion.bJiQi, 1, 1), '!', + "plateSteel", 'C', "calclavia:CIRCUIT_T3"})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.bJiQi, 1, 3), + new Object[] {"!!!", "!#!", "!?!", '#', "calclavia:CIRCUIT_T1", '!', + Blocks.glass, '?', "calclavia:WIRE"})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.bJiQi, 1, 4), + new Object[] {"!$!", "!#!", "!?!", '#', "calclavia:CIRCUIT_T2", '!', + "ingotSteel", '?', "calclavia:WIRE", '$', + new ItemStack(ICBMExplosion.bJiQi, 1, 3)})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.bJiQi, 1, 5), + new Object[] {"!$!", "!#!", "!?!", '#', "calclavia:CIRCUIT_T3", '!', + Items.gold_ingot, '?', "calclavia:WIRE", '$', + new ItemStack(ICBMExplosion.bJiQi, 1, 4)})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.bJiQi, 1, 6), + new Object[] {"! !", "!!!", "! !", '!', "ingotBronze"})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.bJiQi, 1, 7), + new Object[] {"! !", "!@!", "! !", '!', "ingotSteel", '@', + new ItemStack(ICBMExplosion.bJiQi, 1, 6)})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.bJiQi, 1, 8), + new Object[] {"! !", "!@!", "! !", '!', "plateSteel", '@', + new ItemStack(ICBMExplosion.bJiQi, 1, 7)})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.bJiQi, 1, 9), + new Object[] { + "?@?", " ! ", "!#!", '@', + ElectricItemHelper.getUncharged(ICBMExplosion.itLeiDaQiang), '!', + "plateSteel", '#', "calclavia:CIRCUIT_T1", '?', Items.gold_ingot})); + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.bJiQi, 1, 10), + new Object[] {"?W?", "@!@", "?#?", '?', "plateSteel", '!', + "calclavia:CIRCUIT_T3", '@', + UniversalRecipes.BATTERY_BOX, '#', "calclavia:MOTOR", + 'W', "calclavia:WIRE"}), + "EMP Tower", MainBase.CONFIGURATION, true); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.bJiQi, 1, 11), + new Object[] {"?! ", "@@@", '@', "plateSteel", '!', + new ItemStack(ICBMExplosion.bJiQi, 1, 2), '?', + new ItemStack(ICBMExplosion.bJiQi, 1, 8)})); + // TODO: WTF + // try { + // if (FluidRegistry.getFluid("fuel") != null && + // ICBMExplosion.USE_FUEL) { + // for (final FluidContainerData data : + // FluidContainerRegistry.getRegisteredFluidContainerData()) { + // if (data.fluid != null && + // data.fluid.isLiquidEqual( + // FluidRegistry.getFluid("Fuel"))) { + // GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + // new ItemStack(ICBMExplosion.itTeBieDaoDan), + // new Object[] { " @ ", "@#@", "@?@", '@', + // "ingotSteel", '?', + // data.filled, '#', "calclavia:CIRCUIT_T1" + // })); + // } + // } + // } else if (LiquidDictionary.getLiquid("Oil", 1) != null && + // ICBMExplosion.USE_FUEL) { + // for (final LiquidContainerData data : + // LiquidContainerRegistry.getRegisteredLiquidContainerData()) { + // if (data.stillLiquid != null && + // data.stillLiquid.isLiquidEqual( + // LiquidDictionary.getLiquid("Oil", 1))) { + // GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + // new ItemStack(ICBMExplosion.itTeBieDaoDan), + // new Object[] { " @ ", "@#@", "@?@", '@', + // "ingotSteel", '?', + // data.filled, '#', "calclavia:CIRCUIT_T1" + // })); + // } + // } + // } else { + // } + // } catch (final Exception e) { + // FMLLog.severe("Failed to add missile module recipe!", new Object[0]); + // e.printStackTrace(); + // } + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.itTeBieDaoDan), + new Object[] {" @ ", "@#@", "@?@", '@', "ingotSteel", '?', Items.coal, + '#', "calclavia:CIRCUIT_T1"})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.itTeBieDaoDan, 1, 1), + new Object[] {" B ", " C ", "BMB", 'M', + new ItemStack(ICBMExplosion.itTeBieDaoDan, 1, 0), 'C', + "calclavia:CIRCUIT_T1", 'B', "ingotBronze"})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.itTeBieDaoDan, 1, 2), + new Object[] {"!", "?", "@", '@', + new ItemStack(ICBMExplosion.itTeBieDaoDan, 1, 0), '?', + new ItemStack(ICBMExplosion.bExplosives, 1, 0), '!', + "calclavia:CIRCUIT_T1"})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.itTeBieDaoDan, 1, 3), + new Object[] { + " ! ", " ? ", "!@!", '@', + new ItemStack(ICBMExplosion.itTeBieDaoDan, 1, 0), '?', + MissileBase.list[ZhaPin.fragmentation.getID()].getItemStack(), '!', + new ItemStack(ICBMExplosion.itDaoDan, 1, 0)})); + GameRegistry.addRecipe((IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.itTeBieDaoDan, 1, 4), + new Object[] {" N ", "NCN", 'C', + new ItemStack(ICBMExplosion.itTeBieDaoDan, 1, 3), 'N', + ZhaPin.nuclear.getItemStack()})); + for (int i = 0; i < ZhaPin.E_SI_ID; ++i) { + RecipeHelper.addRecipe( + (IRecipe) new ShapelessOreRecipe( + new ItemStack(ICBMExplosion.itDaoDan, 1, i), + new Object[] {new ItemStack(ICBMExplosion.itTeBieDaoDan, 1, 0), + new ItemStack(ICBMExplosion.bExplosives, 1, i)}), + ZhaPin.list[i].getUnlocalizedName() + " Missile", + MainBase.CONFIGURATION, true); + if (i < ZhaPin.E_YI_ID) { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.itShouLiuDan, 1, i), + new Object[] {"?", "@", '@', + new ItemStack(ICBMExplosion.bExplosives, 1, i), + '?', Items.string}), + ZhaPin.list[i].getUnlocalizedName() + " Grenade", + MainBase.CONFIGURATION, true); + } + if (i < ZhaPin.E_ER_ID) { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + new ItemStack(ICBMExplosion.itChe, 1, i), + new Object[] {"?", "@", '?', + new ItemStack(ICBMExplosion.bExplosives, 1, i), + '@', Items.minecart}), + ZhaPin.list[i].getUnlocalizedName() + " Minecart", + MainBase.CONFIGURATION, true); + } + } + EntityRegistry.registerGlobalEntityID( + EExplosive.class, "ICBMExplosive", + EntityRegistry.findGlobalUniqueEntityId()); + EntityRegistry.registerGlobalEntityID( + EMissile.class, "ICBMMissile", + EntityRegistry.findGlobalUniqueEntityId()); + EntityRegistry.registerGlobalEntityID( + EExplosion.class, "ICBMProceduralExplosion", + EntityRegistry.findGlobalUniqueEntityId()); + EntityRegistry.registerGlobalEntityID( + EGravityBlock.class, "ICBMGravityBlock", + EntityRegistry.findGlobalUniqueEntityId()); + EntityRegistry.registerGlobalEntityID( + ELightBeam.class, "ICBMLightBeam", + EntityRegistry.findGlobalUniqueEntityId()); + EntityRegistry.registerGlobalEntityID( + ESuiPian.class, "ICBMFragment", + EntityRegistry.findGlobalUniqueEntityId()); + EntityRegistry.registerGlobalEntityID( + EGrenade.class, "ICBMGrenade", + EntityRegistry.findGlobalUniqueEntityId()); + EntityRegistry.registerGlobalEntityID( + ECart.class, "ICBMChe", EntityRegistry.findGlobalUniqueEntityId()); + EntityRegistry.registerModEntity(EExplosive.class, "ICBMExplosive", 50, + (Object)this, 50, 5, true); + EntityRegistry.registerModEntity(EMissile.class, "ICBMMissile", 51, + (Object)this, 500, 1, true); + EntityRegistry.registerModEntity(EExplosion.class, + "ICBMProceduralExplosion", 52, + (Object)this, 100, 5, true); + EntityRegistry.registerModEntity(EGravityBlock.class, "ICBMGravityBlock", + 53, (Object)this, 50, 15, true); + EntityRegistry.registerModEntity(ELightBeam.class, "ICBMLightBeam", 54, + (Object)this, 80, 5, true); + EntityRegistry.registerModEntity(ESuiPian.class, "ICBMFragment", 55, + (Object)this, 40, 8, true); + EntityRegistry.registerModEntity(EGrenade.class, "ICBMGrenade", 56, + (Object)this, 50, 5, true); + EntityRegistry.registerModEntity(ECart.class, "ICBMChe", 58, (Object)this, + 50, 4, true); + ICBMExplosion.proxy.init(); + } + + public static boolean shiBaoHu(final World world, final Vector3 diDian, + final ZhaPin.ZhaPinType type, + final ZhaPin zhaPin) { + if (FlagRegistry.getModFlag("ModFlags") == null) { + return false; + } + if (FlagRegistry.getModFlag("ModFlags") + .containsValue(world, ICBMFlags.FLAG_BAN_GLOBAL, "true", diDian)) { + return true; + } + boolean baoHu = false; + switch (type) { + case QUAN_BU: { + baoHu = (FlagRegistry.getModFlag("ModFlags") + .containsValue(world, ICBMFlags.FLAG_BAN_MINECART, "true", + diDian) || + FlagRegistry.getModFlag("ModFlags") + .containsValue(world, ICBMFlags.FLAG_BAN_MISSILE, "true", + diDian) || + FlagRegistry.getModFlag("ModFlags") + .containsValue(world, ICBMFlags.FLAG_BAN_GRENADE, "true", + diDian) || + FlagRegistry.getModFlag("ModFlags") + .containsValue(world, ICBMFlags.FLAG_BAN_EXPLOSIVE, "true", + diDian)); + break; + } + case CHE: { + baoHu = FlagRegistry.getModFlag("ModFlags") + .containsValue(world, ICBMFlags.FLAG_BAN_MINECART, "true", + diDian); + break; + } + case DAO_DAN: { + baoHu = + FlagRegistry.getModFlag("ModFlags") + .containsValue(world, ICBMFlags.FLAG_BAN_MISSILE, "true", diDian); + break; + } + case SHOU_LIU_DAN: { + baoHu = + FlagRegistry.getModFlag("ModFlags") + .containsValue(world, ICBMFlags.FLAG_BAN_GRENADE, "true", diDian); + break; + } + case ZHA_DAN: { + baoHu = FlagRegistry.getModFlag("ModFlags") + .containsValue(world, ICBMFlags.FLAG_BAN_EXPLOSIVE, "true", + diDian); + break; + } + } + return FlagRegistry.getModFlag("ModFlags") + .containsValue(world, zhaPin.qiZi, "true", diDian) || + baoHu; + } + + public static boolean shiBaoHu(final World world, final Vector3 diDian, + final ZhaPin.ZhaPinType type, + final int zhaPinID) { + return zhaPinID < ZhaPin.list.length && zhaPinID >= 0 && + shiBaoHu(world, diDian, type, ZhaPin.list[zhaPinID]); + } + + @Mod.EventHandler + @Override + public void serverStarting(final FMLServerStartingEvent event) { + super.serverStarting(event); + final ICommandManager commandManager = FMLCommonHandler.instance() + .getMinecraftServerInstance() + .getCommandManager(); + final ServerCommandManager serverCommandManager = + (ServerCommandManager)commandManager; + serverCommandManager.registerCommand((ICommand) new ICBMCommand()); + } + + @Override + protected String getChannel() { + return "ICBM|E"; + } + + static { + DU_DU = new Du("Chemical", 1, false); + DU_CHUAN_RAN = new Du("Contagious", 1, true); + ICBMExplosion.USE_FUEL = true; + } +} diff --git a/src/main/java/icbm/zhapin/ItemUsePacket.java b/src/main/java/icbm/zhapin/ItemUsePacket.java new file mode 100644 index 0000000..3ca3291 --- /dev/null +++ b/src/main/java/icbm/zhapin/ItemUsePacket.java @@ -0,0 +1,46 @@ +package icbm.zhapin; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import io.netty.buffer.ByteBuf; +import universalelectricity.core.vector.Vector3; + +public class ItemUsePacket implements IMessage { + Type type; + Vector3 pos; + + public ItemUsePacket(Type type, Vector3 pos) { + this.type = type; + this.pos = pos; + } + + public ItemUsePacket() { + } + + @Override + public void fromBytes(ByteBuf buf) { + this.type = Type.get(buf.readInt()); + this.pos = new Vector3(buf.readInt(), buf.readInt(), buf.readInt()); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(this.type.ordinal()); + buf.writeInt(this.pos.intX()); + buf.writeInt(this.pos.intY()); + buf.writeInt(this.pos.intZ()); + } + + public enum Type { + UNSPECIFIED, + RADAR_GUN, + LASER_DESIGNATOR, + REMOTE; + + public static Type get(final int id) { + if (id >= 0 && id < values().length) { + return values()[id]; + } + return Type.UNSPECIFIED; + } + } +} diff --git a/src/main/java/icbm/zhapin/ItemUsePacketHandler.java b/src/main/java/icbm/zhapin/ItemUsePacketHandler.java new file mode 100644 index 0000000..a96d63e --- /dev/null +++ b/src/main/java/icbm/zhapin/ItemUsePacketHandler.java @@ -0,0 +1,66 @@ +package icbm.zhapin; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import icbm.zhapin.dianqi.ItLaserDesignator; +import icbm.zhapin.dianqi.ItRadarGun; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import universalelectricity.core.electricity.ElectricityPack; +import universalelectricity.core.vector.Vector3; + +public class ItemUsePacketHandler + implements IMessageHandler { + + @Override + public IMessage onMessage(ItemUsePacket message, MessageContext ctx) { + EntityPlayer player = ctx.getServerHandler().playerEntity; + + if (message.type == ItemUsePacket.Type.RADAR_GUN) { + if (player.inventory.getCurrentItem().getItem() instanceof ItRadarGun) { + final ItemStack itemStack = player.inventory.getCurrentItem(); + if (itemStack.stackTagCompound == null) { + itemStack.setTagCompound(new NBTTagCompound()); + } + itemStack.stackTagCompound.setInteger("x", message.pos.intX()); + itemStack.stackTagCompound.setInteger("y", message.pos.intY()); + itemStack.stackTagCompound.setInteger("z", message.pos.intZ()); + ICBMExplosion.itLeiDaQiang.onProvide( + ElectricityPack.getFromWatts( + 1000.0, ICBMExplosion.itLeiDaQiang.getVoltage(itemStack)), + itemStack); + } + } else if (message.type == ItemUsePacket.Type.LASER_DESIGNATOR) { + if (player.inventory.getCurrentItem().getItem() instanceof ItLaserDesignator) { + final ItemStack itemStack = player.inventory.getCurrentItem(); + final Vector3 position = message.pos; + ((ItLaserDesignator) ICBMExplosion.itLeiSheZhiBiao) + .setLauncherCountDown(itemStack, 119); + player.worldObj.playSoundEffect( + position.intX(), + player.worldObj.getHeightValue(position.intX(), position.intZ()), + position.intZ(), "icbm.airstrike", 5.0f, + (1.0f + (player.worldObj.rand.nextFloat() - + player.worldObj.rand.nextFloat()) * + 0.2f) * + 0.7f); + player.worldObj.spawnEntityInWorld( + new ELightBeam(player.worldObj, position, 100, 0.0f, 1.0f, 0.0f)); + ICBMExplosion.itLeiDaQiang.onProvide( + ElectricityPack.getFromWatts( + 6000.0, ICBMExplosion.itLeiDaQiang.getVoltage(itemStack)), + itemStack); + } + } else if (message.type == ItemUsePacket.Type.REMOTE) { + final ItemStack itemStack = player.inventory.getCurrentItem(); + ICBMExplosion.itYaoKong.onProvide( + ElectricityPack.getFromWatts( + 1500.0, ICBMExplosion.itYaoKong.getVoltage(itemStack)), + itemStack); + } + + return null; + } +} diff --git a/src/main/java/icbm/zhapin/TickHandler.java b/src/main/java/icbm/zhapin/TickHandler.java new file mode 100644 index 0000000..a433a25 --- /dev/null +++ b/src/main/java/icbm/zhapin/TickHandler.java @@ -0,0 +1,33 @@ +package icbm.zhapin; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public class TickHandler { + @SubscribeEvent + public void onTick(PlayerTickEvent ev) { + if (ev.phase == TickEvent.Phase.START) + tickStart(ev.player); + } + + public void tickStart(final EntityPlayer player) { + try { + final ItemStack currentItem = player.getCurrentEquippedItem(); + if (currentItem != null && + (player != Minecraft.getMinecraft().renderViewEntity || + Minecraft.getMinecraft().gameSettings.thirdPersonView != 0) + && + currentItem.getItem() == ICBMExplosion.itFaSheQi && + player.getItemInUseCount() <= 0) { + player.setItemInUse(currentItem, Integer.MAX_VALUE); + } + } catch (final Exception e) { + System.out.println("ICBM|Explosion failed to tick properly."); + e.printStackTrace(); + } + } +} diff --git a/src/main/java/icbm/zhapin/cart/ECart.java b/src/main/java/icbm/zhapin/cart/ECart.java new file mode 100644 index 0000000..a7eec29 --- /dev/null +++ b/src/main/java/icbm/zhapin/cart/ECart.java @@ -0,0 +1,109 @@ +package icbm.zhapin.cart; + +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import icbm.api.explosion.IExplosive; +import icbm.api.explosion.IExplosiveContainer; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityMinecart; +import net.minecraft.entity.item.EntityMinecartTNT; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class ECart extends EntityMinecartTNT + implements IExplosiveContainer, IEntityAdditionalSpawnData { + public int haoMa; + + public ECart(final World par1World) { + super(par1World); + this.haoMa = 0; + } + + public ECart(final World par1World, final double x, final double y, + final double z, final int explosiveID) { + super(par1World, x, y, z); + this.haoMa = 0; + this.haoMa = explosiveID; + } + + @Override + public void writeSpawnData(final ByteBuf data) { + data.writeInt(this.haoMa); + } + + @Override + public void readSpawnData(final ByteBuf data) { + this.haoMa = data.readInt(); + } + + @Override + protected void explodeCart(final double par1) { + ((Entity)this) + .worldObj.spawnParticle("hugeexplosion", ((Entity)this).posX, + ((Entity)this).posY, ((Entity)this).posZ, 0.0, + 0.0, 0.0); + ZhaPin.createExplosion(((Entity)this).worldObj, new Vector3((Entity)this), + (Entity)this, this.haoMa); + this.setDead(); + } + + @Override + public void killMinecart(final DamageSource par1DamageSource) { + this.setDead(); + final ItemStack itemstack = new ItemStack(Items.minecart, 1); + if (((EntityMinecart)this).getCommandSenderName() != null) { + itemstack.setStackDisplayName( + ((EntityMinecart)this).getCommandSenderName()); + } + this.entityDropItem(itemstack, 0.0f); + final double d0 = ((Entity)this).motionX * ((Entity)this).motionX + + ((Entity)this).motionZ * ((Entity)this).motionZ; + if (!par1DamageSource.isExplosion()) { + this.entityDropItem(new ItemStack(ICBMExplosion.bExplosives, 1, this.haoMa), + 0.0f); + } + if (par1DamageSource.isFireDamage() || par1DamageSource.isExplosion() || + d0 >= 0.009999999776482582) { + this.explodeCart(d0); + } + } + + @Override + public ItemStack getCartItem() { + return new ItemStack(ICBMExplosion.itChe, 1, this.haoMa); + } + + @Override + protected void writeEntityToNBT(final NBTTagCompound par1NBTTagCompound) { + super.writeEntityToNBT(par1NBTTagCompound); + par1NBTTagCompound.setInteger("haoMa", this.haoMa); + } + + @Override + protected void readEntityFromNBT(final NBTTagCompound par1NBTTagCompound) { + super.readEntityFromNBT(par1NBTTagCompound); + this.haoMa = par1NBTTagCompound.getInteger("haoMa"); + } + + @Override + public IExplosive getExplosiveType() { + return ZhaPin.list[this.haoMa]; + } + + @Override + public Block func_145817_o() { + return ICBMExplosion.bExplosives; + } + + @Override + public int getDefaultDisplayTileData() { + return this.haoMa; + } +} diff --git a/src/main/java/icbm/zhapin/cart/ItCart.java b/src/main/java/icbm/zhapin/cart/ItCart.java new file mode 100644 index 0000000..c230e90 --- /dev/null +++ b/src/main/java/icbm/zhapin/cart/ItCart.java @@ -0,0 +1,69 @@ +package icbm.zhapin.cart; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.ItICBM; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.block.BlockRailBase; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ItCart extends ItICBM { + public ItCart() { + super("minecart"); + this.setMaxStackSize(1); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + @Override + public boolean onItemUse(final ItemStack par1ItemStack, + final EntityPlayer par2EntityPlayer, + final World par3World, final int x, final int y, + final int z, final int par7, final float par8, + final float par9, final float par10) { + final Block var11 = par3World.getBlock(x, y, z); + if (BlockRailBase.func_150051_a(var11)) { + if (!par3World.isRemote) { + par3World.spawnEntityInWorld( + (Entity) new ECart(par3World, x + 0.5f, y + 0.5f, z + 0.5f, + par1ItemStack.getItemDamage())); + } + --par1ItemStack.stackSize; + return true; + } + return false; + } + + @Override + public int getMetadata(final int damage) { + return damage; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(final IIconRegister iconRegister) { + this.itemIcon = iconRegister.registerIcon("minecart_tnt"); + } + + @Override + public String getUnlocalizedName(final ItemStack itemstack) { + return "icbm.minecart." + + ZhaPin.list[itemstack.getItemDamage()].getUnlocalizedName(); + } + + @Override + public void getSubItems(final Item par1, final CreativeTabs par2CreativeTabs, + final List par3List) { + for (int metadata = 0; metadata < ZhaPin.E_ER_ID; ++metadata) { + par3List.add(new ItemStack(par1, 1, metadata)); + } + } +} diff --git a/src/main/java/icbm/zhapin/daodan/DAntiBallistic.java b/src/main/java/icbm/zhapin/daodan/DAntiBallistic.java new file mode 100644 index 0000000..1111f81 --- /dev/null +++ b/src/main/java/icbm/zhapin/daodan/DAntiBallistic.java @@ -0,0 +1,81 @@ +package icbm.zhapin.daodan; + +import icbm.api.IMissileLockable; +import icbm.api.explosion.ExplosionEvent; +import net.minecraft.entity.Entity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.MinecraftForge; +import universalelectricity.core.vector.Vector3; + +public class DAntiBallistic extends MissileBase { + public static final int ABMRange = 30; + + protected DAntiBallistic(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public void update(final EMissile missileObj) { + if (missileObj.lockedTarget == null) { + final AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox( + missileObj.posX - 30.0, missileObj.posY - 30.0, + missileObj.posZ - 30.0, missileObj.posX + 30.0, + missileObj.posY + 30.0, missileObj.posZ + 30.0); + final Entity nearestEntity = + missileObj.worldObj.findNearestEntityWithinAABB( + IMissileLockable.class, bounds, (Entity)missileObj); + if (nearestEntity instanceof IMissileLockable) { + if (((IMissileLockable)nearestEntity).canLock(missileObj)) { + missileObj.lockedTarget = nearestEntity; + missileObj.didTargetLockBefore = true; + missileObj.worldObj.playSoundAtEntity( + (Entity)missileObj, "icbm.targetlocked", 5.0f, 0.9f); + } + } else { + missileObj.motionX = missileObj.xDiff / missileObj.flightDuration; + missileObj.motionZ = missileObj.zDiff / missileObj.flightDuration; + if (missileObj.didTargetLockBefore) { + missileObj.explode(); + } + } + return; + } + Vector3 guJiDiDian = new Vector3(missileObj.lockedTarget); + if (missileObj.lockedTarget.isDead) { + missileObj.explode(); + return; + } + if (missileObj.lockedTarget instanceof IMissileLockable) { + guJiDiDian = + ((IMissileLockable)missileObj.lockedTarget).getPredictedPosition(4); + } + missileObj.motionX = (guJiDiDian.x - missileObj.posX) * 0.30000001192092896; + missileObj.motionY = (guJiDiDian.y - missileObj.posY) * 0.30000001192092896; + missileObj.motionZ = (guJiDiDian.z - missileObj.posZ) * 0.30000001192092896; + } + + @Override + public void onExplode(final EMissile missileObj) { + missileObj.worldObj.createExplosion((Entity)missileObj, missileObj.posX, + missileObj.posY, missileObj.posZ, 6.0f, + true); + MinecraftForge.EVENT_BUS.post(new ExplosionEvent.PostExplosionEvent( + missileObj.worldObj, missileObj.posX, missileObj.posY, missileObj.posZ, + this)); + } + + @Override + public float getRadius() { + return 6.0f; + } + + @Override + public double getEnergy() { + return 100.0; + } + + @Override + public boolean isCruise() { + return true; + } +} diff --git a/src/main/java/icbm/zhapin/daodan/DCluster.java b/src/main/java/icbm/zhapin/daodan/DCluster.java new file mode 100644 index 0000000..38122f1 --- /dev/null +++ b/src/main/java/icbm/zhapin/daodan/DCluster.java @@ -0,0 +1,49 @@ +package icbm.zhapin.daodan; + +import net.minecraft.entity.Entity; +import universalelectricity.core.vector.Vector3; + +public class DCluster extends MissileBase { + public static final int MAX_CLUSTER = 12; + + protected DCluster(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public void update(final EMissile missileObj) { + if (missileObj.motionY < -0.5) { + if (missileObj.missileCount < 12) { + if (!missileObj.worldObj.isRemote) { + final Vector3 position = new Vector3(missileObj); + final EMissile clusterMissile = new EMissile( + missileObj.worldObj, position, new Vector3(missileObj), 0); + clusterMissile.missileType = EMissile.MissileType.SMALL_MISSILE; + clusterMissile.protectionTicks = 20; + clusterMissile.launch(Vector3.add( + missileObj.target, + new Vector3((missileObj.missileCount - 6) * Math.random() * 6.0, + (missileObj.missileCount - 6) * Math.random() * 6.0, + (missileObj.missileCount - 6) * Math.random() * 6.0))); + missileObj.worldObj.spawnEntityInWorld((Entity)clusterMissile); + } + missileObj.protectionTicks = 20; + ++missileObj.missileCount; + } else { + missileObj.setDead(); + } + } + } + + @Override + public void onExplode(final EMissile missileObj) { + missileObj.worldObj.createExplosion((Entity)missileObj, missileObj.posX, + missileObj.posY, missileObj.posZ, 6.0f, + true); + } + + @Override + public boolean isCruise() { + return false; + } +} diff --git a/src/main/java/icbm/zhapin/daodan/DHoming.java b/src/main/java/icbm/zhapin/daodan/DHoming.java new file mode 100644 index 0000000..8d9c092 --- /dev/null +++ b/src/main/java/icbm/zhapin/daodan/DHoming.java @@ -0,0 +1,109 @@ +package icbm.zhapin.daodan; + +import icbm.api.ITracker; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChatComponentText; +import net.minecraft.world.WorldServer; +import universalelectricity.core.vector.Vector2; +import universalelectricity.core.vector.Vector3; + +public class DHoming extends MissileBase { + protected DHoming(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public void launch(final EMissile missileObj) { + if (!missileObj.worldObj.isRemote) { + final WorldServer worldServer = (WorldServer)missileObj.worldObj; + final Entity trackingEntity = + worldServer.getEntityByID(missileObj.targetEntityId); + if (trackingEntity != null) { + if (trackingEntity == missileObj) { + missileObj.setExplode(); + } + missileObj.target = new Vector3(trackingEntity); + } + } + } + + @Override + public void update(final EMissile missileObj) { + if (missileObj.flyingTicks > missileObj.flightDuration / 2.0f && + missileObj.missileType == EMissile.MissileType.MISSILE) { + final WorldServer worldServer = (WorldServer)missileObj.worldObj; + final Entity trackingEntity = + worldServer.getEntityByID(missileObj.targetEntityId); + if (trackingEntity != null) { + if (trackingEntity == missileObj) { + missileObj.setExplode(); + } + missileObj.target = new Vector3(trackingEntity); + missileObj.missileType = EMissile.MissileType.SMALL_MISSILE; + missileObj.xDiff = missileObj.target.x - missileObj.posX; + missileObj.yDiff = missileObj.target.y - missileObj.posY; + missileObj.zDiff = missileObj.target.z - missileObj.posZ; + missileObj.targetDistance = Vector2.distance( + missileObj.origin.toVector2(), missileObj.target.toVector2()); + missileObj.skyHeight = 150 + (int)(missileObj.targetDistance * 1.8); + missileObj.flightDuration = + (float)Math.max(100.0, 2.4 * missileObj.targetDistance); + missileObj.acceleration = + missileObj.skyHeight * 2.0f / + (missileObj.flightDuration * missileObj.flightDuration); + if (missileObj.smallMissileMotion.equals(new Vector3()) || + missileObj.smallMissileMotion == null) { + final float suDu = 0.3f; + missileObj.smallMissileMotion = new Vector3(); + missileObj.smallMissileMotion.x = + missileObj.xDiff / (missileObj.flightDuration * suDu); + missileObj.smallMissileMotion.y = + missileObj.yDiff / (missileObj.flightDuration * suDu); + missileObj.smallMissileMotion.z = + missileObj.zDiff / (missileObj.flightDuration * suDu); + } + } + } + } + + @Override + public boolean onInteract(final EMissile missileObj, + final EntityPlayer entityPlayer) { + if (!missileObj.worldObj.isRemote && missileObj.flyingTicks <= 0 && + entityPlayer.getCurrentEquippedItem() != null && + entityPlayer.getCurrentEquippedItem().getItem() instanceof ITracker) { + final Entity trackingEntity = + ((ITracker)entityPlayer.getCurrentEquippedItem().getItem()) + .getTrackingEntity(missileObj.worldObj, + entityPlayer.getCurrentEquippedItem()); + if (trackingEntity != null && + missileObj.targetEntityId != trackingEntity.getEntityId()) { + missileObj.targetEntityId = trackingEntity.getEntityId(); + entityPlayer.addChatMessage( + new ChatComponentText("Missile target locked to: " + + trackingEntity.getCommandSenderName())); + if (missileObj.getLauncher() != null && + missileObj.getLauncher().getController() != null) { + final Vector3 newTarget = new Vector3(trackingEntity); + newTarget.y = 0.0; + missileObj.getLauncher().getController().setTarget(newTarget); + } + return true; + } + } + return false; + } + + @Override + public void onExplode(final EMissile missileObj) { + missileObj.worldObj.createExplosion((Entity)missileObj, missileObj.posX, + missileObj.posY, missileObj.posZ, 6.0f, + true); + } + + @Override + public boolean isCruise() { + return false; + } +} diff --git a/src/main/java/icbm/zhapin/daodan/DModule.java b/src/main/java/icbm/zhapin/daodan/DModule.java new file mode 100644 index 0000000..a1b48b4 --- /dev/null +++ b/src/main/java/icbm/zhapin/daodan/DModule.java @@ -0,0 +1,13 @@ +package icbm.zhapin.daodan; + +public class DModule extends MissileBase +{ + public DModule(final String name, final int id, final int tier) { + super(name, id, tier); + } + + @Override + public void onExplode(final EMissile missileObj) { + missileObj.dropMissileAsItem(); + } +} diff --git a/src/main/java/icbm/zhapin/daodan/DNuclearCluster.java b/src/main/java/icbm/zhapin/daodan/DNuclearCluster.java new file mode 100644 index 0000000..675b95f --- /dev/null +++ b/src/main/java/icbm/zhapin/daodan/DNuclearCluster.java @@ -0,0 +1,51 @@ +package icbm.zhapin.daodan; + +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.entity.Entity; +import universalelectricity.core.vector.Vector3; + +public class DNuclearCluster extends DCluster { + public static final int MAX_CLUSTER = 4; + + protected DNuclearCluster(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public void update(final EMissile missileObj) { + if (missileObj.motionY < -0.5) { + if (missileObj.missileCount < 4) { + if (!missileObj.worldObj.isRemote) { + final Vector3 position = new Vector3(missileObj); + final EMissile clusterMissile = + new EMissile(missileObj.worldObj, position, + new Vector3(missileObj), ZhaPin.nuclear.getID()); + missileObj.worldObj.spawnEntityInWorld((Entity)clusterMissile); + clusterMissile.missileType = EMissile.MissileType.SMALL_MISSILE; + clusterMissile.protectionTicks = 20; + clusterMissile.launch(Vector3.add( + missileObj.target, + new Vector3((missileObj.missileCount - 2) * Math.random() * 30.0, + (missileObj.missileCount - 2) * Math.random() * 30.0, + (missileObj.missileCount - 2) * Math.random() * + 30.0))); + } + missileObj.protectionTicks = 20; + ++missileObj.missileCount; + } else { + missileObj.setDead(); + } + } + } + + @Override + public void onExplode(final EMissile missileObj) { + ZhaPin.createExplosion(missileObj.worldObj, new Vector3(missileObj), + missileObj, ZhaPin.nuclear.getID()); + } + + @Override + public boolean isCruise() { + return false; + } +} diff --git a/src/main/java/icbm/zhapin/daodan/EMissile.java b/src/main/java/icbm/zhapin/daodan/EMissile.java new file mode 100644 index 0000000..567f8a1 --- /dev/null +++ b/src/main/java/icbm/zhapin/daodan/EMissile.java @@ -0,0 +1,619 @@ +package icbm.zhapin.daodan; + +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import icbm.api.ILauncherContainer; +import icbm.api.IMissile; +import icbm.api.IMissileLockable; +import icbm.api.RadarRegistry; +import icbm.api.explosion.IExplosive; +import icbm.api.sentry.IAATarget; +import icbm.core.MainBase; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.jiqi.TCruiseLauncher; +import icbm.zhapin.zhapin.ZhaPin; +import io.netty.buffer.ByteBuf; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.gui.IUpdatePlayerListBox; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeChunkManager; +import universalelectricity.core.vector.Vector2; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.TranslationHelper; + +public class EMissile extends Entity implements IMissileLockable, + IEntityAdditionalSpawnData, + IMissile, IAATarget { + public static final float THRUST = 0.012f; + public int missileId; + public int skyHeight; + public Vector3 target; + public Vector3 origin; + public Vector3 launcherPos; + public boolean exploded; + public int explosionHeight; + public int flyingTicks; + public double xDiff; + public double yDiff; + public double zDiff; + public double targetDistance; + public float flightDuration; + public float acceleration; + public int protectionTicks; + private ForgeChunkManager.Ticket chunkTicket; + public Entity lockedTarget; + public boolean didTargetLockBefore; + public int targetEntityId; + public int missileCount; + public double missileHeight; + private boolean setExplode; + private boolean setNormalExplode; + public MissileType missileType; + public Vector3 smallMissileMotion; + private double startHeight; + protected final IUpdatePlayerListBox sound; + + public EMissile(final World par1World) { + super(par1World); + this.missileId = 0; + this.skyHeight = 200; + this.target = null; + this.origin = null; + this.launcherPos = null; + this.exploded = false; + this.explosionHeight = 0; + this.flyingTicks = -1; + this.protectionTicks = 2; + this.didTargetLockBefore = false; + this.targetEntityId = -1; + this.missileCount = 0; + this.missileHeight = 2.0; + this.missileType = MissileType.MISSILE; + this.smallMissileMotion = new Vector3(); + this.startHeight = 3.0; + this.setSize(1.0f, 1.0f); + super.renderDistanceWeight = 3.0; + super.isImmuneToFire = true; + super.ignoreFrustumCheck = true; + this.sound = + ((super.worldObj != null) ? ICBMExplosion.proxy.getDaoDanShengYin(this) + : null); + } + + public EMissile(final World par1World, final Vector3 diDian, + final Vector3 faSheQiDiDian, final int missileId) { + this(par1World); + this.missileId = missileId; + this.origin = diDian; + this.launcherPos = faSheQiDiDian; + this.setPosition(this.origin.x, this.origin.y, this.origin.z); + this.setRotation(0.0f, 90.0f); + } + + public EMissile(final World par1World, final Vector3 diDian, final int haoMa, + final float yaw, final float pitch) { + this(par1World); + this.missileId = haoMa; + this.origin = diDian; + this.launcherPos = diDian; + this.missileType = MissileType.ROCKET; + this.protectionTicks = 10; + this.setPosition(this.origin.x, this.origin.y, this.origin.z); + this.setRotation(yaw, pitch); + } + + @Override + public String getCommandSenderName() { + if (this.missileId >= 100) { + return TranslationHelper.getLocal( + "icbm.missile." + + MissileBase.list[this.missileId].getUnlocalizedName() + ".name"); + } + return TranslationHelper.getLocal( + "icbm.missile." + ZhaPin.list[this.missileId].getUnlocalizedName() + + ".name"); + } + + @Override + public void writeSpawnData(final ByteBuf data) { + try { + data.writeInt(this.missileId); + data.writeInt(this.missileType.ordinal()); + data.writeDouble(this.origin.x); + data.writeDouble(this.origin.y); + data.writeDouble(this.origin.z); + data.writeInt(this.launcherPos.intX()); + data.writeInt(this.launcherPos.intY()); + data.writeInt(this.launcherPos.intZ()); + } catch (final Exception e) { + e.printStackTrace(); + } + } + + @Override + public void readSpawnData(final ByteBuf data) { + try { + this.missileId = data.readInt(); + this.missileType = MissileType.values()[data.readInt()]; + this.origin = + new Vector3(data.readDouble(), data.readDouble(), data.readDouble()); + this.launcherPos = + new Vector3(data.readInt(), data.readInt(), data.readInt()); + } catch (final Exception e) { + e.printStackTrace(); + } + } + + public void launch(final Vector3 target) { + this.origin = new Vector3(this); + this.target = target; + this.explosionHeight = this.target.intY(); + MissileBase.list[this.missileId].launch(this); + this.flyingTicks = 0; + this.jiSuan(); + super.worldObj.playSoundAtEntity((Entity)this, "icbm.missilelaunch", 4.0f, + (1.0f + (super.worldObj.rand.nextFloat() - + super.worldObj.rand.nextFloat()) * + 0.2f) * + 0.7f); + RadarRegistry.register(this); + MainBase.LOGGER.info("Launching " + this.getCommandSenderName() + " from " + + this.origin.intX() + ", " + this.origin.intY() + ", " + + this.origin.intZ() + " to " + this.target.intX() + + ", " + this.target.intY() + ", " + this.target.intZ()); + } + + public void launch(final Vector3 target, final int height) { + this.startHeight = height; + this.launch(target); + } + + public void jiSuan() { + if (this.target != null) { + this.xDiff = this.target.x - this.origin.x; + this.yDiff = this.target.y - this.origin.y; + this.zDiff = this.target.z - this.origin.z; + this.targetDistance = + Vector2.distance(this.origin.toVector2(), this.target.toVector2()); + this.skyHeight = 160 + (int)(this.targetDistance * 3.0); + this.flightDuration = + (float)Math.max(100.0, 2.0 * this.targetDistance) - this.flyingTicks; + this.acceleration = + this.skyHeight * 2.0f / (this.flightDuration * this.flightDuration); + } + } + + @Override + public void entityInit() { + super.dataWatcher.addObject(16, (Object)(-1)); + this.daoDanInit(ForgeChunkManager.requestTicket( + (Object)ICBMExplosion.instance, super.worldObj, + ForgeChunkManager.Type.ENTITY)); + } + + public void daoDanInit(final ForgeChunkManager.Ticket ticket) { + if (ticket != null) { + if (this.chunkTicket == null) { + (this.chunkTicket = ticket).bindEntity((Entity)this); + this.chunkTicket.getModData(); + } + ForgeChunkManager.forceChunk( + this.chunkTicket, + new ChunkCoordIntPair(super.chunkCoordX, super.chunkCoordZ)); + } + } + + public void updateLoadChunk(final int newChunkX, final int newChunkZ) { + if (!super.worldObj.isRemote && MainBase.ZAI_KUAI && + this.chunkTicket != null) { + for (int x = -2; x <= 2; ++x) { + for (int z = -2; z <= 2; ++z) { + super.worldObj.getChunkFromChunkCoords(newChunkX + x, newChunkZ + z); + } + } + for (int x = -1; x <= 1; ++x) { + for (int z = -1; z <= 1; ++z) { + ForgeChunkManager.forceChunk( + this.chunkTicket, + new ChunkCoordIntPair(newChunkX + x, newChunkZ + z)); + } + } + } + } + + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + public void onUpdate() { + if (this.sound != null) { + this.sound.update(); + } + if (!super.worldObj.isRemote && + ICBMExplosion.shiBaoHu(super.worldObj, new Vector3(this), + ZhaPin.ZhaPinType.DAO_DAN, this.missileId)) { + if (this.flyingTicks >= 0) { + this.dropMissileAsItem(); + } + this.setDead(); + return; + } + if (this.setNormalExplode) { + this.normalExplode(); + return; + } + if (this.setExplode) { + this.explode(); + return; + } + try { + if (super.worldObj.isRemote) { + this.flyingTicks = super.dataWatcher.getWatchableObjectInt(16); + } else { + super.dataWatcher.updateObject(16, (Object)this.flyingTicks); + } + } catch (final Exception e) { + e.printStackTrace(); + } + this.updateLoadChunk(super.chunkCoordX, super.chunkCoordZ); + if (this.flyingTicks >= 0) { + RadarRegistry.register(this); + if (!super.worldObj.isRemote) { + if (this.missileType == MissileType.SMALL_MISSILE || + this.missileType == MissileType.ROCKET) { + if (this.flyingTicks == 0 && this.smallMissileMotion != null) { + this.smallMissileMotion = + new Vector3(this.xDiff / (this.flightDuration * 0.3), + this.yDiff / (this.flightDuration * 0.3), + this.zDiff / (this.flightDuration * 0.3)); + } + super.motionX = this.smallMissileMotion.x; + super.motionY = this.smallMissileMotion.y; + super.motionZ = this.smallMissileMotion.z; + super.rotationPitch = + (float)(Math.atan(super.motionY / + Math.sqrt(super.motionX * super.motionX + + super.motionZ * super.motionZ)) * + 180.0 / 3.141592653589793); + super.rotationYaw = (float)(Math.atan2(super.motionX, super.motionZ) * + 180.0 / 3.141592653589793); + MissileBase.list[this.missileId].update(this); + final Block block = super.worldObj.getBlock( + (int)super.posX, (int)super.posY, (int)super.posZ); + if (this.protectionTicks <= 0 && + ((block != Blocks.air && !(block instanceof BlockLiquid)) || + super.posY > 1000.0 || super.isCollided || + this.flyingTicks > 20000 || + (super.motionX == 0.0 && super.motionY == 0.0 && + super.motionZ == 0.0))) { + this.explode(); + return; + } + this.moveEntity(super.motionX, super.motionY, super.motionZ); + } else if (this.startHeight > 0.0) { + super.motionY = 0.012f * this.flyingTicks * (this.flyingTicks / 2); + super.motionX = 0.0; + super.motionZ = 0.0; + this.startHeight -= super.motionY; + this.moveEntity(super.motionX, super.motionY, super.motionZ); + if (this.startHeight <= 0.0) { + super.motionY = this.acceleration * (this.flightDuration / 2.0f); + super.motionX = this.xDiff / this.flightDuration; + super.motionZ = this.zDiff / this.flightDuration; + } + } else { + super.motionY -= this.acceleration; + super.rotationPitch = + (float)(Math.atan(super.motionY / + Math.sqrt(super.motionX * super.motionX + + super.motionZ * super.motionZ)) * + 180.0 / 3.141592653589793); + super.rotationYaw = (float)(Math.atan2(super.motionX, super.motionZ) * + 180.0 / 3.141592653589793); + MissileBase.list[this.missileId].update(this); + this.moveEntity(super.motionX, super.motionY, super.motionZ); + if (super.isCollided) { + this.explode(); + } + if (this.explosionHeight > 0 && super.motionY < 0.0) { + final Block blockBelow = super.worldObj.getBlock( + (int)super.posX, (int)super.posY - this.explosionHeight, + (int)super.posZ); + + if (blockBelow != Blocks.air) { + this.explosionHeight = 0; + this.explode(); + } + } + } + } else { + super.rotationPitch = + (float)(Math.atan(super.motionY / + Math.sqrt(super.motionX * super.motionX + + super.motionZ * super.motionZ)) * + 180.0 / 3.141592653589793); + super.rotationYaw = (float)(Math.atan2(super.motionX, super.motionZ) * + 180.0 / 3.141592653589793); + } + super.lastTickPosX = super.posX; + super.lastTickPosY = super.posY; + super.lastTickPosZ = super.posZ; + this.spawnMissileSmoke(); + --this.protectionTicks; + ++this.flyingTicks; + } else if (this.missileType != MissileType.ROCKET) { + final ILauncherContainer launcher = this.getLauncher(); + if (launcher != null) { + launcher.setContainingMissile(this); + if (launcher instanceof TCruiseLauncher) { + this.missileType = MissileType.SMALL_MISSILE; + super.noClip = true; + if (super.worldObj.isRemote) { + super.rotationYaw = -((TCruiseLauncher)launcher).rotationYaw + 90.0f; + super.rotationPitch = ((TCruiseLauncher)launcher).rotationPitch; + } + super.posY = ((TCruiseLauncher)launcher).yCoord + 1; + } + } else { + this.setDead(); + } + } + super.onUpdate(); + } + + public ILauncherContainer getLauncher() { + if (this.launcherPos != null) { + final TileEntity tileEntity = + this.launcherPos.getTileEntity((IBlockAccess)super.worldObj); + if (tileEntity != null && tileEntity instanceof ILauncherContainer && + !tileEntity.isInvalid()) { + return (ILauncherContainer)tileEntity; + } + } + return null; + } + + @Override + public boolean interactFirst(final EntityPlayer entityPlayer) { + if (MissileBase.list[this.missileId] != null && + MissileBase.list[this.missileId].onInteract(this, entityPlayer)) { + return true; + } + if (!super.worldObj.isRemote && (super.riddenByEntity == null || + super.riddenByEntity == entityPlayer)) { + entityPlayer.mountEntity((Entity)this); + return true; + } + return false; + } + + @Override + public double getMountedYOffset() { + if (this.flightDuration <= 0.0f && this.missileType == MissileType.MISSILE) { + return super.height; + } + if (this.missileType == MissileType.SMALL_MISSILE) { + return super.height * 0.1; + } + return super.height / 2.0f + super.motionY; + } + + private void spawnMissileSmoke() { + if (super.worldObj.isRemote) { + final Vector3 position = new Vector3(this); + final double distance = -this.missileHeight - 0.20000000298023224; + final Vector3 delta = new Vector3(); + delta.y = Math.sin(Math.toRadians(super.rotationPitch)) * distance; + final double dH = + Math.cos(Math.toRadians(super.rotationPitch)) * distance; + delta.x = Math.sin(Math.toRadians(super.rotationYaw)) * dH; + delta.z = Math.cos(Math.toRadians(super.rotationYaw)) * dH; + position.add(delta); + super.worldObj.spawnParticle("flame", position.x, position.y, position.z, + 0.0, 0.0, 0.0); + ICBMExplosion.proxy.spawnParticle("missile_smoke", super.worldObj, + position, 4.0f, 2.0); + position.multiply(1.0 - 0.001 * Math.random()); + ICBMExplosion.proxy.spawnParticle("missile_smoke", super.worldObj, + position, 4.0f, 2.0); + position.multiply(1.0 - 0.001 * Math.random()); + ICBMExplosion.proxy.spawnParticle("missile_smoke", super.worldObj, + position, 4.0f, 2.0); + position.multiply(1.0 - 0.001 * Math.random()); + ICBMExplosion.proxy.spawnParticle("missile_smoke", super.worldObj, + position, 4.0f, 2.0); + } + } + + @Override + public AxisAlignedBB getCollisionBox(final Entity entity) { + if (!(entity instanceof EntityItem) && entity != super.riddenByEntity && + this.protectionTicks <= 0) { + if (entity instanceof EMissile) { + ((EMissile)entity).setNormalExplode(); + } + this.setExplode(); + } + return null; + } + + public Vector3 getPredictedPosition(final int t) { + final Vector3 guJiDiDian = new Vector3(this); + double tempMotionY = super.motionY; + if (this.flyingTicks > 20) { + for (int i = 0; i < t; ++i) { + if (this.missileType == MissileType.SMALL_MISSILE || + this.missileType == MissileType.ROCKET) { + final Vector3 vector3 = guJiDiDian; + vector3.x += this.smallMissileMotion.x; + final Vector3 vector4 = guJiDiDian; + vector4.y += this.smallMissileMotion.y; + final Vector3 vector5 = guJiDiDian; + vector5.z += this.smallMissileMotion.z; + } else { + final Vector3 vector6 = guJiDiDian; + vector6.x += super.motionX; + final Vector3 vector7 = guJiDiDian; + vector7.y += tempMotionY; + final Vector3 vector8 = guJiDiDian; + vector8.z += super.motionZ; + tempMotionY -= this.acceleration; + } + } + } + return guJiDiDian; + } + + public void setNormalExplode() { this.setNormalExplode = true; } + + public void setExplode() { this.setExplode = true; } + + @Override + public void setDead() { + RadarRegistry.unregister(this); + if (this.chunkTicket != null) { + ForgeChunkManager.releaseTicket(this.chunkTicket); + } + super.setDead(); + if (this.sound != null) { + this.sound.update(); + } + } + + public void explode() { + try { + if (!this.exploded) { + if (this.missileId == 0) { + if (!super.worldObj.isRemote) { + super.worldObj.createExplosion((Entity)this, super.posX, super.posY, + super.posZ, 5.0f, true); + } + } else { + MissileBase.list[this.missileId].onExplode(this); + } + this.exploded = true; + MainBase.LOGGER.info(this.getCommandSenderName() + " exploded in " + + (int)super.posX + ", " + (int)super.posY + ", " + + (int)super.posZ); + } + this.setDead(); + } catch (final Exception e) { + MainBase.LOGGER.severe( + "Missile failed to explode properly. Report this to the developers."); + e.printStackTrace(); + } + } + + public void normalExplode() { + if (!this.exploded) { + this.exploded = true; + if (!super.worldObj.isRemote) { + super.worldObj.createExplosion((Entity)this, super.posX, super.posY, + super.posZ, 5.0f, true); + } + this.setDead(); + } + } + + public void dropMissileAsItem() { + if (!this.exploded && !super.worldObj.isRemote) { + EntityItem entityItem; + if (this.missileId >= 100) { + entityItem = new EntityItem( + super.worldObj, super.posX, super.posY, super.posZ, + new ItemStack(ICBMExplosion.itTeBieDaoDan, 1, this.missileId - 100)); + } else { + entityItem = new EntityItem( + super.worldObj, super.posX, super.posY, super.posZ, + new ItemStack(ICBMExplosion.itDaoDan, 1, this.missileId)); + } + final float var13 = 0.05f; + final Random random = new Random(); + ((Entity)entityItem).motionX = (float)random.nextGaussian() * var13; + ((Entity)entityItem).motionY = + (float)random.nextGaussian() * var13 + 0.2f; + ((Entity)entityItem).motionZ = (float)random.nextGaussian() * var13; + super.worldObj.spawnEntityInWorld((Entity)entityItem); + } + this.setDead(); + } + + @Override + protected void readEntityFromNBT(final NBTTagCompound nbt) { + this.origin = Vector3.readFromNBT(nbt.getCompoundTag("kaiShi")); + this.target = Vector3.readFromNBT(nbt.getCompoundTag("muBiao")); + this.launcherPos = Vector3.readFromNBT(nbt.getCompoundTag("faSheQi")); + this.acceleration = nbt.getFloat("jiaSu"); + this.explosionHeight = nbt.getInteger("baoZhaGaoDu"); + this.missileId = nbt.getInteger("haoMa"); + this.flyingTicks = nbt.getInteger("feiXingTick"); + this.startHeight = nbt.getDouble("qiFeiGaoDu"); + this.missileType = MissileType.values()[nbt.getInteger("xingShi")]; + } + + @Override + protected void writeEntityToNBT(final NBTTagCompound nbt) { + nbt.setTag("kaiShi", this.origin.writeToNBT(new NBTTagCompound())); + if (this.target != null) { + nbt.setTag("muBiao", this.target.writeToNBT(new NBTTagCompound())); + } + if (this.launcherPos != null) { + nbt.setTag("faSheQi", this.launcherPos.writeToNBT(new NBTTagCompound())); + } + nbt.setFloat("jiaSu", this.acceleration); + nbt.setInteger("haoMa", this.missileId); + nbt.setInteger("baoZhaGaoDu", this.explosionHeight); + nbt.setInteger("feiXingTick", this.flyingTicks); + nbt.setDouble("qiFeiGaoDu", this.startHeight); + nbt.setInteger("xingShi", this.missileType.ordinal()); + } + + @Override + public float getShadowSize() { + return 1.0f; + } + + @Override + public int getTicksInAir() { + return this.flyingTicks; + } + + public IExplosive getExplosiveType() { + if (this.missileId > ZhaPin.list.length) { + return MissileBase.list[this.missileId]; + } + return ZhaPin.list[this.missileId]; + } + + public boolean canLock(final IMissile missile) { + return this.flyingTicks > 0; + } + + public void destroyCraft() { this.normalExplode(); } + + public int doDamage(final int damage) { return -1; } + + @Override + public boolean canBeTargeted(final Object turret) { + return this.getTicksInAir() > 0; + } + + public enum MissileType { + MISSILE, + SMALL_MISSILE, + ROCKET; + } +} diff --git a/src/main/java/icbm/zhapin/daodan/ItMissile.java b/src/main/java/icbm/zhapin/daodan/ItMissile.java new file mode 100644 index 0000000..ded704d --- /dev/null +++ b/src/main/java/icbm/zhapin/daodan/ItMissile.java @@ -0,0 +1,36 @@ +package icbm.zhapin.daodan; + +import icbm.core.di.ItICBM; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.List; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class ItMissile extends ItICBM { + public ItMissile(final String name) { + super(name); + this.setMaxDamage(0); + this.setHasSubtypes(true); + this.setMaxStackSize(1); + } + + public int getMetadata(final int damage) { return damage; } + + public String getUnlocalizedName(final ItemStack itemStack) { + if (itemStack.getItemDamage() < ZhaPin.list.length) { + return this.getUnlocalizedName() + "." + + ZhaPin.list[itemStack.getItemDamage()].getUnlocalizedName(); + } + return ""; + } + + public String getUnlocalizedName() { return "icbm.missile"; } + + public void getSubItems(final int par1, final CreativeTabs par2CreativeTabs, + final List par3List) { + for (int i = 0; i < ZhaPin.E_SI_ID; ++i) { + par3List.add(new ItemStack((Item)this, 1, i)); + } + } +} diff --git a/src/main/java/icbm/zhapin/daodan/ItModuleMissile.java b/src/main/java/icbm/zhapin/daodan/ItModuleMissile.java new file mode 100644 index 0000000..cc355bc --- /dev/null +++ b/src/main/java/icbm/zhapin/daodan/ItModuleMissile.java @@ -0,0 +1,43 @@ +package icbm.zhapin.daodan; + +import net.minecraft.item.Item; +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.item.ItemStack; + +public class ItModuleMissile extends ItMissile +{ + public ItModuleMissile() { + super("specialMissile"); + } + + @Override + public String getUnlocalizedName(final ItemStack itemstack) { + if (itemstack.getItemDamage() == 0) { + return this.getUnlocalizedName() + ".missileModule"; + } + return this.getUnlocalizedName() + "." + MissileBase.list[itemstack.getItemDamage() + 100].getUnlocalizedName(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(final IIconRegister iconRegister) { + this.itemIcon = iconRegister.registerIcon("icbm:missileModule"); + } + + @Override + public String getUnlocalizedName() { + return "icbm.missile"; + } + + @Override + public void getSubItems(final int par1, final CreativeTabs par2CreativeTabs, final List par3List) { + for (int i = 0; i < 5; ++i) { + par3List.add(new ItemStack((Item)this, 1, i)); + } + } +} diff --git a/src/main/java/icbm/zhapin/daodan/MissileBase.java b/src/main/java/icbm/zhapin/daodan/MissileBase.java new file mode 100644 index 0000000..a530a16 --- /dev/null +++ b/src/main/java/icbm/zhapin/daodan/MissileBase.java @@ -0,0 +1,117 @@ +package icbm.zhapin.daodan; + +import icbm.api.explosion.IExplosive; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.TranslationHelper; +import universalelectricity.prefab.implement.ITier; + +public class MissileBase implements ITier, IExplosive { + public static final MissileBase missileModule; + public static final MissileBase homing; + public static final MissileBase antiBallistic; + public static final MissileBase cluster; + public static final MissileBase nuclearCluster; + public static final int MAX_DAO_DAN = 4; + public static MissileBase[] list; + private String mingZi; + private int ID; + private int tier; + + public MissileBase(final String name, final int ID, final int tier) { + if (MissileBase.list == null) { + MissileBase.list = new MissileBase[256]; + } + if (MissileBase.list[ID] != null) { + throw new IllegalArgumentException( + "Missile " + ID + " is already occupied when adding " + this + "!"); + } + MissileBase.list[ID] = this; + this.mingZi = name; + this.tier = tier; + this.ID = ID; + } + + @Override + public int getID() { + return this.ID; + } + + @Override + public String getUnlocalizedName() { + return this.mingZi; + } + + public String getTranslatedMing() { + return TranslationHelper.getLocal("icbm.missile." + this.mingZi); + } + + @Override + public int getTier() { + return this.tier; + } + + @Override + public void setTier(final int tier) {} + + public void launch(final EMissile missileObj) {} + + public void update(final EMissile missileObj) {} + + public boolean onInteract(final EMissile missileObj, + final EntityPlayer par1EntityPlayer) { + return false; + } + + public void onExplode(final EMissile missileObj) { + ZhaPin.createExplosion(missileObj.worldObj, new Vector3(missileObj), + missileObj, missileObj.missileId); + } + + public ItemStack getItemStack() { + return new ItemStack(ICBMExplosion.itDaoDan, 1, this.getID()); + } + + public boolean isCruise() { return true; } + + @Override + public String getExplosiveName() { + return this.getTranslatedMing(); + } + + @Override + public String getGrenadeName() { + return this.getTranslatedMing(); + } + + @Override + public String getMissileName() { + return this.getTranslatedMing(); + } + + @Override + public String getMinecartName() { + return this.getTranslatedMing(); + } + + @Override + public float getRadius() { + return 0.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } + + static { + missileModule = new DModule("missileModule", 100, 1); + homing = new DHoming("homing", 101, 1); + antiBallistic = new DAntiBallistic("antiBallistic", 102, 2); + cluster = new DCluster("cluster", 103, 2); + nuclearCluster = new DNuclearCluster("nuclearCluster", 104, 3); + } +} diff --git a/src/main/java/icbm/zhapin/daodan/MissileSound.java b/src/main/java/icbm/zhapin/daodan/MissileSound.java new file mode 100644 index 0000000..7d6d7b1 --- /dev/null +++ b/src/main/java/icbm/zhapin/daodan/MissileSound.java @@ -0,0 +1,124 @@ +package icbm.zhapin.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.audio.SoundManager; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.server.gui.IUpdatePlayerListBox; +import net.minecraft.util.MathHelper; + +@SideOnly(Side.CLIENT) +public class MissileSound implements IUpdatePlayerListBox { + private final SoundManager theSoundManager; + private final EMissile entity; + private final EntityPlayerSP thePlayer; + private boolean playerSPRidingMinecart; + private boolean minecartIsDead; + private boolean minecartIsMoving; + private boolean silent; + private float minecartSoundPitch; + private float minecartMoveSoundVolume; + private float minecartRideSoundVolume; + private double minecartSpeed; + + public MissileSound(final SoundManager par1SoundManager, + final EMissile entity, + final EntityPlayerSP par3EntityPlayerSP) { + this.playerSPRidingMinecart = false; + this.minecartIsDead = false; + this.minecartIsMoving = false; + this.silent = false; + this.minecartSoundPitch = 0.0f; + this.minecartMoveSoundVolume = 0.0f; + this.minecartRideSoundVolume = 0.0f; + this.minecartSpeed = 0.0; + this.theSoundManager = par1SoundManager; + this.entity = entity; + this.thePlayer = par3EntityPlayerSP; + } + + @Override + public void update() { + boolean var1 = false; + final boolean var2 = this.playerSPRidingMinecart; + final boolean var3 = this.minecartIsDead; + final boolean var4 = this.minecartIsMoving; + final float var5 = this.minecartMoveSoundVolume; + final float var6 = this.minecartSoundPitch; + final float var7 = this.minecartRideSoundVolume; + this.playerSPRidingMinecart = (this.thePlayer != null && + this.entity.riddenByEntity == this.thePlayer); + this.minecartIsDead = this.entity.isDead; + this.minecartSpeed = 20.0; + this.minecartIsMoving = (this.minecartSpeed >= 0.01); + if (var2 && !this.playerSPRidingMinecart) { + // TODO: WTF + // this.theSoundManager.stopEntitySound((Entity)this.thePlayer); + } + if (this.minecartIsDead || + (!this.silent && this.minecartMoveSoundVolume == 0.0f && + this.minecartRideSoundVolume == 0.0f)) { + // TODO: WTF + // if (!var3) { + // this.theSoundManager.stopEntitySound((Entity)this.entity); + // if (var2 || this.playerSPRidingMinecart) { + // this.theSoundManager.stopEntitySound((Entity)this.thePlayer); + // } + // } + this.silent = true; + if (this.minecartIsDead) { + return; + } + } + if (this.theSoundManager != null && this.entity != null && + this.minecartMoveSoundVolume > 0.0f) { + //TODO: WTF + //this.theSoundManager.playEntitySound("icbm.missileinair", + // (Entity) this.entity, 7.0f, + // this.minecartSoundPitch, true); + this.silent = false; + var1 = true; + } + if (this.entity.getTicksInAir() > 0) { + if (this.minecartSoundPitch < 1.0f) { + this.minecartSoundPitch += 0.0025f; + } + if (this.minecartSoundPitch > 1.0f) { + this.minecartSoundPitch = 1.0f; + } + float var8 = MathHelper.clamp_float((float) this.minecartSpeed, 0.0f, 4.0f) / 4.0f; + this.minecartRideSoundVolume = 0.0f + var8 * 0.75f; + var8 = MathHelper.clamp_float(var8 * 2.0f, 0.0f, 1.0f); + this.minecartMoveSoundVolume = 0.0f + var8 * 6.7f; + if (this.entity.posY > 1000.0) { + this.minecartMoveSoundVolume = 0.0f; + this.minecartRideSoundVolume = 0.0f; + } + } else if (var4) { + this.minecartMoveSoundVolume = 0.0f; + this.minecartSoundPitch = 0.0f; + this.minecartRideSoundVolume = 0.0f; + } + if (!this.silent) { + if (this.minecartSoundPitch != var6) { + //this.theSoundManager.setEntitySoundPitch((Entity) this.entity, + // this.minecartSoundPitch); + } + if (this.minecartMoveSoundVolume != var5) { + //this.theSoundManager.setEntitySoundVolume((Entity) this.entity, + // this.minecartMoveSoundVolume); + } + if (this.minecartRideSoundVolume != var7) { + //this.theSoundManager.setEntitySoundVolume((Entity) this.thePlayer, + // this.minecartRideSoundVolume); + } + } + if (!var1) { + //this.theSoundManager.updateSoundLocation((Entity) this.entity); + if (this.playerSPRidingMinecart) { + //this.theSoundManager.updateSoundLocation((Entity) this.thePlayer, + // (Entity) this.entity); + } + } + } +} diff --git a/src/main/java/icbm/zhapin/dianqi/ItDefuser.java b/src/main/java/icbm/zhapin/dianqi/ItDefuser.java new file mode 100644 index 0000000..09f2a97 --- /dev/null +++ b/src/main/java/icbm/zhapin/dianqi/ItDefuser.java @@ -0,0 +1,72 @@ +package icbm.zhapin.dianqi; + +import icbm.core.di.ItElectricICBM; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.cart.ECart; +import icbm.zhapin.zhapin.EExplosive; +import java.util.Random; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.item.EntityTNTPrimed; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.DamageSource; +import universalelectricity.core.electricity.ElectricityPack; + +public class ItDefuser extends ItElectricICBM { + public ItDefuser() { + super("defuser"); + this.setTextureName("icbm:defuser"); + } + + public boolean onLeftClickEntity(final ItemStack itemStack, + final EntityPlayer player, + final Entity entity) { + if (this.getJoules(itemStack) > 2000.0) { + if (entity instanceof EExplosive) { + if (!entity.worldObj.isRemote) { + final EExplosive entityTNT = (EExplosive)entity; + final EntityItem entityItem = new EntityItem( + entity.worldObj, entity.posX, entity.posY, entity.posZ, + new ItemStack(ICBMExplosion.bExplosives, 1, entityTNT.haoMa)); + final float var13 = 0.05f; + final Random random = new Random(); + ((Entity)entityItem).motionX = (float)random.nextGaussian() * var13; + ((Entity)entityItem).motionY = + (float)random.nextGaussian() * var13 + 0.2f; + ((Entity)entityItem).motionZ = (float)random.nextGaussian() * var13; + entity.worldObj.spawnEntityInWorld((Entity)entityItem); + } + entity.setDead(); + } else if (entity instanceof EntityTNTPrimed) { + if (!entity.worldObj.isRemote) { + final EntityItem entityItem2 = + new EntityItem(entity.worldObj, entity.posX, entity.posY, + entity.posZ, new ItemStack(Blocks.tnt)); + final float var14 = 0.05f; + final Random random2 = new Random(); + ((Entity)entityItem2).motionX = (float)random2.nextGaussian() * var14; + ((Entity)entityItem2).motionY = + (float)random2.nextGaussian() * var14 + 0.2f; + ((Entity)entityItem2).motionZ = (float)random2.nextGaussian() * var14; + entity.worldObj.spawnEntityInWorld((Entity)entityItem2); + } + entity.setDead(); + } else if (entity instanceof ECart) { + ((ECart)entity).killMinecart(DamageSource.generic); + } + this.onProvide( + ElectricityPack.getFromWatts(2000.0, this.getJoules(itemStack)), + itemStack); + return true; + } + player.addChatMessage(new ChatComponentText("Defuser out of electricity!")); + return false; + } + + public double getVoltage(final ItemStack itemStack) { return 20.0; } + + public double getMaxJoules(final ItemStack itemStack) { return 80000.0; } +} diff --git a/src/main/java/icbm/zhapin/dianqi/ItLaserDesignator.java b/src/main/java/icbm/zhapin/dianqi/ItLaserDesignator.java new file mode 100644 index 0000000..3e95840 --- /dev/null +++ b/src/main/java/icbm/zhapin/dianqi/ItLaserDesignator.java @@ -0,0 +1,287 @@ +package icbm.zhapin.dianqi; + +import icbm.api.IItemFrequency; +import icbm.core.MainBase; +import icbm.core.di.ItElectricICBM; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.ItemUsePacket; +import icbm.zhapin.jiqi.LauncherManager; +import icbm.zhapin.jiqi.TLauncherController; +import icbm.zhapin.jiqi.TCruiseLauncher; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.MovingObjectPosition.MovingObjectType; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector2; +import universalelectricity.core.vector.Vector3; + +public class ItLaserDesignator + extends ItElectricICBM implements IItemFrequency { + public static final int BAN_JING; + public static final int YONG_DIAN_LIANG = 6000; + + public ItLaserDesignator() { + super("laserDesignator"); + this.setTextureName("icbm:laserDesignator"); + } + + @Override + public void addInformation(final ItemStack itemStack, + final EntityPlayer par2EntityPlayer, + final List par3List, final boolean par4) { + super.addInformation(itemStack, par2EntityPlayer, par3List, par4); + if (this.getFrequency(itemStack) > 0) { + par3List.add("Frequency: " + this.getFrequency(itemStack)); + } else { + par3List.add("Frequency: Not Set"); + } + } + + @Override + public int getFrequency(final ItemStack itemStack) { + if (itemStack.stackTagCompound == null) { + return 0; + } + return itemStack.stackTagCompound.getInteger("frequency"); + } + + @Override + public void setFrequency(final int frequency, final ItemStack itemStack) { + if (itemStack.stackTagCompound == null) { + itemStack.setTagCompound(new NBTTagCompound()); + } + itemStack.stackTagCompound.setInteger("frequency", frequency); + } + + public int getLauncherCountDown(final ItemStack par1ItemStack) { + if (par1ItemStack.stackTagCompound == null) { + return -1; + } + return par1ItemStack.stackTagCompound.getInteger("countDown"); + } + + public void setLauncherCountDown(final ItemStack par1ItemStack, + final int value) { + if (par1ItemStack.stackTagCompound == null) { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + par1ItemStack.stackTagCompound.setInteger("countDown", value); + } + + public int getLauncherCount(final ItemStack par1ItemStack) { + if (par1ItemStack.stackTagCompound == null) { + return 0; + } + return par1ItemStack.stackTagCompound.getInteger("launcherCount"); + } + + public void setLauncherCount(final ItemStack par1ItemStack, final int value) { + if (par1ItemStack.stackTagCompound == null) { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + par1ItemStack.stackTagCompound.setInteger("launcherCount", value); + } + + public int getLauncherDelay(final ItemStack par1ItemStack) { + if (par1ItemStack.stackTagCompound == null) { + return 0; + } + return par1ItemStack.stackTagCompound.getInteger("launcherDelay"); + } + + public void setLauncherDelay(final ItemStack par1ItemStack, final int value) { + if (par1ItemStack.stackTagCompound == null) { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + par1ItemStack.stackTagCompound.setInteger("launcherDelay", value); + } + + public void onUpdate(final ItemStack par1ItemStack, final World par2World, + final Entity par3Entity, final int par4, + final boolean par5) { + super.onUpdate(par1ItemStack, par2World, par3Entity, par4, par5); + if (!par2World.isRemote) { + final List connectedLaunchers = new ArrayList<>(); + if (this.getLauncherCountDown(par1ItemStack) > 0 || + this.getLauncherCount(par1ItemStack) > 0) { + final Vector3 position = new Vector3(par3Entity.posX, par3Entity.posY, par3Entity.posZ); + final List launchers = LauncherManager.launchersInArea( + new Vector2(position.x - ItLaserDesignator.BAN_JING, + position.z - ItLaserDesignator.BAN_JING), + new Vector2(position.x + ItLaserDesignator.BAN_JING, + position.z + ItLaserDesignator.BAN_JING)); + for (final TLauncherController missileLauncher : launchers) { + if (missileLauncher != null && + missileLauncher.getFrequency() == this.getFrequency(par1ItemStack) && + missileLauncher.canLaunch()) { + connectedLaunchers.add(missileLauncher); + } + } + } + if (this.getLauncherCountDown(par1ItemStack) > 0 && + connectedLaunchers.size() > 0) { + if (this.getLauncherCountDown(par1ItemStack) % 20 == 0) { + ((EntityPlayer) par3Entity) + .addChatMessage(new ChatComponentText( + "Calling air strike in: " + + (int) Math.floor(this.getLauncherCountDown(par1ItemStack) / + 20))); + } + if (this.getLauncherCountDown(par1ItemStack) == 1) { + this.setLauncherCount(par1ItemStack, connectedLaunchers.size()); + this.setLauncherDelay(par1ItemStack, 0); + ((EntityPlayer) par3Entity) + .addChatMessage(new ChatComponentText("Incoming air strike!")); + } + this.setLauncherCountDown(par1ItemStack, + this.getLauncherCountDown(par1ItemStack) - 1); + } + if (this.getLauncherCount(par1ItemStack) > 0 && + this.getLauncherCount(par1ItemStack) <= connectedLaunchers.size() && + connectedLaunchers.size() > 0) { + if (this.getLauncherDelay(par1ItemStack) % 40 == 0) { + connectedLaunchers.get(this.getLauncherCount(par1ItemStack) - 1) + .launch(); + this.setLauncherCount(par1ItemStack, + this.getLauncherCount(par1ItemStack) - 1); + } + if (this.getLauncherCount(par1ItemStack) == 0) { + this.setLauncherDelay(par1ItemStack, 0); + connectedLaunchers.clear(); + } + this.setLauncherDelay(par1ItemStack, + this.getLauncherDelay(par1ItemStack) + 1); + } + } + } + + public boolean onItemUse(final ItemStack par1ItemStack, + final EntityPlayer par2EntityPlayer, + final World par3World, final int x, final int y, + final int z, final int par7, final float par8, + final float par9, final float par10) { + if (!par3World.isRemote) { + final TileEntity tileEntity = par3World.getTileEntity(x, y, z); + if (tileEntity != null && tileEntity instanceof TLauncherController) { + final TLauncherController missileLauncher = (TLauncherController) tileEntity; + if (missileLauncher.getFrequency() > 0) { + this.setFrequency(missileLauncher.getFrequency(), par1ItemStack); + par2EntityPlayer.addChatMessage( + new ChatComponentText("Laser designator frequency Set: " + + this.getFrequency(par1ItemStack))); + } else { + par2EntityPlayer.addChatMessage( + new ChatComponentText("Frequency must be greater than zero.")); + } + } + } + return false; + } + + public ItemStack onItemRightClick(final ItemStack par1ItemStack, + final World par2World, + final EntityPlayer par3EntityPlayer) { + if (par2World.isRemote) { + final MovingObjectPosition objectMouseOver = par3EntityPlayer.rayTrace( + (double) (ItLaserDesignator.BAN_JING * 2), 1.0f); + if (objectMouseOver != null && + objectMouseOver.typeOfHit == MovingObjectType.BLOCK) { + final Block block = par2World.getBlock(objectMouseOver.blockX, objectMouseOver.blockY, + objectMouseOver.blockZ); + final int blockMetadata = par2World.getBlockMetadata( + objectMouseOver.blockX, objectMouseOver.blockY, + objectMouseOver.blockZ); + if (this.getLauncherCountDown(par1ItemStack) > 0) { + return par1ItemStack; + } + if (block == ICBMExplosion.bJiQi) { + return par1ItemStack; + } + final int airStrikeFreq = this.getFrequency(par1ItemStack); + if (airStrikeFreq > 0) { + if (this.getJoules(par1ItemStack) > 6000.0) { + final Vector3 position = new Vector3(((Entity) par3EntityPlayer).posX, + ((Entity) par3EntityPlayer).posY, + ((Entity) par3EntityPlayer).posZ); + final List launchers = LauncherManager.launchersInArea( + new Vector2(position.x - ItLaserDesignator.BAN_JING, + position.z - ItLaserDesignator.BAN_JING), + new Vector2(position.x + ItLaserDesignator.BAN_JING, + position.z + ItLaserDesignator.BAN_JING)); + boolean doAirStrike = false; + int errorCount = 0; + for (final TLauncherController missileLauncher : launchers) { + if (missileLauncher != null && + missileLauncher.getFrequency() == airStrikeFreq) { + if (missileLauncher instanceof TCruiseLauncher) { + missileLauncher.setTarget(new Vector3( + objectMouseOver.blockX, objectMouseOver.blockY, + objectMouseOver.blockZ)); + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket( + // "ICBM", missileLauncher, 2, + // missileLauncher.getTarget().x, + // missileLauncher.getTarget().y, + // missileLauncher.getTarget().z)); + } else { + double previousY = 0.0; + if (missileLauncher.getTarget() != null) { + previousY = missileLauncher.getTarget().y; + } + missileLauncher.setTarget( + new Vector3(objectMouseOver.blockX, previousY, + objectMouseOver.blockZ)); + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket( + // "ICBM", missileLauncher, 2, + // missileLauncher.getTarget().x, + // missileLauncher.getTarget().y, + // missileLauncher.getTarget().z)); + } + if (missileLauncher.canLaunch()) { + doAirStrike = true; + } else { + ++errorCount; + } + } + } + if (doAirStrike && this.getLauncherCountDown(par1ItemStack) >= 0) { + ICBMExplosion.channel.sendToServer(new ItemUsePacket( + ItemUsePacket.Type.LASER_DESIGNATOR, + new Vector3(objectMouseOver.blockX, objectMouseOver.blockY, + objectMouseOver.blockZ))); + par3EntityPlayer.addChatMessage( + new ChatComponentText("Calling air strike into designated position!")); + } + } else { + par3EntityPlayer.addChatMessage( + new ChatComponentText("Laser designator out of electricity!")); + } + } else { + par3EntityPlayer.addChatMessage(new ChatComponentText("Laser designator frequency not set!")); + } + } + } + return par1ItemStack; + } + + public double getVoltage(final ItemStack itemStack) { + return 30.0; + } + + public double getMaxJoules(final ItemStack itemStack) { + return 80000.0; + } + + static { + BAN_JING = MainBase.DAO_DAN_ZUI_YUAN; + } +} diff --git a/src/main/java/icbm/zhapin/dianqi/ItRadarGun.java b/src/main/java/icbm/zhapin/dianqi/ItRadarGun.java new file mode 100644 index 0000000..80d89b9 --- /dev/null +++ b/src/main/java/icbm/zhapin/dianqi/ItRadarGun.java @@ -0,0 +1,144 @@ +package icbm.zhapin.dianqi; + +import icbm.core.di.ItElectricICBM; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.ItemUsePacket; +import icbm.zhapin.jiqi.TLauncherController; +import icbm.zhapin.jiqi.TLauncherControlPanel; +import icbm.zhapin.jiqi.TCruiseLauncher; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import universalelectricity.core.electricity.ElectricityPack; +import universalelectricity.core.vector.Vector3; + +public class ItRadarGun extends ItElectricICBM { + public static final int USED_ENERGY = 1000; + public static final int DISTANCE = 1000; + + public ItRadarGun() { + super("radarGun"); + this.setTextureName("icbm:radarGun"); + } + + @Override + public void addInformation(final ItemStack itemStack, + final EntityPlayer par2EntityPlayer, + final List par3List, final boolean par4) { + super.addInformation(itemStack, par2EntityPlayer, par3List, par4); + final Vector3 coord = this.getSavedCoord(itemStack); + par3List.add("\uaa74Saved Coordinates:"); + par3List.add("X: " + (int) coord.x + ", Y: " + (int) coord.y + + ", Z: " + (int) coord.z); + } + + public ItemStack onItemRightClick(final ItemStack itemStack, + final World par2World, + final EntityPlayer par3EntityPlayer) { + if (par2World.isRemote) { + final MovingObjectPosition objectMouseOver = par3EntityPlayer.rayTrace(1000.0, 1.0f); + if (objectMouseOver != null) { + final TileEntity tileEntity = par2World.getTileEntity( + objectMouseOver.blockX, objectMouseOver.blockY, + objectMouseOver.blockZ); + if (!(tileEntity instanceof TLauncherController)) { + if (this.getJoules(itemStack) > 1000.0) { + ICBMExplosion.channel.sendToServer(new ItemUsePacket( + ItemUsePacket.Type.RADAR_GUN, + new Vector3(objectMouseOver.blockX, objectMouseOver.blockY, + objectMouseOver.blockZ))); + this.onProvide( + ElectricityPack.getFromWatts(1000.0, this.getJoules(itemStack)), + itemStack); + par3EntityPlayer.addChatMessage(new ChatComponentText( + "Scanned Coordinates: X:" + objectMouseOver.blockX + ", Y:" + + objectMouseOver.blockY + ", Z:" + objectMouseOver.blockZ)); + } else { + par3EntityPlayer.addChatMessage( + new ChatComponentText("Radar gun out of electricity!")); + } + } + } + } + return itemStack; + } + + public boolean onItemUse(final ItemStack par1ItemStack, + final EntityPlayer par2EntityPlayer, + final World par3World, final int x, final int y, + final int z, final int par7, final float par8, + final float par9, final float par10) { + final Block blockId = par3World.getBlock(x, y, z); + if (blockId == ICBMExplosion.bJiQi) { + final TileEntity tileEntity = par3World.getTileEntity(x, y, z); + if (tileEntity != null) { + if (tileEntity instanceof TLauncherControlPanel) { + final TLauncherControlPanel missileLauncher = (TLauncherControlPanel) tileEntity; + final Vector3 savedCords = this.getSavedCoord(par1ItemStack); + if (!savedCords.equals(new Vector3())) { + if (missileLauncher.getTarget() == null) { + missileLauncher.setTarget(new Vector3()); + } + missileLauncher.getTarget().x = (int) savedCords.x; + missileLauncher.getTarget().z = (int) savedCords.z; + if (par3World.isRemote) { + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket( + // "ICBM|E", missileLauncher, 2, savedCords.x, + // missileLauncher.getTarget().y, savedCords.z)); + par2EntityPlayer.addChatMessage( + new ChatComponentText("Coordinate information transfered!")); + } + } else if (par3World.isRemote) { + par2EntityPlayer.addChatMessage( + new ChatComponentText("You must scan a coordinate!")); + } + } else if (tileEntity instanceof TCruiseLauncher) { + final TCruiseLauncher missileLauncher2 = (TCruiseLauncher) tileEntity; + final Vector3 savedCords = this.getSavedCoord(par1ItemStack); + if (!savedCords.equals(new Vector3())) { + if (missileLauncher2.getTarget() == null) { + missileLauncher2.setTarget(new Vector3()); + } + missileLauncher2.setTarget( + new Vector3(savedCords.x, savedCords.y, savedCords.z)); + if (par3World.isRemote) { + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket( + // "ICBM|E", missileLauncher2, 2, savedCords.x, + // savedCords.y, savedCords.z)); + par2EntityPlayer.addChatMessage( + new ChatComponentText("Coordinate information transfered!")); + } + } else if (par3World.isRemote) { + par2EntityPlayer.addChatMessage( + new ChatComponentText("You must scan a coordinate!")); + } + } + } + } + return false; + } + + public Vector3 getSavedCoord(final ItemStack par1ItemStack) { + if (par1ItemStack.stackTagCompound == null) { + return new Vector3(); + } + return new Vector3(par1ItemStack.stackTagCompound.getInteger("x"), + par1ItemStack.stackTagCompound.getInteger("y"), + par1ItemStack.stackTagCompound.getInteger("z")); + } + + public double getVoltage(final ItemStack itemStack) { + return 20.0; + } + + public double getMaxJoules(final ItemStack itemStack) { + return 80000.0; + } +} diff --git a/src/main/java/icbm/zhapin/dianqi/ItRemoteDetonator.java b/src/main/java/icbm/zhapin/dianqi/ItRemoteDetonator.java new file mode 100644 index 0000000..c4630e4 --- /dev/null +++ b/src/main/java/icbm/zhapin/dianqi/ItRemoteDetonator.java @@ -0,0 +1,159 @@ +package icbm.zhapin.dianqi; + +import icbm.core.di.ItElectricICBM; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.ItemUsePacket; +import icbm.zhapin.zhapin.TExplosive; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.MovingObjectPosition.MovingObjectType; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import universalelectricity.core.electricity.ElectricityPack; +import universalelectricity.core.vector.Vector3; + +public class ItRemoteDetonator extends ItElectricICBM { + public static final int RADIUS = 100; + public static final int ENERGY_USED = 1500; + + public ItRemoteDetonator() { + super("remoteDetonator"); + this.setTextureName("icbm:remoteDetonator"); + } + + @Override + public void addInformation(final ItemStack itemStack, + final EntityPlayer player, final List par3List, + final boolean par4) { + super.addInformation(itemStack, player, par3List, par4); + final Vector3 coord = this.getSavedCoord(itemStack); + if (this.nengZha( + coord.getTileEntity((IBlockAccess) ((Entity) player).worldObj))) { + par3List.add("\uaa74Linked Explosive:"); + par3List.add("X: " + (int) coord.x + ", Y: " + (int) coord.y + + ", Z: " + (int) coord.z); + } else { + par3List.add("§4No Linked Explosive"); + } + } + + @Override + public boolean onItemUse(final ItemStack itemStack, + final EntityPlayer entityPlayer, final World world, + final int x, final int y, final int z, + final int par7, final float par8, final float par9, + final float par10) { + final TileEntity tileEntity = world.getTileEntity(x, y, z); + if (entityPlayer.isSneaking() && tileEntity != null && + this.nengZha(tileEntity)) { + if (this.getJoules(itemStack) > 1500.0) { + this.setSavedCoords(itemStack, new Vector3(x, y, z)); + this.onProvide( + ElectricityPack.getFromWatts(1500.0, this.getJoules(itemStack)), + itemStack); + if (world.isRemote) { + entityPlayer.addChatMessage(new ChatComponentText( + "Remote Locked to: X:" + x + ", Y:" + y + ", Z:" + z)); + } + } else if (world.isRemote) { + entityPlayer.addChatMessage( + new ChatComponentText("Remote out of electricity!")); + } + return true; + } + return false; + } + + @Override + public ItemStack onItemRightClick(final ItemStack itemStack, + final World world, + final EntityPlayer entityPlayer) { + if (world.isRemote) { + if (!entityPlayer.isSneaking()) { + final MovingObjectPosition objectMouseOver = entityPlayer.rayTrace(100.0, 1.0f); + if (objectMouseOver != null && + objectMouseOver.typeOfHit == MovingObjectType.BLOCK) { + final TileEntity tileEntity = world.getTileEntity( + objectMouseOver.blockX, objectMouseOver.blockY, + objectMouseOver.blockZ); + final Block blockID = world.getBlock(objectMouseOver.blockX, objectMouseOver.blockY, + objectMouseOver.blockZ); + final TileEntity tile = world.getTileEntity(objectMouseOver.blockX, + objectMouseOver.blockY, + objectMouseOver.blockZ); + if (tile != null && tile instanceof TExplosive) { + if (blockID == ICBMExplosion.bJiQi) { + return itemStack; + } + if (this.nengZha(tileEntity)) { + if (this.getJoules(itemStack) > 1500.0) { + // TODO: WTF + //PacketDispatcher.sendPacketToServer( + // PacketManager.getPacket("ICBM|E", tileEntity, 2)); + return itemStack; + } + entityPlayer.addChatMessage( + new ChatComponentText("Remote out of electricity!")); + } + } + } + } else if (this.getJoules(itemStack) > 1500.0) { + final TileEntity tileEntity2 = this.getSavedCoord(itemStack).getTileEntity((IBlockAccess) world); + if (this.nengZha(tileEntity2)) { + // TODO: WTF + //PacketDispatcher.sendPacketToServer( + // PacketManager.getPacket("ICBM|E", tileEntity2, 2)); + ICBMExplosion.channel.sendToServer( + new ItemUsePacket(ItemUsePacket.Type.REMOTE, new Vector3())); + } + } else { + entityPlayer.addChatMessage(new ChatComponentText("Remote out of electricity!")); + } + } + return itemStack; + } + + public boolean nengZha(final TileEntity tileEntity) { + return tileEntity != null && tileEntity instanceof TExplosive && + (((TExplosive) tileEntity).explosiveId == ZhaPin.condensed.getID() || + ((TExplosive) tileEntity).explosiveId == ZhaPin.breaching.getID() || + ((TExplosive) tileEntity).explosiveId == ZhaPin.sMine.getID()); + } + + public void setSavedCoords(final ItemStack itemStack, + final Vector3 position) { + if (itemStack.stackTagCompound == null) { + itemStack.setTagCompound(new NBTTagCompound()); + } + itemStack.stackTagCompound.setInteger("x", position.intX()); + itemStack.stackTagCompound.setInteger("y", position.intY()); + itemStack.stackTagCompound.setInteger("z", position.intZ()); + } + + public Vector3 getSavedCoord(final ItemStack par1ItemStack) { + if (par1ItemStack.stackTagCompound == null) { + return new Vector3(); + } + return new Vector3(par1ItemStack.stackTagCompound.getInteger("x"), + par1ItemStack.stackTagCompound.getInteger("y"), + par1ItemStack.stackTagCompound.getInteger("z")); + } + + @Override + public double getVoltage(final ItemStack itemStack) { + return 20.0; + } + + @Override + public double getMaxJoules(final ItemStack itemStack) { + return 50000.0; + } +} diff --git a/src/main/java/icbm/zhapin/dianqi/ItRocketLauncher.java b/src/main/java/icbm/zhapin/dianqi/ItRocketLauncher.java new file mode 100644 index 0000000..3113992 --- /dev/null +++ b/src/main/java/icbm/zhapin/dianqi/ItRocketLauncher.java @@ -0,0 +1,79 @@ +package icbm.zhapin.dianqi; + +import icbm.core.di.ItElectricICBM; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.daodan.EMissile; +import icbm.zhapin.daodan.ItMissile; +import icbm.zhapin.daodan.ItModuleMissile; +import icbm.zhapin.daodan.MissileBase; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.world.World; +import universalelectricity.core.electricity.ElectricityPack; +import universalelectricity.core.vector.Vector3; + +public class ItRocketLauncher extends ItElectricICBM { + public ItRocketLauncher() { + super("rocketLauncher"); + } + + public EnumAction getItemUseAction(final ItemStack par1ItemStack) { + return EnumAction.bow; + } + + public ItemStack onItemRightClick(final ItemStack itemStack, + final World world, + final EntityPlayer player) { + if (!world.isRemote && this.getJoules(itemStack) >= 5000.0) { + for (int i = 0; i < player.inventory.getSizeInventory(); ++i) { + final ItemStack inventoryStack = player.inventory.getStackInSlot(i); + if (inventoryStack != null && inventoryStack.getItem() instanceof ItMissile) { + int haoMa = inventoryStack.getItemDamage(); + if (inventoryStack.getItem() instanceof ItModuleMissile) { + haoMa += 100; + } + final MissileBase daoDan = MissileBase.list[haoMa]; + if (daoDan != null && + !ICBMExplosion.shiBaoHu(world, new Vector3((Entity) player), + ZhaPin.ZhaPinType.DAO_DAN, haoMa)) { + if (daoDan.getTier() <= 2 && daoDan.isCruise()) { + final Vector3 diDian = Vector3.add(new Vector3((Entity) player), + new Vector3(0.0, 0.5, 0.0)); + final Vector3 kan = new Vector3(player.getLook(1.0f)); + final Vector3 kaiShiDiDian = Vector3.add(diDian, Vector3.multiply(kan, 1.1)); + final Vector3 muBiao = Vector3.add(diDian, Vector3.multiply(kan, 100.0)); + final EMissile eDaoDan = new EMissile( + world, kaiShiDiDian, daoDan.getID(), + ((Entity) player).rotationYaw, ((Entity) player).rotationPitch); + world.spawnEntityInWorld((Entity) eDaoDan); + eDaoDan.launch(muBiao); + if (!player.capabilities.isCreativeMode) { + player.inventory.setInventorySlotContents(i, (ItemStack) null); + } + this.onProvide(ElectricityPack.getFromWatts( + 5000.0, this.getJoules(itemStack)), + itemStack); + return itemStack; + } + } else { + player.addChatMessage( + new ChatComponentText("Region being is protected.")); + } + } + } + } + return itemStack; + } + + public double getVoltage(final ItemStack itemStack) { + return 25.0; + } + + public double getMaxJoules(final ItemStack itemStack) { + return 100000.0; + } +} diff --git a/src/main/java/icbm/zhapin/fx/FXAntimatter.java b/src/main/java/icbm/zhapin/fx/FXAntimatter.java new file mode 100644 index 0000000..c28b165 --- /dev/null +++ b/src/main/java/icbm/zhapin/fx/FXAntimatter.java @@ -0,0 +1,109 @@ +package icbm.zhapin.fx; + +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.EntityFX; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import org.lwjgl.opengl.GL11; +import universalelectricity.core.vector.Vector3; + +@SideOnly(Side.CLIENT) +public class FXAntimatter extends EntityFX { + float antimatterParticleScale; + + public FXAntimatter(final World par1World, final Vector3 position, + final double par8, final double par10, final double par12, + final double distance) { + this(par1World, position, par8, par10, par12, 1.0f, distance); + } + + public FXAntimatter(final World par1World, final Vector3 position, + final double par8, final double par10, final double par12, + final float par14, final double distance) { + super(par1World, position.x, position.y, position.z, 0.0, 0.0, 0.0); + ((Entity) this).motionX *= 0.10000000149011612; + ((Entity) this).motionY *= 0.10000000149011612; + ((Entity) this).motionZ *= 0.10000000149011612; + ((Entity) this).motionX += par8; + ((Entity) this).motionY += par10; + ((Entity) this).motionZ += par12; + final float particleRed = (float) (Math.random() * 0.30000001192092896); + super.particleBlue = particleRed; + super.particleGreen = particleRed; + super.particleRed = particleRed; + super.particleScale *= 0.75f; + super.particleScale *= par14; + this.antimatterParticleScale = super.particleScale; + super.particleMaxAge = (int) (10.0 / (Math.random() * 0.8 + 0.2)); + super.particleMaxAge *= (int) par14; + ((Entity) this).renderDistanceWeight = distance; + ((Entity) this).noClip = false; + } + + public void renderParticle(final Tessellator tessellator, final float par2, + final float par3, final float par4, + final float par5, final float par6, + final float par7) { + float agescale = 0.0f; + agescale = (float) (super.particleAge / (super.particleMaxAge / 2)); + if (agescale > 1.0f) { + agescale = 2.0f - agescale; + } + super.particleScale = this.antimatterParticleScale * agescale; + tessellator.draw(); + GL11.glPushMatrix(); + GL11.glDepthMask(false); + GL11.glEnable(3042); + GL11.glBlendFunc(770, 1); + Minecraft.getMinecraft().renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/antimatter.png")); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 0.75f); + final float f10 = 0.5f * super.particleScale; + final float f11 = (float) (((Entity) this).prevPosX + + (((Entity) this).posX - ((Entity) this).prevPosX) * par2 - + EntityFX.interpPosX); + final float f12 = (float) (((Entity) this).prevPosY + + (((Entity) this).posY - ((Entity) this).prevPosY) * par2 - + EntityFX.interpPosY); + final float f13 = (float) (((Entity) this).prevPosZ + + (((Entity) this).posZ - ((Entity) this).prevPosZ) * par2 - + EntityFX.interpPosZ); + tessellator.startDrawingQuads(); + tessellator.setBrightness(240); + tessellator.setColorRGBA_F(super.particleRed, super.particleGreen, + super.particleBlue, 0.5f); + tessellator.addVertexWithUV( + (double) (f11 - par3 * f10 - par5 * f10), (double) (f12 - par4 * f10), + (double) (f13 - par5 * f10 - par7 * f10), 0.0, 1.0); + tessellator.addVertexWithUV( + (double) (f11 - par3 * f10 + par5 * f10), (double) (f12 + par4 * f10), + (double) (f13 - par5 * f10 + par7 * f10), 1.0, 1.0); + tessellator.addVertexWithUV( + (double) (f11 + par3 * f10 + par5 * f10), (double) (f12 + par4 * f10), + (double) (f13 + par5 * f10 + par7 * f10), 1.0, 0.0); + tessellator.addVertexWithUV( + (double) (f11 + par3 * f10 - par5 * f10), (double) (f12 - par4 * f10), + (double) (f13 + par5 * f10 - par7 * f10), 0.0, 0.0); + tessellator.draw(); + GL11.glDisable(3042); + GL11.glDepthMask(true); + GL11.glPopMatrix(); + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/antimatter.png")); + tessellator.startDrawingQuads(); + } + + public void onUpdate() { + ((Entity) this).prevPosX = ((Entity) this).posX; + ((Entity) this).prevPosY = ((Entity) this).posY; + ((Entity) this).prevPosZ = ((Entity) this).posZ; + if (super.particleAge++ >= super.particleMaxAge) { + this.setDead(); + } + } +} diff --git a/src/main/java/icbm/zhapin/fx/FXPortal.java b/src/main/java/icbm/zhapin/fx/FXPortal.java new file mode 100644 index 0000000..3d5baa6 --- /dev/null +++ b/src/main/java/icbm/zhapin/fx/FXPortal.java @@ -0,0 +1,23 @@ +package icbm.zhapin.fx; + +import cpw.mods.fml.common.FMLLog; +import cpw.mods.fml.relauncher.ReflectionHelper; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.particle.EntityFX; +import net.minecraft.client.particle.EntityPortalFX; +import net.minecraft.entity.Entity; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +@SideOnly(Side.CLIENT) +public class FXPortal extends EntityPortalFX { + public FXPortal(final World par1World, final Vector3 position, final float red, + final float green, final float blue, final float scale, + final double distance) { + super(par1World, position.x, position.y, position.z, 0.0, 0.0, 0.0); + this.particleScale = scale; + this.portalParticleScale = scale; + ((Entity) this).renderDistanceWeight = distance; + } +} diff --git a/src/main/java/icbm/zhapin/fx/FXShockwave.java b/src/main/java/icbm/zhapin/fx/FXShockwave.java new file mode 100644 index 0000000..2b0e834 --- /dev/null +++ b/src/main/java/icbm/zhapin/fx/FXShockwave.java @@ -0,0 +1,65 @@ +package icbm.zhapin.fx; + +import calclavia.lib.render.CalclaviaRenderHelper; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.particle.EntityFX; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.world.World; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.glu.Sphere; +import universalelectricity.core.vector.Vector3; + +@SideOnly(Side.CLIENT) +public class FXShockwave extends EntityFX { + public FXShockwave(final World par1World, final Vector3 position, + final float par8, final float par10, final float par12, + final double distance) { + this(par1World, position, par8, par10, par12, 1.0f, distance); + } + + public FXShockwave(final World par1World, final Vector3 position, final float r, + final float g, final float b, final float size, + final double distance) { + super(par1World, position.x, position.y, position.z, 0.0, 0.0, 0.0); + super.particleRed = r; + super.particleGreen = g; + super.particleBlue = b; + super.particleScale = size; + super.particleMaxAge = (int) (10.0 / (Math.random() * 0.8 + 0.2)); + super.particleMaxAge *= (int) size; + ((Entity) this).renderDistanceWeight = distance; + ((Entity) this).noClip = false; + } + + @Override + public void renderParticle(final Tessellator tessellator, final float par2, + final float par3, final float par4, + final float par5, final float par6, + final float par7) { + GL11.glPushMatrix(); + GL11.glTranslated(((Entity) this).posX, ((Entity) this).posY, + ((Entity) this).posZ); + CalclaviaRenderHelper.enableBlending(); + CalclaviaRenderHelper.disableLighting(); + GL11.glColor4f(super.particleRed / 255.0f, super.particleGreen / 255.0f, + super.particleBlue / 255.0f, 0.5f); + final Sphere sphere = new Sphere(); + sphere.draw(super.particleScale, 32, 32); + CalclaviaRenderHelper.enableLighting(); + CalclaviaRenderHelper.disableBlending(); + GL11.glPopMatrix(); + } + + @Override + public void onUpdate() { + ((Entity) this).prevPosX = ((Entity) this).posX; + ((Entity) this).prevPosY = ((Entity) this).posY; + ((Entity) this).prevPosZ = ((Entity) this).posZ; + ++super.particleScale; + if (super.particleAge++ >= super.particleMaxAge) { + this.setDead(); + } + } +} diff --git a/src/main/java/icbm/zhapin/fx/FXSmoke.java b/src/main/java/icbm/zhapin/fx/FXSmoke.java new file mode 100644 index 0000000..1789e36 --- /dev/null +++ b/src/main/java/icbm/zhapin/fx/FXSmoke.java @@ -0,0 +1,30 @@ +package icbm.zhapin.fx; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.particle.EntitySmokeFX; +import net.minecraft.entity.Entity; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +@SideOnly(Side.CLIENT) +public class FXSmoke extends EntitySmokeFX { + public FXSmoke(final World par1World, final Vector3 position, final float red, + final float green, final float blue, final float scale, + final double distance) { + super(par1World, position.x, position.y, position.z, 0.0, 0.0, 0.0, scale); + ((Entity) this).renderDistanceWeight = distance; + this.particleRed = red; + this.particleBlue = blue; + this.particleGreen = green; + final float colorVarient = (float) (Math.random() * 0.9000000119209289); + this.particleRed *= colorVarient; + this.particleBlue *= colorVarient; + this.particleGreen *= colorVarient; + } + + public FXSmoke setAge(final int age) { + this.particleMaxAge = age; + return this; + } +} diff --git a/src/main/java/icbm/zhapin/gui/GEmpTower.java b/src/main/java/icbm/zhapin/gui/GEmpTower.java new file mode 100644 index 0000000..8e8cf5a --- /dev/null +++ b/src/main/java/icbm/zhapin/gui/GEmpTower.java @@ -0,0 +1,149 @@ +package icbm.zhapin.gui; + +import icbm.zhapin.jiqi.TEmpTower; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import universalelectricity.core.electricity.ElectricityDisplay; +import universalelectricity.prefab.GuiBase; + +public class GEmpTower extends GuiBase { + private TEmpTower tileEntity; + private GuiTextField textFieldBanJing; + private int containerWidth; + private int containerHeight; + + public GEmpTower(final TEmpTower tileEntity) { + this.tileEntity = tileEntity; + } + + @Override + public void initGui() { + super.initGui(); + this.buttonList.clear(); + this.buttonList.add(new GuiButton( + 0, this.width / 2 - 77, this.height / 2 - 10, 50, 20, "Missiles")); + this.buttonList.add(new GuiButton( + 1, this.width / 2 - 25, this.height / 2 - 10, 65, 20, "Electricity")); + this.buttonList.add(new GuiButton(2, this.width / 2 + 43, + this.height / 2 - 10, 35, 20, "Both")); + (this.textFieldBanJing = new GuiTextField(this.fontRendererObj, 72, 28, 30, 12)) + .setMaxStringLength(3); + this.textFieldBanJing.setText(this.tileEntity.radius + ""); + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket("ICBM|E", + // this.tileEntity, -1, true)); + } + + @Override + public void onGuiClosed() { + super.onGuiClosed(); + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket("ICBM|E", + // this.tileEntity, -1, false)); + } + + @Override + protected void actionPerformed(final GuiButton par1GuiButton) { + switch (par1GuiButton.id) { + case 0: { + this.tileEntity.holzOhJa = 1; + break; + } + case 1: { + this.tileEntity.holzOhJa = 2; + break; + } + case 2: { + this.tileEntity.holzOhJa = 0; + break; + } + } + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket("ICBM|E", + // this.tileEntity, 3, this.tileEntity.muoShi)); + } + + @Override + public void keyTyped(final char par1, final int par2) { + super.keyTyped(par1, par2); + this.textFieldBanJing.textboxKeyTyped(par1, par2); + try { + final int radius = Math.min( + Math.max(Integer.parseInt(this.textFieldBanJing.getText()), 10), 150); + this.tileEntity.radius = radius; + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket("ICBM|E", + // this.tileEntity, 2, this.tileEntity.banJing)); + } catch (final NumberFormatException ex) { + } + } + + @Override + public void mouseClicked(final int par1, final int par2, final int par3) { + super.mouseClicked(par1, par2, par3); + this.textFieldBanJing.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + } + + @Override + protected void drawForegroundLayer(final int var2, final int var3, + final float var1) { + this.fontRendererObj.drawString("§7EMP Tower", 65, 6, 4210752); + this.fontRendererObj.drawString("EMP Radius: blocks", 12, 30, + 4210752); + this.textFieldBanJing.drawTextBox(); + this.fontRendererObj.drawString("EMP Effect:", 12, 55, 4210752); + String mode = "Debilitate Electronics"; + if (this.tileEntity.holzOhJa == 1) { + mode = "Disrupt Missiles"; + } else if (this.tileEntity.holzOhJa == 2) { + mode = "Deplete Electricity"; + } + this.fontRendererObj.drawString("Mode: " + mode, 12, 105, 4210752); + String color = "§4"; + String status = "Idle"; + if (this.tileEntity.isDisabled()) { + status = "Disabled"; + } else if (this.tileEntity.getJoules() < this.tileEntity.getMaxJoules()) { + status = "Insufficient electricity!"; + } else { + color = "§2"; + status = "Ready to blast!"; + } + this.fontRendererObj.drawString(color + "Status: " + status, 12, 120, + 4210752); + this.fontRendererObj.drawString( + "Voltage: " + this.tileEntity.getVoltage() + "v", 12, 135, 4210752); + this.fontRendererObj.drawString( + ElectricityDisplay.getDisplayShort( + this.tileEntity.getJoules(), + ElectricityDisplay.ElectricUnit.JOULES) + + "/" + + ElectricityDisplay.getDisplayShort( + this.tileEntity.getMaxJoules(), + ElectricityDisplay.ElectricUnit.JOULES), + 12, 150, 4210752); + } + + @Override + protected void drawBackgroundLayer(final int var2, final int var3, + final float var1) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/gui_empty.png")); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + this.containerWidth = (this.width - super.xSize) / 2; + this.containerHeight = (this.height - super.ySize) / 2; + this.drawTexturedModalRect(this.containerWidth, this.containerHeight, 0, 0, + super.xSize, super.ySize); + } + + @Override + public void updateScreen() { + super.updateScreen(); + if (!this.textFieldBanJing.isFocused()) { + this.textFieldBanJing.setText(this.tileEntity.radius + ""); + } + } +} diff --git a/src/main/java/icbm/zhapin/gui/GFaSheDi.java b/src/main/java/icbm/zhapin/gui/GFaSheDi.java new file mode 100644 index 0000000..be4a297 --- /dev/null +++ b/src/main/java/icbm/zhapin/gui/GFaSheDi.java @@ -0,0 +1,46 @@ +package icbm.zhapin.gui; + +import icbm.zhapin.jiqi.TLauncherPlatform; +import icbm.zhapin.rongqi.CFaShiDi; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; + +public class GFaSheDi extends GuiContainer { + private TLauncherPlatform tileEntity; + private int containerWidth; + private int containerHeight; + + public GFaSheDi(final InventoryPlayer par1InventoryPlayer, + final TLauncherPlatform tileEntity) { + super((Container) new CFaShiDi(par1InventoryPlayer, tileEntity)); + this.tileEntity = tileEntity; + } + + @Override + protected void drawGuiContainerForegroundLayer(final int par1, + final int par2) { + this.fontRendererObj.drawString("§7" + this.tileEntity.getInventoryName(), 48, + 6, 4210752); + this.fontRendererObj.drawString("Place Missile", 63, 28, 4210752); + this.fontRendererObj.drawString( + StatCollector.translateToLocal("container.inventory"), 8, + this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(final float par1, + final int par2, + final int par3) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/gui_launcher.png")); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + this.containerWidth = (this.width - this.xSize) / 2; + this.containerHeight = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(this.containerWidth, this.containerHeight, 0, 0, + this.xSize, this.ySize); + } +} diff --git a/src/main/java/icbm/zhapin/gui/GMissileLauncher.java b/src/main/java/icbm/zhapin/gui/GMissileLauncher.java new file mode 100644 index 0000000..7fb1cf4 --- /dev/null +++ b/src/main/java/icbm/zhapin/gui/GMissileLauncher.java @@ -0,0 +1,186 @@ +package icbm.zhapin.gui; + +import icbm.zhapin.jiqi.TLauncherControlPanel; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import universalelectricity.core.electricity.ElectricityDisplay; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.GuiBase; + +public class GMissileLauncher extends GuiBase { + private TLauncherControlPanel tileEntity; + private GuiTextField tFX; + private GuiTextField tFY; + private GuiTextField tFZ; + private GuiTextField tFFreq; + private GuiTextField tFGaoDu; + private int containerWidth; + private int containerHeight; + + public GMissileLauncher( + final TLauncherControlPanel par2ICBMTileEntityMissileLauncher) { + this.tileEntity = par2ICBMTileEntityMissileLauncher; + } + + @Override + public void initGui() { + super.initGui(); + this.tFX = new GuiTextField(this.fontRendererObj, 110, 37, 45, 12); + this.tFZ = new GuiTextField(this.fontRendererObj, 110, 52, 45, 12); + this.tFY = new GuiTextField(this.fontRendererObj, 110, 67, 45, 12); + this.tFGaoDu = new GuiTextField(this.fontRendererObj, 110, 82, 45, 12); + (this.tFFreq = new GuiTextField(this.fontRendererObj, 110, 97, 45, 12)) + .setMaxStringLength(4); + this.tFX.setMaxStringLength(6); + this.tFZ.setMaxStringLength(6); + this.tFY.setMaxStringLength(2); + this.tFGaoDu.setMaxStringLength(2); + this.tFFreq.setText(this.tileEntity.getFrequency() + ""); + this.tFGaoDu.setText(this.tileEntity.height + ""); + if (this.tileEntity.getTarget() == null) { + this.tFX.setText(Math.round((float) this.tileEntity.xCoord) + ""); + this.tFZ.setText(Math.round((float) this.tileEntity.zCoord) + ""); + this.tFY.setText("0"); + } else { + this.tFX.setText(Math.round(this.tileEntity.getTarget().x) + ""); + this.tFZ.setText(Math.round(this.tileEntity.getTarget().z) + ""); + this.tFY.setText(Math.round(this.tileEntity.getTarget().y) + ""); + } + } + + @Override + public void keyTyped(final char par1, final int par2) { + super.keyTyped(par1, par2); + this.tFX.textboxKeyTyped(par1, par2); + this.tFZ.textboxKeyTyped(par1, par2); + if (this.tileEntity.getTier() >= 1) { + this.tFY.textboxKeyTyped(par1, par2); + this.tFGaoDu.textboxKeyTyped(par1, par2); + if (this.tileEntity.getTier() > 1) { + this.tFFreq.textboxKeyTyped(par1, par2); + } + } + try { + final Vector3 newTarget = new Vector3(Integer.parseInt(this.tFX.getText()), + Math.max(Integer.parseInt(this.tFY.getText()), 0), + Integer.parseInt(this.tFZ.getText())); + this.tileEntity.setTarget(newTarget); + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket( + // "ICBM|E", this.tileEntity, 2, this.tileEntity.getTarget().x, + // this.tileEntity.getTarget().y, this.tileEntity.getTarget().z)); + } catch (final NumberFormatException ex) { + } + try { + final short newFrequency = (short) Math.max(Short.parseShort(this.tFFreq.getText()), 0); + this.tileEntity.setFrequency(newFrequency); + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket( + // "ICBM|E", this.tileEntity, 1, this.tileEntity.getFrequency())); + } catch (final NumberFormatException ex2) { + } + try { + final short newGaoDu = (short) Math.max( + Math.min(Short.parseShort(this.tFGaoDu.getText()), 99), 3); + this.tileEntity.height = newGaoDu; + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket( + // "ICBM|E", this.tileEntity, 3, this.tileEntity.gaoDu)); + } catch (final NumberFormatException ex3) { + } + } + + @Override + public void mouseClicked(final int par1, final int par2, final int par3) { + super.mouseClicked(par1, par2, par3); + this.tFX.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + this.tFZ.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + if (this.tileEntity.getTier() >= 1) { + this.tFY.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + this.tFGaoDu.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + if (this.tileEntity.getTier() > 1) { + this.tFFreq.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + } + } + } + + @Override + public void drawForegroundLayer(final int var2, final int var3, + final float var1) { + this.tFX.drawTextBox(); + this.tFZ.drawTextBox(); + if (this.tileEntity.getTier() >= 1) { + this.tFY.drawTextBox(); + this.fontRendererObj.drawString("Detonation Height:", 12, 68, 4210752); + this.tFGaoDu.drawTextBox(); + this.fontRendererObj.drawString("Lock Height:", 12, 83, 4210752); + if (this.tileEntity.getTier() > 1) { + this.tFFreq.drawTextBox(); + this.fontRendererObj.drawString("Frequency:", 12, 98, 4210752); + } + } + this.fontRendererObj.drawString("", 45, 6, 4210752); + this.fontRendererObj.drawString("§7Launcher Control Panel", 30, 6, 4210752); + this.fontRendererObj.drawString("Missile Target", 12, 25, 4210752); + this.fontRendererObj.drawString("X-Coord:", 25, 40, 4210752); + this.fontRendererObj.drawString("Z-Coord:", 25, 55, 4210752); + int inaccuracy = 30; + if (this.tileEntity.faSheDi != null && + this.tileEntity.faSheDi.jiaZi != null) { + inaccuracy = this.tileEntity.faSheDi.jiaZi.getInaccuracy(); + } + this.fontRendererObj.drawString("Inaccuracy: " + inaccuracy + " blocks", 12, + 113, 4210752); + this.fontRendererObj.drawString("Status: " + this.tileEntity.getStatus(), + 12, 125, 4210752); + this.fontRendererObj.drawString( + "Voltage: " + this.tileEntity.getVoltage() + "v", 12, 137, 4210752); + this.fontRendererObj.drawString( + ElectricityDisplay.getDisplayShort( + this.tileEntity.getJoules(), + ElectricityDisplay.ElectricUnit.JOULES) + + "/" + + ElectricityDisplay.getDisplayShort( + this.tileEntity.getMaxJoules(), + ElectricityDisplay.ElectricUnit.JOULES), + 12, 150, 4210752); + } + + @Override + protected void drawBackgroundLayer(final int var2, final int var3, + final float var1) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/gui_empty.png")); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + this.containerWidth = (this.width - super.xSize) / 2; + this.containerHeight = (this.height - super.ySize) / 2; + this.drawTexturedModalRect(this.containerWidth, this.containerHeight, 0, 0, + super.xSize, super.ySize); + } + + @Override + public void updateScreen() { + super.updateScreen(); + if (!this.tFX.isFocused()) { + this.tFX.setText(Math.round(this.tileEntity.getTarget().x) + ""); + } + if (!this.tFZ.isFocused()) { + this.tFZ.setText(Math.round(this.tileEntity.getTarget().z) + ""); + } + if (!this.tFY.isFocused()) { + this.tFY.setText(Math.round(this.tileEntity.getTarget().y) + ""); + } + if (!this.tFGaoDu.isFocused()) { + this.tFGaoDu.setText(this.tileEntity.height + ""); + } + if (!this.tFFreq.isFocused()) { + this.tFFreq.setText(this.tileEntity.getFrequency() + ""); + } + } +} diff --git a/src/main/java/icbm/zhapin/gui/GRadarTower.java b/src/main/java/icbm/zhapin/gui/GRadarTower.java new file mode 100644 index 0000000..ec1e382 --- /dev/null +++ b/src/main/java/icbm/zhapin/gui/GRadarTower.java @@ -0,0 +1,244 @@ +package icbm.zhapin.gui; + +import icbm.zhapin.daodan.EMissile; +import icbm.zhapin.jiqi.BMachine; +import icbm.zhapin.jiqi.TRadarTower; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; +import universalelectricity.core.electricity.ElectricityDisplay; +import universalelectricity.core.vector.Vector2; +import universalelectricity.prefab.GuiBase; +import universalelectricity.prefab.TranslationHelper; +import universalelectricity.prefab.vector.Region2; + +public class GRadarTower extends GuiBase { + private TRadarTower tileEntity; + private int containerPosX; + private int containerPosY; + private GuiTextField textFieldAlarmRange; + private GuiTextField textFieldSafetyZone; + private Vector2 mouseOverCoords; + private Vector2 mousePosition; + private Vector2 radarCenter; + private float radarMapRadius; + private String info; + private String info2; + + public GRadarTower(final TRadarTower tileEntity) { + this.mouseOverCoords = new Vector2(); + this.mousePosition = new Vector2(); + this.info = ""; + this.tileEntity = tileEntity; + this.mouseOverCoords = new Vector2(this.tileEntity.xCoord, this.tileEntity.zCoord); + super.xSize = 256; + this.radarCenter = new Vector2(this.containerPosX + super.xSize / 3 - 14, + this.containerPosY + super.ySize / 2 + 4); + this.radarMapRadius = 7.836991f; + } + + @Override + public void initGui() { + super.initGui(); + (this.textFieldSafetyZone = new GuiTextField(this.fontRendererObj, 155, 83, 30, 12)) + .setMaxStringLength(3); + this.textFieldSafetyZone.setText(this.tileEntity.safetyRadius + ""); + (this.textFieldAlarmRange = new GuiTextField(this.fontRendererObj, 155, 110, 30, 12)) + .setMaxStringLength(3); + this.textFieldAlarmRange.setText(this.tileEntity.alarmRadius + ""); + } + + @Override + public void keyTyped(final char par1, final int par2) { + super.keyTyped(par1, par2); + this.textFieldSafetyZone.textboxKeyTyped(par1, par2); + this.textFieldAlarmRange.textboxKeyTyped(par1, par2); + try { + final int newSafetyRadius = Math.min( + 500, + Math.max(0, Integer.parseInt(this.textFieldSafetyZone.getText()))); + this.tileEntity.safetyRadius = newSafetyRadius; + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket( + // "ICBM|E", this.tileEntity, 2, this.tileEntity.safetyBanJing)); + } catch (final NumberFormatException ex) { + } + try { + final int newAlarmRadius = Math.min( + 500, + Math.max(0, Integer.parseInt(this.textFieldAlarmRange.getText()))); + this.tileEntity.alarmRadius = newAlarmRadius; + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket( + // "ICBM|E", this.tileEntity, 3, this.tileEntity.alarmBanJing)); + } catch (final NumberFormatException ex2) { + } + } + + @Override + public void mouseClicked(final int par1, final int par2, final int par3) { + super.mouseClicked(par1, par2, par3); + this.textFieldAlarmRange.mouseClicked(par1 - this.containerPosX, + par2 - this.containerPosY, par3); + this.textFieldSafetyZone.mouseClicked(par1 - this.containerPosX, + par2 - this.containerPosY, par3); + } + + @Override + protected void drawForegroundLayer(final int var2, final int var3, + final float var1) { + this.fontRendererObj.drawString( + "§7" + TranslationHelper.getLocal("icbm.machine.9.name"), + super.xSize / 2 - 30, 6, 4210752); + this.fontRendererObj.drawString("Coordinates:", 155, 18, 4210752); + this.fontRendererObj.drawString( + "X: " + (int) Math.round(this.mouseOverCoords.x) + + " Z: " + (int) Math.round(this.mouseOverCoords.y), + 155, 30, 4210752); + this.fontRendererObj.drawString("§6" + this.info, 155, 42, 4210752); + this.fontRendererObj.drawString("§4" + this.info2, 155, 54, 4210752); + this.fontRendererObj.drawString("Safe Zone:", 155, 70, 4210752); + this.textFieldSafetyZone.drawTextBox(); + this.fontRendererObj.drawString("Blocks", 190, 85, 4210752); + this.fontRendererObj.drawString("Alarm Range:", 155, 98, 4210752); + this.textFieldAlarmRange.drawTextBox(); + this.fontRendererObj.drawString("Blocks", 190, 112, 4210752); + this.fontRendererObj.drawString( + ElectricityDisplay.getDisplay(this.tileEntity.getRequest().getWatts() * + 20.0, + ElectricityDisplay.ElectricUnit.WATT), + 155, 128, 4210752); + this.fontRendererObj.drawString( + ElectricityDisplay.getDisplay(this.tileEntity.getVoltage(), + ElectricityDisplay.ElectricUnit.VOLTAGE), + 155, 138, 4210752); + String color = "§4"; + String status = "Idle"; + if (this.tileEntity.isDisabled()) { + status = "Disabled!"; + } else if (this.tileEntity.prevWatts >= this.tileEntity.getRequest().getWatts()) { + color = "§2"; + status = "Radar On!"; + } else { + status = "No Electricity!"; + } + this.fontRendererObj.drawString(color + status, 155, 150, 4210752); + } + + @Override + protected void drawBackgroundLayer(final int var2, final int var3, + final float var1) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/gui_radar.png")); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + this.containerPosX = (this.width - super.xSize) / 2; + this.containerPosY = (this.height - super.ySize) / 2; + this.drawTexturedModalRect(this.containerPosX, this.containerPosY, 0, 0, + super.xSize, super.ySize); + this.radarCenter = new Vector2(this.containerPosX + super.xSize / 3 - 10, + this.containerPosY + super.ySize / 2 + 4); + this.radarMapRadius = 7.0422535f; + this.info = ""; + this.info2 = ""; + if (this.tileEntity.prevWatts >= this.tileEntity.getRequest().getWatts()) { + int range = 4; + for (final Entity entity : this.tileEntity.xunZhaoEntity) { + final Vector2 position = new Vector2( + this.radarCenter.x + + (entity.posX - this.tileEntity.xCoord) / this.radarMapRadius, + this.radarCenter.y - + (entity.posZ - this.tileEntity.zCoord) / this.radarMapRadius); + if (entity instanceof EMissile) { + if (this.tileEntity.isWeiXianDaoDan((EMissile) entity)) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/reddot.png")); + } else { + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/yellowdot.png")); + } + } else { + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/yellowdot.png")); + } + this.drawTexturedModalRect(position.intX(), position.intY(), 0, 0, 2, + 2); + final Vector2 minPosition = position.clone(); + minPosition.add(-range); + final Vector2 maxPosition = position.clone(); + maxPosition.add(range); + if (new Region2(minPosition, maxPosition).isIn(this.mousePosition)) { + this.info = entity.getCommandSenderName(); + if (entity instanceof EntityPlayer) { + this.info = "§1" + this.info; + } + if (!(entity instanceof EMissile) || + ((EMissile) entity).target == null) { + continue; + } + this.info2 = "(" + ((EMissile) entity).target.intX() + ", " + + ((EMissile) entity).target.intZ() + ")"; + } + } + range = 2; + for (final TileEntity jiQi : this.tileEntity.xunZhaoJiQi) { + final Vector2 position = new Vector2( + this.radarCenter.x + + (jiQi.xCoord - this.tileEntity.xCoord) / this.radarMapRadius, + this.radarCenter.y - + (jiQi.zCoord - this.tileEntity.zCoord) / this.radarMapRadius); + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/whitedot.png")); + this.drawTexturedModalRect(position.intX(), position.intY(), 0, 0, 2, + 2); + final Vector2 minPosition = position.clone(); + minPosition.add(-range); + final Vector2 maxPosition = position.clone(); + maxPosition.add(range); + if (new Region2(minPosition, maxPosition).isIn(this.mousePosition) && + jiQi.getBlockType() != null) { + if (jiQi.getBlockType() instanceof BMachine) { + this.info = BMachine.getMachineName(jiQi); + } else { + this.info = jiQi.getBlockType().getLocalizedName(); + } + } + } + } + } + + @Override + public void updateScreen() { + super.updateScreen(); + if (Mouse.isInsideWindow() && Mouse.getEventButton() == -1) { + this.mousePosition = new Vector2( + Mouse.getEventX() * this.width / this.mc.displayWidth, + this.height - + Mouse.getEventY() * this.height / this.mc.displayHeight - 1); + final float difference = 500.0f / this.radarMapRadius; + if (this.mousePosition.x > this.radarCenter.x - difference && + this.mousePosition.x < this.radarCenter.x + + difference + && this.mousePosition.y > this.radarCenter.y - + difference + && + this.mousePosition.y < this.radarCenter.y + difference) { + final int xDifference = (int) (this.mousePosition.x - this.radarCenter.x); + final int yDifference = (int) (this.mousePosition.y - this.radarCenter.y); + final int xBlockDistance = (int) (xDifference * this.radarMapRadius); + final int yBlockDistance = (int) (yDifference * this.radarMapRadius); + this.mouseOverCoords = new Vector2(this.tileEntity.xCoord + xBlockDistance, + this.tileEntity.zCoord - yBlockDistance); + } + } + if (!this.textFieldSafetyZone.isFocused()) { + this.textFieldSafetyZone.setText(this.tileEntity.safetyRadius + ""); + } + if (!this.textFieldAlarmRange.isFocused()) { + this.textFieldAlarmRange.setText(this.tileEntity.alarmRadius + ""); + } + } +} diff --git a/src/main/java/icbm/zhapin/gui/GXiaoFaSheQi.java b/src/main/java/icbm/zhapin/gui/GXiaoFaSheQi.java new file mode 100644 index 0000000..64c2b3f --- /dev/null +++ b/src/main/java/icbm/zhapin/gui/GXiaoFaSheQi.java @@ -0,0 +1,154 @@ +package icbm.zhapin.gui; + +import icbm.zhapin.jiqi.TCruiseLauncher; +import icbm.zhapin.rongqi.CXiaoFaSheQi; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; +import universalelectricity.core.electricity.ElectricityDisplay; +import universalelectricity.core.vector.Vector3; + +public class GXiaoFaSheQi extends GuiContainer { + private TCruiseLauncher tileEntity; + private GuiTextField textFieldX; + private GuiTextField textFieldZ; + private GuiTextField textFieldY; + private GuiTextField textFieldFreq; + private int containerWidth; + private int containerHeight; + + public GXiaoFaSheQi(final InventoryPlayer par1InventoryPlayer, + final TCruiseLauncher tileEntity) { + super((Container) new CXiaoFaSheQi(par1InventoryPlayer, tileEntity)); + this.tileEntity = tileEntity; + } + + @Override + public void initGui() { + super.initGui(); + this.textFieldX = new GuiTextField(this.fontRendererObj, 20, 21, 35, 12); + this.textFieldY = new GuiTextField(this.fontRendererObj, 20, 37, 35, 12); + this.textFieldZ = new GuiTextField(this.fontRendererObj, 20, 52, 35, 12); + (this.textFieldFreq = new GuiTextField(this.fontRendererObj, 70, 33, 35, 12)) + .setMaxStringLength(4); + this.textFieldX.setMaxStringLength(6); + this.textFieldZ.setMaxStringLength(6); + this.textFieldY.setMaxStringLength(6); + this.textFieldFreq.setText(this.tileEntity.getFrequency() + ""); + if (this.tileEntity.getTarget() == null) { + this.textFieldX.setText(Math.round((float) this.tileEntity.xCoord) + ""); + this.textFieldZ.setText(Math.round((float) this.tileEntity.zCoord) + ""); + this.textFieldY.setText(Math.round((float) this.tileEntity.yCoord) + ""); + } else { + this.textFieldX.setText(Math.round(this.tileEntity.getTarget().x) + ""); + this.textFieldZ.setText(Math.round(this.tileEntity.getTarget().z) + ""); + this.textFieldY.setText(Math.round(this.tileEntity.getTarget().y) + ""); + } + } + + @Override + public void keyTyped(final char par1, final int par2) { + super.keyTyped(par1, par2); + this.textFieldX.textboxKeyTyped(par1, par2); + this.textFieldZ.textboxKeyTyped(par1, par2); + this.textFieldY.textboxKeyTyped(par1, par2); + this.textFieldFreq.textboxKeyTyped(par1, par2); + try { + final Vector3 newTarget = new Vector3(Integer.parseInt(this.textFieldX.getText()), + Integer.parseInt(this.textFieldY.getText()), + Integer.parseInt(this.textFieldZ.getText())); + this.tileEntity.setTarget(newTarget); + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket( + // "ICBM|E", this.tileEntity, 2, this.tileEntity.getTarget().x, + // this.tileEntity.getTarget().y, this.tileEntity.getTarget().z)); + } catch (final NumberFormatException ex) { + } + try { + final short newFrequency = (short) Math.max(Short.parseShort(this.textFieldFreq.getText()), 0); + this.tileEntity.setFrequency(newFrequency); + // TODO: WTF + // PacketDispatcher.sendPacketToServer(PacketManager.getPacket( + // "ICBM|E", this.tileEntity, 1, this.tileEntity.getFrequency())); + } catch (final NumberFormatException ex2) { + } + } + + @Override + public void mouseClicked(final int par1, final int par2, final int par3) { + super.mouseClicked(par1, par2, par3); + this.textFieldX.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + this.textFieldZ.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + this.textFieldY.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + this.textFieldFreq.mouseClicked(par1 - this.containerWidth, + par2 - this.containerHeight, par3); + } + + @Override + protected void drawGuiContainerForegroundLayer(final int par1, + final int par2) { + this.fontRendererObj.drawString("§7" + this.tileEntity.getInventoryName(), 52, + 6, 4210752); + this.fontRendererObj.drawString("X:", 8, 23, 4210752); + this.fontRendererObj.drawString("Y:", 8, 39, 4210752); + this.fontRendererObj.drawString("Z:", 8, 54, 4210752); + this.fontRendererObj.drawString("Frequency:", 70, 20, 4210752); + this.textFieldX.drawTextBox(); + this.textFieldZ.drawTextBox(); + this.textFieldY.drawTextBox(); + this.textFieldFreq.drawTextBox(); + this.fontRendererObj.drawString(this.tileEntity.getStatus(), 70, 50, + 4210752); + this.fontRendererObj.drawString(this.tileEntity.getVoltage() + "v", 70, 60, + 4210752); + this.fontRendererObj.drawString( + ElectricityDisplay.getDisplayShort( + this.tileEntity.getJoules(), + ElectricityDisplay.ElectricUnit.JOULES) + + "/" + + ElectricityDisplay.getDisplayShort( + this.tileEntity.getMaxJoules(), + ElectricityDisplay.ElectricUnit.JOULES), + 70, 70, 4210752); + this.fontRendererObj.drawString( + StatCollector.translateToLocal("container.inventory"), 8, + this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(final float par1, + final int par2, + final int par3) { + this.mc.renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/gui/gui_cruise_launcher.png")); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + this.containerWidth = (this.width - this.xSize) / 2; + this.containerHeight = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(this.containerWidth, this.containerHeight, 0, 0, + this.xSize, this.ySize); + } + + @Override + public void updateScreen() { + super.updateScreen(); + if (!this.textFieldX.isFocused()) { + this.textFieldX.setText(Math.round(this.tileEntity.getTarget().x) + ""); + } + if (!this.textFieldZ.isFocused()) { + this.textFieldZ.setText(Math.round(this.tileEntity.getTarget().z) + ""); + } + if (!this.textFieldY.isFocused()) { + this.textFieldY.setText(Math.round(this.tileEntity.getTarget().y) + ""); + } + if (!this.textFieldFreq.isFocused()) { + this.textFieldFreq.setText(this.tileEntity.getFrequency() + ""); + } + } +} diff --git a/src/main/java/icbm/zhapin/jiqi/BMachine.java b/src/main/java/icbm/zhapin/jiqi/BMachine.java new file mode 100644 index 0000000..af02cdc --- /dev/null +++ b/src/main/java/icbm/zhapin/jiqi/BMachine.java @@ -0,0 +1,331 @@ +package icbm.zhapin.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.BICBM; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.render.RHJiQi; +import java.util.List; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.UniversalElectricity; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.TranslationHelper; +import universalelectricity.prefab.implement.IRedstoneReceptor; +import universalelectricity.prefab.implement.IRotatable; +import universalelectricity.prefab.implement.ITier; +import universalelectricity.prefab.multiblock.IBlockActivate; +import universalelectricity.prefab.multiblock.IMultiBlock; + +public class BMachine extends BICBM { + public BMachine() { + super("machine", UniversalElectricity.machine); + } + + @Override + public boolean canProvidePower() { + return true; + } + + @Override + public void onBlockAdded(final World par1World, final int x, final int y, + final int z) { + this.isBeingPowered(par1World, x, y, z); + } + + @Override + public void onBlockPlacedBy(final World world, final int x, final int y, + final int z, + final EntityLivingBase par5EntityLiving, + final ItemStack itemStack) { + final int angle = MathHelper.floor_double( + ((Entity) par5EntityLiving).rotationYaw * 4.0f / 360.0f + 0.5) & + 0x3; + final TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof IRotatable) { + final IRotatable rotatableEntity = (IRotatable) tileEntity; + switch (angle) { + case 0: { + rotatableEntity.setDirection(world, x, y, z, + ForgeDirection.getOrientation(3)); + break; + } + case 1: { + rotatableEntity.setDirection(world, x, y, z, + ForgeDirection.getOrientation(4)); + break; + } + case 2: { + rotatableEntity.setDirection(world, x, y, z, + ForgeDirection.getOrientation(2)); + break; + } + case 3: { + rotatableEntity.setDirection(world, x, y, z, + ForgeDirection.getOrientation(5)); + break; + } + } + } + if (tileEntity instanceof IMultiBlock) { + ((IMultiBlock) tileEntity).onCreate(new Vector3(x, y, z)); + } + } + + // TODO: WTF + // @Override + public static boolean canBePlacedAt(final World world, final int x, + final int y, final int z, + final int metadata, final int direction) { + switch (metadata) { + case 0: { + if (direction == 0 || direction == 2) { + return world.getBlock(x, y, z) == Blocks.air && + world.getBlock(x + 1, y, z) == Blocks.air && + world.getBlock(x + 1, y + 1, z) == Blocks.air && + world.getBlock(x + 1, y + 2, z) == Blocks.air && + world.getBlock(x - 1, y, z) == Blocks.air && + world.getBlock(x - 1, y + 1, z) == Blocks.air && + world.getBlock(x - 1, y + 2, z) == Blocks.air; + } + if (direction == 1 || direction == 3) { + return world.getBlock(x, y, z) == Blocks.air && + world.getBlock(x, y, z + 1) == Blocks.air && + world.getBlock(x, y + 1, z + 1) == Blocks.air && + world.getBlock(x, y + 2, z + 1) == Blocks.air && + world.getBlock(x, y, z - 1) == Blocks.air && + world.getBlock(x, y + 1, z - 1) == Blocks.air && + world.getBlock(x, y + 2, z - 1) == Blocks.air; + } + return world.getBlock(x, y - 1, z).getMaterial().isSolid() && + world.getBlock(x, y, z) == Blocks.air && + world.getBlock(x, y + 1, z) == Blocks.air && + world.getBlock(x, y + 2, z) == Blocks.air; + } + case 2: { + return world.getBlock(x, y - 1, z).getMaterial().isSolid() && + world.getBlock(x, y, z) == Blocks.air && + world.getBlock(x, y + 1, z) == Blocks.air && + world.getBlock(x, y + 2, z) == Blocks.air; + } + case 3: { + return world.getBlock(x, y - 1, z).getMaterial().isSolid() && + world.getBlock(x, y, z) == Blocks.air && + world.getBlock(x, y + 1, z) == Blocks.air && + world.getBlock(x + 1, y + 1, z) == Blocks.air && + world.getBlock(x - 1, y + 1, z) == Blocks.air && + world.getBlock(x, y + 1, z + 1) == Blocks.air && + world.getBlock(x, y + 1, z - 1) == Blocks.air && + world.getBlock(x + 1, y + 1, z + 1) == Blocks.air && + world.getBlock(x - 1, y + 1, z - 1) == Blocks.air && + world.getBlock(x + 1, y + 1, z - 1) == Blocks.air && + world.getBlock(x - 1, y + 1, z + 1) == Blocks.air; + } + case 4: { + return world.getBlock(x, y, z) == Blocks.air && + world.getBlock(x, y + 1, z) == Blocks.air; + } + default: { + return world.getBlock(x, y - 1, z).getMaterial().isSolid(); + } + } + } + + @Override + public boolean canBlockStay(final World world, final int x, final int y, + final int z) { + int direction = 0; + final TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof IRotatable) { + direction = ((IRotatable) tileEntity) + .getDirection((IBlockAccess) world, x, y, z) + .ordinal(); + } + return canBePlacedAt(world, x, y, z, world.getBlockMetadata(x, y, z), + direction); + } + + @Override + public void onNeighborBlockChange(final World par1World, final int x, + final int y, final int z, + final Block par5) { + this.isBeingPowered(par1World, x, y, z); + } + + @Override + public boolean onMachineActivated(final World par1World, final int x, + final int y, final int z, + final EntityPlayer par5EntityPlayer, + final int side, final float hitX, + final float hitY, final float hitZ) { + if (par5EntityPlayer.inventory.getCurrentItem() != null) { + if (par5EntityPlayer.inventory.getCurrentItem().getItem() == ICBMExplosion.itLeiSheZhiBiao) { + return false; + } + if (par5EntityPlayer.inventory.getCurrentItem().getItem() == ICBMExplosion.itLeiDaQiang) { + return false; + } + } + final TileEntity tileEntity = par1World.getTileEntity(x, y, z); + return tileEntity != null && tileEntity instanceof IBlockActivate && + ((IBlockActivate) tileEntity).onActivated(par5EntityPlayer); + } + + @Override + public boolean onUseWrench(final World par1World, final int x, final int y, + final int z, final EntityPlayer par5EntityPlayer, + final int side, final float hitX, final float hitY, + final float hitZ) { + return this.onMachineActivated(par1World, x, y, z, par5EntityPlayer, side, + hitX, hitY, hitZ); + } + + public void isBeingPowered(final World par1World, final int x, final int y, + final int z) { + final TileEntity tileEntity = par1World.getTileEntity(x, y, z); + if (tileEntity instanceof IRedstoneReceptor) { + if (par1World.isBlockIndirectlyGettingPowered(x, y, z)) { + ((IRedstoneReceptor) tileEntity).onPowerOn(); + } else { + ((IRedstoneReceptor) tileEntity).onPowerOff(); + } + } + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public void breakBlock(final World par1World, final int x, final int y, + final int z, final Block par5, final int par6) { + final int metadata = par1World.getBlockMetadata(x, y, z); + final TileEntity tileEntity = par1World.getTileEntity(x, y, z); + if (tileEntity != null) { + int itemMetadata = 0; + if (tileEntity instanceof ITier) { + itemMetadata = ((ITier) tileEntity).getTier() + metadata * 3; + } else { + itemMetadata = 9 + metadata - 3; + } + this.dropBlockAsItem(par1World, x, y, z, + new ItemStack(ICBMExplosion.bJiQi, 1, itemMetadata)); + if (tileEntity instanceof IMultiBlock) { + ((IMultiBlock) tileEntity).onDestroy(tileEntity); + } + } + super.breakBlock(par1World, x, y, z, par5, par6); + } + + @Override + public TileEntity createNewTileEntity(final World var1, final int metadata) { + if (JiQi.get(metadata) != null) { + try { + return JiQi.get(metadata).tileEntity.newInstance(); + } catch (final InstantiationException e) { + e.printStackTrace(); + } catch (final IllegalAccessException e2) { + e2.printStackTrace(); + } + } + return null; + } + + @Override + public int quantityDropped(final Random par1Random) { + return 0; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderType() { + return RHJiQi.ID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public void getSubBlocks(final Item par1, final CreativeTabs par2CreativeTabs, + final List par3List) { + for (int i = 0; i < JiQi.values().length + 6; ++i) { + par3List.add(new ItemStack((Block) this, 1, i)); + } + } + + @Override + public ItemStack getPickBlock(final MovingObjectPosition target, + final World par1World, final int x, final int y, + final int z) { + final TileEntity tileEntity = par1World.getTileEntity(x, y, z); + return new ItemStack(ICBMExplosion.bJiQi, 1, getMachineId(tileEntity)); + } + + @Override + public int damageDropped(final int metadata) { + return metadata; + } + + public static int getMachineId(final TileEntity tileEntity) { + int itemMetadata = 0; + if (tileEntity != null) { + final int metadata = tileEntity.getBlockMetadata(); + if (tileEntity instanceof ITier) { + itemMetadata = ((ITier) tileEntity).getTier() + metadata * 3; + } else { + itemMetadata = 9 + metadata - 3; + } + } + return itemMetadata; + } + + public static String getMachineName(final TileEntity tileEntity) { + return TranslationHelper.getLocal("icbm.machine." + + getMachineId(tileEntity) + ".name"); + } + + @Override + public void registerBlockIcons(IIconRegister iconRegister) { + } + + public enum JiQi { + FaSheDi("FaSheDi", 0, TLauncherPlatform.class), + FaSheShiMuo("FaSheShiMuo", 1, TLauncherControlPanel.class), + FaSheJia("FaSheJia", 2, TLauncher.class), + LeiDaTai("LeiDaTai", 3, TRadarTower.class), + DianCiQi("DianCiQi", 4, TEmpTower.class), + XiaoFaSheQi("XiaoFaSheQi", 5, TCruiseLauncher.class), + YinDaoQi("YinDaoQi", 6, TMissileCoordinator.class); + + public Class tileEntity; + + private JiQi(final String name, final int ordinal, + final Class tileEntity) { + this.tileEntity = tileEntity; + } + + public static JiQi get(final int id) { + if (id < values().length && id >= 0) { + return values()[id]; + } + return null; + } + } +} diff --git a/src/main/java/icbm/zhapin/jiqi/IBMachine.java b/src/main/java/icbm/zhapin/jiqi/IBMachine.java new file mode 100644 index 0000000..9d518dd --- /dev/null +++ b/src/main/java/icbm/zhapin/jiqi/IBMachine.java @@ -0,0 +1,75 @@ +package icbm.zhapin.jiqi; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import universalelectricity.prefab.implement.ITier; + +public class IBMachine extends ItemBlock { + public IBMachine(final Block block) { + super(block); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + @Override + public int getMetadata(final int damage) { + return damage; + } + + @Override + public String getUnlocalizedName(final ItemStack itemstack) { + return this.getUnlocalizedName() + "." + itemstack.getItemDamage(); + } + + @Override + public String getUnlocalizedName() { + return "icbm.machine"; + } + + @Override + public boolean placeBlockAt(final ItemStack itemStack, final EntityPlayer entityPlayer, + final World world, final int x, final int y, final int z, + final int side, final float hitX, final float hitY, + final float hitZ, final int metadata) { + int jiQiMetadata; + if (itemStack.getItemDamage() < 3) { + jiQiMetadata = 0; + } else if (itemStack.getItemDamage() < 6) { + jiQiMetadata = 1; + } else if (itemStack.getItemDamage() < 9) { + jiQiMetadata = 2; + } else { + jiQiMetadata = itemStack.getItemDamage() - 6; + } + final int direction = MathHelper.floor_double( + ((Entity) entityPlayer).rotationYaw * 4.0f / 360.0f + 0.5) & + 0x3; + if (BMachine.canBePlacedAt(world, x, y, z, jiQiMetadata, direction)) { + if (world.setBlock(x, y, z, this.field_150939_a, jiQiMetadata, 3)) { + if (world.getBlock(x, y, z) == this.field_150939_a) { + if (itemStack.getItemDamage() < 9) { + final ITier tileEntity = (ITier) world.getTileEntity(x, y, z); + if (tileEntity != null) { + if (itemStack.getItemDamage() < 3) { + tileEntity.setTier(itemStack.getItemDamage()); + } else if (itemStack.getItemDamage() < 6) { + tileEntity.setTier(itemStack.getItemDamage() - 3); + } else if (itemStack.getItemDamage() < 9) { + tileEntity.setTier(itemStack.getItemDamage() - 6); + } + } + } + this.field_150939_a.onBlockPlacedBy(world, x, y, z, entityPlayer, + itemStack); + } + return true; + } + } + return false; + } +} diff --git a/src/main/java/icbm/zhapin/jiqi/LauncherManager.java b/src/main/java/icbm/zhapin/jiqi/LauncherManager.java new file mode 100644 index 0000000..a39a78e --- /dev/null +++ b/src/main/java/icbm/zhapin/jiqi/LauncherManager.java @@ -0,0 +1,48 @@ +package icbm.zhapin.jiqi; + +import java.util.ArrayList; +import java.util.List; +import universalelectricity.core.vector.Vector2; + +public class LauncherManager { + private static List launchers; + + public static void addLauncher(final TLauncherController launcher) { + findLaunchers(); + if (!LauncherManager.launchers.contains(launcher)) { + LauncherManager.launchers.add(launcher); + } + } + + public static List launchersInArea(final Vector2 minVector, + final Vector2 maxVector) { + findLaunchers(); + final List returnArray = new ArrayList<>(); + for (final TLauncherController launcher : LauncherManager.launchers) { + if (launcher.xCoord > minVector.x && launcher.xCoord < maxVector.x && + launcher.zCoord > minVector.y && launcher.zCoord < maxVector.y) { + returnArray.add(launcher); + } + } + return returnArray; + } + + public static List getLaunchers() { + findLaunchers(); + return LauncherManager.launchers; + } + + public static void findLaunchers() { + for (int i = 0; i < LauncherManager.launchers.size(); ++i) { + if (LauncherManager.launchers.get(i) == null) { + LauncherManager.launchers.remove(i); + } else if (LauncherManager.launchers.get(i).isInvalid()) { + LauncherManager.launchers.remove(i); + } + } + } + + static { + LauncherManager.launchers = new ArrayList<>(); + } +} diff --git a/src/main/java/icbm/zhapin/jiqi/TCruiseLauncher.java b/src/main/java/icbm/zhapin/jiqi/TCruiseLauncher.java new file mode 100644 index 0000000..7c5dbe1 --- /dev/null +++ b/src/main/java/icbm/zhapin/jiqi/TCruiseLauncher.java @@ -0,0 +1,393 @@ +package icbm.zhapin.jiqi; + +import dan200.computercraft.api.peripheral.IPeripheral; +import icbm.api.ILauncherContainer; +import icbm.api.ILauncherController; +import icbm.api.IMissile; +import icbm.api.LauncherType; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.daodan.EMissile; +import icbm.zhapin.daodan.ItMissile; +import icbm.zhapin.daodan.ItModuleMissile; +import icbm.zhapin.daodan.MissileBase; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.electricity.ElectricityPack; +import universalelectricity.core.item.ElectricItemHelper; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.multiblock.IBlockActivate; + +public class TCruiseLauncher + extends TLauncherController implements IBlockActivate, IInventory, ILauncherContainer { + public IMissile missile; + public float rotationYaw; + public float rotationPitch; + private ItemStack[] containingItems; + private boolean isPowered; + + public TCruiseLauncher() { + this.missile = null; + this.rotationYaw = 0.0f; + this.rotationPitch = 0.0f; + this.containingItems = new ItemStack[2]; + this.isPowered = false; + super.target = new Vector3(); + } + + @Override + public int getSizeInventory() { + return this.containingItems.length; + } + + @Override + public ItemStack getStackInSlot(final int par1) { + return this.containingItems[par1]; + } + + @Override + public ItemStack decrStackSize(final int par1, final int par2) { + if (this.containingItems[par1] == null) { + return null; + } + if (this.containingItems[par1].stackSize <= par2) { + final ItemStack var3 = this.containingItems[par1]; + this.containingItems[par1] = null; + return var3; + } + final ItemStack var3 = this.containingItems[par1].splitStack(par2); + if (this.containingItems[par1].stackSize == 0) { + this.containingItems[par1] = null; + } + return var3; + } + + @Override + public ItemStack getStackInSlotOnClosing(final int par1) { + if (this.containingItems[par1] != null) { + final ItemStack var2 = this.containingItems[par1]; + this.containingItems[par1] = null; + return var2; + } + return null; + } + + @Override + public void setInventorySlotContents(final int par1, + final ItemStack par2ItemStack) { + this.containingItems[par1] = par2ItemStack; + if (par2ItemStack != null && + par2ItemStack.stackSize > this.getInventoryStackLimit()) { + par2ItemStack.stackSize = this.getInventoryStackLimit(); + } + } + + @Override + public String getStatus() { + String color = "§4"; + String status = "Idle"; + if (this.isDisabled()) { + status = "Disabled"; + } else if (this.getJoules() < this.getMaxJoules()) { + status = "No Power!"; + } else if (this.missile == null) { + status = "Silo Empty!"; + } else if (super.target == null) { + status = "Invalid Target!"; + } else { + color = "§2"; + status = "Ready!"; + } + return color + status; + } + + @Override + public String getInventoryName() { + return "Cruise Launcher"; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!this.isDisabled()) { + this.onReceive(ElectricityPack.getFromWatts( + ElectricItemHelper.dechargeItem(this.containingItems[1], + this.getRequest().getWatts(), + this.getVoltage()), + this.getVoltage())); + if (this.getYawFromTarget() - this.rotationYaw != 0.0f) { + this.rotationYaw += + (float)((this.getYawFromTarget() - this.rotationYaw) * 0.1); + } + if (this.getPitchFromTarget() - this.rotationPitch != 0.0f) { + this.rotationPitch += + (float)((this.getPitchFromTarget() - this.rotationPitch) * 0.1); + } + if (!this.worldObj.isRemote) { + this.setMissile(); + if (this.isPowered) { + this.launch(); + this.isPowered = false; + } + } + if (!this.worldObj.isRemote && super.ticks % 3L == 0L) { + if (super.target == null) { + super.target = new Vector3(this.xCoord, this.yCoord, this.zCoord); + } + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + } + } + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + + nbt.setDouble("joules", this.getJoules()); + nbt.setInteger("frequency", super.frequency); + nbt.setInteger("disabledTicks", super.disabledTicks); + nbt.setTag("target", super.target.writeToNBT(new NBTTagCompound())); + + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, + this.getBlockMetadata(), nbt); + } + + @Override + public void placeMissile(final ItemStack itemStack) { + this.containingItems[0] = itemStack; + } + + public void setMissile() { + if (this.containingItems[0] != null && this.containingItems[0].getItem() + instanceof ItMissile) { + int haoMa = this.containingItems[0].getItemDamage(); + if (this.containingItems[0].getItem() instanceof ItModuleMissile) { + haoMa += 100; + } + if (!ICBMExplosion.shiBaoHu(this.worldObj, new Vector3(this), + ZhaPin.ZhaPinType.DAO_DAN, haoMa)) { + if (this.missile == null && MissileBase.list[haoMa].isCruise() && + MissileBase.list[haoMa].getTier() <= 3) { + final Vector3 startingPosition = new Vector3( + this.xCoord + 0.5f, this.yCoord + 0.2f, this.zCoord + 0.5f); + this.missile = new EMissile(this.worldObj, startingPosition, + new Vector3(this), haoMa); + this.worldObj.spawnEntityInWorld((Entity)this.missile); + return; + } + if (this.missile != null && + this.missile.getExplosiveType().getID() == haoMa) { + return; + } + } + } + if (this.missile != null) { + ((Entity)this.missile).setDead(); + } + this.missile = null; + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + + this.setJoules(nbt.getDouble("joules")); + super.frequency = nbt.getInteger("frequency"); + super.disabledTicks = nbt.getInteger("disabledTicks"); + super.target = Vector3.readFromNBT(nbt.getCompoundTag("target")); + } + + // TODO: WTF + // if (!this.worldObj.isRemote) { + // this.setFrequency(dataStream.readInt()); + // } + + private float getPitchFromTarget() { + final double distance = Math.sqrt( + (super.target.x - this.xCoord) * (super.target.x - this.xCoord) + + (super.target.z - this.zCoord) * (super.target.z - this.zCoord)); + return (float)Math.toDegrees( + Math.atan((super.target.y - (this.yCoord + 0.5f)) / distance)); + } + + private float getYawFromTarget() { + final double xDifference = super.target.x - (this.xCoord + 0.5f); + final double yDifference = super.target.z - (this.zCoord + 0.5f); + return (float)Math.toDegrees(Math.atan2(yDifference, xDifference)); + } + + @Override + public boolean canLaunch() { + if (this.missile != null && this.containingItems[0] != null) { + final MissileBase missile = + MissileBase.list[this.containingItems[0].getItemDamage()]; + int haoMa = this.missile.getExplosiveType().getID(); + if (this.missile.getExplosiveType().getID() >= 100) { + haoMa -= 100; + } + if (missile != null && missile.getID() == haoMa && missile.isCruise() && + missile.getTier() <= 3 && this.getJoules() >= this.getMaxJoules() && + !this.isTooClose(super.target)) { + return true; + } + } + return false; + } + + @Override + public void launch() { + if (this.canLaunch()) { + this.decrStackSize(0, 1); + this.setJoules(0.0); + this.missile.launch(super.target); + this.missile = null; + } + } + + public boolean isTooClose(final Vector3 target) { + return Vector3.distance(new Vector3(this.xCoord, 0.0, this.zCoord), + new Vector3(target.x, 0.0, target.z)) < 8.0; + } + + @Override + public void readFromNBT(final NBTTagCompound nbt) { + super.readFromNBT(nbt); + final NBTTagList var2 = nbt.getTagList("Items", 10); + this.containingItems = new ItemStack[this.getSizeInventory()]; + for (int var3 = 0; var3 < var2.tagCount(); ++var3) { + final NBTTagCompound var4 = var2.getCompoundTagAt(var3); + final byte var5 = var4.getByte("Slot"); + if (var5 >= 0 && var5 < this.containingItems.length) { + this.containingItems[var5] = ItemStack.loadItemStackFromNBT(var4); + } + } + } + + @Override + public void writeToNBT(final NBTTagCompound par1NBTTagCompound) { + super.writeToNBT(par1NBTTagCompound); + final NBTTagList var2 = new NBTTagList(); + for (int var3 = 0; var3 < this.containingItems.length; ++var3) { + if (this.containingItems[var3] != null) { + final NBTTagCompound var4 = new NBTTagCompound(); + var4.setByte("Slot", (byte)var3); + this.containingItems[var3].writeToNBT(var4); + var2.appendTag((NBTBase)var4); + } + } + par1NBTTagCompound.setTag("Items", (NBTBase)var2); + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public boolean isUseableByPlayer(final EntityPlayer par1EntityPlayer) { + return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) == + this && + par1EntityPlayer.getDistanceSq(this.xCoord + 0.5, this.yCoord + 0.5, + this.zCoord + 0.5) <= 64.0; + } + + @Override + public void onPowerOn() { + this.isPowered = true; + } + + @Override + public void onPowerOff() { + this.isPowered = false; + } + + @Override + public double getMaxJoules() { + return 800000.0; + } + + @Override + public boolean onActivated(final EntityPlayer entityPlayer) { + if (this.isItemValidForSlot(0, entityPlayer.inventory.getCurrentItem())) { + this.setInventorySlotContents(0, entityPlayer.inventory.getCurrentItem()); + entityPlayer.inventory.setInventorySlotContents( + entityPlayer.inventory.currentItem, (ItemStack)null); + return true; + } + entityPlayer.openGui((Object)ICBMExplosion.instance, 1, this.worldObj, + this.xCoord, this.yCoord, this.zCoord); + return true; + } + + @Override + public LauncherType getLauncherType() { + return LauncherType.CRUISE; + } + + @Override + public boolean canConnect(final ForgeDirection direction) { + return true; + } + + @Override + public boolean hasCustomInventoryName() { + return true; + } + + @Override + public boolean isItemValidForSlot(final int slotID, + final ItemStack itemStack) { + return itemStack != null && itemStack.getItem() instanceof ItMissile && + this.getStackInSlot(slotID) == null && + MissileBase.list[itemStack.getItemDamage()] != null && + MissileBase.list[itemStack.getItemDamage()].isCruise() && + MissileBase.list[itemStack.getItemDamage()].getTier() <= 3; + } + + @Override + public void setContainingMissile(final IMissile missile) { + this.missile = missile; + } + + @Override + public ILauncherController getController() { + return this; + } + + @Override + public IMissile getMissile() { + return this.missile; + } + + @Override + public IMissile getContainingMissile() { + return this.missile; + } + + @Override + public AxisAlignedBB getRenderBoundingBox() { + return TileEntity.INFINITE_EXTENT_AABB; + } + + @Override + public void openInventory() {} + + @Override + public void closeInventory() {} + + @Override + public boolean equals(IPeripheral other) { + return this == other; + } +} diff --git a/src/main/java/icbm/zhapin/jiqi/TEmpTower.java b/src/main/java/icbm/zhapin/jiqi/TEmpTower.java new file mode 100644 index 0000000..3a4713a --- /dev/null +++ b/src/main/java/icbm/zhapin/jiqi/TEmpTower.java @@ -0,0 +1,166 @@ +package icbm.zhapin.jiqi; + +import calclavia.lib.TileEntityUniversalStorable; +import icbm.api.RadarRegistry; +import icbm.core.MainBase; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.implement.IRedstoneReceptor; +import universalelectricity.prefab.multiblock.IMultiBlock; + +public class TEmpTower extends TileEntityUniversalStorable + implements IMultiBlock, IRedstoneReceptor { + public static final int MAX_RADIUS = 150; + public float xuanZhuan; + private float xuanZhuanLu; + public byte holzOhJa; + public int radius; + + public TEmpTower() { + this.xuanZhuan = 0.0f; + this.holzOhJa = 0; + this.radius = 60; + RadarRegistry.register(this); + } + + @Override + public void invalidate() { + RadarRegistry.unregister(this); + super.invalidate(); + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!this.isDisabled()) { + if (super.ticks % 20L == 0L && this.getJoules() > 0.0) { + this.worldObj.playSoundEffect( + (double) this.xCoord, (double) this.yCoord, (double) this.zCoord, + "icbm.machinehum", 0.5f, + (float) (0.8500000238418579 * this.getJoules() / + this.getMaxJoules())); + } + this.xuanZhuanLu = (float) (Math.pow(this.getJoules() / this.getMaxJoules(), 2.0) * 0.5); + this.xuanZhuan += this.xuanZhuanLu; + if (this.xuanZhuan > 360.0f) { + this.xuanZhuan = 0.0f; + } + } + if (!this.worldObj.isRemote) { + if (super.ticks % 10L == 0L) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + } + } + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + + this.setJoules(nbt.getDouble("joules")); + super.disabledTicks = nbt.getInteger("disabledTicks"); + this.radius = nbt.getInteger("radius"); + this.holzOhJa = nbt.getByte("holzOhJa"); + } + + // TODO: WTF + // else if (ID == 2) { + // this.radius = dataStream.readInt(); + // } else if (ID == 3) { + // this.holzOhJa = dataStream.readByte(); + // } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + + nbt.setDouble("joules", this.getJoules()); + nbt.setInteger("disabledTicks", super.disabledTicks); + nbt.setInteger("radius", this.radius); + nbt.setByte("holzOhJa", this.holzOhJa); + + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, + this.getBlockMetadata(), nbt); + } + + @Override + public double getVoltage() { + return 240.0; + } + + @Override + public void readFromNBT(final NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.radius = nbt.getInteger("radius"); + this.holzOhJa = nbt.getByte("holzOhJa"); + } + + @Override + public void writeToNBT(final NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("radius", this.radius); + nbt.setByte("holzOhJa", this.holzOhJa); + } + + @Override + public void onPowerOn() { + if (this.getJoules() >= this.getMaxJoules()) { + if (this.holzOhJa == 0 || this.holzOhJa == 1) { + ZhaPin.empSignal.doBaoZha( + this.worldObj, new Vector3(this.xCoord, this.yCoord, this.zCoord), + null, this.radius, -1); + } + if (this.holzOhJa == 0 || this.holzOhJa == 2) { + ZhaPin.empWave.doBaoZha( + this.worldObj, new Vector3(this.xCoord, this.yCoord, this.zCoord), + null, this.radius, -1); + } + this.setJoules(0.0); + } + } + + @Override + public void onPowerOff() { + } + + @Override + public void onDestroy(final TileEntity callingBlock) { + this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord, Blocks.air, 0, + 2); + this.worldObj.setBlock(this.xCoord, this.yCoord + 1, this.zCoord, + Blocks.air, 0, 2); + } + + @Override + public boolean onActivated(final EntityPlayer entityPlayer) { + entityPlayer.openGui((Object) ICBMExplosion.instance, 6, this.worldObj, + this.xCoord, this.yCoord, this.zCoord); + return true; + } + + @Override + public void onCreate(final Vector3 position) { + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(position, new Vector3(0.0, 1.0, 0.0)), + new Vector3(this)); + } + + @Override + public double getMaxJoules() { + return Math.max(2000000.0f * (this.radius / 150.0f), 1000000.0f); + } + + @Override + public AxisAlignedBB getRenderBoundingBox() { + return TileEntity.INFINITE_EXTENT_AABB; + } +} diff --git a/src/main/java/icbm/zhapin/jiqi/TLauncher.java b/src/main/java/icbm/zhapin/jiqi/TLauncher.java new file mode 100644 index 0000000..ce300c4 --- /dev/null +++ b/src/main/java/icbm/zhapin/jiqi/TLauncher.java @@ -0,0 +1,137 @@ +package icbm.zhapin.jiqi; + +import icbm.core.MainBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.implement.IRotatable; +import universalelectricity.prefab.implement.ITier; +import universalelectricity.prefab.multiblock.IMultiBlock; +import universalelectricity.prefab.multiblock.TileEntityMulti; +import universalelectricity.prefab.tile.TileEntityAdvanced; + +public class TLauncher + extends TileEntityAdvanced implements ITier, IMultiBlock, IRotatable { + private int tier; + private byte orientation; + + public TLauncher() { + this.tier = 0; + this.orientation = 3; + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + + this.orientation = nbt.getByte("orientation"); + this.tier = nbt.getInteger("tier"); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + + nbt.setByte("orientation", this.orientation); + nbt.setInteger("tier", this.tier); + + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, + this.getBlockMetadata(), nbt); + } + + public int getInaccuracy() { + switch (this.tier) { + default: { + return 15; + } + case 1: { + return 7; + } + case 2: { + return 0; + } + } + } + + @Override + public boolean canUpdate() { + return false; + } + + @Override + public void readFromNBT(final NBTTagCompound par1NBTTagCompound) { + super.readFromNBT(par1NBTTagCompound); + this.tier = par1NBTTagCompound.getInteger("tier"); + } + + @Override + public void writeToNBT(final NBTTagCompound par1NBTTagCompound) { + super.writeToNBT(par1NBTTagCompound); + par1NBTTagCompound.setInteger("tier", this.tier); + } + + @Override + public int getTier() { + return this.tier; + } + + @Override + public void setTier(final int tier) { + this.tier = tier; + } + + @Override + public void onDestroy(final TileEntity callingBlock) { + this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord, Blocks.air, 0, + 2); + this.worldObj.setBlock(this.xCoord, this.yCoord + 1, this.zCoord, + Blocks.air, 0, 2); + this.worldObj.setBlock(this.xCoord, this.yCoord + 2, this.zCoord, + Blocks.air, 0, 2); + } + + @Override + public boolean onActivated(final EntityPlayer par5EntityPlayer) { + return false; + } + + @Override + public void onCreate(final Vector3 position) { + this.worldObj.setBlock(position.intX(), position.intY() + 1, + position.intZ(), MainBase.bJia, 0, 2); + ((TileEntityMulti) this.worldObj.getTileEntity( + position.intX(), position.intY() + 1, position.intZ())) + .setMainBlock(position); + this.worldObj.setBlock(position.intX(), position.intY() + 2, + position.intZ(), MainBase.bJia, 0, 2); + ((TileEntityMulti) this.worldObj.getTileEntity( + position.intX(), position.intY() + 2, position.intZ())) + .setMainBlock(position); + } + + @Override + public ForgeDirection getDirection(final IBlockAccess world, final int x, + final int y, final int z) { + return ForgeDirection.getOrientation((int) this.orientation); + } + + @Override + public void setDirection(final World world, final int x, final int y, + final int z, final ForgeDirection facingDirection) { + this.orientation = (byte) facingDirection.ordinal(); + } + + @Override + public AxisAlignedBB getRenderBoundingBox() { + return TileEntity.INFINITE_EXTENT_AABB; + } +} diff --git a/src/main/java/icbm/zhapin/jiqi/TLauncherControlPanel.java b/src/main/java/icbm/zhapin/jiqi/TLauncherControlPanel.java new file mode 100644 index 0000000..ac1d1b8 --- /dev/null +++ b/src/main/java/icbm/zhapin/jiqi/TLauncherControlPanel.java @@ -0,0 +1,267 @@ +package icbm.zhapin.jiqi; + +import dan200.computercraft.api.peripheral.IPeripheral; +import icbm.api.IMissile; +import icbm.api.LauncherType; +import icbm.zhapin.ICBMExplosion; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.implement.IRotatable; +import universalelectricity.prefab.implement.ITier; +import universalelectricity.prefab.multiblock.IBlockActivate; + +public class TLauncherControlPanel + extends TLauncherController implements IBlockActivate, ITier, IRotatable { + private boolean isPowered; + private byte direction; + private int tier; + public TLauncherPlatform faSheDi; + public short height; + + public TLauncherControlPanel() { + this.isPowered = false; + this.direction = 3; + this.tier = 0; + this.faSheDi = null; + this.height = 3; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!this.isDisabled()) { + if (this.faSheDi == null) { + for (byte i = 2; i < 6; ++i) { + final Vector3 position = new Vector3(this.xCoord, this.yCoord, this.zCoord); + position.modifyPositionFromSide( + ForgeDirection.getOrientation((int) i)); + final TileEntity tileEntity = this.worldObj.getTileEntity( + position.intX(), position.intY(), position.intZ()); + if (tileEntity != null && tileEntity instanceof TLauncherPlatform) { + this.faSheDi = (TLauncherPlatform) tileEntity; + this.direction = i; + } + } + } else if (this.faSheDi.isInvalid()) { + this.faSheDi = null; + } + if (this.isPowered) { + this.isPowered = false; + this.launch(); + } + } + if (!this.worldObj.isRemote) { + if (super.ticks % 10L == 0L) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + } + } + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + + nbt.setDouble("joules", this.getJoules()); + nbt.setByte("direction", this.direction); + nbt.setInteger("tier", this.tier); + nbt.setInteger("frequency", this.getFrequency()); + nbt.setShort("height", this.height); + + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, + this.getBlockMetadata(), nbt); + } + + @Override + public void placeMissile(final ItemStack itemStack) { + if (this.faSheDi != null && !this.faSheDi.isInvalid()) { + this.faSheDi.setInventorySlotContents(0, itemStack); + } + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + + this.setJoules(nbt.getDouble("joules")); + this.direction = nbt.getByte("direction"); + this.tier = nbt.getInteger("tier"); + this.setFrequency(nbt.getInteger("frequency")); + this.height = nbt.getShort("height"); + } + + // TODO: WTF + // } else if (!this.worldObj.isRemote) { + // if (ID == 1) { + // this.setFrequency(dataStream.readInt()); + // } else if (ID == 2) { + // super.target = new Vector3(dataStream.readDouble(), + // dataStream.readDouble(), + // dataStream.readDouble()); + // if (this.getTier() < 2) { + // super.target.y = 0.0; + // } + // } else if (ID == 3) { + // this.height = (short) Math.max(Math.min(dataStream.readShort(), 99), + // 3); + // } + // } else if (ID == 3 && this.worldObj.isRemote) { + // this.setJoules(dataStream.readDouble()); + // super.disabledTicks = dataStream.readInt(); + // super.target = new Vector3(dataStream.readDouble(), + // dataStream.readDouble(), + // dataStream.readDouble()); + // } + + @Override + public boolean canLaunch() { + return this.faSheDi != null && !this.isDisabled() && + this.faSheDi.daoDan != null && + this.getJoules() >= this.getMaxJoules() && + this.faSheDi.isInRange(super.target); + } + + @Override + public void launch() { + if (this.canLaunch()) { + this.setJoules(0.0); + this.faSheDi.launchMissile(super.target.clone(), this.height); + } + } + + @Override + public String getStatus() { + String color = "§4"; + String status = "Idle"; + if (this.isDisabled()) { + status = "Disabled"; + } else if (this.faSheDi == null) { + status = "Not connected!"; + } else if (this.getJoules() < this.getMaxJoules()) { + status = "Insufficient electricity!"; + } else if (this.faSheDi.daoDan == null) { + status = "Missile silo is empty!"; + } else if (super.target == null) { + status = "Target is invalid!"; + } else if (this.faSheDi.shiTaiJin(super.target)) { + status = "Target too close!"; + } else if (this.faSheDi.shiTaiYuan(super.target)) { + status = "Target too far!"; + } else { + color = "§2"; + status = "Ready to launch!"; + } + return color + status; + } + + @Override + public void readFromNBT(final NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.tier = nbt.getInteger("tier"); + this.direction = nbt.getByte("facingDirection"); + this.height = nbt.getShort("height"); + } + + @Override + public void writeToNBT(final NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("tier", this.tier); + nbt.setByte("facingDirection", this.direction); + nbt.setShort("height", this.height); + } + + @Override + public double getVoltage() { + switch (this.getTier()) { + default: { + return 120.0; + } + case 1: { + return 240.0; + } + case 2: { + return 480.0; + } + } + } + + @Override + public void onPowerOn() { + this.isPowered = true; + } + + @Override + public void onPowerOff() { + this.isPowered = false; + } + + @Override + public int getTier() { + return this.tier; + } + + @Override + public void setTier(final int tier) { + this.tier = tier; + } + + @Override + public ForgeDirection getDirection(final IBlockAccess world, final int x, + final int y, final int z) { + return ForgeDirection.getOrientation((int) this.direction); + } + + @Override + public void setDirection(final World world, final int x, final int y, + final int z, final ForgeDirection facingDirection) { + this.direction = (byte) facingDirection.ordinal(); + } + + @Override + public double getMaxJoules() { + switch (this.getTier()) { + case 0: { + return 400000.0; + } + case 1: { + return 60000.0; + } + default: { + return 800000.0; + } + } + } + + @Override + public boolean onActivated(final EntityPlayer entityPlayer) { + entityPlayer.openGui((Object) ICBMExplosion.instance, 2, this.worldObj, + this.xCoord, this.yCoord, this.zCoord); + return true; + } + + @Override + public LauncherType getLauncherType() { + return LauncherType.TRADITIONAL; + } + + @Override + public IMissile getMissile() { + if (this.faSheDi != null) { + return this.faSheDi.getContainingMissile(); + } + return null; + } + + @Override + public boolean equals(IPeripheral other) { + return this == other; + } +} diff --git a/src/main/java/icbm/zhapin/jiqi/TLauncherController.java b/src/main/java/icbm/zhapin/jiqi/TLauncherController.java new file mode 100644 index 0000000..104ac2e --- /dev/null +++ b/src/main/java/icbm/zhapin/jiqi/TLauncherController.java @@ -0,0 +1,149 @@ +package icbm.zhapin.jiqi; + +import calclavia.lib.TileEntityUniversalStorable; +import dan200.computercraft.api.lua.ILuaContext; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.peripheral.IComputerAccess; +import dan200.computercraft.api.peripheral.IPeripheral; +import icbm.api.ILauncherController; +import icbm.api.LauncherType; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.vector.Vector3; + +public abstract class TLauncherController extends TileEntityUniversalStorable + implements ILauncherController, IPeripheral { + protected Vector3 target; + protected int frequency; + + public TLauncherController() { + this.target = null; + this.frequency = 0; + LauncherManager.addLauncher(this); + } + + @Override + public boolean canConnect(final ForgeDirection direction) { + return true; + } + + @Override + public Vector3 getTarget() { + if (this.target == null) { + if (this.getLauncherType() == LauncherType.CRUISE) { + this.target = new Vector3(this.xCoord, this.yCoord, this.zCoord); + } else { + this.target = new Vector3(this.xCoord, 0.0, this.zCoord); + } + } + return this.target; + } + + @Override + public void setTarget(final Vector3 target) { + this.target = target.floor(); + } + + @Override + public int getFrequency() { + return this.frequency; + } + + @Override + public void setFrequency(final int frequency) { + this.frequency = frequency; + } + + @Override + public String getType() { + return "ICBMLauncher"; + } + + @Override + public String[] getMethodNames() { + return new String[] { "launch", "getTarget", "setTarget", + "canLaunch", "setFrequency", "getFrequency", + "getMissile" }; + } + + @Override + public Object[] callMethod(final IComputerAccess computer, ILuaContext ctx, final int method, + final Object[] arguments) throws LuaException { + switch (method) { + case 0: { + this.launch(); + return null; + } + case 1: { + return new Object[] { this.getTarget().x, this.getTarget().y, + this.getTarget().z }; + } + case 2: { + if (arguments[0] != null && arguments[1] != null && + arguments[2] != null) { + try { + this.setTarget(new Vector3((double) arguments[0], (double) arguments[1], + (double) arguments[2])); + } catch (final Exception e) { + e.printStackTrace(); + throw new LuaException("Target Parameter is Invalid."); + } + } + return null; + } + case 3: { + return new Object[] { this.canLaunch() }; + } + case 4: { + if (arguments[0] != null) { + try { + double arg = (double) arguments[0]; + arg = Math.max(Math.min(arg, 32767.0), -32768.0); + this.setFrequency((short) arg); + } catch (final Exception e) { + e.printStackTrace(); + throw new LuaException("Frequency Parameter is Invalid."); + } + } + return null; + } + case 5: { + return new Object[] { this.getFrequency() }; + } + case 6: { + if (this.getMissile() != null) { + return new Object[] { + this.getMissile().getExplosiveType().getMissileName() }; + } + return null; + } + default: { + throw new LuaException("Invalid ICBM Launcher Function."); + } + } + } + + @Override + public void attach(final IComputerAccess computer) { + } + + @Override + public void detach(final IComputerAccess computer) { + } + + @Override + public void readFromNBT(final NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.setFrequency(nbt.getInteger("frequency")); + this.target = Vector3.readFromNBT(nbt.getCompoundTag("target")); + } + + @Override + public void writeToNBT(final NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("frequency", this.getFrequency()); + if (this.target != null) { + nbt.setTag("target", this.target.writeToNBT(new NBTTagCompound())); + } + } +} diff --git a/src/main/java/icbm/zhapin/jiqi/TLauncherPlatform.java b/src/main/java/icbm/zhapin/jiqi/TLauncherPlatform.java new file mode 100644 index 0000000..71f708a --- /dev/null +++ b/src/main/java/icbm/zhapin/jiqi/TLauncherPlatform.java @@ -0,0 +1,441 @@ +package icbm.zhapin.jiqi; + +import icbm.api.ILauncherContainer; +import icbm.api.ILauncherController; +import icbm.api.IMissile; +import icbm.core.MainBase; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.daodan.EMissile; +import icbm.zhapin.daodan.ItMissile; +import icbm.zhapin.daodan.ItModuleMissile; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.vector.Vector3; +import universalelectricity.core.vector.VectorHelper; +import universalelectricity.prefab.implement.IRotatable; +import universalelectricity.prefab.implement.ITier; +import universalelectricity.prefab.multiblock.IMultiBlock; +import universalelectricity.prefab.tile.TileEntityAdvanced; + +public class TLauncherPlatform extends TileEntityAdvanced + implements ILauncherContainer, IRotatable, ITier, IMultiBlock, IInventory { + public IMissile daoDan; + public TLauncher jiaZi; + private ItemStack[] containingItems; + private int tier; + private byte orientation; + private boolean packetGengXin; + + public TLauncherPlatform() { + this.daoDan = null; + this.jiaZi = null; + this.containingItems = new ItemStack[1]; + this.tier = 0; + this.orientation = 3; + this.packetGengXin = true; + } + + @Override + public int getSizeInventory() { + return this.containingItems.length; + } + + @Override + public ItemStack getStackInSlot(final int par1) { + return this.containingItems[par1]; + } + + @Override + public ItemStack decrStackSize(final int par1, final int par2) { + if (this.containingItems[par1] == null) { + return null; + } + if (this.containingItems[par1].stackSize <= par2) { + final ItemStack var3 = this.containingItems[par1]; + this.containingItems[par1] = null; + return var3; + } + final ItemStack var3 = this.containingItems[par1].splitStack(par2); + if (this.containingItems[par1].stackSize == 0) { + this.containingItems[par1] = null; + } + return var3; + } + + @Override + public ItemStack getStackInSlotOnClosing(final int par1) { + if (this.containingItems[par1] != null) { + final ItemStack var2 = this.containingItems[par1]; + this.containingItems[par1] = null; + return var2; + } + return null; + } + + @Override + public void setInventorySlotContents(final int par1, + final ItemStack par2ItemStack) { + this.containingItems[par1] = par2ItemStack; + if (par2ItemStack != null && + par2ItemStack.stackSize > this.getInventoryStackLimit()) { + par2ItemStack.stackSize = this.getInventoryStackLimit(); + } + } + + @Override + public String getInventoryName() { + return "Launcher Platform"; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (this.jiaZi == null) { + for (byte i = 2; i < 6; ++i) { + final Vector3 position = new Vector3(this.xCoord, this.yCoord, this.zCoord); + position.modifyPositionFromSide(ForgeDirection.getOrientation((int) i)); + final TileEntity tileEntity = this.worldObj.getTileEntity( + position.intX(), position.intY(), position.intZ()); + if (tileEntity instanceof TLauncher) { + (this.jiaZi = (TLauncher) tileEntity) + .setDirection(this.worldObj, this.xCoord, this.yCoord, + this.zCoord, + VectorHelper.getOrientationFromSide( + ForgeDirection.getOrientation((int) i), + ForgeDirection.NORTH)); + } + } + } else if (this.jiaZi.isInvalid()) { + this.jiaZi = null; + } else if (this.packetGengXin || + (super.ticks % 600L == 0L && this.jiaZi != null && + !this.worldObj.isRemote)) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + } + if (!this.worldObj.isRemote) { + this.setMissile(); + if (this.packetGengXin || super.ticks % 600L == 0L) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + this.packetGengXin = false; + } + } + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + + nbt.setByte("orientation", this.orientation); + nbt.setInteger("tier", this.tier); + + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, + this.getBlockMetadata(), nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + + this.orientation = nbt.getByte("orientation"); + this.tier = nbt.getInteger("tier"); + } + + private void setMissile() { + if (!this.worldObj.isRemote) { + if (this.containingItems[0] != null && this.containingItems[0].getItem() instanceof ItMissile) { + int haoMa = this.containingItems[0].getItemDamage(); + if (!ICBMExplosion.shiBaoHu(this.worldObj, new Vector3(this), + ZhaPin.ZhaPinType.DAO_DAN, haoMa)) { + if (this.containingItems[0].getItem() instanceof ItModuleMissile) { + haoMa += 100; + } + if (this.daoDan == null) { + final Vector3 position = new Vector3( + this.xCoord + 0.5f, this.yCoord + 2, this.zCoord + 0.5f); + this.daoDan = new EMissile(this.worldObj, position, new Vector3(this), haoMa); + this.worldObj.spawnEntityInWorld((Entity) this.daoDan); + return; + } + if (this.daoDan.getExplosiveType() != null && + this.daoDan.getExplosiveType().getID() == haoMa) { + return; + } + } + } + if (this.daoDan != null) { + ((Entity) this.daoDan).setDead(); + } + this.daoDan = null; + } + } + + public void launchMissile(final Vector3 target, final int gaoDu) { + float inaccuracy; + if (this.jiaZi != null) { + inaccuracy = (float) this.jiaZi.getInaccuracy(); + } else { + inaccuracy = 30.0f; + } + inaccuracy *= (float) Math.random() * 2.0f - 1.0f; + target.x += inaccuracy; + target.z += inaccuracy; + this.decrStackSize(0, 1); + this.daoDan.launch(target, gaoDu); + this.daoDan = null; + } + + public boolean isInRange(final Vector3 target) { + return target != null && !this.shiTaiYuan(target) && + !this.shiTaiJin(target); + } + + public boolean shiTaiJin(final Vector3 target) { + return Vector3.distance(new Vector3(this.xCoord, 0.0, this.zCoord), + new Vector3(target.x, 0.0, target.z)) < 10.0; + } + + public boolean shiTaiYuan(final Vector3 target) { + if (this.tier == 0) { + if (Vector3.distance(new Vector3(this.xCoord, 0.0, this.zCoord), + new Vector3(target.x, 0.0, target.z)) < MainBase.DAO_DAN_ZUI_YUAN / 10) { + return false; + } + } else if (this.tier == 1) { + if (Vector3.distance(new Vector3(this.xCoord, 0.0, this.zCoord), + new Vector3(target.x, 0.0, target.z)) < MainBase.DAO_DAN_ZUI_YUAN / 5) { + return false; + } + } else if (this.tier == 2 && + Vector3.distance(new Vector3(this.xCoord, 0.0, this.zCoord), + new Vector3(target.x, 0.0, target.z)) < MainBase.DAO_DAN_ZUI_YUAN) { + return false; + } + return true; + } + + @Override + public void readFromNBT(final NBTTagCompound nbt) { + super.readFromNBT(nbt); + final NBTTagList var2 = nbt.getTagList("Items", 10); + this.tier = nbt.getInteger("tier"); + this.orientation = nbt.getByte("facingDirection"); + this.containingItems = new ItemStack[this.getSizeInventory()]; + for (int var3 = 0; var3 < var2.tagCount(); ++var3) { + final NBTTagCompound var4 = (NBTTagCompound) var2.getCompoundTagAt(var3); + final byte var5 = var4.getByte("Slot"); + if (var5 >= 0 && var5 < this.containingItems.length) { + this.containingItems[var5] = ItemStack.loadItemStackFromNBT(var4); + } + } + } + + @Override + public void writeToNBT(final NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("tier", this.tier); + nbt.setByte("facingDirection", this.orientation); + final NBTTagList var2 = new NBTTagList(); + for (int var3 = 0; var3 < this.containingItems.length; ++var3) { + if (this.containingItems[var3] != null) { + final NBTTagCompound var4 = new NBTTagCompound(); + var4.setByte("Slot", (byte) var3); + this.containingItems[var3].writeToNBT(var4); + var2.appendTag((NBTBase) var4); + } + } + nbt.setTag("Items", (NBTBase) var2); + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public boolean isUseableByPlayer(final EntityPlayer par1EntityPlayer) { + return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) == this && + par1EntityPlayer.getDistanceSq(this.xCoord + 0.5, this.yCoord + 0.5, + this.zCoord + 0.5) <= 64.0; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public int getTier() { + return this.tier; + } + + @Override + public void setTier(final int tier) { + this.tier = tier; + } + + @Override + public boolean onActivated(final EntityPlayer entityPlayer) { + if (entityPlayer.inventory.getCurrentItem() != null && + this.getStackInSlot(0) == null && + entityPlayer.inventory.getCurrentItem().getItem() instanceof ItMissile) { + this.setInventorySlotContents(0, entityPlayer.inventory.getCurrentItem()); + entityPlayer.inventory.setInventorySlotContents( + entityPlayer.inventory.currentItem, (ItemStack) null); + return true; + } + entityPlayer.openGui((Object) ICBMExplosion.instance, 7, this.worldObj, + this.xCoord, this.yCoord, this.zCoord); + return true; + } + + @Override + public void onCreate(final Vector3 position) { + if (this.orientation == 3 || this.orientation == 2) { + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(position, new Vector3(1.0, 0.0, 0.0)), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(position, new Vector3(1.0, 1.0, 0.0)), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(position, new Vector3(1.0, 2.0, 0.0)), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(position, new Vector3(-1.0, 0.0, 0.0)), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(position, new Vector3(-1.0, 1.0, 0.0)), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(position, new Vector3(-1.0, 2.0, 0.0)), + new Vector3(this)); + } else { + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(position, new Vector3(0.0, 0.0, 1.0)), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(position, new Vector3(0.0, 1.0, 1.0)), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(position, new Vector3(0.0, 2.0, 1.0)), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(position, new Vector3(0.0, 0.0, -1.0)), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(position, new Vector3(0.0, 1.0, -1.0)), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(position, new Vector3(0.0, 2.0, -1.0)), + new Vector3(this)); + } + } + + @Override + public void onDestroy(final TileEntity callingBlock) { + final Vector3 position = new Vector3(this.xCoord, this.yCoord, this.zCoord); + if (this.orientation == 3 || this.orientation == 2) { + this.worldObj.setBlock((int) position.x, (int) position.y, (int) position.z, + Blocks.air, 0, 2); + this.worldObj.setBlock((int) position.x + 1, (int) position.y, + (int) position.z, Blocks.air, 0, 2); + this.worldObj.setBlock((int) position.x + 1, (int) position.y + 1, + (int) position.z, Blocks.air, 0, 2); + this.worldObj.setBlock((int) position.x + 1, (int) position.y + 2, + (int) position.z, Blocks.air, 0, 2); + this.worldObj.setBlock((int) position.x - 1, (int) position.y, + (int) position.z, Blocks.air, 0, 2); + this.worldObj.setBlock((int) position.x - 1, (int) position.y + 1, + (int) position.z, Blocks.air, 0, 2); + this.worldObj.setBlock((int) position.x - 1, (int) position.y + 2, + (int) position.z, Blocks.air, 0, 2); + } else { + this.worldObj.setBlock((int) position.x, (int) position.y, (int) position.z, + Blocks.air, 0, 2); + this.worldObj.setBlock((int) position.x, (int) position.y, + (int) position.z + 1, Blocks.air, 0, 2); + this.worldObj.setBlock((int) position.x, (int) position.y + 1, + (int) position.z + 1, Blocks.air, 0, 2); + this.worldObj.setBlock((int) position.x, (int) position.y + 2, + (int) position.z + 1, Blocks.air, 0, 2); + this.worldObj.setBlock((int) position.x, (int) position.y, + (int) position.z - 1, Blocks.air, 0, 2); + this.worldObj.setBlock((int) position.x, (int) position.y + 1, + (int) position.z - 1, Blocks.air, 0, 2); + this.worldObj.setBlock((int) position.x, (int) position.y + 2, + (int) position.z - 1, Blocks.air, 0, 2); + } + if (this.daoDan != null) { + ((Entity) this.daoDan).setDead(); + } + } + + @Override + public ForgeDirection getDirection(final IBlockAccess world, final int x, + final int y, final int z) { + return ForgeDirection.getOrientation((int) this.orientation); + } + + @Override + public void setDirection(final World world, final int x, final int y, + final int z, final ForgeDirection facingDirection) { + this.orientation = (byte) facingDirection.ordinal(); + } + + @Override + public AxisAlignedBB getRenderBoundingBox() { + return TileEntity.INFINITE_EXTENT_AABB; + } + + @Override + public boolean hasCustomInventoryName() { + return true; + } + + @Override + public boolean isItemValidForSlot(final int slotID, + final ItemStack itemStack) { + return itemStack.getItem() instanceof ItMissile; + } + + @Override + public IMissile getContainingMissile() { + return this.daoDan; + } + + @Override + public void setContainingMissile(final IMissile missile) { + this.daoDan = missile; + } + + @Override + public ILauncherController getController() { + for (byte i = 2; i < 6; ++i) { + final Vector3 position = new Vector3(this).modifyPositionFromSide( + ForgeDirection.getOrientation((int) i)); + final TileEntity tileEntity = position.getTileEntity((IBlockAccess) this.worldObj); + if (tileEntity instanceof ILauncherController) { + return (ILauncherController) tileEntity; + } + } + return null; + } +} diff --git a/src/main/java/icbm/zhapin/jiqi/TMissileCoordinator.java b/src/main/java/icbm/zhapin/jiqi/TMissileCoordinator.java new file mode 100644 index 0000000..5c58317 --- /dev/null +++ b/src/main/java/icbm/zhapin/jiqi/TMissileCoordinator.java @@ -0,0 +1,41 @@ +package icbm.zhapin.jiqi; + +import calclavia.lib.TileEntityUniversalRunnable; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.prefab.implement.IRotatable; + +public class TMissileCoordinator + extends TileEntityUniversalRunnable implements IRotatable { + private byte facingDirection; + + public TMissileCoordinator() { this.facingDirection = 3; } + + // TODO: WTF: nix data packet? + + @Override + public void readFromNBT(final NBTTagCompound par1NBTTagCompound) { + super.readFromNBT(par1NBTTagCompound); + this.facingDirection = par1NBTTagCompound.getByte("facingDirection"); + } + + @Override + public void writeToNBT(final NBTTagCompound par1NBTTagCompound) { + super.writeToNBT(par1NBTTagCompound); + par1NBTTagCompound.setByte("facingDirection", this.facingDirection); + } + + @Override + public ForgeDirection getDirection(final IBlockAccess world, final int x, + final int y, final int z) { + return ForgeDirection.getOrientation((int)this.facingDirection); + } + + @Override + public void setDirection(final World world, final int x, final int y, + final int z, final ForgeDirection facingDirection) { + this.facingDirection = (byte)facingDirection.ordinal(); + } +} diff --git a/src/main/java/icbm/zhapin/jiqi/TRadarTower.java b/src/main/java/icbm/zhapin/jiqi/TRadarTower.java new file mode 100644 index 0000000..ba57c3f --- /dev/null +++ b/src/main/java/icbm/zhapin/jiqi/TRadarTower.java @@ -0,0 +1,426 @@ +package icbm.zhapin.jiqi; + +import calclavia.lib.TileEntityUniversalRunnable; +import dan200.computercraft.api.lua.ILuaContext; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.peripheral.IComputerAccess; +import dan200.computercraft.api.peripheral.IPeripheral; +import icbm.api.IItemFrequency; +import icbm.api.RadarRegistry; +import icbm.core.MainBase; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.daodan.EMissile; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.electricity.ElectricityPack; +import universalelectricity.core.vector.Vector2; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.block.BlockAdvanced; +import universalelectricity.prefab.implement.IRedstoneProvider; +import universalelectricity.prefab.multiblock.IMultiBlock; + +public class TRadarTower extends TileEntityUniversalRunnable + implements IRedstoneProvider, IMultiBlock, IPeripheral { + public static final int MAX_BIAN_JING = 500; + public float xuanZhuan; + public int alarmRadius; + public int safetyRadius; + private List missilesInRange; + public List xunZhaoEntity; + public List xunZhaoJiQi; + public boolean emitAll; + private ForgeChunkManager.Ticket ticket; + + public TRadarTower() { + this.xuanZhuan = 0.0f; + this.alarmRadius = 100; + this.safetyRadius = 50; + this.missilesInRange = new ArrayList<>(); + this.xunZhaoEntity = new ArrayList<>(); + this.xunZhaoJiQi = new ArrayList<>(); + this.emitAll = true; + RadarRegistry.register(this); + } + + @Override + public void initiate() { + if (this.worldObj != null) { + this.worldObj.notifyBlocksOfNeighborChange( + this.xCoord, this.yCoord, this.zCoord, + this.worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord)); + } + if (this.ticket == null) { + this.ticket = ForgeChunkManager.requestTicket( + (Object)ICBMExplosion.instance, this.worldObj, + ForgeChunkManager.Type.NORMAL); + if (this.ticket != null) { + this.ticket.getModData(); + } + } + ForgeChunkManager.forceChunk( + this.ticket, new ChunkCoordIntPair(this.xCoord >> 4, this.zCoord >> 4)); + } + + @Override + public void updateEntity() { + super.updateEntity(); + try { + if (!this.worldObj.isRemote) { + if (super.ticks % 40L == 0L) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, + this.zCoord); + } + } + if (!this.isDisabled()) { + if (super.wattsReceived >= this.getRequest().getWatts()) { + this.xuanZhuan += 0.05f; + if (this.xuanZhuan > 360.0f) { + this.xuanZhuan = 0.0f; + } + if (!this.worldObj.isRemote) { + super.wattsReceived = Math.max( + super.wattsReceived - this.getRequest().getWatts(), 0.0); + } + final int prevShuMu = this.xunZhaoEntity.size(); + this.doScan(); + if (prevShuMu != this.xunZhaoEntity.size()) { + this.worldObj.notifyBlocksOfNeighborChange( + this.xCoord, this.yCoord, this.zCoord, this.getBlockType()); + } + } else { + if (this.xunZhaoEntity.size() > 0) { + this.worldObj.notifyBlocksOfNeighborChange( + this.xCoord, this.yCoord, this.zCoord, this.getBlockType()); + } + this.xunZhaoEntity.clear(); + this.xunZhaoJiQi.clear(); + } + } + if (super.ticks % 40L == 0L) { + this.worldObj.notifyBlocksOfNeighborChange( + this.xCoord, this.yCoord, this.zCoord, this.getBlockType()); + } + } catch (final Exception e) { + e.printStackTrace(); + } + } + + private void doScan() { + this.missilesInRange.clear(); + this.xunZhaoEntity.clear(); + this.xunZhaoJiQi.clear(); + final List entities = RadarRegistry.getEntitiesWithinRadius( + new Vector3(this).toVector2(), 500); + for (final Entity entity : entities) { + if (entity instanceof EMissile) { + if (((EMissile)entity).flyingTicks <= -1) { + continue; + } + if (!this.xunZhaoEntity.contains(entity)) { + this.xunZhaoEntity.add(entity); + } + if (!this.isWeiXianDaoDan((EMissile)entity)) { + continue; + } + this.missilesInRange.add((EMissile)entity); + } else { + this.xunZhaoEntity.add(entity); + } + } + final List players = this.worldObj.getEntitiesWithinAABB( + (Class)EntityPlayer.class, + AxisAlignedBB.getBoundingBox( + (double)(this.xCoord - 500), (double)(this.yCoord - 500), + (double)(this.zCoord - 500), (double)(this.xCoord + 500), + (double)(this.yCoord + 500), (double)(this.zCoord + 500))); + for (final EntityPlayer player : players) { + if (player != null) { + boolean youHuoLuan = false; + for (int i = 0; i < player.inventory.getSizeInventory(); ++i) { + final ItemStack itemStack = player.inventory.getStackInSlot(i); + if (itemStack != null && itemStack.getItem() instanceof + IItemFrequency) { + youHuoLuan = true; + break; + } + } + if (youHuoLuan) { + continue; + } + this.xunZhaoEntity.add(player); + } + } + for (final TileEntity jiQi : RadarRegistry.getTileEntitiesInArea( + new Vector2(this.xCoord - 500, this.zCoord - 500), + new Vector2(this.xCoord + 500, this.zCoord + 500))) { + if (jiQi instanceof TRadarTower) { + if (((TRadarTower)jiQi).isDisabled() || + ((TRadarTower)jiQi).prevWatts <= 0.0) { + continue; + } + this.xunZhaoJiQi.add(jiQi); + } else { + this.xunZhaoJiQi.add(jiQi); + } + } + } + + public boolean isWeiXianDaoDan(final EMissile daoDan) { + return daoDan != null && daoDan.target != null && + Vector2.distance(new Vector3(daoDan).toVector2(), + new Vector2(this.xCoord, this.zCoord)) < + this.alarmRadius && + Vector2.distance(daoDan.target.toVector2(), + new Vector2(this.xCoord, this.zCoord)) < + this.safetyRadius; + } + + // TODO: WTF + // private Packet getDescriptionPacket2() { + // return PacketManager.getPacket("ICBM|E", this, 1, this.alarmRadius, + // this.safetyBanJing); + // } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + + nbt.setDouble("wattsReceived", super.wattsReceived); + nbt.setInteger("disabledTicks", this.disabledTicks); + nbt.setInteger("safetyRadius", this.safetyRadius); + nbt.setInteger("alarmRadius", this.alarmRadius); + + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, + this.getBlockMetadata(), nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + + super.wattsReceived = nbt.getDouble("wattsReceived"); + this.disabledTicks = nbt.getInteger("disabledTicks"); + this.safetyRadius = nbt.getInteger("safetyRadius"); + this.alarmRadius = nbt.getInteger("alarmRadius"); + } + + @Override + public boolean isPoweringTo(final ForgeDirection side) { + if ((super.prevWatts > 0.0 || super.wattsReceived > 0.0) && + this.missilesInRange.size() > 0) { + if (this.emitAll) { + return true; + } + + // This detects which direction a missile is coming from, and emits + // redstone on the other side. + for (final EMissile missile : this.missilesInRange) { + final Vector2 position = new Vector3(missile).toVector2(); + ForgeDirection missileSide = ForgeDirection.UNKNOWN; + double closest = -1.0; + for (int i = 2; i < 6; ++i) { + final double dist = Vector2.distance( + position, + new Vector2( + this.xCoord + ForgeDirection.getOrientation(i).offsetX, + this.zCoord + ForgeDirection.getOrientation(i).offsetZ)); + if (dist < closest || closest < 0.0) { + missileSide = ForgeDirection.getOrientation(i); + closest = dist; + } + } + if (missileSide.getOpposite() == side) { + return true; + } + } + } + return false; + } + + @Override + public boolean isIndirectlyPoweringTo(final ForgeDirection side) { + return this.isPoweringTo(side); + } + + @Override + public void readFromNBT(final NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.safetyRadius = nbt.getInteger("safetyRadius"); + this.alarmRadius = nbt.getInteger("alarmRadius"); + this.emitAll = nbt.getBoolean("emitAll"); + } + + @Override + public void writeToNBT(final NBTTagCompound par1NBTTagCompound) { + super.writeToNBT(par1NBTTagCompound); + par1NBTTagCompound.setInteger("safetyRadius", this.safetyRadius); + par1NBTTagCompound.setInteger("alarmRadius", this.alarmRadius); + par1NBTTagCompound.setBoolean("emitAll", this.emitAll); + } + + @Override + public void onDestroy(final TileEntity callingBlock) { + this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord, Blocks.air, 0, + 2); + this.worldObj.setBlock(this.xCoord, this.yCoord + 1, this.zCoord, + Blocks.air, 0, 2); + this.worldObj.setBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord, + Blocks.air, 0, 2); + this.worldObj.setBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord, + Blocks.air, 0, 2); + this.worldObj.setBlock(this.xCoord, this.yCoord + 1, this.zCoord + 1, + Blocks.air, 0, 2); + this.worldObj.setBlock(this.xCoord, this.yCoord + 1, this.zCoord - 1, + Blocks.air, 0, 2); + this.worldObj.setBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord + 1, + Blocks.air, 0, 2); + this.worldObj.setBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord - 1, + Blocks.air, 0, 2); + this.worldObj.setBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord - 1, + Blocks.air, 0, 2); + this.worldObj.setBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord + 1, + Blocks.air, 0, 2); + } + + @Override + public boolean onActivated(final EntityPlayer entityPlayer) { + if (entityPlayer.inventory.getCurrentItem() != null && + ((BlockAdvanced)this.getBlockType()) + .isUsableWrench(entityPlayer, + entityPlayer.inventory.getCurrentItem(), + this.xCoord, this.yCoord, this.zCoord)) { + if (!this.worldObj.isRemote) { + this.emitAll = !this.emitAll; + entityPlayer.addChatMessage(new ChatComponentText( + "Radar redstone all side emission: " + this.emitAll)); + } + return true; + } + entityPlayer.openGui((Object)ICBMExplosion.instance, 3, this.worldObj, + this.xCoord, this.yCoord, this.zCoord); + return true; + } + + @Override + public void onCreate(final Vector3 position) { + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(new Vector3(0.0, 1.0, 0.0), position), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(new Vector3(1.0, 1.0, 0.0), position), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(new Vector3(-1.0, 1.0, 0.0), position), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(new Vector3(0.0, 1.0, 1.0), position), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(new Vector3(0.0, 1.0, -1.0), position), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(new Vector3(1.0, 1.0, -1.0), position), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(new Vector3(-1.0, 1.0, 1.0), position), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(new Vector3(1.0, 1.0, 1.0), position), + new Vector3(this)); + MainBase.bJia.makeFakeBlock( + this.worldObj, Vector3.add(new Vector3(-1.0, 1.0, -1.0), position), + new Vector3(this)); + } + + @Override + public String getType() { + return "ICBMRadar"; + } + + @Override + public String[] getMethodNames() { + return new String[] {"getEntities", "getBlocks"}; + } + + @Override + public Object[] callMethod(final IComputerAccess computer, ILuaContext ctx, + final int method, final Object[] arguments) + throws LuaException { + if (super.wattsReceived < this.getRequest().getWatts()) { + throw new LuaException("Radar has insufficient electricity!"); + } + final HashMap returnArray = new HashMap<>(); + int count = 0; + switch (method) { + case 0: { + final List entities = RadarRegistry.getEntitiesWithinRadius( + new Vector3(this).toVector2(), this.alarmRadius); + for (final Entity entity : entities) { + // TODO: completely retarded lua API + returnArray.put("x_" + count, entity.posX); + returnArray.put("y_" + count, entity.posY); + returnArray.put("z_" + count, entity.posZ); + ++count; + } + return new Object[] {returnArray}; + } + case 1: { + for (final TileEntity jiQi : RadarRegistry.getTileEntitiesInArea( + new Vector2(this.xCoord - 500, this.zCoord - 500), + new Vector2(this.xCoord + 500, this.zCoord + 500))) { + returnArray.put("x_" + count, (double)jiQi.xCoord); + returnArray.put("y_" + count, (double)jiQi.yCoord); + returnArray.put("z_" + count, (double)jiQi.zCoord); + ++count; + } + return new Object[] {returnArray}; + } + default: { + throw new LuaException("Invalid ICBM Radar Function."); + } + } + } + + @Override + public void invalidate() { + ForgeChunkManager.releaseTicket(this.ticket); + RadarRegistry.unregister(this); + super.invalidate(); + } + + @Override + public void attach(final IComputerAccess computer) {} + + @Override + public void detach(final IComputerAccess computer) {} + + @Override + public ElectricityPack getRequest() { + return new ElectricityPack(15.0 / this.getVoltage(), this.getVoltage()); + } + + @Override + public AxisAlignedBB getRenderBoundingBox() { + return TileEntity.INFINITE_EXTENT_AABB; + } + + @Override + public boolean equals(IPeripheral other) { + return this == other; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMBingDan.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMBingDan.java new file mode 100644 index 0000000..22447f4 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMBingDan.java @@ -0,0 +1,260 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMBingDan extends MICBM { + ModelRenderer MAIN_MODULE; + ModelRenderer MOTOR_MODULE_1; + ModelRenderer MOTOR_MODULE_2; + ModelRenderer MOTOR_MODULE_3; + ModelRenderer MOTOR_MODULE_4; + ModelRenderer C1; + ModelRenderer C2; + ModelRenderer C3; + ModelRenderer C4; + ModelRenderer T1; + ModelRenderer T2; + ModelRenderer T3; + ModelRenderer T4; + ModelRenderer WING_1A; + ModelRenderer WING_2A; + ModelRenderer WING_1B; + ModelRenderer WING_2B; + ModelRenderer WING_3A; + ModelRenderer WING_3B; + ModelRenderer WING_4B; + ModelRenderer WING_4A; + ModelRenderer TOP; + ModelRenderer Shape1; + ModelRenderer Shape1a; + ModelRenderer Shape1b; + ModelRenderer Shape1c; + ModelRenderer Shape1d; + ModelRenderer Shape1e; + + public MMBingDan() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.MAIN_MODULE = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 8, 70, 8); + this.MAIN_MODULE.setRotationPoint(-4.0f, -63.0f, -4.0f); + this.MAIN_MODULE.setTextureSize(128, 128); + this.MAIN_MODULE.mirror = true; + this.setRotation(this.MAIN_MODULE, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_1 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_1.setRotationPoint(-8.0f, 0.0f, -8.0f); + this.MOTOR_MODULE_1.setTextureSize(128, 128); + this.MOTOR_MODULE_1.mirror = true; + this.setRotation(this.MOTOR_MODULE_1, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_2 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_2.setRotationPoint(-8.0f, 0.0f, 2.0f); + this.MOTOR_MODULE_2.setTextureSize(128, 128); + this.MOTOR_MODULE_2.mirror = true; + this.setRotation(this.MOTOR_MODULE_2, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_3 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_3.setRotationPoint(2.0f, 0.0f, -8.0f); + this.MOTOR_MODULE_3.setTextureSize(128, 128); + this.MOTOR_MODULE_3.mirror = true; + this.setRotation(this.MOTOR_MODULE_3, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_4 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_4.setRotationPoint(2.0f, 0.0f, 2.0f); + this.MOTOR_MODULE_4.setTextureSize(128, 128); + this.MOTOR_MODULE_4.mirror = true; + this.setRotation(this.MOTOR_MODULE_4, 0.0f, 0.0f, 0.0f); + (this.C1 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C1.setRotationPoint(-6.0f, 20.0f, -6.0f); + this.C1.setTextureSize(128, 128); + this.C1.mirror = true; + this.setRotation(this.C1, 0.0f, 0.0f, 0.0f); + (this.C2 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C2.setRotationPoint(-6.0f, 20.0f, 4.0f); + this.C2.setTextureSize(128, 128); + this.C2.mirror = true; + this.setRotation(this.C2, 0.0f, 0.0f, 0.0f); + (this.C3 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C3.setRotationPoint(4.0f, 20.0f, -6.0f); + this.C3.setTextureSize(128, 128); + this.C3.mirror = true; + this.setRotation(this.C3, 0.0f, 0.0f, 0.0f); + (this.C4 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C4.setRotationPoint(4.0f, 20.0f, 4.0f); + this.C4.setTextureSize(128, 128); + this.C4.mirror = true; + this.setRotation(this.C4, 0.0f, 0.0f, 0.0f); + (this.T1 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T1.setRotationPoint(-7.0f, 21.0f, -7.0f); + this.T1.setTextureSize(128, 128); + this.T1.mirror = true; + this.setRotation(this.T1, 0.0f, 0.0f, 0.0f); + (this.T2 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T2.setRotationPoint(-7.0f, 21.0f, 3.0f); + this.T2.setTextureSize(128, 128); + this.T2.mirror = true; + this.setRotation(this.T2, 0.0f, 0.0f, 0.0f); + (this.T3 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T3.setRotationPoint(3.0f, 21.0f, -7.0f); + this.T3.setTextureSize(128, 128); + this.T3.mirror = true; + this.setRotation(this.T3, 0.0f, 0.0f, 0.0f); + (this.T4 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T4.setRotationPoint(3.0f, 21.0f, 3.0f); + this.T4.setTextureSize(128, 128); + this.T4.mirror = true; + this.setRotation(this.T4, 0.0f, 0.0f, 0.0f); + (this.WING_1A = new ModelRenderer((ModelBase)this, 43, 15)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 12, 12); + this.WING_1A.setRotationPoint(0.0f, -10.0f, 0.0f); + this.WING_1A.setTextureSize(128, 128); + this.WING_1A.mirror = true; + this.setRotation(this.WING_1A, -0.7853982f, 0.0f, 0.0f); + (this.WING_2A = new ModelRenderer((ModelBase)this, 43, 0)) + .addBox(0.0f, 0.0f, -1.0f, 12, 12, 2); + this.WING_2A.setRotationPoint(0.0f, -10.0f, 0.0f); + this.WING_2A.setTextureSize(128, 128); + this.WING_2A.mirror = true; + this.setRotation(this.WING_2A, 0.0f, 0.0f, 0.7853982f); + (this.WING_1B = new ModelRenderer((ModelBase)this, 72, 28)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 25, 16); + this.WING_1B.setRotationPoint(0.0f, -2.0f, 0.0f); + this.WING_1B.setTextureSize(128, 128); + this.WING_1B.mirror = true; + this.setRotation(this.WING_1B, 0.0f, 0.0f, 0.0f); + (this.WING_2B = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-8.0f, 0.0f, -1.0f, 16, 25, 2); + this.WING_2B.setRotationPoint(0.0f, -2.0f, 0.0f); + this.WING_2B.setTextureSize(128, 128); + this.WING_2B.mirror = true; + this.setRotation(this.WING_2B, 0.0f, 0.0f, 0.0f); + (this.WING_3A = new ModelRenderer((ModelBase)this, 34, 55)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 10, 16); + this.WING_3A.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_3A.setTextureSize(128, 128); + this.WING_3A.mirror = true; + this.setRotation(this.WING_3A, 0.0f, 0.0f, 0.0f); + (this.WING_3B = new ModelRenderer((ModelBase)this, 34, 82)) + .addBox(-1.0f, -6.0f, -6.0f, 2, 12, 12); + this.WING_3B.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_3B.setTextureSize(128, 128); + this.WING_3B.mirror = true; + this.setRotation(this.WING_3B, 0.7853982f, 0.0f, 0.0f); + (this.WING_4B = new ModelRenderer((ModelBase)this, 34, 41)) + .addBox(-8.0f, 0.0f, -1.0f, 16, 10, 2); + this.WING_4B.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_4B.setTextureSize(128, 128); + this.WING_4B.mirror = true; + this.setRotation(this.WING_4B, 0.0f, 0.0f, 0.0f); + (this.WING_4A = new ModelRenderer((ModelBase)this, 34, 107)) + .addBox(-6.0f, -6.0f, -1.0f, 12, 12, 2); + this.WING_4A.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_4A.setTextureSize(128, 128); + this.WING_4A.mirror = true; + this.setRotation(this.WING_4A, 0.0f, 0.0f, -0.7853982f); + (this.TOP = new ModelRenderer((ModelBase)this, 72, 70)) + .addBox(0.0f, 0.0f, 0.0f, 10, 10, 10); + this.TOP.setRotationPoint(-5.0f, -64.0f, -5.0f); + this.TOP.setTextureSize(128, 128); + this.TOP.mirror = true; + this.setRotation(this.TOP, 0.0f, 0.0f, 0.0f); + (this.Shape1 = new ModelRenderer((ModelBase)this, 108, 92)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.Shape1.setRotationPoint(-4.0f, -70.0f, -4.0f); + this.Shape1.setTextureSize(128, 128); + this.Shape1.mirror = true; + this.setRotation(this.Shape1, 0.0f, 0.0f, 0.0f); + (this.Shape1a = new ModelRenderer((ModelBase)this, 108, 92)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.Shape1a.setRotationPoint(-4.0f, -70.0f, 2.0f); + this.Shape1a.setTextureSize(128, 128); + this.Shape1a.mirror = true; + this.setRotation(this.Shape1a, 0.0f, 0.0f, 0.0f); + (this.Shape1b = new ModelRenderer((ModelBase)this, 108, 92)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.Shape1b.setRotationPoint(2.0f, -70.0f, -4.0f); + this.Shape1b.setTextureSize(128, 128); + this.Shape1b.mirror = true; + this.setRotation(this.Shape1b, 0.0f, 0.0f, 0.0f); + (this.Shape1c = new ModelRenderer((ModelBase)this, 108, 92)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.Shape1c.setRotationPoint(2.0f, -70.0f, 2.0f); + this.Shape1c.setTextureSize(128, 128); + this.Shape1c.mirror = true; + this.setRotation(this.Shape1c, 0.0f, 0.0f, 0.0f); + (this.Shape1d = new ModelRenderer((ModelBase)this, 64, 92)) + .addBox(0.0f, 0.0f, 0.0f, 6, 10, 6); + this.Shape1d.setRotationPoint(-3.0f, -74.0f, -3.0f); + this.Shape1d.setTextureSize(128, 128); + this.Shape1d.mirror = true; + this.setRotation(this.Shape1d, 0.0f, 0.0f, 0.0f); + (this.Shape1e = new ModelRenderer((ModelBase)this, 90, 92)) + .addBox(0.0f, 0.0f, 0.0f, 4, 6, 4); + this.Shape1e.setRotationPoint(-2.0f, -80.0f, -2.0f); + this.Shape1e.setTextureSize(128, 128); + this.Shape1e.mirror = true; + this.setRotation(this.Shape1e, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.MAIN_MODULE.render(f5); + this.MOTOR_MODULE_1.render(f5); + this.MOTOR_MODULE_2.render(f5); + this.MOTOR_MODULE_3.render(f5); + this.MOTOR_MODULE_4.render(f5); + this.C1.render(f5); + this.C2.render(f5); + this.C3.render(f5); + this.C4.render(f5); + this.T1.render(f5); + this.T2.render(f5); + this.T3.render(f5); + this.T4.render(f5); + this.WING_1A.render(f5); + this.WING_2A.render(f5); + this.WING_1B.render(f5); + this.WING_2B.render(f5); + this.WING_3A.render(f5); + this.WING_3B.render(f5); + this.WING_4B.render(f5); + this.WING_4A.render(f5); + this.TOP.render(f5); + this.Shape1.render(f5); + this.Shape1a.render(f5); + this.Shape1b.render(f5); + this.Shape1c.render(f5); + this.Shape1d.render(f5); + this.Shape1e.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMChaoShengBuo.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMChaoShengBuo.java new file mode 100644 index 0000000..e538dd8 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMChaoShengBuo.java @@ -0,0 +1,297 @@ +package icbm.zhapin.muoxing.daodan; + +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +public class MMChaoShengBuo extends MICBM { + ModelRenderer MAIN_MODULE; + ModelRenderer MOTOR_MODULE_1; + ModelRenderer MOTOR_MODULE_2; + ModelRenderer MOTOR_MODULE_3; + ModelRenderer MOTOR_MODULE_4; + ModelRenderer C1; + ModelRenderer C2; + ModelRenderer C3; + ModelRenderer C4; + ModelRenderer T1; + ModelRenderer T2; + ModelRenderer T3; + ModelRenderer T4; + ModelRenderer WING_1A; + ModelRenderer WING_2A; + ModelRenderer WING_1B; + ModelRenderer WING_2B; + ModelRenderer WING_3A; + ModelRenderer WING_3B; + ModelRenderer WING_4B; + ModelRenderer WING_4A; + ModelRenderer TOP; + ModelRenderer VOX_1; + ModelRenderer VOX_2; + ModelRenderer VOX3; + ModelRenderer VOX4; + ModelRenderer A; + ModelRenderer B; + ModelRenderer C; + ModelRenderer D; + ModelRenderer E; + ModelRenderer F; + ModelRenderer G; + + public MMChaoShengBuo() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.MAIN_MODULE = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 8, 70, 8); + this.MAIN_MODULE.setRotationPoint(-4.0f, -63.0f, -4.0f); + this.MAIN_MODULE.setTextureSize(128, 128); + this.MAIN_MODULE.mirror = true; + this.setRotation(this.MAIN_MODULE, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_1 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_1.setRotationPoint(-8.0f, 0.0f, -8.0f); + this.MOTOR_MODULE_1.setTextureSize(128, 128); + this.MOTOR_MODULE_1.mirror = true; + this.setRotation(this.MOTOR_MODULE_1, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_2 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_2.setRotationPoint(-8.0f, 0.0f, 2.0f); + this.MOTOR_MODULE_2.setTextureSize(128, 128); + this.MOTOR_MODULE_2.mirror = true; + this.setRotation(this.MOTOR_MODULE_2, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_3 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_3.setRotationPoint(2.0f, 0.0f, -8.0f); + this.MOTOR_MODULE_3.setTextureSize(128, 128); + this.MOTOR_MODULE_3.mirror = true; + this.setRotation(this.MOTOR_MODULE_3, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_4 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_4.setRotationPoint(2.0f, 0.0f, 2.0f); + this.MOTOR_MODULE_4.setTextureSize(128, 128); + this.MOTOR_MODULE_4.mirror = true; + this.setRotation(this.MOTOR_MODULE_4, 0.0f, 0.0f, 0.0f); + (this.C1 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C1.setRotationPoint(-6.0f, 20.0f, -6.0f); + this.C1.setTextureSize(128, 128); + this.C1.mirror = true; + this.setRotation(this.C1, 0.0f, 0.0f, 0.0f); + (this.C2 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C2.setRotationPoint(-6.0f, 20.0f, 4.0f); + this.C2.setTextureSize(128, 128); + this.C2.mirror = true; + this.setRotation(this.C2, 0.0f, 0.0f, 0.0f); + (this.C3 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C3.setRotationPoint(4.0f, 20.0f, -6.0f); + this.C3.setTextureSize(128, 128); + this.C3.mirror = true; + this.setRotation(this.C3, 0.0f, 0.0f, 0.0f); + (this.C4 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C4.setRotationPoint(4.0f, 20.0f, 4.0f); + this.C4.setTextureSize(128, 128); + this.C4.mirror = true; + this.setRotation(this.C4, 0.0f, 0.0f, 0.0f); + (this.T1 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T1.setRotationPoint(-7.0f, 21.0f, -7.0f); + this.T1.setTextureSize(128, 128); + this.T1.mirror = true; + this.setRotation(this.T1, 0.0f, 0.0f, 0.0f); + (this.T2 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T2.setRotationPoint(-7.0f, 21.0f, 3.0f); + this.T2.setTextureSize(128, 128); + this.T2.mirror = true; + this.setRotation(this.T2, 0.0f, 0.0f, 0.0f); + (this.T3 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T3.setRotationPoint(3.0f, 21.0f, -7.0f); + this.T3.setTextureSize(128, 128); + this.T3.mirror = true; + this.setRotation(this.T3, 0.0f, 0.0f, 0.0f); + (this.T4 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T4.setRotationPoint(3.0f, 21.0f, 3.0f); + this.T4.setTextureSize(128, 128); + this.T4.mirror = true; + this.setRotation(this.T4, 0.0f, 0.0f, 0.0f); + (this.WING_1A = new ModelRenderer((ModelBase)this, 43, 15)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 12, 12); + this.WING_1A.setRotationPoint(0.0f, -10.0f, 0.0f); + this.WING_1A.setTextureSize(128, 128); + this.WING_1A.mirror = true; + this.setRotation(this.WING_1A, -0.7853982f, 0.0f, 0.0f); + (this.WING_2A = new ModelRenderer((ModelBase)this, 43, 0)) + .addBox(0.0f, 0.0f, -1.0f, 12, 12, 2); + this.WING_2A.setRotationPoint(0.0f, -10.0f, 0.0f); + this.WING_2A.setTextureSize(128, 128); + this.WING_2A.mirror = true; + this.setRotation(this.WING_2A, 0.0f, 0.0f, 0.7853982f); + (this.WING_1B = new ModelRenderer((ModelBase)this, 72, 28)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 25, 16); + this.WING_1B.setRotationPoint(0.0f, -2.0f, 0.0f); + this.WING_1B.setTextureSize(128, 128); + this.WING_1B.mirror = true; + this.setRotation(this.WING_1B, 0.0f, 0.0f, 0.0f); + (this.WING_2B = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-8.0f, 0.0f, -1.0f, 16, 25, 2); + this.WING_2B.setRotationPoint(0.0f, -2.0f, 0.0f); + this.WING_2B.setTextureSize(128, 128); + this.WING_2B.mirror = true; + this.setRotation(this.WING_2B, 0.0f, 0.0f, 0.0f); + (this.WING_3A = new ModelRenderer((ModelBase)this, 34, 55)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 10, 16); + this.WING_3A.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_3A.setTextureSize(128, 128); + this.WING_3A.mirror = true; + this.setRotation(this.WING_3A, 0.0f, 0.0f, 0.0f); + (this.WING_3B = new ModelRenderer((ModelBase)this, 34, 82)) + .addBox(-1.0f, -6.0f, -6.0f, 2, 12, 12); + this.WING_3B.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_3B.setTextureSize(128, 128); + this.WING_3B.mirror = true; + this.setRotation(this.WING_3B, 0.7853982f, 0.0f, 0.0f); + (this.WING_4B = new ModelRenderer((ModelBase)this, 34, 41)) + .addBox(-8.0f, 0.0f, -1.0f, 16, 10, 2); + this.WING_4B.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_4B.setTextureSize(128, 128); + this.WING_4B.mirror = true; + this.setRotation(this.WING_4B, 0.0f, 0.0f, 0.0f); + (this.WING_4A = new ModelRenderer((ModelBase)this, 34, 107)) + .addBox(-6.0f, -6.0f, -1.0f, 12, 12, 2); + this.WING_4A.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_4A.setTextureSize(128, 128); + this.WING_4A.mirror = true; + this.setRotation(this.WING_4A, 0.0f, 0.0f, -0.7853982f); + (this.TOP = new ModelRenderer((ModelBase)this, 72, 70)) + .addBox(0.0f, 0.0f, 0.0f, 10, 10, 10); + this.TOP.setRotationPoint(-5.0f, -64.0f, -5.0f); + this.TOP.setTextureSize(128, 128); + this.TOP.mirror = true; + this.setRotation(this.TOP, 0.0f, 0.0f, 0.0f); + (this.VOX_1 = new ModelRenderer((ModelBase)this, 113, 99)) + .addBox(-3.0f, -3.0f, 5.0f, 6, 6, 1); + this.VOX_1.setRotationPoint(0.0f, -59.0f, 0.0f); + this.VOX_1.setTextureSize(128, 128); + this.VOX_1.mirror = true; + this.setRotation(this.VOX_1, 0.0f, 0.0f, 0.0f); + (this.VOX_2 = new ModelRenderer((ModelBase)this, 113, 99)) + .addBox(-3.0f, -3.0f, 5.0f, 6, 6, 1); + this.VOX_2.setRotationPoint(0.0f, -59.0f, 0.0f); + this.VOX_2.setTextureSize(128, 128); + this.VOX_2.mirror = true; + this.setRotation(this.VOX_2, 0.0f, 1.570796f, 0.0f); + (this.VOX3 = new ModelRenderer((ModelBase)this, 113, 99)) + .addBox(-3.0f, -3.0f, 5.0f, 6, 6, 1); + this.VOX3.setRotationPoint(0.0f, -59.0f, 0.0f); + this.VOX3.setTextureSize(128, 128); + this.VOX3.mirror = true; + this.setRotation(this.VOX3, 0.0f, -1.570796f, 0.0f); + (this.VOX4 = new ModelRenderer((ModelBase)this, 113, 99)) + .addBox(-3.0f, -3.0f, -6.0f, 6, 6, 1); + this.VOX4.setRotationPoint(0.0f, -59.0f, 0.0f); + this.VOX4.setTextureSize(128, 128); + this.VOX4.mirror = true; + this.setRotation(this.VOX4, 0.0f, 0.0f, 0.0f); + (this.A = new ModelRenderer((ModelBase)this, 79, 92)) + .addBox(-4.0f, 0.0f, -4.0f, 8, 6, 8); + this.A.setRotationPoint(0.0f, -70.0f, 0.0f); + this.A.setTextureSize(128, 128); + this.A.mirror = true; + this.setRotation(this.A, 0.0f, 0.0f, 0.0f); + (this.B = new ModelRenderer((ModelBase)this, 79, 108)) + .addBox(-3.0f, 0.0f, -3.0f, 6, 6, 6); + this.B.setRotationPoint(0.0f, -76.0f, 0.0f); + this.B.setTextureSize(128, 128); + this.B.mirror = true; + this.setRotation(this.B, 0.0f, 0.0f, 0.0f); + (this.C = new ModelRenderer((ModelBase)this, 106, 108)) + .addBox(-2.0f, 0.0f, -2.0f, 4, 6, 4); + this.C.setRotationPoint(0.0f, -82.0f, 0.0f); + this.C.setTextureSize(128, 128); + this.C.mirror = true; + this.setRotation(this.C, 0.0f, 0.0f, 0.0f); + (this.D = new ModelRenderer((ModelBase)this, 65, 92)) + .addBox(-1.0f, 0.0f, -2.0f, 2, 18, 4); + this.D.setRotationPoint(0.0f, -81.0f, 0.0f); + this.D.setTextureSize(128, 128); + this.D.mirror = true; + this.setRotation(this.D, -0.2094395f, 0.0f, 0.0f); + (this.E = new ModelRenderer((ModelBase)this, 65, 92)) + .addBox(-1.0f, 0.0f, -2.0f, 2, 18, 4); + this.E.setRotationPoint(0.0f, -81.0f, 0.0f); + this.E.setTextureSize(128, 128); + this.E.mirror = true; + this.setRotation(this.E, -0.2094395f, 1.570796f, 0.0f); + (this.F = new ModelRenderer((ModelBase)this, 65, 92)) + .addBox(-1.0f, 0.0f, -2.0f, 2, 18, 4); + this.F.setRotationPoint(0.0f, -81.0f, 0.0f); + this.F.setTextureSize(128, 128); + this.F.mirror = true; + this.setRotation(this.F, -0.2094395f, -1.570796f, 0.0f); + (this.G = new ModelRenderer((ModelBase)this, 65, 92)) + .addBox(-1.0f, 0.0f, -2.0f, 2, 18, 4); + this.G.setRotationPoint(0.0f, -81.0f, 0.0f); + this.G.setTextureSize(128, 128); + this.G.mirror = true; + this.setRotation(this.G, 0.2094395f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.MAIN_MODULE.render(f5); + this.MOTOR_MODULE_1.render(f5); + this.MOTOR_MODULE_2.render(f5); + this.MOTOR_MODULE_3.render(f5); + this.MOTOR_MODULE_4.render(f5); + this.C1.render(f5); + this.C2.render(f5); + this.C3.render(f5); + this.C4.render(f5); + this.T1.render(f5); + this.T2.render(f5); + this.T3.render(f5); + this.T4.render(f5); + this.WING_1A.render(f5); + this.WING_2A.render(f5); + this.WING_1B.render(f5); + this.WING_2B.render(f5); + this.WING_3A.render(f5); + this.WING_3B.render(f5); + this.WING_4B.render(f5); + this.WING_4A.render(f5); + this.TOP.render(f5); + this.VOX_1.render(f5); + this.VOX_2.render(f5); + this.VOX3.render(f5); + this.VOX4.render(f5); + this.A.render(f5); + this.B.render(f5); + this.C.render(f5); + this.D.render(f5); + this.E.render(f5); + this.F.render(f5); + this.G.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMDianCi.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMDianCi.java new file mode 100644 index 0000000..ad56777 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMDianCi.java @@ -0,0 +1,268 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMDianCi extends MICBM { + ModelRenderer MAIN_MODULE; + ModelRenderer MOTOR_MODULE_1; + ModelRenderer MOTOR_MODULE_2; + ModelRenderer MOTOR_MODULE_3; + ModelRenderer MOTOR_MODULE_4; + ModelRenderer C1; + ModelRenderer C2; + ModelRenderer C3; + ModelRenderer C4; + ModelRenderer T1; + ModelRenderer T2; + ModelRenderer T3; + ModelRenderer T4; + ModelRenderer WING_1A; + ModelRenderer WING_2A; + ModelRenderer WING_1B; + ModelRenderer WING_2B; + ModelRenderer WING_3A; + ModelRenderer WING_3B; + ModelRenderer WING_4B; + ModelRenderer WING_4A; + ModelRenderer TOP; + ModelRenderer BASE; + ModelRenderer MAIN_COIL; + ModelRenderer COIL_1; + ModelRenderer COIL_2; + ModelRenderer COIL_3; + ModelRenderer COIL_4; + ModelRenderer WARHEAD; + + public MMDianCi() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.MAIN_MODULE = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 8, 70, 8); + this.MAIN_MODULE.setRotationPoint(-4.0f, -63.0f, -4.0f); + this.MAIN_MODULE.setTextureSize(128, 128); + this.MAIN_MODULE.mirror = true; + this.setRotation(this.MAIN_MODULE, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_1 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_1.setRotationPoint(-8.0f, 0.0f, -8.0f); + this.MOTOR_MODULE_1.setTextureSize(128, 128); + this.MOTOR_MODULE_1.mirror = true; + this.setRotation(this.MOTOR_MODULE_1, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_2 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_2.setRotationPoint(-8.0f, 0.0f, 2.0f); + this.MOTOR_MODULE_2.setTextureSize(128, 128); + this.MOTOR_MODULE_2.mirror = true; + this.setRotation(this.MOTOR_MODULE_2, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_3 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_3.setRotationPoint(2.0f, 0.0f, -8.0f); + this.MOTOR_MODULE_3.setTextureSize(128, 128); + this.MOTOR_MODULE_3.mirror = true; + this.setRotation(this.MOTOR_MODULE_3, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_4 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_4.setRotationPoint(2.0f, 0.0f, 2.0f); + this.MOTOR_MODULE_4.setTextureSize(128, 128); + this.MOTOR_MODULE_4.mirror = true; + this.setRotation(this.MOTOR_MODULE_4, 0.0f, 0.0f, 0.0f); + (this.C1 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C1.setRotationPoint(-6.0f, 20.0f, -6.0f); + this.C1.setTextureSize(128, 128); + this.C1.mirror = true; + this.setRotation(this.C1, 0.0f, 0.0f, 0.0f); + (this.C2 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C2.setRotationPoint(-6.0f, 20.0f, 4.0f); + this.C2.setTextureSize(128, 128); + this.C2.mirror = true; + this.setRotation(this.C2, 0.0f, 0.0f, 0.0f); + (this.C3 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C3.setRotationPoint(4.0f, 20.0f, -6.0f); + this.C3.setTextureSize(128, 128); + this.C3.mirror = true; + this.setRotation(this.C3, 0.0f, 0.0f, 0.0f); + (this.C4 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C4.setRotationPoint(4.0f, 20.0f, 4.0f); + this.C4.setTextureSize(128, 128); + this.C4.mirror = true; + this.setRotation(this.C4, 0.0f, 0.0f, 0.0f); + (this.T1 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T1.setRotationPoint(-7.0f, 21.0f, -7.0f); + this.T1.setTextureSize(128, 128); + this.T1.mirror = true; + this.setRotation(this.T1, 0.0f, 0.0f, 0.0f); + (this.T2 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T2.setRotationPoint(-7.0f, 21.0f, 3.0f); + this.T2.setTextureSize(128, 128); + this.T2.mirror = true; + this.setRotation(this.T2, 0.0f, 0.0f, 0.0f); + (this.T3 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T3.setRotationPoint(3.0f, 21.0f, -7.0f); + this.T3.setTextureSize(128, 128); + this.T3.mirror = true; + this.setRotation(this.T3, 0.0f, 0.0f, 0.0f); + (this.T4 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T4.setRotationPoint(3.0f, 21.0f, 3.0f); + this.T4.setTextureSize(128, 128); + this.T4.mirror = true; + this.setRotation(this.T4, 0.0f, 0.0f, 0.0f); + (this.WING_1A = new ModelRenderer((ModelBase)this, 43, 15)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 12, 12); + this.WING_1A.setRotationPoint(0.0f, -10.0f, 0.0f); + this.WING_1A.setTextureSize(128, 128); + this.WING_1A.mirror = true; + this.setRotation(this.WING_1A, -0.7853982f, 0.0f, 0.0f); + (this.WING_2A = new ModelRenderer((ModelBase)this, 43, 0)) + .addBox(0.0f, 0.0f, -1.0f, 12, 12, 2); + this.WING_2A.setRotationPoint(0.0f, -10.0f, 0.0f); + this.WING_2A.setTextureSize(128, 128); + this.WING_2A.mirror = true; + this.setRotation(this.WING_2A, 0.0f, 0.0f, 0.7853982f); + (this.WING_1B = new ModelRenderer((ModelBase)this, 72, 28)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 25, 16); + this.WING_1B.setRotationPoint(0.0f, -2.0f, 0.0f); + this.WING_1B.setTextureSize(128, 128); + this.WING_1B.mirror = true; + this.setRotation(this.WING_1B, 0.0f, 0.0f, 0.0f); + (this.WING_2B = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-8.0f, 0.0f, -1.0f, 16, 25, 2); + this.WING_2B.setRotationPoint(0.0f, -2.0f, 0.0f); + this.WING_2B.setTextureSize(128, 128); + this.WING_2B.mirror = true; + this.setRotation(this.WING_2B, 0.0f, 0.0f, 0.0f); + (this.WING_3A = new ModelRenderer((ModelBase)this, 34, 55)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 10, 16); + this.WING_3A.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_3A.setTextureSize(128, 128); + this.WING_3A.mirror = true; + this.setRotation(this.WING_3A, 0.0f, 0.0f, 0.0f); + (this.WING_3B = new ModelRenderer((ModelBase)this, 34, 82)) + .addBox(-1.0f, -6.0f, -6.0f, 2, 12, 12); + this.WING_3B.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_3B.setTextureSize(128, 128); + this.WING_3B.mirror = true; + this.setRotation(this.WING_3B, 0.7853982f, 0.0f, 0.0f); + (this.WING_4B = new ModelRenderer((ModelBase)this, 34, 41)) + .addBox(-8.0f, 0.0f, -1.0f, 16, 10, 2); + this.WING_4B.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_4B.setTextureSize(128, 128); + this.WING_4B.mirror = true; + this.setRotation(this.WING_4B, 0.0f, 0.0f, 0.0f); + (this.WING_4A = new ModelRenderer((ModelBase)this, 34, 107)) + .addBox(-6.0f, -6.0f, -1.0f, 12, 12, 2); + this.WING_4A.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_4A.setTextureSize(128, 128); + this.WING_4A.mirror = true; + this.setRotation(this.WING_4A, 0.0f, 0.0f, -0.7853982f); + (this.TOP = new ModelRenderer((ModelBase)this, 72, 70)) + .addBox(0.0f, 0.0f, 0.0f, 10, 10, 10); + this.TOP.setRotationPoint(-5.0f, -64.0f, -5.0f); + this.TOP.setTextureSize(128, 128); + this.TOP.mirror = true; + this.setRotation(this.TOP, 0.0f, 0.0f, 0.0f); + (this.BASE = new ModelRenderer((ModelBase)this, 64, 92)) + .addBox(-6.0f, 0.0f, -6.0f, 12, 1, 12); + this.BASE.setRotationPoint(0.0f, -65.0f, 0.0f); + this.BASE.setTextureSize(128, 128); + this.BASE.mirror = true; + this.setRotation(this.BASE, 0.0f, 0.0f, 0.0f); + (this.MAIN_COIL = new ModelRenderer((ModelBase)this, 64, 107)) + .addBox(-3.0f, 0.0f, -3.0f, 6, 10, 6); + this.MAIN_COIL.setRotationPoint(0.0f, -75.0f, 0.0f); + this.MAIN_COIL.setTextureSize(128, 128); + this.MAIN_COIL.mirror = true; + this.setRotation(this.MAIN_COIL, 0.0f, 0.0f, 0.0f); + (this.COIL_1 = new ModelRenderer((ModelBase)this, 90, 107)) + .addBox(3.0f, 0.0f, -5.0f, 2, 8, 2); + this.COIL_1.setRotationPoint(0.0f, -73.0f, 0.0f); + this.COIL_1.setTextureSize(128, 128); + this.COIL_1.mirror = true; + this.setRotation(this.COIL_1, 0.0f, 0.0f, 0.0f); + (this.COIL_2 = new ModelRenderer((ModelBase)this, 90, 107)) + .addBox(-5.0f, 0.0f, 3.0f, 2, 8, 2); + this.COIL_2.setRotationPoint(0.0f, -73.0f, 0.0f); + this.COIL_2.setTextureSize(128, 128); + this.COIL_2.mirror = true; + this.setRotation(this.COIL_2, 0.0f, 0.0f, 0.0f); + (this.COIL_3 = new ModelRenderer((ModelBase)this, 90, 107)) + .addBox(-5.0f, 0.0f, -5.0f, 2, 8, 2); + this.COIL_3.setRotationPoint(0.0f, -73.0f, 0.0f); + this.COIL_3.setTextureSize(128, 128); + this.COIL_3.mirror = true; + this.setRotation(this.COIL_3, 0.0f, 0.0f, 0.0f); + (this.COIL_4 = new ModelRenderer((ModelBase)this, 90, 107)) + .addBox(3.0f, 0.0f, 3.0f, 2, 8, 2); + this.COIL_4.setRotationPoint(0.0f, -73.0f, 0.0f); + this.COIL_4.setTextureSize(128, 128); + this.COIL_4.mirror = true; + this.setRotation(this.COIL_4, 0.0f, 0.0f, 0.0f); + (this.WARHEAD = new ModelRenderer((ModelBase)this, 100, 107)) + .addBox(-1.0f, -4.0f, -1.0f, 2, 4, 2); + this.WARHEAD.setRotationPoint(0.0f, -75.0f, 0.0f); + this.WARHEAD.setTextureSize(128, 128); + this.WARHEAD.mirror = true; + this.setRotation(this.WARHEAD, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.MAIN_MODULE.render(f5); + this.MOTOR_MODULE_1.render(f5); + this.MOTOR_MODULE_2.render(f5); + this.MOTOR_MODULE_3.render(f5); + this.MOTOR_MODULE_4.render(f5); + this.C1.render(f5); + this.C2.render(f5); + this.C3.render(f5); + this.C4.render(f5); + this.T1.render(f5); + this.T2.render(f5); + this.T3.render(f5); + this.T4.render(f5); + this.WING_1A.render(f5); + this.WING_2A.render(f5); + this.WING_1B.render(f5); + this.WING_2B.render(f5); + this.WING_3A.render(f5); + this.WING_3B.render(f5); + this.WING_4B.render(f5); + this.WING_4A.render(f5); + this.TOP.render(f5); + this.BASE.render(f5); + this.MAIN_COIL.render(f5); + this.COIL_1.render(f5); + this.COIL_2.render(f5); + this.COIL_3.render(f5); + this.COIL_4.render(f5); + this.WARHEAD.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMDuQi.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMDuQi.java new file mode 100644 index 0000000..344f6f7 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMDuQi.java @@ -0,0 +1,132 @@ +package icbm.zhapin.muoxing.daodan; + +import net.minecraft.entity.Entity; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; + +@SideOnly(Side.CLIENT) +public class MMDuQi extends MICBM +{ + ModelRenderer MAIN_MISSILE_MODULE; + ModelRenderer MOTOR_MODULE; + ModelRenderer WING_B_A_1; + ModelRenderer WING_B_B_1; + ModelRenderer WING_T_B_1; + ModelRenderer WING_T_A_1; + ModelRenderer WING_T_B_2; + ModelRenderer WING_T_A_2; + ModelRenderer WING_B_B_2; + ModelRenderer WING_B_A_2; + ModelRenderer CHEMICAL_CONTROL_MODULE; + ModelRenderer CHEMICAL_CONDUCT; + ModelRenderer CHEM_WARHEAD_1; + ModelRenderer CHEM_WARHEAD_2; + + public MMDuQi() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.MAIN_MISSILE_MODULE = new ModelRenderer((ModelBase)this, 0, 0)).addBox(0.0f, 0.0f, 0.0f, 6, 50, 6); + this.MAIN_MISSILE_MODULE.setRotationPoint(-3.0f, -26.0f, -3.0f); + this.MAIN_MISSILE_MODULE.setTextureSize(128, 128); + this.MAIN_MISSILE_MODULE.mirror = true; + this.setRotation(this.MAIN_MISSILE_MODULE, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE = new ModelRenderer((ModelBase)this, 0, 57)).addBox(-5.0f, 0.0f, -5.0f, 10, 16, 10); + this.MOTOR_MODULE.setRotationPoint(0.0f, 8.0f, 0.0f); + this.MOTOR_MODULE.setTextureSize(128, 128); + this.MOTOR_MODULE.mirror = true; + this.setRotation(this.MOTOR_MODULE, 0.0f, 0.7853982f, 0.0f); + (this.WING_B_A_1 = new ModelRenderer((ModelBase)this, 59, 26)).addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.WING_B_A_1.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_B_A_1.setTextureSize(128, 128); + this.WING_B_A_1.mirror = true; + this.setRotation(this.WING_B_A_1, 0.0f, 0.7853982f, 0.0f); + (this.WING_B_B_1 = new ModelRenderer((ModelBase)this, 59, 26)).addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.WING_B_B_1.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_B_B_1.setTextureSize(128, 128); + this.WING_B_B_1.mirror = true; + this.setRotation(this.WING_B_B_1, 0.0f, -0.7853982f, 0.0f); + (this.WING_T_B_1 = new ModelRenderer((ModelBase)this, 59, 0)).addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.WING_T_B_1.setRotationPoint(0.0f, -24.0f, 0.0f); + this.WING_T_B_1.setTextureSize(128, 128); + this.WING_T_B_1.mirror = true; + this.setRotation(this.WING_T_B_1, -0.7853982f, 0.7853982f, 0.0f); + (this.WING_T_A_1 = new ModelRenderer((ModelBase)this, 59, 0)).addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.WING_T_A_1.setRotationPoint(0.0f, -24.0f, 0.0f); + this.WING_T_A_1.setTextureSize(128, 128); + this.WING_T_A_1.mirror = true; + this.setRotation(this.WING_T_A_1, -0.7853982f, -0.7853982f, 0.0f); + (this.WING_T_B_2 = new ModelRenderer((ModelBase)this, 25, 0)).addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.WING_T_B_2.setRotationPoint(0.0f, -17.0f, 0.0f); + this.WING_T_B_2.setTextureSize(128, 128); + this.WING_T_B_2.mirror = true; + this.setRotation(this.WING_T_B_2, 0.0f, 0.7853982f, 0.0f); + (this.WING_T_A_2 = new ModelRenderer((ModelBase)this, 25, 0)).addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.WING_T_A_2.setRotationPoint(0.0f, -17.0f, 0.0f); + this.WING_T_A_2.setTextureSize(128, 128); + this.WING_T_A_2.mirror = true; + this.setRotation(this.WING_T_A_2, 0.0f, -0.7853982f, 0.0f); + (this.WING_B_B_2 = new ModelRenderer((ModelBase)this, 25, 26)).addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.WING_B_B_2.setRotationPoint(0.0f, 3.0f, 0.0f); + this.WING_B_B_2.setTextureSize(128, 128); + this.WING_B_B_2.mirror = true; + this.setRotation(this.WING_B_B_2, -0.7853982f, -0.7853982f, 0.0f); + (this.WING_B_A_2 = new ModelRenderer((ModelBase)this, 25, 26)).addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.WING_B_A_2.setRotationPoint(0.0f, 3.0f, 0.0f); + this.WING_B_A_2.setTextureSize(128, 128); + this.WING_B_A_2.mirror = true; + this.setRotation(this.WING_B_A_2, -0.7853982f, 0.7853982f, 0.0f); + (this.CHEMICAL_CONTROL_MODULE = new ModelRenderer((ModelBase)this, 0, 86)).addBox(-4.0f, 0.0f, -4.0f, 8, 8, 8); + this.CHEMICAL_CONTROL_MODULE.setRotationPoint(0.0f, -4.0f, 0.0f); + this.CHEMICAL_CONTROL_MODULE.setTextureSize(128, 128); + this.CHEMICAL_CONTROL_MODULE.mirror = true; + this.setRotation(this.CHEMICAL_CONTROL_MODULE, 0.0f, 0.0f, 0.0f); + (this.CHEMICAL_CONDUCT = new ModelRenderer((ModelBase)this, 34, 86)).addBox(0.0f, 0.0f, 0.0f, 1, 24, 1); + this.CHEMICAL_CONDUCT.setRotationPoint(0.0f, -28.0f, -4.0f); + this.CHEMICAL_CONDUCT.setTextureSize(128, 128); + this.CHEMICAL_CONDUCT.mirror = true; + this.setRotation(this.CHEMICAL_CONDUCT, 0.0f, 0.0f, 0.0f); + (this.CHEM_WARHEAD_1 = new ModelRenderer((ModelBase)this, 0, 103)).addBox(-4.0f, 0.0f, -4.0f, 8, 5, 8); + this.CHEM_WARHEAD_1.setRotationPoint(0.0f, -31.0f, 0.0f); + this.CHEM_WARHEAD_1.setTextureSize(128, 128); + this.CHEM_WARHEAD_1.mirror = true; + this.setRotation(this.CHEM_WARHEAD_1, 0.0f, 0.7853982f, 0.0f); + (this.CHEM_WARHEAD_2 = new ModelRenderer((ModelBase)this, 40, 86)).addBox(-3.0f, 0.0f, -3.0f, 6, 5, 6); + this.CHEM_WARHEAD_2.setRotationPoint(0.0f, -36.0f, 0.0f); + this.CHEM_WARHEAD_2.setTextureSize(128, 128); + this.CHEM_WARHEAD_2.mirror = true; + this.setRotation(this.CHEM_WARHEAD_2, 0.0f, 0.7853982f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, final float f2, final float f3, final float f4, final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.MAIN_MISSILE_MODULE.render(f5); + this.MOTOR_MODULE.render(f5); + this.WING_B_A_1.render(f5); + this.WING_B_B_1.render(f5); + this.WING_T_B_1.render(f5); + this.WING_T_A_1.render(f5); + this.WING_T_B_2.render(f5); + this.WING_T_A_2.render(f5); + this.WING_B_B_2.render(f5); + this.WING_B_A_2.render(f5); + this.CHEMICAL_CONTROL_MODULE.render(f5); + this.CHEMICAL_CONDUCT.render(f5); + this.CHEM_WARHEAD_1.render(f5); + this.CHEM_WARHEAD_2.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMFanDan.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMFanDan.java new file mode 100644 index 0000000..ec227d1 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMFanDan.java @@ -0,0 +1,260 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMFanDan extends MICBM { + ModelRenderer Shape1; + ModelRenderer Shape2; + ModelRenderer Shape2a; + ModelRenderer Shape2b; + ModelRenderer Shape2c; + ModelRenderer Shape3d; + ModelRenderer Shape3; + ModelRenderer Shape3a; + ModelRenderer Shape3b; + ModelRenderer Shape4; + ModelRenderer Shape4a; + ModelRenderer Shape4b; + ModelRenderer Shape4c; + ModelRenderer Shape5; + ModelRenderer Shape5a; + ModelRenderer Shape4d; + ModelRenderer Shape4e; + ModelRenderer Shape4f; + ModelRenderer Shape4g; + ModelRenderer Shape6; + ModelRenderer Shape6a; + ModelRenderer Shape7a; + ModelRenderer Shape7; + ModelRenderer Shape8; + ModelRenderer Shape8a; + ModelRenderer Shape8b; + ModelRenderer Shape8c; + ModelRenderer Shape8d; + + public MMFanDan() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape1 = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-4.0f, 0.0f, -4.0f, 8, 64, 8); + this.Shape1.setRotationPoint(0.0f, -40.0f, 0.0f); + this.Shape1.setTextureSize(128, 128); + this.Shape1.mirror = true; + this.setRotation(this.Shape1, 0.0f, 0.0f, 0.0f); + (this.Shape2 = new ModelRenderer((ModelBase)this, 34, 19)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.Shape2.setRotationPoint(-7.0f, 14.0f, 6.0f); + this.Shape2.setTextureSize(128, 128); + this.Shape2.mirror = true; + this.setRotation(this.Shape2, 0.0f, 0.0f, 0.0f); + (this.Shape2a = new ModelRenderer((ModelBase)this, 34, 19)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.Shape2a.setRotationPoint(-7.0f, 14.0f, -7.0f); + this.Shape2a.setTextureSize(128, 128); + this.Shape2a.mirror = true; + this.setRotation(this.Shape2a, 0.0f, 0.0f, 0.0f); + (this.Shape2b = new ModelRenderer((ModelBase)this, 34, 31)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.Shape2b.setRotationPoint(-7.0f, 14.0f, -6.0f); + this.Shape2b.setTextureSize(128, 128); + this.Shape2b.mirror = true; + this.setRotation(this.Shape2b, 0.0f, 0.0f, 0.0f); + (this.Shape2c = new ModelRenderer((ModelBase)this, 34, 31)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.Shape2c.setRotationPoint(6.0f, 14.0f, -6.0f); + this.Shape2c.setTextureSize(128, 128); + this.Shape2c.mirror = true; + this.setRotation(this.Shape2c, 0.0f, 0.0f, 0.0f); + (this.Shape3d = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.Shape3d.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3d.setTextureSize(128, 128); + this.Shape3d.mirror = true; + this.setRotation(this.Shape3d, 0.0f, 0.7853982f, 0.0f); + (this.Shape3 = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.Shape3.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3.setTextureSize(128, 128); + this.Shape3.mirror = true; + this.setRotation(this.Shape3, 0.0f, -0.7853982f, 0.0f); + (this.Shape3a = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.Shape3a.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3a.setTextureSize(128, 128); + this.Shape3a.mirror = true; + this.setRotation(this.Shape3a, 0.0f, 0.7853982f, 0.7853982f); + (this.Shape3b = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.Shape3b.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3b.setTextureSize(128, 128); + this.Shape3b.mirror = true; + this.setRotation(this.Shape3b, 0.0f, -0.7853982f, 0.7853982f); + (this.Shape4 = new ModelRenderer((ModelBase)this, 22, 74)) + .addBox(0.0f, 0.0f, 0.0f, 2, 7, 5); + this.Shape4.setRotationPoint(-1.0f, -23.0f, 4.0f); + this.Shape4.setTextureSize(128, 128); + this.Shape4.mirror = true; + this.setRotation(this.Shape4, -0.5235988f, 0.0f, 0.0f); + (this.Shape4a = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, 0.0f, 5, 8, 2); + this.Shape4a.setRotationPoint(4.0f, -23.0f, -1.0f); + this.Shape4a.setTextureSize(128, 128); + this.Shape4a.mirror = true; + this.setRotation(this.Shape4a, 0.0f, 0.0f, 0.5235988f); + (this.Shape4b = new ModelRenderer((ModelBase)this, 0, 81)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.Shape4b.setRotationPoint(0.0f, -35.0f, -4.0f); + this.Shape4b.setTextureSize(128, 128); + this.Shape4b.mirror = true; + this.setRotation(this.Shape4b, -0.5235988f, 3.141593f, 0.0f); + (this.Shape4c = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, -1.0f, 5, 8, 2); + this.Shape4c.setRotationPoint(-4.0f, -23.0f, 0.0f); + this.Shape4c.setTextureSize(128, 128); + this.Shape4c.mirror = true; + this.setRotation(this.Shape4c, 0.0f, 3.141593f, 0.5235988f); + (this.Shape5 = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.Shape5.setRotationPoint(0.0f, -32.0f, 0.0f); + this.Shape5.setTextureSize(128, 128); + this.Shape5.mirror = true; + this.setRotation(this.Shape5, 0.0f, 0.0f, 0.0f); + (this.Shape5a = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.Shape5a.setRotationPoint(0.0f, -32.0f, 0.0f); + this.Shape5a.setTextureSize(128, 128); + this.Shape5a.mirror = true; + this.setRotation(this.Shape5a, 0.0f, 1.570796f, 0.0f); + (this.Shape4d = new ModelRenderer((ModelBase)this, 22, 74)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 8, 5); + this.Shape4d.setRotationPoint(0.0f, -23.0f, -4.0f); + this.Shape4d.setTextureSize(128, 128); + this.Shape4d.mirror = true; + this.setRotation(this.Shape4d, -0.5235988f, 3.141593f, 0.0f); + (this.Shape4e = new ModelRenderer((ModelBase)this, 0, 81)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.Shape4e.setRotationPoint(0.0f, -35.0f, 4.0f); + this.Shape4e.setTextureSize(128, 128); + this.Shape4e.mirror = true; + this.setRotation(this.Shape4e, -0.5235988f, 0.0f, 0.0f); + (this.Shape4f = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(0.0f, 0.0f, -1.0f, 5, 4, 2); + this.Shape4f.setRotationPoint(-4.0f, -35.0f, 0.0f); + this.Shape4f.setTextureSize(128, 128); + this.Shape4f.mirror = true; + this.setRotation(this.Shape4f, 0.0f, 3.141593f, 0.5235988f); + (this.Shape4g = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(0.0f, 0.0f, 0.0f, 5, 4, 2); + this.Shape4g.setRotationPoint(4.0f, -35.0f, -1.0f); + this.Shape4g.setTextureSize(128, 128); + this.Shape4g.mirror = true; + this.setRotation(this.Shape4g, 0.0f, 0.0f, 0.5235988f); + (this.Shape6 = new ModelRenderer((ModelBase)this, 72, 16)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.Shape6.setRotationPoint(-5.0f, -37.0f, -5.0f); + this.Shape6.setTextureSize(128, 128); + this.Shape6.mirror = true; + this.setRotation(this.Shape6, 0.0f, 0.0f, 0.0f); + (this.Shape6a = new ModelRenderer((ModelBase)this, 72, 16)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.Shape6a.setRotationPoint(-5.0f, -41.0f, -5.0f); + this.Shape6a.setTextureSize(128, 128); + this.Shape6a.mirror = true; + this.setRotation(this.Shape6a, 0.0f, 0.0f, 0.0f); + (this.Shape7a = new ModelRenderer((ModelBase)this, 72, 29)) + .addBox(0.0f, 0.0f, 0.0f, 8, 4, 8); + this.Shape7a.setRotationPoint(-4.0f, -45.0f, -4.0f); + this.Shape7a.setTextureSize(128, 128); + this.Shape7a.mirror = true; + this.setRotation(this.Shape7a, 0.0f, 0.0f, 0.0f); + (this.Shape7 = new ModelRenderer((ModelBase)this, 72, 43)) + .addBox(0.0f, 0.0f, 0.0f, 6, 2, 6); + this.Shape7.setRotationPoint(-3.0f, -47.0f, -3.0f); + this.Shape7.setTextureSize(128, 128); + this.Shape7.mirror = true; + this.setRotation(this.Shape7, 0.0f, 0.0f, 0.0f); + (this.Shape8 = new ModelRenderer((ModelBase)this, 63, 33)) + .addBox(0.0f, 0.0f, 0.0f, 2, 2, 2); + this.Shape8.setRotationPoint(2.0f, -46.0f, -1.0f); + this.Shape8.setTextureSize(128, 128); + this.Shape8.mirror = true; + this.setRotation(this.Shape8, 0.0f, 0.0f, -0.7853982f); + (this.Shape8a = new ModelRenderer((ModelBase)this, 63, 33)) + .addBox(0.0f, 0.0f, 0.0f, 2, 2, 2); + this.Shape8a.setRotationPoint(-5.0f, -46.0f, -1.0f); + this.Shape8a.setTextureSize(128, 128); + this.Shape8a.mirror = true; + this.setRotation(this.Shape8a, 0.0f, 0.0f, -0.7853982f); + (this.Shape8b = new ModelRenderer((ModelBase)this, 63, 33)) + .addBox(0.0f, 0.0f, 0.0f, 2, 2, 2); + this.Shape8b.setRotationPoint(-1.0f, -46.0f, 2.0f); + this.Shape8b.setTextureSize(128, 128); + this.Shape8b.mirror = true; + this.setRotation(this.Shape8b, 0.7853982f, 0.0f, 0.0f); + (this.Shape8c = new ModelRenderer((ModelBase)this, 63, 33)) + .addBox(0.0f, 0.0f, 0.0f, 2, 2, 2); + this.Shape8c.setRotationPoint(-1.0f, -46.0f, -5.0f); + this.Shape8c.setTextureSize(128, 128); + this.Shape8c.mirror = true; + this.setRotation(this.Shape8c, 0.7853982f, 0.0f, 0.0f); + (this.Shape8d = new ModelRenderer((ModelBase)this, 72, 53)) + .addBox(0.0f, 0.0f, 0.0f, 4, 2, 4); + this.Shape8d.setRotationPoint(-2.0f, -49.0f, -2.0f); + this.Shape8d.setTextureSize(128, 128); + this.Shape8d.mirror = true; + this.setRotation(this.Shape8d, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.Shape1.render(f5); + this.Shape2.render(f5); + this.Shape2a.render(f5); + this.Shape2b.render(f5); + this.Shape2c.render(f5); + this.Shape3d.render(f5); + this.Shape3.render(f5); + this.Shape3a.render(f5); + this.Shape3b.render(f5); + this.Shape4.render(f5); + this.Shape4a.render(f5); + this.Shape4b.render(f5); + this.Shape4c.render(f5); + this.Shape5.render(f5); + this.Shape5a.render(f5); + this.Shape4d.render(f5); + this.Shape4e.render(f5); + this.Shape4f.render(f5); + this.Shape4g.render(f5); + this.Shape6.render(f5); + this.Shape6a.render(f5); + this.Shape7a.render(f5); + this.Shape7.render(f5); + this.Shape8.render(f5); + this.Shape8a.render(f5); + this.Shape8b.render(f5); + this.Shape8c.render(f5); + this.Shape8d.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMFanWuSu.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMFanWuSu.java new file mode 100644 index 0000000..c32cd3f --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMFanWuSu.java @@ -0,0 +1,260 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMFanWuSu extends MICBM { + ModelRenderer Shape1; + ModelRenderer Shape2; + ModelRenderer Shape3; + ModelRenderer Shape4; + ModelRenderer Shape36; + ModelRenderer Shape4a; + ModelRenderer Shape5a; + ModelRenderer Shape6a; + ModelRenderer Shape6b; + ModelRenderer Shape6c; + ModelRenderer Shape6d; + ModelRenderer Shape6e; + ModelRenderer Shape6f; + ModelRenderer Shape6g; + ModelRenderer Shape6h; + ModelRenderer Shape7; + ModelRenderer Shape8; + ModelRenderer Shape9; + ModelRenderer Shape10a; + ModelRenderer Shape10b; + ModelRenderer Shape10c; + ModelRenderer Shape10d; + ModelRenderer Shape11a; + ModelRenderer Shape11b; + ModelRenderer Shape2e; + ModelRenderer Shape12; + ModelRenderer Shape13; + ModelRenderer Shape14; + + public MMFanWuSu() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape1 = new ModelRenderer((ModelBase)this, 27, 0)) + .addBox(0.0f, 0.0f, 0.0f, 8, 10, 14); + this.Shape1.setRotationPoint(-8.0f, 14.0f, -2.0f); + this.Shape1.setTextureSize(128, 128); + this.Shape1.mirror = true; + this.setRotation(this.Shape1, 0.0f, 0.7853982f, 0.0f); + (this.Shape2 = new ModelRenderer((ModelBase)this, 27, 0)) + .addBox(0.0f, 0.0f, 0.0f, 8, 10, 14); + this.Shape2.setRotationPoint(2.0f, 14.0f, -8.0f); + this.Shape2.setTextureSize(128, 128); + this.Shape2.mirror = true; + this.setRotation(this.Shape2, 0.0f, -0.7853982f, 0.0f); + (this.Shape3 = new ModelRenderer((ModelBase)this, 36, 47)) + .addBox(0.0f, 0.0f, 0.0f, 21, 11, 2); + this.Shape3.setRotationPoint(-8.0f, 13.0f, 7.0f); + this.Shape3.setTextureSize(128, 128); + this.Shape3.mirror = true; + this.setRotation(this.Shape3, 0.0f, 0.7853982f, 0.0f); + (this.Shape4 = new ModelRenderer((ModelBase)this, 36, 47)) + .addBox(0.0f, 0.0f, 0.0f, 21, 11, 2); + this.Shape4.setRotationPoint(-7.0f, 13.0f, -8.0f); + this.Shape4.setTextureSize(128, 128); + this.Shape4.mirror = true; + this.setRotation(this.Shape4, 0.0f, -0.7853982f, 0.0f); + (this.Shape36 = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 6, 40, 6); + this.Shape36.setRotationPoint(-3.0f, -26.0f, -3.0f); + this.Shape36.setTextureSize(128, 128); + this.Shape36.mirror = true; + this.setRotation(this.Shape36, 0.0f, 0.0f, 0.0f); + (this.Shape4a = new ModelRenderer((ModelBase)this, 27, 25)) + .addBox(0.0f, 0.0f, 0.0f, 10, 10, 10); + this.Shape4a.setRotationPoint(-5.0f, 4.0f, -5.0f); + this.Shape4a.setTextureSize(128, 128); + this.Shape4a.mirror = true; + this.setRotation(this.Shape4a, 0.0f, 0.0f, 0.0f); + (this.Shape5a = new ModelRenderer((ModelBase)this, 72, 31)) + .addBox(0.0f, 0.0f, 0.0f, 8, 4, 8); + this.Shape5a.setRotationPoint(-4.0f, -30.0f, -4.0f); + this.Shape5a.setTextureSize(128, 128); + this.Shape5a.mirror = true; + this.setRotation(this.Shape5a, 0.0f, 0.0f, 0.0f); + (this.Shape6a = new ModelRenderer((ModelBase)this, 89, 8)) + .addBox(0.0f, 0.0f, 0.0f, 2, 5, 1); + this.Shape6a.setRotationPoint(-1.0f, -35.0f, 3.0f); + this.Shape6a.setTextureSize(128, 128); + this.Shape6a.mirror = true; + this.setRotation(this.Shape6a, 0.0f, 0.0f, 0.0f); + (this.Shape6b = new ModelRenderer((ModelBase)this, 89, 8)) + .addBox(0.0f, 0.0f, 0.0f, 1, 5, 2); + this.Shape6b.setRotationPoint(3.0f, -35.0f, -1.0f); + this.Shape6b.setTextureSize(128, 128); + this.Shape6b.mirror = true; + this.setRotation(this.Shape6b, 0.0f, 0.0f, 0.0f); + (this.Shape6c = new ModelRenderer((ModelBase)this, 89, 8)) + .addBox(0.0f, 0.0f, 0.0f, 1, 5, 2); + this.Shape6c.setRotationPoint(-4.0f, -35.0f, -1.0f); + this.Shape6c.setTextureSize(128, 128); + this.Shape6c.mirror = true; + this.setRotation(this.Shape6c, 0.0f, 0.0f, 0.0f); + (this.Shape6d = new ModelRenderer((ModelBase)this, 89, 8)) + .addBox(0.0f, 0.0f, 0.0f, 2, 5, 1); + this.Shape6d.setRotationPoint(-1.0f, -35.0f, -4.0f); + this.Shape6d.setTextureSize(128, 128); + this.Shape6d.mirror = true; + this.setRotation(this.Shape6d, 0.0f, 0.0f, 0.0f); + (this.Shape6e = new ModelRenderer((ModelBase)this, 103, 8)) + .addBox(0.0f, 0.0f, 0.0f, 1, 5, 2); + this.Shape6e.setRotationPoint(-2.0f, -39.0f, -1.0f); + this.Shape6e.setTextureSize(128, 128); + this.Shape6e.mirror = true; + this.setRotation(this.Shape6e, 0.0f, 0.0f, 0.4014257f); + (this.Shape6f = new ModelRenderer((ModelBase)this, 103, 8)) + .addBox(0.0f, 0.0f, 0.0f, 1, 5, 2); + this.Shape6f.setRotationPoint(1.0f, -39.0f, -1.0f); + this.Shape6f.setTextureSize(128, 128); + this.Shape6f.mirror = true; + this.setRotation(this.Shape6f, 0.0f, 0.0f, -0.4014257f); + (this.Shape6g = new ModelRenderer((ModelBase)this, 96, 8)) + .addBox(0.0f, 0.0f, 0.0f, 2, 5, 1); + this.Shape6g.setRotationPoint(-1.0f, -39.0f, -2.0f); + this.Shape6g.setTextureSize(128, 128); + this.Shape6g.mirror = true; + this.setRotation(this.Shape6g, -0.4014257f, 0.0f, 0.0f); + (this.Shape6h = new ModelRenderer((ModelBase)this, 96, 8)) + .addBox(0.0f, 0.0f, 0.0f, 2, 5, 1); + this.Shape6h.setRotationPoint(-1.0f, -39.0f, 1.0f); + this.Shape6h.setTextureSize(128, 128); + this.Shape6h.mirror = true; + this.setRotation(this.Shape6h, 0.4014257f, 0.0f, 0.0f); + (this.Shape7 = new ModelRenderer((ModelBase)this, 110, 0)) + .addBox(0.0f, 0.0f, 0.0f, 4, 1, 4); + this.Shape7.setRotationPoint(-2.0f, -40.0f, -2.0f); + this.Shape7.setTextureSize(128, 128); + this.Shape7.mirror = true; + this.setRotation(this.Shape7, 0.0f, 0.0f, 0.0f); + (this.Shape8 = new ModelRenderer((ModelBase)this, 110, 19)) + .addBox(0.0f, 0.0f, 0.0f, 4, 5, 4); + this.Shape8.setRotationPoint(-2.0f, -35.0f, -2.0f); + this.Shape8.setTextureSize(128, 128); + this.Shape8.mirror = true; + this.setRotation(this.Shape8, 0.0f, 0.0f, 0.0f); + (this.Shape9 = new ModelRenderer((ModelBase)this, 110, 8)) + .addBox(0.0f, 0.0f, 0.0f, 2, 8, 2); + this.Shape9.setRotationPoint(-1.0f, -43.0f, -1.0f); + this.Shape9.setTextureSize(128, 128); + this.Shape9.mirror = true; + this.setRotation(this.Shape9, 0.0f, 0.0f, 0.0f); + (this.Shape10a = new ModelRenderer((ModelBase)this, 72, 8)) + .addBox(0.0f, 0.0f, 0.0f, 6, 6, 2); + this.Shape10a.setRotationPoint(8.0f, -23.0f, 1.0f); + this.Shape10a.setTextureSize(128, 128); + this.Shape10a.mirror = true; + this.setRotation(this.Shape10a, 0.0f, -3.141593f, -0.7853982f); + (this.Shape10b = new ModelRenderer((ModelBase)this, 72, 17)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 6); + this.Shape10b.setRotationPoint(-1.0f, -23.0f, -8.0f); + this.Shape10b.setTextureSize(128, 128); + this.Shape10b.mirror = true; + this.setRotation(this.Shape10b, 0.7853982f, 0.0f, 0.0f); + (this.Shape10c = new ModelRenderer((ModelBase)this, 72, 8)) + .addBox(0.0f, 0.0f, 0.0f, 6, 6, 2); + this.Shape10c.setRotationPoint(-8.0f, -23.0f, -1.0f); + this.Shape10c.setTextureSize(128, 128); + this.Shape10c.mirror = true; + this.setRotation(this.Shape10c, 0.0f, 0.0f, -0.7853982f); + (this.Shape10d = new ModelRenderer((ModelBase)this, 72, 8)) + .addBox(0.0f, 0.0f, 0.0f, 6, 6, 2); + this.Shape10d.setRotationPoint(-1.0f, -23.0f, 8.0f); + this.Shape10d.setTextureSize(128, 128); + this.Shape10d.mirror = true; + this.setRotation(this.Shape10d, 0.0f, 1.570796f, -0.7853982f); + (this.Shape11a = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(0.0f, 0.0f, 0.0f, 16, 5, 2); + this.Shape11a.setRotationPoint(-8.0f, -23.0f, -1.0f); + this.Shape11a.setTextureSize(128, 128); + this.Shape11a.mirror = true; + this.setRotation(this.Shape11a, 0.0f, 0.0f, 0.0f); + (this.Shape11b = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(0.0f, 0.0f, 0.0f, 16, 5, 2); + this.Shape11b.setRotationPoint(-1.0f, -23.0f, 8.0f); + this.Shape11b.setTextureSize(128, 128); + this.Shape11b.mirror = true; + this.setRotation(this.Shape11b, 0.0f, 1.570796f, 0.0f); + (this.Shape2e = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, 0.0f, 16, 10, 4); + this.Shape2e.setRotationPoint(-8.0f, 14.0f, -2.0f); + this.Shape2e.setTextureSize(128, 128); + this.Shape2e.mirror = true; + this.setRotation(this.Shape2e, 0.0f, 0.0f, 0.0f); + (this.Shape12 = new ModelRenderer((ModelBase)this, 0, 76)) + .addBox(0.0f, 0.0f, 0.0f, 4, 10, 16); + this.Shape12.setRotationPoint(-2.0f, 14.0f, -8.0f); + this.Shape12.setTextureSize(128, 128); + this.Shape12.mirror = true; + this.setRotation(this.Shape12, 0.0f, 0.0f, 0.0f); + (this.Shape13 = new ModelRenderer((ModelBase)this, 0, 47)) + .addBox(0.0f, 0.0f, 0.0f, 3, 14, 14); + this.Shape13.setRotationPoint(6.0f, 13.0f, -8.0f); + this.Shape13.setTextureSize(128, 128); + this.Shape13.mirror = true; + this.setRotation(this.Shape13, 0.7853982f, -0.7853982f, 0.0f); + (this.Shape14 = new ModelRenderer((ModelBase)this, 0, 47)) + .addBox(0.0f, 0.0f, 0.0f, 3, 14, 14); + this.Shape14.setRotationPoint(8.0f, 13.0f, 6.0f); + this.Shape14.setTextureSize(128, 128); + this.Shape14.mirror = true; + this.setRotation(this.Shape14, 0.7853982f, -2.356194f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.Shape1.render(f5); + this.Shape2.render(f5); + this.Shape3.render(f5); + this.Shape4.render(f5); + this.Shape36.render(f5); + this.Shape4a.render(f5); + this.Shape5a.render(f5); + this.Shape6a.render(f5); + this.Shape6b.render(f5); + this.Shape6c.render(f5); + this.Shape6d.render(f5); + this.Shape6e.render(f5); + this.Shape6f.render(f5); + this.Shape6g.render(f5); + this.Shape6h.render(f5); + this.Shape7.render(f5); + this.Shape8.render(f5); + this.Shape9.render(f5); + this.Shape10a.render(f5); + this.Shape10b.render(f5); + this.Shape10c.render(f5); + this.Shape10d.render(f5); + this.Shape11a.render(f5); + this.Shape11b.render(f5); + this.Shape2e.render(f5); + this.Shape12.render(f5); + this.Shape13.render(f5); + this.Shape14.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMFenZiDan.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMFenZiDan.java new file mode 100644 index 0000000..1e9f447 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMFenZiDan.java @@ -0,0 +1,284 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMFenZiDan extends MICBM { + ModelRenderer Shape1; + ModelRenderer Shape2; + ModelRenderer Shape2a; + ModelRenderer Shape2b; + ModelRenderer Shape2c; + ModelRenderer Shape3a; + ModelRenderer Shape3; + ModelRenderer Shape3b; + ModelRenderer Shape3c; + ModelRenderer Shape4; + ModelRenderer Shape4a; + ModelRenderer Shape4b; + ModelRenderer Shape4c; + ModelRenderer Shape5a; + ModelRenderer Shape5; + ModelRenderer Shape4d; + ModelRenderer Shape4e; + ModelRenderer Shape4f; + ModelRenderer Shape4g; + ModelRenderer Shape6; + ModelRenderer Shape6a; + ModelRenderer Shape7; + ModelRenderer Shape7a; + ModelRenderer Shape7b; + ModelRenderer Shape7c; + ModelRenderer Shape7d; + ModelRenderer Shape7e; + ModelRenderer Shape7f; + ModelRenderer Shape7g; + ModelRenderer Shape8a; + ModelRenderer Shape8; + + public MMFenZiDan() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape1 = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-4.0f, 0.0f, -4.0f, 8, 64, 8); + this.Shape1.setRotationPoint(0.0f, -40.0f, 0.0f); + this.Shape1.setTextureSize(128, 128); + this.Shape1.mirror = true; + this.setRotation(this.Shape1, 0.0f, 0.0f, 0.0f); + (this.Shape2 = new ModelRenderer((ModelBase)this, 62, 48)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.Shape2.setRotationPoint(-7.0f, 14.0f, 6.0f); + this.Shape2.setTextureSize(128, 128); + this.Shape2.mirror = true; + this.setRotation(this.Shape2, 0.0f, 0.0f, 0.0f); + (this.Shape2a = new ModelRenderer((ModelBase)this, 62, 48)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.Shape2a.setRotationPoint(-7.0f, 14.0f, -7.0f); + this.Shape2a.setTextureSize(128, 128); + this.Shape2a.mirror = true; + this.setRotation(this.Shape2a, 0.0f, 0.0f, 0.0f); + (this.Shape2b = new ModelRenderer((ModelBase)this, 34, 48)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.Shape2b.setRotationPoint(-7.0f, 14.0f, -6.0f); + this.Shape2b.setTextureSize(128, 128); + this.Shape2b.mirror = true; + this.setRotation(this.Shape2b, 0.0f, 0.0f, 0.0f); + (this.Shape2c = new ModelRenderer((ModelBase)this, 34, 48)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.Shape2c.setRotationPoint(6.0f, 14.0f, -6.0f); + this.Shape2c.setTextureSize(128, 128); + this.Shape2c.mirror = true; + this.setRotation(this.Shape2c, 0.0f, 0.0f, 0.0f); + (this.Shape3a = new ModelRenderer((ModelBase)this, 34, 33)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.Shape3a.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3a.setTextureSize(128, 128); + this.Shape3a.mirror = true; + this.setRotation(this.Shape3a, 0.0f, 0.7853982f, 0.0f); + (this.Shape3 = new ModelRenderer((ModelBase)this, 34, 33)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.Shape3.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3.setTextureSize(128, 128); + this.Shape3.mirror = true; + this.setRotation(this.Shape3, 0.0f, -0.7853982f, 0.0f); + (this.Shape3b = new ModelRenderer((ModelBase)this, 34, 13)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.Shape3b.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3b.setTextureSize(128, 128); + this.Shape3b.mirror = true; + this.setRotation(this.Shape3b, 0.0f, 0.7853982f, 0.7853982f); + (this.Shape3c = new ModelRenderer((ModelBase)this, 34, 13)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.Shape3c.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3c.setTextureSize(128, 128); + this.Shape3c.mirror = true; + this.setRotation(this.Shape3c, 0.0f, -0.7853982f, 0.7853982f); + (this.Shape4 = new ModelRenderer((ModelBase)this, 16, 114)) + .addBox(0.0f, 0.0f, 0.0f, 2, 7, 5); + this.Shape4.setRotationPoint(-1.0f, -23.0f, 4.0f); + this.Shape4.setTextureSize(128, 128); + this.Shape4.mirror = true; + this.setRotation(this.Shape4, -0.5235988f, 0.0f, 0.0f); + (this.Shape4a = new ModelRenderer((ModelBase)this, 0, 114)) + .addBox(0.0f, 0.0f, 0.0f, 5, 8, 2); + this.Shape4a.setRotationPoint(4.0f, -23.0f, -1.0f); + this.Shape4a.setTextureSize(128, 128); + this.Shape4a.mirror = true; + this.setRotation(this.Shape4a, 0.0f, 0.0f, 0.5235988f); + (this.Shape4b = new ModelRenderer((ModelBase)this, 15, 104)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.Shape4b.setRotationPoint(0.0f, -35.0f, -4.0f); + this.Shape4b.setTextureSize(128, 128); + this.Shape4b.mirror = true; + this.setRotation(this.Shape4b, -0.5235988f, 3.141593f, 0.0f); + (this.Shape4c = new ModelRenderer((ModelBase)this, 0, 114)) + .addBox(0.0f, 0.0f, -1.0f, 5, 8, 2); + this.Shape4c.setRotationPoint(-4.0f, -23.0f, 0.0f); + this.Shape4c.setTextureSize(128, 128); + this.Shape4c.mirror = true; + this.setRotation(this.Shape4c, 0.0f, 3.141593f, 0.5235988f); + (this.Shape5a = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.Shape5a.setRotationPoint(0.0f, -32.0f, 0.0f); + this.Shape5a.setTextureSize(128, 128); + this.Shape5a.mirror = true; + this.setRotation(this.Shape5a, 0.0f, 0.0f, 0.0f); + (this.Shape5 = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.Shape5.setRotationPoint(0.0f, -32.0f, 0.0f); + this.Shape5.setTextureSize(128, 128); + this.Shape5.mirror = true; + this.setRotation(this.Shape5, 0.0f, 1.570796f, 0.0f); + (this.Shape4d = new ModelRenderer((ModelBase)this, 16, 114)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 8, 5); + this.Shape4d.setRotationPoint(0.0f, -23.0f, -4.0f); + this.Shape4d.setTextureSize(128, 128); + this.Shape4d.mirror = true; + this.setRotation(this.Shape4d, -0.5235988f, 3.141593f, 0.0f); + (this.Shape4e = new ModelRenderer((ModelBase)this, 15, 104)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.Shape4e.setRotationPoint(0.0f, -35.0f, 4.0f); + this.Shape4e.setTextureSize(128, 128); + this.Shape4e.mirror = true; + this.setRotation(this.Shape4e, -0.5235988f, 0.0f, 0.0f); + (this.Shape4f = new ModelRenderer((ModelBase)this, 0, 104)) + .addBox(0.0f, 0.0f, -1.0f, 5, 4, 2); + this.Shape4f.setRotationPoint(-4.0f, -35.0f, 0.0f); + this.Shape4f.setTextureSize(128, 128); + this.Shape4f.mirror = true; + this.setRotation(this.Shape4f, 0.0f, 3.141593f, 0.5235988f); + (this.Shape4g = new ModelRenderer((ModelBase)this, 0, 104)) + .addBox(0.0f, 0.0f, 0.0f, 5, 4, 2); + this.Shape4g.setRotationPoint(4.0f, -35.0f, -1.0f); + this.Shape4g.setTextureSize(128, 128); + this.Shape4g.mirror = true; + this.setRotation(this.Shape4g, 0.0f, 0.0f, 0.5235988f); + (this.Shape6 = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.Shape6.setRotationPoint(-5.0f, -37.0f, -5.0f); + this.Shape6.setTextureSize(128, 128); + this.Shape6.mirror = true; + this.setRotation(this.Shape6, 0.0f, 0.0f, 0.0f); + (this.Shape6a = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.Shape6a.setRotationPoint(-5.0f, -41.0f, -5.0f); + this.Shape6a.setTextureSize(128, 128); + this.Shape6a.mirror = true; + this.setRotation(this.Shape6a, 0.0f, 0.0f, 0.0f); + (this.Shape7 = new ModelRenderer((ModelBase)this, 39, 74)) + .addBox(0.0f, 0.0f, 0.0f, 6, 22, 6); + this.Shape7.setRotationPoint(-3.0f, 2.0f, 4.0f); + this.Shape7.setTextureSize(128, 128); + this.Shape7.mirror = true; + this.setRotation(this.Shape7, 0.0f, 0.0f, 0.0f); + (this.Shape7a = new ModelRenderer((ModelBase)this, 65, 74)) + .addBox(0.0f, 0.0f, 0.0f, 4, 4, 4); + this.Shape7a.setRotationPoint(-2.0f, -2.0f, 5.0f); + this.Shape7a.setTextureSize(128, 128); + this.Shape7a.mirror = true; + this.setRotation(this.Shape7a, 0.0f, 0.0f, 0.0f); + (this.Shape7b = new ModelRenderer((ModelBase)this, 65, 74)) + .addBox(0.0f, 0.0f, 0.0f, 4, 4, 4); + this.Shape7b.setRotationPoint(-2.0f, -2.0f, -9.0f); + this.Shape7b.setTextureSize(128, 128); + this.Shape7b.mirror = true; + this.setRotation(this.Shape7b, 0.0f, 0.0f, 0.0f); + (this.Shape7c = new ModelRenderer((ModelBase)this, 39, 74)) + .addBox(0.0f, 0.0f, 0.0f, 6, 22, 6); + this.Shape7c.setRotationPoint(-3.0f, 2.0f, -10.0f); + this.Shape7c.setTextureSize(128, 128); + this.Shape7c.mirror = true; + this.setRotation(this.Shape7c, 0.0f, 0.0f, 0.0f); + (this.Shape7d = new ModelRenderer((ModelBase)this, 65, 74)) + .addBox(0.0f, 0.0f, 0.0f, 4, 4, 4); + this.Shape7d.setRotationPoint(-9.0f, -2.0f, -2.0f); + this.Shape7d.setTextureSize(128, 128); + this.Shape7d.mirror = true; + this.setRotation(this.Shape7d, 0.0f, 0.0f, 0.0f); + (this.Shape7e = new ModelRenderer((ModelBase)this, 39, 74)) + .addBox(0.0f, 0.0f, 0.0f, 6, 22, 6); + this.Shape7e.setRotationPoint(-10.0f, 2.0f, -3.0f); + this.Shape7e.setTextureSize(128, 128); + this.Shape7e.mirror = true; + this.setRotation(this.Shape7e, 0.0f, 0.0f, 0.0f); + (this.Shape7f = new ModelRenderer((ModelBase)this, 65, 74)) + .addBox(0.0f, 0.0f, 0.0f, 4, 4, 4); + this.Shape7f.setRotationPoint(5.0f, -2.0f, -2.0f); + this.Shape7f.setTextureSize(128, 128); + this.Shape7f.mirror = true; + this.setRotation(this.Shape7f, 0.0f, 0.0f, 0.0f); + (this.Shape7g = new ModelRenderer((ModelBase)this, 39, 74)) + .addBox(0.0f, 0.0f, 0.0f, 6, 22, 6); + this.Shape7g.setRotationPoint(4.0f, 2.0f, -3.0f); + this.Shape7g.setTextureSize(128, 128); + this.Shape7g.mirror = true; + this.setRotation(this.Shape7g, 0.0f, 0.0f, 0.0f); + (this.Shape8a = new ModelRenderer((ModelBase)this, 78, 0)) + .addBox(0.0f, 0.0f, 0.0f, 8, 5, 8); + this.Shape8a.setRotationPoint(-4.0f, -46.0f, -4.0f); + this.Shape8a.setTextureSize(128, 128); + this.Shape8a.mirror = true; + this.setRotation(this.Shape8a, 0.0f, 0.0f, 0.0f); + (this.Shape8 = new ModelRenderer((ModelBase)this, 78, 15)) + .addBox(0.0f, 0.0f, 0.0f, 6, 2, 6); + this.Shape8.setRotationPoint(-3.0f, -48.0f, -3.0f); + this.Shape8.setTextureSize(128, 128); + this.Shape8.mirror = true; + this.setRotation(this.Shape8, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.Shape1.render(f5); + this.Shape2.render(f5); + this.Shape2a.render(f5); + this.Shape2b.render(f5); + this.Shape2c.render(f5); + this.Shape3a.render(f5); + this.Shape3.render(f5); + this.Shape3b.render(f5); + this.Shape3c.render(f5); + this.Shape4.render(f5); + this.Shape4a.render(f5); + this.Shape4b.render(f5); + this.Shape4c.render(f5); + this.Shape5a.render(f5); + this.Shape5.render(f5); + this.Shape4d.render(f5); + this.Shape4e.render(f5); + this.Shape4f.render(f5); + this.Shape4g.render(f5); + this.Shape6.render(f5); + this.Shape6a.render(f5); + this.Shape7.render(f5); + this.Shape7a.render(f5); + this.Shape7b.render(f5); + this.Shape7c.render(f5); + this.Shape7d.render(f5); + this.Shape7e.render(f5); + this.Shape7f.render(f5); + this.Shape7g.render(f5); + this.Shape8a.render(f5); + this.Shape8.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMGanRanDu.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMGanRanDu.java new file mode 100644 index 0000000..7b84958 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMGanRanDu.java @@ -0,0 +1,276 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMGanRanDu extends MICBM { + ModelRenderer Shape1; + ModelRenderer Shape2; + ModelRenderer Shape2a; + ModelRenderer Shape2b; + ModelRenderer Shape2c; + ModelRenderer Shape3a; + ModelRenderer Shape3; + ModelRenderer Shape3c; + ModelRenderer Shape3b; + ModelRenderer Shape4a; + ModelRenderer Shape4; + ModelRenderer Shape4b; + ModelRenderer Shape4c; + ModelRenderer Shape5; + ModelRenderer Shape5a; + ModelRenderer Shape4g; + ModelRenderer Shape4e; + ModelRenderer Shape4f; + ModelRenderer Shape4h; + ModelRenderer Shape6a; + ModelRenderer Shape6; + ModelRenderer Shape7; + ModelRenderer Shape7a; + ModelRenderer Shape7b; + ModelRenderer Shape8; + ModelRenderer Shape8a; + ModelRenderer Shape8b; + ModelRenderer Shape8c; + ModelRenderer Shape8d; + ModelRenderer Shape8e; + + public MMGanRanDu() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape1 = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-4.0f, 0.0f, -4.0f, 8, 64, 8); + this.Shape1.setRotationPoint(0.0f, -40.0f, 0.0f); + this.Shape1.setTextureSize(128, 128); + this.Shape1.mirror = true; + this.setRotation(this.Shape1, 0.0f, 0.0f, 0.0f); + (this.Shape2 = new ModelRenderer((ModelBase)this, 34, 19)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.Shape2.setRotationPoint(-7.0f, 14.0f, 6.0f); + this.Shape2.setTextureSize(128, 128); + this.Shape2.mirror = true; + this.setRotation(this.Shape2, 0.0f, 0.0f, 0.0f); + (this.Shape2a = new ModelRenderer((ModelBase)this, 34, 19)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.Shape2a.setRotationPoint(-7.0f, 14.0f, -7.0f); + this.Shape2a.setTextureSize(128, 128); + this.Shape2a.mirror = true; + this.setRotation(this.Shape2a, 0.0f, 0.0f, 0.0f); + (this.Shape2b = new ModelRenderer((ModelBase)this, 34, 31)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.Shape2b.setRotationPoint(-7.0f, 14.0f, -6.0f); + this.Shape2b.setTextureSize(128, 128); + this.Shape2b.mirror = true; + this.setRotation(this.Shape2b, 0.0f, 0.0f, 0.0f); + (this.Shape2c = new ModelRenderer((ModelBase)this, 34, 31)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.Shape2c.setRotationPoint(6.0f, 14.0f, -6.0f); + this.Shape2c.setTextureSize(128, 128); + this.Shape2c.mirror = true; + this.setRotation(this.Shape2c, 0.0f, 0.0f, 0.0f); + (this.Shape3a = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.Shape3a.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3a.setTextureSize(128, 128); + this.Shape3a.mirror = true; + this.setRotation(this.Shape3a, 0.0f, 0.7853982f, 0.0f); + (this.Shape3 = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.Shape3.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3.setTextureSize(128, 128); + this.Shape3.mirror = true; + this.setRotation(this.Shape3, 0.0f, -0.7853982f, 0.0f); + (this.Shape3c = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.Shape3c.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3c.setTextureSize(128, 128); + this.Shape3c.mirror = true; + this.setRotation(this.Shape3c, 0.0f, 0.7853982f, 0.7853982f); + (this.Shape3b = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.Shape3b.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3b.setTextureSize(128, 128); + this.Shape3b.mirror = true; + this.setRotation(this.Shape3b, 0.0f, -0.7853982f, 0.7853982f); + (this.Shape4a = new ModelRenderer((ModelBase)this, 22, 74)) + .addBox(0.0f, 0.0f, 0.0f, 2, 7, 5); + this.Shape4a.setRotationPoint(-1.0f, -23.0f, 4.0f); + this.Shape4a.setTextureSize(128, 128); + this.Shape4a.mirror = true; + this.setRotation(this.Shape4a, -0.5235988f, 0.0f, 0.0f); + (this.Shape4 = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, 0.0f, 5, 8, 2); + this.Shape4.setRotationPoint(4.0f, -23.0f, -1.0f); + this.Shape4.setTextureSize(128, 128); + this.Shape4.mirror = true; + this.setRotation(this.Shape4, 0.0f, 0.0f, 0.5235988f); + (this.Shape4b = new ModelRenderer((ModelBase)this, 0, 81)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.Shape4b.setRotationPoint(0.0f, -35.0f, -4.0f); + this.Shape4b.setTextureSize(128, 128); + this.Shape4b.mirror = true; + this.setRotation(this.Shape4b, -0.5235988f, 3.141593f, 0.0f); + (this.Shape4c = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, -1.0f, 5, 8, 2); + this.Shape4c.setRotationPoint(-4.0f, -23.0f, 0.0f); + this.Shape4c.setTextureSize(128, 128); + this.Shape4c.mirror = true; + this.setRotation(this.Shape4c, 0.0f, 3.141593f, 0.5235988f); + (this.Shape5 = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.Shape5.setRotationPoint(0.0f, -32.0f, 0.0f); + this.Shape5.setTextureSize(128, 128); + this.Shape5.mirror = true; + this.setRotation(this.Shape5, 0.0f, 0.0f, 0.0f); + (this.Shape5a = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.Shape5a.setRotationPoint(0.0f, -32.0f, 0.0f); + this.Shape5a.setTextureSize(128, 128); + this.Shape5a.mirror = true; + this.setRotation(this.Shape5a, 0.0f, 1.570796f, 0.0f); + (this.Shape4g = new ModelRenderer((ModelBase)this, 22, 74)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 8, 5); + this.Shape4g.setRotationPoint(0.0f, -23.0f, -4.0f); + this.Shape4g.setTextureSize(128, 128); + this.Shape4g.mirror = true; + this.setRotation(this.Shape4g, -0.5235988f, 3.141593f, 0.0f); + (this.Shape4e = new ModelRenderer((ModelBase)this, 0, 81)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.Shape4e.setRotationPoint(0.0f, -35.0f, 4.0f); + this.Shape4e.setTextureSize(128, 128); + this.Shape4e.mirror = true; + this.setRotation(this.Shape4e, -0.5235988f, 0.0f, 0.0f); + (this.Shape4f = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(0.0f, 0.0f, -1.0f, 5, 4, 2); + this.Shape4f.setRotationPoint(-4.0f, -35.0f, 0.0f); + this.Shape4f.setTextureSize(128, 128); + this.Shape4f.mirror = true; + this.setRotation(this.Shape4f, 0.0f, 3.141593f, 0.5235988f); + (this.Shape4h = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(0.0f, 0.0f, 0.0f, 5, 4, 2); + this.Shape4h.setRotationPoint(4.0f, -35.0f, -1.0f); + this.Shape4h.setTextureSize(128, 128); + this.Shape4h.mirror = true; + this.setRotation(this.Shape4h, 0.0f, 0.0f, 0.5235988f); + (this.Shape6a = new ModelRenderer((ModelBase)this, 72, 16)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.Shape6a.setRotationPoint(-5.0f, -37.0f, -5.0f); + this.Shape6a.setTextureSize(128, 128); + this.Shape6a.mirror = true; + this.setRotation(this.Shape6a, 0.0f, 0.0f, 0.0f); + (this.Shape6 = new ModelRenderer((ModelBase)this, 72, 16)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.Shape6.setRotationPoint(-5.0f, -41.0f, -5.0f); + this.Shape6.setTextureSize(128, 128); + this.Shape6.mirror = true; + this.setRotation(this.Shape6, 0.0f, 0.0f, 0.0f); + (this.Shape7 = new ModelRenderer((ModelBase)this, 61, 31)) + .addBox(0.0f, 0.0f, 0.0f, 8, 4, 8); + this.Shape7.setRotationPoint(-4.0f, -45.0f, -4.0f); + this.Shape7.setTextureSize(128, 128); + this.Shape7.mirror = true; + this.setRotation(this.Shape7, 0.0f, 0.0f, 0.0f); + (this.Shape7a = new ModelRenderer((ModelBase)this, 61, 47)) + .addBox(0.0f, 0.0f, 0.0f, 6, 4, 6); + this.Shape7a.setRotationPoint(-3.0f, -49.0f, -3.0f); + this.Shape7a.setTextureSize(128, 128); + this.Shape7a.mirror = true; + this.setRotation(this.Shape7a, 0.0f, 0.0f, 0.0f); + (this.Shape7b = new ModelRenderer((ModelBase)this, 61, 61)) + .addBox(0.0f, 0.0f, 0.0f, 4, 4, 4); + this.Shape7b.setRotationPoint(-2.0f, -53.0f, -2.0f); + this.Shape7b.setTextureSize(128, 128); + this.Shape7b.mirror = true; + this.setRotation(this.Shape7b, 0.0f, 0.0f, 0.0f); + (this.Shape8 = new ModelRenderer((ModelBase)this, 95, 31)) + .addBox(-1.0f, -1.0f, -6.0f, 2, 2, 12); + this.Shape8.setRotationPoint(0.0f, -43.0f, 0.0f); + this.Shape8.setTextureSize(128, 128); + this.Shape8.mirror = true; + this.setRotation(this.Shape8, 0.0f, 0.0f, 0.0f); + (this.Shape8a = new ModelRenderer((ModelBase)this, 95, 31)) + .addBox(-1.0f, -1.0f, -6.0f, 2, 2, 12); + this.Shape8a.setRotationPoint(0.0f, -43.0f, 0.0f); + this.Shape8a.setTextureSize(128, 128); + this.Shape8a.mirror = true; + this.setRotation(this.Shape8a, 0.0f, 1.570796f, 0.0f); + (this.Shape8b = new ModelRenderer((ModelBase)this, 87, 47)) + .addBox(-1.0f, -1.0f, -5.0f, 2, 2, 10); + this.Shape8b.setRotationPoint(0.0f, -47.0f, 0.0f); + this.Shape8b.setTextureSize(128, 128); + this.Shape8b.mirror = true; + this.setRotation(this.Shape8b, 0.0f, 0.0f, 0.0f); + (this.Shape8c = new ModelRenderer((ModelBase)this, 87, 47)) + .addBox(-1.0f, -1.0f, -5.0f, 2, 2, 10); + this.Shape8c.setRotationPoint(0.0f, -47.0f, 0.0f); + this.Shape8c.setTextureSize(128, 128); + this.Shape8c.mirror = true; + this.setRotation(this.Shape8c, 0.0f, 1.570796f, 0.0f); + (this.Shape8d = new ModelRenderer((ModelBase)this, 79, 61)) + .addBox(-1.0f, -1.0f, -4.0f, 2, 2, 8); + this.Shape8d.setRotationPoint(0.0f, -51.0f, 0.0f); + this.Shape8d.setTextureSize(128, 128); + this.Shape8d.mirror = true; + this.setRotation(this.Shape8d, 0.0f, 0.0f, 0.0f); + (this.Shape8e = new ModelRenderer((ModelBase)this, 79, 61)) + .addBox(-1.0f, -1.0f, -4.0f, 2, 2, 8); + this.Shape8e.setRotationPoint(0.0f, -51.0f, 0.0f); + this.Shape8e.setTextureSize(128, 128); + this.Shape8e.mirror = true; + this.setRotation(this.Shape8e, 0.0f, 1.570796f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.Shape1.render(f5); + this.Shape2.render(f5); + this.Shape2a.render(f5); + this.Shape2b.render(f5); + this.Shape2c.render(f5); + this.Shape3a.render(f5); + this.Shape3.render(f5); + this.Shape3c.render(f5); + this.Shape3b.render(f5); + this.Shape4a.render(f5); + this.Shape4.render(f5); + this.Shape4b.render(f5); + this.Shape4c.render(f5); + this.Shape5.render(f5); + this.Shape5a.render(f5); + this.Shape4g.render(f5); + this.Shape4e.render(f5); + this.Shape4f.render(f5); + this.Shape4h.render(f5); + this.Shape6a.render(f5); + this.Shape6.render(f5); + this.Shape7.render(f5); + this.Shape7a.render(f5); + this.Shape7b.render(f5); + this.Shape8.render(f5); + this.Shape8a.render(f5); + this.Shape8b.render(f5); + this.Shape8c.render(f5); + this.Shape8d.render(f5); + this.Shape8e.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMHongSu.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMHongSu.java new file mode 100644 index 0000000..57ede59 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMHongSu.java @@ -0,0 +1,260 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMHongSu extends MICBM { + ModelRenderer Shape1; + ModelRenderer Shape1a; + ModelRenderer Shape2; + ModelRenderer Shape2a; + ModelRenderer Shape3; + ModelRenderer Shape4; + ModelRenderer Shape5; + ModelRenderer Shape6; + ModelRenderer Shape6a; + ModelRenderer Shape6b; + ModelRenderer Shape6c; + ModelRenderer Shape6d; + ModelRenderer Shape6e; + ModelRenderer Shape6f; + ModelRenderer Shape6g; + ModelRenderer Shape7; + ModelRenderer Shape8; + ModelRenderer Shape9; + ModelRenderer Shape10; + ModelRenderer Shape10a; + ModelRenderer Shape10b; + ModelRenderer Shape10c; + ModelRenderer Shape11d; + ModelRenderer Shape11e; + ModelRenderer Shape2z; + ModelRenderer Shape12; + ModelRenderer Shape13; + ModelRenderer Shape14; + + public MMHongSu() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape1 = new ModelRenderer((ModelBase)this, 27, 0)) + .addBox(0.0f, 0.0f, 0.0f, 8, 10, 14); + this.Shape1.setRotationPoint(-8.0f, 14.0f, -2.0f); + this.Shape1.setTextureSize(128, 128); + this.Shape1.mirror = true; + this.setRotation(this.Shape1, 0.0f, 0.7853982f, 0.0f); + (this.Shape1a = new ModelRenderer((ModelBase)this, 27, 0)) + .addBox(0.0f, 0.0f, 0.0f, 8, 10, 14); + this.Shape1a.setRotationPoint(2.0f, 14.0f, -8.0f); + this.Shape1a.setTextureSize(128, 128); + this.Shape1a.mirror = true; + this.setRotation(this.Shape1a, 0.0f, -0.7853982f, 0.0f); + (this.Shape2 = new ModelRenderer((ModelBase)this, 36, 47)) + .addBox(0.0f, 0.0f, 0.0f, 21, 11, 2); + this.Shape2.setRotationPoint(-8.0f, 13.0f, 7.0f); + this.Shape2.setTextureSize(128, 128); + this.Shape2.mirror = true; + this.setRotation(this.Shape2, 0.0f, 0.7853982f, 0.0f); + (this.Shape2a = new ModelRenderer((ModelBase)this, 36, 47)) + .addBox(0.0f, 0.0f, 0.0f, 21, 11, 2); + this.Shape2a.setRotationPoint(-7.0f, 13.0f, -8.0f); + this.Shape2a.setTextureSize(128, 128); + this.Shape2a.mirror = true; + this.setRotation(this.Shape2a, 0.0f, -0.7853982f, 0.0f); + (this.Shape3 = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 6, 40, 6); + this.Shape3.setRotationPoint(-3.0f, -26.0f, -3.0f); + this.Shape3.setTextureSize(128, 128); + this.Shape3.mirror = true; + this.setRotation(this.Shape3, 0.0f, 0.0f, 0.0f); + (this.Shape4 = new ModelRenderer((ModelBase)this, 27, 25)) + .addBox(0.0f, 0.0f, 0.0f, 10, 10, 10); + this.Shape4.setRotationPoint(-5.0f, 4.0f, -5.0f); + this.Shape4.setTextureSize(128, 128); + this.Shape4.mirror = true; + this.setRotation(this.Shape4, 0.0f, 0.0f, 0.0f); + (this.Shape5 = new ModelRenderer((ModelBase)this, 72, 31)) + .addBox(0.0f, 0.0f, 0.0f, 8, 4, 8); + this.Shape5.setRotationPoint(-4.0f, -30.0f, -4.0f); + this.Shape5.setTextureSize(128, 128); + this.Shape5.mirror = true; + this.setRotation(this.Shape5, 0.0f, 0.0f, 0.0f); + (this.Shape6 = new ModelRenderer((ModelBase)this, 89, 17)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.Shape6.setRotationPoint(-1.0f, -35.0f, 4.0f); + this.Shape6.setTextureSize(128, 128); + this.Shape6.mirror = true; + this.setRotation(this.Shape6, 0.0f, 0.0f, 0.0f); + (this.Shape6a = new ModelRenderer((ModelBase)this, 89, 17)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.Shape6a.setRotationPoint(4.0f, -35.0f, -1.0f); + this.Shape6a.setTextureSize(128, 128); + this.Shape6a.mirror = true; + this.setRotation(this.Shape6a, 0.0f, 0.0f, 0.0f); + (this.Shape6b = new ModelRenderer((ModelBase)this, 89, 17)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.Shape6b.setRotationPoint(-6.0f, -35.0f, -1.0f); + this.Shape6b.setTextureSize(128, 128); + this.Shape6b.mirror = true; + this.setRotation(this.Shape6b, 0.0f, 0.0f, 0.0f); + (this.Shape6c = new ModelRenderer((ModelBase)this, 89, 17)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.Shape6c.setRotationPoint(-1.0f, -35.0f, -6.0f); + this.Shape6c.setTextureSize(128, 128); + this.Shape6c.mirror = true; + this.setRotation(this.Shape6c, 0.0f, 0.0f, 0.0f); + (this.Shape6d = new ModelRenderer((ModelBase)this, 103, 8)) + .addBox(0.0f, 0.0f, 0.0f, 1, 6, 2); + this.Shape6d.setRotationPoint(-2.0f, -39.0f, -1.0f); + this.Shape6d.setTextureSize(128, 128); + this.Shape6d.mirror = true; + this.setRotation(this.Shape6d, 0.0f, 0.0f, 0.6108652f); + (this.Shape6e = new ModelRenderer((ModelBase)this, 103, 8)) + .addBox(0.0f, 0.0f, 0.0f, 1, 6, 2); + this.Shape6e.setRotationPoint(1.0f, -39.0f, -1.0f); + this.Shape6e.setTextureSize(128, 128); + this.Shape6e.mirror = true; + this.setRotation(this.Shape6e, 0.0f, 0.0f, -0.6108652f); + (this.Shape6f = new ModelRenderer((ModelBase)this, 96, 8)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 1); + this.Shape6f.setRotationPoint(-1.0f, -39.0f, -2.0f); + this.Shape6f.setTextureSize(128, 128); + this.Shape6f.mirror = true; + this.setRotation(this.Shape6f, -0.6108652f, 0.0f, 0.0f); + (this.Shape6g = new ModelRenderer((ModelBase)this, 96, 8)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 1); + this.Shape6g.setRotationPoint(-1.0f, -39.0f, 1.0f); + this.Shape6g.setTextureSize(128, 128); + this.Shape6g.mirror = true; + this.setRotation(this.Shape6g, 0.6108652f, 0.0f, 0.0f); + (this.Shape7 = new ModelRenderer((ModelBase)this, 110, 0)) + .addBox(0.0f, 0.0f, 0.0f, 4, 2, 4); + this.Shape7.setRotationPoint(-2.0f, -40.0f, -2.0f); + this.Shape7.setTextureSize(128, 128); + this.Shape7.mirror = true; + this.setRotation(this.Shape7, 0.0f, 0.0f, 0.0f); + (this.Shape8 = new ModelRenderer((ModelBase)this, 84, 46)) + .addBox(0.0f, 0.0f, 0.0f, 10, 5, 10); + this.Shape8.setRotationPoint(-5.0f, -34.0f, -5.0f); + this.Shape8.setTextureSize(128, 128); + this.Shape8.mirror = true; + this.setRotation(this.Shape8, 0.0f, 0.0f, 0.0f); + (this.Shape9 = new ModelRenderer((ModelBase)this, 110, 8)) + .addBox(0.0f, 0.0f, 0.0f, 2, 8, 2); + this.Shape9.setRotationPoint(-1.0f, -42.0f, -1.0f); + this.Shape9.setTextureSize(128, 128); + this.Shape9.mirror = true; + this.setRotation(this.Shape9, 0.0f, 0.0f, 0.0f); + (this.Shape10 = new ModelRenderer((ModelBase)this, 72, 8)) + .addBox(0.0f, 0.0f, 0.0f, 6, 6, 2); + this.Shape10.setRotationPoint(8.0f, -23.0f, 1.0f); + this.Shape10.setTextureSize(128, 128); + this.Shape10.mirror = false; + this.setRotation(this.Shape10, 0.0f, -3.141593f, -0.7853982f); + (this.Shape10a = new ModelRenderer((ModelBase)this, 72, 17)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 6); + this.Shape10a.setRotationPoint(-1.0f, -23.0f, -8.0f); + this.Shape10a.setTextureSize(128, 128); + this.Shape10a.mirror = false; + this.setRotation(this.Shape10a, 0.7853982f, 0.0f, 0.0f); + (this.Shape10b = new ModelRenderer((ModelBase)this, 72, 8)) + .addBox(0.0f, 0.0f, 0.0f, 6, 6, 2); + this.Shape10b.setRotationPoint(-8.0f, -23.0f, -1.0f); + this.Shape10b.setTextureSize(128, 128); + this.Shape10b.mirror = false; + this.setRotation(this.Shape10b, 0.0f, 0.0f, -0.7853982f); + (this.Shape10c = new ModelRenderer((ModelBase)this, 72, 8)) + .addBox(0.0f, 0.0f, 0.0f, 6, 6, 2); + this.Shape10c.setRotationPoint(-1.0f, -23.0f, 8.0f); + this.Shape10c.setTextureSize(128, 128); + this.Shape10c.mirror = false; + this.setRotation(this.Shape10c, 0.0f, 1.570796f, -0.7853982f); + (this.Shape11d = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(0.0f, 0.0f, 0.0f, 16, 5, 2); + this.Shape11d.setRotationPoint(-8.0f, -23.0f, -1.0f); + this.Shape11d.setTextureSize(128, 128); + this.Shape11d.mirror = true; + this.setRotation(this.Shape11d, 0.0f, 0.0f, 0.0f); + (this.Shape11e = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(0.0f, 0.0f, 0.0f, 16, 5, 2); + this.Shape11e.setRotationPoint(-1.0f, -23.0f, 8.0f); + this.Shape11e.setTextureSize(128, 128); + this.Shape11e.mirror = true; + this.setRotation(this.Shape11e, 0.0f, 1.570796f, 0.0f); + (this.Shape2z = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, 0.0f, 16, 10, 4); + this.Shape2z.setRotationPoint(-8.0f, 14.0f, -2.0f); + this.Shape2z.setTextureSize(128, 128); + this.Shape2z.mirror = true; + this.setRotation(this.Shape2z, 0.0f, 0.0f, 0.0f); + (this.Shape12 = new ModelRenderer((ModelBase)this, 0, 76)) + .addBox(0.0f, 0.0f, 0.0f, 4, 10, 16); + this.Shape12.setRotationPoint(-2.0f, 14.0f, -8.0f); + this.Shape12.setTextureSize(128, 128); + this.Shape12.mirror = true; + this.setRotation(this.Shape12, 0.0f, 0.0f, 0.0f); + (this.Shape13 = new ModelRenderer((ModelBase)this, 0, 47)) + .addBox(0.0f, 0.0f, 0.0f, 3, 14, 14); + this.Shape13.setRotationPoint(6.0f, 13.0f, -8.0f); + this.Shape13.setTextureSize(128, 128); + this.Shape13.mirror = true; + this.setRotation(this.Shape13, 0.7853982f, -0.7853982f, 0.0f); + (this.Shape14 = new ModelRenderer((ModelBase)this, 0, 47)) + .addBox(0.0f, 0.0f, 0.0f, 3, 14, 14); + this.Shape14.setRotationPoint(8.0f, 13.0f, 6.0f); + this.Shape14.setTextureSize(128, 128); + this.Shape14.mirror = true; + this.setRotation(this.Shape14, 0.7853982f, -2.356194f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.Shape1.render(f5); + this.Shape1a.render(f5); + this.Shape2.render(f5); + this.Shape2a.render(f5); + this.Shape3.render(f5); + this.Shape4.render(f5); + this.Shape5.render(f5); + this.Shape6.render(f5); + this.Shape6a.render(f5); + this.Shape6b.render(f5); + this.Shape6c.render(f5); + this.Shape6d.render(f5); + this.Shape6e.render(f5); + this.Shape6f.render(f5); + this.Shape6g.render(f5); + this.Shape7.render(f5); + this.Shape8.render(f5); + this.Shape9.render(f5); + this.Shape10.render(f5); + this.Shape10a.render(f5); + this.Shape10b.render(f5); + this.Shape10c.render(f5); + this.Shape11d.render(f5); + this.Shape11e.render(f5); + this.Shape2z.render(f5); + this.Shape12.render(f5); + this.Shape13.render(f5); + this.Shape14.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMHuanYuan.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMHuanYuan.java new file mode 100644 index 0000000..95c2016 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMHuanYuan.java @@ -0,0 +1,284 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMHuanYuan extends MICBM { + ModelRenderer MAIN_MODULE; + ModelRenderer WING_B1; + ModelRenderer WING_B2; + ModelRenderer WING_B3; + ModelRenderer WING_B4; + ModelRenderer WING_BA1; + ModelRenderer WING_BB1; + ModelRenderer WING_BA2; + ModelRenderer WING_BB2; + ModelRenderer WING_TA1; + ModelRenderer WING_TB1; + ModelRenderer WING_TC3; + ModelRenderer WING_TD1; + ModelRenderer WING_TAC2; + ModelRenderer WING_TBD2; + ModelRenderer WING_TC1; + ModelRenderer WING_TA3; + ModelRenderer WING_TD3; + ModelRenderer WING_TB3; + ModelRenderer T_SUPPORT_1; + ModelRenderer T_SUPPORT_2; + ModelRenderer WARHEAD_SUPPORT_A1; + ModelRenderer WARHEAD_SUPPORT_B1; + ModelRenderer WARHEAD_SUPPORT_C1; + ModelRenderer WRHEAD_SUPPORT_D1; + ModelRenderer WARHEAD_SUPPORT_A2; + ModelRenderer WARHEAD_SUPPORT_C2; + ModelRenderer WARHEAD_SUPPORT_D2; + ModelRenderer WARHEAD_SUPPORT_B2; + ModelRenderer Shape8; + ModelRenderer Shape9; + + public MMHuanYuan() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.MAIN_MODULE = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-4.0f, 0.0f, -4.0f, 8, 64, 8); + this.MAIN_MODULE.setRotationPoint(0.0f, -40.0f, 0.0f); + this.MAIN_MODULE.setTextureSize(128, 128); + this.MAIN_MODULE.mirror = true; + this.setRotation(this.MAIN_MODULE, 0.0f, 0.0f, 0.0f); + (this.WING_B1 = new ModelRenderer((ModelBase)this, 34, 19)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.WING_B1.setRotationPoint(-7.0f, 14.0f, 6.0f); + this.WING_B1.setTextureSize(128, 128); + this.WING_B1.mirror = true; + this.setRotation(this.WING_B1, 0.0f, 0.0f, 0.0f); + (this.WING_B2 = new ModelRenderer((ModelBase)this, 34, 19)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.WING_B2.setRotationPoint(-7.0f, 14.0f, -7.0f); + this.WING_B2.setTextureSize(128, 128); + this.WING_B2.mirror = true; + this.setRotation(this.WING_B2, 0.0f, 0.0f, 0.0f); + (this.WING_B3 = new ModelRenderer((ModelBase)this, 34, 31)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.WING_B3.setRotationPoint(-7.0f, 14.0f, -6.0f); + this.WING_B3.setTextureSize(128, 128); + this.WING_B3.mirror = true; + this.setRotation(this.WING_B3, 0.0f, 0.0f, 0.0f); + (this.WING_B4 = new ModelRenderer((ModelBase)this, 34, 31)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.WING_B4.setRotationPoint(6.0f, 14.0f, -6.0f); + this.WING_B4.setTextureSize(128, 128); + this.WING_B4.mirror = true; + this.setRotation(this.WING_B4, 0.0f, 0.0f, 0.0f); + (this.WING_BA1 = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.WING_BA1.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_BA1.setTextureSize(128, 128); + this.WING_BA1.mirror = true; + this.setRotation(this.WING_BA1, 0.0f, 0.7853982f, 0.0f); + (this.WING_BB1 = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.WING_BB1.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_BB1.setTextureSize(128, 128); + this.WING_BB1.mirror = true; + this.setRotation(this.WING_BB1, 0.0f, -0.7853982f, 0.0f); + (this.WING_BA2 = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.WING_BA2.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_BA2.setTextureSize(128, 128); + this.WING_BA2.mirror = true; + this.setRotation(this.WING_BA2, 0.0f, 0.7853982f, 0.7853982f); + (this.WING_BB2 = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.WING_BB2.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_BB2.setTextureSize(128, 128); + this.WING_BB2.mirror = true; + this.setRotation(this.WING_BB2, 0.0f, -0.7853982f, 0.7853982f); + (this.WING_TA1 = new ModelRenderer((ModelBase)this, 22, 74)) + .addBox(0.0f, 0.0f, 0.0f, 2, 7, 5); + this.WING_TA1.setRotationPoint(-1.0f, -23.0f, 4.0f); + this.WING_TA1.setTextureSize(128, 128); + this.WING_TA1.mirror = true; + this.setRotation(this.WING_TA1, -0.5235988f, 0.0f, 0.0f); + (this.WING_TB1 = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, 0.0f, 5, 8, 2); + this.WING_TB1.setRotationPoint(4.0f, -23.0f, -1.0f); + this.WING_TB1.setTextureSize(128, 128); + this.WING_TB1.mirror = true; + this.setRotation(this.WING_TB1, 0.0f, 0.0f, 0.5235988f); + (this.WING_TC3 = new ModelRenderer((ModelBase)this, 0, 81)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.WING_TC3.setRotationPoint(0.0f, -35.0f, -4.0f); + this.WING_TC3.setTextureSize(128, 128); + this.WING_TC3.mirror = true; + this.setRotation(this.WING_TC3, -0.5235988f, 3.141593f, 0.0f); + (this.WING_TD1 = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, -1.0f, 5, 8, 2); + this.WING_TD1.setRotationPoint(-4.0f, -23.0f, 0.0f); + this.WING_TD1.setTextureSize(128, 128); + this.WING_TD1.mirror = true; + this.setRotation(this.WING_TD1, 0.0f, 3.141593f, 0.5235988f); + (this.WING_TAC2 = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.WING_TAC2.setRotationPoint(0.0f, -32.0f, 0.0f); + this.WING_TAC2.setTextureSize(128, 128); + this.WING_TAC2.mirror = true; + this.setRotation(this.WING_TAC2, 0.0f, 0.0f, 0.0f); + (this.WING_TBD2 = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.WING_TBD2.setRotationPoint(0.0f, -32.0f, 0.0f); + this.WING_TBD2.setTextureSize(128, 128); + this.WING_TBD2.mirror = true; + this.setRotation(this.WING_TBD2, 0.0f, 1.570796f, 0.0f); + (this.WING_TC1 = new ModelRenderer((ModelBase)this, 22, 74)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 8, 5); + this.WING_TC1.setRotationPoint(0.0f, -23.0f, -4.0f); + this.WING_TC1.setTextureSize(128, 128); + this.WING_TC1.mirror = true; + this.setRotation(this.WING_TC1, -0.5235988f, 3.141593f, 0.0f); + (this.WING_TA3 = new ModelRenderer((ModelBase)this, 0, 81)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.WING_TA3.setRotationPoint(0.0f, -35.0f, 4.0f); + this.WING_TA3.setTextureSize(128, 128); + this.WING_TA3.mirror = true; + this.setRotation(this.WING_TA3, -0.5235988f, 0.0f, 0.0f); + (this.WING_TD3 = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(0.0f, 0.0f, -1.0f, 5, 4, 2); + this.WING_TD3.setRotationPoint(-4.0f, -35.0f, 0.0f); + this.WING_TD3.setTextureSize(128, 128); + this.WING_TD3.mirror = true; + this.setRotation(this.WING_TD3, 0.0f, 3.141593f, 0.5235988f); + (this.WING_TB3 = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(0.0f, 0.0f, 0.0f, 5, 4, 2); + this.WING_TB3.setRotationPoint(4.0f, -35.0f, -1.0f); + this.WING_TB3.setTextureSize(128, 128); + this.WING_TB3.mirror = true; + this.setRotation(this.WING_TB3, 0.0f, 0.0f, 0.5235988f); + (this.T_SUPPORT_1 = new ModelRenderer((ModelBase)this, 72, 16)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.T_SUPPORT_1.setRotationPoint(-5.0f, -37.0f, -5.0f); + this.T_SUPPORT_1.setTextureSize(128, 128); + this.T_SUPPORT_1.mirror = true; + this.setRotation(this.T_SUPPORT_1, 0.0f, 0.0f, 0.0f); + (this.T_SUPPORT_2 = new ModelRenderer((ModelBase)this, 72, 16)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.T_SUPPORT_2.setRotationPoint(-5.0f, -41.0f, -5.0f); + this.T_SUPPORT_2.setTextureSize(128, 128); + this.T_SUPPORT_2.mirror = true; + this.setRotation(this.T_SUPPORT_2, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_SUPPORT_A1 = new ModelRenderer((ModelBase)this, 90, 38)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.WARHEAD_SUPPORT_A1.setRotationPoint(-5.0f, -47.0f, -1.0f); + this.WARHEAD_SUPPORT_A1.setTextureSize(128, 128); + this.WARHEAD_SUPPORT_A1.mirror = true; + this.setRotation(this.WARHEAD_SUPPORT_A1, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_SUPPORT_B1 = new ModelRenderer((ModelBase)this, 90, 38)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.WARHEAD_SUPPORT_B1.setRotationPoint(-1.0f, -47.0f, 3.0f); + this.WARHEAD_SUPPORT_B1.setTextureSize(128, 128); + this.WARHEAD_SUPPORT_B1.mirror = true; + this.setRotation(this.WARHEAD_SUPPORT_B1, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_SUPPORT_C1 = new ModelRenderer((ModelBase)this, 90, 38)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.WARHEAD_SUPPORT_C1.setRotationPoint(3.0f, -47.0f, -1.0f); + this.WARHEAD_SUPPORT_C1.setTextureSize(128, 128); + this.WARHEAD_SUPPORT_C1.mirror = true; + this.setRotation(this.WARHEAD_SUPPORT_C1, 0.0f, 0.0f, 0.0f); + (this.WRHEAD_SUPPORT_D1 = new ModelRenderer((ModelBase)this, 90, 38)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.WRHEAD_SUPPORT_D1.setRotationPoint(-1.0f, -47.0f, -5.0f); + this.WRHEAD_SUPPORT_D1.setTextureSize(128, 128); + this.WRHEAD_SUPPORT_D1.mirror = true; + this.setRotation(this.WRHEAD_SUPPORT_D1, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_SUPPORT_A2 = new ModelRenderer((ModelBase)this, 90, 38)) + .addBox(0.0f, -6.0f, 0.0f, 2, 6, 2); + this.WARHEAD_SUPPORT_A2.setRotationPoint(-5.0f, -47.0f, -1.0f); + this.WARHEAD_SUPPORT_A2.setTextureSize(128, 128); + this.WARHEAD_SUPPORT_A2.mirror = true; + this.setRotation(this.WARHEAD_SUPPORT_A2, 0.0f, 0.0f, 0.5235988f); + (this.WARHEAD_SUPPORT_C2 = new ModelRenderer((ModelBase)this, 90, 38)) + .addBox(-2.0f, -6.0f, 0.0f, 2, 6, 2); + this.WARHEAD_SUPPORT_C2.setRotationPoint(5.0f, -47.0f, -1.0f); + this.WARHEAD_SUPPORT_C2.setTextureSize(128, 128); + this.WARHEAD_SUPPORT_C2.mirror = true; + this.setRotation(this.WARHEAD_SUPPORT_C2, 0.0f, 0.0f, -0.5235988f); + (this.WARHEAD_SUPPORT_D2 = new ModelRenderer((ModelBase)this, 90, 38)) + .addBox(0.0f, -6.0f, 0.0f, 2, 6, 2); + this.WARHEAD_SUPPORT_D2.setRotationPoint(-1.0f, -47.0f, -5.0f); + this.WARHEAD_SUPPORT_D2.setTextureSize(128, 128); + this.WARHEAD_SUPPORT_D2.mirror = true; + this.setRotation(this.WARHEAD_SUPPORT_D2, -0.5235988f, 0.0f, 0.0f); + (this.WARHEAD_SUPPORT_B2 = new ModelRenderer((ModelBase)this, 90, 38)) + .addBox(0.0f, -6.0f, -2.0f, 2, 6, 2); + this.WARHEAD_SUPPORT_B2.setRotationPoint(-1.0f, -47.0f, 5.0f); + this.WARHEAD_SUPPORT_B2.setTextureSize(128, 128); + this.WARHEAD_SUPPORT_B2.mirror = true; + this.setRotation(this.WARHEAD_SUPPORT_B2, 0.5235988f, 0.0f, 0.0f); + (this.Shape8 = new ModelRenderer((ModelBase)this, 72, 32)) + .addBox(-2.0f, 0.0f, -2.0f, 4, 4, 4); + this.Shape8.setRotationPoint(0.0f, -45.0f, 0.0f); + this.Shape8.setTextureSize(128, 128); + this.Shape8.mirror = true; + this.setRotation(this.Shape8, 0.0f, 0.0f, 0.0f); + (this.Shape9 = new ModelRenderer((ModelBase)this, 90, 32)) + .addBox(-1.0f, 0.0f, -1.0f, 2, 2, 2); + this.Shape9.setRotationPoint(0.0f, -48.0f, 0.0f); + this.Shape9.setTextureSize(128, 128); + this.Shape9.mirror = true; + this.setRotation(this.Shape9, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.MAIN_MODULE.render(f5); + this.WING_B1.render(f5); + this.WING_B2.render(f5); + this.WING_B3.render(f5); + this.WING_B4.render(f5); + this.WING_BA1.render(f5); + this.WING_BB1.render(f5); + this.WING_BA2.render(f5); + this.WING_BB2.render(f5); + this.WING_TA1.render(f5); + this.WING_TB1.render(f5); + this.WING_TC3.render(f5); + this.WING_TD1.render(f5); + this.WING_TAC2.render(f5); + this.WING_TBD2.render(f5); + this.WING_TC1.render(f5); + this.WING_TA3.render(f5); + this.WING_TD3.render(f5); + this.WING_TB3.render(f5); + this.T_SUPPORT_1.render(f5); + this.T_SUPPORT_2.render(f5); + this.WARHEAD_SUPPORT_A1.render(f5); + this.WARHEAD_SUPPORT_B1.render(f5); + this.WARHEAD_SUPPORT_C1.render(f5); + this.WRHEAD_SUPPORT_D1.render(f5); + this.WARHEAD_SUPPORT_A2.render(f5); + this.WARHEAD_SUPPORT_C2.render(f5); + this.WARHEAD_SUPPORT_D2.render(f5); + this.WARHEAD_SUPPORT_B2.render(f5); + this.Shape8.render(f5); + this.Shape9.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMHuo.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMHuo.java new file mode 100644 index 0000000..518c0fe --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMHuo.java @@ -0,0 +1,164 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMHuo extends MICBM { + ModelRenderer MAIN_MISSILE_MODULE; + ModelRenderer PROPULSOR_MODULE; + ModelRenderer WING_B_A_1; + ModelRenderer WING_B_B_1; + ModelRenderer WING_T_A_1; + ModelRenderer WING_T_B_1; + ModelRenderer WING_T_A_2; + ModelRenderer WING_T_B_2; + ModelRenderer WING_B_B_2; + ModelRenderer WING_B_A_2; + ModelRenderer WARHEAD_1; + ModelRenderer WARHEAD_2; + ModelRenderer WARHEAD_3; + ModelRenderer WARHEAD_4; + ModelRenderer WARHEAD_5; + ModelRenderer WARHEAD_6; + + public MMHuo() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.MAIN_MISSILE_MODULE = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 6, 50, 6); + this.MAIN_MISSILE_MODULE.setRotationPoint(-3.0f, -26.0f, -3.0f); + this.MAIN_MISSILE_MODULE.setTextureSize(128, 128); + this.MAIN_MISSILE_MODULE.mirror = true; + this.setRotation(this.MAIN_MISSILE_MODULE, 0.0f, 0.0f, 0.0f); + (this.PROPULSOR_MODULE = new ModelRenderer((ModelBase)this, 0, 57)) + .addBox(-5.0f, 0.0f, -5.0f, 10, 16, 10); + this.PROPULSOR_MODULE.setRotationPoint(0.0f, 8.0f, 0.0f); + this.PROPULSOR_MODULE.setTextureSize(128, 128); + this.PROPULSOR_MODULE.mirror = true; + this.setRotation(this.PROPULSOR_MODULE, 0.0f, 0.7853982f, 0.0f); + (this.WING_B_A_1 = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.WING_B_A_1.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_B_A_1.setTextureSize(128, 128); + this.WING_B_A_1.mirror = true; + this.setRotation(this.WING_B_A_1, 0.0f, 0.7853982f, 0.0f); + (this.WING_B_B_1 = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.WING_B_B_1.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_B_B_1.setTextureSize(128, 128); + this.WING_B_B_1.mirror = true; + this.setRotation(this.WING_B_B_1, 0.0f, -0.7853982f, 0.0f); + (this.WING_T_A_1 = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.WING_T_A_1.setRotationPoint(0.0f, -24.0f, 0.0f); + this.WING_T_A_1.setTextureSize(128, 128); + this.WING_T_A_1.mirror = true; + this.setRotation(this.WING_T_A_1, -0.7853982f, 0.7853982f, 0.0f); + (this.WING_T_B_1 = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.WING_T_B_1.setRotationPoint(0.0f, -24.0f, 0.0f); + this.WING_T_B_1.setTextureSize(128, 128); + this.WING_T_B_1.mirror = true; + this.setRotation(this.WING_T_B_1, -0.7853982f, -0.7853982f, 0.0f); + (this.WING_T_A_2 = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.WING_T_A_2.setRotationPoint(0.0f, -17.0f, 0.0f); + this.WING_T_A_2.setTextureSize(128, 128); + this.WING_T_A_2.mirror = true; + this.setRotation(this.WING_T_A_2, 0.0f, 0.7853982f, 0.0f); + (this.WING_T_B_2 = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.WING_T_B_2.setRotationPoint(0.0f, -17.0f, 0.0f); + this.WING_T_B_2.setTextureSize(128, 128); + this.WING_T_B_2.mirror = true; + this.setRotation(this.WING_T_B_2, 0.0f, -0.7853982f, 0.0f); + (this.WING_B_B_2 = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.WING_B_B_2.setRotationPoint(0.0f, 3.0f, 0.0f); + this.WING_B_B_2.setTextureSize(128, 128); + this.WING_B_B_2.mirror = true; + this.setRotation(this.WING_B_B_2, -0.7853982f, -0.7853982f, 0.0f); + (this.WING_B_A_2 = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.WING_B_A_2.setRotationPoint(0.0f, 3.0f, 0.0f); + this.WING_B_A_2.setTextureSize(128, 128); + this.WING_B_A_2.mirror = true; + this.setRotation(this.WING_B_A_2, -0.7853982f, 0.7853982f, 0.0f); + (this.WARHEAD_1 = new ModelRenderer((ModelBase)this, 0, 85)) + .addBox(0.0f, 0.0f, 0.0f, 6, 7, 6); + this.WARHEAD_1.setRotationPoint(-3.0f, -33.0f, -3.0f); + this.WARHEAD_1.setTextureSize(128, 128); + this.WARHEAD_1.mirror = true; + this.setRotation(this.WARHEAD_1, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_2 = new ModelRenderer((ModelBase)this, 26, 101)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.WARHEAD_2.setRotationPoint(-1.0f, -39.0f, -1.0f); + this.WARHEAD_2.setTextureSize(128, 128); + this.WARHEAD_2.mirror = true; + this.setRotation(this.WARHEAD_2, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_3 = new ModelRenderer((ModelBase)this, 26, 85)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 7, 7); + this.WARHEAD_3.setRotationPoint(0.0f, -39.0f, 0.0f); + this.WARHEAD_3.setTextureSize(128, 128); + this.WARHEAD_3.mirror = true; + this.setRotation(this.WARHEAD_3, -0.7853982f, 0.7853982f, 0.0f); + (this.WARHEAD_4 = new ModelRenderer((ModelBase)this, 26, 85)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 7, 7); + this.WARHEAD_4.setRotationPoint(0.0f, -39.0f, 0.0f); + this.WARHEAD_4.setTextureSize(128, 128); + this.WARHEAD_4.mirror = true; + this.setRotation(this.WARHEAD_4, -0.7853982f, -0.7853982f, 0.0f); + (this.WARHEAD_5 = new ModelRenderer((ModelBase)this, 0, 101)) + .addBox(-1.0f, 0.0f, -5.0f, 2, 7, 10); + this.WARHEAD_5.setRotationPoint(0.0f, -34.0f, 0.0f); + this.WARHEAD_5.setTextureSize(128, 128); + this.WARHEAD_5.mirror = true; + this.setRotation(this.WARHEAD_5, 0.0f, 0.7853982f, 0.0f); + (this.WARHEAD_6 = new ModelRenderer((ModelBase)this, 0, 101)) + .addBox(-1.0f, 0.0f, -5.0f, 2, 7, 10); + this.WARHEAD_6.setRotationPoint(0.0f, -34.0f, 0.0f); + this.WARHEAD_6.setTextureSize(128, 128); + this.WARHEAD_6.mirror = true; + this.setRotation(this.WARHEAD_6, 0.0f, -0.7853982f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.MAIN_MISSILE_MODULE.render(f5); + this.PROPULSOR_MODULE.render(f5); + this.WING_B_A_1.render(f5); + this.WING_B_B_1.render(f5); + this.WING_T_A_1.render(f5); + this.WING_T_B_1.render(f5); + this.WING_T_A_2.render(f5); + this.WING_T_B_2.render(f5); + this.WING_B_B_2.render(f5); + this.WING_B_A_2.render(f5); + this.WARHEAD_1.render(f5); + this.WARHEAD_2.render(f5); + this.WARHEAD_3.render(f5); + this.WARHEAD_4.render(f5); + this.WARHEAD_5.render(f5); + this.WARHEAD_6.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMLa.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMLa.java new file mode 100644 index 0000000..3fcfad4 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMLa.java @@ -0,0 +1,164 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMLa extends MICBM { + ModelRenderer a; + ModelRenderer b; + ModelRenderer c; + ModelRenderer d; + ModelRenderer e; + ModelRenderer f; + ModelRenderer g; + ModelRenderer h; + ModelRenderer i; + ModelRenderer j; + ModelRenderer k; + ModelRenderer l; + ModelRenderer m; + ModelRenderer n; + ModelRenderer o; + ModelRenderer p; + + public MMLa() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.a = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 6, 50, 6); + this.a.setRotationPoint(-3.0f, -26.0f, -3.0f); + this.a.setTextureSize(128, 128); + this.a.mirror = true; + this.setRotation(this.a, 0.0f, 0.0f, 0.0f); + (this.b = new ModelRenderer((ModelBase)this, 0, 57)) + .addBox(-5.0f, 0.0f, -5.0f, 10, 16, 10); + this.b.setRotationPoint(0.0f, 8.0f, 0.0f); + this.b.setTextureSize(128, 128); + this.b.mirror = true; + this.setRotation(this.b, 0.0f, 0.7853982f, 0.0f); + (this.c = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.c.setRotationPoint(0.0f, 12.0f, 0.0f); + this.c.setTextureSize(128, 128); + this.c.mirror = true; + this.setRotation(this.c, 0.0f, 0.7853982f, 0.0f); + (this.d = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.d.setRotationPoint(0.0f, 12.0f, 0.0f); + this.d.setTextureSize(128, 128); + this.d.mirror = true; + this.setRotation(this.d, 0.0f, -0.7853982f, 0.0f); + (this.e = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.e.setRotationPoint(0.0f, -24.0f, 0.0f); + this.e.setTextureSize(128, 128); + this.e.mirror = true; + this.setRotation(this.e, -0.7853982f, 0.7853982f, 0.0f); + (this.f = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.f.setRotationPoint(0.0f, -24.0f, 0.0f); + this.f.setTextureSize(128, 128); + this.f.mirror = true; + this.setRotation(this.f, -0.7853982f, -0.7853982f, 0.0f); + (this.g = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.g.setRotationPoint(0.0f, -17.0f, 0.0f); + this.g.setTextureSize(128, 128); + this.g.mirror = true; + this.setRotation(this.g, 0.0f, 0.7853982f, 0.0f); + (this.h = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.h.setRotationPoint(0.0f, -17.0f, 0.0f); + this.h.setTextureSize(128, 128); + this.h.mirror = true; + this.setRotation(this.h, 0.0f, -0.7853982f, 0.0f); + (this.i = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.i.setRotationPoint(0.0f, 3.0f, 0.0f); + this.i.setTextureSize(128, 128); + this.i.mirror = true; + this.setRotation(this.i, -0.7853982f, -0.7853982f, 0.0f); + (this.j = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.j.setRotationPoint(0.0f, 3.0f, 0.0f); + this.j.setTextureSize(128, 128); + this.j.mirror = true; + this.setRotation(this.j, -0.7853982f, 0.7853982f, 0.0f); + (this.k = new ModelRenderer((ModelBase)this, 0, 86)) + .addBox(2.0f, 0.0f, 2.0f, 2, 8, 2); + this.k.setRotationPoint(0.0f, -29.0f, 0.0f); + this.k.setTextureSize(128, 128); + this.k.mirror = true; + this.setRotation(this.k, 0.0f, 0.0f, 0.0f); + (this.l = new ModelRenderer((ModelBase)this, 0, 86)) + .addBox(2.0f, 0.0f, 2.0f, 2, 8, 2); + this.l.setRotationPoint(0.0f, -29.0f, 0.0f); + this.l.setTextureSize(128, 128); + this.l.mirror = true; + this.setRotation(this.l, 0.0f, 1.570796f, 0.0f); + (this.m = new ModelRenderer((ModelBase)this, 0, 86)) + .addBox(2.0f, 0.0f, 2.0f, 2, 8, 2); + this.m.setRotationPoint(0.0f, -29.0f, 0.0f); + this.m.setTextureSize(128, 128); + this.m.mirror = true; + this.setRotation(this.m, 0.0f, 3.141593f, 0.0f); + (this.n = new ModelRenderer((ModelBase)this, 0, 86)) + .addBox(2.0f, 0.0f, 2.0f, 2, 8, 2); + this.n.setRotationPoint(0.0f, -29.0f, 0.0f); + this.n.setTextureSize(128, 128); + this.n.mirror = true; + this.setRotation(this.n, 0.0f, -1.570796f, 0.0f); + (this.o = new ModelRenderer((ModelBase)this, 10, 86)) + .addBox(-2.0f, 0.0f, -2.0f, 4, 6, 4); + this.o.setRotationPoint(0.0f, -32.0f, 0.0f); + this.o.setTextureSize(128, 128); + this.o.mirror = true; + this.setRotation(this.o, 0.0f, 0.0f, 0.0f); + (this.p = new ModelRenderer((ModelBase)this, 28, 86)) + .addBox(-1.0f, 0.0f, -1.0f, 2, 6, 2); + this.p.setRotationPoint(0.0f, -38.0f, 0.0f); + this.p.setTextureSize(128, 128); + this.p.mirror = true; + this.setRotation(this.p, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float x, final float y, + final float z, final float f3, final float f4, + final float f5) { + super.render(entity, x, y, z, f3, f4, f5); + this.setRotationAngles(x, y, z, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.a.render(f5); + this.b.render(f5); + this.c.render(f5); + this.d.render(f5); + this.e.render(f5); + this.f.render(f5); + this.g.render(f5); + this.h.render(f5); + this.i.render(f5); + this.j.render(f5); + this.k.render(f5); + this.l.render(f5); + this.m.render(f5); + this.n.render(f5); + this.o.render(f5); + this.p.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMLiZi.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMLiZi.java new file mode 100644 index 0000000..3b094a3 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMLiZi.java @@ -0,0 +1,332 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMLiZi extends MICBM { + ModelRenderer A; + ModelRenderer B; + ModelRenderer C; + ModelRenderer D; + ModelRenderer E; + ModelRenderer F; + ModelRenderer G; + ModelRenderer H; + ModelRenderer I; + ModelRenderer J; + ModelRenderer K; + ModelRenderer L; + ModelRenderer M; + ModelRenderer N; + ModelRenderer O; + ModelRenderer P; + ModelRenderer Q; + ModelRenderer R; + ModelRenderer S; + ModelRenderer T; + ModelRenderer U; + ModelRenderer V; + ModelRenderer W; + ModelRenderer X; + ModelRenderer Y; + ModelRenderer Z; + ModelRenderer AA; + ModelRenderer AB; + ModelRenderer AC; + ModelRenderer AD; + ModelRenderer AE; + ModelRenderer AF; + ModelRenderer AG; + ModelRenderer AH; + ModelRenderer AI; + ModelRenderer AJ; + ModelRenderer AK; + + public MMLiZi() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.A = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-4.0f, 0.0f, -4.0f, 8, 64, 8); + this.A.setRotationPoint(0.0f, -40.0f, 0.0f); + this.A.setTextureSize(128, 128); + this.A.mirror = true; + this.setRotation(this.A, 0.0f, 0.0f, 0.0f); + (this.B = new ModelRenderer((ModelBase)this, 34, 19)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.B.setRotationPoint(-7.0f, 14.0f, 6.0f); + this.B.setTextureSize(128, 128); + this.B.mirror = true; + this.setRotation(this.B, 0.0f, 0.0f, 0.0f); + (this.C = new ModelRenderer((ModelBase)this, 34, 19)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.C.setRotationPoint(-7.0f, 14.0f, -7.0f); + this.C.setTextureSize(128, 128); + this.C.mirror = true; + this.setRotation(this.C, 0.0f, 0.0f, 0.0f); + (this.D = new ModelRenderer((ModelBase)this, 34, 31)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.D.setRotationPoint(-7.0f, 14.0f, -6.0f); + this.D.setTextureSize(128, 128); + this.D.mirror = true; + this.setRotation(this.D, 0.0f, 0.0f, 0.0f); + (this.E = new ModelRenderer((ModelBase)this, 34, 31)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.E.setRotationPoint(6.0f, 14.0f, -6.0f); + this.E.setTextureSize(128, 128); + this.E.mirror = true; + this.setRotation(this.E, 0.0f, 0.0f, 0.0f); + (this.F = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.F.setRotationPoint(0.0f, 12.0f, 0.0f); + this.F.setTextureSize(128, 128); + this.F.mirror = true; + this.setRotation(this.F, 0.0f, 0.7853982f, 0.0f); + (this.G = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.G.setRotationPoint(0.0f, 12.0f, 0.0f); + this.G.setTextureSize(128, 128); + this.G.mirror = true; + this.setRotation(this.G, 0.0f, -0.7853982f, 0.0f); + (this.H = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.H.setRotationPoint(0.0f, 12.0f, 0.0f); + this.H.setTextureSize(128, 128); + this.H.mirror = true; + this.setRotation(this.H, 0.0f, 0.7853982f, 0.7853982f); + (this.I = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.I.setRotationPoint(0.0f, 12.0f, 0.0f); + this.I.setTextureSize(128, 128); + this.I.mirror = true; + this.setRotation(this.I, 0.0f, -0.7853982f, 0.7853982f); + (this.J = new ModelRenderer((ModelBase)this, 22, 74)) + .addBox(0.0f, 0.0f, 0.0f, 2, 7, 5); + this.J.setRotationPoint(-1.0f, -23.0f, 4.0f); + this.J.setTextureSize(128, 128); + this.J.mirror = true; + this.setRotation(this.J, -0.5235988f, 0.0f, 0.0f); + (this.K = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, 0.0f, 5, 8, 2); + this.K.setRotationPoint(4.0f, -23.0f, -1.0f); + this.K.setTextureSize(128, 128); + this.K.mirror = true; + this.setRotation(this.K, 0.0f, 0.0f, 0.5235988f); + (this.L = new ModelRenderer((ModelBase)this, 0, 81)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.L.setRotationPoint(0.0f, -35.0f, -4.0f); + this.L.setTextureSize(128, 128); + this.L.mirror = true; + this.setRotation(this.L, -0.5235988f, 3.141593f, 0.0f); + (this.M = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, -1.0f, 5, 8, 2); + this.M.setRotationPoint(-4.0f, -23.0f, 0.0f); + this.M.setTextureSize(128, 128); + this.M.mirror = true; + this.setRotation(this.M, 0.0f, 3.141593f, 0.5235988f); + (this.N = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.N.setRotationPoint(0.0f, -32.0f, 0.0f); + this.N.setTextureSize(128, 128); + this.N.mirror = true; + this.setRotation(this.N, 0.0f, 0.0f, 0.0f); + (this.O = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.O.setRotationPoint(0.0f, -32.0f, 0.0f); + this.O.setTextureSize(128, 128); + this.O.mirror = true; + this.setRotation(this.O, 0.0f, 1.570796f, 0.0f); + (this.P = new ModelRenderer((ModelBase)this, 22, 74)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 8, 5); + this.P.setRotationPoint(0.0f, -23.0f, -4.0f); + this.P.setTextureSize(128, 128); + this.P.mirror = true; + this.setRotation(this.P, -0.5235988f, 3.141593f, 0.0f); + (this.Q = new ModelRenderer((ModelBase)this, 0, 81)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.Q.setRotationPoint(0.0f, -35.0f, 4.0f); + this.Q.setTextureSize(128, 128); + this.Q.mirror = true; + this.setRotation(this.Q, -0.5235988f, 0.0f, 0.0f); + (this.R = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(0.0f, 0.0f, -1.0f, 5, 4, 2); + this.R.setRotationPoint(-4.0f, -35.0f, 0.0f); + this.R.setTextureSize(128, 128); + this.R.mirror = true; + this.setRotation(this.R, 0.0f, 3.141593f, 0.5235988f); + (this.S = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(0.0f, 0.0f, 0.0f, 5, 4, 2); + this.S.setRotationPoint(4.0f, -35.0f, -1.0f); + this.S.setTextureSize(128, 128); + this.S.mirror = true; + this.setRotation(this.S, 0.0f, 0.0f, 0.5235988f); + (this.T = new ModelRenderer((ModelBase)this, 72, 16)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.T.setRotationPoint(-5.0f, -37.0f, -5.0f); + this.T.setTextureSize(128, 128); + this.T.mirror = true; + this.setRotation(this.T, 0.0f, 0.0f, 0.0f); + (this.U = new ModelRenderer((ModelBase)this, 72, 16)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.U.setRotationPoint(-5.0f, -41.0f, -5.0f); + this.U.setTextureSize(128, 128); + this.U.mirror = true; + this.setRotation(this.U, 0.0f, 0.0f, 0.0f); + (this.V = new ModelRenderer((ModelBase)this, 72, 113)) + .addBox(1.0f, 0.0f, -2.0f, 3, 6, 4); + this.V.setRotationPoint(0.0f, -47.0f, 0.0f); + this.V.setTextureSize(128, 128); + this.V.mirror = true; + this.setRotation(this.V, 0.0f, 0.0f, 0.0f); + (this.W = new ModelRenderer((ModelBase)this, 72, 113)) + .addBox(1.0f, 0.0f, -2.0f, 3, 6, 4); + this.W.setRotationPoint(0.0f, -47.0f, 0.0f); + this.W.setTextureSize(128, 128); + this.W.mirror = true; + this.setRotation(this.W, 0.0f, 2.094395f, 0.0f); + (this.X = new ModelRenderer((ModelBase)this, 72, 113)) + .addBox(1.0f, 0.0f, -2.0f, 3, 6, 4); + this.X.setRotationPoint(0.0f, -47.0f, 0.0f); + this.X.setTextureSize(128, 128); + this.X.mirror = true; + this.setRotation(this.X, 0.0f, 1.047198f, 0.0f); + (this.Y = new ModelRenderer((ModelBase)this, 72, 113)) + .addBox(1.0f, 0.0f, -2.0f, 3, 6, 4); + this.Y.setRotationPoint(0.0f, -47.0f, 0.0f); + this.Y.setTextureSize(128, 128); + this.Y.mirror = true; + this.setRotation(this.Y, 0.0f, 3.141593f, 0.0f); + (this.Z = new ModelRenderer((ModelBase)this, 72, 113)) + .addBox(1.0f, 0.0f, -2.0f, 3, 6, 4); + this.Z.setRotationPoint(0.0f, -47.0f, 0.0f); + this.Z.setTextureSize(128, 128); + this.Z.mirror = true; + this.setRotation(this.Z, 0.0f, -1.047198f, 0.0f); + (this.AA = new ModelRenderer((ModelBase)this, 72, 113)) + .addBox(1.0f, 0.0f, -2.0f, 3, 6, 4); + this.AA.setRotationPoint(0.0f, -47.0f, 0.0f); + this.AA.setTextureSize(128, 128); + this.AA.mirror = true; + this.setRotation(this.AA, 0.0f, -2.094395f, 0.0f); + (this.AB = new ModelRenderer((ModelBase)this, 72, 102)) + .addBox(-6.0f, 0.0f, -1.0f, 12, 6, 2); + this.AB.setRotationPoint(0.0f, -47.0f, 0.0f); + this.AB.setTextureSize(128, 128); + this.AB.mirror = true; + this.setRotation(this.AB, 0.0f, -2.094395f, 0.0f); + (this.AC = new ModelRenderer((ModelBase)this, 72, 102)) + .addBox(-6.0f, 0.0f, -1.0f, 12, 6, 2); + this.AC.setRotationPoint(0.0f, -47.0f, 0.0f); + this.AC.setTextureSize(128, 128); + this.AC.mirror = true; + this.setRotation(this.AC, 0.0f, 0.0f, 0.0f); + (this.AD = new ModelRenderer((ModelBase)this, 72, 102)) + .addBox(-6.0f, 0.0f, -1.0f, 12, 6, 2); + this.AD.setRotationPoint(0.0f, -47.0f, 0.0f); + this.AD.setTextureSize(128, 128); + this.AD.mirror = true; + this.setRotation(this.AD, 0.0f, -1.047198f, 0.0f); + (this.AE = new ModelRenderer((ModelBase)this, 89, 113)) + .addBox(-5.0f, 0.0f, -1.0f, 2, 6, 2); + this.AE.setRotationPoint(0.0f, -51.0f, 0.0f); + this.AE.setTextureSize(128, 128); + this.AE.mirror = true; + this.setRotation(this.AE, 0.0f, -2.094395f, 0.2617994f); + (this.AF = new ModelRenderer((ModelBase)this, 89, 113)) + .addBox(-5.0f, 0.0f, -1.0f, 2, 6, 2); + this.AF.setRotationPoint(0.0f, -51.0f, 0.0f); + this.AF.setTextureSize(128, 128); + this.AF.mirror = true; + this.setRotation(this.AF, 0.0f, 0.0f, 0.2617994f); + (this.AG = new ModelRenderer((ModelBase)this, 89, 113)) + .addBox(-5.0f, 0.0f, -1.0f, 2, 6, 2); + this.AG.setRotationPoint(0.0f, -51.0f, 0.0f); + this.AG.setTextureSize(128, 128); + this.AG.mirror = true; + this.setRotation(this.AG, 0.0f, -1.047198f, 0.2617994f); + (this.AH = new ModelRenderer((ModelBase)this, 89, 113)) + .addBox(-5.0f, 0.0f, -1.0f, 2, 6, 2); + this.AH.setRotationPoint(0.0f, -51.0f, 0.0f); + this.AH.setTextureSize(128, 128); + this.AH.mirror = true; + this.setRotation(this.AH, 0.0f, 1.047198f, 0.2617994f); + (this.AI = new ModelRenderer((ModelBase)this, 89, 113)) + .addBox(-5.0f, 0.0f, -1.0f, 2, 6, 2); + this.AI.setRotationPoint(0.0f, -51.0f, 0.0f); + this.AI.setTextureSize(128, 128); + this.AI.mirror = true; + this.setRotation(this.AI, 0.0f, 2.094395f, 0.2617994f); + (this.AJ = new ModelRenderer((ModelBase)this, 89, 113)) + .addBox(-5.0f, 0.0f, -1.0f, 2, 6, 2); + this.AJ.setRotationPoint(0.0f, -51.0f, 0.0f); + this.AJ.setTextureSize(128, 128); + this.AJ.mirror = true; + this.setRotation(this.AJ, 0.0f, 3.141593f, 0.2617994f); + (this.AK = new ModelRenderer((ModelBase)this, 51, 106)) + .addBox(-2.0f, 0.0f, -2.0f, 4, 11, 4); + this.AK.setRotationPoint(0.0f, -58.0f, 0.0f); + this.AK.setTextureSize(128, 128); + this.AK.mirror = true; + this.setRotation(this.AK, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.A.render(f5); + this.B.render(f5); + this.C.render(f5); + this.D.render(f5); + this.E.render(f5); + this.F.render(f5); + this.G.render(f5); + this.H.render(f5); + this.I.render(f5); + this.J.render(f5); + this.K.render(f5); + this.L.render(f5); + this.M.render(f5); + this.N.render(f5); + this.O.render(f5); + this.P.render(f5); + this.Q.render(f5); + this.R.render(f5); + this.S.render(f5); + this.T.render(f5); + this.U.render(f5); + this.V.render(f5); + this.W.render(f5); + this.X.render(f5); + this.Y.render(f5); + this.Z.render(f5); + this.AA.render(f5); + this.AB.render(f5); + this.AC.render(f5); + this.AD.render(f5); + this.AE.render(f5); + this.AF.render(f5); + this.AG.render(f5); + this.AH.render(f5); + this.AI.render(f5); + this.AJ.render(f5); + this.AK.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMPiaoFu.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMPiaoFu.java new file mode 100644 index 0000000..64c6d2b --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMPiaoFu.java @@ -0,0 +1,108 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMPiaoFu extends MICBM { + ModelRenderer Shape1; + ModelRenderer Shape2; + ModelRenderer Shape3; + ModelRenderer Shape4; + ModelRenderer Shape5; + ModelRenderer Shape6; + ModelRenderer Shape7; + ModelRenderer Shape8; + ModelRenderer Shape9; + + public MMPiaoFu() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape1 = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 6, 70, 6); + this.Shape1.setRotationPoint(-3.0f, -46.0f, -3.0f); + this.Shape1.setTextureSize(128, 128); + this.Shape1.mirror = true; + this.setRotation(this.Shape1, 0.0f, 0.0f, 0.0f); + (this.Shape2 = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(0.0f, 0.0f, 0.0f, 2, 5, 18); + this.Shape2.setRotationPoint(-1.0f, 19.0f, -9.0f); + this.Shape2.setTextureSize(128, 128); + this.Shape2.mirror = true; + this.setRotation(this.Shape2, 0.0f, 0.0f, 0.0f); + (this.Shape3 = new ModelRenderer((ModelBase)this, 25, 25)) + .addBox(0.0f, 0.0f, 0.0f, 18, 5, 2); + this.Shape3.setRotationPoint(-9.0f, 19.0f, -1.0f); + this.Shape3.setTextureSize(128, 128); + this.Shape3.mirror = true; + this.setRotation(this.Shape3, 0.0f, 0.0f, 0.0f); + (this.Shape4 = new ModelRenderer((ModelBase)this, 25, 65)) + .addBox(0.0f, 0.0f, 0.0f, 12, 12, 2); + this.Shape4.setRotationPoint(-6.0f, -40.0f, -1.0f); + this.Shape4.setTextureSize(128, 128); + this.Shape4.mirror = true; + this.setRotation(this.Shape4, 0.0f, 0.0f, 0.0f); + (this.Shape5 = new ModelRenderer((ModelBase)this, 25, 40)) + .addBox(0.0f, 0.0f, 0.0f, 2, 12, 12); + this.Shape5.setRotationPoint(-1.0f, -40.0f, -6.0f); + this.Shape5.setTextureSize(128, 128); + this.Shape5.mirror = true; + this.setRotation(this.Shape5, 0.0f, 0.0f, 0.0f); + (this.Shape6 = new ModelRenderer((ModelBase)this, 0, 80)) + .addBox(0.0f, 0.0f, 0.0f, 10, 15, 10); + this.Shape6.setRotationPoint(-5.0f, 9.0f, -5.0f); + this.Shape6.setTextureSize(128, 128); + this.Shape6.mirror = true; + this.setRotation(this.Shape6, 0.0f, 0.0f, 0.0f); + (this.Shape7 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 8, 7, 8); + this.Shape7.setRotationPoint(-4.0f, -53.0f, -4.0f); + this.Shape7.setTextureSize(128, 128); + this.Shape7.mirror = true; + this.setRotation(this.Shape7, 0.0f, 0.0f, 0.0f); + (this.Shape8 = new ModelRenderer((ModelBase)this, 70, 0)) + .addBox(0.0f, 0.0f, 0.0f, 4, 4, 4); + this.Shape8.setRotationPoint(0.0f, -54.0f, 0.0f); + this.Shape8.setTextureSize(128, 128); + this.Shape8.mirror = true; + this.setRotation(this.Shape8, -0.7853982f, 0.0f, 0.6108652f); + (this.Shape9 = new ModelRenderer((ModelBase)this, 70, 10)) + .addBox(-1.0f, 0.0f, -1.0f, 2, 5, 2); + this.Shape9.setRotationPoint(0.0f, -55.0f, 0.0f); + this.Shape9.setTextureSize(128, 128); + this.Shape9.mirror = true; + this.setRotation(this.Shape9, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.Shape1.render(f5); + this.Shape2.render(f5); + this.Shape3.render(f5); + this.Shape4.render(f5); + this.Shape5.render(f5); + this.Shape6.render(f5); + this.Shape7.render(f5); + this.Shape8.render(f5); + this.Shape9.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMQi.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMQi.java new file mode 100644 index 0000000..13a5629 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMQi.java @@ -0,0 +1,188 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMQi extends MICBM { + ModelRenderer MAIN_MISSILE_MODULE; + ModelRenderer PROPULSOR_MODULE; + ModelRenderer WING_B_A_1; + ModelRenderer WING_B_B_1; + ModelRenderer WING_T_A_1; + ModelRenderer WING_T_B_1; + ModelRenderer WING_T_A_2; + ModelRenderer WING_T_B_2; + ModelRenderer WING_B_B_2; + ModelRenderer WING_B_A_2; + ModelRenderer WARHEAD_1; + ModelRenderer WARHEAD_2; + ModelRenderer WARHEAD_3; + ModelRenderer WARHEAD_4; + ModelRenderer WARHEAD_5; + ModelRenderer SCREEN; + ModelRenderer POLEDEPTH; + ModelRenderer POLEWIDTH; + ModelRenderer WINGTWIDTH; + + public MMQi() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.MAIN_MISSILE_MODULE = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 6, 50, 6); + this.MAIN_MISSILE_MODULE.setRotationPoint(-3.0f, -26.0f, -3.0f); + this.MAIN_MISSILE_MODULE.setTextureSize(128, 128); + this.MAIN_MISSILE_MODULE.mirror = true; + this.setRotation(this.MAIN_MISSILE_MODULE, 0.0f, 0.0f, 0.0f); + (this.PROPULSOR_MODULE = new ModelRenderer((ModelBase)this, 0, 57)) + .addBox(-5.0f, 0.0f, -5.0f, 10, 16, 10); + this.PROPULSOR_MODULE.setRotationPoint(0.0f, 8.0f, 0.0f); + this.PROPULSOR_MODULE.setTextureSize(128, 128); + this.PROPULSOR_MODULE.mirror = true; + this.setRotation(this.PROPULSOR_MODULE, 0.0f, 0.7853982f, 0.0f); + (this.WING_B_A_1 = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.WING_B_A_1.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_B_A_1.setTextureSize(128, 128); + this.WING_B_A_1.mirror = true; + this.setRotation(this.WING_B_A_1, 0.0f, 0.7853982f, 0.0f); + (this.WING_B_B_1 = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.WING_B_B_1.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_B_B_1.setTextureSize(128, 128); + this.WING_B_B_1.mirror = true; + this.setRotation(this.WING_B_B_1, 0.0f, -0.7853982f, 0.0f); + (this.WING_T_A_1 = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.WING_T_A_1.setRotationPoint(0.0f, -26.0f, 0.0f); + this.WING_T_A_1.setTextureSize(128, 128); + this.WING_T_A_1.mirror = true; + this.setRotation(this.WING_T_A_1, -0.7853982f, 0.7853982f, 0.0f); + (this.WING_T_B_1 = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.WING_T_B_1.setRotationPoint(0.0f, -26.0f, 0.0f); + this.WING_T_B_1.setTextureSize(128, 128); + this.WING_T_B_1.mirror = true; + this.setRotation(this.WING_T_B_1, -0.7853982f, -0.7853982f, 0.0f); + (this.WING_T_A_2 = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 12, 14); + this.WING_T_A_2.setRotationPoint(0.0f, -19.0f, 0.0f); + this.WING_T_A_2.setTextureSize(128, 128); + this.WING_T_A_2.mirror = true; + this.setRotation(this.WING_T_A_2, 0.0f, 0.7853982f, 0.0f); + (this.WING_T_B_2 = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 12, 14); + this.WING_T_B_2.setRotationPoint(0.0f, -19.0f, 0.0f); + this.WING_T_B_2.setTextureSize(128, 128); + this.WING_T_B_2.mirror = true; + this.setRotation(this.WING_T_B_2, 0.0f, -0.7853982f, 0.0f); + (this.WING_B_B_2 = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.WING_B_B_2.setRotationPoint(0.0f, 3.0f, 0.0f); + this.WING_B_B_2.setTextureSize(128, 128); + this.WING_B_B_2.mirror = true; + this.setRotation(this.WING_B_B_2, -0.7853982f, -0.7853982f, 0.0f); + (this.WING_B_A_2 = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.WING_B_A_2.setRotationPoint(0.0f, 3.0f, 0.0f); + this.WING_B_A_2.setTextureSize(128, 128); + this.WING_B_A_2.mirror = true; + this.setRotation(this.WING_B_A_2, -0.7853982f, 0.7853982f, 0.0f); + (this.WARHEAD_1 = new ModelRenderer((ModelBase)this, 0, 85)) + .addBox(-4.0f, 0.0f, -4.0f, 7, 7, 7); + this.WARHEAD_1.setRotationPoint(0.5f, -29.0f, 0.5f); + this.WARHEAD_1.setTextureSize(128, 128); + this.WARHEAD_1.mirror = true; + this.setRotation(this.WARHEAD_1, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_2 = new ModelRenderer((ModelBase)this, 33, 85)) + .addBox(-3.0f, 0.0f, -3.0f, 5, 3, 5); + this.WARHEAD_2.setRotationPoint(0.5f, -32.0f, 0.5f); + this.WARHEAD_2.setTextureSize(128, 128); + this.WARHEAD_2.mirror = true; + this.setRotation(this.WARHEAD_2, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_3 = new ModelRenderer((ModelBase)this, 59, 85)) + .addBox(-2.0f, 0.0f, -2.0f, 3, 3, 3); + this.WARHEAD_3.setRotationPoint(0.5f, -35.0f, 0.5f); + this.WARHEAD_3.setTextureSize(128, 128); + this.WARHEAD_3.mirror = true; + this.setRotation(this.WARHEAD_3, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_4 = new ModelRenderer((ModelBase)this, 78, 85)) + .addBox(-1.0f, 0.0f, -1.0f, 2, 3, 2); + this.WARHEAD_4.setRotationPoint(0.0f, -38.0f, 0.0f); + this.WARHEAD_4.setTextureSize(128, 128); + this.WARHEAD_4.mirror = true; + this.setRotation(this.WARHEAD_4, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_5 = new ModelRenderer((ModelBase)this, 89, 85)) + .addBox(0.0f, 0.0f, 0.0f, 1, 3, 1); + this.WARHEAD_5.setRotationPoint(-0.5f, -41.0f, -0.5f); + this.WARHEAD_5.setTextureSize(128, 128); + this.WARHEAD_5.mirror = true; + this.setRotation(this.WARHEAD_5, 0.0f, 0.0f, 0.0f); + (this.SCREEN = new ModelRenderer((ModelBase)this, 97, 0)) + .addBox(0.0f, 0.0f, 0.0f, 4, 10, 8); + this.SCREEN.setRotationPoint(-2.0f, -6.0f, -4.0f); + this.SCREEN.setTextureSize(128, 128); + this.SCREEN.mirror = true; + this.setRotation(this.SCREEN, 0.0f, 0.0f, 0.0f); + (this.POLEDEPTH = new ModelRenderer((ModelBase)this, 45, 59)) + .addBox(0.0f, 0.0f, 0.0f, 2, 2, 10); + this.POLEDEPTH.setRotationPoint(-1.0f, -31.0f, -5.0f); + this.POLEDEPTH.setTextureSize(128, 128); + this.POLEDEPTH.mirror = true; + this.setRotation(this.POLEDEPTH, 0.0f, 0.0f, 0.0f); + (this.POLEWIDTH = new ModelRenderer((ModelBase)this, 45, 73)) + .addBox(0.0f, 0.0f, 0.0f, 10, 2, 2); + this.POLEWIDTH.setRotationPoint(-5.0f, -31.0f, -1.0f); + this.POLEWIDTH.setTextureSize(128, 128); + this.POLEWIDTH.mirror = true; + this.setRotation(this.POLEWIDTH, 0.0f, 0.0f, 0.0f); + (this.WINGTWIDTH = new ModelRenderer((ModelBase)this, 70, 57)) + .addBox(0.0f, 0.0f, 0.0f, 14, 12, 2); + this.WINGTWIDTH.setRotationPoint(-7.0f, -19.0f, -1.0f); + this.WINGTWIDTH.setTextureSize(128, 128); + this.WINGTWIDTH.mirror = true; + this.setRotation(this.WINGTWIDTH, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.MAIN_MISSILE_MODULE.render(f5); + this.PROPULSOR_MODULE.render(f5); + this.WING_B_A_1.render(f5); + this.WING_B_B_1.render(f5); + this.WING_T_A_1.render(f5); + this.WING_T_B_1.render(f5); + this.WING_T_A_2.render(f5); + this.WING_T_B_2.render(f5); + this.WING_B_B_2.render(f5); + this.WING_B_A_2.render(f5); + this.WARHEAD_1.render(f5); + this.WARHEAD_2.render(f5); + this.WARHEAD_3.render(f5); + this.WARHEAD_4.render(f5); + this.WARHEAD_5.render(f5); + this.SCREEN.render(f5); + this.POLEDEPTH.render(f5); + this.POLEWIDTH.render(f5); + this.WINGTWIDTH.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMQunDan.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMQunDan.java new file mode 100644 index 0000000..7b261cf --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMQunDan.java @@ -0,0 +1,284 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMQunDan extends MICBM { + ModelRenderer Shape1; + ModelRenderer Shape2; + ModelRenderer Shape2a; + ModelRenderer Shape2b; + ModelRenderer Shape2c; + ModelRenderer Shape3; + ModelRenderer Shape3a; + ModelRenderer Shape3b; + ModelRenderer Shape3c; + ModelRenderer Shape4; + ModelRenderer Shape4a; + ModelRenderer Shape4b; + ModelRenderer Shape4c; + ModelRenderer Shape5; + ModelRenderer Shape5a; + ModelRenderer Shape4d; + ModelRenderer Shape4e; + ModelRenderer Shape4f; + ModelRenderer Shape4g; + ModelRenderer Shape6; + ModelRenderer Shape6a; + ModelRenderer Shape7; + ModelRenderer Shape7a; + ModelRenderer Shape7b; + ModelRenderer Shape7c; + ModelRenderer Shape7d; + ModelRenderer Shape7e; + ModelRenderer Shape7f; + ModelRenderer Shape7g; + ModelRenderer Shape7h; + ModelRenderer Shape7i; + + public MMQunDan() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape1 = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-4.0f, 0.0f, -4.0f, 8, 64, 8); + this.Shape1.setRotationPoint(0.0f, -40.0f, 0.0f); + this.Shape1.setTextureSize(128, 128); + this.Shape1.mirror = true; + this.setRotation(this.Shape1, 0.0f, 0.0f, 0.0f); + (this.Shape2 = new ModelRenderer((ModelBase)this, 34, 19)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.Shape2.setRotationPoint(-7.0f, 14.0f, 6.0f); + this.Shape2.setTextureSize(128, 128); + this.Shape2.mirror = true; + this.setRotation(this.Shape2, 0.0f, 0.0f, 0.0f); + (this.Shape2a = new ModelRenderer((ModelBase)this, 34, 19)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.Shape2a.setRotationPoint(-7.0f, 14.0f, -7.0f); + this.Shape2a.setTextureSize(128, 128); + this.Shape2a.mirror = true; + this.setRotation(this.Shape2a, 0.0f, 0.0f, 0.0f); + (this.Shape2b = new ModelRenderer((ModelBase)this, 34, 31)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.Shape2b.setRotationPoint(-7.0f, 14.0f, -6.0f); + this.Shape2b.setTextureSize(128, 128); + this.Shape2b.mirror = true; + this.setRotation(this.Shape2b, 0.0f, 0.0f, 0.0f); + (this.Shape2c = new ModelRenderer((ModelBase)this, 34, 31)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.Shape2c.setRotationPoint(6.0f, 14.0f, -6.0f); + this.Shape2c.setTextureSize(128, 128); + this.Shape2c.mirror = true; + this.setRotation(this.Shape2c, 0.0f, 0.0f, 0.0f); + (this.Shape3 = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.Shape3.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3.setTextureSize(128, 128); + this.Shape3.mirror = true; + this.setRotation(this.Shape3, 0.0f, 0.7853982f, 0.0f); + (this.Shape3a = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.Shape3a.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3a.setTextureSize(128, 128); + this.Shape3a.mirror = true; + this.setRotation(this.Shape3a, 0.0f, -0.7853982f, 0.0f); + (this.Shape3b = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.Shape3b.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3b.setTextureSize(128, 128); + this.Shape3b.mirror = true; + this.setRotation(this.Shape3b, 0.0f, 0.7853982f, 0.7853982f); + (this.Shape3c = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.Shape3c.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3c.setTextureSize(128, 128); + this.Shape3c.mirror = true; + this.setRotation(this.Shape3c, 0.0f, -0.7853982f, 0.7853982f); + (this.Shape4 = new ModelRenderer((ModelBase)this, 22, 74)) + .addBox(0.0f, 0.0f, 0.0f, 2, 7, 5); + this.Shape4.setRotationPoint(-1.0f, -23.0f, 4.0f); + this.Shape4.setTextureSize(128, 128); + this.Shape4.mirror = true; + this.setRotation(this.Shape4, -0.5235988f, 0.0f, 0.0f); + (this.Shape4a = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, 0.0f, 5, 8, 2); + this.Shape4a.setRotationPoint(4.0f, -23.0f, -1.0f); + this.Shape4a.setTextureSize(128, 128); + this.Shape4a.mirror = true; + this.setRotation(this.Shape4a, 0.0f, 0.0f, 0.5235988f); + (this.Shape4b = new ModelRenderer((ModelBase)this, 0, 81)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.Shape4b.setRotationPoint(0.0f, -35.0f, -4.0f); + this.Shape4b.setTextureSize(128, 128); + this.Shape4b.mirror = true; + this.setRotation(this.Shape4b, -0.5235988f, 3.141593f, 0.0f); + (this.Shape4c = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, -1.0f, 5, 8, 2); + this.Shape4c.setRotationPoint(-4.0f, -23.0f, 0.0f); + this.Shape4c.setTextureSize(128, 128); + this.Shape4c.mirror = true; + this.setRotation(this.Shape4c, 0.0f, 3.141593f, 0.5235988f); + (this.Shape5 = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.Shape5.setRotationPoint(0.0f, -32.0f, 0.0f); + this.Shape5.setTextureSize(128, 128); + this.Shape5.mirror = true; + this.setRotation(this.Shape5, 0.0f, 0.0f, 0.0f); + (this.Shape5a = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.Shape5a.setRotationPoint(0.0f, -32.0f, 0.0f); + this.Shape5a.setTextureSize(128, 128); + this.Shape5a.mirror = true; + this.setRotation(this.Shape5a, 0.0f, 1.570796f, 0.0f); + (this.Shape4d = new ModelRenderer((ModelBase)this, 22, 74)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 8, 5); + this.Shape4d.setRotationPoint(0.0f, -23.0f, -4.0f); + this.Shape4d.setTextureSize(128, 128); + this.Shape4d.mirror = true; + this.setRotation(this.Shape4d, -0.5235988f, 3.141593f, 0.0f); + (this.Shape4e = new ModelRenderer((ModelBase)this, 0, 81)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.Shape4e.setRotationPoint(0.0f, -35.0f, 4.0f); + this.Shape4e.setTextureSize(128, 128); + this.Shape4e.mirror = true; + this.setRotation(this.Shape4e, -0.5235988f, 0.0f, 0.0f); + (this.Shape4f = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(0.0f, 0.0f, -1.0f, 5, 4, 2); + this.Shape4f.setRotationPoint(-4.0f, -35.0f, 0.0f); + this.Shape4f.setTextureSize(128, 128); + this.Shape4f.mirror = true; + this.setRotation(this.Shape4f, 0.0f, 3.141593f, 0.5235988f); + (this.Shape4g = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(0.0f, 0.0f, 0.0f, 5, 4, 2); + this.Shape4g.setRotationPoint(4.0f, -35.0f, -1.0f); + this.Shape4g.setTextureSize(128, 128); + this.Shape4g.mirror = true; + this.setRotation(this.Shape4g, 0.0f, 0.0f, 0.5235988f); + (this.Shape6 = new ModelRenderer((ModelBase)this, 72, 16)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.Shape6.setRotationPoint(-5.0f, -37.0f, -5.0f); + this.Shape6.setTextureSize(128, 128); + this.Shape6.mirror = true; + this.setRotation(this.Shape6, 0.0f, 0.0f, 0.0f); + (this.Shape6a = new ModelRenderer((ModelBase)this, 72, 16)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.Shape6a.setRotationPoint(-5.0f, -41.0f, -5.0f); + this.Shape6a.setTextureSize(128, 128); + this.Shape6a.mirror = true; + this.setRotation(this.Shape6a, 0.0f, 0.0f, 0.0f); + (this.Shape7 = new ModelRenderer((ModelBase)this, 80, 111)) + .addBox(0.0f, 0.0f, 0.0f, 12, 4, 12); + this.Shape7.setRotationPoint(-6.0f, -45.0f, -6.0f); + this.Shape7.setTextureSize(128, 128); + this.Shape7.mirror = true; + this.setRotation(this.Shape7, 0.0f, 0.0f, 0.0f); + (this.Shape7a = new ModelRenderer((ModelBase)this, 88, 95)) + .addBox(0.0f, 0.0f, 0.0f, 10, 4, 10); + this.Shape7a.setRotationPoint(-5.0f, -49.0f, -5.0f); + this.Shape7a.setTextureSize(128, 128); + this.Shape7a.mirror = true; + this.setRotation(this.Shape7a, 0.0f, 0.0f, 0.0f); + (this.Shape7b = new ModelRenderer((ModelBase)this, 48, 109)) + .addBox(0.0f, 0.0f, 0.0f, 1, 4, 14); + this.Shape7b.setRotationPoint(-4.0f, -45.0f, -7.0f); + this.Shape7b.setTextureSize(128, 128); + this.Shape7b.mirror = true; + this.setRotation(this.Shape7b, 0.0f, 0.0f, 0.0f); + (this.Shape7c = new ModelRenderer((ModelBase)this, 48, 109)) + .addBox(0.0f, 0.0f, 0.0f, 1, 4, 14); + this.Shape7c.setRotationPoint(3.0f, -45.0f, -7.0f); + this.Shape7c.setTextureSize(128, 128); + this.Shape7c.mirror = true; + this.setRotation(this.Shape7c, 0.0f, 0.0f, 0.0f); + (this.Shape7d = new ModelRenderer((ModelBase)this, 48, 109)) + .addBox(0.0f, 0.0f, 0.0f, 1, 4, 14); + this.Shape7d.setRotationPoint(-7.0f, -45.0f, -3.0f); + this.Shape7d.setTextureSize(128, 128); + this.Shape7d.mirror = true; + this.setRotation(this.Shape7d, 0.0f, 1.570796f, 0.0f); + (this.Shape7e = new ModelRenderer((ModelBase)this, 48, 109)) + .addBox(0.0f, 0.0f, 0.0f, 1, 4, 14); + this.Shape7e.setRotationPoint(-7.0f, -45.0f, 4.0f); + this.Shape7e.setTextureSize(128, 128); + this.Shape7e.mirror = true; + this.setRotation(this.Shape7e, 0.0f, 1.570796f, 0.0f); + (this.Shape7f = new ModelRenderer((ModelBase)this, 52, 91)) + .addBox(0.0f, 0.0f, 0.0f, 1, 5, 12); + this.Shape7f.setRotationPoint(-6.0f, -50.0f, -1.0f); + this.Shape7f.setTextureSize(128, 128); + this.Shape7f.mirror = true; + this.setRotation(this.Shape7f, 0.0f, 1.570796f, 0.0f); + (this.Shape7g = new ModelRenderer((ModelBase)this, 52, 91)) + .addBox(0.0f, 0.0f, 0.0f, 1, 5, 12); + this.Shape7g.setRotationPoint(-6.0f, -50.0f, 2.0f); + this.Shape7g.setTextureSize(128, 128); + this.Shape7g.mirror = true; + this.setRotation(this.Shape7g, 0.0f, 1.570796f, 0.0f); + (this.Shape7h = new ModelRenderer((ModelBase)this, 52, 91)) + .addBox(0.0f, 0.0f, 0.0f, 1, 5, 12); + this.Shape7h.setRotationPoint(1.0f, -50.0f, -6.0f); + this.Shape7h.setTextureSize(128, 128); + this.Shape7h.mirror = true; + this.setRotation(this.Shape7h, 0.0f, 0.0f, 0.0f); + (this.Shape7i = new ModelRenderer((ModelBase)this, 52, 91)) + .addBox(0.0f, 0.0f, 0.0f, 1, 5, 12); + this.Shape7i.setRotationPoint(-2.0f, -50.0f, -6.0f); + this.Shape7i.setTextureSize(128, 128); + this.Shape7i.mirror = true; + this.setRotation(this.Shape7i, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.Shape1.render(f5); + this.Shape2.render(f5); + this.Shape2a.render(f5); + this.Shape2b.render(f5); + this.Shape2c.render(f5); + this.Shape3.render(f5); + this.Shape3a.render(f5); + this.Shape3b.render(f5); + this.Shape3c.render(f5); + this.Shape4.render(f5); + this.Shape4a.render(f5); + this.Shape4b.render(f5); + this.Shape4c.render(f5); + this.Shape5.render(f5); + this.Shape5a.render(f5); + this.Shape4d.render(f5); + this.Shape4e.render(f5); + this.Shape4f.render(f5); + this.Shape4g.render(f5); + this.Shape6.render(f5); + this.Shape6a.render(f5); + this.Shape7.render(f5); + this.Shape7a.render(f5); + this.Shape7b.render(f5); + this.Shape7c.render(f5); + this.Shape7d.render(f5); + this.Shape7e.render(f5); + this.Shape7f.render(f5); + this.Shape7g.render(f5); + this.Shape7h.render(f5); + this.Shape7i.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMShengBuo.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMShengBuo.java new file mode 100644 index 0000000..2afab4b --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMShengBuo.java @@ -0,0 +1,236 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMShengBuo extends MICBM { + ModelRenderer Shape1; + ModelRenderer Shape2; + ModelRenderer Shape2a; + ModelRenderer Shape2b; + ModelRenderer Shape2c; + ModelRenderer Shape3; + ModelRenderer Shape3a; + ModelRenderer Shape3b; + ModelRenderer Shape3c; + ModelRenderer Shape4; + ModelRenderer Shape4a; + ModelRenderer Shape4b; + ModelRenderer Shape4c; + ModelRenderer Shape5; + ModelRenderer Shape5a; + ModelRenderer Shape4d; + ModelRenderer Shape4e; + ModelRenderer Shape4f; + ModelRenderer Shape4g; + ModelRenderer Shape6; + ModelRenderer Shape6a; + ModelRenderer Shape7a; + ModelRenderer Shape7; + ModelRenderer Shape7b; + ModelRenderer Shape7c; + + public MMShengBuo() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape1 = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-4.0f, 0.0f, -4.0f, 8, 64, 8); + this.Shape1.setRotationPoint(0.0f, -40.0f, 0.0f); + this.Shape1.setTextureSize(128, 128); + this.Shape1.mirror = true; + this.setRotation(this.Shape1, 0.0f, 0.0f, 0.0f); + (this.Shape2 = new ModelRenderer((ModelBase)this, 34, 19)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.Shape2.setRotationPoint(-7.0f, 14.0f, 6.0f); + this.Shape2.setTextureSize(128, 128); + this.Shape2.mirror = true; + this.setRotation(this.Shape2, 0.0f, 0.0f, 0.0f); + (this.Shape2a = new ModelRenderer((ModelBase)this, 34, 19)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.Shape2a.setRotationPoint(-7.0f, 14.0f, -7.0f); + this.Shape2a.setTextureSize(128, 128); + this.Shape2a.mirror = true; + this.setRotation(this.Shape2a, 0.0f, 0.0f, 0.0f); + (this.Shape2b = new ModelRenderer((ModelBase)this, 34, 31)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.Shape2b.setRotationPoint(-7.0f, 14.0f, -6.0f); + this.Shape2b.setTextureSize(128, 128); + this.Shape2b.mirror = true; + this.setRotation(this.Shape2b, 0.0f, 0.0f, 0.0f); + (this.Shape2c = new ModelRenderer((ModelBase)this, 34, 31)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.Shape2c.setRotationPoint(6.0f, 14.0f, -6.0f); + this.Shape2c.setTextureSize(128, 128); + this.Shape2c.mirror = true; + this.setRotation(this.Shape2c, 0.0f, 0.0f, 0.0f); + (this.Shape3 = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.Shape3.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3.setTextureSize(128, 128); + this.Shape3.mirror = true; + this.setRotation(this.Shape3, 0.0f, 0.7853982f, 0.0f); + (this.Shape3a = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.Shape3a.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3a.setTextureSize(128, 128); + this.Shape3a.mirror = true; + this.setRotation(this.Shape3a, 0.0f, -0.7853982f, 0.0f); + (this.Shape3b = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.Shape3b.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3b.setTextureSize(128, 128); + this.Shape3b.mirror = true; + this.setRotation(this.Shape3b, 0.0f, 0.7853982f, 0.7853982f); + (this.Shape3c = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.Shape3c.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3c.setTextureSize(128, 128); + this.Shape3c.mirror = true; + this.setRotation(this.Shape3c, 0.0f, -0.7853982f, 0.7853982f); + (this.Shape4 = new ModelRenderer((ModelBase)this, 22, 74)) + .addBox(0.0f, 0.0f, 0.0f, 2, 7, 5); + this.Shape4.setRotationPoint(-1.0f, -23.0f, 4.0f); + this.Shape4.setTextureSize(128, 128); + this.Shape4.mirror = true; + this.setRotation(this.Shape4, -0.5235988f, 0.0f, 0.0f); + (this.Shape4a = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, 0.0f, 5, 8, 2); + this.Shape4a.setRotationPoint(4.0f, -23.0f, -1.0f); + this.Shape4a.setTextureSize(128, 128); + this.Shape4a.mirror = true; + this.setRotation(this.Shape4a, 0.0f, 0.0f, 0.5235988f); + (this.Shape4b = new ModelRenderer((ModelBase)this, 0, 81)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.Shape4b.setRotationPoint(0.0f, -35.0f, -4.0f); + this.Shape4b.setTextureSize(128, 128); + this.Shape4b.mirror = true; + this.setRotation(this.Shape4b, -0.5235988f, 3.141593f, 0.0f); + (this.Shape4c = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, -1.0f, 5, 8, 2); + this.Shape4c.setRotationPoint(-4.0f, -23.0f, 0.0f); + this.Shape4c.setTextureSize(128, 128); + this.Shape4c.mirror = true; + this.setRotation(this.Shape4c, 0.0f, 3.141593f, 0.5235988f); + (this.Shape5 = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.Shape5.setRotationPoint(0.0f, -32.0f, 0.0f); + this.Shape5.setTextureSize(128, 128); + this.Shape5.mirror = true; + this.setRotation(this.Shape5, 0.0f, 0.0f, 0.0f); + (this.Shape5a = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.Shape5a.setRotationPoint(0.0f, -32.0f, 0.0f); + this.Shape5a.setTextureSize(128, 128); + this.Shape5a.mirror = true; + this.setRotation(this.Shape5a, 0.0f, 1.570796f, 0.0f); + (this.Shape4d = new ModelRenderer((ModelBase)this, 22, 74)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 8, 5); + this.Shape4d.setRotationPoint(0.0f, -23.0f, -4.0f); + this.Shape4d.setTextureSize(128, 128); + this.Shape4d.mirror = true; + this.setRotation(this.Shape4d, -0.5235988f, 3.141593f, 0.0f); + (this.Shape4e = new ModelRenderer((ModelBase)this, 0, 81)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.Shape4e.setRotationPoint(0.0f, -35.0f, 4.0f); + this.Shape4e.setTextureSize(128, 128); + this.Shape4e.mirror = true; + this.setRotation(this.Shape4e, -0.5235988f, 0.0f, 0.0f); + (this.Shape4f = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(0.0f, 0.0f, -1.0f, 5, 4, 2); + this.Shape4f.setRotationPoint(-4.0f, -35.0f, 0.0f); + this.Shape4f.setTextureSize(128, 128); + this.Shape4f.mirror = true; + this.setRotation(this.Shape4f, 0.0f, 3.141593f, 0.5235988f); + (this.Shape4g = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(0.0f, 0.0f, 0.0f, 5, 4, 2); + this.Shape4g.setRotationPoint(4.0f, -35.0f, -1.0f); + this.Shape4g.setTextureSize(128, 128); + this.Shape4g.mirror = true; + this.setRotation(this.Shape4g, 0.0f, 0.0f, 0.5235988f); + (this.Shape6 = new ModelRenderer((ModelBase)this, 72, 16)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.Shape6.setRotationPoint(-5.0f, -37.0f, -5.0f); + this.Shape6.setTextureSize(128, 128); + this.Shape6.mirror = true; + this.setRotation(this.Shape6, 0.0f, 0.0f, 0.0f); + (this.Shape6a = new ModelRenderer((ModelBase)this, 72, 16)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.Shape6a.setRotationPoint(-5.0f, -41.0f, -5.0f); + this.Shape6a.setTextureSize(128, 128); + this.Shape6a.mirror = true; + this.setRotation(this.Shape6a, 0.0f, 0.0f, 0.0f); + (this.Shape7a = new ModelRenderer((ModelBase)this, 95, 115)) + .addBox(0.0f, 0.0f, 0.0f, 8, 4, 8); + this.Shape7a.setRotationPoint(-4.0f, -45.0f, -4.0f); + this.Shape7a.setTextureSize(128, 128); + this.Shape7a.mirror = true; + this.setRotation(this.Shape7a, 0.0f, 0.0f, 0.0f); + (this.Shape7 = new ModelRenderer((ModelBase)this, 95, 103)) + .addBox(0.0f, 0.0f, 0.0f, 6, 4, 6); + this.Shape7.setRotationPoint(-3.0f, -49.0f, -3.0f); + this.Shape7.setTextureSize(128, 128); + this.Shape7.mirror = true; + this.setRotation(this.Shape7, 0.0f, 0.0f, 0.0f); + (this.Shape7b = new ModelRenderer((ModelBase)this, 69, 109)) + .addBox(-1.0f, 0.0f, -5.0f, 2, 8, 10); + this.Shape7b.setRotationPoint(0.0f, -48.0f, 0.0f); + this.Shape7b.setTextureSize(128, 128); + this.Shape7b.mirror = true; + this.setRotation(this.Shape7b, 0.0f, 0.7853982f, 0.0f); + (this.Shape7c = new ModelRenderer((ModelBase)this, 69, 109)) + .addBox(-1.0f, 0.0f, -5.0f, 2, 8, 10); + this.Shape7c.setRotationPoint(0.0f, -48.0f, 0.0f); + this.Shape7c.setTextureSize(128, 128); + this.Shape7c.mirror = true; + this.setRotation(this.Shape7c, 0.0f, -0.7853982f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.Shape1.render(f5); + this.Shape2.render(f5); + this.Shape2a.render(f5); + this.Shape2b.render(f5); + this.Shape2c.render(f5); + this.Shape3.render(f5); + this.Shape3a.render(f5); + this.Shape3b.render(f5); + this.Shape3c.render(f5); + this.Shape4.render(f5); + this.Shape4a.render(f5); + this.Shape4b.render(f5); + this.Shape4c.render(f5); + this.Shape5.render(f5); + this.Shape5a.render(f5); + this.Shape4d.render(f5); + this.Shape4e.render(f5); + this.Shape4f.render(f5); + this.Shape4g.render(f5); + this.Shape6.render(f5); + this.Shape6a.render(f5); + this.Shape7a.render(f5); + this.Shape7.render(f5); + this.Shape7b.render(f5); + this.Shape7c.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMTaiYang.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMTaiYang.java new file mode 100644 index 0000000..df98a55 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMTaiYang.java @@ -0,0 +1,252 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMTaiYang extends MICBM { + ModelRenderer MAIN_MODULE; + ModelRenderer MOTOR_MODULE_1; + ModelRenderer MOTOR_MODULE_2; + ModelRenderer MOTOR_MODULE_3; + ModelRenderer MOTOR_MODULE_4; + ModelRenderer C1; + ModelRenderer C2; + ModelRenderer C3; + ModelRenderer C4; + ModelRenderer T1; + ModelRenderer T2; + ModelRenderer T3; + ModelRenderer T4; + ModelRenderer WING_1A; + ModelRenderer WING_2A; + ModelRenderer WING_1B; + ModelRenderer WING_2B; + ModelRenderer WING_3A; + ModelRenderer WING_3B; + ModelRenderer WING_4B; + ModelRenderer WING_4A; + ModelRenderer TOP; + ModelRenderer Shape1; + ModelRenderer Shape1a; + ModelRenderer Shape2b; + ModelRenderer Shape1c; + ModelRenderer Shape1d; + + public MMTaiYang() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.MAIN_MODULE = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 8, 70, 8); + this.MAIN_MODULE.setRotationPoint(-4.0f, -63.0f, -4.0f); + this.MAIN_MODULE.setTextureSize(128, 128); + this.MAIN_MODULE.mirror = true; + this.setRotation(this.MAIN_MODULE, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_1 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_1.setRotationPoint(-8.0f, 0.0f, -8.0f); + this.MOTOR_MODULE_1.setTextureSize(128, 128); + this.MOTOR_MODULE_1.mirror = true; + this.setRotation(this.MOTOR_MODULE_1, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_2 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_2.setRotationPoint(-8.0f, 0.0f, 2.0f); + this.MOTOR_MODULE_2.setTextureSize(128, 128); + this.MOTOR_MODULE_2.mirror = true; + this.setRotation(this.MOTOR_MODULE_2, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_3 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_3.setRotationPoint(2.0f, 0.0f, -8.0f); + this.MOTOR_MODULE_3.setTextureSize(128, 128); + this.MOTOR_MODULE_3.mirror = true; + this.setRotation(this.MOTOR_MODULE_3, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_4 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_4.setRotationPoint(2.0f, 0.0f, 2.0f); + this.MOTOR_MODULE_4.setTextureSize(128, 128); + this.MOTOR_MODULE_4.mirror = true; + this.setRotation(this.MOTOR_MODULE_4, 0.0f, 0.0f, 0.0f); + (this.C1 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C1.setRotationPoint(-6.0f, 20.0f, -6.0f); + this.C1.setTextureSize(128, 128); + this.C1.mirror = true; + this.setRotation(this.C1, 0.0f, 0.0f, 0.0f); + (this.C2 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C2.setRotationPoint(-6.0f, 20.0f, 4.0f); + this.C2.setTextureSize(128, 128); + this.C2.mirror = true; + this.setRotation(this.C2, 0.0f, 0.0f, 0.0f); + (this.C3 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C3.setRotationPoint(4.0f, 20.0f, -6.0f); + this.C3.setTextureSize(128, 128); + this.C3.mirror = true; + this.setRotation(this.C3, 0.0f, 0.0f, 0.0f); + (this.C4 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C4.setRotationPoint(4.0f, 20.0f, 4.0f); + this.C4.setTextureSize(128, 128); + this.C4.mirror = true; + this.setRotation(this.C4, 0.0f, 0.0f, 0.0f); + (this.T1 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T1.setRotationPoint(-7.0f, 21.0f, -7.0f); + this.T1.setTextureSize(128, 128); + this.T1.mirror = true; + this.setRotation(this.T1, 0.0f, 0.0f, 0.0f); + (this.T2 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T2.setRotationPoint(-7.0f, 21.0f, 3.0f); + this.T2.setTextureSize(128, 128); + this.T2.mirror = true; + this.setRotation(this.T2, 0.0f, 0.0f, 0.0f); + (this.T3 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T3.setRotationPoint(3.0f, 21.0f, -7.0f); + this.T3.setTextureSize(128, 128); + this.T3.mirror = true; + this.setRotation(this.T3, 0.0f, 0.0f, 0.0f); + (this.T4 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T4.setRotationPoint(3.0f, 21.0f, 3.0f); + this.T4.setTextureSize(128, 128); + this.T4.mirror = true; + this.setRotation(this.T4, 0.0f, 0.0f, 0.0f); + (this.WING_1A = new ModelRenderer((ModelBase)this, 43, 15)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 12, 12); + this.WING_1A.setRotationPoint(0.0f, -10.0f, 0.0f); + this.WING_1A.setTextureSize(128, 128); + this.WING_1A.mirror = true; + this.setRotation(this.WING_1A, -0.7853982f, 0.0f, 0.0f); + (this.WING_2A = new ModelRenderer((ModelBase)this, 43, 0)) + .addBox(0.0f, 0.0f, -1.0f, 12, 12, 2); + this.WING_2A.setRotationPoint(0.0f, -10.0f, 0.0f); + this.WING_2A.setTextureSize(128, 128); + this.WING_2A.mirror = true; + this.setRotation(this.WING_2A, 0.0f, 0.0f, 0.7853982f); + (this.WING_1B = new ModelRenderer((ModelBase)this, 72, 28)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 25, 16); + this.WING_1B.setRotationPoint(0.0f, -2.0f, 0.0f); + this.WING_1B.setTextureSize(128, 128); + this.WING_1B.mirror = true; + this.setRotation(this.WING_1B, 0.0f, 0.0f, 0.0f); + (this.WING_2B = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-8.0f, 0.0f, -1.0f, 16, 25, 2); + this.WING_2B.setRotationPoint(0.0f, -2.0f, 0.0f); + this.WING_2B.setTextureSize(128, 128); + this.WING_2B.mirror = true; + this.setRotation(this.WING_2B, 0.0f, 0.0f, 0.0f); + (this.WING_3A = new ModelRenderer((ModelBase)this, 34, 55)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 10, 16); + this.WING_3A.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_3A.setTextureSize(128, 128); + this.WING_3A.mirror = true; + this.setRotation(this.WING_3A, 0.0f, 0.0f, 0.0f); + (this.WING_3B = new ModelRenderer((ModelBase)this, 34, 82)) + .addBox(-1.0f, -6.0f, -6.0f, 2, 12, 12); + this.WING_3B.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_3B.setTextureSize(128, 128); + this.WING_3B.mirror = true; + this.setRotation(this.WING_3B, 0.7853982f, 0.0f, 0.0f); + (this.WING_4B = new ModelRenderer((ModelBase)this, 34, 41)) + .addBox(-8.0f, 0.0f, -1.0f, 16, 10, 2); + this.WING_4B.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_4B.setTextureSize(128, 128); + this.WING_4B.mirror = true; + this.setRotation(this.WING_4B, 0.0f, 0.0f, 0.0f); + (this.WING_4A = new ModelRenderer((ModelBase)this, 34, 107)) + .addBox(-6.0f, -6.0f, -1.0f, 12, 12, 2); + this.WING_4A.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_4A.setTextureSize(128, 128); + this.WING_4A.mirror = true; + this.setRotation(this.WING_4A, 0.0f, 0.0f, -0.7853982f); + (this.TOP = new ModelRenderer((ModelBase)this, 72, 70)) + .addBox(0.0f, 0.0f, 0.0f, 10, 10, 10); + this.TOP.setRotationPoint(-5.0f, -64.0f, -5.0f); + this.TOP.setTextureSize(128, 128); + this.TOP.mirror = true; + this.setRotation(this.TOP, 0.0f, 0.0f, 0.0f); + (this.Shape1 = new ModelRenderer((ModelBase)this, 98, 92)) + .addBox(0.0f, 0.0f, 0.0f, 2, 15, 2); + this.Shape1.setRotationPoint(-1.0f, -79.0f, -1.0f); + this.Shape1.setTextureSize(128, 128); + this.Shape1.mirror = true; + this.setRotation(this.Shape1, 0.0f, 0.0f, 0.0f); + (this.Shape1a = new ModelRenderer((ModelBase)this, 65, 92)) + .addBox(0.0f, 0.0f, 0.0f, 1, 14, 6); + this.Shape1a.setRotationPoint(2.0f, -77.0f, -3.0f); + this.Shape1a.setTextureSize(128, 128); + this.Shape1a.mirror = true; + this.setRotation(this.Shape1a, 0.0f, 0.0f, -0.1396263f); + (this.Shape2b = new ModelRenderer((ModelBase)this, 81, 92)) + .addBox(0.0f, 0.0f, 0.0f, 6, 14, 1); + this.Shape2b.setRotationPoint(-3.0f, -77.0f, 2.0f); + this.Shape2b.setTextureSize(128, 128); + this.Shape2b.mirror = true; + this.setRotation(this.Shape2b, 0.1396263f, 0.0f, 0.0f); + (this.Shape1c = new ModelRenderer((ModelBase)this, 65, 92)) + .addBox(0.0f, 0.0f, 0.0f, 1, 14, 6); + this.Shape1c.setRotationPoint(-3.0f, -77.0f, -3.0f); + this.Shape1c.setTextureSize(128, 128); + this.Shape1c.mirror = true; + this.setRotation(this.Shape1c, 0.0f, 0.0f, 0.1396263f); + (this.Shape1d = new ModelRenderer((ModelBase)this, 81, 92)) + .addBox(0.0f, 0.0f, 0.0f, 6, 14, 1); + this.Shape1d.setRotationPoint(-3.0f, -77.0f, -3.0f); + this.Shape1d.setTextureSize(128, 128); + this.Shape1d.mirror = true; + this.setRotation(this.Shape1d, -0.1396263f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.MAIN_MODULE.render(f5); + this.MOTOR_MODULE_1.render(f5); + this.MOTOR_MODULE_2.render(f5); + this.MOTOR_MODULE_3.render(f5); + this.MOTOR_MODULE_4.render(f5); + this.C1.render(f5); + this.C2.render(f5); + this.C3.render(f5); + this.C4.render(f5); + this.T1.render(f5); + this.T2.render(f5); + this.T3.render(f5); + this.T4.render(f5); + this.WING_1A.render(f5); + this.WING_2A.render(f5); + this.WING_1B.render(f5); + this.WING_2B.render(f5); + this.WING_3A.render(f5); + this.WING_3B.render(f5); + this.WING_4B.render(f5); + this.WING_4A.render(f5); + this.TOP.render(f5); + this.Shape1.render(f5); + this.Shape1a.render(f5); + this.Shape2b.render(f5); + this.Shape1c.render(f5); + this.Shape1d.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMTuPuo.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMTuPuo.java new file mode 100644 index 0000000..71c92f8 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMTuPuo.java @@ -0,0 +1,228 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMTuPuo extends MICBM { + ModelRenderer Shape1; + ModelRenderer Shape2; + ModelRenderer Shape2b; + ModelRenderer Shape2c; + ModelRenderer Shape2d; + ModelRenderer Shape3; + ModelRenderer Shape3a; + ModelRenderer Shape3b; + ModelRenderer Shape3c; + ModelRenderer Shape4; + ModelRenderer Shape4a; + ModelRenderer Shape4b; + ModelRenderer Shape4c; + ModelRenderer Shape5; + ModelRenderer Shape5a; + ModelRenderer Shape4d; + ModelRenderer Shape4e; + ModelRenderer Shape4f; + ModelRenderer Shape4g; + ModelRenderer Shape6; + ModelRenderer Shape6a; + ModelRenderer Shape7; + ModelRenderer Shape7a; + ModelRenderer Shape7b; + + public MMTuPuo() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape1 = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-4.0f, 0.0f, -4.0f, 8, 64, 8); + this.Shape1.setRotationPoint(0.0f, -40.0f, 0.0f); + this.Shape1.setTextureSize(128, 128); + this.Shape1.mirror = true; + this.setRotation(this.Shape1, 0.0f, 0.0f, 0.0f); + (this.Shape2 = new ModelRenderer((ModelBase)this, 34, 19)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.Shape2.setRotationPoint(-7.0f, 14.0f, 6.0f); + this.Shape2.setTextureSize(128, 128); + this.Shape2.mirror = true; + this.setRotation(this.Shape2, 0.0f, 0.0f, 0.0f); + (this.Shape2b = new ModelRenderer((ModelBase)this, 34, 19)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 1); + this.Shape2b.setRotationPoint(-7.0f, 14.0f, -7.0f); + this.Shape2b.setTextureSize(128, 128); + this.Shape2b.mirror = true; + this.setRotation(this.Shape2b, 0.0f, 0.0f, 0.0f); + (this.Shape2c = new ModelRenderer((ModelBase)this, 34, 31)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.Shape2c.setRotationPoint(-7.0f, 14.0f, -6.0f); + this.Shape2c.setTextureSize(128, 128); + this.Shape2c.mirror = true; + this.setRotation(this.Shape2c, 0.0f, 0.0f, 0.0f); + (this.Shape2d = new ModelRenderer((ModelBase)this, 34, 31)) + .addBox(0.0f, 0.0f, 0.0f, 1, 10, 12); + this.Shape2d.setRotationPoint(6.0f, 14.0f, -6.0f); + this.Shape2d.setTextureSize(128, 128); + this.Shape2d.mirror = true; + this.setRotation(this.Shape2d, 0.0f, 0.0f, 0.0f); + (this.Shape3 = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.Shape3.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3.setTextureSize(128, 128); + this.Shape3.mirror = true; + this.setRotation(this.Shape3, 0.0f, 0.7853982f, 0.0f); + (this.Shape3a = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-11.0f, 0.0f, -1.0f, 22, 12, 2); + this.Shape3a.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3a.setTextureSize(128, 128); + this.Shape3a.mirror = true; + this.setRotation(this.Shape3a, 0.0f, -0.7853982f, 0.0f); + (this.Shape3b = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.Shape3b.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3b.setTextureSize(128, 128); + this.Shape3b.mirror = true; + this.setRotation(this.Shape3b, 0.0f, 0.7853982f, 0.7853982f); + (this.Shape3c = new ModelRenderer((ModelBase)this, 34, 0)) + .addBox(-8.0f, -8.0f, -1.0f, 16, 16, 2); + this.Shape3c.setRotationPoint(0.0f, 12.0f, 0.0f); + this.Shape3c.setTextureSize(128, 128); + this.Shape3c.mirror = true; + this.setRotation(this.Shape3c, 0.0f, -0.7853982f, 0.7853982f); + (this.Shape4 = new ModelRenderer((ModelBase)this, 22, 74)) + .addBox(0.0f, 0.0f, 0.0f, 2, 7, 5); + this.Shape4.setRotationPoint(-1.0f, -23.0f, 4.0f); + this.Shape4.setTextureSize(128, 128); + this.Shape4.mirror = true; + this.setRotation(this.Shape4, -0.5235988f, 0.0f, 0.0f); + (this.Shape4a = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, 0.0f, 5, 8, 2); + this.Shape4a.setRotationPoint(4.0f, -23.0f, -1.0f); + this.Shape4a.setTextureSize(128, 128); + this.Shape4a.mirror = true; + this.setRotation(this.Shape4a, 0.0f, 0.0f, 0.5235988f); + (this.Shape4b = new ModelRenderer((ModelBase)this, 0, 81)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.Shape4b.setRotationPoint(0.0f, -35.0f, -4.0f); + this.Shape4b.setTextureSize(128, 128); + this.Shape4b.mirror = true; + this.setRotation(this.Shape4b, -0.5235988f, 3.141593f, 0.0f); + (this.Shape4c = new ModelRenderer((ModelBase)this, 0, 103)) + .addBox(0.0f, 0.0f, -1.0f, 5, 8, 2); + this.Shape4c.setRotationPoint(-4.0f, -23.0f, 0.0f); + this.Shape4c.setTextureSize(128, 128); + this.Shape4c.mirror = true; + this.setRotation(this.Shape4c, 0.0f, 3.141593f, 0.5235988f); + (this.Shape5 = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.Shape5.setRotationPoint(0.0f, -32.0f, 0.0f); + this.Shape5.setTextureSize(128, 128); + this.Shape5.mirror = true; + this.setRotation(this.Shape5, 0.0f, 0.0f, 0.0f); + (this.Shape5a = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 12, 16); + this.Shape5a.setRotationPoint(0.0f, -32.0f, 0.0f); + this.Shape5a.setTextureSize(128, 128); + this.Shape5a.mirror = true; + this.setRotation(this.Shape5a, 0.0f, 1.570796f, 0.0f); + (this.Shape4d = new ModelRenderer((ModelBase)this, 22, 74)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 8, 5); + this.Shape4d.setRotationPoint(0.0f, -23.0f, -4.0f); + this.Shape4d.setTextureSize(128, 128); + this.Shape4d.mirror = true; + this.setRotation(this.Shape4d, -0.5235988f, 3.141593f, 0.0f); + (this.Shape4e = new ModelRenderer((ModelBase)this, 0, 81)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 5); + this.Shape4e.setRotationPoint(0.0f, -35.0f, 4.0f); + this.Shape4e.setTextureSize(128, 128); + this.Shape4e.mirror = true; + this.setRotation(this.Shape4e, -0.5235988f, 0.0f, 0.0f); + (this.Shape4f = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(0.0f, 0.0f, -1.0f, 5, 4, 2); + this.Shape4f.setRotationPoint(-4.0f, -35.0f, 0.0f); + this.Shape4f.setTextureSize(128, 128); + this.Shape4f.mirror = true; + this.setRotation(this.Shape4f, 0.0f, 3.141593f, 0.5235988f); + (this.Shape4g = new ModelRenderer((ModelBase)this, 0, 74)) + .addBox(0.0f, 0.0f, 0.0f, 5, 4, 2); + this.Shape4g.setRotationPoint(4.0f, -35.0f, -1.0f); + this.Shape4g.setTextureSize(128, 128); + this.Shape4g.mirror = true; + this.setRotation(this.Shape4g, 0.0f, 0.0f, 0.5235988f); + (this.Shape6 = new ModelRenderer((ModelBase)this, 72, 16)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.Shape6.setRotationPoint(-5.0f, -37.0f, -5.0f); + this.Shape6.setTextureSize(128, 128); + this.Shape6.mirror = true; + this.setRotation(this.Shape6, 0.0f, 0.0f, 0.0f); + (this.Shape6a = new ModelRenderer((ModelBase)this, 72, 16)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 10); + this.Shape6a.setRotationPoint(-5.0f, -41.0f, -5.0f); + this.Shape6a.setTextureSize(128, 128); + this.Shape6a.mirror = true; + this.setRotation(this.Shape6a, 0.0f, 0.0f, 0.0f); + (this.Shape7 = new ModelRenderer((ModelBase)this, 96, 115)) + .addBox(0.0f, 0.0f, 0.0f, 8, 4, 8); + this.Shape7.setRotationPoint(-4.0f, -45.0f, -4.0f); + this.Shape7.setTextureSize(128, 128); + this.Shape7.mirror = true; + this.setRotation(this.Shape7, 0.0f, 0.0f, 0.0f); + (this.Shape7a = new ModelRenderer((ModelBase)this, 79, 109)) + .addBox(0.0f, 0.0f, 0.0f, 4, 14, 4); + this.Shape7a.setRotationPoint(-2.0f, -59.0f, -2.0f); + this.Shape7a.setTextureSize(128, 128); + this.Shape7a.mirror = true; + this.setRotation(this.Shape7a, 0.0f, 0.0f, 0.0f); + (this.Shape7b = new ModelRenderer((ModelBase)this, 96, 110)) + .addBox(0.0f, 0.0f, 0.0f, 2, 2, 2); + this.Shape7b.setRotationPoint(-1.0f, -61.0f, -1.0f); + this.Shape7b.setTextureSize(128, 128); + this.Shape7b.mirror = true; + this.setRotation(this.Shape7b, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.Shape1.render(f5); + this.Shape2.render(f5); + this.Shape2b.render(f5); + this.Shape2c.render(f5); + this.Shape2d.render(f5); + this.Shape3.render(f5); + this.Shape3a.render(f5); + this.Shape3b.render(f5); + this.Shape3c.render(f5); + this.Shape4.render(f5); + this.Shape4a.render(f5); + this.Shape4b.render(f5); + this.Shape4c.render(f5); + this.Shape5.render(f5); + this.Shape5a.render(f5); + this.Shape4d.render(f5); + this.Shape4e.render(f5); + this.Shape4f.render(f5); + this.Shape4g.render(f5); + this.Shape6.render(f5); + this.Shape6a.render(f5); + this.Shape7.render(f5); + this.Shape7a.render(f5); + this.Shape7b.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMTui.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMTui.java new file mode 100644 index 0000000..09cbdd7 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMTui.java @@ -0,0 +1,164 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMTui extends MICBM { + ModelRenderer a; + ModelRenderer b; + ModelRenderer c; + ModelRenderer d; + ModelRenderer e; + ModelRenderer f; + ModelRenderer g; + ModelRenderer h; + ModelRenderer i; + ModelRenderer j; + ModelRenderer k; + ModelRenderer l; + ModelRenderer m; + ModelRenderer n; + ModelRenderer o; + ModelRenderer p; + + public MMTui() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.a = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 6, 50, 6); + this.a.setRotationPoint(-3.0f, -26.0f, -3.0f); + this.a.setTextureSize(128, 128); + this.a.mirror = true; + this.setRotation(this.a, 0.0f, 0.0f, 0.0f); + (this.b = new ModelRenderer((ModelBase)this, 0, 57)) + .addBox(-5.0f, 0.0f, -5.0f, 10, 16, 10); + this.b.setRotationPoint(0.0f, 8.0f, 0.0f); + this.b.setTextureSize(128, 128); + this.b.mirror = true; + this.setRotation(this.b, 0.0f, 0.7853982f, 0.0f); + (this.c = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.c.setRotationPoint(0.0f, 12.0f, 0.0f); + this.c.setTextureSize(128, 128); + this.c.mirror = true; + this.setRotation(this.c, 0.0f, 0.7853982f, 0.0f); + (this.d = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.d.setRotationPoint(0.0f, 12.0f, 0.0f); + this.d.setTextureSize(128, 128); + this.d.mirror = true; + this.setRotation(this.d, 0.0f, -0.7853982f, 0.0f); + (this.e = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.e.setRotationPoint(0.0f, -24.0f, 0.0f); + this.e.setTextureSize(128, 128); + this.e.mirror = true; + this.setRotation(this.e, -0.7853982f, 0.7853982f, 0.0f); + (this.f = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.f.setRotationPoint(0.0f, -24.0f, 0.0f); + this.f.setTextureSize(128, 128); + this.f.mirror = true; + this.setRotation(this.f, -0.7853982f, -0.7853982f, 0.0f); + (this.g = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.g.setRotationPoint(0.0f, -17.0f, 0.0f); + this.g.setTextureSize(128, 128); + this.g.mirror = true; + this.setRotation(this.g, 0.0f, 0.7853982f, 0.0f); + (this.h = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.h.setRotationPoint(0.0f, -17.0f, 0.0f); + this.h.setTextureSize(128, 128); + this.h.mirror = true; + this.setRotation(this.h, 0.0f, -0.7853982f, 0.0f); + (this.i = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.i.setRotationPoint(0.0f, 3.0f, 0.0f); + this.i.setTextureSize(128, 128); + this.i.mirror = true; + this.setRotation(this.i, -0.7853982f, -0.7853982f, 0.0f); + (this.j = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.j.setRotationPoint(0.0f, 3.0f, 0.0f); + this.j.setTextureSize(128, 128); + this.j.mirror = true; + this.setRotation(this.j, -0.7853982f, 0.7853982f, 0.0f); + (this.k = new ModelRenderer((ModelBase)this, 0, 86)) + .addBox(2.0f, 0.0f, 2.0f, 2, 8, 2); + this.k.setRotationPoint(0.0f, -29.0f, 0.0f); + this.k.setTextureSize(128, 128); + this.k.mirror = true; + this.setRotation(this.k, 0.0f, 0.0f, 0.0f); + (this.l = new ModelRenderer((ModelBase)this, 0, 86)) + .addBox(2.0f, 0.0f, 2.0f, 2, 8, 2); + this.l.setRotationPoint(0.0f, -29.0f, 0.0f); + this.l.setTextureSize(128, 128); + this.l.mirror = true; + this.setRotation(this.l, 0.0f, 1.570796f, 0.0f); + (this.m = new ModelRenderer((ModelBase)this, 0, 86)) + .addBox(2.0f, 0.0f, 2.0f, 2, 8, 2); + this.m.setRotationPoint(0.0f, -29.0f, 0.0f); + this.m.setTextureSize(128, 128); + this.m.mirror = true; + this.setRotation(this.m, 0.0f, 3.141593f, 0.0f); + (this.n = new ModelRenderer((ModelBase)this, 0, 86)) + .addBox(2.0f, 0.0f, 2.0f, 2, 8, 2); + this.n.setRotationPoint(0.0f, -29.0f, 0.0f); + this.n.setTextureSize(128, 128); + this.n.mirror = true; + this.setRotation(this.n, 0.0f, -1.570796f, 0.0f); + (this.o = new ModelRenderer((ModelBase)this, 10, 86)) + .addBox(-2.0f, 0.0f, -2.0f, 4, 6, 4); + this.o.setRotationPoint(0.0f, -32.0f, 0.0f); + this.o.setTextureSize(128, 128); + this.o.mirror = true; + this.setRotation(this.o, 0.0f, 0.0f, 0.0f); + (this.p = new ModelRenderer((ModelBase)this, 28, 86)) + .addBox(-1.0f, 0.0f, -1.0f, 2, 6, 2); + this.p.setRotationPoint(0.0f, -38.0f, 0.0f); + this.p.setTextureSize(128, 128); + this.p.mirror = true; + this.setRotation(this.p, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float x, final float y, + final float z, final float f3, final float f4, + final float f5) { + super.render(entity, x, y, z, f3, f4, f5); + this.setRotationAngles(x, y, z, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.a.render(f5); + this.b.render(f5); + this.c.render(f5); + this.d.render(f5); + this.e.render(f5); + this.f.render(f5); + this.g.render(f5); + this.h.render(f5); + this.i.render(f5); + this.j.render(f5); + this.k.render(f5); + this.l.render(f5); + this.m.render(f5); + this.n.render(f5); + this.o.render(f5); + this.p.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMWan.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMWan.java new file mode 100644 index 0000000..6f9f0a3 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMWan.java @@ -0,0 +1,300 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMWan extends MICBM { + ModelRenderer MAIN_MODULE; + ModelRenderer MOTOR_MODULE_1; + ModelRenderer MOTOR_MODULE_2; + ModelRenderer MOTOR_MODULE_3; + ModelRenderer MOTOR_MODULE_4; + ModelRenderer C1; + ModelRenderer C2; + ModelRenderer C3; + ModelRenderer C4; + ModelRenderer T1; + ModelRenderer T2; + ModelRenderer T3; + ModelRenderer T4; + ModelRenderer WING_1A; + ModelRenderer WING_2A; + ModelRenderer WING_1B; + ModelRenderer WING_2B; + ModelRenderer WING_3A; + ModelRenderer WING_3B; + ModelRenderer WING_4B; + ModelRenderer WING_4A; + ModelRenderer TOP; + ModelRenderer TOP_WINGS_1; + ModelRenderer TOP_WINGS_2; + ModelRenderer TOP_SUPPORT_1; + ModelRenderer TOP_SUPPORT_2; + ModelRenderer TOP_SUPPORT_3; + ModelRenderer TOP_SUPPORT_4; + ModelRenderer TOP_WINGS_A; + ModelRenderer TOP_WINGS_B; + ModelRenderer TOP_WINGS_C; + ModelRenderer TOP_WINGS_D; + ModelRenderer PORTAL_CORE_ROT; + + public MMWan() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.MAIN_MODULE = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 8, 70, 8); + this.MAIN_MODULE.setRotationPoint(-4.0f, -63.0f, -4.0f); + this.MAIN_MODULE.setTextureSize(128, 128); + this.MAIN_MODULE.mirror = true; + this.setRotation(this.MAIN_MODULE, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_1 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_1.setRotationPoint(-8.0f, 0.0f, -8.0f); + this.MOTOR_MODULE_1.setTextureSize(128, 128); + this.MOTOR_MODULE_1.mirror = true; + this.setRotation(this.MOTOR_MODULE_1, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_2 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_2.setRotationPoint(-8.0f, 0.0f, 2.0f); + this.MOTOR_MODULE_2.setTextureSize(128, 128); + this.MOTOR_MODULE_2.mirror = true; + this.setRotation(this.MOTOR_MODULE_2, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_3 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_3.setRotationPoint(2.0f, 0.0f, -8.0f); + this.MOTOR_MODULE_3.setTextureSize(128, 128); + this.MOTOR_MODULE_3.mirror = true; + this.setRotation(this.MOTOR_MODULE_3, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_4 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_4.setRotationPoint(2.0f, 0.0f, 2.0f); + this.MOTOR_MODULE_4.setTextureSize(128, 128); + this.MOTOR_MODULE_4.mirror = true; + this.setRotation(this.MOTOR_MODULE_4, 0.0f, 0.0f, 0.0f); + (this.C1 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C1.setRotationPoint(-6.0f, 20.0f, -6.0f); + this.C1.setTextureSize(128, 128); + this.C1.mirror = true; + this.setRotation(this.C1, 0.0f, 0.0f, 0.0f); + (this.C2 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C2.setRotationPoint(-6.0f, 20.0f, 4.0f); + this.C2.setTextureSize(128, 128); + this.C2.mirror = true; + this.setRotation(this.C2, 0.0f, 0.0f, 0.0f); + (this.C3 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C3.setRotationPoint(4.0f, 20.0f, -6.0f); + this.C3.setTextureSize(128, 128); + this.C3.mirror = true; + this.setRotation(this.C3, 0.0f, 0.0f, 0.0f); + (this.C4 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C4.setRotationPoint(4.0f, 20.0f, 4.0f); + this.C4.setTextureSize(128, 128); + this.C4.mirror = true; + this.setRotation(this.C4, 0.0f, 0.0f, 0.0f); + (this.T1 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T1.setRotationPoint(-7.0f, 21.0f, -7.0f); + this.T1.setTextureSize(128, 128); + this.T1.mirror = true; + this.setRotation(this.T1, 0.0f, 0.0f, 0.0f); + (this.T2 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T2.setRotationPoint(-7.0f, 21.0f, 3.0f); + this.T2.setTextureSize(128, 128); + this.T2.mirror = true; + this.setRotation(this.T2, 0.0f, 0.0f, 0.0f); + (this.T3 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T3.setRotationPoint(3.0f, 21.0f, -7.0f); + this.T3.setTextureSize(128, 128); + this.T3.mirror = true; + this.setRotation(this.T3, 0.0f, 0.0f, 0.0f); + (this.T4 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T4.setRotationPoint(3.0f, 21.0f, 3.0f); + this.T4.setTextureSize(128, 128); + this.T4.mirror = true; + this.setRotation(this.T4, 0.0f, 0.0f, 0.0f); + (this.WING_1A = new ModelRenderer((ModelBase)this, 43, 15)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 12, 12); + this.WING_1A.setRotationPoint(0.0f, -10.0f, 0.0f); + this.WING_1A.setTextureSize(128, 128); + this.WING_1A.mirror = true; + this.setRotation(this.WING_1A, -0.7853982f, 0.0f, 0.0f); + (this.WING_2A = new ModelRenderer((ModelBase)this, 43, 0)) + .addBox(0.0f, 0.0f, -1.0f, 12, 12, 2); + this.WING_2A.setRotationPoint(0.0f, -10.0f, 0.0f); + this.WING_2A.setTextureSize(128, 128); + this.WING_2A.mirror = true; + this.setRotation(this.WING_2A, 0.0f, 0.0f, 0.7853982f); + (this.WING_1B = new ModelRenderer((ModelBase)this, 72, 28)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 25, 16); + this.WING_1B.setRotationPoint(0.0f, -2.0f, 0.0f); + this.WING_1B.setTextureSize(128, 128); + this.WING_1B.mirror = true; + this.setRotation(this.WING_1B, 0.0f, 0.0f, 0.0f); + (this.WING_2B = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-8.0f, 0.0f, -1.0f, 16, 25, 2); + this.WING_2B.setRotationPoint(0.0f, -2.0f, 0.0f); + this.WING_2B.setTextureSize(128, 128); + this.WING_2B.mirror = true; + this.setRotation(this.WING_2B, 0.0f, 0.0f, 0.0f); + (this.WING_3A = new ModelRenderer((ModelBase)this, 34, 55)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 10, 16); + this.WING_3A.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_3A.setTextureSize(128, 128); + this.WING_3A.mirror = true; + this.setRotation(this.WING_3A, 0.0f, 0.0f, 0.0f); + (this.WING_3B = new ModelRenderer((ModelBase)this, 34, 82)) + .addBox(-1.0f, -6.0f, -6.0f, 2, 12, 12); + this.WING_3B.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_3B.setTextureSize(128, 128); + this.WING_3B.mirror = true; + this.setRotation(this.WING_3B, 0.7853982f, 0.0f, 0.0f); + (this.WING_4B = new ModelRenderer((ModelBase)this, 34, 41)) + .addBox(-8.0f, 0.0f, -1.0f, 16, 10, 2); + this.WING_4B.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_4B.setTextureSize(128, 128); + this.WING_4B.mirror = true; + this.setRotation(this.WING_4B, 0.0f, 0.0f, 0.0f); + (this.WING_4A = new ModelRenderer((ModelBase)this, 34, 107)) + .addBox(-6.0f, -6.0f, -1.0f, 12, 12, 2); + this.WING_4A.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_4A.setTextureSize(128, 128); + this.WING_4A.mirror = true; + this.setRotation(this.WING_4A, 0.0f, 0.0f, -0.7853982f); + (this.TOP = new ModelRenderer((ModelBase)this, 72, 70)) + .addBox(0.0f, 0.0f, 0.0f, 10, 10, 10); + this.TOP.setRotationPoint(-5.0f, -64.0f, -5.0f); + this.TOP.setTextureSize(128, 128); + this.TOP.mirror = true; + this.setRotation(this.TOP, 0.0f, 0.0f, 0.0f); + (this.TOP_WINGS_1 = new ModelRenderer((ModelBase)this, 87, 92)) + .addBox(0.0f, 0.0f, 0.0f, 14, 12, 2); + this.TOP_WINGS_1.setRotationPoint(-7.0f, -64.0f, -1.0f); + this.TOP_WINGS_1.setTextureSize(128, 128); + this.TOP_WINGS_1.mirror = true; + this.setRotation(this.TOP_WINGS_1, 0.0f, 0.0f, 0.0f); + (this.TOP_WINGS_2 = new ModelRenderer((ModelBase)this, 65, 101)) + .addBox(0.0f, 0.0f, 0.0f, 2, 12, 14); + this.TOP_WINGS_2.setRotationPoint(-1.0f, -64.0f, -7.0f); + this.TOP_WINGS_2.setTextureSize(128, 128); + this.TOP_WINGS_2.mirror = true; + this.setRotation(this.TOP_WINGS_2, 0.0f, 0.0f, 0.0f); + (this.TOP_SUPPORT_1 = new ModelRenderer((ModelBase)this, 74, 91)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.TOP_SUPPORT_1.setRotationPoint(-5.0f, -70.0f, -1.0f); + this.TOP_SUPPORT_1.setTextureSize(128, 128); + this.TOP_SUPPORT_1.mirror = true; + this.setRotation(this.TOP_SUPPORT_1, 0.0f, 0.0f, 0.0f); + (this.TOP_SUPPORT_2 = new ModelRenderer((ModelBase)this, 74, 91)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.TOP_SUPPORT_2.setRotationPoint(-1.0f, -70.0f, 3.0f); + this.TOP_SUPPORT_2.setTextureSize(128, 128); + this.TOP_SUPPORT_2.mirror = true; + this.setRotation(this.TOP_SUPPORT_2, 0.0f, 0.0f, 0.0f); + (this.TOP_SUPPORT_3 = new ModelRenderer((ModelBase)this, 74, 91)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.TOP_SUPPORT_3.setRotationPoint(3.0f, -70.0f, -1.0f); + this.TOP_SUPPORT_3.setTextureSize(128, 128); + this.TOP_SUPPORT_3.mirror = true; + this.setRotation(this.TOP_SUPPORT_3, 0.0f, 0.0f, 0.0f); + (this.TOP_SUPPORT_4 = new ModelRenderer((ModelBase)this, 74, 91)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.TOP_SUPPORT_4.setRotationPoint(-1.0f, -70.0f, -5.0f); + this.TOP_SUPPORT_4.setTextureSize(128, 128); + this.TOP_SUPPORT_4.mirror = true; + this.setRotation(this.TOP_SUPPORT_4, 0.0f, 0.0f, 0.0f); + (this.TOP_WINGS_A = new ModelRenderer((ModelBase)this, 64, 91)) + .addBox(0.0f, 0.0f, 0.0f, 2, 3, 2); + this.TOP_WINGS_A.setRotationPoint(-5.0f, -66.0f, -1.0f); + this.TOP_WINGS_A.setTextureSize(128, 128); + this.TOP_WINGS_A.mirror = true; + this.setRotation(this.TOP_WINGS_A, 0.0f, 0.0f, 0.7853982f); + (this.TOP_WINGS_B = new ModelRenderer((ModelBase)this, 64, 91)) + .addBox(0.0f, 0.0f, -2.0f, 2, 3, 2); + this.TOP_WINGS_B.setRotationPoint(-1.0f, -66.0f, 5.0f); + this.TOP_WINGS_B.setTextureSize(128, 128); + this.TOP_WINGS_B.mirror = true; + this.setRotation(this.TOP_WINGS_B, 0.7853982f, 0.0f, 0.0f); + (this.TOP_WINGS_C = new ModelRenderer((ModelBase)this, 64, 91)) + .addBox(-2.0f, 0.0f, 0.0f, 2, 3, 2); + this.TOP_WINGS_C.setRotationPoint(5.0f, -66.0f, -1.0f); + this.TOP_WINGS_C.setTextureSize(128, 128); + this.TOP_WINGS_C.mirror = true; + this.setRotation(this.TOP_WINGS_C, 0.0f, 0.0f, -0.7853982f); + (this.TOP_WINGS_D = new ModelRenderer((ModelBase)this, 64, 91)) + .addBox(0.0f, 0.0f, 0.0f, 2, 3, 2); + this.TOP_WINGS_D.setRotationPoint(-1.0f, -66.0f, -5.0f); + this.TOP_WINGS_D.setTextureSize(128, 128); + this.TOP_WINGS_D.mirror = true; + this.setRotation(this.TOP_WINGS_D, -0.7853982f, 0.0f, 0.0f); + (this.PORTAL_CORE_ROT = new ModelRenderer((ModelBase)this, 99, 107)) + .addBox(-3.0f, -3.0f, -3.0f, 6, 6, 6); + this.PORTAL_CORE_ROT.setRotationPoint(0.0f, -74.0f, 0.0f); + this.PORTAL_CORE_ROT.setTextureSize(128, 128); + this.PORTAL_CORE_ROT.mirror = true; + this.setRotation(this.PORTAL_CORE_ROT, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.MAIN_MODULE.render(f5); + this.MOTOR_MODULE_1.render(f5); + this.MOTOR_MODULE_2.render(f5); + this.MOTOR_MODULE_3.render(f5); + this.MOTOR_MODULE_4.render(f5); + this.C1.render(f5); + this.C2.render(f5); + this.C3.render(f5); + this.C4.render(f5); + this.T1.render(f5); + this.T2.render(f5); + this.T3.render(f5); + this.T4.render(f5); + this.WING_1A.render(f5); + this.WING_2A.render(f5); + this.WING_1B.render(f5); + this.WING_2B.render(f5); + this.WING_3A.render(f5); + this.WING_3B.render(f5); + this.WING_4B.render(f5); + this.WING_4A.render(f5); + this.TOP.render(f5); + this.TOP_WINGS_1.render(f5); + this.TOP_WINGS_2.render(f5); + this.TOP_SUPPORT_1.render(f5); + this.TOP_SUPPORT_2.render(f5); + this.TOP_SUPPORT_3.render(f5); + this.TOP_SUPPORT_4.render(f5); + this.TOP_WINGS_A.render(f5); + this.TOP_WINGS_B.render(f5); + this.TOP_WINGS_C.render(f5); + this.TOP_WINGS_D.render(f5); + this.PORTAL_CORE_ROT.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMXiaoQunDan.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMXiaoQunDan.java new file mode 100644 index 0000000..dc6242b --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMXiaoQunDan.java @@ -0,0 +1,164 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMXiaoQunDan extends MICBM { + ModelRenderer MAIN_MISSILE_MODULE; + ModelRenderer MOTOR_MODULE; + ModelRenderer WING_B_A_1; + ModelRenderer WING_B_B_1; + ModelRenderer WING_T_A_1; + ModelRenderer WING_T_B_1; + ModelRenderer WING_T_A_2; + ModelRenderer WING_T_B_2; + ModelRenderer WING_B_B_2; + ModelRenderer WING_B_A_2; + ModelRenderer WARHEAD_1; + ModelRenderer WARHEAD_2; + ModelRenderer SHRAPNEL_PIECE_1; + ModelRenderer SHRAPNEL_PIECE_2; + ModelRenderer SHRAPNEL_PIECE_3; + ModelRenderer SHRAPNEL_PIECE_4; + + public MMXiaoQunDan() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.MAIN_MISSILE_MODULE = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 6, 50, 6); + this.MAIN_MISSILE_MODULE.setRotationPoint(-3.0f, -26.0f, -3.0f); + this.MAIN_MISSILE_MODULE.setTextureSize(128, 128); + this.MAIN_MISSILE_MODULE.mirror = true; + this.setRotation(this.MAIN_MISSILE_MODULE, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE = new ModelRenderer((ModelBase)this, 0, 57)) + .addBox(-5.0f, 0.0f, -5.0f, 10, 16, 10); + this.MOTOR_MODULE.setRotationPoint(0.0f, 8.0f, 0.0f); + this.MOTOR_MODULE.setTextureSize(128, 128); + this.MOTOR_MODULE.mirror = true; + this.setRotation(this.MOTOR_MODULE, 0.0f, 0.7853982f, 0.0f); + (this.WING_B_A_1 = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.WING_B_A_1.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_B_A_1.setTextureSize(128, 128); + this.WING_B_A_1.mirror = true; + this.setRotation(this.WING_B_A_1, 0.0f, 0.7853982f, 0.0f); + (this.WING_B_B_1 = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.WING_B_B_1.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_B_B_1.setTextureSize(128, 128); + this.WING_B_B_1.mirror = true; + this.setRotation(this.WING_B_B_1, 0.0f, -0.7853982f, 0.0f); + (this.WING_T_A_1 = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.WING_T_A_1.setRotationPoint(0.0f, -24.0f, 0.0f); + this.WING_T_A_1.setTextureSize(128, 128); + this.WING_T_A_1.mirror = true; + this.setRotation(this.WING_T_A_1, -0.7853982f, 0.7853982f, 0.0f); + (this.WING_T_B_1 = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.WING_T_B_1.setRotationPoint(0.0f, -24.0f, 0.0f); + this.WING_T_B_1.setTextureSize(128, 128); + this.WING_T_B_1.mirror = true; + this.setRotation(this.WING_T_B_1, -0.7853982f, -0.7853982f, 0.0f); + (this.WING_T_A_2 = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.WING_T_A_2.setRotationPoint(0.0f, -17.0f, 0.0f); + this.WING_T_A_2.setTextureSize(128, 128); + this.WING_T_A_2.mirror = true; + this.setRotation(this.WING_T_A_2, 0.0f, 0.7853982f, 0.0f); + (this.WING_T_B_2 = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.WING_T_B_2.setRotationPoint(0.0f, -17.0f, 0.0f); + this.WING_T_B_2.setTextureSize(128, 128); + this.WING_T_B_2.mirror = true; + this.setRotation(this.WING_T_B_2, 0.0f, -0.7853982f, 0.0f); + (this.WING_B_B_2 = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.WING_B_B_2.setRotationPoint(0.0f, 3.0f, 0.0f); + this.WING_B_B_2.setTextureSize(128, 128); + this.WING_B_B_2.mirror = true; + this.setRotation(this.WING_B_B_2, -0.7853982f, -0.7853982f, 0.0f); + (this.WING_B_A_2 = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.WING_B_A_2.setRotationPoint(0.0f, 3.0f, 0.0f); + this.WING_B_A_2.setTextureSize(128, 128); + this.WING_B_A_2.mirror = true; + this.setRotation(this.WING_B_A_2, -0.7853982f, 0.7853982f, 0.0f); + (this.WARHEAD_1 = new ModelRenderer((ModelBase)this, 0, 87)) + .addBox(0.0f, 0.0f, 0.0f, 8, 4, 8); + this.WARHEAD_1.setRotationPoint(-4.0f, -30.0f, -4.0f); + this.WARHEAD_1.setTextureSize(128, 128); + this.WARHEAD_1.mirror = true; + this.setRotation(this.WARHEAD_1, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_2 = new ModelRenderer((ModelBase)this, 0, 101)) + .addBox(0.0f, 0.0f, 0.0f, 6, 4, 6); + this.WARHEAD_2.setRotationPoint(-3.0f, -34.0f, -3.0f); + this.WARHEAD_2.setTextureSize(128, 128); + this.WARHEAD_2.mirror = true; + this.setRotation(this.WARHEAD_2, 0.0f, 0.0f, 0.0f); + (this.SHRAPNEL_PIECE_1 = new ModelRenderer((ModelBase)this, 0, 112)) + .addBox(0.0f, 0.0f, 0.0f, 10, 2, 2); + this.SHRAPNEL_PIECE_1.setRotationPoint(-5.0f, -29.0f, -1.0f); + this.SHRAPNEL_PIECE_1.setTextureSize(128, 128); + this.SHRAPNEL_PIECE_1.mirror = true; + this.setRotation(this.SHRAPNEL_PIECE_1, 0.0f, 0.0f, 0.0f); + (this.SHRAPNEL_PIECE_2 = new ModelRenderer((ModelBase)this, 27, 112)) + .addBox(0.0f, 0.0f, 0.0f, 2, 2, 10); + this.SHRAPNEL_PIECE_2.setRotationPoint(-1.0f, -29.0f, -5.0f); + this.SHRAPNEL_PIECE_2.setTextureSize(128, 128); + this.SHRAPNEL_PIECE_2.mirror = true; + this.setRotation(this.SHRAPNEL_PIECE_2, 0.0f, 0.0f, 0.0f); + (this.SHRAPNEL_PIECE_3 = new ModelRenderer((ModelBase)this, 0, 119)) + .addBox(0.0f, 0.0f, 0.0f, 8, 2, 2); + this.SHRAPNEL_PIECE_3.setRotationPoint(-4.0f, -33.0f, -1.0f); + this.SHRAPNEL_PIECE_3.setTextureSize(128, 128); + this.SHRAPNEL_PIECE_3.mirror = true; + this.setRotation(this.SHRAPNEL_PIECE_3, 0.0f, 0.0f, 0.0f); + (this.SHRAPNEL_PIECE_4 = new ModelRenderer((ModelBase)this, 53, 112)) + .addBox(0.0f, 0.0f, 0.0f, 2, 2, 8); + this.SHRAPNEL_PIECE_4.setRotationPoint(-1.0f, -33.0f, -4.0f); + this.SHRAPNEL_PIECE_4.setTextureSize(128, 128); + this.SHRAPNEL_PIECE_4.mirror = true; + this.setRotation(this.SHRAPNEL_PIECE_4, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.MAIN_MISSILE_MODULE.render(f5); + this.MOTOR_MODULE.render(f5); + this.WING_B_A_1.render(f5); + this.WING_B_B_1.render(f5); + this.WING_T_A_1.render(f5); + this.WING_T_B_1.render(f5); + this.WING_T_A_2.render(f5); + this.WING_T_B_2.render(f5); + this.WING_B_B_2.render(f5); + this.WING_B_A_2.render(f5); + this.WARHEAD_1.render(f5); + this.WARHEAD_2.render(f5); + this.SHRAPNEL_PIECE_1.render(f5); + this.SHRAPNEL_PIECE_2.render(f5); + this.SHRAPNEL_PIECE_3.render(f5); + this.SHRAPNEL_PIECE_4.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMYaSuo.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMYaSuo.java new file mode 100644 index 0000000..9ecc52f --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMYaSuo.java @@ -0,0 +1,148 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMYaSuo extends MICBM { + ModelRenderer MAIN_MISSILE_MODULE; + ModelRenderer PROPULSOR_MODULE; + ModelRenderer WING_B_A_1; + ModelRenderer WING_B_B_1; + ModelRenderer WING_T_A_1; + ModelRenderer WING_T_B_1; + ModelRenderer WING_T_A_2; + ModelRenderer WING_T_B_2; + ModelRenderer WING_B_B_2; + ModelRenderer WING_B_A_2; + ModelRenderer WARHEAD_1; + ModelRenderer WARHEAD_2; + ModelRenderer WARHEAD_3; + ModelRenderer WARHEAD_4; + + public MMYaSuo() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.MAIN_MISSILE_MODULE = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 6, 50, 6); + this.MAIN_MISSILE_MODULE.setRotationPoint(-3.0f, -26.0f, -3.0f); + this.MAIN_MISSILE_MODULE.setTextureSize(128, 128); + this.MAIN_MISSILE_MODULE.mirror = true; + this.setRotation(this.MAIN_MISSILE_MODULE, 0.0f, 0.0f, 0.0f); + (this.PROPULSOR_MODULE = new ModelRenderer((ModelBase)this, 0, 57)) + .addBox(-5.0f, 0.0f, -5.0f, 10, 16, 10); + this.PROPULSOR_MODULE.setRotationPoint(0.0f, 8.0f, 0.0f); + this.PROPULSOR_MODULE.setTextureSize(128, 128); + this.PROPULSOR_MODULE.mirror = true; + this.setRotation(this.PROPULSOR_MODULE, 0.0f, 0.7853982f, 0.0f); + (this.WING_B_A_1 = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.WING_B_A_1.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_B_A_1.setTextureSize(128, 128); + this.WING_B_A_1.mirror = true; + this.setRotation(this.WING_B_A_1, 0.0f, 0.7853982f, 0.0f); + (this.WING_B_B_1 = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.WING_B_B_1.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_B_B_1.setTextureSize(128, 128); + this.WING_B_B_1.mirror = true; + this.setRotation(this.WING_B_B_1, 0.0f, -0.7853982f, 0.0f); + (this.WING_T_A_1 = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.WING_T_A_1.setRotationPoint(0.0f, -24.0f, 0.0f); + this.WING_T_A_1.setTextureSize(128, 128); + this.WING_T_A_1.mirror = true; + this.setRotation(this.WING_T_A_1, -0.7853982f, 0.7853982f, 0.0f); + (this.WING_T_B_1 = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.WING_T_B_1.setRotationPoint(0.0f, -24.0f, 0.0f); + this.WING_T_B_1.setTextureSize(128, 128); + this.WING_T_B_1.mirror = true; + this.setRotation(this.WING_T_B_1, -0.7853982f, -0.7853982f, 0.0f); + (this.WING_T_A_2 = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.WING_T_A_2.setRotationPoint(0.0f, -17.0f, 0.0f); + this.WING_T_A_2.setTextureSize(128, 128); + this.WING_T_A_2.mirror = true; + this.setRotation(this.WING_T_A_2, 0.0f, 0.7853982f, 0.0f); + (this.WING_T_B_2 = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.WING_T_B_2.setRotationPoint(0.0f, -17.0f, 0.0f); + this.WING_T_B_2.setTextureSize(128, 128); + this.WING_T_B_2.mirror = true; + this.setRotation(this.WING_T_B_2, 0.0f, -0.7853982f, 0.0f); + (this.WING_B_B_2 = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.WING_B_B_2.setRotationPoint(0.0f, 3.0f, 0.0f); + this.WING_B_B_2.setTextureSize(128, 128); + this.WING_B_B_2.mirror = true; + this.setRotation(this.WING_B_B_2, -0.7853982f, -0.7853982f, 0.0f); + (this.WING_B_A_2 = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.WING_B_A_2.setRotationPoint(0.0f, 3.0f, 0.0f); + this.WING_B_A_2.setTextureSize(128, 128); + this.WING_B_A_2.mirror = true; + this.setRotation(this.WING_B_A_2, -0.7853982f, 0.7853982f, 0.0f); + (this.WARHEAD_1 = new ModelRenderer((ModelBase)this, 0, 85)) + .addBox(-4.0f, 0.0f, -4.0f, 8, 4, 8); + this.WARHEAD_1.setRotationPoint(0.0f, -27.0f, 0.0f); + this.WARHEAD_1.setTextureSize(128, 128); + this.WARHEAD_1.mirror = true; + this.setRotation(this.WARHEAD_1, 0.0f, 0.7853982f, 0.0f); + (this.WARHEAD_2 = new ModelRenderer((ModelBase)this, 33, 85)) + .addBox(-3.0f, 0.0f, -3.0f, 6, 2, 6); + this.WARHEAD_2.setRotationPoint(0.0f, -29.0f, 0.0f); + this.WARHEAD_2.setTextureSize(128, 128); + this.WARHEAD_2.mirror = true; + this.setRotation(this.WARHEAD_2, 0.0f, 0.7853982f, 0.0f); + (this.WARHEAD_3 = new ModelRenderer((ModelBase)this, 59, 85)) + .addBox(-2.0f, 0.0f, -2.0f, 4, 2, 4); + this.WARHEAD_3.setRotationPoint(0.0f, -31.0f, 0.0f); + this.WARHEAD_3.setTextureSize(128, 128); + this.WARHEAD_3.mirror = true; + this.setRotation(this.WARHEAD_3, 0.0f, 0.7853982f, 0.0f); + (this.WARHEAD_4 = new ModelRenderer((ModelBase)this, 9, 87)) + .addBox(-1.0f, 0.0f, -1.0f, 2, 1, 2); + this.WARHEAD_4.setRotationPoint(0.0f, -32.0f, 0.0f); + this.WARHEAD_4.setTextureSize(128, 128); + this.WARHEAD_4.mirror = true; + this.setRotation(this.WARHEAD_4, 0.0f, 0.7853982f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.MAIN_MISSILE_MODULE.render(f5); + this.PROPULSOR_MODULE.render(f5); + this.WING_B_A_1.render(f5); + this.WING_B_B_1.render(f5); + this.WING_T_A_1.render(f5); + this.WING_T_B_1.render(f5); + this.WING_T_A_2.render(f5); + this.WING_T_B_2.render(f5); + this.WING_B_B_2.render(f5); + this.WING_B_A_2.render(f5); + this.WARHEAD_1.render(f5); + this.WARHEAD_2.render(f5); + this.WARHEAD_3.render(f5); + this.WARHEAD_4.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMYuanZi.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMYuanZi.java new file mode 100644 index 0000000..754eeb3 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMYuanZi.java @@ -0,0 +1,236 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMYuanZi extends MICBM { + ModelRenderer MAIN_MODULE; + ModelRenderer MOTOR_MODULE_1; + ModelRenderer MOTOR_MODULE_2; + ModelRenderer MOTOR_MODULE_3; + ModelRenderer MOTOR_MODULE_4; + ModelRenderer C1; + ModelRenderer C2; + ModelRenderer C3; + ModelRenderer C4; + ModelRenderer T1; + ModelRenderer T2; + ModelRenderer T3; + ModelRenderer T4; + ModelRenderer WING_1A; + ModelRenderer WING_2A; + ModelRenderer WING_1B; + ModelRenderer WING_2B; + ModelRenderer WING_3A; + ModelRenderer WING_3B; + ModelRenderer WING_4B; + ModelRenderer WING_4A; + ModelRenderer TOP; + ModelRenderer WARHEAD_1; + ModelRenderer WARHEAD_2; + ModelRenderer WARHEAD_3; + + public MMYuanZi() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.MAIN_MODULE = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 8, 70, 8); + this.MAIN_MODULE.setRotationPoint(-4.0f, -63.0f, -4.0f); + this.MAIN_MODULE.setTextureSize(128, 128); + this.MAIN_MODULE.mirror = true; + this.setRotation(this.MAIN_MODULE, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_1 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_1.setRotationPoint(-8.0f, 0.0f, -8.0f); + this.MOTOR_MODULE_1.setTextureSize(128, 128); + this.MOTOR_MODULE_1.mirror = true; + this.setRotation(this.MOTOR_MODULE_1, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_2 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_2.setRotationPoint(-8.0f, 0.0f, 2.0f); + this.MOTOR_MODULE_2.setTextureSize(128, 128); + this.MOTOR_MODULE_2.mirror = true; + this.setRotation(this.MOTOR_MODULE_2, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_3 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_3.setRotationPoint(2.0f, 0.0f, -8.0f); + this.MOTOR_MODULE_3.setTextureSize(128, 128); + this.MOTOR_MODULE_3.mirror = true; + this.setRotation(this.MOTOR_MODULE_3, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE_4 = new ModelRenderer((ModelBase)this, 0, 79)) + .addBox(0.0f, 0.0f, 0.0f, 6, 20, 6); + this.MOTOR_MODULE_4.setRotationPoint(2.0f, 0.0f, 2.0f); + this.MOTOR_MODULE_4.setTextureSize(128, 128); + this.MOTOR_MODULE_4.mirror = true; + this.setRotation(this.MOTOR_MODULE_4, 0.0f, 0.0f, 0.0f); + (this.C1 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C1.setRotationPoint(-6.0f, 20.0f, -6.0f); + this.C1.setTextureSize(128, 128); + this.C1.mirror = true; + this.setRotation(this.C1, 0.0f, 0.0f, 0.0f); + (this.C2 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C2.setRotationPoint(-6.0f, 20.0f, 4.0f); + this.C2.setTextureSize(128, 128); + this.C2.mirror = true; + this.setRotation(this.C2, 0.0f, 0.0f, 0.0f); + (this.C3 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C3.setRotationPoint(4.0f, 20.0f, -6.0f); + this.C3.setTextureSize(128, 128); + this.C3.mirror = true; + this.setRotation(this.C3, 0.0f, 0.0f, 0.0f); + (this.C4 = new ModelRenderer((ModelBase)this, 0, 106)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 2); + this.C4.setRotationPoint(4.0f, 20.0f, 4.0f); + this.C4.setTextureSize(128, 128); + this.C4.mirror = true; + this.setRotation(this.C4, 0.0f, 0.0f, 0.0f); + (this.T1 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T1.setRotationPoint(-7.0f, 21.0f, -7.0f); + this.T1.setTextureSize(128, 128); + this.T1.mirror = true; + this.setRotation(this.T1, 0.0f, 0.0f, 0.0f); + (this.T2 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T2.setRotationPoint(-7.0f, 21.0f, 3.0f); + this.T2.setTextureSize(128, 128); + this.T2.mirror = true; + this.setRotation(this.T2, 0.0f, 0.0f, 0.0f); + (this.T3 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T3.setRotationPoint(3.0f, 21.0f, -7.0f); + this.T3.setTextureSize(128, 128); + this.T3.mirror = true; + this.setRotation(this.T3, 0.0f, 0.0f, 0.0f); + (this.T4 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.T4.setRotationPoint(3.0f, 21.0f, 3.0f); + this.T4.setTextureSize(128, 128); + this.T4.mirror = true; + this.setRotation(this.T4, 0.0f, 0.0f, 0.0f); + (this.WING_1A = new ModelRenderer((ModelBase)this, 43, 15)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 12, 12); + this.WING_1A.setRotationPoint(0.0f, -10.0f, 0.0f); + this.WING_1A.setTextureSize(128, 128); + this.WING_1A.mirror = true; + this.setRotation(this.WING_1A, -0.7853982f, 0.0f, 0.0f); + (this.WING_2A = new ModelRenderer((ModelBase)this, 43, 0)) + .addBox(0.0f, 0.0f, -1.0f, 12, 12, 2); + this.WING_2A.setRotationPoint(0.0f, -10.0f, 0.0f); + this.WING_2A.setTextureSize(128, 128); + this.WING_2A.mirror = true; + this.setRotation(this.WING_2A, 0.0f, 0.0f, 0.7853982f); + (this.WING_1B = new ModelRenderer((ModelBase)this, 72, 28)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 25, 16); + this.WING_1B.setRotationPoint(0.0f, -2.0f, 0.0f); + this.WING_1B.setTextureSize(128, 128); + this.WING_1B.mirror = true; + this.setRotation(this.WING_1B, 0.0f, 0.0f, 0.0f); + (this.WING_2B = new ModelRenderer((ModelBase)this, 72, 0)) + .addBox(-8.0f, 0.0f, -1.0f, 16, 25, 2); + this.WING_2B.setRotationPoint(0.0f, -2.0f, 0.0f); + this.WING_2B.setTextureSize(128, 128); + this.WING_2B.mirror = true; + this.setRotation(this.WING_2B, 0.0f, 0.0f, 0.0f); + (this.WING_3A = new ModelRenderer((ModelBase)this, 34, 55)) + .addBox(-1.0f, 0.0f, -8.0f, 2, 10, 16); + this.WING_3A.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_3A.setTextureSize(128, 128); + this.WING_3A.mirror = true; + this.setRotation(this.WING_3A, 0.0f, 0.0f, 0.0f); + (this.WING_3B = new ModelRenderer((ModelBase)this, 34, 82)) + .addBox(-1.0f, -6.0f, -6.0f, 2, 12, 12); + this.WING_3B.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_3B.setTextureSize(128, 128); + this.WING_3B.mirror = true; + this.setRotation(this.WING_3B, 0.7853982f, 0.0f, 0.0f); + (this.WING_4B = new ModelRenderer((ModelBase)this, 34, 41)) + .addBox(-8.0f, 0.0f, -1.0f, 16, 10, 2); + this.WING_4B.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_4B.setTextureSize(128, 128); + this.WING_4B.mirror = true; + this.setRotation(this.WING_4B, 0.0f, 0.0f, 0.0f); + (this.WING_4A = new ModelRenderer((ModelBase)this, 34, 107)) + .addBox(-6.0f, -6.0f, -1.0f, 12, 12, 2); + this.WING_4A.setRotationPoint(0.0f, -41.0f, 0.0f); + this.WING_4A.setTextureSize(128, 128); + this.WING_4A.mirror = true; + this.setRotation(this.WING_4A, 0.0f, 0.0f, -0.7853982f); + (this.TOP = new ModelRenderer((ModelBase)this, 72, 70)) + .addBox(0.0f, 0.0f, 0.0f, 10, 10, 10); + this.TOP.setRotationPoint(-5.0f, -64.0f, -5.0f); + this.TOP.setTextureSize(128, 128); + this.TOP.mirror = true; + this.setRotation(this.TOP, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_1 = new ModelRenderer((ModelBase)this, 72, 91)) + .addBox(0.0f, 0.0f, 0.0f, 8, 6, 8); + this.WARHEAD_1.setRotationPoint(-4.0f, -70.0f, -4.0f); + this.WARHEAD_1.setTextureSize(128, 128); + this.WARHEAD_1.mirror = true; + this.setRotation(this.WARHEAD_1, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_2 = new ModelRenderer((ModelBase)this, 72, 106)) + .addBox(0.0f, 0.0f, 0.0f, 6, 6, 6); + this.WARHEAD_2.setRotationPoint(-3.0f, -76.0f, -3.0f); + this.WARHEAD_2.setTextureSize(128, 128); + this.WARHEAD_2.mirror = true; + this.setRotation(this.WARHEAD_2, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_3 = new ModelRenderer((ModelBase)this, 110, 91)) + .addBox(0.0f, 0.0f, 0.0f, 4, 6, 4); + this.WARHEAD_3.setRotationPoint(-2.0f, -82.0f, -2.0f); + this.WARHEAD_3.setTextureSize(128, 128); + this.WARHEAD_3.mirror = true; + this.setRotation(this.WARHEAD_3, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.MAIN_MODULE.render(f5); + this.MOTOR_MODULE_1.render(f5); + this.MOTOR_MODULE_2.render(f5); + this.MOTOR_MODULE_3.render(f5); + this.MOTOR_MODULE_4.render(f5); + this.C1.render(f5); + this.C2.render(f5); + this.C3.render(f5); + this.C4.render(f5); + this.T1.render(f5); + this.T2.render(f5); + this.T3.render(f5); + this.T4.render(f5); + this.WING_1A.render(f5); + this.WING_2A.render(f5); + this.WING_1B.render(f5); + this.WING_2B.render(f5); + this.WING_3A.render(f5); + this.WING_3B.render(f5); + this.WING_4B.render(f5); + this.WING_4A.render(f5); + this.TOP.render(f5); + this.WARHEAD_1.render(f5); + this.WARHEAD_2.render(f5); + this.WARHEAD_3.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMZhen.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMZhen.java new file mode 100644 index 0000000..343a16f --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMZhen.java @@ -0,0 +1,188 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMZhen extends MICBM { + ModelRenderer A; + ModelRenderer B; + ModelRenderer C; + ModelRenderer D; + ModelRenderer E; + ModelRenderer F; + ModelRenderer G; + ModelRenderer H; + ModelRenderer I; + ModelRenderer J; + ModelRenderer K; + ModelRenderer L; + ModelRenderer M; + ModelRenderer N; + ModelRenderer O; + ModelRenderer P; + ModelRenderer Q; + ModelRenderer R; + ModelRenderer S; + + public MMZhen() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.A = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 6, 50, 6); + this.A.setRotationPoint(-3.0f, -26.0f, -3.0f); + this.A.setTextureSize(128, 128); + this.A.mirror = true; + this.setRotation(this.A, 0.0f, 0.0f, 0.0f); + (this.B = new ModelRenderer((ModelBase)this, 0, 57)) + .addBox(-5.0f, 0.0f, -5.0f, 10, 16, 10); + this.B.setRotationPoint(0.0f, 8.0f, 0.0f); + this.B.setTextureSize(128, 128); + this.B.mirror = true; + this.setRotation(this.B, 0.0f, 0.7853982f, 0.0f); + (this.C = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.C.setRotationPoint(0.0f, 12.0f, 0.0f); + this.C.setTextureSize(128, 128); + this.C.mirror = true; + this.setRotation(this.C, 0.0f, 0.7853982f, 0.0f); + (this.D = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.D.setRotationPoint(0.0f, 12.0f, 0.0f); + this.D.setTextureSize(128, 128); + this.D.mirror = true; + this.setRotation(this.D, 0.0f, -0.7853982f, 0.0f); + (this.E = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.E.setRotationPoint(0.0f, -24.0f, 0.0f); + this.E.setTextureSize(128, 128); + this.E.mirror = true; + this.setRotation(this.E, -0.7853982f, 0.7853982f, 0.0f); + (this.F = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.F.setRotationPoint(0.0f, -24.0f, 0.0f); + this.F.setTextureSize(128, 128); + this.F.mirror = true; + this.setRotation(this.F, -0.7853982f, -0.7853982f, 0.0f); + (this.G = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.G.setRotationPoint(0.0f, -17.0f, 0.0f); + this.G.setTextureSize(128, 128); + this.G.mirror = true; + this.setRotation(this.G, 0.0f, 0.7853982f, 0.0f); + (this.H = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.H.setRotationPoint(0.0f, -17.0f, 0.0f); + this.H.setTextureSize(128, 128); + this.H.mirror = true; + this.setRotation(this.H, 0.0f, -0.7853982f, 0.0f); + (this.I = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.I.setRotationPoint(0.0f, 3.0f, 0.0f); + this.I.setTextureSize(128, 128); + this.I.mirror = true; + this.setRotation(this.I, -0.7853982f, -0.7853982f, 0.0f); + (this.J = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.J.setRotationPoint(0.0f, 3.0f, 0.0f); + this.J.setTextureSize(128, 128); + this.J.mirror = true; + this.setRotation(this.J, -0.7853982f, 0.7853982f, 0.0f); + (this.K = new ModelRenderer((ModelBase)this, 44, 62)) + .addBox(0.0f, 0.0f, 0.0f, 8, 2, 8); + this.K.setRotationPoint(-4.0f, -28.0f, -4.0f); + this.K.setTextureSize(128, 128); + this.K.mirror = true; + this.setRotation(this.K, 0.0f, 0.0f, 0.0f); + (this.L = new ModelRenderer((ModelBase)this, 72, 62)) + .addBox(0.0f, 0.0f, 0.0f, 8, 1, 2); + this.L.setRotationPoint(-3.0f, -28.0f, -1.0f); + this.L.setTextureSize(128, 128); + this.L.mirror = true; + this.setRotation(this.L, 0.0f, 0.0f, -0.9773844f); + (this.M = new ModelRenderer((ModelBase)this, 72, 62)) + .addBox(0.0f, 0.0f, 0.0f, 8, 1, 2); + this.M.setRotationPoint(3.0f, -28.0f, 1.0f); + this.M.setTextureSize(128, 128); + this.M.mirror = true; + this.setRotation(this.M, 0.0f, 3.141593f, -0.9773844f); + (this.N = new ModelRenderer((ModelBase)this, 44, 74)) + .addBox(0.0f, 0.0f, 0.0f, 6, 2, 6); + this.N.setRotationPoint(-3.0f, -35.0f, -3.0f); + this.N.setTextureSize(128, 128); + this.N.mirror = true; + this.setRotation(this.N, 0.0f, 0.0f, 0.0f); + (this.O = new ModelRenderer((ModelBase)this, 44, 85)) + .addBox(0.0f, 0.0f, 0.0f, 6, 6, 8); + this.O.setRotationPoint(-4.0f, -41.0f, -4.0f); + this.O.setTextureSize(128, 128); + this.O.mirror = true; + this.setRotation(this.O, 0.0f, 0.0f, 0.0f); + (this.P = new ModelRenderer((ModelBase)this, 75, 92)) + .addBox(0.0f, 0.0f, 0.0f, 7, 2, 8); + this.P.setRotationPoint(-4.0f, -41.0f, -4.0f); + this.P.setTextureSize(128, 128); + this.P.mirror = true; + this.setRotation(this.P, 0.0f, 0.0f, -0.1745329f); + (this.Q = new ModelRenderer((ModelBase)this, 44, 101)) + .addBox(0.0f, 0.0f, 0.0f, 5, 2, 8); + this.Q.setRotationPoint(3.0f, -42.0f, -4.0f); + this.Q.setTextureSize(128, 128); + this.Q.mirror = true; + this.setRotation(this.Q, 0.0f, 0.0f, 1.186824f); + (this.R = new ModelRenderer((ModelBase)this, 73, 85)) + .addBox(0.0f, 0.0f, 0.0f, 6, 2, 2); + this.R.setRotationPoint(-3.0f, -39.0f, -6.0f); + this.R.setTextureSize(128, 128); + this.R.mirror = true; + this.setRotation(this.R, 0.0f, 0.0f, 0.2094395f); + (this.S = new ModelRenderer((ModelBase)this, 92, 83)) + .addBox(4.0f, 0.0f, 0.0f, 2, 2, 4); + this.S.setRotationPoint(-3.0f, -39.0f, -6.0f); + this.S.setTextureSize(128, 128); + this.S.mirror = true; + this.setRotation(this.S, 0.0f, 0.0f, 0.2094395f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.A.render(f5); + this.B.render(f5); + this.C.render(f5); + this.D.render(f5); + this.E.render(f5); + this.F.render(f5); + this.G.render(f5); + this.H.render(f5); + this.I.render(f5); + this.J.render(f5); + this.K.render(f5); + this.L.render(f5); + this.M.render(f5); + this.N.render(f5); + this.O.render(f5); + this.P.render(f5); + this.Q.render(f5); + this.R.render(f5); + this.S.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/daodan/MMZhuiZhong.java b/src/main/java/icbm/zhapin/muoxing/daodan/MMZhuiZhong.java new file mode 100644 index 0000000..9ccd489 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/daodan/MMZhuiZhong.java @@ -0,0 +1,148 @@ +package icbm.zhapin.muoxing.daodan; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MMZhuiZhong extends MICBM { + ModelRenderer MAIN_MODULE; + ModelRenderer MOTOR_MODULE; + ModelRenderer WING_1A; + ModelRenderer WING_2A; + ModelRenderer WING_3B; + ModelRenderer WING_4B; + ModelRenderer WING_3A; + ModelRenderer WING_4A; + ModelRenderer WING_2B; + ModelRenderer WING_1B; + ModelRenderer WARHEAD_1; + ModelRenderer WARHEAD_2; + ModelRenderer WARHEAD_3; + ModelRenderer WARHEAD_4; + + public MMZhuiZhong() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.MAIN_MODULE = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 6, 50, 6); + this.MAIN_MODULE.setRotationPoint(-3.0f, -26.0f, -3.0f); + this.MAIN_MODULE.setTextureSize(128, 128); + this.MAIN_MODULE.mirror = true; + this.setRotation(this.MAIN_MODULE, 0.0f, 0.0f, 0.0f); + (this.MOTOR_MODULE = new ModelRenderer((ModelBase)this, 0, 57)) + .addBox(-5.0f, 0.0f, -5.0f, 10, 16, 10); + this.MOTOR_MODULE.setRotationPoint(0.0f, 8.0f, 0.0f); + this.MOTOR_MODULE.setTextureSize(128, 128); + this.MOTOR_MODULE.mirror = true; + this.setRotation(this.MOTOR_MODULE, 0.0f, 0.7853982f, 0.0f); + (this.WING_1A = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.WING_1A.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_1A.setTextureSize(128, 128); + this.WING_1A.mirror = true; + this.setRotation(this.WING_1A, 0.0f, 0.7853982f, 0.0f); + (this.WING_2A = new ModelRenderer((ModelBase)this, 59, 26)) + .addBox(-1.0f, 0.0f, -9.0f, 2, 12, 18); + this.WING_2A.setRotationPoint(0.0f, 12.0f, 0.0f); + this.WING_2A.setTextureSize(128, 128); + this.WING_2A.mirror = true; + this.setRotation(this.WING_2A, 0.0f, -0.7853982f, 0.0f); + (this.WING_3B = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.WING_3B.setRotationPoint(0.0f, -24.0f, 0.0f); + this.WING_3B.setTextureSize(128, 128); + this.WING_3B.mirror = true; + this.setRotation(this.WING_3B, -0.7853982f, 0.7853982f, 0.0f); + (this.WING_4B = new ModelRenderer((ModelBase)this, 59, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 10, 10); + this.WING_4B.setRotationPoint(0.0f, -24.0f, 0.0f); + this.WING_4B.setTextureSize(128, 128); + this.WING_4B.mirror = true; + this.setRotation(this.WING_4B, -0.7853982f, -0.7853982f, 0.0f); + (this.WING_3A = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.WING_3A.setRotationPoint(0.0f, -17.0f, 0.0f); + this.WING_3A.setTextureSize(128, 128); + this.WING_3A.mirror = true; + this.setRotation(this.WING_3A, 0.0f, 0.7853982f, 0.0f); + (this.WING_4A = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(-1.0f, 0.0f, -7.0f, 2, 10, 14); + this.WING_4A.setRotationPoint(0.0f, -17.0f, 0.0f); + this.WING_4A.setTextureSize(128, 128); + this.WING_4A.mirror = true; + this.setRotation(this.WING_4A, 0.0f, -0.7853982f, 0.0f); + (this.WING_2B = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.WING_2B.setRotationPoint(0.0f, 3.0f, 0.0f); + this.WING_2B.setTextureSize(128, 128); + this.WING_2B.mirror = true; + this.setRotation(this.WING_2B, -0.7853982f, -0.7853982f, 0.0f); + (this.WING_1B = new ModelRenderer((ModelBase)this, 25, 26)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 13, 13); + this.WING_1B.setRotationPoint(0.0f, 3.0f, 0.0f); + this.WING_1B.setTextureSize(128, 128); + this.WING_1B.mirror = true; + this.setRotation(this.WING_1B, -0.7853982f, 0.7853982f, 0.0f); + (this.WARHEAD_1 = new ModelRenderer((ModelBase)this, 0, 85)) + .addBox(0.0f, 0.0f, 0.0f, 4, 6, 4); + this.WARHEAD_1.setRotationPoint(-2.0f, -32.0f, -2.0f); + this.WARHEAD_1.setTextureSize(128, 128); + this.WARHEAD_1.mirror = true; + this.setRotation(this.WARHEAD_1, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_2 = new ModelRenderer((ModelBase)this, 0, 97)) + .addBox(0.0f, 0.0f, 0.0f, 6, 6, 6); + this.WARHEAD_2.setRotationPoint(-3.0f, -38.0f, -3.0f); + this.WARHEAD_2.setTextureSize(128, 128); + this.WARHEAD_2.mirror = true; + this.setRotation(this.WARHEAD_2, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_3 = new ModelRenderer((ModelBase)this, 26, 97)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.WARHEAD_3.setRotationPoint(-2.0f, -41.0f, -2.0f); + this.WARHEAD_3.setTextureSize(128, 128); + this.WARHEAD_3.mirror = true; + this.setRotation(this.WARHEAD_3, 0.0f, 0.0f, 0.0f); + (this.WARHEAD_4 = new ModelRenderer((ModelBase)this, 26, 105)) + .addBox(0.0f, 0.0f, 0.0f, 2, 3, 2); + this.WARHEAD_4.setRotationPoint(-1.0f, -44.0f, -1.0f); + this.WARHEAD_4.setTextureSize(128, 128); + this.WARHEAD_4.mirror = true; + this.setRotation(this.WARHEAD_4, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5); + } + + @Override + public void render(final float f5) { + this.MAIN_MODULE.render(f5); + this.MOTOR_MODULE.render(f5); + this.WING_1A.render(f5); + this.WING_2A.render(f5); + this.WING_3B.render(f5); + this.WING_4B.render(f5); + this.WING_3A.render(f5); + this.WING_4A.render(f5); + this.WING_2B.render(f5); + this.WING_1B.render(f5); + this.WARHEAD_1.render(f5); + this.WARHEAD_2.render(f5); + this.WARHEAD_3.render(f5); + this.WARHEAD_4.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MDianCiQi.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MDianCiQi.java new file mode 100644 index 0000000..b2acc4f --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MDianCiQi.java @@ -0,0 +1,119 @@ +package icbm.zhapin.muoxing.jiqi; + +import net.minecraft.client.model.ModelRenderer; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; + +@SideOnly(Side.CLIENT) +public class MDianCiQi extends ModelBase +{ + ModelRenderer Base; + ModelRenderer Support; + ModelRenderer Turret_Support; + ModelRenderer Main_Coil; + ModelRenderer Support_Beam_A1; + ModelRenderer Support_Beam_B1; + ModelRenderer Support_Beam_C1; + ModelRenderer Support_Beam_D1; + ModelRenderer Support_Beam_DB1; + ModelRenderer Support_Beam_CA1; + ModelRenderer Support_Beam_CA2; + ModelRenderer Support_Beam_DB2; + + public MDianCiQi() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Base = new ModelRenderer((ModelBase)this, 0, 0)).addBox(0.0f, 0.0f, 0.0f, 16, 6, 16); + this.Base.setRotationPoint(-8.0f, 18.0f, -8.0f); + this.Base.setTextureSize(128, 128); + this.Base.mirror = true; + this.setRotation(this.Base, 0.0f, 0.0f, 0.0f); + (this.Support = new ModelRenderer((ModelBase)this, 0, 24)).addBox(0.0f, 0.0f, 0.0f, 10, 8, 10); + this.Support.setRotationPoint(-5.0f, 10.0f, -5.0f); + this.Support.setTextureSize(128, 128); + this.Support.mirror = true; + this.setRotation(this.Support, 0.0f, 0.0f, 0.0f); + (this.Turret_Support = new ModelRenderer((ModelBase)this, 0, 44)).addBox(-7.0f, 0.0f, -7.0f, 14, 1, 14); + this.Turret_Support.setRotationPoint(0.0f, 9.0f, 0.0f); + this.Turret_Support.setTextureSize(128, 128); + this.Turret_Support.mirror = true; + this.setRotation(this.Turret_Support, 0.0f, 0.7853982f, 0.0f); + (this.Main_Coil = new ModelRenderer((ModelBase)this, 66, 0)).addBox(-2.0f, 0.0f, -2.0f, 4, 11, 4); + this.Main_Coil.setRotationPoint(0.0f, -5.0f, 0.0f); + this.Main_Coil.setTextureSize(128, 128); + this.Main_Coil.mirror = true; + this.setRotation(this.Main_Coil, 0.0f, 0.0f, 0.0f); + (this.Support_Beam_A1 = new ModelRenderer((ModelBase)this, 66, 16)).addBox(8.0f, 0.0f, -1.0f, 1, 18, 2); + this.Support_Beam_A1.setRotationPoint(0.0f, -8.0f, 0.0f); + this.Support_Beam_A1.setTextureSize(128, 128); + this.Support_Beam_A1.mirror = true; + this.setRotation(this.Support_Beam_A1, 0.0f, 0.0f, 0.0f); + (this.Support_Beam_B1 = new ModelRenderer((ModelBase)this, 73, 16)).addBox(-1.0f, 0.0f, -9.0f, 2, 18, 1); + this.Support_Beam_B1.setRotationPoint(0.0f, -8.0f, 0.0f); + this.Support_Beam_B1.setTextureSize(128, 128); + this.Support_Beam_B1.mirror = true; + this.setRotation(this.Support_Beam_B1, 0.0f, 0.0f, 0.0f); + (this.Support_Beam_C1 = new ModelRenderer((ModelBase)this, 66, 16)).addBox(-9.0f, 0.0f, -1.0f, 1, 18, 2); + this.Support_Beam_C1.setRotationPoint(0.0f, -8.0f, 0.0f); + this.Support_Beam_C1.setTextureSize(128, 128); + this.Support_Beam_C1.mirror = true; + this.setRotation(this.Support_Beam_C1, 0.0f, 0.0f, 0.0f); + (this.Support_Beam_D1 = new ModelRenderer((ModelBase)this, 73, 16)).addBox(-1.0f, 0.0f, 8.0f, 2, 18, 1); + this.Support_Beam_D1.setRotationPoint(0.0f, -8.0f, 0.0f); + this.Support_Beam_D1.setTextureSize(128, 128); + this.Support_Beam_D1.mirror = true; + this.setRotation(this.Support_Beam_D1, 0.0f, 0.0f, 0.0f); + (this.Support_Beam_DB1 = new ModelRenderer((ModelBase)this, 85, 0)).addBox(-1.0f, 0.0f, -8.0f, 2, 1, 16); + this.Support_Beam_DB1.setRotationPoint(0.0f, 3.0f, 0.0f); + this.Support_Beam_DB1.setTextureSize(128, 128); + this.Support_Beam_DB1.mirror = true; + this.setRotation(this.Support_Beam_DB1, 0.0f, 0.0f, 0.0f); + (this.Support_Beam_CA1 = new ModelRenderer((ModelBase)this, 85, 19)).addBox(-8.0f, 0.0f, -1.0f, 16, 1, 2); + this.Support_Beam_CA1.setRotationPoint(0.0f, 3.0f, 0.0f); + this.Support_Beam_CA1.setTextureSize(128, 128); + this.Support_Beam_CA1.mirror = true; + this.setRotation(this.Support_Beam_CA1, 0.0f, 0.0f, 0.0f); + (this.Support_Beam_CA2 = new ModelRenderer((ModelBase)this, 85, 19)).addBox(-8.0f, 0.0f, -1.0f, 16, 1, 2); + this.Support_Beam_CA2.setRotationPoint(0.0f, -3.0f, 0.0f); + this.Support_Beam_CA2.setTextureSize(128, 128); + this.Support_Beam_CA2.mirror = true; + this.setRotation(this.Support_Beam_CA2, 0.0f, 0.0f, 0.0f); + (this.Support_Beam_DB2 = new ModelRenderer((ModelBase)this, 85, 0)).addBox(-1.0f, 0.0f, -8.0f, 2, 1, 16); + this.Support_Beam_DB2.setRotationPoint(0.0f, -3.0f, 0.0f); + this.Support_Beam_DB2.setTextureSize(128, 128); + this.Support_Beam_DB2.mirror = true; + this.setRotation(this.Support_Beam_DB2, 0.0f, 0.0f, 0.0f); + } + + public void render(final float rotation, final float f5) { + this.Base.render(f5); + this.Support.render(f5); + this.Turret_Support.rotateAngleY = -rotation; + this.Turret_Support.render(f5); + this.Main_Coil.rotateAngleY = -rotation; + this.Main_Coil.render(f5); + this.Support_Beam_A1.rotateAngleY = rotation; + this.Support_Beam_A1.render(f5); + this.Support_Beam_B1.rotateAngleY = rotation; + this.Support_Beam_B1.render(f5); + this.Support_Beam_C1.rotateAngleY = rotation; + this.Support_Beam_C1.render(f5); + this.Support_Beam_D1.rotateAngleY = rotation; + this.Support_Beam_D1.render(f5); + this.Support_Beam_DB1.rotateAngleY = rotation; + this.Support_Beam_DB1.render(f5); + this.Support_Beam_CA1.rotateAngleY = rotation; + this.Support_Beam_CA1.render(f5); + this.Support_Beam_CA2.rotateAngleY = rotation; + this.Support_Beam_CA2.render(f5); + this.Support_Beam_DB2.rotateAngleY = rotation; + this.Support_Beam_DB2.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDi0.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDi0.java new file mode 100644 index 0000000..f4aab8b --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDi0.java @@ -0,0 +1,57 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +@SideOnly(Side.CLIENT) +public class MFaSheDi0 extends ModelBase { + ModelRenderer Shape1; + ModelRenderer Shape6; + ModelRenderer Shape8; + ModelRenderer Shape13; + + public MFaSheDi0() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape1 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 16, 1, 16); + this.Shape1.setRotationPoint(-8.0f, 23.0f, -8.0f); + this.Shape1.setTextureSize(128, 128); + this.Shape1.mirror = true; + this.setRotation(this.Shape1, 0.0f, 0.0f, 0.0f); + (this.Shape6 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 16, 1, 16); + this.Shape6.setRotationPoint(-8.0f, 19.0f, -8.0f); + this.Shape6.setTextureSize(128, 128); + this.Shape6.mirror = true; + this.setRotation(this.Shape6, 0.0f, 0.0f, 0.0f); + (this.Shape8 = new ModelRenderer((ModelBase)this, 0, 20)) + .addBox(0.0f, 0.0f, 0.0f, 2, 12, 2); + this.Shape8.setRotationPoint(6.0f, 11.0f, -1.0f); + this.Shape8.setTextureSize(128, 128); + this.Shape8.mirror = true; + this.setRotation(this.Shape8, 0.0f, 0.0f, 0.0f); + (this.Shape13 = new ModelRenderer((ModelBase)this, 0, 20)) + .addBox(0.0f, 0.0f, 0.0f, 2, 12, 2); + this.Shape13.setRotationPoint(-7.0f, 11.0f, -1.0f); + this.Shape13.setTextureSize(128, 128); + this.Shape13.mirror = true; + this.setRotation(this.Shape13, 0.0f, 0.0f, 0.0f); + } + + public void render(final float f5) { + this.Shape1.render(f5); + this.Shape6.render(f5); + this.Shape8.render(f5); + this.Shape13.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDi1.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDi1.java new file mode 100644 index 0000000..b0a3a88 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDi1.java @@ -0,0 +1,57 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +@SideOnly(Side.CLIENT) +public class MFaSheDi1 extends ModelBase { + ModelRenderer Shape1; + ModelRenderer Shape6; + ModelRenderer Shape2; + ModelRenderer Shape3; + + public MFaSheDi1() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape1 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 16, 1, 16); + this.Shape1.setRotationPoint(-8.0f, 23.0f, -8.0f); + this.Shape1.setTextureSize(128, 128); + this.Shape1.mirror = true; + this.setRotation(this.Shape1, 0.0f, 0.0f, 0.0f); + (this.Shape6 = new ModelRenderer((ModelBase)this, 0, 111)) + .addBox(0.0f, 0.0f, 0.0f, 16, 1, 16); + this.Shape6.setRotationPoint(-8.0f, 19.0f, -8.0f); + this.Shape6.setTextureSize(128, 128); + this.Shape6.mirror = true; + this.setRotation(this.Shape6, 0.0f, 0.0f, 0.0f); + (this.Shape2 = new ModelRenderer((ModelBase)this, 63, 0)) + .addBox(0.0f, 0.0f, 0.0f, 2, 4, 2); + this.Shape2.setRotationPoint(-8.0f, 20.0f, -1.0f); + this.Shape2.setTextureSize(128, 128); + this.Shape2.mirror = true; + this.setRotation(this.Shape2, 0.0f, 0.0f, 0.0f); + (this.Shape3 = new ModelRenderer((ModelBase)this, 63, 0)) + .addBox(0.0f, 0.0f, 0.0f, 2, 4, 2); + this.Shape3.setRotationPoint(6.0f, 20.0f, -1.0f); + this.Shape3.setTextureSize(128, 128); + this.Shape3.mirror = true; + this.setRotation(this.Shape3, 0.0f, 0.0f, 0.0f); + } + + public void render(final float f5) { + this.Shape1.render(f5); + this.Shape6.render(f5); + this.Shape2.render(f5); + this.Shape3.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDi2.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDi2.java new file mode 100644 index 0000000..22a9e14 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDi2.java @@ -0,0 +1,41 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +@SideOnly(Side.CLIENT) +public class MFaSheDi2 extends ModelBase { + ModelRenderer Shape12; + ModelRenderer Shape13; + + public MFaSheDi2() { + super.textureWidth = 256; + super.textureHeight = 256; + (this.Shape12 = new ModelRenderer((ModelBase)this, 0, 80)) + .addBox(0.0f, 0.0f, 0.0f, 11, 6, 6); + this.Shape12.setRotationPoint(-5.0f, 18.0f, -6.0f); + this.Shape12.setTextureSize(256, 256); + this.Shape12.mirror = true; + this.setRotation(this.Shape12, 0.0f, 0.0f, 0.0f); + (this.Shape13 = new ModelRenderer((ModelBase)this, 0, 80)) + .addBox(0.0f, 0.0f, 0.0f, 11, 6, 6); + this.Shape13.setRotationPoint(-5.0f, 18.0f, 1.0f); + this.Shape13.setTextureSize(256, 256); + this.Shape13.mirror = true; + this.setRotation(this.Shape13, 0.0f, 0.0f, 0.0f); + } + + public void render(final float f5) { + this.Shape12.render(f5); + this.Shape13.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDiRail0.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDiRail0.java new file mode 100644 index 0000000..34c4fd4 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDiRail0.java @@ -0,0 +1,113 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +@SideOnly(Side.CLIENT) +public class MFaSheDiRail0 extends ModelBase { + ModelRenderer Shape7; + ModelRenderer Shape8; + ModelRenderer Shape9; + ModelRenderer Shape10; + ModelRenderer Shape11; + ModelRenderer Shape12; + ModelRenderer Shape13; + ModelRenderer Shape14; + ModelRenderer Shape15; + ModelRenderer Shape16; + ModelRenderer Shape17; + + public MFaSheDiRail0() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape7 = new ModelRenderer((ModelBase)this, 35, 52)) + .addBox(0.0f, 0.0f, 0.0f, 1, 41, 4); + this.Shape7.setRotationPoint(8.0f, -24.0f, -2.0f); + this.Shape7.setTextureSize(128, 128); + this.Shape7.mirror = true; + this.setRotation(this.Shape7, 0.0f, 0.0f, 0.0f); + (this.Shape8 = new ModelRenderer((ModelBase)this, 0, 20)) + .addBox(0.0f, 0.0f, 0.0f, 2, 12, 2); + this.Shape8.setRotationPoint(6.0f, 11.0f, -1.0f); + this.Shape8.setTextureSize(128, 128); + this.Shape8.mirror = true; + this.setRotation(this.Shape8, 0.0f, 0.0f, 0.0f); + (this.Shape9 = new ModelRenderer((ModelBase)this, 46, 52)) + .addBox(0.0f, 0.0f, 0.0f, 3, 19, 2); + this.Shape9.setRotationPoint(9.0f, -2.0f, -1.0f); + this.Shape9.setTextureSize(128, 128); + this.Shape9.mirror = true; + this.setRotation(this.Shape9, 0.0f, 0.0f, 0.0f); + (this.Shape10 = new ModelRenderer((ModelBase)this, 0, 10)) + .addBox(0.0f, 0.0f, 0.0f, 2, 4, 2); + this.Shape10.setRotationPoint(7.0f, -28.0f, -1.0f); + this.Shape10.setTextureSize(128, 128); + this.Shape10.mirror = true; + this.setRotation(this.Shape10, 0.0f, 0.0f, 0.0f); + (this.Shape11 = new ModelRenderer((ModelBase)this, 35, 52)) + .addBox(0.0f, 0.0f, 0.0f, 1, 41, 4); + this.Shape11.setRotationPoint(-8.0f, -24.0f, -2.0f); + this.Shape11.setTextureSize(128, 128); + this.Shape11.mirror = true; + this.setRotation(this.Shape11, 0.0f, 0.0f, 0.0f); + (this.Shape12 = new ModelRenderer((ModelBase)this, 46, 52)) + .addBox(0.0f, 0.0f, 0.0f, 3, 19, 2); + this.Shape12.setRotationPoint(-11.0f, -2.0f, -1.0f); + this.Shape12.setTextureSize(128, 128); + this.Shape12.mirror = true; + this.setRotation(this.Shape12, 0.0f, 0.0f, 0.0f); + (this.Shape13 = new ModelRenderer((ModelBase)this, 0, 20)) + .addBox(0.0f, 0.0f, 0.0f, 2, 12, 2); + this.Shape13.setRotationPoint(-7.0f, 11.0f, -1.0f); + this.Shape13.setTextureSize(128, 128); + this.Shape13.mirror = true; + this.setRotation(this.Shape13, 0.0f, 0.0f, 0.0f); + (this.Shape14 = new ModelRenderer((ModelBase)this, 0, 10)) + .addBox(0.0f, 0.0f, 0.0f, 2, 4, 2); + this.Shape14.setRotationPoint(-8.0f, -28.0f, -1.0f); + this.Shape14.setTextureSize(128, 128); + this.Shape14.mirror = true; + this.setRotation(this.Shape14, 0.0f, 0.0f, 0.0f); + (this.Shape15 = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 48, 1, 8); + this.Shape15.setRotationPoint(-24.0f, 23.0f, -4.0f); + this.Shape15.setTextureSize(128, 128); + this.Shape15.mirror = true; + this.setRotation(this.Shape15, 0.0f, 0.0f, 0.0f); + (this.Shape16 = new ModelRenderer((ModelBase)this, 57, 52)) + .addBox(0.0f, 0.0f, 0.0f, 9, 6, 6); + this.Shape16.setRotationPoint(-16.0f, 17.0f, -3.0f); + this.Shape16.setTextureSize(128, 128); + this.Shape16.mirror = true; + this.setRotation(this.Shape16, 0.0f, 0.0f, 0.0f); + (this.Shape17 = new ModelRenderer((ModelBase)this, 57, 52)) + .addBox(0.0f, 0.0f, 0.0f, 9, 6, 6); + this.Shape17.setRotationPoint(8.0f, 17.0f, -3.0f); + this.Shape17.setTextureSize(128, 128); + this.Shape17.mirror = true; + this.setRotation(this.Shape17, 0.0f, 0.0f, 0.0f); + } + + public void render(final float f5) { + this.Shape7.render(f5); + this.Shape8.render(f5); + this.Shape9.render(f5); + this.Shape10.render(f5); + this.Shape11.render(f5); + this.Shape12.render(f5); + this.Shape13.render(f5); + this.Shape14.render(f5); + this.Shape15.render(f5); + this.Shape16.render(f5); + this.Shape17.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDiRail1.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDiRail1.java new file mode 100644 index 0000000..a5eed74 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDiRail1.java @@ -0,0 +1,135 @@ +package icbm.zhapin.muoxing.jiqi; + +import net.minecraft.entity.Entity; +import net.minecraft.client.model.ModelRenderer; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; + +@SideOnly(Side.CLIENT) +public class MFaSheDiRail1 extends ModelBase { + ModelRenderer Shape11; + ModelRenderer Shape12; + ModelRenderer Shape13; + ModelRenderer Shape14; + ModelRenderer Shape15; + ModelRenderer Shape16; + ModelRenderer Shape20; + ModelRenderer Shape22; + ModelRenderer Shape23; + ModelRenderer Shape24; + ModelRenderer Shape25; + ModelRenderer Shape28; + ModelRenderer Shape29; + + public MFaSheDiRail1() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape11 = new ModelRenderer((ModelBase) this, 35, 52)).addBox(0.0f, 0.0f, 0.0f, 1, 41, 4); + this.Shape11.setRotationPoint(-16.0f, -23.0f, -2.0f); + this.Shape11.setTextureSize(128, 128); + this.Shape11.mirror = true; + this.setRotation(this.Shape11, 0.0f, -0.7853982f, 0.0f); + (this.Shape12 = new ModelRenderer((ModelBase) this, 46, 52)).addBox(0.0f, 0.0f, 0.0f, 3, 19, 2); + this.Shape12.setRotationPoint(-18.0f, -1.0f, -3.0f); + this.Shape12.setTextureSize(128, 128); + this.Shape12.mirror = true; + this.setRotation(this.Shape12, 0.0f, -0.7853982f, 0.0f); + (this.Shape13 = new ModelRenderer((ModelBase) this, 0, 20)).addBox(0.0f, 0.0f, 0.0f, 2, 12, 2); + this.Shape13.setRotationPoint(-16.0f, 12.0f, -1.0f); + this.Shape13.setTextureSize(128, 128); + this.Shape13.mirror = true; + this.setRotation(this.Shape13, 0.0f, -0.7853982f, 0.0f); + (this.Shape14 = new ModelRenderer((ModelBase) this, 0, 10)).addBox(0.0f, 0.0f, 0.0f, 2, 4, 1); + this.Shape14.setRotationPoint(-16.0f, -27.0f, -2.0f); + this.Shape14.setTextureSize(128, 128); + this.Shape14.mirror = true; + this.setRotation(this.Shape14, 0.0f, -0.7853982f, 0.0f); + (this.Shape15 = new ModelRenderer((ModelBase) this, 0, 0)).addBox(0.0f, 0.0f, 0.0f, 16, 1, 8); + this.Shape15.setRotationPoint(-24.0f, 23.0f, 0.0f); + this.Shape15.setTextureSize(128, 128); + this.Shape15.mirror = true; + this.setRotation(this.Shape15, 0.0f, 0.0f, 0.0f); + (this.Shape16 = new ModelRenderer((ModelBase) this, 57, 52)).addBox(0.0f, 0.0f, 0.0f, 11, 6, 6); + this.Shape16.setRotationPoint(-20.0f, 18.0f, -8.0f); + this.Shape16.setTextureSize(128, 128); + this.Shape16.mirror = true; + this.setRotation(this.Shape16, 0.0f, -0.7853982f, 0.0f); + (this.Shape20 = new ModelRenderer((ModelBase) this, 0, 10)).addBox(0.0f, 0.0f, 0.0f, 2, 4, 1); + this.Shape20.setRotationPoint(-18.0f, -27.0f, 0.0f); + this.Shape20.setTextureSize(128, 128); + this.Shape20.mirror = true; + this.setRotation(this.Shape20, 0.0f, -0.7853982f, 0.0f); + (this.Shape22 = new ModelRenderer((ModelBase) this, 8, 10)).addBox(0.0f, 0.0f, 0.0f, 9, 1, 1); + this.Shape22.setRotationPoint(-17.0f, 5.0f, -1.0f); + this.Shape22.setTextureSize(128, 128); + this.Shape22.mirror = true; + this.setRotation(this.Shape22, 0.0f, 0.0f, 0.0f); + (this.Shape23 = new ModelRenderer((ModelBase) this, 8, 10)).addBox(0.0f, 0.0f, 0.0f, 9, 1, 1); + this.Shape23.setRotationPoint(-17.0f, -10.0f, -1.0f); + this.Shape23.setTextureSize(128, 128); + this.Shape23.mirror = true; + this.setRotation(this.Shape23, 0.0f, 0.0f, 0.0f); + (this.Shape24 = new ModelRenderer((ModelBase) this, 15, 20)).addBox(0.0f, 0.0f, 0.0f, 6, 1, 1); + this.Shape24.setRotationPoint(-21.0f, 5.0f, 6.0f); + this.Shape24.setTextureSize(128, 128); + this.Shape24.mirror = true; + this.setRotation(this.Shape24, 0.0f, 1.134464f, 0.0f); + (this.Shape25 = new ModelRenderer((ModelBase) this, 15, 20)).addBox(0.0f, 0.0f, 0.0f, 6, 1, 1); + this.Shape25.setRotationPoint(-20.0f, 5.0f, 6.0f); + this.Shape25.setTextureSize(128, 128); + this.Shape25.mirror = true; + this.setRotation(this.Shape25, 0.0f, -1.047198f, 0.0f); + (this.Shape28 = new ModelRenderer((ModelBase) this, 15, 19)).addBox(0.0f, 0.0f, 0.0f, 6, 1, 1); + this.Shape28.setRotationPoint(-20.0f, -10.0f, 6.0f); + this.Shape28.setTextureSize(128, 128); + this.Shape28.mirror = true; + this.setRotation(this.Shape28, 0.0f, -1.047198f, 0.0f); + (this.Shape29 = new ModelRenderer((ModelBase) this, 15, 19)).addBox(0.0f, 0.0f, 0.0f, 6, 1, 1); + this.Shape29.setRotationPoint(-21.0f, -10.0f, 6.0f); + this.Shape29.setTextureSize(128, 128); + this.Shape29.mirror = true; + this.setRotation(this.Shape29, 0.0f, 1.047198f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, final float f2, final float f3, + final float f4, final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.Shape11.render(f5); + this.Shape12.render(f5); + this.Shape13.render(f5); + this.Shape14.render(f5); + this.Shape15.render(f5); + this.Shape16.render(f5); + this.Shape20.render(f5); + this.Shape22.render(f5); + this.Shape23.render(f5); + this.Shape24.render(f5); + this.Shape25.render(f5); + this.Shape28.render(f5); + this.Shape29.render(f5); + } + + public void render(final float f5) { + this.Shape11.render(f5); + this.Shape12.render(f5); + this.Shape13.render(f5); + this.Shape14.render(f5); + this.Shape15.render(f5); + this.Shape16.render(f5); + this.Shape20.render(f5); + this.Shape22.render(f5); + this.Shape23.render(f5); + this.Shape24.render(f5); + this.Shape25.render(f5); + this.Shape28.render(f5); + this.Shape29.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDiRail2.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDiRail2.java new file mode 100644 index 0000000..ad73960 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheDiRail2.java @@ -0,0 +1,69 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MFaSheDiRail2 extends ModelBase { + ModelRenderer Shape9; + ModelRenderer Shape20; + ModelRenderer Shape21; + ModelRenderer Shape16; + + public MFaSheDiRail2() { + super.textureWidth = 256; + super.textureHeight = 256; + (this.Shape9 = new ModelRenderer((ModelBase)this, 170, 0)) + .addBox(0.0f, 0.0f, 0.0f, 10, 37, 10); + this.Shape9.setRotationPoint(-22.0f, -19.0f, -5.0f); + this.Shape9.setTextureSize(256, 256); + this.Shape9.mirror = true; + this.setRotation(this.Shape9, 0.0f, 0.0f, 0.0f); + (this.Shape20 = new ModelRenderer((ModelBase)this, 170, 50)) + .addBox(0.0f, 0.0f, 0.0f, 1, 40, 2); + this.Shape20.setRotationPoint(-19.0f, -22.0f, -6.0f); + this.Shape20.setTextureSize(256, 256); + this.Shape20.mirror = true; + this.setRotation(this.Shape20, 0.0f, 0.0f, 0.0f); + (this.Shape21 = new ModelRenderer((ModelBase)this, 100, 0)) + .addBox(0.0f, 0.0f, 0.0f, 16, 6, 14); + this.Shape21.setRotationPoint(-25.0f, 18.0f, -7.0f); + this.Shape21.setTextureSize(256, 256); + this.Shape21.mirror = true; + this.setRotation(this.Shape21, 0.0f, 0.0f, 0.0f); + (this.Shape16 = new ModelRenderer((ModelBase)this, 170, 50)) + .addBox(0.0f, 0.0f, 0.0f, 1, 40, 2); + this.Shape16.setRotationPoint(-16.0f, -22.0f, -6.0f); + this.Shape16.setTextureSize(256, 256); + this.Shape16.mirror = true; + this.setRotation(this.Shape16, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.Shape9.render(f5); + this.Shape20.render(f5); + this.Shape21.render(f5); + this.Shape16.render(f5); + } + + public void render(final float f5) { + this.Shape9.render(f5); + this.Shape20.render(f5); + this.Shape21.render(f5); + this.Shape16.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheJia.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheJia.java new file mode 100644 index 0000000..00a5056 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheJia.java @@ -0,0 +1,41 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +@SideOnly(Side.CLIENT) +public class MFaSheJia extends ModelBase { + ModelRenderer Shape18; + ModelRenderer Shape19; + + public MFaSheJia() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape18 = new ModelRenderer((ModelBase)this, 57, 65)) + .addBox(0.0f, 0.0f, 0.0f, 16, 6, 8); + this.Shape18.setRotationPoint(-8.0f, 18.0f, -4.0f); + this.Shape18.setTextureSize(128, 128); + this.Shape18.mirror = true; + this.setRotation(this.Shape18, 0.0f, 0.0f, 0.0f); + (this.Shape19 = new ModelRenderer((ModelBase)this, 0, 52)) + .addBox(0.0f, 0.0f, 0.0f, 8, 50, 8); + this.Shape19.setRotationPoint(-4.0f, -32.0f, -4.0f); + this.Shape19.setTextureSize(128, 128); + this.Shape19.mirror = true; + this.setRotation(this.Shape19, 0.0f, 0.0f, 0.0f); + } + + public void render(final float f5) { + this.Shape18.render(f5); + this.Shape19.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheShiMuo0.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheShiMuo0.java new file mode 100644 index 0000000..3adab1e --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheShiMuo0.java @@ -0,0 +1,41 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +@SideOnly(Side.CLIENT) +public class MFaSheShiMuo0 extends ModelBase { + ModelRenderer Shape4; + ModelRenderer Shape5; + + public MFaSheShiMuo0() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape4 = new ModelRenderer((ModelBase)this, 0, 35)) + .addBox(0.0f, 0.0f, 0.0f, 2, 8, 1); + this.Shape4.setRotationPoint(-1.0f, 16.0f, 0.0f); + this.Shape4.setTextureSize(128, 128); + this.Shape4.mirror = true; + this.setRotation(this.Shape4, 0.0f, 0.0f, 0.0f); + (this.Shape5 = new ModelRenderer((ModelBase)this, 15, 30)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 5); + this.Shape5.setRotationPoint(-5.0f, 17.0f, -2.0f); + this.Shape5.setTextureSize(128, 128); + this.Shape5.mirror = true; + this.setRotation(this.Shape5, 0.5235988f, 0.0f, 0.0f); + } + + public void render(final float f5) { + this.Shape4.render(f5); + this.Shape5.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheShiMuo1.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheShiMuo1.java new file mode 100644 index 0000000..0c45f2b --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheShiMuo1.java @@ -0,0 +1,41 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +@SideOnly(Side.CLIENT) +public class MFaSheShiMuo1 extends ModelBase { + ModelRenderer Shape4; + ModelRenderer Shape5; + + public MFaSheShiMuo1() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Shape4 = new ModelRenderer((ModelBase)this, 0, 35)) + .addBox(0.0f, 0.0f, 0.0f, 2, 8, 1); + this.Shape4.setRotationPoint(-1.0f, 16.0f, 0.0f); + this.Shape4.setTextureSize(128, 128); + this.Shape4.mirror = true; + this.setRotation(this.Shape4, 0.0f, 0.0f, 0.0f); + (this.Shape5 = new ModelRenderer((ModelBase)this, 15, 30)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 5); + this.Shape5.setRotationPoint(-5.0f, 17.0f, -2.0f); + this.Shape5.setTextureSize(128, 128); + this.Shape5.mirror = true; + this.setRotation(this.Shape5, 0.5235988f, 0.0f, 0.0f); + } + + public void render(final float f5) { + this.Shape4.render(f5); + this.Shape5.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheShiMuo2.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheShiMuo2.java new file mode 100644 index 0000000..dd73485 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MFaSheShiMuo2.java @@ -0,0 +1,57 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +@SideOnly(Side.CLIENT) +public class MFaSheShiMuo2 extends ModelBase { + ModelRenderer Shape27; + ModelRenderer Shape29; + ModelRenderer Shape30; + ModelRenderer Shape31; + + public MFaSheShiMuo2() { + super.textureWidth = 256; + super.textureHeight = 256; + (this.Shape27 = new ModelRenderer((ModelBase)this, 0, 30)) + .addBox(0.0f, 0.0f, 0.0f, 8, 9, 3); + this.Shape27.setRotationPoint(-4.0f, 15.0f, -2.0f); + this.Shape27.setTextureSize(256, 256); + this.Shape27.mirror = true; + this.setRotation(this.Shape27, 0.0f, 0.0f, 0.0f); + (this.Shape29 = new ModelRenderer((ModelBase)this, 0, 19)) + .addBox(0.0f, 0.0f, 0.0f, 10, 1, 8); + this.Shape29.setRotationPoint(-5.0f, 16.0f, -6.0f); + this.Shape29.setTextureSize(256, 256); + this.Shape29.mirror = true; + this.setRotation(this.Shape29, 0.3141593f, 0.0f, 0.0f); + (this.Shape30 = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 10, 8, 1); + this.Shape30.setRotationPoint(-5.0f, 6.0f, 5.0f); + this.Shape30.setTextureSize(256, 256); + this.Shape30.mirror = true; + this.setRotation(this.Shape30, -0.4363323f, 0.0f, 0.0f); + (this.Shape31 = new ModelRenderer((ModelBase)this, 25, 0)) + .addBox(0.0f, 0.0f, 0.0f, 2, 10, 1); + this.Shape31.setRotationPoint(-1.0f, 10.0f, 4.0f); + this.Shape31.setTextureSize(256, 256); + this.Shape31.mirror = true; + this.setRotation(this.Shape31, -0.4363323f, 0.0f, 0.0f); + } + + public void render(final float f5) { + this.Shape27.render(f5); + this.Shape29.render(f5); + this.Shape30.render(f5); + this.Shape31.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MLeiDa.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MLeiDa.java new file mode 100644 index 0000000..19c40d2 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MLeiDa.java @@ -0,0 +1,146 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +@SideOnly(Side.CLIENT) +public class MLeiDa extends ModelBase { + ModelRenderer Main_Base; + ModelRenderer Main_Base_Outer_Layer; + ModelRenderer Pivot_Support_1; + ModelRenderer Pivot_Support_2; + ModelRenderer Pivot_Support_3; + ModelRenderer Pivot_Point; + ModelRenderer Dish_Support; + ModelRenderer Focus_Support_1; + ModelRenderer Focus_Support_2; + ModelRenderer Focus_Point; + ModelRenderer Main_Dish_Support; + ModelRenderer Main_Dish_Piece; + ModelRenderer Secondary_Dish_Piece_1; + ModelRenderer Secondary_Dish_Piece_2; + + public MLeiDa() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Main_Base = new ModelRenderer((ModelBase)this, 0, 29)) + .addBox(0.0f, 0.0f, 0.0f, 14, 10, 14); + this.Main_Base.setRotationPoint(-7.0f, 14.0f, -7.0f); + this.Main_Base.setTextureSize(128, 128); + this.Main_Base.mirror = true; + this.setRotation(this.Main_Base, 0.0f, 0.0f, 0.0f); + (this.Main_Base_Outer_Layer = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 16, 4, 16); + this.Main_Base_Outer_Layer.setRotationPoint(-8.0f, 20.0f, -8.0f); + this.Main_Base_Outer_Layer.setTextureSize(128, 128); + this.Main_Base_Outer_Layer.mirror = true; + this.setRotation(this.Main_Base_Outer_Layer, 0.0f, 0.0f, 0.0f); + (this.Pivot_Support_1 = new ModelRenderer((ModelBase)this, 0, 63)) + .addBox(0.0f, 0.0f, 0.0f, 12, 1, 12); + this.Pivot_Support_1.setRotationPoint(-6.0f, 13.0f, -6.0f); + this.Pivot_Support_1.setTextureSize(128, 128); + this.Pivot_Support_1.mirror = true; + this.setRotation(this.Pivot_Support_1, 0.0f, 0.0f, 0.0f); + (this.Pivot_Support_2 = new ModelRenderer((ModelBase)this, 87, 63)) + .addBox(-2.0f, 0.0f, -1.0f, 10, 1, 10); + this.Pivot_Support_2.setRotationPoint(-5.0f, 13.0f, 0.0f); + this.Pivot_Support_2.setTextureSize(128, 128); + this.Pivot_Support_2.mirror = true; + this.setRotation(this.Pivot_Support_2, 0.0f, 0.7853982f, 0.0f); + (this.Pivot_Support_3 = new ModelRenderer((ModelBase)this, 0, 78)) + .addBox(0.0f, 0.0f, 0.0f, 8, 2, 8); + this.Pivot_Support_3.setRotationPoint(-4.0f, 11.0f, -4.0f); + this.Pivot_Support_3.setTextureSize(128, 128); + this.Pivot_Support_3.mirror = true; + this.setRotation(this.Pivot_Support_3, 0.0f, 0.0f, 0.0f); + (this.Pivot_Point = new ModelRenderer((ModelBase)this, 0, 89)) + .addBox(-2.0f, 0.0f, -2.0f, 4, 6, 4); + this.Pivot_Point.setRotationPoint(0.0f, 5.0f, 0.0f); + this.Pivot_Point.setTextureSize(128, 128); + this.Pivot_Point.mirror = true; + this.setRotation(this.Pivot_Point, 0.0f, 0.0f, 0.0f); + (this.Dish_Support = new ModelRenderer((ModelBase)this, 17, 89)) + .addBox(-1.0f, 0.0f, -4.0f, 2, 2, 8); + this.Dish_Support.setRotationPoint(0.0f, 5.0f, 0.0f); + this.Dish_Support.setTextureSize(128, 128); + this.Dish_Support.mirror = true; + this.setRotation(this.Dish_Support, 0.0f, 0.0f, 0.0f); + (this.Focus_Support_1 = new ModelRenderer((ModelBase)this, 0, 100)) + .addBox(-15.0f, 0.0f, 3.0f, 19, 2, 1); + this.Focus_Support_1.setRotationPoint(0.0f, 5.0f, 0.0f); + this.Focus_Support_1.setTextureSize(128, 128); + this.Focus_Support_1.mirror = true; + this.setRotation(this.Focus_Support_1, 0.0f, -0.2094395f, 0.0f); + (this.Focus_Support_2 = new ModelRenderer((ModelBase)this, 0, 100)) + .addBox(-15.0f, 0.0f, -4.0f, 19, 2, 1); + this.Focus_Support_2.setRotationPoint(0.0f, 5.0f, 0.0f); + this.Focus_Support_2.setTextureSize(128, 128); + this.Focus_Support_2.mirror = true; + this.setRotation(this.Focus_Support_2, 0.0f, 0.2094395f, 0.0f); + (this.Focus_Point = new ModelRenderer((ModelBase)this, 41, 100)) + .addBox(-16.0f, 0.0f, -1.0f, 1, 4, 2); + this.Focus_Point.setRotationPoint(0.0f, 3.0f, 0.0f); + this.Focus_Point.setTextureSize(128, 128); + this.Focus_Point.mirror = true; + this.setRotation(this.Focus_Point, 0.0f, 0.0f, 0.0f); + (this.Main_Dish_Support = new ModelRenderer((ModelBase)this, 0, 105)) + .addBox(3.0f, 0.0f, -6.0f, 2, 2, 12); + this.Main_Dish_Support.setRotationPoint(0.0f, 5.0f, 0.0f); + this.Main_Dish_Support.setTextureSize(128, 128); + this.Main_Dish_Support.mirror = true; + this.setRotation(this.Main_Dish_Support, 0.0f, 0.0f, 0.0f); + (this.Main_Dish_Piece = new ModelRenderer((ModelBase)this, 51, 95)) + .addBox(4.0f, 0.0f, -9.0f, 1, 15, 18); + this.Main_Dish_Piece.setRotationPoint(0.0f, -10.0f, 0.0f); + this.Main_Dish_Piece.setTextureSize(128, 128); + this.Main_Dish_Piece.mirror = true; + this.setRotation(this.Main_Dish_Piece, 0.0f, 0.0f, 0.0f); + (this.Secondary_Dish_Piece_1 = new ModelRenderer((ModelBase)this, 51, 63)) + .addBox(8.0f, 0.0f, 4.0f, 1, 15, 16); + this.Secondary_Dish_Piece_1.setRotationPoint(0.0f, -10.0f, 0.0f); + this.Secondary_Dish_Piece_1.setTextureSize(128, 128); + this.Secondary_Dish_Piece_1.mirror = true; + this.setRotation(this.Secondary_Dish_Piece_1, 0.0f, -0.6108652f, 0.0f); + (this.Secondary_Dish_Piece_2 = new ModelRenderer((ModelBase)this, 51, 63)) + .addBox(8.0f, 0.0f, -20.0f, 1, 15, 16); + this.Secondary_Dish_Piece_2.setRotationPoint(0.0f, -10.0f, 0.0f); + this.Secondary_Dish_Piece_2.setTextureSize(128, 128); + this.Secondary_Dish_Piece_2.mirror = true; + this.setRotation(this.Secondary_Dish_Piece_2, 0.0f, 0.6108652f, 0.0f); + } + + public void render(final float rotation, final float f5) { + this.Main_Base.render(f5); + this.Main_Base_Outer_Layer.render(f5); + this.Pivot_Support_1.render(f5); + this.Pivot_Support_2.render(f5); + this.Pivot_Support_3.render(f5); + this.Pivot_Point.rotateAngleY = rotation; + this.Pivot_Point.render(f5); + this.Dish_Support.rotateAngleY = rotation; + this.Dish_Support.render(f5); + this.Focus_Support_1.rotateAngleY = rotation - 0.15f; + this.Focus_Support_1.render(f5); + this.Focus_Support_2.rotateAngleY = rotation + 0.15f; + this.Focus_Support_2.render(f5); + this.Focus_Point.rotateAngleY = rotation; + this.Focus_Point.render(f5); + this.Main_Dish_Support.rotateAngleY = rotation; + this.Main_Dish_Support.render(f5); + this.Main_Dish_Piece.rotateAngleY = rotation; + this.Main_Dish_Piece.render(f5); + this.Secondary_Dish_Piece_1.rotateAngleY = rotation - 0.6f; + this.Secondary_Dish_Piece_1.render(f5); + this.Secondary_Dish_Piece_2.rotateAngleY = rotation + 0.6f; + this.Secondary_Dish_Piece_2.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MLeiShePao.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MLeiShePao.java new file mode 100644 index 0000000..13a222f --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MLeiShePao.java @@ -0,0 +1,96 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MLeiShePao extends ModelBase { + ModelRenderer Turret_Base; + ModelRenderer Support_1; + ModelRenderer Support_2; + ModelRenderer Support_3; + ModelRenderer Support_4; + ModelRenderer Turret_Neck; + ModelRenderer Turret_Body; + + public MLeiShePao() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Turret_Base = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(0.0f, 0.0f, 0.0f, 14, 14, 14); + this.Turret_Base.setRotationPoint(-7.0f, 10.0f, -7.0f); + this.Turret_Base.setTextureSize(128, 128); + this.Turret_Base.mirror = true; + this.setRotation(this.Turret_Base, 0.0f, 0.0f, 0.0f); + (this.Support_1 = new ModelRenderer((ModelBase)this, 0, 60)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.Support_1.setRotationPoint(6.0f, 18.0f, 6.0f); + this.Support_1.setTextureSize(128, 128); + this.Support_1.mirror = true; + this.setRotation(this.Support_1, 0.0f, 0.0f, 0.0f); + (this.Support_2 = new ModelRenderer((ModelBase)this, 0, 60)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.Support_2.setRotationPoint(6.0f, 18.0f, -8.0f); + this.Support_2.setTextureSize(128, 128); + this.Support_2.mirror = true; + this.setRotation(this.Support_2, 0.0f, 0.0f, 0.0f); + (this.Support_3 = new ModelRenderer((ModelBase)this, 0, 60)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.Support_3.setRotationPoint(-8.0f, 18.0f, -8.0f); + this.Support_3.setTextureSize(128, 128); + this.Support_3.mirror = true; + this.setRotation(this.Support_3, 0.0f, 0.0f, 0.0f); + (this.Support_4 = new ModelRenderer((ModelBase)this, 0, 60)) + .addBox(0.0f, 0.0f, 0.0f, 2, 6, 2); + this.Support_4.setRotationPoint(-8.0f, 18.0f, 6.0f); + this.Support_4.setTextureSize(128, 128); + this.Support_4.mirror = true; + this.setRotation(this.Support_4, 0.0f, 0.0f, 0.0f); + (this.Turret_Neck = new ModelRenderer((ModelBase)this, 10, 60)) + .addBox(-1.0f, 0.0f, -1.0f, 2, 1, 2); + this.Turret_Neck.setRotationPoint(0.0f, -1.0f, 0.0f); + this.Turret_Neck.setTextureSize(128, 128); + this.Turret_Neck.mirror = true; + this.setRotation(this.Turret_Neck, 0.0f, 0.0f, 0.0f); + (this.Turret_Body = new ModelRenderer((ModelBase)this, 0, 30)) + .addBox(0.0f, 0.0f, 0.0f, 10, 11, 10); + this.Turret_Body.setRotationPoint(-5.0f, 0.0f, -5.0f); + this.Turret_Body.setTextureSize(128, 128); + this.Turret_Body.mirror = true; + this.setRotation(this.Turret_Body, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.Turret_Base.render(f5); + this.Support_1.render(f5); + this.Support_2.render(f5); + this.Support_3.render(f5); + this.Support_4.render(f5); + this.Turret_Neck.render(f5); + this.Turret_Body.render(f5); + } + + public void render(final float f5) { + this.Turret_Body.render(f5); + this.Turret_Base.render(f5); + this.Support_1.render(f5); + this.Support_2.render(f5); + this.Support_3.render(f5); + this.Support_4.render(f5); + this.Turret_Neck.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MLeiShePao2.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MLeiShePao2.java new file mode 100644 index 0000000..9cd90fe --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MLeiShePao2.java @@ -0,0 +1,132 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MLeiShePao2 extends ModelBase { + ModelRenderer Main_Turret_MOVES; + ModelRenderer Back_Armor_MOVES; + ModelRenderer Armor_1_MOVES; + ModelRenderer Armor_2_MOVES; + ModelRenderer Armor_3_MOVES; + ModelRenderer Armor_4_MOVES; + ModelRenderer Armor_5_MOVES; + ModelRenderer Armor_6_MOVES; + ModelRenderer Front_Armor_1_MOVES; + ModelRenderer Front_Armor_2_MOVES; + ModelRenderer Cannon_MOVES; + + public MLeiShePao2() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.Main_Turret_MOVES = new ModelRenderer((ModelBase)this, 60, 10)) + .addBox(-5.0f, 0.0f, -5.0f, 10, 4, 14); + this.Main_Turret_MOVES.setRotationPoint(0.0f, -5.0f, 0.0f); + this.Main_Turret_MOVES.setTextureSize(128, 128); + this.Main_Turret_MOVES.mirror = true; + this.setRotation(this.Main_Turret_MOVES, 0.0f, 0.0f, 0.0f); + (this.Back_Armor_MOVES = new ModelRenderer((ModelBase)this, 60, 0)) + .addBox(-5.0f, 5.0f, 5.0f, 10, 3, 3); + this.Back_Armor_MOVES.setRotationPoint(0.0f, -3.0f, 0.0f); + this.Back_Armor_MOVES.setTextureSize(128, 128); + this.Back_Armor_MOVES.mirror = true; + this.setRotation(this.Back_Armor_MOVES, 0.7853982f, 0.0f, 0.0f); + (this.Armor_1_MOVES = new ModelRenderer((ModelBase)this, 90, 0)) + .addBox(3.0f, 0.0f, 0.0f, 4, 4, 3); + this.Armor_1_MOVES.setRotationPoint(0.0f, -5.0f, 0.0f); + this.Armor_1_MOVES.setTextureSize(128, 128); + this.Armor_1_MOVES.mirror = true; + this.setRotation(this.Armor_1_MOVES, 0.0f, 0.7504916f, 0.0f); + (this.Armor_2_MOVES = new ModelRenderer((ModelBase)this, 60, 30)) + .addBox(4.0f, 0.0f, -2.0f, 4, 4, 8); + this.Armor_2_MOVES.setRotationPoint(0.0f, -5.0f, 0.0f); + this.Armor_2_MOVES.setTextureSize(128, 128); + this.Armor_2_MOVES.mirror = true; + this.setRotation(this.Armor_2_MOVES, 0.0f, -0.4363323f, 0.0f); + (this.Armor_3_MOVES = new ModelRenderer((ModelBase)this, 90, 30)) + .addBox(4.0f, 0.0f, -1.0f, 4, 4, 4); + this.Armor_3_MOVES.setRotationPoint(0.0f, -5.0f, 0.0f); + this.Armor_3_MOVES.setTextureSize(128, 128); + this.Armor_3_MOVES.mirror = true; + this.setRotation(this.Armor_3_MOVES, 0.0f, 0.1919862f, 0.0f); + (this.Armor_4_MOVES = new ModelRenderer((ModelBase)this, 90, 0)) + .addBox(3.0f, 0.0f, -3.0f, 4, 4, 3); + this.Armor_4_MOVES.setRotationPoint(0.0f, -5.0f, 0.0f); + this.Armor_4_MOVES.setTextureSize(128, 128); + this.Armor_4_MOVES.mirror = true; + this.setRotation(this.Armor_4_MOVES, 0.0f, 2.391101f, 0.0f); + (this.Armor_5_MOVES = new ModelRenderer((ModelBase)this, 90, 30)) + .addBox(-1.0f, 0.0f, 4.0f, 4, 4, 4); + this.Armor_5_MOVES.setRotationPoint(0.0f, -5.0f, 0.0f); + this.Armor_5_MOVES.setTextureSize(128, 128); + this.Armor_5_MOVES.mirror = true; + this.setRotation(this.Armor_5_MOVES, 0.0f, -1.780236f, 0.0f); + (this.Armor_6_MOVES = new ModelRenderer((ModelBase)this, 60, 30)) + .addBox(-8.0f, 0.0f, -2.0f, 4, 4, 8); + this.Armor_6_MOVES.setRotationPoint(0.0f, -5.0f, 0.0f); + this.Armor_6_MOVES.setTextureSize(128, 128); + this.Armor_6_MOVES.mirror = true; + this.setRotation(this.Armor_6_MOVES, 0.0f, 0.4363323f, 0.0f); + (this.Front_Armor_1_MOVES = new ModelRenderer((ModelBase)this, 110, 0)) + .addBox(-5.0f, 3.0f, -4.0f, 4, 4, 2); + this.Front_Armor_1_MOVES.setRotationPoint(0.0f, -5.0f, 0.0f); + this.Front_Armor_1_MOVES.setTextureSize(128, 128); + this.Front_Armor_1_MOVES.mirror = true; + this.setRotation(this.Front_Armor_1_MOVES, -0.6457718f, 0.0f, 0.0f); + (this.Front_Armor_2_MOVES = new ModelRenderer((ModelBase)this, 110, 0)) + .addBox(1.0f, 3.0f, -4.0f, 4, 4, 2); + this.Front_Armor_2_MOVES.setRotationPoint(0.0f, -5.0f, 0.0f); + this.Front_Armor_2_MOVES.setTextureSize(128, 128); + this.Front_Armor_2_MOVES.mirror = true; + this.setRotation(this.Front_Armor_2_MOVES, -0.6457718f, 0.0f, 0.0f); + (this.Cannon_MOVES = new ModelRenderer((ModelBase)this, 60, 50)) + .addBox(-1.0f, 0.0f, -22.0f, 2, 2, 17); + this.Cannon_MOVES.setRotationPoint(0.0f, -4.0f, 0.0f); + this.Cannon_MOVES.setTextureSize(128, 128); + this.Cannon_MOVES.mirror = true; + this.setRotation(this.Cannon_MOVES, 0.0f, 0.0f, 0.0f); + } + + public void render(final Entity entity, final float f, final float f1, + final float f2, final float f3, final float f4, + final float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.Main_Turret_MOVES.render(f5); + this.Back_Armor_MOVES.render(f5); + this.Armor_1_MOVES.render(f5); + this.Armor_2_MOVES.render(f5); + this.Armor_3_MOVES.render(f5); + this.Armor_4_MOVES.render(f5); + this.Armor_5_MOVES.render(f5); + this.Armor_6_MOVES.render(f5); + this.Front_Armor_1_MOVES.render(f5); + this.Front_Armor_2_MOVES.render(f5); + this.Cannon_MOVES.render(f5); + } + + public void render(final float f5) { + this.Main_Turret_MOVES.render(f5); + this.Back_Armor_MOVES.render(f5); + this.Armor_1_MOVES.render(f5); + this.Armor_2_MOVES.render(f5); + this.Armor_3_MOVES.render(f5); + this.Armor_4_MOVES.render(f5); + this.Armor_5_MOVES.render(f5); + this.Armor_6_MOVES.render(f5); + this.Front_Armor_1_MOVES.render(f5); + this.Front_Armor_2_MOVES.render(f5); + this.Cannon_MOVES.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MSMine.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MSMine.java new file mode 100644 index 0000000..ef6fe0a --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MSMine.java @@ -0,0 +1,63 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MSMine extends MICBM { + public static final MSMine INSTANCE; + ModelRenderer A; + ModelRenderer B; + ModelRenderer C; + + public MSMine() { + super.textureWidth = 45; + super.textureHeight = 26; + (this.A = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-5.0f, 0.0f, -5.0f, 10, 2, 10); + this.A.setRotationPoint(0.0f, 22.0f, 0.0f); + this.A.setTextureSize(45, 26); + this.A.mirror = true; + this.setRotation(this.A, 0.0f, 0.7853982f, 0.0f); + (this.B = new ModelRenderer((ModelBase)this, 0, 14)) + .addBox(-8.0f, 0.0f, -2.0f, 16, 1, 4); + this.B.setRotationPoint(0.0f, 23.0f, 0.0f); + this.B.setTextureSize(45, 26); + this.B.mirror = true; + this.setRotation(this.B, 0.0f, 0.7853982f, 0.0f); + (this.C = new ModelRenderer((ModelBase)this, 0, 14)) + .addBox(-8.0f, 0.0f, -2.0f, 16, 1, 4); + this.C.setRotationPoint(0.0f, 23.0f, 0.0f); + this.C.setTextureSize(45, 26); + this.C.mirror = true; + this.setRotation(this.C, 0.0f, 2.356194f, 0.0f); + } + + @Override + public void render(final float f5) { + this.A.render(f5); + this.B.render(f5); + this.C.render(f5); + } + + public void render(final Entity entity, final float x, final float y, + final float z, final float f1, final float f2, + final float f3) { + super.render(entity, x, y, z, f1, f2, f3); + this.setRotationAngles(x, y, z, f1, f2, f3, entity); + this.render(f3); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + static { INSTANCE = new MSMine(); } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MShouFaSheQi.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MShouFaSheQi.java new file mode 100644 index 0000000..6630cf4 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MShouFaSheQi.java @@ -0,0 +1,222 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MShouFaSheQi extends ModelBase { + ModelRenderer a; + ModelRenderer b; + ModelRenderer c; + ModelRenderer d; + ModelRenderer e; + ModelRenderer f; + ModelRenderer g; + ModelRenderer h; + ModelRenderer i; + ModelRenderer j; + ModelRenderer k; + ModelRenderer l; + ModelRenderer m; + ModelRenderer n; + ModelRenderer o; + ModelRenderer p; + ModelRenderer q; + ModelRenderer r; + ModelRenderer s; + ModelRenderer t; + ModelRenderer u; + + public MShouFaSheQi() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.a = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-2.0f, -2.0f, -16.0f, 4, 4, 34); + this.a.setRotationPoint(0.0f, 19.0f, 0.0f); + this.a.setTextureSize(128, 128); + this.a.mirror = true; + this.setRotation(this.a, 0.0f, 0.0f, 0.0f); + (this.b = new ModelRenderer((ModelBase)this, 0, 7)) + .addBox(0.0f, 0.0f, 0.0f, 1, 3, 2); + this.b.setRotationPoint(0.0f, 21.0f, -10.0f); + this.b.setTextureSize(128, 128); + this.b.mirror = true; + this.setRotation(this.b, 0.2792527f, 0.0f, 0.0f); + (this.c = new ModelRenderer((ModelBase)this, 7, 6)) + .addBox(0.0f, 0.0f, 0.0f, 1, 4, 2); + this.c.setRotationPoint(0.0f, 21.0f, 2.0f); + this.c.setTextureSize(128, 128); + this.c.mirror = true; + this.setRotation(this.c, 0.0f, 0.0f, 0.0f); + (this.d = new ModelRenderer((ModelBase)this, 14, 3)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 4, 0); + this.d.setRotationPoint(0.0f, 11.0f, -14.0f); + this.d.setTextureSize(128, 128); + this.d.mirror = true; + this.setRotation(this.d, 0.0f, 0.0f, 0.0f); + (this.e = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-1.0f, 0.0f, 0.0f, 2, 1, 4); + this.e.setRotationPoint(0.0f, 16.0f, -15.0f); + this.e.setTextureSize(128, 128); + this.e.mirror = true; + this.setRotation(this.e, 0.0f, 0.0f, 0.0f); + (this.f = new ModelRenderer((ModelBase)this, 14, 0)) + .addBox(-2.0f, 0.0f, 0.0f, 4, 2, 0); + this.f.setRotationPoint(0.0f, 15.0f, -14.0f); + this.f.setTextureSize(128, 128); + this.f.mirror = true; + this.setRotation(this.f, 0.0f, 0.0f, 0.0f); + (this.g = new ModelRenderer((ModelBase)this, 0, 40)) + .addBox(0.0f, -1.0f, 0.0f, 3, 1, 12); + this.g.setRotationPoint(-3.0f, 20.0f, 9.0f); + this.g.setTextureSize(128, 128); + this.g.mirror = true; + this.setRotation(this.g, 0.0f, 0.0f, 0.7853982f); + (this.h = new ModelRenderer((ModelBase)this, 0, 53)) + .addBox(-3.0f, 0.0f, 0.0f, 3, 1, 8); + this.h.setRotationPoint(-1.0f, 16.0f, 11.0f); + this.h.setTextureSize(128, 128); + this.h.mirror = true; + this.setRotation(this.h, 0.0f, 0.0f, -0.7853982f); + (this.i = new ModelRenderer((ModelBase)this, 31, 40)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 12); + this.i.setRotationPoint(-1.0f, 21.0f, 9.0f); + this.i.setTextureSize(128, 128); + this.i.mirror = true; + this.setRotation(this.i, 0.0f, 0.0f, 0.0f); + (this.j = new ModelRenderer((ModelBase)this, 23, 53)) + .addBox(0.0f, 0.0f, 0.0f, 2, 1, 8); + this.j.setRotationPoint(-1.0f, 16.0f, 11.0f); + this.j.setTextureSize(128, 128); + this.j.mirror = true; + this.setRotation(this.j, 0.0f, 0.0f, 0.0f); + (this.k = new ModelRenderer((ModelBase)this, 0, 53)) + .addBox(0.0f, 0.0f, 0.0f, 3, 1, 8); + this.k.setRotationPoint(1.0f, 16.0f, 11.0f); + this.k.setTextureSize(128, 128); + this.k.mirror = true; + this.setRotation(this.k, 0.0f, 0.0f, 0.7853982f); + (this.l = new ModelRenderer((ModelBase)this, 0, 40)) + .addBox(0.0f, -1.0f, 0.0f, 3, 1, 12); + this.l.setRotationPoint(1.0f, 22.0f, 9.0f); + this.l.setTextureSize(128, 128); + this.l.mirror = true; + this.setRotation(this.l, 0.0f, 0.0f, -0.7853982f); + (this.m = new ModelRenderer((ModelBase)this, 47, 0)) + .addBox(0.0f, 0.0f, 0.0f, 2, 2, 6); + this.m.setRotationPoint(2.0f, 15.0f, -10.0f); + this.m.setTextureSize(128, 128); + this.m.mirror = true; + this.setRotation(this.m, 0.0f, 0.0f, 0.0f); + (this.n = new ModelRenderer((ModelBase)this, 47, 10)) + .addBox(0.0f, 0.0f, 0.0f, 2, 3, 1); + this.n.setRotationPoint(2.0f, 15.0f, -9.0f); + this.n.setTextureSize(128, 128); + this.n.mirror = true; + this.setRotation(this.n, 0.0f, 0.0f, 0.7853982f); + (this.o = new ModelRenderer((ModelBase)this, 47, 10)) + .addBox(0.0f, 0.0f, 0.0f, 2, 3, 1); + this.o.setRotationPoint(2.0f, 15.0f, -6.0f); + this.o.setTextureSize(128, 128); + this.o.mirror = true; + this.setRotation(this.o, 0.0f, 0.0f, 0.7853982f); + (this.p = new ModelRenderer((ModelBase)this, 0, 14)) + .addBox(0.0f, 0.0f, 0.0f, 3, 1, 4); + this.p.setRotationPoint(1.0f, 16.0f, -17.0f); + this.p.setTextureSize(128, 128); + this.p.mirror = true; + this.setRotation(this.p, 0.0f, 0.0f, 0.7853982f); + (this.q = new ModelRenderer((ModelBase)this, 0, 14)) + .addBox(0.0f, -1.0f, 0.0f, 3, 1, 4); + this.q.setRotationPoint(1.0f, 22.0f, -17.0f); + this.q.setTextureSize(128, 128); + this.q.mirror = true; + this.setRotation(this.q, 0.0f, 0.0f, -0.7853982f); + (this.r = new ModelRenderer((ModelBase)this, 0, 21)) + .addBox(-1.0f, 0.0f, 0.0f, 1, 2, 4); + this.r.setRotationPoint(3.0f, 18.0f, -17.0f); + this.r.setTextureSize(128, 128); + this.r.mirror = true; + this.setRotation(this.r, 0.0f, 0.0f, 0.0f); + (this.s = new ModelRenderer((ModelBase)this, 0, 14)) + .addBox(0.0f, 0.0f, 0.0f, 3, 1, 4); + this.s.setRotationPoint(-3.0f, 18.0f, -17.0f); + this.s.setTextureSize(128, 128); + this.s.mirror = true; + this.setRotation(this.s, 0.0f, 0.0f, -0.7853982f); + (this.t = new ModelRenderer((ModelBase)this, 0, 21)) + .addBox(0.0f, -1.0f, 0.0f, 1, 2, 4); + this.t.setRotationPoint(-3.0f, 19.0f, -17.0f); + this.t.setTextureSize(128, 128); + this.t.mirror = true; + this.setRotation(this.t, 0.0f, 0.0f, 0.0f); + (this.u = new ModelRenderer((ModelBase)this, 0, 14)) + .addBox(0.0f, -1.0f, 0.0f, 3, 1, 4); + this.u.setRotationPoint(-3.0f, 20.0f, -17.0f); + this.u.setTextureSize(128, 128); + this.u.mirror = true; + this.setRotation(this.u, 0.0f, 0.0f, 0.7853982f); + } + + public void render(final Entity entity, final float x, final float y, + final float z, final float f3, final float f4, + final float f5) { + super.render(entity, x, y, z, f3, f4, f5); + this.setRotationAngles(x, y, z, f3, f4, f5, entity); + this.a.render(f5); + this.b.render(f5); + this.c.render(f5); + this.d.render(f5); + this.e.render(f5); + this.f.render(f5); + this.g.render(f5); + this.h.render(f5); + this.i.render(f5); + this.j.render(f5); + this.k.render(f5); + this.l.render(f5); + this.m.render(f5); + this.n.render(f5); + this.o.render(f5); + this.p.render(f5); + this.q.render(f5); + this.r.render(f5); + this.s.render(f5); + this.t.render(f5); + this.u.render(f5); + } + + public void render(final float f5) { + this.a.render(f5); + this.b.render(f5); + this.c.render(f5); + this.d.render(f5); + this.e.render(f5); + this.f.render(f5); + this.g.render(f5); + this.h.render(f5); + this.i.render(f5); + this.j.render(f5); + this.k.render(f5); + this.l.render(f5); + this.m.render(f5); + this.n.render(f5); + this.o.render(f5); + this.p.render(f5); + this.q.render(f5); + this.r.render(f5); + this.s.render(f5); + this.t.render(f5); + this.u.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MXiaoFaSheQi.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MXiaoFaSheQi.java new file mode 100644 index 0000000..b62df59 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MXiaoFaSheQi.java @@ -0,0 +1,104 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MXiaoFaSheQi extends ModelBase { + ModelRenderer SUPPORT_1; + ModelRenderer SUPPORT_2; + ModelRenderer SUPPORT_3; + ModelRenderer SUPPORT_4; + ModelRenderer SUPPORT_5; + ModelRenderer SUPPORT_6; + ModelRenderer MAIN_BODY; + ModelRenderer MAIN_SUPPORT; + ModelRenderer TORQUE_ROT; + + public MXiaoFaSheQi() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.SUPPORT_1 = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-1.0f, 0.0f, -21.0f, 2, 1, 42); + this.SUPPORT_1.setRotationPoint(0.0f, 21.0f, 0.0f); + this.SUPPORT_1.setTextureSize(128, 128); + this.SUPPORT_1.mirror = true; + this.setRotation(this.SUPPORT_1, 0.0f, 0.7853982f, 0.0f); + (this.SUPPORT_2 = new ModelRenderer((ModelBase)this, 0, 0)) + .addBox(-1.0f, 0.0f, -21.0f, 2, 1, 42); + this.SUPPORT_2.setRotationPoint(0.0f, 21.0f, 0.0f); + this.SUPPORT_2.setTextureSize(128, 128); + this.SUPPORT_2.mirror = true; + this.setRotation(this.SUPPORT_2, 0.0f, 2.356194f, 0.0f); + (this.SUPPORT_3 = new ModelRenderer((ModelBase)this, 0, 28)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.SUPPORT_3.setRotationPoint(-16.0f, 21.0f, -16.0f); + this.SUPPORT_3.setTextureSize(128, 128); + this.SUPPORT_3.mirror = true; + this.setRotation(this.SUPPORT_3, 0.0f, 0.0f, 0.0f); + (this.SUPPORT_4 = new ModelRenderer((ModelBase)this, 0, 28)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.SUPPORT_4.setRotationPoint(12.0f, 21.0f, -16.0f); + this.SUPPORT_4.setTextureSize(128, 128); + this.SUPPORT_4.mirror = true; + this.setRotation(this.SUPPORT_4, 0.0f, 0.0f, 0.0f); + (this.SUPPORT_5 = new ModelRenderer((ModelBase)this, 0, 28)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.SUPPORT_5.setRotationPoint(12.0f, 21.0f, 12.0f); + this.SUPPORT_5.setTextureSize(128, 128); + this.SUPPORT_5.mirror = true; + this.setRotation(this.SUPPORT_5, 0.0f, 0.0f, 0.0f); + (this.SUPPORT_6 = new ModelRenderer((ModelBase)this, 0, 28)) + .addBox(0.0f, 0.0f, 0.0f, 4, 3, 4); + this.SUPPORT_6.setRotationPoint(-16.0f, 21.0f, 12.0f); + this.SUPPORT_6.setTextureSize(128, 128); + this.SUPPORT_6.mirror = true; + this.setRotation(this.SUPPORT_6, 0.0f, 0.0f, 0.0f); + (this.MAIN_BODY = new ModelRenderer((ModelBase)this, 0, 46)) + .addBox(0.0f, 0.0f, 0.0f, 6, 4, 6); + this.MAIN_BODY.setRotationPoint(-3.0f, 20.0f, -3.0f); + this.MAIN_BODY.setTextureSize(128, 128); + this.MAIN_BODY.mirror = true; + this.setRotation(this.MAIN_BODY, 0.0f, 0.0f, 0.0f); + (this.MAIN_SUPPORT = new ModelRenderer((ModelBase)this, 0, 59)) + .addBox(0.0f, 0.0f, 0.0f, 4, 2, 4); + this.MAIN_SUPPORT.setRotationPoint(-2.0f, 18.0f, -2.0f); + this.MAIN_SUPPORT.setTextureSize(128, 128); + this.MAIN_SUPPORT.mirror = true; + this.setRotation(this.MAIN_SUPPORT, 0.0f, 0.0f, 0.0f); + (this.TORQUE_ROT = new ModelRenderer((ModelBase)this, 0, 68)) + .addBox(-1.0f, -4.0f, -1.0f, 2, 4, 2); + this.TORQUE_ROT.setRotationPoint(0.0f, 18.0f, 0.0f); + this.TORQUE_ROT.setTextureSize(128, 128); + this.TORQUE_ROT.mirror = true; + this.setRotation(this.TORQUE_ROT, 0.0f, 0.7853982f, 0.0f); + } + + public void render(final float f5) { + this.SUPPORT_1.render(f5); + this.SUPPORT_2.render(f5); + this.SUPPORT_3.render(f5); + this.SUPPORT_4.render(f5); + this.SUPPORT_5.render(f5); + this.SUPPORT_6.render(f5); + this.MAIN_BODY.render(f5); + this.MAIN_SUPPORT.render(f5); + this.TORQUE_ROT.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(final float f, final float f1, final float f2, + final float f3, final float f4, final float f5, + final Entity entity) { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MXiaoFaSheQiJia.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MXiaoFaSheQiJia.java new file mode 100644 index 0000000..83b3b78 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MXiaoFaSheQiJia.java @@ -0,0 +1,88 @@ +package icbm.zhapin.muoxing.jiqi; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +@SideOnly(Side.CLIENT) +public class MXiaoFaSheQiJia extends ModelBase { + ModelRenderer CLAMP_1_ROT; + ModelRenderer CLAMP_2_ROT; + ModelRenderer COUNTERBALANCE_1_ROT; + ModelRenderer COUNTERBALANCE_2_ROT; + ModelRenderer RAIL_1_ROT; + ModelRenderer RAIL_2_ROT; + ModelRenderer TORQUE_SUPPORT_ROT; + + public MXiaoFaSheQiJia() { + super.textureWidth = 128; + super.textureHeight = 128; + (this.CLAMP_1_ROT = new ModelRenderer((ModelBase)this, 20, 0)) + .addBox(-1.0f, -1.0f, -17.0f, 6, 6, 1); + this.CLAMP_1_ROT.setRotationPoint(0.0f, 13.0f, 0.0f); + this.CLAMP_1_ROT.setTextureSize(128, 128); + this.CLAMP_1_ROT.mirror = true; + this.setRotation(this.CLAMP_1_ROT, 0.0f, 0.0f, -2.356194f); + (this.CLAMP_2_ROT = new ModelRenderer((ModelBase)this, 20, 0)) + .addBox(-1.0f, -1.0f, 0.0f, 6, 6, 1); + this.CLAMP_2_ROT.setRotationPoint(0.0f, 13.0f, 0.0f); + this.CLAMP_2_ROT.setTextureSize(128, 128); + this.CLAMP_2_ROT.mirror = true; + this.setRotation(this.CLAMP_2_ROT, 0.0f, 0.0f, -2.356194f); + (this.COUNTERBALANCE_1_ROT = new ModelRenderer((ModelBase)this, 84, 0)) + .addBox(1.0f, -4.0f, 1.0f, 4, 4, 8); + this.COUNTERBALANCE_1_ROT.setRotationPoint(0.0f, 14.0f, 0.0f); + this.COUNTERBALANCE_1_ROT.setTextureSize(128, 128); + this.COUNTERBALANCE_1_ROT.mirror = true; + this.setRotation(this.COUNTERBALANCE_1_ROT, 0.0f, 0.0f, 0.0f); + (this.COUNTERBALANCE_2_ROT = new ModelRenderer((ModelBase)this, 84, 0)) + .addBox(-5.0f, -4.0f, 1.0f, 4, 4, 8); + this.COUNTERBALANCE_2_ROT.setRotationPoint(0.0f, 14.0f, 0.0f); + this.COUNTERBALANCE_2_ROT.setTextureSize(128, 128); + this.COUNTERBALANCE_2_ROT.mirror = true; + this.setRotation(this.COUNTERBALANCE_2_ROT, 0.0f, 0.0f, 0.0f); + (this.RAIL_1_ROT = new ModelRenderer((ModelBase)this, 65, 13)) + .addBox(-5.0f, -1.0f, -17.0f, 4, 1, 18); + this.RAIL_1_ROT.setRotationPoint(0.0f, 14.0f, 0.0f); + this.RAIL_1_ROT.setTextureSize(128, 128); + this.RAIL_1_ROT.mirror = true; + this.setRotation(this.RAIL_1_ROT, 0.0f, 0.0f, 0.7853982f); + (this.RAIL_2_ROT = new ModelRenderer((ModelBase)this, 65, 13)) + .addBox(-5.0f, 0.0f, -17.0f, 4, 1, 18); + this.RAIL_2_ROT.setRotationPoint(0.0f, 14.0f, 0.0f); + this.RAIL_2_ROT.setTextureSize(128, 128); + this.RAIL_2_ROT.mirror = true; + this.setRotation(this.RAIL_2_ROT, 0.0f, 0.0f, 2.356194f); + (this.TORQUE_SUPPORT_ROT = new ModelRenderer((ModelBase)this, 47, 17)) + .addBox(-2.0f, 0.0f, -2.0f, 4, 2, 4); + this.TORQUE_SUPPORT_ROT.setRotationPoint(0.0f, 13.0f, 0.0f); + this.TORQUE_SUPPORT_ROT.setTextureSize(128, 128); + this.TORQUE_SUPPORT_ROT.mirror = true; + this.setRotation(this.TORQUE_SUPPORT_ROT, 0.0f, 0.0f, 0.0f); + } + + public void render(final float f5) { + this.CLAMP_1_ROT.render(f5); + this.CLAMP_2_ROT.render(f5); + this.COUNTERBALANCE_1_ROT.render(f5); + this.COUNTERBALANCE_2_ROT.render(f5); + this.RAIL_1_ROT.render(f5); + this.RAIL_2_ROT.render(f5); + this.TORQUE_SUPPORT_ROT.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(final float f, final float f1, final float f2, + final float f3, final float f4, final float f5, + final Entity entity) { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } +} diff --git a/src/main/java/icbm/zhapin/muoxing/jiqi/MYinDaoQi.java b/src/main/java/icbm/zhapin/muoxing/jiqi/MYinDaoQi.java new file mode 100644 index 0000000..6806a67 --- /dev/null +++ b/src/main/java/icbm/zhapin/muoxing/jiqi/MYinDaoQi.java @@ -0,0 +1,303 @@ +package icbm.zhapin.muoxing.jiqi; + +import icbm.core.di.MICBM; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class MYinDaoQi extends MICBM { + ModelRenderer Stand2; + ModelRenderer Stand1; + ModelRenderer Console6; + ModelRenderer Stand3; + ModelRenderer Console1; + ModelRenderer Console3; + ModelRenderer Screen1; + ModelRenderer Screen2; + ModelRenderer Radio1; + ModelRenderer Radio_Cable2; + ModelRenderer Radio_Antennae; + ModelRenderer Radio2; + ModelRenderer Radio_Antennae2; + ModelRenderer Keyboard; + ModelRenderer Button5; + ModelRenderer Button4; + ModelRenderer Button14; + ModelRenderer Button15; + ModelRenderer Button13; + ModelRenderer Console5; + ModelRenderer Console4; + ModelRenderer Button8; + ModelRenderer Button2; + ModelRenderer Button7; + ModelRenderer Button1; + ModelRenderer Button11; + ModelRenderer Button12; + ModelRenderer Button10; + ModelRenderer Button16; + ModelRenderer Button17; + ModelRenderer Button18; + ModelRenderer Standend2; + ModelRenderer Standend1; + ModelRenderer Console2; + ModelRenderer Radio_Cable; + + public MYinDaoQi() { + super.textureWidth = 64; + super.textureHeight = 32; + (this.Stand2 = new ModelRenderer((ModelBase)this, 0, 9)) + .addBox(-1.0f, 0.0f, -10.0f, 2, 1, 17); + this.Stand2.setRotationPoint(0.0f, 23.0f, 0.0f); + this.Stand2.setTextureSize(64, 32); + this.Stand2.mirror = true; + this.setRotation(this.Stand2, 0.0f, 0.7853982f, 0.0f); + (this.Stand1 = new ModelRenderer((ModelBase)this, 0, 9)) + .addBox(-1.0f, 0.0f, -10.0f, 2, 1, 17); + this.Stand1.setRotationPoint(0.0f, 23.0f, 0.0f); + this.Stand1.setTextureSize(64, 32); + this.Stand1.mirror = true; + this.setRotation(this.Stand1, 0.0f, -0.7853982f, 0.0f); + (this.Console6 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(0.75f, -1.1f, 0.8f, 1, 1, 1); + this.Console6.setRotationPoint(0.0f, 20.0f, 1.0f); + this.Console6.setTextureSize(64, 32); + this.Console6.mirror = true; + this.setRotation(this.Console6, 0.1396263f, 0.0f, 0.0f); + (this.Stand3 = new ModelRenderer((ModelBase)this, 56, 15)) + .addBox(-1.0f, -5.0f, -1.0f, 2, 6, 2); + this.Stand3.setRotationPoint(0.0f, 23.0f, 0.0f); + this.Stand3.setTextureSize(64, 32); + this.Stand3.mirror = true; + this.setRotation(this.Stand3, -0.7853982f, 0.0f, 0.0f); + (this.Console1 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(0.8f, -1.1f, 0.8f, 1, 1, 1); + this.Console1.setRotationPoint(-3.8f, 20.0f, -0.6f); + this.Console1.setTextureSize(64, 32); + this.Console1.mirror = true; + this.setRotation(this.Console1, 0.1396263f, -0.7853982f, 0.0f); + (this.Console3 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(0.8f, -1.1f, 0.8f, 1, 1, 1); + this.Console3.setRotationPoint(3.85f, 20.0f, -0.6f); + this.Console3.setTextureSize(64, 32); + this.Console3.mirror = true; + this.setRotation(this.Console3, 0.1396263f, 0.7853982f, 0.0f); + (this.Screen1 = new ModelRenderer((ModelBase)this, 0, 27)) + .addBox(-7.0f, -3.0f, 0.0f, 6, 5, 0); + this.Screen1.setRotationPoint(0.0f, 15.0f, 4.0f); + this.Screen1.setTextureSize(64, 32); + this.Screen1.mirror = true; + this.setRotation(this.Screen1, 0.0f, -0.2792527f, 0.0f); + (this.Screen2 = new ModelRenderer((ModelBase)this, 0, 27)) + .addBox(1.0f, -3.0f, 0.0f, 6, 5, 0); + this.Screen2.setRotationPoint(0.0f, 15.0f, 4.0f); + this.Screen2.setTextureSize(64, 32); + this.Screen2.mirror = true; + this.setRotation(this.Screen2, 0.0f, 0.2792527f, 0.0f); + (this.Radio1 = new ModelRenderer((ModelBase)this, 50, 23)) + .addBox(-1.0f, 0.0f, -1.0f, 4, 6, 3); + this.Radio1.setRotationPoint(-4.0f, 24.0f, 5.0f); + this.Radio1.setTextureSize(64, 32); + this.Radio1.mirror = true; + this.setRotation(this.Radio1, 0.0f, 0.0f, 3.141593f); + (this.Radio_Cable2 = new ModelRenderer((ModelBase)this, 12, 20)) + .addBox(-0.5f, 0.0f, -0.5f, 1, 5, 1); + this.Radio_Cable2.setRotationPoint(-3.5f, 22.0f, 5.0f); + this.Radio_Cable2.setTextureSize(64, 32); + this.Radio_Cable2.mirror = true; + this.setRotation(this.Radio_Cable2, -1.570796f, -0.7853982f, 3.141593f); + (this.Radio_Antennae = new ModelRenderer((ModelBase)this, 46, 27)) + .addBox(-0.5f, 0.0f, -0.5f, 1, 4, 1); + this.Radio_Antennae.setRotationPoint(-6.0f, 18.0f, 5.5f); + this.Radio_Antennae.setTextureSize(64, 32); + this.Radio_Antennae.mirror = true; + this.setRotation(this.Radio_Antennae, 0.0f, 0.0f, 3.141593f); + (this.Radio2 = new ModelRenderer((ModelBase)this, 50, 23)) + .addBox(-1.0f, 0.0f, -1.0f, 4, 6, 3); + this.Radio2.setRotationPoint(6.0f, 24.0f, 5.0f); + this.Radio2.setTextureSize(64, 32); + this.Radio2.mirror = true; + this.setRotation(this.Radio2, 0.0f, 0.0f, 3.141593f); + (this.Radio_Antennae2 = new ModelRenderer((ModelBase)this, 46, 27)) + .addBox(-0.5f, 0.0f, -0.5f, 1, 4, 1); + this.Radio_Antennae2.setRotationPoint(5.75f, 18.0f, 5.5f); + this.Radio_Antennae2.setTextureSize(64, 32); + this.Radio_Antennae2.mirror = true; + this.setRotation(this.Radio_Antennae2, 0.0f, 0.0f, 3.141593f); + (this.Keyboard = new ModelRenderer((ModelBase)this, 21, 23)) + .addBox(-4.0f, -1.0f, 0.0f, 8, 1, 2); + this.Keyboard.setRotationPoint(0.0f, 20.0f, 0.0f); + this.Keyboard.setTextureSize(64, 32); + this.Keyboard.mirror = true; + this.setRotation(this.Keyboard, 3.141593f, 0.0f, 0.0f); + (this.Button5 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(-0.5f, -1.1f, 0.8f, 1, 1, 1); + this.Button5.setRotationPoint(0.0f, 20.0f, 1.0f); + this.Button5.setTextureSize(64, 32); + this.Button5.mirror = true; + this.setRotation(this.Button5, 0.1396263f, 0.0f, 0.0f); + (this.Button4 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(-1.8f, -1.1f, 0.8f, 1, 1, 1); + this.Button4.setRotationPoint(0.0f, 20.0f, 1.0f); + this.Button4.setTextureSize(64, 32); + this.Button4.mirror = true; + this.setRotation(this.Button4, 0.1396263f, 0.0f, 0.0f); + (this.Button14 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(-0.5f, -1.1f, -0.5f, 1, 1, 1); + this.Button14.setRotationPoint(0.0f, 20.0f, 1.0f); + this.Button14.setTextureSize(64, 32); + this.Button14.mirror = true; + this.setRotation(this.Button14, 0.1396263f, 0.0f, 0.0f); + (this.Button15 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(0.75f, -1.1f, -0.5f, 1, 1, 1); + this.Button15.setRotationPoint(0.0f, 20.0f, 1.0f); + this.Button15.setTextureSize(64, 32); + this.Button15.mirror = true; + this.setRotation(this.Button15, 0.1396263f, 0.0f, 0.0f); + (this.Button13 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(-1.8f, -1.1f, -0.5f, 1, 1, 1); + this.Button13.setRotationPoint(0.0f, 20.0f, 1.0f); + this.Button13.setTextureSize(64, 32); + this.Button13.mirror = true; + this.setRotation(this.Button13, 0.1396263f, 0.0f, 0.0f); + (this.Console5 = new ModelRenderer((ModelBase)this, 16, 28)) + .addBox(-3.0f, -1.0f, -1.0f, 6, 1, 3); + this.Console5.setRotationPoint(3.85f, 20.0f, -0.6f); + this.Console5.setTextureSize(64, 32); + this.Console5.mirror = true; + this.setRotation(this.Console5, 0.1396263f, 0.7853982f, 0.0f); + (this.Console4 = new ModelRenderer((ModelBase)this, 16, 28)) + .addBox(-3.0f, -1.0f, -1.0f, 6, 1, 3); + this.Console4.setRotationPoint(-3.8f, 20.0f, -0.6f); + this.Console4.setTextureSize(64, 32); + this.Console4.mirror = true; + this.setRotation(this.Console4, 0.1396263f, -0.7853982f, 0.0f); + (this.Button8 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(-0.5f, -1.1f, 0.8f, 1, 1, 1); + this.Button8.setRotationPoint(3.85f, 20.0f, -0.6f); + this.Button8.setTextureSize(64, 32); + this.Button8.mirror = true; + this.setRotation(this.Button8, 0.1396263f, 0.7853982f, 0.0f); + (this.Button2 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(-0.5f, -1.1f, 0.8f, 1, 1, 1); + this.Button2.setRotationPoint(-3.8f, 20.0f, -0.6f); + this.Button2.setTextureSize(64, 32); + this.Button2.mirror = true; + this.setRotation(this.Button2, 0.1396263f, -0.7853982f, 0.0f); + (this.Button7 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(-1.8f, -1.1f, 0.8f, 1, 1, 1); + this.Button7.setRotationPoint(3.85f, 20.0f, -0.6f); + this.Button7.setTextureSize(64, 32); + this.Button7.mirror = true; + this.setRotation(this.Button7, 0.1396263f, 0.7853982f, 0.0f); + (this.Button1 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(-1.8f, -1.1f, 0.8f, 1, 1, 1); + this.Button1.setRotationPoint(-3.8f, 20.0f, -0.6f); + this.Button1.setTextureSize(64, 32); + this.Button1.mirror = true; + this.setRotation(this.Button1, 0.1396263f, -0.7853982f, 0.0f); + (this.Button11 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(-0.5f, -1.1f, -0.5f, 1, 1, 1); + this.Button11.setRotationPoint(-3.8f, 20.0f, -0.6f); + this.Button11.setTextureSize(64, 32); + this.Button11.mirror = true; + this.setRotation(this.Button11, 0.1396263f, -0.7853982f, 0.0f); + (this.Button12 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(0.8f, -1.1f, -0.5f, 1, 1, 1); + this.Button12.setRotationPoint(-3.8f, 20.0f, -0.6f); + this.Button12.setTextureSize(64, 32); + this.Button12.mirror = true; + this.setRotation(this.Button12, 0.1396263f, -0.7853982f, 0.0f); + (this.Button10 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(-1.8f, -1.1f, -0.5f, 1, 1, 1); + this.Button10.setRotationPoint(-3.8f, 20.0f, -0.6f); + this.Button10.setTextureSize(64, 32); + this.Button10.mirror = true; + this.setRotation(this.Button10, 0.1396263f, -0.7853982f, 0.0f); + (this.Button16 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(-1.8f, -1.1f, -0.5f, 1, 1, 1); + this.Button16.setRotationPoint(3.85f, 20.0f, -0.6f); + this.Button16.setTextureSize(64, 32); + this.Button16.mirror = true; + this.setRotation(this.Button16, 0.1396263f, 0.7853982f, 0.0f); + (this.Button17 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(-0.5f, -1.1f, -0.5f, 1, 1, 1); + this.Button17.setRotationPoint(3.85f, 20.0f, -0.6f); + this.Button17.setTextureSize(64, 32); + this.Button17.mirror = true; + this.setRotation(this.Button17, 0.1396263f, 0.7853982f, 0.0f); + (this.Button18 = new ModelRenderer((ModelBase)this, 12, 30)) + .addBox(0.8f, -1.1f, -0.5f, 1, 1, 1); + this.Button18.setRotationPoint(3.85f, 20.0f, -0.6f); + this.Button18.setTextureSize(64, 32); + this.Button18.mirror = true; + this.setRotation(this.Button18, 0.1396263f, 0.7853982f, 0.0f); + (this.Standend2 = new ModelRenderer((ModelBase)this, 0, 21)) + .addBox(0.0f, 0.0f, 0.0f, 3, 2, 3); + this.Standend2.setRotationPoint(4.9f, 22.9f, -7.9f); + this.Standend2.setTextureSize(64, 32); + this.Standend2.mirror = true; + this.setRotation(this.Standend2, 0.0f, 0.0f, 0.0f); + (this.Standend1 = new ModelRenderer((ModelBase)this, 0, 21)) + .addBox(0.0f, 0.0f, 0.0f, 3, 2, 3); + this.Standend1.setRotationPoint(-7.9f, 22.9f, -7.9f); + this.Standend1.setTextureSize(64, 32); + this.Standend1.mirror = true; + this.setRotation(this.Standend1, 0.0f, 0.0f, 0.0f); + (this.Console2 = new ModelRenderer((ModelBase)this, 16, 28)) + .addBox(-3.0f, -1.0f, -1.0f, 6, 1, 3); + this.Console2.setRotationPoint(0.0f, 20.0f, 1.0f); + this.Console2.setTextureSize(64, 32); + this.Console2.mirror = true; + this.setRotation(this.Console2, 0.1396263f, 0.0f, 0.0f); + (this.Radio_Cable = new ModelRenderer((ModelBase)this, 12, 20)) + .addBox(-0.5f, 0.0f, -0.5f, 1, 5, 1); + this.Radio_Cable.setRotationPoint(3.5f, 22.0f, 5.0f); + this.Radio_Cable.setTextureSize(64, 32); + this.Radio_Cable.mirror = true; + this.setRotation(this.Radio_Cable, -1.570796f, 0.7853982f, 3.141593f); + } + + public void render(final float rotation, final float f5) { + this.Stand2.render(f5); + this.Stand1.render(f5); + this.Console6.render(f5); + this.Stand3.render(f5); + this.Console1.render(f5); + this.Console3.render(f5); + this.Screen1.render(f5); + this.Screen2.render(f5); + this.Radio1.render(f5); + this.Radio_Cable2.render(f5); + this.Radio_Antennae.render(f5); + this.Radio2.render(f5); + this.Radio_Antennae2.render(f5); + this.Keyboard.render(f5); + this.Button5.render(f5); + this.Button4.render(f5); + this.Button14.render(f5); + this.Button15.render(f5); + this.Button13.render(f5); + this.Console5.render(f5); + this.Console4.render(f5); + this.Button8.render(f5); + this.Button2.render(f5); + this.Button7.render(f5); + this.Button1.render(f5); + this.Button11.render(f5); + this.Button12.render(f5); + this.Button10.render(f5); + this.Button16.render(f5); + this.Button17.render(f5); + this.Button18.render(f5); + this.Standend2.render(f5); + this.Standend1.render(f5); + this.Console2.render(f5); + this.Radio_Cable.render(f5); + } + + private void setRotation(final ModelRenderer model, final float x, + final float y, final float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/icbm/zhapin/po/PChuanRanDu.java b/src/main/java/icbm/zhapin/po/PChuanRanDu.java new file mode 100644 index 0000000..a7cd9e9 --- /dev/null +++ b/src/main/java/icbm/zhapin/po/PChuanRanDu.java @@ -0,0 +1,76 @@ +package icbm.zhapin.po; + +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityPigZombie; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.passive.EntityPig; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import universalelectricity.core.vector.Vector3; + +public class PChuanRanDu extends PICBM { + public static PChuanRanDu INSTANCE; + + public PChuanRanDu(final int id, final boolean isBadEffect, final int color, + final String name) { + super(id, isBadEffect, color, name); + this.setIconIndex(6, 0); + } + + @Override + public void performEffect(final EntityLivingBase entityLiving, + final int amplifier) { + if (!(entityLiving instanceof EntityZombie) && + !(entityLiving instanceof EntityPigZombie)) { + entityLiving.attackEntityFrom(DamageSource.magic, 1); + } + if (!ICBMExplosion.shiBaoHu(((Entity)entityLiving).worldObj, + new Vector3((Entity)entityLiving), + ZhaPin.ZhaPinType.QUAN_BU, ZhaPin.chemical)) { + final int r = 13; + final AxisAlignedBB entitySurroundings = AxisAlignedBB.getBoundingBox( + ((Entity)entityLiving).posX - r, ((Entity)entityLiving).posY - r, + ((Entity)entityLiving).posZ - r, ((Entity)entityLiving).posX + r, + ((Entity)entityLiving).posY + r, ((Entity)entityLiving).posZ + r); + final List entities = + entityLiving + .worldObj.getEntitiesWithinAABB(EntityLivingBase.class, + entitySurroundings); + for (final EntityLivingBase entity : entities) { + if (entity != null) { + if (entity instanceof EntityPig) { + final EntityPigZombie var2 = + new EntityPigZombie(((Entity)entity).worldObj); + var2.setLocationAndAngles( + ((Entity)entity).posX, ((Entity)entity).posY, + ((Entity)entity).posZ, ((Entity)entity).rotationYaw, + ((Entity)entity).rotationPitch); + ((Entity)entity).worldObj.spawnEntityInWorld((Entity)var2); + entity.setDead(); + } else if (entity instanceof EntityVillager) { + final EntityZombie var3 = + new EntityZombie(((Entity)entity).worldObj); + var3.setLocationAndAngles( + ((Entity)entity).posX, ((Entity)entity).posY, + ((Entity)entity).posZ, ((Entity)entity).rotationYaw, + ((Entity)entity).rotationPitch); + ((Entity)entity).worldObj.spawnEntityInWorld((Entity)var3); + entity.setDead(); + } + ICBMExplosion.DU_CHUAN_RAN.poisonEntity( + new Vector3((Entity)entityLiving), entity); + } + } + } + } + + @Override + public boolean isReady(final int duration, final int amplifier) { + return duration % 40 == 0; + } +} diff --git a/src/main/java/icbm/zhapin/po/PDaDu.java b/src/main/java/icbm/zhapin/po/PDaDu.java new file mode 100644 index 0000000..b4f7a2c --- /dev/null +++ b/src/main/java/icbm/zhapin/po/PDaDu.java @@ -0,0 +1,30 @@ +package icbm.zhapin.po; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityPigZombie; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.util.DamageSource; + +public class PDaDu extends PICBM { + public static PDaDu INSTANCE; + + public PDaDu(final int id, final boolean isBadEffect, final int color, + final String name) { + super(id, isBadEffect, color, name); + this.setIconIndex(6, 0); + } + + @Override + public void performEffect(final EntityLivingBase par1EntityLiving, + final int amplifier) { + if (!(par1EntityLiving instanceof EntityZombie) && + !(par1EntityLiving instanceof EntityPigZombie)) { + par1EntityLiving.attackEntityFrom(DamageSource.magic, 1); + } + } + + @Override + public boolean isReady(final int duration, final int amplifier) { + return duration % 40 == 0; + } +} diff --git a/src/main/java/icbm/zhapin/po/PDongShang.java b/src/main/java/icbm/zhapin/po/PDongShang.java new file mode 100644 index 0000000..ea74367 --- /dev/null +++ b/src/main/java/icbm/zhapin/po/PDongShang.java @@ -0,0 +1,46 @@ +package icbm.zhapin.po; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; + +public class PDongShang extends PICBM { + public static PDongShang INSTANCE; + + public PDongShang(final int id, final boolean isBadEffect, final int color, + final String name) { + super(id, isBadEffect, color, name); + this.setIconIndex(6, 0); + } + + @Override + public void performEffect(final EntityLivingBase par1EntityLiving, + final int amplifier) { + if (par1EntityLiving instanceof EntityPlayer) { + ((EntityPlayer)par1EntityLiving).addExhaustion(3.0f * (amplifier + 1)); + } + if (par1EntityLiving.isBurning()) { + par1EntityLiving.extinguish(); + par1EntityLiving.removePotionEffect(super.id); + } + if (((Entity)par1EntityLiving) + .worldObj.getBlock( + MathHelper.floor_double(((Entity)par1EntityLiving).posX), + MathHelper.floor_double(((Entity)par1EntityLiving).posY) - 1, + MathHelper.floor_double(((Entity)par1EntityLiving).posZ)) == + Blocks.ice) { + par1EntityLiving.attackEntityFrom(DamageSource.magic, 2); + } + if (par1EntityLiving.getHealth() < 6) { + par1EntityLiving.attackEntityFrom(DamageSource.magic, 999999999); + } + } + + @Override + public boolean isReady(final int duration, final int amplifier) { + return duration % 20 == 0; + } +} diff --git a/src/main/java/icbm/zhapin/po/PICBM.java b/src/main/java/icbm/zhapin/po/PICBM.java new file mode 100644 index 0000000..a266216 --- /dev/null +++ b/src/main/java/icbm/zhapin/po/PICBM.java @@ -0,0 +1,12 @@ +package icbm.zhapin.po; + +import icbm.core.MainBase; +import universalelectricity.prefab.potion.CustomPotion; + +public abstract class PICBM extends CustomPotion { + public PICBM(final int id, final boolean isBadEffect, final int color, + final String name) { + super(MainBase.CONFIGURATION.get("Potion", name, id).getInt(id), + isBadEffect, color, name); + } +} diff --git a/src/main/java/icbm/zhapin/render/REZhaDan.java b/src/main/java/icbm/zhapin/render/REZhaDan.java new file mode 100644 index 0000000..09d852e --- /dev/null +++ b/src/main/java/icbm/zhapin/render/REZhaDan.java @@ -0,0 +1,82 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.zhapin.EExplosive; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class REZhaDan extends Render { + private RenderBlocks blockRenderer; + + public REZhaDan() { + this.blockRenderer = new RenderBlocks(); + super.shadowSize = 0.5f; + } + + @Override + public void doRender(final Entity par1Entity, final double x, final double y, + final double z, final float par8, final float par9) { + final EExplosive entityExplosive = (EExplosive)par1Entity; + final Object[] data = ZhaPin.list[entityExplosive.haoMa].getRenderData(); + if (data != null) { + GL11.glPushMatrix(); + GL11.glTranslatef((float)x, (float)y + 1.0f, (float)z); + this.bindTexture((ResourceLocation)data[1]); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + ((MICBM)data[0]) + .render((Entity)entityExplosive, (float)x, (float)y, (float)z, par8, + par9, 0.0625f); + GL11.glPopMatrix(); + } else { + GL11.glPushMatrix(); + GL11.glTranslatef((float)x, (float)y, (float)z); + if (entityExplosive.fuse - par9 + 1.0f < 10.0f) { + float f2 = 1.0f - (entityExplosive.fuse - par9 + 1.0f) / 10.0f; + if (f2 < 0.0f) { + f2 = 0.0f; + } + if (f2 > 1.0f) { + f2 = 1.0f; + } + f2 *= f2; + f2 *= f2; + final float f3 = 1.0f + f2 * 0.3f; + GL11.glScalef(f3, f3, f3); + } + float f2 = (1.0f - (entityExplosive.fuse - par9 + 1.0f) / 100.0f) * 0.8f; + // TODO: this is the wrong ResourceLocation name + this.bindTexture(new ResourceLocation("textures/terrain.png")); + this.blockRenderer.renderBlockAsItem(ICBMExplosion.bExplosives, + entityExplosive.haoMa, + entityExplosive.getBrightness(par9)); + if (entityExplosive.fuse / 5 % 2 == 0) { + GL11.glDisable(3553); + GL11.glDisable(2896); + GL11.glEnable(3042); + GL11.glBlendFunc(770, 772); + GL11.glColor4f(1.0f, 1.0f, 1.0f, f2); + this.blockRenderer.renderBlockAsItem(Blocks.tnt, 0, 1.0f); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GL11.glDisable(3042); + GL11.glEnable(2896); + GL11.glEnable(3553); + } + GL11.glPopMatrix(); + } + } + + @Override + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + // TODO: WTF + return null; + } +} diff --git a/src/main/java/icbm/zhapin/render/REmpTower.java b/src/main/java/icbm/zhapin/render/REmpTower.java new file mode 100644 index 0000000..4e3a929 --- /dev/null +++ b/src/main/java/icbm/zhapin/render/REmpTower.java @@ -0,0 +1,36 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.zhapin.jiqi.TEmpTower; +import icbm.zhapin.muoxing.jiqi.MDianCiQi; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class REmpTower extends TileEntitySpecialRenderer { + public static final MDianCiQi MODEL; + public static final String TEXTURE_FILE = "emp_tower.png"; + + public void renderAModelAt(final TEmpTower tileEntity, final double x, + final double y, final double z, final float f) { + GL11.glPushMatrix(); + GL11.glTranslatef((float)x + 0.5f, (float)y + 1.5f, (float)z + 0.5f); + this.bindTexture( + new ResourceLocation("icbm", "textures/models/emp_tower.png")); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + REmpTower.MODEL.render(tileEntity.xuanZhuan, 0.0625f); + GL11.glPopMatrix(); + } + + @Override + public void renderTileEntityAt(final TileEntity tileentity, final double x, + final double y, final double z, + final float f) { + this.renderAModelAt((TEmpTower)tileentity, x, y, z, f); + } + + static { MODEL = new MDianCiQi(); } +} diff --git a/src/main/java/icbm/zhapin/render/RFaSheDi.java b/src/main/java/icbm/zhapin/render/RFaSheDi.java new file mode 100644 index 0000000..8080909 --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RFaSheDi.java @@ -0,0 +1,69 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.zhapin.jiqi.TLauncherPlatform; +import icbm.zhapin.muoxing.jiqi.MFaSheDi0; +import icbm.zhapin.muoxing.jiqi.MFaSheDi1; +import icbm.zhapin.muoxing.jiqi.MFaSheDi2; +import icbm.zhapin.muoxing.jiqi.MFaSheDiRail0; +import icbm.zhapin.muoxing.jiqi.MFaSheDiRail1; +import icbm.zhapin.muoxing.jiqi.MFaSheDiRail2; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RFaSheDi extends TileEntitySpecialRenderer { + public static final MFaSheDi0 modelBase0; + public static final MFaSheDiRail0 modelRail0; + public static final MFaSheDi1 modelBase1; + public static final MFaSheDiRail1 modelRail1; + public static final MFaSheDi2 modelBase2; + public static final MFaSheDiRail2 modelRail2; + + @Override + public void renderTileEntityAt(final TileEntity tileentity, final double x, + final double y, final double z, + final float f) { + final TLauncherPlatform tileEntity = (TLauncherPlatform) tileentity; + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5f, (float) y + 1.5f, (float) z + 0.5f); + this.bindTexture(new ResourceLocation( + "icbm", "textures/models/launcher_" + tileEntity.getTier() + ".png")); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + if (tileEntity.getDirection((IBlockAccess) tileEntity.getWorldObj(), (int) x, + (int) y, (int) z) != ForgeDirection.NORTH && + tileEntity.getDirection((IBlockAccess) tileEntity.getWorldObj(), (int) x, + (int) y, (int) z) != ForgeDirection.SOUTH) { + GL11.glRotatef(90.0f, 0.0f, 180.0f, 1.0f); + } + if (tileEntity.getTier() == 0) { + RFaSheDi.modelBase0.render(0.0625f); + RFaSheDi.modelRail0.render(0.0625f); + } else if (tileEntity.getTier() == 1) { + RFaSheDi.modelBase1.render(0.0625f); + RFaSheDi.modelRail1.render(0.0625f); + GL11.glRotatef(180.0f, 0.0f, 180.0f, 1.0f); + RFaSheDi.modelRail1.render(0.0625f); + } else if (tileEntity.getTier() == 2) { + RFaSheDi.modelBase2.render(0.0625f); + RFaSheDi.modelRail2.render(0.0625f); + GL11.glRotatef(180.0f, 0.0f, 180.0f, 1.0f); + RFaSheDi.modelRail2.render(0.0625f); + } + GL11.glPopMatrix(); + } + + static { + modelBase0 = new MFaSheDi0(); + modelRail0 = new MFaSheDiRail0(); + modelBase1 = new MFaSheDi1(); + modelRail1 = new MFaSheDiRail1(); + modelBase2 = new MFaSheDi2(); + modelRail2 = new MFaSheDiRail2(); + } +} diff --git a/src/main/java/icbm/zhapin/render/RFaSheJia.java b/src/main/java/icbm/zhapin/render/RFaSheJia.java new file mode 100644 index 0000000..aa7edc6 --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RFaSheJia.java @@ -0,0 +1,46 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.zhapin.jiqi.TLauncher; +import icbm.zhapin.muoxing.jiqi.MFaSheJia; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RFaSheJia extends TileEntitySpecialRenderer { + public static final MFaSheJia MODEL; + + @Override + public void renderTileEntityAt(final TileEntity var1, final double x, + final double y, final double z, + final float var8) { + final TLauncher tileEntity = (TLauncher) var1; + if (tileEntity != null && tileEntity.getWorldObj() != null) { + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5f, (float) y + 1.25f, (float) z + 0.5f); + GL11.glScalef(1.0f, 0.85f, 1.0f); + this.bindTexture( + new ResourceLocation("icbm", "textures/models/launcher_0.png")); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + if (tileEntity.getDirection((IBlockAccess) tileEntity.getWorldObj(), + (int) x, (int) y, + (int) z) != ForgeDirection.NORTH && + tileEntity.getDirection((IBlockAccess) tileEntity.getWorldObj(), + (int) x, (int) y, + (int) z) != ForgeDirection.SOUTH) { + GL11.glRotatef(90.0f, 0.0f, 180.0f, 1.0f); + } + RFaSheJia.MODEL.render(0.0625f); + GL11.glPopMatrix(); + } + } + + static { + MODEL = new MFaSheJia(); + } +} diff --git a/src/main/java/icbm/zhapin/render/RFeiBlock.java b/src/main/java/icbm/zhapin/render/RFeiBlock.java new file mode 100644 index 0000000..421fac9 --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RFeiBlock.java @@ -0,0 +1,113 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.zhapin.EGravityBlock; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RFeiBlock extends Render { + public RFeiBlock() { + super.shadowSize = 0.5f; + } + + public void doRenderGravityBlock(final EGravityBlock entity, final double x, + final double y, final double z, + final float par8, final float par9) { + GL11.glPushMatrix(); + GL11.glTranslatef((float) x, (float) y, (float) z); + // TODO: wrong resourceloc + this.bindTexture(new ResourceLocation("minecraft", "textures/terrain.png")); + final Block block = entity.block; + final World world = entity.worldObj; + GL11.glDisable(2896); + GL11.glRotatef(entity.rotationPitch, 0.0f, 0.0f, 1.0f); + GL11.glRotatef(entity.rotationYaw, 0.0f, 1.0f, 0.0f); + this.field_147909_c.blockAccess = (IBlockAccess) world; + + // TODO: looks as shit as vanilla furnace fuel impl + if (block == Blocks.dragon_egg || block == Blocks.grass || + block == Blocks.fence || block == Blocks.wheat || + block == Blocks.leaves || block == Blocks.redstone_torch || + block == Blocks.torch || block == Blocks.tallgrass || + block == Blocks.vine || block == Blocks.log || + block == Blocks.bookshelf || block == Blocks.pumpkin) { + final Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.setTranslation( + (double) (-MathHelper.floor_double(entity.posX) - 0.5f), + (double) (-MathHelper.floor_double(entity.posY) - 0.5f), + (double) (-MathHelper.floor_double(entity.posZ) - 0.5f)); + this.field_147909_c.renderBlockByRenderType( + block, MathHelper.floor_double(entity.posX), + MathHelper.floor_double(entity.posY), + MathHelper.floor_double(entity.posZ)); + tessellator.setTranslation(0.0, 0.0, 0.0); + tessellator.draw(); + } else { + this.renderBlockGravity(block, entity.metadata, this.field_147909_c); + } + GL11.glEnable(2896); + GL11.glPopMatrix(); + } + + public void renderBlockGravity(final Block block, final int metadata, + final RenderBlocks renderer) { + final float var6 = 0.5f; + final float var7 = 1.0f; + final float var8 = 0.8f; + final float var9 = 0.6f; + final Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + final float var10 = 1.0f; + tess.setColorOpaque_F(var6 * var10, var6 * var10, var6 * var10); + renderer.renderFaceYNeg( + block, -0.5, -0.5, -0.5, + renderer.getBlockIconFromSideAndMetadata(block, 0, metadata)); + tess.setColorOpaque_F(var7 * var10, var7 * var10, var7 * var10); + renderer.renderFaceYPos( + block, -0.5, -0.5, -0.5, + renderer.getBlockIconFromSideAndMetadata(block, 1, metadata)); + tess.setColorOpaque_F(var8 * var10, var8 * var10, var8 * var10); + renderer.renderFaceZNeg( + block, -0.5, -0.5, -0.5, + renderer.getBlockIconFromSideAndMetadata(block, 2, metadata)); + tess.setColorOpaque_F(var8 * var10, var8 * var10, var8 * var10); + renderer.renderFaceZPos( + block, -0.5, -0.5, -0.5, + renderer.getBlockIconFromSideAndMetadata(block, 3, metadata)); + tess.setColorOpaque_F(var9 * var10, var9 * var10, var9 * var10); + renderer.renderFaceXNeg( + block, -0.5, -0.5, -0.5, + renderer.getBlockIconFromSideAndMetadata(block, 4, metadata)); + tess.setColorOpaque_F(var9 * var10, var9 * var10, var9 * var10); + renderer.renderFaceXPos( + block, -0.5, -0.5, -0.5, + renderer.getBlockIconFromSideAndMetadata(block, 5, metadata)); + tess.draw(); + } + + @Override + public void doRender(final Entity par1Entity, final double par2, + final double par4, final double par6, final float par8, + final float par9) { + this.doRenderGravityBlock((EGravityBlock) par1Entity, par2, par4, par6, par8, + par9); + } + + @Override + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + // TODO: WTF + return null; + } +} diff --git a/src/main/java/icbm/zhapin/render/RGuangBang.java b/src/main/java/icbm/zhapin/render/RGuangBang.java new file mode 100644 index 0000000..2cc4318 --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RGuangBang.java @@ -0,0 +1,95 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.zhapin.ELightBeam; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RGuangBang extends Render { + @Override + public void doRender(final Entity par1Entity, final double x, final double y, + final double z, final float f, final float f1) { + if (super.renderManager == null) { + this.setRenderManager(RenderManager.instance); + } + final ELightBeam entity = (ELightBeam) par1Entity; + final Tessellator tessellator = Tessellator.instance; + GL11.glDisable(3553); + GL11.glDisable(2896); + GL11.glEnable(3042); + GL11.glBlendFunc(770, 1); + final double[] ad = new double[80]; + final double[] ad2 = new double[80]; + final double d3 = 0.0; + final double d4 = 0.0; + for (int j = 7; j >= 0; --j) { + ad[j] = d3; + ad2[j] = d4; + } + for (int i = 0; i < 4; ++i) { + for (int ii = 0; ii < 3; ++ii) { + int l = 7; + int i2 = 0; + if (ii > 0) { + l = 7 - ii; + } + if (ii > 0) { + i2 = l - 2; + } + final double d5 = ad[l] - d3; + final double d6 = ad2[l] - d4; + for (int iii = l; iii >= i2; --iii) { + final double d7 = d5; + final double d8 = d6; + tessellator.startDrawing(5); + tessellator.setColorRGBA_F(entity.red, entity.green, entity.blue, + 10.0f); + double d9 = 0.1 + i * 0.2; + if (ii == 0) { + d9 *= iii * 0.1 + 1.0; + } + double d10 = 0.1 + i * 0.2; + if (ii == 0) { + d10 *= (iii - 1) * 0.1 + 1.0; + } + for (int iiii = 0; iiii < 5; ++iiii) { + double d11 = x + 0.5 - d9; + double d12 = z + 0.5 - d9; + if (iiii == 1 || iiii == 2) { + d11 += d9 * 2.0; + } + if (iiii == 2 || iiii == 3) { + d12 += d9 * 2.0; + } + double d13 = x + 0.5 - d10; + double d14 = z + 0.5 - d10; + if (iiii == 1 || iiii == 2) { + d13 += d10 * 2.0; + } + if (iiii == 2 || iiii == 3) { + d14 += d10 * 2.0; + } + tessellator.addVertex(d13 + d5, y + iii * 16, d14 + d6); + tessellator.addVertex(d11 + d7, y + (iii + 1) * 16, d12 + d8); + } + tessellator.draw(); + } + } + } + GL11.glDisable(3042); + GL11.glEnable(2896); + GL11.glEnable(3553); + } + + @Override + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + // TODO: WTF + return null; + } +} diff --git a/src/main/java/icbm/zhapin/render/RHJiQi.java b/src/main/java/icbm/zhapin/render/RHJiQi.java new file mode 100644 index 0000000..45f57a6 --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RHJiQi.java @@ -0,0 +1,125 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.zhapin.jiqi.BMachine; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RHJiQi implements ISimpleBlockRenderingHandler { + public static final int ID; + + @Override + public void renderInventoryBlock(final Block block, final int metadata, + final int modelID, + final RenderBlocks renderer) { + if (modelID == RHJiQi.ID) { + GL11.glPushMatrix(); + if (metadata < BMachine.JiQi.FaSheDi.ordinal() * 3 + 3) { + final int tier = metadata; + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + GL11.glScalef(0.4f, 0.4f, 0.4f); + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation("icbm", + "textures/models/launcher_" + tier + ".png")); + if (tier == 0) { + RFaSheDi.modelBase0.render(0.0625f); + RFaSheDi.modelRail0.render(0.0625f); + } else if (tier == 1) { + RFaSheDi.modelBase1.render(0.0625f); + RFaSheDi.modelRail1.render(0.0625f); + GL11.glRotatef(180.0f, 0.0f, 180.0f, 1.0f); + RFaSheDi.modelRail1.render(0.0625f); + } else if (tier == 2) { + RFaSheDi.modelBase2.render(0.0625f); + RFaSheDi.modelRail2.render(0.0625f); + GL11.glRotatef(180.0f, 0.0f, 180.0f, 1.0f); + RFaSheDi.modelRail2.render(0.0625f); + } + } else if (metadata < BMachine.JiQi.FaSheShiMuo.ordinal() * 3 + 3) { + final int tier = metadata - 3; + GL11.glTranslatef(0.0f, 0.9f, 0.0f); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + GL11.glRotatef(180.0f, 0.0f, 180.0f, 1.0f); + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation("icbm", + "textures/models/launcher_" + tier + ".png")); + if (tier == 0) { + RLauncherControlPanel.model0.render(0.0625f); + } else if (tier == 1) { + RLauncherControlPanel.model1.render(0.0625f); + } else if (tier == 2) { + RLauncherControlPanel.model2.render(0.0625f); + } + } else if (metadata < BMachine.JiQi.FaSheJia.ordinal() * 3 + 3) { + GL11.glTranslatef(0.0f, -0.1f, 0.0f); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + GL11.glScalef(0.8f, 0.4f, 0.8f); + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/models/launcher_0.png")); + RFaSheJia.MODEL.render(0.0625f); + } else if (metadata == BMachine.JiQi.LeiDaTai.ordinal() + 6) { + GL11.glTranslatef(0.0f, 0.2f, 0.0f); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + GL11.glScalef(0.55f, 0.6f, 0.55f); + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/models/radar.png")); + RRadarTower.MODEL.render(1.2f, 0.0625f); + } else if (metadata == BMachine.JiQi.DianCiQi.ordinal() + 6) { + GL11.glTranslatef(0.0f, 0.3f, 0.0f); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + GL11.glScalef(0.6f, 0.6f, 0.6f); + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/models/emp_tower.png")); + REmpTower.MODEL.render(0.0f, 0.0625f); + } else if (metadata == BMachine.JiQi.XiaoFaSheQi.ordinal() + 6) { + GL11.glTranslatef(0.0f, 0.4f, 0.0f); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + GL11.glScalef(0.55f, 0.5f, 0.55f); + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation("icbm", + "textures/models/cruise_launcher.png")); + RXiaoFaSheQi.MODEL0.render(0.0625f); + RXiaoFaSheQi.MODEL1.render(0.0625f); + } else if (metadata == BMachine.JiQi.YinDaoQi.ordinal() + 6) { + GL11.glTranslatef(0.0f, 1.1f, 0.0f); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + GL11.glRotatef(180.0f, 0.0f, 1.0f, 0.0f); + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation( + "icbm", "textures/models/missile_coordinator_off.png")); + RYinDaoQi.MODEL.render(0.0f, 0.0625f); + } + GL11.glPopMatrix(); + } + } + + @Override + public boolean renderWorldBlock(final IBlockAccess iBlockAccess, final int x, + final int y, final int z, final Block block, + final int modelID, + final RenderBlocks renderer) { + return false; + } + + @Override + public boolean shouldRender3DInInventory(int meta) { + return true; + } + + @Override + public int getRenderId() { + return RHJiQi.ID; + } + + static { + ID = RenderingRegistry.getNextAvailableRenderId(); + } +} diff --git a/src/main/java/icbm/zhapin/render/RHZhaPin.java b/src/main/java/icbm/zhapin/render/RHZhaPin.java new file mode 100644 index 0000000..ef3b503 --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RHZhaPin.java @@ -0,0 +1,77 @@ +package icbm.zhapin.render; + +import calclavia.lib.render.CalclaviaRenderHelper; +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.MainBase; +import icbm.zhapin.muoxing.jiqi.MSMine; +import icbm.zhapin.zhapin.TExplosive; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RHZhaPin implements ISimpleBlockRenderingHandler { + public static final int ID; + + @Override + public void renderInventoryBlock(final Block block, final int metadata, + final int modelID, + final RenderBlocks renderer) { + if (modelID == RHZhaPin.ID) { + if (metadata == ZhaPin.sMine.getID()) { + GL11.glPushMatrix(); + GL11.glTranslatef(0.0f, 1.5f, 0.0f); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/models/s-mine.png")); + MSMine.INSTANCE.render(0.0625f); + GL11.glPopMatrix(); + } else { + try { + CalclaviaRenderHelper.renderNormalBlockAsItem(block, metadata, + renderer); + } catch (final Exception e) { + MainBase.LOGGER.severe("ICBM Explosive Rendering Crash with: " + + block + " and metadata: " + metadata); + e.printStackTrace(); + } + } + } + } + + @Override + public boolean renderWorldBlock(final IBlockAccess iBlockAccess, final int x, + final int y, final int z, final Block block, + final int modelID, + final RenderBlocks renderer) { + if (modelID != RHZhaPin.ID) { + return false; + } + if (((TExplosive) iBlockAccess.getTileEntity(x, y, z)).explosiveId == ZhaPin.sMine.getID()) { + return false; + } + renderer.renderStandardBlock(block, x, y, z); + return true; + } + + @Override + public boolean shouldRender3DInInventory(int meta) { + return true; + } + + @Override + public int getRenderId() { + return RHZhaPin.ID; + } + + static { + ID = RenderingRegistry.getNextAvailableRenderId(); + } +} diff --git a/src/main/java/icbm/zhapin/render/RItDaoDan.java b/src/main/java/icbm/zhapin/render/RItDaoDan.java new file mode 100644 index 0000000..fde3b01 --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RItDaoDan.java @@ -0,0 +1,80 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.daodan.ItMissile; +import icbm.zhapin.daodan.MissileBase; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RItDaoDan implements IItemRenderer { + public boolean handleRenderType(final ItemStack item, + final IItemRenderer.ItemRenderType type) { + return this.shouldUseRenderHelper(type, item, null); + } + + public boolean shouldUseRenderHelper(final IItemRenderer.ItemRenderType type, + final ItemStack item, + final IItemRenderer.ItemRendererHelper helper) { + return item.getItem() instanceof ItMissile; + } + + public void renderItem(final IItemRenderer.ItemRenderType type, + final ItemStack item, final Object... data) { + if (this.shouldUseRenderHelper(type, item, null)) { + float scale = 0.7f; + float right = 0.0f; + if (type == IItemRenderer.ItemRenderType.INVENTORY) { + scale = 0.4f; + right = 0.15f; + if (ZhaPin.list[item.getItemDamage()].getTier() == 2 || + item.getItem() == ICBMExplosion.itTeBieDaoDan) { + scale /= 1.5f; + } else if (ZhaPin.list[item.getItemDamage()].getTier() == 3) { + scale /= 1.7f; + right = 0.5f; + } else if (ZhaPin.list[item.getItemDamage()].getTier() == 4) { + scale /= 1.4f; + right = 0.2f; + } + GL11.glTranslatef(right, 0.0f, 0.0f); + } + if (type == IItemRenderer.ItemRenderType.EQUIPPED) { + GL11.glTranslatef(1.15f, 1.0f, 0.5f); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + } else { + GL11.glRotatef(-90.0f, 0.0f, 0.0f, 1.0f); + } + if (type == IItemRenderer.ItemRenderType.ENTITY) { + scale /= 1.5f; + } + GL11.glScalef(scale, scale, scale); + if (item.getItem() == ICBMExplosion.itTeBieDaoDan) { + if (item.getItemDamage() < RMissile.SPECIAL_MODELS.length) { + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation( + "icbm", "textures/models/missile_" + + MissileBase.list[item.getItemDamage() + 100] + .getUnlocalizedName() + + + ".png")); + RMissile.SPECIAL_MODELS[item.getItemDamage()].render(0.0625f); + } + } else { + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation( + "icbm", + "textures/models/missile_" + + ZhaPin.list[item.getItemDamage()].getUnlocalizedName() + + ".png")); + RMissile.MODELS[item.getItemDamage()].render(0.0625f); + } + } + } +} diff --git a/src/main/java/icbm/zhapin/render/RItRocketLauncher.java b/src/main/java/icbm/zhapin/render/RItRocketLauncher.java new file mode 100644 index 0000000..02f022c --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RItRocketLauncher.java @@ -0,0 +1,64 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.muoxing.jiqi.MShouFaSheQi; +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RItRocketLauncher implements IItemRenderer { + public static final MShouFaSheQi MODEL; + + public boolean handleRenderType(final ItemStack item, + final IItemRenderer.ItemRenderType type) { + return item.getItem() == ICBMExplosion.itFaSheQi; + } + + public boolean shouldUseRenderHelper(final IItemRenderer.ItemRenderType type, + final ItemStack item, + final IItemRenderer.ItemRendererHelper helper) { + return item.getItem() == ICBMExplosion.itFaSheQi; + } + + public void renderItem(final IItemRenderer.ItemRenderType type, + final ItemStack item, final Object... data) { + GL11.glPushMatrix(); + FMLClientHandler.instance().getClient().renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/models/rocket_launcher.png")); + if (type == IItemRenderer.ItemRenderType.INVENTORY) { + GL11.glTranslatef(0.0f, 1.5f, 0.0f); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + GL11.glScalef(0.8f, 1.0f, 0.8f); + GL11.glTranslatef(0.0f, 0.3f, 0.0f); + } else if (type == IItemRenderer.ItemRenderType.EQUIPPED) { + boolean isThisEntity = false; + final boolean isFirstPerson = Minecraft.getMinecraft().gameSettings.thirdPersonView == 0; + if (data != null && data.length >= 2) { + isThisEntity = (data[1] == Minecraft.getMinecraft().renderViewEntity); + } + if (isThisEntity && isFirstPerson) { + GL11.glTranslatef(0.0f, 2.0f, 0.0f); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + GL11.glRotatef(20.0f, 0.0f, 1.0f, 0.0f); + } else { + final float scale = 2.0f; + GL11.glScalef(scale, scale, scale); + GL11.glRotatef(-105.0f, 0.0f, 0.0f, 1.0f); + GL11.glRotatef(-75.0f, 0.0f, 1.0f, 0.0f); + GL11.glTranslatef(0.1f, -0.9f, 0.6f); + } + } + RItRocketLauncher.MODEL.render(0.0625f); + GL11.glPopMatrix(); + } + + static { + MODEL = new MShouFaSheQi(); + } +} diff --git a/src/main/java/icbm/zhapin/render/RLauncherControlPanel.java b/src/main/java/icbm/zhapin/render/RLauncherControlPanel.java new file mode 100644 index 0000000..c005338 --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RLauncherControlPanel.java @@ -0,0 +1,71 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.zhapin.jiqi.TLauncherControlPanel; +import icbm.zhapin.muoxing.jiqi.MFaSheShiMuo0; +import icbm.zhapin.muoxing.jiqi.MFaSheShiMuo1; +import icbm.zhapin.muoxing.jiqi.MFaSheShiMuo2; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RLauncherControlPanel extends TileEntitySpecialRenderer { + public static final MFaSheShiMuo0 model0; + public static final MFaSheShiMuo1 model1; + public static final MFaSheShiMuo2 model2; + + @Override + public void renderTileEntityAt(final TileEntity var1, final double x, + final double y, final double z, + final float var8) { + final TLauncherControlPanel tileEntity = (TLauncherControlPanel) var1; + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5f, (float) y + 1.5f, (float) z + 0.5f); + this.bindTexture( + new ResourceLocation("icbm", "textures/models/launcher_" + + tileEntity.getTier() + ".png")); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + switch (tileEntity + .getDirection((IBlockAccess) tileEntity.getWorldObj(), (int) x, + (int) y, (int) z) + .ordinal()) { + case 2: { + GL11.glRotatef(180.0f, 0.0f, 180.0f, 1.0f); + break; + } + case 4: { + GL11.glRotatef(90.0f, 0.0f, 180.0f, 1.0f); + break; + } + case 5: { + GL11.glRotatef(-90.0f, 0.0f, 180.0f, 1.0f); + break; + } + } + switch (tileEntity.getTier()) { + case 0: { + RLauncherControlPanel.model0.render(0.0625f); + break; + } + case 1: { + RLauncherControlPanel.model1.render(0.0625f); + break; + } + case 2: { + RLauncherControlPanel.model2.render(0.0625f); + break; + } + } + GL11.glPopMatrix(); + } + + static { + model0 = new MFaSheShiMuo0(); + model1 = new MFaSheShiMuo1(); + model2 = new MFaSheShiMuo2(); + } +} diff --git a/src/main/java/icbm/zhapin/render/RMissile.java b/src/main/java/icbm/zhapin/render/RMissile.java new file mode 100644 index 0000000..1dcbbad --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RMissile.java @@ -0,0 +1,108 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import icbm.zhapin.daodan.EMissile; +import icbm.zhapin.daodan.MissileBase; +import icbm.zhapin.muoxing.daodan.MMBingDan; +import icbm.zhapin.muoxing.daodan.MMChaoShengBuo; +import icbm.zhapin.muoxing.daodan.MMDianCi; +import icbm.zhapin.muoxing.daodan.MMDuQi; +import icbm.zhapin.muoxing.daodan.MMFanDan; +import icbm.zhapin.muoxing.daodan.MMFanWuSu; +import icbm.zhapin.muoxing.daodan.MMFenZiDan; +import icbm.zhapin.muoxing.daodan.MMGanRanDu; +import icbm.zhapin.muoxing.daodan.MMHongSu; +import icbm.zhapin.muoxing.daodan.MMHuanYuan; +import icbm.zhapin.muoxing.daodan.MMHuo; +import icbm.zhapin.muoxing.daodan.MMLa; +import icbm.zhapin.muoxing.daodan.MMLiZi; +import icbm.zhapin.muoxing.daodan.MMPiaoFu; +import icbm.zhapin.muoxing.daodan.MMQi; +import icbm.zhapin.muoxing.daodan.MMQunDan; +import icbm.zhapin.muoxing.daodan.MMShengBuo; +import icbm.zhapin.muoxing.daodan.MMTaiYang; +import icbm.zhapin.muoxing.daodan.MMTuPuo; +import icbm.zhapin.muoxing.daodan.MMTui; +import icbm.zhapin.muoxing.daodan.MMWan; +import icbm.zhapin.muoxing.daodan.MMXiaoQunDan; +import icbm.zhapin.muoxing.daodan.MMYaSuo; +import icbm.zhapin.muoxing.daodan.MMYuanZi; +import icbm.zhapin.muoxing.daodan.MMZhen; +import icbm.zhapin.muoxing.daodan.MMZhuiZhong; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RMissile extends Render { + public static final MICBM[] MODELS; + public static MICBM[] SPECIAL_MODELS; + + public RMissile(final float f) { super.shadowSize = f; } + + @Override + public void doRender(final Entity entity, final double x, final double y, + final double z, final float f, final float f1) { + final EMissile entityMissile = (EMissile)entity; + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + GL11.glRotatef( + entityMissile.prevRotationYaw + + (entityMissile.rotationYaw - entityMissile.prevRotationYaw) * f1 - + 90.0f, + 0.0f, 1.0f, 0.0f); + GL11.glRotatef( + entityMissile.prevRotationPitch + + (entityMissile.rotationPitch - entityMissile.prevRotationPitch) * + f1 + + 90.0f, + 0.0f, 0.0f, 1.0f); + if (entityMissile.missileType == EMissile.MissileType.SMALL_MISSILE) { + GL11.glScalef(0.5f, 0.5f, 0.5f); + } + if (entityMissile.missileId >= 100) { + // TODO: WTF loadTexture -> bindTexture + this.bindTexture(new ResourceLocation( + "icbm", + "textures/models/missile_" + + MissileBase.list[entityMissile.missileId].getUnlocalizedName() + + ".png")); + RMissile.SPECIAL_MODELS[entityMissile.missileId - 100].render( + (Entity)entityMissile, (float)x, (float)y, (float)z, f, f1, 0.0625f); + } else { + this.bindTexture(new ResourceLocation( + "icbm", + "textures/models/missile_" + + ZhaPin.list[entityMissile.missileId].getUnlocalizedName() + + ".png")); + RMissile.MODELS[entityMissile.missileId].render( + (Entity)entityMissile, (float)x, (float)y, (float)z, f, f1, 0.0625f); + } + GL11.glPopMatrix(); + } + +@Override +protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + // TODO: WTF + return null; +} + + static { + MODELS = + new MICBM[] {new MMYaSuo(), new MMXiaoQunDan(), new MMHuo(), + new MMQi(), new MMDuQi(), new MMZhen(), + new MMTui(), new MMLa(), new MMQunDan(), + new MMGanRanDu(), new MMShengBuo(), new MMTuPuo(), + new MMHuanYuan(), new MMLiZi(), new MMYuanZi(), + new MMDianCi(), new MMTaiYang(), new MMBingDan(), + new MMPiaoFu(), new MMWan(), new MMChaoShengBuo(), + new MMFanWuSu(), new MMHongSu()}; + RMissile.SPECIAL_MODELS = + new MICBM[] {new MMYaSuo(), new MMZhuiZhong(), new MMFanDan(), + new MMFenZiDan(), new MMFenZiDan()}; + } +} diff --git a/src/main/java/icbm/zhapin/render/RRadarTower.java b/src/main/java/icbm/zhapin/render/RRadarTower.java new file mode 100644 index 0000000..9affc01 --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RRadarTower.java @@ -0,0 +1,36 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.zhapin.jiqi.TRadarTower; +import icbm.zhapin.muoxing.jiqi.MLeiDa; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RRadarTower extends TileEntitySpecialRenderer { + public static final MLeiDa MODEL; + + public void renderAModelAt(final TRadarTower tileEntity, final double x, + final double y, final double z, final float f) { + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5f, (float) y + 1.5f, (float) z + 0.5f); + this.bindTexture(new ResourceLocation("icbm", "textures/models/radar.png")); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + RRadarTower.MODEL.render(tileEntity.xuanZhuan, 0.0625f); + GL11.glPopMatrix(); + } + + @Override + public void renderTileEntityAt(final TileEntity tileentity, final double d, + final double d1, final double d2, + final float f) { + this.renderAModelAt((TRadarTower) tileentity, d, d1, d2, f); + } + + static { + MODEL = new MLeiDa(); + } +} diff --git a/src/main/java/icbm/zhapin/render/RSMine.java b/src/main/java/icbm/zhapin/render/RSMine.java new file mode 100644 index 0000000..1918b61 --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RSMine.java @@ -0,0 +1,30 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import icbm.zhapin.zhapin.TExplosive; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RSMine extends TileEntitySpecialRenderer { + @Override + public void renderTileEntityAt(final TileEntity var1, final double x, + final double y, final double z, final float var8) { + final TExplosive tileEntity = (TExplosive) var1; + final Object[] data = ZhaPin.list[tileEntity.explosiveId].getRenderData(); + if (data != null) { + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5f, (float) y + 1.5f, (float) z + 0.5f); + this.bindTexture((ResourceLocation) data[1]); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + ((MICBM) data[0]).render(0.0625f); + GL11.glPopMatrix(); + } + } +} diff --git a/src/main/java/icbm/zhapin/render/RShouLiuDan.java b/src/main/java/icbm/zhapin/render/RShouLiuDan.java new file mode 100644 index 0000000..a9e0f7d --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RShouLiuDan.java @@ -0,0 +1,61 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.zhapin.EGrenade; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RShouLiuDan extends Render { + @Override + public void doRender(final Entity entity, final double x, final double y, + final double z, final float par8, final float par9) { + final IIcon icon = ICBMExplosion.itShouLiuDan.getIconFromDamage( + ((EGrenade) entity).haoMa); + GL11.glPushMatrix(); + GL11.glTranslatef((float) x, (float) y + 0.4f, (float) z); + GL11.glEnable(32826); + GL11.glScalef(0.6f, 0.6f, 0.6f); + // TODO: wrong resourceloc + this.bindTexture(new ResourceLocation("gui/items.png")); + final Tessellator tessellator = Tessellator.instance; + this.renderIcon(tessellator, icon); + GL11.glDisable(32826); + GL11.glPopMatrix(); + } + + private void renderIcon(final Tessellator par1Tessellator, final IIcon icon) { + final float f = icon.getMinU(); + final float f2 = icon.getMaxU(); + final float f3 = icon.getMinV(); + final float f4 = icon.getMaxV(); + final float f5 = 1.0f; + final float f6 = 0.5f; + final float f7 = 0.25f; + GL11.glRotatef(180.0f - super.renderManager.playerViewY, 0.0f, 1.0f, 0.0f); + GL11.glRotatef(-super.renderManager.playerViewX, 1.0f, 0.0f, 0.0f); + par1Tessellator.startDrawingQuads(); + par1Tessellator.setNormal(0.0f, 1.0f, 0.0f); + par1Tessellator.addVertexWithUV((double) (0.0f - f6), (double) (0.0f - f7), + 0.0, (double) f, (double) f4); + par1Tessellator.addVertexWithUV((double) (f5 - f6), (double) (0.0f - f7), 0.0, + (double) f2, (double) f4); + par1Tessellator.addVertexWithUV((double) (f5 - f6), (double) (f5 - f7), 0.0, + (double) f2, (double) f3); + par1Tessellator.addVertexWithUV((double) (0.0f - f6), (double) (f5 - f7), 0.0, + (double) f, (double) f3); + par1Tessellator.draw(); + } + + @Override + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + // TODO: WTF + return null; + } +} diff --git a/src/main/java/icbm/zhapin/render/RSuiPian.java b/src/main/java/icbm/zhapin/render/RSuiPian.java new file mode 100644 index 0000000..bc849c8 --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RSuiPian.java @@ -0,0 +1,120 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.zhapin.ESuiPian; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RSuiPian extends Render { + public void renderArrow(final ESuiPian suiPian, final double par2, + final double par4, final double par6, + final float par8, final float par9) { + if (suiPian.isAnvil) { + GL11.glPushMatrix(); + GL11.glTranslatef((float) par2, (float) par4, (float) par6); + // TODO: wrong resourceloc + this.bindTexture( + new ResourceLocation("minecraft", "textures/terrain.png")); + // yay anvilcraft + final Block block = Blocks.anvil; + final World world = suiPian.worldObj; + GL11.glDisable(2896); + this.field_147909_c.blockAccess = (IBlockAccess) world; + final Tessellator var12 = Tessellator.instance; + var12.startDrawingQuads(); + var12.setTranslation( + (double) (-MathHelper.floor_double(suiPian.posX) - 0.5f), + (double) (-MathHelper.floor_double(suiPian.posY) - 0.5f), + (double) (-MathHelper.floor_double(suiPian.posZ) - 0.5f)); + this.field_147909_c.renderBlockByRenderType( + block, MathHelper.floor_double(suiPian.posX), + MathHelper.floor_double(suiPian.posY), + MathHelper.floor_double(suiPian.posZ)); + var12.setTranslation(0.0, 0.0, 0.0); + var12.draw(); + GL11.glEnable(2896); + GL11.glPopMatrix(); + } else { + this.bindTexture( + new ResourceLocation("icbm", "textures/models/fragment.png")); + GL11.glPushMatrix(); + GL11.glTranslatef((float) par2, (float) par4, (float) par6); + GL11.glRotatef( + suiPian.prevRotationYaw + + (suiPian.rotationYaw - suiPian.prevRotationYaw) * par9 - 90.0f, + 0.0f, 1.0f, 0.0f); + GL11.glRotatef(suiPian.prevRotationPitch + + (suiPian.rotationPitch - suiPian.prevRotationPitch) * + par9, + 0.0f, 0.0f, 1.0f); + final Tessellator var13 = Tessellator.instance; + final byte var14 = 0; + final float var15 = 0.0f; + final float var16 = 0.5f; + final float var17 = (0 + var14 * 10) / 32.0f; + final float var18 = (5 + var14 * 10) / 32.0f; + final float var19 = 0.0f; + final float var20 = 0.15625f; + final float var21 = (5 + var14 * 10) / 32.0f; + final float var22 = (10 + var14 * 10) / 32.0f; + final float var23 = 0.05625f; + GL11.glEnable(32826); + final float var24 = suiPian.arrowShake - par9; + if (var24 > 0.0f) { + final float var25 = -MathHelper.sin(var24 * 3.0f) * var24; + GL11.glRotatef(var25, 0.0f, 0.0f, 1.0f); + } + GL11.glRotatef(45.0f, 1.0f, 0.0f, 0.0f); + GL11.glScalef(var23, var23, var23); + GL11.glTranslatef(-4.0f, 0.0f, 0.0f); + GL11.glNormal3f(var23, 0.0f, 0.0f); + var13.startDrawingQuads(); + var13.addVertexWithUV(-7.0, -2.0, -2.0, (double) var19, (double) var21); + var13.addVertexWithUV(-7.0, -2.0, 2.0, (double) var20, (double) var21); + var13.addVertexWithUV(-7.0, 2.0, 2.0, (double) var20, (double) var22); + var13.addVertexWithUV(-7.0, 2.0, -2.0, (double) var19, (double) var22); + var13.draw(); + GL11.glNormal3f(-var23, 0.0f, 0.0f); + var13.startDrawingQuads(); + var13.addVertexWithUV(-7.0, 2.0, -2.0, (double) var19, (double) var21); + var13.addVertexWithUV(-7.0, 2.0, 2.0, (double) var20, (double) var21); + var13.addVertexWithUV(-7.0, -2.0, 2.0, (double) var20, (double) var22); + var13.addVertexWithUV(-7.0, -2.0, -2.0, (double) var19, (double) var22); + var13.draw(); + for (int var26 = 0; var26 < 4; ++var26) { + GL11.glRotatef(90.0f, 1.0f, 0.0f, 0.0f); + GL11.glNormal3f(0.0f, 0.0f, var23); + var13.startDrawingQuads(); + var13.addVertexWithUV(-8.0, -2.0, 0.0, (double) var15, (double) var17); + var13.addVertexWithUV(8.0, -2.0, 0.0, (double) var16, (double) var17); + var13.addVertexWithUV(8.0, 2.0, 0.0, (double) var16, (double) var18); + var13.addVertexWithUV(-8.0, 2.0, 0.0, (double) var15, (double) var18); + var13.draw(); + } + GL11.glDisable(32826); + GL11.glPopMatrix(); + } + } + + public void doRender(final Entity par1Entity, final double par2, + final double par4, final double par6, final float par8, + final float par9) { + this.renderArrow((ESuiPian) par1Entity, par2, par4, par6, par8, par9); + } + + @Override + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + // TODO: WTF + return null; + } +} diff --git a/src/main/java/icbm/zhapin/render/RXiaoFaSheQi.java b/src/main/java/icbm/zhapin/render/RXiaoFaSheQi.java new file mode 100644 index 0000000..bc129a6 --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RXiaoFaSheQi.java @@ -0,0 +1,43 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.zhapin.jiqi.TCruiseLauncher; +import icbm.zhapin.muoxing.jiqi.MXiaoFaSheQi; +import icbm.zhapin.muoxing.jiqi.MXiaoFaSheQiJia; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RXiaoFaSheQi extends TileEntitySpecialRenderer { + public static final MXiaoFaSheQi MODEL0; + public static final MXiaoFaSheQiJia MODEL1; + + public void renderModelAt(final TCruiseLauncher tileEntity, final double d, + final double d1, final double d2, final float f) { + GL11.glPushMatrix(); + GL11.glTranslatef((float) d + 0.5f, (float) d1 + 1.5f, (float) d2 + 0.5f); + this.bindTexture( + new ResourceLocation("icbm", "textures/models/cruise_launcher.png")); + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + RXiaoFaSheQi.MODEL0.render(0.0625f); + GL11.glRotatef(tileEntity.rotationYaw + 90.0f, 0.0f, 1.0f, 0.0f); + GL11.glRotatef(-tileEntity.rotationPitch, 1.0f, 0.0f, 0.0f); + RXiaoFaSheQi.MODEL1.render(0.0625f); + GL11.glPopMatrix(); + } + + @Override + public void renderTileEntityAt(final TileEntity tileentity, final double d, + final double d1, final double d2, + final float f) { + this.renderModelAt((TCruiseLauncher) tileentity, d, d1, d2, f); + } + + static { + MODEL0 = new MXiaoFaSheQi(); + MODEL1 = new MXiaoFaSheQiJia(); + } +} diff --git a/src/main/java/icbm/zhapin/render/RYinDaoQi.java b/src/main/java/icbm/zhapin/render/RYinDaoQi.java new file mode 100644 index 0000000..1eed336 --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RYinDaoQi.java @@ -0,0 +1,71 @@ +package icbm.zhapin.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.zhapin.jiqi.TMissileCoordinator; +import icbm.zhapin.muoxing.jiqi.MYinDaoQi; +import java.util.List; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RYinDaoQi extends TileEntitySpecialRenderer { + public static final MYinDaoQi MODEL; + + public void renderModelAt(final TMissileCoordinator tileEntity, final double x, + final double y, final double z, final float f) { + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5f, (float) y + 1.5f, (float) z + 0.5f); + final int radius = 2; + final List players = tileEntity.getWorldObj().getEntitiesWithinAABB( + EntityPlayer.class, + AxisAlignedBB.getBoundingBox((double) (tileEntity.xCoord - radius), + (double) (tileEntity.yCoord - radius), + (double) (tileEntity.zCoord - radius), + (double) (tileEntity.xCoord + radius), + (double) (tileEntity.yCoord + radius), + (double) (tileEntity.zCoord + radius))); + if (players.size() > 0) { + this.bindTexture(new ResourceLocation( + "icbm", "textures/models/missile_coordinator_on.png")); + } else { + this.bindTexture(new ResourceLocation( + "icbm", "textures/models/missile_coordinator_off.png")); + } + GL11.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + switch (tileEntity + .getDirection((IBlockAccess) tileEntity.getWorldObj(), (int) x, + (int) y, (int) z) + .ordinal()) { + case 2: { + GL11.glRotatef(180.0f, 0.0f, 180.0f, 1.0f); + break; + } + case 4: { + GL11.glRotatef(90.0f, 0.0f, 180.0f, 1.0f); + break; + } + case 5: { + GL11.glRotatef(-90.0f, 0.0f, 180.0f, 1.0f); + break; + } + } + RYinDaoQi.MODEL.render(0.0f, 0.0625f); + GL11.glPopMatrix(); + } + + public void renderTileEntityAt(final TileEntity tileentity, final double d, + final double d1, final double d2, + final float f) { + this.renderModelAt((TMissileCoordinator) tileentity, d, d1, d2, f); + } + + static { + MODEL = new MYinDaoQi(); + } +} diff --git a/src/main/java/icbm/zhapin/render/RZhaPin.java b/src/main/java/icbm/zhapin/render/RZhaPin.java new file mode 100644 index 0000000..69df058 --- /dev/null +++ b/src/main/java/icbm/zhapin/render/RZhaPin.java @@ -0,0 +1,161 @@ +package icbm.zhapin.render; + +import calclavia.lib.render.CalclaviaRenderHelper; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.MICBM; +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.Random; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.glu.Sphere; + +@SideOnly(Side.CLIENT) +public class RZhaPin extends Render { + public Random random; + + public RZhaPin() { + this.random = new Random(); + } + + public void doRender(final Entity entity, final double x, final double y, + final double z, final float par8, final float par9) { + final EExplosion eZhaPin = (EExplosion) entity; + if (eZhaPin.haoMa == ZhaPin.redMatter.getID()) { + final Tessellator tessellator = Tessellator.instance; + GL11.glPushMatrix(); + GL11.glTranslatef((float) x, (float) y, (float) z); + CalclaviaRenderHelper.enableBlending(); + CalclaviaRenderHelper.disableLighting(); + GL11.glColor4f(0.0f, 0.0f, 0.0f, 0.9f); + final Sphere sphere = new Sphere(); + sphere.draw(5.0f, 32, 32); + CalclaviaRenderHelper.enableLighting(); + CalclaviaRenderHelper.disableBlending(); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glDepthMask(false); + CalclaviaRenderHelper.enableBlending(); + CalclaviaRenderHelper.disableLighting(); + GL11.glTranslated(x, y, z); + GL11.glRotatef((float) entity.ticksExisted, 0.0f, 1.0f, 0.0f); + final float size = 10.0f; + final int textureSize = 50; + final float size2 = size * 5.0f; + final float float_sizeMinus0_01 = textureSize - 0.01f; + final float x2 = (textureSize + 0.0f) / size2; + final float x3 = (textureSize + float_sizeMinus0_01) / size2; + final float x4 = (textureSize + 0.0f) / size2; + final float x5 = (textureSize + float_sizeMinus0_01) / size2; + Minecraft.getMinecraft().renderEngine.bindTexture( + new ResourceLocation("icbm", "textures/blackhole.png")); + tessellator.startDrawingQuads(); + tessellator.setBrightness(240); + tessellator.setColorRGBA_F(1.0f, 1.0f, 1.0f, 1.0f); + tessellator.addVertexWithUV((double) (-size), 0.0, (double) (-size), + (double) x3, (double) x5); + tessellator.addVertexWithUV((double) (-size), 0.0, (double) size, + (double) x3, (double) x4); + tessellator.addVertexWithUV((double) size, 0.0, (double) size, (double) x2, + (double) x4); + tessellator.addVertexWithUV((double) size, 0.0, (double) (-size), + (double) x2, (double) x5); + tessellator.draw(); + CalclaviaRenderHelper.enableLighting(); + CalclaviaRenderHelper.disableBlending(); + GL11.glDepthMask(true); + GL11.glPopMatrix(); + float par10; + for (par10 = (float) entity.ticksExisted; par10 > 200.0f; par10 -= 100.0f) { + } + RenderHelper.disableStandardItemLighting(); + final float var41 = (5.0f + par10) / 200.0f; + float var42 = 0.0f; + if (var41 > 0.8f) { + var42 = (var41 - 0.8f) / 0.2f; + } + final Random rand = new Random(432L); + GL11.glPushMatrix(); + GL11.glTranslatef((float) x, (float) y, (float) z); + GL11.glDisable(3553); + GL11.glShadeModel(7425); + GL11.glEnable(3042); + GL11.glBlendFunc(770, 1); + GL11.glDisable(3008); + GL11.glEnable(2884); + GL11.glDepthMask(false); + GL11.glPushMatrix(); + GL11.glTranslatef(0.0f, -1.0f, -2.0f); + for (int i1 = 0; i1 < (var41 + var41 * var41) / 2.0f * 60.0f; ++i1) { + GL11.glRotatef(rand.nextFloat() * 360.0f, 1.0f, 0.0f, 0.0f); + GL11.glRotatef(rand.nextFloat() * 360.0f, 0.0f, 1.0f, 0.0f); + GL11.glRotatef(rand.nextFloat() * 360.0f, 0.0f, 0.0f, 1.0f); + GL11.glRotatef(rand.nextFloat() * 360.0f, 1.0f, 0.0f, 0.0f); + GL11.glRotatef(rand.nextFloat() * 360.0f, 0.0f, 1.0f, 0.0f); + GL11.glRotatef(rand.nextFloat() * 360.0f + var41 * 90.0f, 0.0f, 0.0f, + 1.0f); + tessellator.startDrawing(6); + final float var43 = rand.nextFloat() * 20.0f + 5.0f + var42 * 10.0f; + final float var44 = rand.nextFloat() * 2.0f + 1.0f + var42 * 2.0f; + tessellator.setColorRGBA_I(16777215, (int) (255.0f * (1.0f - var42))); + tessellator.addVertex(0.0, 0.0, 0.0); + tessellator.setColorRGBA_I(0, 0); + tessellator.addVertex(-0.866 * var44, (double) var43, + (double) (-0.5f * var44)); + tessellator.addVertex(0.866 * var44, (double) var43, + (double) (-0.5f * var44)); + tessellator.addVertex(0.0, (double) var43, (double) (1.0f * var44)); + tessellator.addVertex(-0.866 * var44, (double) var43, + (double) (-0.5f * var44)); + tessellator.draw(); + } + GL11.glPopMatrix(); + GL11.glDepthMask(true); + GL11.glDisable(2884); + GL11.glDisable(3042); + GL11.glShadeModel(7424); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GL11.glEnable(3553); + GL11.glEnable(3008); + RenderHelper.enableStandardItemLighting(); + GL11.glPopMatrix(); + } else { + final Object[] data = ZhaPin.list[eZhaPin.haoMa].getRenderData(); + if (data != null) { + GL11.glPushMatrix(); + GL11.glTranslatef((float) x, (float) y + 1.0f, (float) z); + GL11.glRotatef(eZhaPin.rotationPitch, 0.0f, 0.0f, 1.0f); + this.bindTexture((ResourceLocation) data[1]); + ((MICBM) data[0]) + .render((Entity) eZhaPin, (float) x, (float) y, (float) z, par8, par9, + 0.0625f); + GL11.glPopMatrix(); + } + } + } + + public void drawCircle(final double x, final double y, final double radius, + final double accuracy) { + GL11.glDisable(3553); + final double da = Math.min(2.0 * Math.asin(1.0 / radius) / accuracy, 10000.0); + GL11.glBegin(6); + GL11.glVertex2d(x, y); + for (double a = 0.0; a <= 6.283185307179586; a += da) { + GL11.glVertex2d(x + Math.cos(a) * radius, y + Math.sin(a) * radius); + } + GL11.glVertex2d(x + radius, y); + GL11.glEnd(); + } + + @Override + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + // TODO: WTF + return null; + } +} diff --git a/src/main/java/icbm/zhapin/rongqi/CFaShiDi.java b/src/main/java/icbm/zhapin/rongqi/CFaShiDi.java new file mode 100644 index 0000000..7448069 --- /dev/null +++ b/src/main/java/icbm/zhapin/rongqi/CFaShiDi.java @@ -0,0 +1,67 @@ +package icbm.zhapin.rongqi; + +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.jiqi.TLauncherPlatform; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import universalelectricity.prefab.SlotSpecific; + +public class CFaShiDi extends Container { + private TLauncherPlatform missileLauncher; + + public CFaShiDi(final InventoryPlayer par1InventoryPlayer, + final TLauncherPlatform tileEntity) { + this.missileLauncher = tileEntity; + this.addSlotToContainer((Slot) new SlotSpecific( + (IInventory) tileEntity, 0, 84, 47, + new ItemStack[] { new ItemStack(ICBMExplosion.itDaoDan), + new ItemStack(ICBMExplosion.itTeBieDaoDan) })); + for (int var3 = 0; var3 < 3; ++var3) { + for (int var4 = 0; var4 < 9; ++var4) { + this.addSlotToContainer(new Slot((IInventory) par1InventoryPlayer, + var4 + var3 * 9 + 9, 8 + var4 * 18, + 84 + var3 * 18)); + } + } + for (int var3 = 0; var3 < 9; ++var3) { + this.addSlotToContainer( + new Slot((IInventory) par1InventoryPlayer, var3, 8 + var3 * 18, 142)); + } + } + + public boolean canInteractWith(final EntityPlayer par1EntityPlayer) { + return this.missileLauncher.isUseableByPlayer(par1EntityPlayer); + } + + public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, + final int par1) { + ItemStack var2 = null; + final Slot var3 = (Slot) super.inventorySlots.get(par1); + if (var3 != null && var3.getHasStack()) { + final ItemStack var4 = var3.getStack(); + var2 = var4.copy(); + if (par1 != 0) { + if (this.getSlot(0).isItemValid(var4) && + !this.mergeItemStack(var4, 0, 1, false)) { + return null; + } + } else if (!this.mergeItemStack(var4, 3, 37, false)) { + return null; + } + if (var4.stackSize == 0) { + var3.putStack((ItemStack) null); + } else { + var3.onSlotChanged(); + } + if (var4.stackSize == var2.stackSize) { + return null; + } + var3.onPickupFromSlot(par1EntityPlayer, var4); + } + return var2; + } +} diff --git a/src/main/java/icbm/zhapin/rongqi/CXiaoFaSheQi.java b/src/main/java/icbm/zhapin/rongqi/CXiaoFaSheQi.java new file mode 100644 index 0000000..7bec8ca --- /dev/null +++ b/src/main/java/icbm/zhapin/rongqi/CXiaoFaSheQi.java @@ -0,0 +1,78 @@ +package icbm.zhapin.rongqi; + +import icbm.zhapin.daodan.ItMissile; +import icbm.zhapin.jiqi.TCruiseLauncher; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import universalelectricity.core.item.IItemElectric; +import universalelectricity.prefab.SlotSpecific; + +public class CXiaoFaSheQi extends Container { + private TCruiseLauncher tileEntity; + + public CXiaoFaSheQi(final InventoryPlayer par1InventoryPlayer, + final TCruiseLauncher tileEntity) { + this.tileEntity = tileEntity; + this.addSlotToContainer((Slot) new SlotSpecific( + (IInventory) tileEntity, 0, 151, 23, new Class[] { ItMissile.class })); + this.addSlotToContainer((Slot) new SlotSpecific( + (IInventory) tileEntity, 1, 151, 47, new Class[] { IItemElectric.class })); + for (int var3 = 0; var3 < 3; ++var3) { + for (int var4 = 0; var4 < 9; ++var4) { + this.addSlotToContainer(new Slot((IInventory) par1InventoryPlayer, + var4 + var3 * 9 + 9, 8 + var4 * 18, + 84 + var3 * 18)); + } + } + for (int var3 = 0; var3 < 9; ++var3) { + this.addSlotToContainer( + new Slot((IInventory) par1InventoryPlayer, var3, 8 + var3 * 18, 142)); + } + tileEntity.openInventory(); + } + + public void onContainerClosed(final EntityPlayer entityplayer) { + super.onContainerClosed(entityplayer); + this.tileEntity.closeInventory(); + } + + public boolean canInteractWith(final EntityPlayer par1EntityPlayer) { + return this.tileEntity.isUseableByPlayer(par1EntityPlayer); + } + + public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, + final int par1) { + ItemStack var2 = null; + final Slot var3 = (Slot) super.inventorySlots.get(par1); + if (var3 != null && var3.getHasStack()) { + final ItemStack var4 = var3.getStack(); + var2 = var4.copy(); + if (par1 > 1) { + if (this.getSlot(0).isItemValid(var4)) { + if (!this.mergeItemStack(var4, 0, 1, false)) { + return null; + } + } else if (this.getSlot(1).isItemValid(var4) && + !this.mergeItemStack(var4, 1, 2, false)) { + return null; + } + } else if (!this.mergeItemStack(var4, 2, 38, false)) { + return null; + } + if (var4.stackSize == 0) { + var3.putStack((ItemStack) null); + } else { + var3.onSlotChanged(); + } + if (var4.stackSize == var2.stackSize) { + return null; + } + var3.onPickupFromSlot(par1EntityPlayer, var4); + } + return var2; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/BExplosives.java b/src/main/java/icbm/zhapin/zhapin/BExplosives.java new file mode 100644 index 0000000..f2aa261 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/BExplosives.java @@ -0,0 +1,372 @@ +package icbm.zhapin.zhapin; + +import cpw.mods.fml.common.FMLLog; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.api.ICamouflageMaterial; +import icbm.core.ICBMTab; +import icbm.core.di.BICBM; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.render.RHZhaPin; +import java.util.List; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.Explosion; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.vector.Vector3; +import universalelectricity.core.vector.VectorHelper; + +public class BExplosives extends BICBM implements ICamouflageMaterial { + public static final IIcon[] ICON_TOP; + public static final IIcon[] ICON_SIDE; + public static final IIcon[] ICON_BOTTOM; + + public BExplosives() { + super("explosives", Material.tnt); + this.setHardness(0.0f); + this.setStepSound(BExplosives.soundTypeGrass); + this.setCreativeTab((CreativeTabs)ICBMTab.INSTANCE); + } + + private static byte + determineOrientation(final World world, final int x, final int y, final int z, + final EntityLivingBase entityLiving) { + if (entityLiving != null) { + if (MathHelper.abs((float)((Entity)entityLiving).posX - x) < 2.0f && + MathHelper.abs((float)((Entity)entityLiving).posZ - z) < 2.0f) { + final double var5 = + ((Entity)entityLiving).posY + 1.82 - ((Entity)entityLiving).yOffset; + if (var5 - y > 2.0) { + return 1; + } + if (y - var5 > 0.0) { + return 0; + } + } + final int rotation = + MathHelper.floor_double( + ((Entity)entityLiving).rotationYaw * 4.0f / 360.0f + 0.5) & + 0x3; + return ( + byte)((rotation == 0) + ? 2 + : ((rotation == 1) + ? 5 + : ((rotation == 2) ? 3 + : ((rotation == 3) ? 4 : 0)))); + } + return 0; + } + + @Override + public void setBlockBoundsBasedOnState(final IBlockAccess par1IBlockAccess, + final int x, final int y, + final int z) { + final TileEntity tileEntity = par1IBlockAccess.getTileEntity(x, y, z); + if (tileEntity != null && tileEntity instanceof TExplosive && + ((TExplosive)tileEntity).explosiveId == ZhaPin.sMine.getID()) { + this.setBlockBounds(0.0f, 0.0f, 0.0f, 1.0f, 0.2f, 1.0f); + return; + } + this.setBlockBounds(0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f); + } + + @Override + public void setBlockBoundsForItemRender() { + this.setBlockBounds(0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(final World par1World, + final int x, final int y, + final int z) { + final TileEntity tileEntity = par1World.getTileEntity(x, y, z); + if (tileEntity != null && tileEntity instanceof TExplosive && + ((TExplosive)tileEntity).explosiveId == ZhaPin.sMine.getID()) { + return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, + z + this.minZ, x + this.maxX, y + 0.2, + z + this.maxZ); + } + return super.getCollisionBoundingBoxFromPool(par1World, x, y, z); + } + + @Override + public void onBlockPlacedBy(final World world, final int x, final int y, + final int z, final EntityLivingBase entityLiving, + final ItemStack itemStack) { + final int explosiveID = + ((TExplosive)world.getTileEntity(x, y, z)).explosiveId; + if (!world.isRemote && + ICBMExplosion.shiBaoHu(world, new Vector3(x, y, z), + ZhaPin.ZhaPinType.ZHA_DAN, explosiveID)) { + this.dropBlockAsItem(world, x, y, z, explosiveID, 0); + world.setBlock(x, y, z, Blocks.air, 0, 2); + return; + } + world.setBlockMetadataWithNotify( + x, y, z, + VectorHelper + .getOrientationFromSide( + ForgeDirection.getOrientation( + (int)determineOrientation(world, x, y, z, entityLiving)), + ForgeDirection.NORTH) + .ordinal(), + 2); + if (world.isBlockIndirectlyGettingPowered(x, y, z)) { + yinZha(world, x, y, z, explosiveID, 0); + } + for (byte i = 0; i < 6; ++i) { + final Vector3 position = new Vector3(x, y, z); + position.modifyPositionFromSide(ForgeDirection.getOrientation((int)i)); + final Block block = position.getBlock((IBlockAccess)world); + if (block == Blocks.fire || block == Blocks.flowing_lava || + block == Blocks.lava) { + yinZha(world, x, y, z, explosiveID, 2); + } + } + if (entityLiving != null) { + FMLLog.fine(entityLiving.getCommandSenderName() + " placed " + + ZhaPin.list[explosiveID].getExplosiveName() + + " in: " + x + ", " + y + ", " + z + ".", + new Object[0]); + } + } + + @Override + public IIcon getIcon(final IBlockAccess par1IBlockAccess, final int x, + final int y, final int z, final int side) { + final int explosiveID = + ((TExplosive)par1IBlockAccess.getTileEntity(x, y, z)).explosiveId; + return this.getIcon(side, explosiveID); + } + + @Override + public IIcon getIcon(final int side, final int explosiveID) { + if (side == 0) { + return BExplosives.ICON_BOTTOM[ZhaPin.list[explosiveID].getTier() - 1]; + } + if (side == 1) { + return BExplosives.ICON_TOP[explosiveID]; + } + return BExplosives.ICON_SIDE[explosiveID]; + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(final IIconRegister iconRegister) { + for (int i = 0; i < ZhaPin.E_SI_ID; ++i) { + BExplosives.ICON_TOP[i] = iconRegister.registerIcon( + "icbm:explosive_" + ZhaPin.list[i].getUnlocalizedName() + "_top"); + BExplosives.ICON_SIDE[i] = iconRegister.registerIcon( + "icbm:explosive_" + ZhaPin.list[i].getUnlocalizedName() + "_side"); + } + + for (int tier = 0; tier < 4; ++tier) { + BExplosives.ICON_BOTTOM[tier] = + iconRegister.registerIcon("icbm:explosive_bottom_" + (tier + 1)); + } + } + + // TODO: WTF + // public IIcon getIcon(final IIconRegister iconRegister, final int i, + // final String suffix) { + // final ITexturePack itexturepack = + // Minecraft.getMinecraft().texturePackList.getSelectedTexturePack(); final + // String iconName = "explosive_" + ZhaPin.list[i].getUnlocalizedName() + + // suffix; final String path = "/mods/" + // + "icbm:".replace(":", "") + "/textures/blocks/" + + // iconName + ".png"; + // try { + // final BufferedImage bufferedimage = + // ImageIO.read(itexturepack.getResourceAsStream(path)); return + // iconRegister.registerIcon("icbm:" + iconName); + // } catch (final Exception e) { + // if (suffix.equals("_bottom")) { + // return iconRegister.registerIcon("icbm:explosive_bottom_" + + // ZhaPin.list[i].getTier()); + // } + // return iconRegister.registerIcon("icbm:explosive_base_" + + // ZhaPin.list[i].getTier()); + // } + // } + + @Override + public void onBlockAdded(final World par1World, final int x, final int y, + final int z) { + super.onBlockAdded(par1World, x, y, z); + par1World.markBlockRangeForRenderUpdate(x, y, z, x, y, z); + } + + @Override + public void onNeighborBlockChange(final World world, final int x, final int y, + final int z, final Block block) { + final int explosiveID = + ((TExplosive)world.getTileEntity(x, y, z)).explosiveId; + if (world.isBlockIndirectlyGettingPowered(x, y, z)) { + yinZha(world, x, y, z, explosiveID, 0); + } else if (block == Blocks.fire || block == Blocks.flowing_lava || + block == Blocks.lava) { + yinZha(world, x, y, z, explosiveID, 2); + } + } + + public static void yinZha(final World world, final int x, final int y, + final int z, final int explosiveID, + final int causeOfExplosion) { + if (!world.isRemote && + !ICBMExplosion.shiBaoHu(world, new Vector3(x, y, z), + ZhaPin.ZhaPinType.ZHA_DAN, explosiveID)) { + final TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity != null && tileEntity instanceof TExplosive) { + ((TExplosive)tileEntity).exploding = true; + ZhaPin.list[explosiveID].spawnZhaDan( + world, new Vector3(x, y, z), + ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)), + (byte)causeOfExplosion); + world.setBlock(x, y, z, Blocks.air, 0, 2); + } + } + } + + @Override + public void onBlockDestroyedByExplosion(final World par1World, final int x, + final int y, final int z, + final Explosion explosion) { + if (par1World.getTileEntity(x, y, z) != null) { + final int explosiveID = + ((TExplosive)par1World.getTileEntity(x, y, z)).explosiveId; + yinZha(par1World, x, y, z, explosiveID, 1); + } + } + + @Override + public boolean + onBlockActivated(final World par1World, final int x, final int y, final int z, + final EntityPlayer par5EntityPlayer, final int par6, + final float par7, final float par8, final float par9) { + final TileEntity tileEntity = par1World.getTileEntity(x, y, z); + if (par5EntityPlayer.getCurrentEquippedItem() != null) { + if (par5EntityPlayer.getCurrentEquippedItem().getItem() == + Items.flint_and_steel) { + final int explosiveID = ((TExplosive)tileEntity).explosiveId; + yinZha(par1World, x, y, z, explosiveID, 0); + return true; + } + if (this.isUsableWrench(par5EntityPlayer, + par5EntityPlayer.getCurrentEquippedItem(), x, y, + z)) { + byte change = 3; + switch (par1World.getBlockMetadata(x, y, z)) { + case 0: { + change = 2; + break; + } + case 2: { + change = 5; + break; + } + case 5: { + change = 3; + break; + } + case 3: { + change = 4; + break; + } + case 4: { + change = 1; + break; + } + case 1: { + change = 0; + break; + } + } + par1World.setBlockMetadataWithNotify( + x, y, z, ForgeDirection.getOrientation((int)change).ordinal(), 3); + par1World.notifyBlockChange(x, y, z, this); + return true; + } + } + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderType() { + return RHZhaPin.ID; + } + + @Override + public ItemStack getPickBlock(final MovingObjectPosition target, + final World world, final int x, final int y, + final int z) { + if (world.getTileEntity(x, y, z) != null) { + final int explosiveID = + ((TExplosive)world.getTileEntity(x, y, z)).explosiveId; + return new ItemStack(this, 1, explosiveID); + } + return null; + } + + @Override + public void breakBlock(final World world, final int x, final int y, + final int z, final Block par5, final int par6) { + final TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity != null && tileEntity instanceof TExplosive && + !((TExplosive)tileEntity).exploding) { + final int explosiveID = ((TExplosive)tileEntity).explosiveId; + final Item id = + this.getItemDropped(world.getBlockMetadata(x, y, z), world.rand, 0); + this.dropBlockAsItem(world, x, y, z, new ItemStack(id, 1, explosiveID)); + } + super.breakBlock(world, x, y, z, par5, par6); + } + + @Override + public int quantityDropped(final Random par1Random) { + return 0; + } + + @Override + public void getSubBlocks(final Item par1, final CreativeTabs par2CreativeTabs, + final List par3List) { + for (int i = 0; i < ZhaPin.E_SI_ID; ++i) { + par3List.add(new ItemStack((Block)this, 1, i)); + } + par3List.add(new ItemStack((Block)this, 1, ZhaPin.sMine.getID())); + } + + @Override + public TileEntity createNewTileEntity(final World var1, int meta) { + return new TExplosive(); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + static { + ICON_TOP = new IIcon[ZhaPin.list.length]; + ICON_SIDE = new IIcon[ZhaPin.list.length]; + ICON_BOTTOM = new IIcon[4]; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/EExplosion.java b/src/main/java/icbm/zhapin/zhapin/EExplosion.java new file mode 100644 index 0000000..1f01a3d --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/EExplosion.java @@ -0,0 +1,154 @@ +package icbm.zhapin.zhapin; + +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import icbm.zhapin.ICBMExplosion; +import io.netty.buffer.ByteBuf; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class EExplosion extends Entity implements IEntityAdditionalSpawnData { + public int haoMa; + public int jiaoShuMu; + public int tickCallCounter; + private int metadata; + private boolean endExplosion; + public List entityList; + public List dataList1; + public List dataList2; + private boolean isMobile; + + public EExplosion(final World par1World) { + super(par1World); + this.metadata = -1; + this.endExplosion = false; + this.entityList = new ArrayList<>(); + this.dataList1 = new ArrayList<>(); + this.dataList2 = new ArrayList<>(); + this.isMobile = false; + super.preventEntitySpawning = true; + this.setSize(0.98f, 0.98f); + super.yOffset = super.height / 2.0f; + super.renderDistanceWeight = 2.0; + super.ignoreFrustumCheck = true; + } + + public EExplosion(final World par1World, final Vector3 position, + final int explosionID, final boolean isMobile) { + this(par1World); + this.jiaoShuMu = 0; + this.haoMa = explosionID; + this.isMobile = isMobile; + this.setPosition(position.x, position.y, position.z); + } + + public EExplosion(final World par1World, final Vector3 position, + final int explosionID, final boolean isMobile, + final int metadata) { + this(par1World, position, explosionID, isMobile); + this.metadata = metadata; + } + + @Override + public String getCommandSenderName() { + return "Explosion"; + } + + @Override + public void writeSpawnData(final ByteBuf data) { + data.writeBoolean(this.isMobile); + data.writeInt(this.haoMa); + data.writeInt(this.metadata); + } + + @Override + public void readSpawnData(final ByteBuf data) { + this.isMobile = data.readBoolean(); + this.haoMa = data.readInt(); + this.metadata = data.readInt(); + } + + @Override + protected void entityInit() { + } + + @Override + protected boolean canTriggerWalking() { + return false; + } + + @Override + public boolean canBeCollidedWith() { + return false; + } + + @Override + public void onUpdate() { + if (!super.worldObj.isRemote && + ICBMExplosion.shiBaoHu(super.worldObj, new Vector3(this), + ZhaPin.ZhaPinType.ZHA_DAN, this.haoMa)) { + this.setDead(); + return; + } + if (this.isMobile && (super.motionX != 0.0 || super.motionY != 0.0 || + super.motionZ != 0.0)) { + this.moveEntity(super.motionX, super.motionY, super.motionZ); + } + if (super.ticksExisted == 1) { + ZhaPin.list[this.haoMa].baoZhaQian(super.worldObj, new Vector3(this), + this); + } + if (this.tickCallCounter >= ZhaPin.list[this.haoMa].proceduralInterval( + super.worldObj, this.jiaoShuMu)) { + if (!this.endExplosion && + ZhaPin.list[this.haoMa].doBaoZha( + super.worldObj, new Vector3(super.posX, super.posY, super.posZ), + this, this.metadata, this.jiaoShuMu)) { + this.jiaoShuMu += ZhaPin.list[this.haoMa].countIncrement(); + this.tickCallCounter = 0; + } else { + ZhaPin.list[this.haoMa].baoZhaHou( + super.worldObj, new Vector3(super.posX, super.posY, super.posZ), + this); + this.setDead(); + } + } + ++this.tickCallCounter; + ZhaPin.list[this.haoMa].gengXin( + super.worldObj, new Vector3(super.posX, super.posY, super.posZ), + super.ticksExisted); + ++super.ticksExisted; + } + + public void endExplosion() { + this.endExplosion = true; + } + + @Override + protected void readEntityFromNBT(final NBTTagCompound par1NBTTagCompound) { + this.isMobile = par1NBTTagCompound.getBoolean("isMobile"); + this.haoMa = par1NBTTagCompound.getInteger("explosionID"); + this.jiaoShuMu = par1NBTTagCompound.getInteger("callCounter"); + super.ticksExisted = par1NBTTagCompound.getInteger("ticksExisted"); + this.metadata = par1NBTTagCompound.getInteger("metadata"); + this.tickCallCounter = par1NBTTagCompound.getInteger("tickCallCounter"); + } + + @Override + protected void writeEntityToNBT(final NBTTagCompound par1NBTTagCompound) { + par1NBTTagCompound.setBoolean("isMobile", this.isMobile); + par1NBTTagCompound.setInteger("explosionID", this.haoMa); + par1NBTTagCompound.setInteger("callCounter", this.jiaoShuMu); + par1NBTTagCompound.setInteger("ticksExisted", super.ticksExisted); + par1NBTTagCompound.setInteger("metadata", this.metadata); + par1NBTTagCompound.setInteger("tickCallCounter", this.tickCallCounter); + } + + @Override + public float getShadowSize() { + return 0.0f; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/EExplosive.java b/src/main/java/icbm/zhapin/zhapin/EExplosive.java new file mode 100644 index 0000000..17d601c --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/EExplosive.java @@ -0,0 +1,167 @@ +package icbm.zhapin.zhapin; + +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import icbm.zhapin.ICBMExplosion; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.Entity; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.implement.IRotatable; + +public class EExplosive + extends Entity implements IRotatable, IEntityAdditionalSpawnData { + public int fuse; + public int haoMa; + private int metadata; + private byte orientation; + + public EExplosive(final World par1World) { + super(par1World); + this.fuse = 90; + this.haoMa = 0; + this.metadata = -1; + this.orientation = 3; + this.fuse = 0; + super.preventEntitySpawning = true; + this.setSize(0.98f, 0.98f); + super.yOffset = super.height / 2.0f; + } + + public EExplosive(final World par1World, final Vector3 position, + final byte orientation, final int explosiveID) { + this(par1World); + this.setPosition(position.x, position.y, position.z); + final float var8 = (float) (Math.random() * 3.141592653589793 * 2.0); + super.motionX = -(float) Math.sin(var8) * 0.02f; + super.motionY = 0.20000000298023224; + super.motionZ = -(float) Math.cos(var8) * 0.02f; + super.prevPosX = position.x; + super.prevPosY = position.y; + super.prevPosZ = position.z; + this.haoMa = explosiveID; + this.fuse = ZhaPin.list[explosiveID].getYinXin(); + this.orientation = orientation; + ZhaPin.list[explosiveID].yinZhaQian(par1World, this); + } + + public EExplosive(final World par1World, final Vector3 position, + final int explosiveID, final byte orientation, + final int metadata) { + this(par1World, position, orientation, explosiveID); + this.metadata = metadata; + } + + @Override + public String getCommandSenderName() { + return "Explosives"; + } + + @Override + public void onUpdate() { + if (!super.worldObj.isRemote && + ICBMExplosion.shiBaoHu(super.worldObj, new Vector3(this), + ZhaPin.ZhaPinType.ZHA_DAN, this.haoMa)) { + ICBMExplosion.bExplosives.dropBlockAsItem(super.worldObj, (int) super.posX, + (int) super.posY, (int) super.posZ, + this.haoMa, 0); + this.setDead(); + return; + } + super.prevPosX = super.posX; + super.prevPosY = super.posY; + super.prevPosZ = super.posZ; + super.motionX *= 0.95; + super.motionY -= 0.045; + super.motionZ *= 0.95; + this.moveEntity(super.motionX, super.motionY, super.motionZ); + if (this.fuse < 1) { + this.explode(); + } else { + ZhaPin.list[this.haoMa].onYinZha( + super.worldObj, new Vector3(super.posX, super.posY, super.posZ), + this.fuse); + } + --this.fuse; + super.onUpdate(); + } + + public void explode() { + super.worldObj.spawnParticle("hugeexplosion", super.posX, super.posY, + super.posZ, 0.0, 0.0, 0.0); + ZhaPin.createExplosion(super.worldObj, new Vector3(this), this, this.haoMa); + this.setDead(); + } + + public void destroyedByExplosion() { + this.fuse = ZhaPin.list[this.haoMa].onBeiZha(); + } + + @Override + protected void readEntityFromNBT(final NBTTagCompound par1NBTTagCompound) { + this.fuse = par1NBTTagCompound.getByte("Fuse"); + this.metadata = par1NBTTagCompound.getInteger("metadata"); + this.haoMa = par1NBTTagCompound.getInteger("explosiveID"); + } + + @Override + protected void writeEntityToNBT(final NBTTagCompound par1NBTTagCompound) { + par1NBTTagCompound.setByte("Fuse", (byte) this.fuse); + par1NBTTagCompound.setInteger("metadata", this.metadata); + par1NBTTagCompound.setInteger("explosiveID", this.haoMa); + } + + @Override + public float getShadowSize() { + return 0.5f; + } + + @Override + protected void entityInit() { + } + + @Override + protected boolean canTriggerWalking() { + return true; + } + + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + public boolean canBePushed() { + return true; + } + + @Override + public ForgeDirection getDirection(final IBlockAccess world, final int x, + final int y, final int z) { + return ForgeDirection.getOrientation((int) this.orientation); + } + + @Override + public void setDirection(final World world, final int x, final int y, + final int z, final ForgeDirection facingDirection) { + this.orientation = (byte) facingDirection.ordinal(); + } + + @Override + public void writeSpawnData(final ByteBuf data) { + data.writeInt(this.haoMa); + data.writeInt(this.fuse); + data.writeByte((int) this.orientation); + data.writeInt(this.metadata); + } + + @Override + public void readSpawnData(final ByteBuf data) { + this.haoMa = data.readInt(); + this.fuse = data.readInt(); + this.orientation = data.readByte(); + this.metadata = data.readInt(); + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/EGrenade.java b/src/main/java/icbm/zhapin/zhapin/EGrenade.java new file mode 100644 index 0000000..ad94ae8 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/EGrenade.java @@ -0,0 +1,244 @@ +package icbm.zhapin.zhapin; + +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import icbm.api.explosion.IExplosive; +import icbm.api.explosion.IExplosiveContainer; +import icbm.zhapin.ICBMExplosion; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class EGrenade + extends Entity implements IExplosiveContainer, IEntityAdditionalSpawnData { + protected EntityLivingBase thrower; + public int haoMa; + + public EGrenade(final World par1World) { + super(par1World); + this.setSize(0.3f, 0.3f); + super.renderDistanceWeight = 10.0; + } + + public EGrenade(final World par1World, final Vector3 position, + final int explosiveID) { + this(par1World); + this.setPosition(position.x, position.y, position.z); + this.haoMa = explosiveID; + } + + public EGrenade(final World par1World, final EntityLivingBase par2EntityLiving, + final int explosiveID, final float nengLiang) { + this(par1World); + this.thrower = par2EntityLiving; + this.setSize(0.25f, 0.25f); + this.setLocationAndAngles( + ((Entity) par2EntityLiving).posX, + ((Entity) par2EntityLiving).posY + par2EntityLiving.getEyeHeight(), + ((Entity) par2EntityLiving).posZ, ((Entity) par2EntityLiving).rotationYaw, + ((Entity) par2EntityLiving).rotationPitch); + super.posX -= MathHelper.cos(super.rotationYaw / 180.0f * 3.1415927f) * 0.16f; + super.posY -= 0.10000000149011612; + super.posZ -= MathHelper.sin(super.rotationYaw / 180.0f * 3.1415927f) * 0.16f; + this.setPosition(super.posX, super.posY, super.posZ); + super.yOffset = 0.0f; + final float var3 = 0.4f; + super.motionX = -MathHelper.sin(super.rotationYaw / 180.0f * 3.1415927f) * + MathHelper.cos(super.rotationPitch / 180.0f * 3.1415927f) * + var3; + super.motionZ = MathHelper.cos(super.rotationYaw / 180.0f * 3.1415927f) * + MathHelper.cos(super.rotationPitch / 180.0f * 3.1415927f) * + var3; + super.motionY = -MathHelper.sin(super.rotationPitch / 180.0f * 3.1415927f) * var3; + this.setThrowableHeading(super.motionX, super.motionY, super.motionZ, + 1.8f * nengLiang, 1.0f); + this.haoMa = explosiveID; + } + + @Override + public String getCommandSenderName() { + return "Grenade"; + } + + @Override + public void writeSpawnData(final ByteBuf data) { + data.writeInt(this.haoMa); + } + + @Override + public void readSpawnData(final ByteBuf data) { + this.haoMa = data.readInt(); + } + + public void setThrowableHeading(double par1, double par3, double par5, + final float par7, final float par8) { + final float var9 = MathHelper.sqrt_double(par1 * par1 + par3 * par3 + par5 * par5); + par1 /= var9; + par3 /= var9; + par5 /= var9; + par1 += super.rand.nextGaussian() * 0.007499999832361937 * par8; + par3 += super.rand.nextGaussian() * 0.007499999832361937 * par8; + par5 += super.rand.nextGaussian() * 0.007499999832361937 * par8; + par1 *= par7; + par3 *= par7; + par5 *= par7; + super.motionX = par1; + super.motionY = par3; + super.motionZ = par5; + final float var10 = MathHelper.sqrt_double(par1 * par1 + par5 * par5); + final float n = (float) (Math.atan2(par1, par5) * 180.0 / 3.141592653589793); + super.rotationYaw = n; + super.prevRotationYaw = n; + final float n2 = (float) (Math.atan2(par3, var10) * 180.0 / 3.141592653589793); + super.rotationPitch = n2; + super.prevRotationPitch = n2; + } + + @Override + public void setVelocity(final double par1, final double par3, + final double par5) { + super.motionX = par1; + super.motionY = par3; + super.motionZ = par5; + if (super.prevRotationPitch == 0.0f && super.prevRotationYaw == 0.0f) { + final float var7 = MathHelper.sqrt_double(par1 * par1 + par5 * par5); + final float n = (float) (Math.atan2(par1, par5) * 180.0 / 3.141592653589793); + super.rotationYaw = n; + super.prevRotationYaw = n; + final float n2 = (float) (Math.atan2(par3, var7) * 180.0 / 3.141592653589793); + super.rotationPitch = n2; + super.prevRotationPitch = n2; + } + } + + @Override + protected boolean canTriggerWalking() { + return false; + } + + @Override + protected void entityInit() { + } + + @Override + public void onUpdate() { + if (!super.worldObj.isRemote && + ICBMExplosion.shiBaoHu(super.worldObj, new Vector3(this), + ZhaPin.ZhaPinType.SHOU_LIU_DAN, this.haoMa)) { + final float var6 = 0.7f; + final double var7 = super.worldObj.rand.nextFloat() * var6 + (1.0f - var6) * 0.5; + final double var8 = super.worldObj.rand.nextFloat() * var6 + (1.0f - var6) * 0.5; + final double var9 = super.worldObj.rand.nextFloat() * var6 + (1.0f - var6) * 0.5; + final EntityItem var10 = new EntityItem( + super.worldObj, super.posX + var7, super.posY + var8, + super.posZ + var9, + new ItemStack(ICBMExplosion.itShouLiuDan, this.haoMa, 1)); + var10.delayBeforeCanPickup = 10; + super.worldObj.spawnEntityInWorld((Entity) var10); + this.setDead(); + return; + } + super.lastTickPosX = super.posX; + super.lastTickPosY = super.posY; + super.lastTickPosZ = super.posZ; + super.onUpdate(); + this.moveEntity(super.motionX, super.motionY, super.motionZ); + final float var11 = MathHelper.sqrt_double(super.motionX * super.motionX + + super.motionZ * super.motionZ); + super.rotationYaw = (float) (Math.atan2(super.motionX, super.motionZ) * + 180.0 / 3.141592653589793); + super.rotationPitch = (float) (Math.atan2(super.motionY, var11) * 180.0 / 3.141592653589793); + while (super.rotationPitch - super.prevRotationPitch < -180.0f) { + super.prevRotationPitch -= 360.0f; + } + while (super.rotationPitch - super.prevRotationPitch >= 180.0f) { + super.prevRotationPitch += 360.0f; + } + while (super.rotationYaw - super.prevRotationYaw < -180.0f) { + super.prevRotationYaw -= 360.0f; + } + while (super.rotationYaw - super.prevRotationYaw >= 180.0f) { + super.prevRotationYaw += 360.0f; + } + super.rotationPitch = super.prevRotationPitch + + (super.rotationPitch - super.prevRotationPitch) * 0.2f; + super.rotationYaw = super.prevRotationYaw + + (super.rotationYaw - super.prevRotationYaw) * 0.2f; + float var12 = 0.98f; + final float gravity = 0.03f; + if (this.isInWater()) { + for (int var13 = 0; var13 < 4; ++var13) { + final float var14 = 0.25f; + super.worldObj.spawnParticle( + "bubble", super.posX - super.motionX * var14, + super.posY - super.motionY * var14, + super.posZ - super.motionZ * var14, super.motionX, super.motionY, + super.motionZ); + } + var12 = 0.8f; + } + super.motionX *= var12; + super.motionY *= var12; + super.motionZ *= var12; + if (super.onGround) { + super.motionX *= 0.5; + super.motionZ *= 0.5; + super.motionY *= 0.5; + } else { + super.motionY -= gravity; + // TODO: is this pushOutOfBlocks? + this.func_145771_j( + super.posX, (super.boundingBox.minY + super.boundingBox.maxY) / 2.0, + super.posZ); + } + if (super.ticksExisted > Math.max(60, ZhaPin.list[this.haoMa].getYinXin())) { + super.worldObj.spawnParticle("hugeexplosion", super.posX, super.posY, + super.posZ, 0.0, 0.0, 0.0); + ZhaPin.createExplosion(super.worldObj, + new Vector3(super.posX, super.posY, super.posZ), + this, this.haoMa); + this.setDead(); + } else { + ZhaPin.list[this.haoMa].onYinZha( + super.worldObj, new Vector3(super.posX, super.posY + 0.5, super.posZ), + super.ticksExisted); + } + } + + @Override + public boolean handleWaterMovement() { + return super.worldObj.handleMaterialAcceleration( + super.boundingBox, Material.water, (Entity) this); + } + + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + public boolean canBePushed() { + return true; + } + + @Override + protected void readEntityFromNBT(final NBTTagCompound par1NBTTagCompound) { + this.haoMa = par1NBTTagCompound.getInteger("haoMa"); + } + + @Override + protected void writeEntityToNBT(final NBTTagCompound par1NBTTagCompound) { + par1NBTTagCompound.setInteger("haoMa", this.haoMa); + } + + @Override + public IExplosive getExplosiveType() { + return ZhaPin.list[this.haoMa]; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/IBExplosive.java b/src/main/java/icbm/zhapin/zhapin/IBExplosive.java new file mode 100644 index 0000000..86b5e79 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/IBExplosive.java @@ -0,0 +1,45 @@ +package icbm.zhapin.zhapin; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class IBExplosive extends ItemBlock { + public IBExplosive(final Block id) { + super(id); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + public boolean placeBlockAt(final ItemStack itemStack, + final EntityPlayer player, final World world, + final int x, final int y, final int z, + final int side, final float hitX, + final float hitY, final float hitZ, + final int metadata) { + if (!world.setBlock(x, y, z, this.field_150939_a, 0, 3)) { + return false; + } + if (world.getBlock(x, y, z) == this.field_150939_a) { + ((TExplosive) world.getTileEntity(x, y, z)).explosiveId = itemStack.getItemDamage(); + this.field_150939_a.onBlockPlacedBy(world, x, y, z, player, itemStack); + this.field_150939_a.onPostBlockPlaced(world, x, y, z, metadata); + } + return true; + } + + public int getMetadata(final int damage) { + return damage; + } + + public String getUnlocalizedName(final ItemStack itemstack) { + return this.getUnlocalizedName() + "." + + ZhaPin.list[itemstack.getItemDamage()].getUnlocalizedName(); + } + + public String getUnlocalizedName() { + return "icbm.explosive"; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ItGrenade.java b/src/main/java/icbm/zhapin/zhapin/ItGrenade.java new file mode 100644 index 0000000..f23cd17 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ItGrenade.java @@ -0,0 +1,134 @@ +package icbm.zhapin.zhapin; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.di.ItICBM; +import icbm.zhapin.ICBMExplosion; +import java.util.List; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class ItGrenade extends ItICBM { + public static final IIcon[] ICONS; + + public ItGrenade() { + super("grenade"); + this.setMaxStackSize(16); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + @Override + public ItemStack onEaten(final ItemStack par1ItemStack, final World par2World, + final EntityPlayer par3EntityPlayer) { + return par1ItemStack; + } + + @Override + public EnumAction getItemUseAction(final ItemStack par1ItemStack) { + return EnumAction.bow; + } + + @Override + public int getMaxItemUseDuration(final ItemStack par1ItemStack) { + return 60; + } + + @Override + public ItemStack onItemRightClick(final ItemStack itemStack, + final World world, + final EntityPlayer entityPlayer) { + if (itemStack != null) { + final int haoMa = ZhaPin.list[itemStack.getItemDamage()].getID(); + if (!ICBMExplosion.shiBaoHu(world, new Vector3((Entity) entityPlayer), + ZhaPin.ZhaPinType.SHOU_LIU_DAN, haoMa)) { + entityPlayer.setItemInUse(itemStack, + this.getMaxItemUseDuration(itemStack)); + } else { + entityPlayer.addChatMessage( + new ChatComponentText("Grenades are banned in this region.")); + } + } + return itemStack; + } + + @Override + public void onPlayerStoppedUsing(final ItemStack itemStack, final World world, + final EntityPlayer entityPlayer, + final int nengLiang) { + if (!world.isRemote) { + final int haoMa = ZhaPin.list[itemStack.getItemDamage()].getID(); + if (!ICBMExplosion.shiBaoHu(world, new Vector3((Entity) entityPlayer), + ZhaPin.ZhaPinType.SHOU_LIU_DAN, haoMa)) { + if (!entityPlayer.capabilities.isCreativeMode) { + --itemStack.stackSize; + if (itemStack.stackSize <= 0) { + entityPlayer.inventory.setInventorySlotContents( + entityPlayer.inventory.currentItem, (ItemStack) null); + } + } + world.playSoundAtEntity(entityPlayer, "random.fuse", 0.5f, + 0.4f / + (Item.itemRand.nextFloat() * 0.4f + 0.8f)); + world.spawnEntityInWorld( + new EGrenade(world, entityPlayer, haoMa, + (this.getMaxItemUseDuration(itemStack) - nengLiang) / + (float) this.getMaxItemUseDuration(itemStack))); + } else { + entityPlayer.addChatMessage( + new ChatComponentText("Grenades are banned in this region.")); + } + } + } + + @Override + public int getMetadata(final int damage) { + return damage; + } + + @Override + public String getUnlocalizedName(final ItemStack itemstack) { + return this.getUnlocalizedName() + "." + + ZhaPin.list[itemstack.getItemDamage()].getUnlocalizedName(); + } + + @Override + public String getUnlocalizedName() { + return "icbm.grenade"; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(final IIconRegister iconRegister) { + for (int i = 0; i < ZhaPin.E_YI_ID; ++i) { + ItGrenade.ICONS[i] = iconRegister.registerIcon( + "icbm:grenade_" + ZhaPin.list[i].getUnlocalizedName()); + } + } + + @Override + public IIcon getIconFromDamage(final int i) { + return ItGrenade.ICONS[i]; + } + + @Override + public void getSubItems(final Item par1, final CreativeTabs par2CreativeTabs, + final List par3List) { + for (int i = 0; i < ZhaPin.E_YI_ID; ++i) { + par3List.add(new ItemStack((Item) this, 1, i)); + } + } + + static { + ICONS = new IIcon[256]; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/TExplosive.java b/src/main/java/icbm/zhapin/zhapin/TExplosive.java new file mode 100644 index 0000000..7eef8a2 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/TExplosive.java @@ -0,0 +1,86 @@ +package icbm.zhapin.zhapin; + +import icbm.api.explosion.IExplosive; +import icbm.api.explosion.IExplosiveContainer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.prefab.implement.IRotatable; + +public class TExplosive + extends TileEntity implements IExplosiveContainer, IRotatable { + public boolean exploding; + public int explosiveId; + + public TExplosive() { + this.exploding = false; + this.explosiveId = 0; + } + + @Override + public boolean canUpdate() { + return false; + } + + @Override + public void readFromNBT(final NBTTagCompound par1NBTTagCompound) { + super.readFromNBT(par1NBTTagCompound); + this.explosiveId = par1NBTTagCompound.getInteger("explosiveID"); + } + + @Override + public void writeToNBT(final NBTTagCompound par1NBTTagCompound) { + super.writeToNBT(par1NBTTagCompound); + par1NBTTagCompound.setInteger("explosiveID", this.explosiveId); + } + + // TODO: WTF + // else if (ID == 2 && !this.worldObj.isRemote && + // player.inventory.getCurrentItem().getItem() instanceof ItRemoteDetonator) { + // final ItemStack itemStack = player.inventory.getCurrentItem(); + // BExplosives.yinZha(this.worldObj, this.xCoord, this.yCoord, + // this.zCoord, this.haoMa, 0); + // ICBMExplosion.itYaoKong.onProvide(ElectricityPack.getFromWatts(1500.0, + // ICBMExplosion.itYaoKong.getVoltage(itemStack)), itemStack); + // } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + + this.explosiveId = nbt.getInteger("explosiveID"); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + + nbt.setInteger("explosiveID", this.explosiveId); + + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, + this.getBlockMetadata(), nbt); + } + + @Override + public ForgeDirection getDirection(final IBlockAccess world, final int x, + final int y, final int z) { + return ForgeDirection.getOrientation(this.getBlockMetadata()); + } + + @Override + public void setDirection(final World world, final int x, final int y, + final int z, final ForgeDirection facingDirection) { + this.worldObj.setBlockMetadataWithNotify( + this.xCoord, this.yCoord, this.zCoord, facingDirection.ordinal(), 2); + } + + @Override + public IExplosive getExplosiveType() { + return ZhaPin.list[this.explosiveId]; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ZhaPin.java b/src/main/java/icbm/zhapin/zhapin/ZhaPin.java new file mode 100644 index 0000000..6669a85 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ZhaPin.java @@ -0,0 +1,444 @@ +package icbm.zhapin.zhapin; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.api.explosion.ExplosionEvent; +import icbm.api.explosion.IExplosive; +import icbm.core.HaoMa; +import icbm.core.MainBase; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.daodan.EMissile; +import icbm.zhapin.daodan.MissileBase; +import icbm.zhapin.zhapin.ex.ExAntiGravitational; +import icbm.zhapin.zhapin.ex.ExAntimatter; +import icbm.zhapin.zhapin.ex.ExBreaching; +import icbm.zhapin.zhapin.ex.ExChemical; +import icbm.zhapin.zhapin.ex.ExCondensed; +import icbm.zhapin.zhapin.ex.ExDebilitation; +import icbm.zhapin.zhapin.ex.ExDecayLand; +import icbm.zhapin.zhapin.ex.ExEmp; +import icbm.zhapin.zhapin.ex.ExEmpSignal; +import icbm.zhapin.zhapin.ex.ExEmpWave; +import icbm.zhapin.zhapin.ex.ExEnder; +import icbm.zhapin.zhapin.ex.ExEndothermic; +import icbm.zhapin.zhapin.ex.ExEndothermic2; +import icbm.zhapin.zhapin.ex.ExExothermic; +import icbm.zhapin.zhapin.ex.ExExothermic2; +import icbm.zhapin.zhapin.ex.ExHypersonic; +import icbm.zhapin.zhapin.ex.ExIncendiary; +import icbm.zhapin.zhapin.ex.ExMutateLiving; +import icbm.zhapin.zhapin.ex.ExNuclear; +import icbm.zhapin.zhapin.ex.ExPushPull; +import icbm.zhapin.zhapin.ex.ExRedMatter; +import icbm.zhapin.zhapin.ex.ExRejuvenation; +import icbm.zhapin.zhapin.ex.ExSMine; +import icbm.zhapin.zhapin.ex.ExShrapnel; +import icbm.zhapin.zhapin.ex.ExSonic; +import icbm.zhapin.zhapin.ex.ExThermobaric; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; +import net.minecraft.world.Explosion; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.TranslationHelper; +import universalelectricity.prefab.flag.FlagRegistry; +import universalelectricity.prefab.implement.ITier; + +public abstract class ZhaPin implements ITier, IExplosive { + public static final ZhaPin condensed; + public static final ZhaPin shrapnel; + public static final ZhaPin indenciary; + public static final ZhaPin debilitation; + public static final ZhaPin chemical; + public static final ZhaPin anvil; + public static final ZhaPin repulsive; + public static final ZhaPin attractive; + public static final int E_YI_ID; + public static final ZhaPin fragmentation; + public static final ZhaPin contagious; + public static final ZhaPin sonic; + public static final ZhaPin breaching; + public static final ZhaPin rejuvenation; + public static final ZhaPin thermobaric; + public static final int E_ER_ID; + public static final ZhaPin nuclear; + public static final ZhaPin emp; + public static final ZhaPin exothermic; + public static final ZhaPin endothermic; + public static final ZhaPin antiGravitational; + public static final ZhaPin ender; + public static final ZhaPin hypersonic; + public static final int E_SAN_ID; + public static final ZhaPin antimatter; + public static final ZhaPin redMatter; + public static final int E_SI_ID; + public static final ZhaPin sMine; + public static final ZhaPin empWave; + public static final ZhaPin empSignal; + public static final ZhaPin exothermic2; + public static final ZhaPin decayLand; + public static final ZhaPin mutateLiving; + public static final ZhaPin endothermic2; + public static ZhaPin[] list; + private String name; + private int ID; + private int tier; + private int yinXin; + public MissileBase daoDan; + public final String qiZi; + protected boolean isDisabled; + protected boolean isMobile; + + protected ZhaPin(final String name, final int ID, final int tier) { + this.isMobile = false; + if (ZhaPin.list == null) { + ZhaPin.list = new ZhaPin[32]; + } + if (ZhaPin.list[ID] != null) { + throw new IllegalArgumentException( + "Explosive " + ID + " is already occupied by " + + ZhaPin.list[ID].getClass().getSimpleName() + "!"); + } + ZhaPin.list[ID] = this; + this.name = name; + this.tier = tier; + this.yinXin = 100; + this.ID = ID; + this.daoDan = new MissileBase(name, ID, tier); + this.qiZi = FlagRegistry.registerFlag("ban_" + this.name); + MainBase.CONFIGURATION.load(); + this.isDisabled = MainBase.CONFIGURATION + .get("Disable_Explosives", "Disable " + this.name, false) + .getBoolean(false); + MainBase.CONFIGURATION.save(); + } + + @Override + public int getID() { + return this.ID; + } + + @Override + public String getUnlocalizedName() { + return this.name; + } + + @Override + public String getExplosiveName() { + return TranslationHelper.getLocal("icbm.explosive." + this.name + ".name"); + } + + @Override + public String getGrenadeName() { + return TranslationHelper.getLocal("icbm.grenade." + this.name + ".name"); + } + + @Override + public String getMissileName() { + return TranslationHelper.getLocal("icbm.missile." + this.name + ".name"); + } + + @Override + public String getMinecartName() { + return TranslationHelper.getLocal("icbm.minecart." + this.name + ".name"); + } + + @Override + public int getTier() { + return this.tier; + } + + @Override + public void setTier(final int tier) { + this.tier = tier; + } + + public void setFuse(final int fuse) { + this.yinXin = fuse; + } + + public int getYinXin() { + return this.yinXin; + } + + public void yinZhaQian(final World worldObj, final Entity entity) { + worldObj.playSoundAtEntity(entity, "random.fuse", 1.0f, 1.0f); + } + + public void onYinZha(final World worldObj, final Vector3 position, + final int fuseTicks) { + worldObj.spawnParticle("smoke", position.x, position.y + 0.5, position.z, + 0.0, 0.0, 0.0); + } + + public int onBeiZha() { + return (int) (this.yinXin / 2 + Math.random() * this.yinXin / 4.0); + } + + protected int proceduralInterval() { + return -1; + } + + public int proceduralInterval(final World worldObj, final int callCounts) { + return this.proceduralInterval(); + } + + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + MinecraftForge.EVENT_BUS.post(new ExplosionEvent.PreExplosionEvent( + worldObj, position.x, position.y, position.z, this)); + } + + // TODO: WTF + // dynamic typing 2.0 + @SideOnly(Side.CLIENT) + public Object[] getRenderData() { + return null; + } + + public void doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource) { + } + + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, final int callCount) { + this.doBaoZha(worldObj, position, explosionSource); + return false; + } + + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, final int metadata, + final int callCount) { + return this.doBaoZha(worldObj, position, explosionSource, callCount); + } + + public void gengXin(final World worldObj, final Vector3 position, + final int ticksExisted) { + } + + public void baoZhaHou(final World worldObj, final Vector3 position, + final Entity explosionSource) { + MinecraftForge.EVENT_BUS.post(new ExplosionEvent.PostExplosionEvent( + worldObj, position.x, position.y, position.z, this)); + } + + public int countIncrement() { + return 1; + } + + public void spawnZhaDan(final World worldObj, final Vector3 position, + final ForgeDirection orientation, final byte cause) { + if (!this.isDisabled) { + position.add(0.5); + final EExplosive eZhaDan = new EExplosive( + worldObj, position, (byte) orientation.ordinal(), this.getID()); + switch (cause) { + case 1: { + eZhaDan.destroyedByExplosion(); + break; + } + case 2: { + eZhaDan.setFire(10); + break; + } + } + worldObj.spawnEntityInWorld((Entity) eZhaDan); + } + } + + public void spawnZhaDan(final World worldObj, final Vector3 position, + final byte orientation) { + this.spawnZhaDan(worldObj, position, + ForgeDirection.getOrientation((int) orientation), (byte) 0); + } + + public void init() { + } + + public ItemStack getItemStack() { + return new ItemStack(ICBMExplosion.bExplosives, 1, this.getID()); + } + + public ItemStack getItemStack(final int amount) { + return new ItemStack(ICBMExplosion.bExplosives, amount, this.getID()); + } + + public static IExplosive getExplosiveByName(final String name) { + for (final IExplosive explosive : ZhaPin.list) { + if (explosive.getUnlocalizedName().equalsIgnoreCase(name)) { + return explosive; + } + } + return null; + } + + public static void createExplosion(final World worldObj, final Double x, + final Double y, final Double z, + final Entity entity, + final Integer explosiveID) { + createExplosion(worldObj, new Vector3(x, y, z), entity, explosiveID); + } + + public static void createExplosion(final World worldObj, + final Vector3 position, + final Entity entity, + final int explosiveID) { + if (!ZhaPin.list[explosiveID].isDisabled) { + if (ZhaPin.list[explosiveID].proceduralInterval(worldObj, -1) > 0) { + if (!worldObj.isRemote) { + worldObj.spawnEntityInWorld( + (Entity) new EExplosion(worldObj, position.clone(), explosiveID, + ZhaPin.list[explosiveID].isMobile)); + } + } else { + ZhaPin.list[explosiveID].baoZhaQian(worldObj, position.clone(), entity); + ZhaPin.list[explosiveID].doBaoZha(worldObj, position.clone(), entity, + explosiveID, -1); + ZhaPin.list[explosiveID].baoZhaHou(worldObj, position.clone(), entity); + } + } + } + + public void doDamageEntities(final World worldObj, final Vector3 position, + final float radius, final float power) { + this.doDamageEntities(worldObj, position, radius, power, true); + } + + public void doDamageEntities(final World worldObj, final Vector3 position, + float radius, final float power, + final boolean destroyItem) { + radius *= 2.0f; + final Vector3 minCoord = position.clone(); + minCoord.add(-radius - 1.0f); + final Vector3 maxCoord = position.clone(); + maxCoord.add(radius + 1.0f); + final List allEntities = worldObj.getEntitiesWithinAABB( + Entity.class, AxisAlignedBB.getBoundingBox( + (double) minCoord.intX(), (double) minCoord.intY(), + (double) minCoord.intZ(), (double) maxCoord.intX(), + (double) maxCoord.intY(), (double) maxCoord.intZ())); + final Vec3 var31 = Vec3.createVectorHelper(position.x, position.y, position.z); + for (int i = 0; i < allEntities.size(); ++i) { + final Entity entity = allEntities.get(i); + if (!this.onDamageEntity(entity)) { + if (entity instanceof EMissile) { + ((EMissile) entity).setExplode(); + } else if (!(entity instanceof EntityItem) || destroyItem) { + final double distance = entity.getDistance(position.x, position.y, position.z) / radius; + if (distance <= 1.0) { + double xDifference = entity.posX - position.x; + double yDifference = entity.posY - position.y; + double zDifference = entity.posZ - position.z; + final double var32 = MathHelper.sqrt_double( + xDifference * xDifference + yDifference * yDifference + + zDifference * zDifference); + xDifference /= var32; + yDifference /= var32; + zDifference /= var32; + final double var33 = worldObj.getBlockDensity(var31, entity.boundingBox); + final double var34 = (1.0 - distance) * var33; + int damage = 0; + damage = (int) ((var34 * var34 + var34) / 2.0 * 8.0 * power + 1.0); + entity.attackEntityFrom( + DamageSource.setExplosionSource((Explosion) null), damage); + final Entity entity2 = entity; + entity2.motionX += xDifference * var34; + final Entity entity3 = entity; + entity3.motionY += yDifference * var34; + final Entity entity4 = entity; + entity4.motionZ += zDifference * var34; + } + } + } + } + } + + protected boolean onDamageEntity(final Entity entity) { + return false; + } + + static { + condensed = new ExCondensed("condensed", + HaoMa.getID(ZhaPin.class.getSimpleName()), 1); + shrapnel = new ExShrapnel("shrapnel", + HaoMa.getID(ZhaPin.class.getSimpleName()), 1); + indenciary = new ExIncendiary("incendiary", + HaoMa.getID(ZhaPin.class.getSimpleName()), 1); + debilitation = new ExDebilitation( + "debilitation", HaoMa.getID(ZhaPin.class.getSimpleName()), 1); + chemical = new ExChemical("chemical", + HaoMa.getID(ZhaPin.class.getSimpleName()), 1); + anvil = new ExShrapnel("anvil", HaoMa.getID(ZhaPin.class.getSimpleName()), 1); + repulsive = new ExPushPull("repulsive", + HaoMa.getID(ZhaPin.class.getSimpleName()), 1); + attractive = new ExPushPull("attractive", + HaoMa.getID(ZhaPin.class.getSimpleName()), 1); + E_YI_ID = ZhaPin.attractive.getID() + 1; + fragmentation = new ExShrapnel( + "fragmentation", HaoMa.getID(ZhaPin.class.getSimpleName()), 2); + contagious = new ExChemical("contagious", + HaoMa.getID(ZhaPin.class.getSimpleName()), 2); + sonic = new ExSonic("sonic", HaoMa.getID(ZhaPin.class.getSimpleName()), 2); + breaching = new ExBreaching("breaching", + HaoMa.getID(ZhaPin.class.getSimpleName()), 2); + rejuvenation = new ExRejuvenation( + "rejuvenation", HaoMa.getID(ZhaPin.class.getSimpleName()), 2); + thermobaric = new ExThermobaric( + "thermobaric", HaoMa.getID(ZhaPin.class.getSimpleName()), 2); + E_ER_ID = ZhaPin.thermobaric.getID() + 1; + nuclear = new ExNuclear("nuclear", HaoMa.getID(ZhaPin.class.getSimpleName()), 3); + emp = new ExEmp("emp", HaoMa.getID(ZhaPin.class.getSimpleName()), 3); + exothermic = new ExExothermic("exothermic", + HaoMa.getID(ZhaPin.class.getSimpleName()), 3); + endothermic = new ExEndothermic( + "endothermic", HaoMa.getID(ZhaPin.class.getSimpleName()), 3); + antiGravitational = new ExAntiGravitational( + "antiGravitational", HaoMa.getID(ZhaPin.class.getSimpleName()), 3); + ender = new ExEnder("ender", HaoMa.getID(ZhaPin.class.getSimpleName()), 3); + hypersonic = new ExHypersonic("hypersonic", + HaoMa.getID(ZhaPin.class.getSimpleName()), 3); + E_SAN_ID = ZhaPin.hypersonic.getID() + 1; + antimatter = new ExAntimatter("antimatter", + HaoMa.getID(ZhaPin.class.getSimpleName()), 4); + redMatter = new ExRedMatter("redMatter", + HaoMa.getID(ZhaPin.class.getSimpleName()), 4); + E_SI_ID = ZhaPin.redMatter.getID() + 1; + sMine = new ExSMine("sMine", HaoMa.getID(ZhaPin.class.getSimpleName()), 2); + empWave = new ExEmpWave("emp", HaoMa.getID(ZhaPin.class.getSimpleName()), 3); + empSignal = new ExEmpSignal("emp", HaoMa.getID(ZhaPin.class.getSimpleName()), 3); + exothermic2 = new ExExothermic2( + "exothermic", HaoMa.getID(ZhaPin.class.getSimpleName()), 3); + decayLand = new ExDecayLand("decayLand", + HaoMa.getID(ZhaPin.class.getSimpleName()), 3); + mutateLiving = new ExMutateLiving( + "mutateLiving", HaoMa.getID(ZhaPin.class.getSimpleName()), 3); + endothermic2 = new ExEndothermic2( + "endothermic", HaoMa.getID(ZhaPin.class.getSimpleName()), 3); + } + + public enum ZhaPinType { + QUAN_BU("QUAN_BU", 0), + ZHA_DAN("ZHA_DAN", 1), + SHOU_LIU_DAN("SHOU_LIU_DAN", 2), + DAO_DAN("DAO_DAN", 3), + CHE("CHE", 4); + + private ZhaPinType(final String name, final int ordinal) { + } + + public static ZhaPinType get(final int id) { + if (id >= 0 && id < values().length) { + return values()[id]; + } + return null; + } + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExAntiGravitational.java b/src/main/java/icbm/zhapin/zhapin/ex/ExAntiGravitational.java new file mode 100644 index 0000000..9e4e9fb --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExAntiGravitational.java @@ -0,0 +1,178 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.core.MainBase; +import icbm.zhapin.EGravityBlock; +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.List; +import mffs.api.IForceFieldBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExAntiGravitational extends ZhaPin { + public ExAntiGravitational(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + super.baoZhaQian(worldObj, position, explosionSource); + if (!worldObj.isRemote) { + final EExplosion source = (EExplosion) explosionSource; + for (int x = 0; x < this.getRadius(); ++x) { + for (int y = 0; y < this.getRadius(); ++y) { + for (int z = 0; z < this.getRadius(); ++z) { + if (x == 0 || x == this.getRadius() - 1.0f || y == 0 || + y == this.getRadius() - 1.0f || z == 0 || + z == this.getRadius() - 1.0f) { + double xStep = x / (this.getRadius() - 1.0f) * 2.0f - 1.0f; + double yStep = y / (this.getRadius() - 1.0f) * 2.0f - 1.0f; + double zStep = z / (this.getRadius() - 1.0f) * 2.0f - 1.0f; + final double diagonalDistance = Math.sqrt(xStep * xStep + yStep * yStep + zStep * zStep); + xStep /= diagonalDistance; + yStep /= diagonalDistance; + zStep /= diagonalDistance; + float power = this.getRadius() * (0.7f + worldObj.rand.nextFloat() * 0.6f); + double var15 = position.x; + double var16 = position.y; + double var17 = position.z; + for (float var18 = 0.3f; power > 0.0f; power -= var18 * 0.75f) { + final Vector3 targetPosition = new Vector3(var15, var16, var17); + final Block block = worldObj.getBlock(targetPosition.intX(), + targetPosition.intY(), + targetPosition.intZ()); + if (block != Blocks.air) { + float resistance = 0.0f; + if (block == Blocks.bedrock) { + break; + } + if (block instanceof BlockLiquid) { + resistance = 1.0f; + } else { + resistance = (block.getExplosionResistance( + explosionSource, worldObj, targetPosition.intX(), + targetPosition.intY(), targetPosition.intZ(), + (double) position.intX(), (double) position.intY(), + (double) position.intZ()) + + 0.3f) * + var18; + } + power -= resistance; + } + if (power > 0.0f) { + source.dataList1.add(targetPosition.clone()); + } + var15 += xStep * var18; + var16 += yStep * var18; + var17 += zStep * var18; + } + } + } + } + } + } + worldObj.playSoundEffect( + position.x, position.y, position.z, "icbm.antigravity", 6.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 0.7f); + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, + final int explosionMetadata, final int callCount) { + final EExplosion source = (EExplosion) explosionSource; + final int r = callCount; + if (!worldObj.isRemote) { + int blocksToTake = 20; + for (final Object obj : source.dataList1) { + final Vector3 targetPosition = (Vector3) obj; + final double distance = Vector3.distance(targetPosition, position); + if (distance <= r && distance >= r - 2) { + if (blocksToTake <= 0) { + continue; + } + final Block block = worldObj.getBlock(targetPosition.intX(), + targetPosition.intY(), + targetPosition.intZ()); + if (block == Blocks.air || block == Blocks.bedrock) { + continue; + } + if (block == Blocks.obsidian) { + continue; + } + if (block instanceof IForceFieldBlock) { + continue; + } + final int metadata = worldObj.getBlockMetadata(targetPosition.intX(), + targetPosition.intY(), + targetPosition.intZ()); + if (distance >= r - 1 && worldObj.rand.nextInt(3) <= 0) { + continue; + } + worldObj.setBlock(targetPosition.intX(), targetPosition.intY(), + targetPosition.intZ(), Blocks.air, 0, 2); + targetPosition.add(0.5); + if (worldObj.rand.nextFloat() < 0.3 * (this.getRadius() - r)) { + final EGravityBlock entity = new EGravityBlock( + worldObj, targetPosition, block, metadata, 0.0f); + worldObj.spawnEntityInWorld((Entity) entity); + entity.yawChange = 50.0f * worldObj.rand.nextFloat(); + entity.pitchChange = 100.0f * worldObj.rand.nextFloat(); + final EGravityBlock eFeiBlock = entity; + eFeiBlock.motionY += Math.max(0.15 * worldObj.rand.nextFloat(), 0.1); + } + --blocksToTake; + } + } + } + final int radius = (int) this.getRadius(); + final AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox( + position.x - radius, position.y - radius, position.z - radius, + position.x + radius, 100.0, position.z + radius); + final List allEntities = worldObj.getEntitiesWithinAABB(Entity.class, bounds); + for (final Entity entity2 : allEntities) { + if (!(entity2 instanceof EGravityBlock) && + entity2.posY < 100.0 + position.y && entity2.motionY < 0.4) { + final Entity entity3 = entity2; + entity3.motionY += 0.15; + } + } + return callCount <= 2400; + } + + public int proceduralInterval() { + return 1; + } + + @Override + public void init() { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe(this.getItemStack(), + new Object[] { "EEE", "ETE", "EEE", 'T', + ZhaPin.repulsive.getItemStack(), + 'E', Items.ender_eye }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + + @Override + public float getRadius() { + return 15.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExAntimatter.java b/src/main/java/icbm/zhapin/zhapin/ex/ExAntimatter.java new file mode 100644 index 0000000..0f9b9a2 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExAntimatter.java @@ -0,0 +1,122 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.core.MainBase; +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExAntimatter extends ZhaPin { + public boolean destroyBedrock; + + public ExAntimatter(final String name, final int ID, final int tier) { + super(name, ID, tier); + this.destroyBedrock = true; + this.setFuse(300); + MainBase.CONFIGURATION.load(); + this.destroyBedrock = MainBase.CONFIGURATION + .get("general", "Antimatter Destroy Bedrock", this.destroyBedrock) + .getBoolean(this.destroyBedrock); + MainBase.CONFIGURATION.save(); + } + + @Override + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + super.baoZhaQian(worldObj, position, explosionSource); + worldObj.playSoundEffect( + position.x, position.y, position.z, "icbm.antimatter", 7.0f, + (float) (worldObj.rand.nextFloat() * 0.1 + 0.8999999761581421)); + explosionSource.posY += 5.0; + this.doDamageEntities(worldObj, position, this.getRadius() * 2.0f, + 2.1474836E9f); + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, final int callCount) { + if (!worldObj.isRemote && callCount == 1) { + for (int x = (int) (-this.getRadius()); x < this.getRadius(); ++x) { + for (int y = (int) (-this.getRadius()); y < this.getRadius(); ++y) { + for (int z = (int) (-this.getRadius()); z < this.getRadius(); ++z) { + final Vector3 targetPosition = Vector3.add(position, new Vector3(x, y, z)); + final double dist = position.distanceTo(targetPosition); + if (dist < this.getRadius()) { + final Block block = targetPosition.getBlock((IBlockAccess) worldObj); + if (block != Blocks.air) { + if (block != Blocks.bedrock || this.destroyBedrock) { + if (dist < this.getRadius() - 1.0f || + worldObj.rand.nextFloat() > 0.7) { + targetPosition.setBlock(worldObj, Blocks.air); + } + } + } + } + } + } + } + return false; + } + return callCount <= this.getRadius(); + } + + @Override + public void baoZhaHou(final World worldObj, final Vector3 position, + final Entity explosionSource) { + super.baoZhaHou(worldObj, position, explosionSource); + this.doDamageEntities(worldObj, position, this.getRadius() * 2.0f, + 2.1474836E9f); + } + + @Override + protected boolean onDamageEntity(final Entity entity) { + if (entity instanceof EExplosion && + ((EExplosion) entity).haoMa == ZhaPin.redMatter.getID()) { + entity.setDead(); + return true; + } + return false; + } + + @Override + public void onYinZha(final World worldObj, final Vector3 position, + final int fuseTicks) { + super.onYinZha(worldObj, position, fuseTicks); + if (fuseTicks % 25 == 0) { + worldObj.playSoundEffect(position.x, position.y, position.z, "icbm.alarm", + 4.0f, 1.0f); + } + } + + @Override + public void init() { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), + new Object[] { "AAA", "AEA", "AAA", 'E', + ZhaPin.nuclear.getItemStack(), 'A', "antimatterGram" }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + + @Override + protected int proceduralInterval() { + return 1; + } + + @Override + public float getRadius() { + return 40.0f; + } + + @Override + public double getEnergy() { + return 1000000.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExBreaching.java b/src/main/java/icbm/zhapin/zhapin/ex/ExBreaching.java new file mode 100644 index 0000000..3c1c0fe --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExBreaching.java @@ -0,0 +1,166 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.core.MainBase; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.ArrayList; +import java.util.List; +import mffs.api.IForceFieldBlock; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.MathHelper; +import net.minecraft.world.ChunkPosition; +import net.minecraft.world.Explosion; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; +import universalelectricity.prefab.implement.IRotatable; + +public class ExBreaching extends ZhaPin { + public ExBreaching(final String name, final int ID, final int tier) { + super(name, ID, tier); + this.setFuse(10); + } + + @Override + public void doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource) { + if (!worldObj.isRemote) { + final Vector3 difference = new Vector3(); + if (explosionSource instanceof IRotatable) { + difference.modifyPositionFromSide( + ((IRotatable) explosionSource) + .getDirection((IBlockAccess) worldObj, position.intX(), + position.intY(), position.intZ())); + } else { + difference.modifyPositionFromSide(ForgeDirection.DOWN); + } + worldObj.playSoundEffect( + position.x, position.y, position.z, "random.explode", 5.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 0.7f); + final Vector3 targetPosition = position.clone(); + for (int i = 0; i < 8; ++i) { + if (targetPosition.getBlock((IBlockAccess) worldObj) != null) { + if (targetPosition.getBlock((IBlockAccess) worldObj) + .getExplosionResistance( + explosionSource, worldObj, targetPosition.intX(), + targetPosition.intY(), targetPosition.intZ(), position.x, + position.y, position.z) > Blocks.obsidian.getExplosionResistance(explosionSource)) { + break; + } + if (targetPosition.getBlock((IBlockAccess) worldObj) instanceof IForceFieldBlock) { + break; + } + } + final List blownBlocks = new ArrayList<>(); + for (int x = 0; x < 16; ++x) { + for (int y = 0; y < 16; ++y) { + for (int z = 0; z < 16; ++z) { + if (x == 0 || x == 15 || y == 0 || y == 15 || z == 0 || z == 15) { + double xStep = x / 15.0f * 2.0f - 1.0f; + double yStep = y / 15.0f * 2.0f - 1.0f; + double zStep = z / 15.0f * 2.0f - 1.0f; + final double diagonalDistance = Math + .sqrt(xStep * xStep + yStep * yStep + zStep * zStep); + xStep /= diagonalDistance; + yStep /= diagonalDistance; + zStep /= diagonalDistance; + float var14 = 2.0f * (0.7f + worldObj.rand.nextFloat() * 0.6f); + double var15 = targetPosition.x; + double var16 = targetPosition.y; + double var17 = targetPosition.z; + for (float var18 = 0.3f; var14 > 0.0f; var14 -= var18 * 0.75f) { + final int var19 = MathHelper.floor_double(var15); + final int var20 = MathHelper.floor_double(var16); + final int var21 = MathHelper.floor_double(var17); + final Block var22 = worldObj.getBlock(var19, var20, var21); + if (var22 == Blocks.air) { + var14 -= (var22.getExplosionResistance( + explosionSource, worldObj, var19, var20, + var21, (double) targetPosition.intX(), + (double) targetPosition.intY(), + (double) targetPosition.intZ()) + + 0.3f) * + var18; + } + if (var14 > 0.0f) { + blownBlocks.add(new ChunkPosition(var19, var20, var21)); + } + var15 += xStep * var18; + var16 += yStep * var18; + var17 += zStep * var18; + } + } + } + } + } + this.doDamageEntities(worldObj, targetPosition, 2.0f, 3.5f, false); + for (int var23 = blownBlocks.size() - 1; var23 >= 0; --var23) { + final ChunkPosition var24 = blownBlocks.get(var23); + final int var25 = var24.chunkPosX; + final int var26 = var24.chunkPosY; + final int var27 = var24.chunkPosZ; + final Block block = worldObj.getBlock(var25, var26, var27); + final double var28 = var25 + worldObj.rand.nextFloat(); + final double var29 = var26 + worldObj.rand.nextFloat(); + final double var30 = var27 + worldObj.rand.nextFloat(); + double var31 = var28 - targetPosition.y; + double var32 = var29 - targetPosition.y; + double var33 = var30 - targetPosition.z; + final double var34 = MathHelper.sqrt_double( + var31 * var31 + var32 * var32 + var33 * var33); + var31 /= var34; + var32 /= var34; + var33 /= var34; + double var35 = 0.5 / (var34 / 2.0 + 0.1); + var35 *= worldObj.rand.nextFloat() * worldObj.rand.nextFloat() + 0.3f; + var31 *= var35; + var32 *= var35; + var33 *= var35; + worldObj.spawnParticle( + "explode", (var28 + targetPosition.x * 1.0) / 2.0, + (var29 + targetPosition.y * 1.0) / 2.0, + (var30 + targetPosition.z * 1.0) / 2.0, var31, var32, var33); + worldObj.spawnParticle("smoke", var28, var29, var30, var31, var32, + var33); + if (block != Blocks.air) { + block.dropBlockAsItemWithChance( + worldObj, var25, var26, var27, + worldObj.getBlockMetadata(var25, var26, var27), 1.0f, 0); + block.onBlockDestroyedByExplosion(worldObj, var25, var26, var27, + (Explosion) null); + worldObj.setBlock(var25, var26, var27, Blocks.air, 0, 2); + } + } + targetPosition.add(difference); + } + } + } + + @Override + public void init() { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe(this.getItemStack(2), + new Object[] { "GCG", "GCG", "GCG", 'C', + ZhaPin.condensed.getItemStack(), + 'G', Items.gunpowder }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + + @Override + public float getRadius() { + return 6.0f; + } + + @Override + public double getEnergy() { + return 6000.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExChemical.java b/src/main/java/icbm/zhapin/zhapin/ex/ExChemical.java new file mode 100644 index 0000000..9ac317a --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExChemical.java @@ -0,0 +1,112 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.core.MainBase; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.zhapin.EGrenade; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.init.Items; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExChemical extends ZhaPin { + public ExChemical(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, + final int explosionMetadata, final int callCount) { + final int duration = 60 / this.proceduralInterval(); + final boolean isContagious = this.getTier() == 2; + float radius = this.getRadius(); + if (explosionSource instanceof EGrenade) { + radius /= 2.0f; + } + if (worldObj.isRemote) { + float red = 0.8f; + float green = 0.8f; + float blue = 0.0f; + if (isContagious) { + red = 0.3f; + green = 0.8f; + blue = 0.0f; + } + for (int i = 0; i < 200; ++i) { + final Vector3 diDian = new Vector3(); + diDian.x = Math.random() * this.getRadius() / 2.0 - this.getRadius() / 4.0f; + diDian.y = Math.random() * this.getRadius() / 2.0 - this.getRadius() / 4.0f; + diDian.z = Math.random() * this.getRadius() / 2.0 - this.getRadius() / 4.0f; + diDian.multiply(Math.min(this.getRadius(), (float) callCount) / 10.0f); + if (diDian.getMagnitude() <= this.getRadius()) { + diDian.add(new Vector3(explosionSource)); + ICBMExplosion.proxy.spawnParticle( + "smoke", explosionSource.worldObj, diDian, + (Math.random() - 0.5) / 2.0, (Math.random() - 0.5) / 2.0, + (Math.random() - 0.5) / 2.0, red, green, blue, 4.0f, 8.0); + } + } + } + final AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox( + position.x - radius, position.y - radius, position.z - radius, + position.x + radius, position.y + radius, position.z + radius); + final List entitiesNearby = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, bounds); + for (final EntityLivingBase entity : entitiesNearby) { + if (isContagious) { + ICBMExplosion.DU_CHUAN_RAN.poisonEntity(position, entity); + } else { + ICBMExplosion.DU_DU.poisonEntity(position, entity); + } + } + worldObj.playSoundEffect( + position.x + 0.5, position.y + 0.5, position.z + 0.5, "icbm.gasleak", + 4.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 1.0f); + if (isContagious) { + ZhaPin.mutateLiving.doBaoZha(worldObj, position, null, (int) radius, -1); + } + return callCount <= duration; + } + + public int proceduralInterval() { + return 5; + } + + @Override + public void init() { + if (this.getTier() == 1) { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), + new Object[] { "@@@", "@?@", "@@@", '@', MainBase.itDu, '?', + ZhaPin.debilitation.getItemStack() }), + "Chemical", MainBase.CONFIGURATION, true); + } else if (this.getTier() == 2) { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(2), + new Object[] { " @ ", "@?@", " @ ", '?', Items.rotten_flesh, '@', + ZhaPin.chemical.getItemStack() }), + "Contagious", MainBase.CONFIGURATION, true); + } + } + + @Override + public float getRadius() { + return (this.getTier() == 2) ? 22.0f : 15.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExCondensed.java b/src/main/java/icbm/zhapin/zhapin/ex/ExCondensed.java new file mode 100644 index 0000000..660832c --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExCondensed.java @@ -0,0 +1,171 @@ +package icbm.zhapin.zhapin.ex; + +import cpw.mods.fml.common.registry.LanguageRegistry; +import icbm.core.MainBase; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.block.BlockTNT; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.item.EntityTNTPrimed; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.MathHelper; +import net.minecraft.world.ChunkPosition; +import net.minecraft.world.Explosion; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExCondensed extends ZhaPin { + public ExCondensed(final String name, final int ID, final int tier) { + super(name, ID, tier); + this.setFuse(1); + } + + @Override + public void doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource) { + final List blownBlocks = new ArrayList<>(); + if (!worldObj.isRemote) { + for (int x = 0; x < 16; ++x) { + for (int y = 0; y < 16; ++y) { + for (int z = 0; z < 16; ++z) { + if (x == 0 || x == 15 || y == 0 || y == 15 || z == 0 || z == 15) { + double xStep = x / 15.0f * 2.0f - 1.0f; + double yStep = y / 15.0f * 2.0f - 1.0f; + double zStep = z / 15.0f * 2.0f - 1.0f; + final double diagonalDistance = Math.sqrt(xStep * xStep + yStep * yStep + zStep * zStep); + xStep /= diagonalDistance; + yStep /= diagonalDistance; + zStep /= diagonalDistance; + float var14 = 2.0f * (0.7f + worldObj.rand.nextFloat() * 0.6f); + double var15 = position.x; + double var16 = position.y; + double var17 = position.z; + for (float var18 = 0.3f; var14 > 0.0f; var14 -= var18 * 0.75f) { + final int var19 = MathHelper.floor_double(var15); + final int var20 = MathHelper.floor_double(var16); + final int var21 = MathHelper.floor_double(var17); + final Block block = worldObj.getBlock(var19, var20, var21); + if (block == Blocks.air) { + var14 -= (block.getExplosionResistance( + explosionSource, worldObj, var19, var20, var21, + (double) position.intX(), (double) position.intY(), + (double) position.intZ()) + + 0.3f) * + var18; + } + if (var14 > 0.0f) { + blownBlocks.add(new ChunkPosition(var19, var20, var21)); + } + var15 += xStep * var18; + var16 += yStep * var18; + var17 += zStep * var18; + } + } + } + } + } + } + worldObj.playSoundEffect( + position.x, position.y, position.z, "random.explode", 4.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 0.7f); + this.doDamageEntities(worldObj, position, 2.0f, 10.0f, false); + if (!worldObj.isRemote) { + for (int var23 = blownBlocks.size() - 1; var23 >= 0; --var23) { + final ChunkPosition var24 = blownBlocks.get(var23); + final int var25 = var24.chunkPosX; + final int var26 = var24.chunkPosY; + final int var27 = var24.chunkPosZ; + final Block block = worldObj.getBlock(var25, var26, var27); + final double var28 = var25 + worldObj.rand.nextFloat(); + final double var29 = var26 + worldObj.rand.nextFloat(); + final double var30 = var27 + worldObj.rand.nextFloat(); + double var31 = var28 - position.y; + double var32 = var29 - position.y; + double var33 = var30 - position.z; + final double var34 = MathHelper.sqrt_double( + var31 * var31 + var32 * var32 + var33 * var33); + var31 /= var34; + var32 /= var34; + var33 /= var34; + double var35 = 0.5 / (var34 / 2.0 + 0.1); + var35 *= worldObj.rand.nextFloat() * worldObj.rand.nextFloat() + 0.3f; + var31 *= var35; + var32 *= var35; + var33 *= var35; + worldObj.spawnParticle("explode", (var28 + position.x * 1.0) / 2.0, + (var29 + position.y * 1.0) / 2.0, + (var30 + position.z * 1.0) / 2.0, var31, var32, + var33); + worldObj.spawnParticle("smoke", var28, var29, var30, var31, var32, + var33); + if (block == Blocks.air) { + try { + if (block.canDropFromExplosion((Explosion) null)) { + block.dropBlockAsItemWithChance( + worldObj, var25, var26, var27, + worldObj.getBlockMetadata(var25, var26, var27), 1.0f, 0); + } + if (block instanceof BlockTNT) { + worldObj.setBlockToAir(var25, var26, var27); + if (!worldObj.isRemote) { + final EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(worldObj, var25 + 0.5, + var26 + 0.5, + var27 + 0.5, (EntityLiving) null); + entitytntprimed.fuse = worldObj.rand.nextInt(entitytntprimed.fuse / 4) + + entitytntprimed.fuse / 8; + worldObj.spawnEntityInWorld((Entity) entitytntprimed); + } + } else { + block.onBlockExploded(worldObj, var25, var26, var27, + (Explosion) null); + } + } catch (final Exception e) { + e.printStackTrace(); + } + } + } + } + } + + @Override + public String getMissileName() { + return LanguageRegistry.instance().getStringLocalization( + "icbm.explosive.conventional") + + " " + LanguageRegistry.instance().getStringLocalization("icbm.missile"); + } + + @Override + public String getMinecartName() { + return LanguageRegistry.instance().getStringLocalization("icbm.explosive") + + " " + + LanguageRegistry.instance().getStringLocalization("item.minecart.name"); + } + + @Override + public void init() { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(3), + new Object[] { "@?@", '@', Blocks.tnt, '?', Items.redstone }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + + @Override + public float getRadius() { + return 2.0f; + } + + @Override + public double getEnergy() { + return 4000.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExDebilitation.java b/src/main/java/icbm/zhapin/zhapin/ex/ExDebilitation.java new file mode 100644 index 0000000..398ed88 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExDebilitation.java @@ -0,0 +1,99 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.core.MainBase; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.zhapin.EGrenade; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.init.Items; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; +import universalelectricity.prefab.potion.CustomPotionEffect; + +public class ExDebilitation extends ZhaPin { + public ExDebilitation(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + worldObj.playSoundEffect( + position.x, position.y, position.z, "icbm.debilitation", 4.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 0.7f); + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, + final int explosionMetadata, final int callCount) { + float radius = this.getRadius(); + if (explosionSource instanceof EGrenade) { + radius /= 2.0f; + } + final int duration = 600 / this.proceduralInterval(); + if (worldObj.isRemote) { + for (int i = 0; i < 200; ++i) { + final Vector3 diDian = new Vector3(); + diDian.x = Math.random() * radius / 2.0 - radius / 4.0f; + diDian.y = Math.random() * radius / 2.0 - radius / 4.0f; + diDian.z = Math.random() * radius / 2.0 - radius / 4.0f; + diDian.multiply(Math.min(radius, (float) callCount) / 10.0f); + if (diDian.getMagnitude() <= radius) { + diDian.add(new Vector3(explosionSource)); + ICBMExplosion.proxy.spawnParticle( + "smoke", explosionSource.worldObj, diDian, + (Math.random() - 0.5) / 2.0, (Math.random() - 0.5) / 2.0, + (Math.random() - 0.5) / 2.0, 1.0f, 1.0f, 1.0f, 7.0f, 8.0); + } + } + } + final AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox( + position.x - radius, position.y - radius, position.z - radius, + position.x + radius, position.y + radius, position.z + radius); + final List allEntities = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, bounds); + for (final EntityLivingBase entity : allEntities) { + entity.addPotionEffect( + (PotionEffect) new CustomPotionEffect(Potion.confusion.id, 360, 0)); + entity.addPotionEffect((PotionEffect) new CustomPotionEffect( + Potion.digSlowdown.id, 1200, 0)); + entity.addPotionEffect((PotionEffect) new CustomPotionEffect( + Potion.moveSlowdown.id, 1200, 2)); + } + return callCount <= duration; + } + + public int proceduralInterval() { + return 5; + } + + @Override + public void init() { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(3), + new Object[] { "SSS", "WRW", "SSS", 'R', ZhaPin.repulsive.getItemStack(), + 'W', Items.water_bucket, 'S', "dustSulfur" }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + + @Override + public float getRadius() { + return 20.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExDecayLand.java b/src/main/java/icbm/zhapin/zhapin/ex/ExDecayLand.java new file mode 100644 index 0000000..82dbddb --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExDecayLand.java @@ -0,0 +1,77 @@ +package icbm.zhapin.zhapin.ex; + +import atomicscience.AtomicScience; +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class ExDecayLand extends ExThr { + public ExDecayLand(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + super.baoZhaQian(worldObj, position, explosionSource); + if (!worldObj.isRemote) { + final ThrSheXian thread = new ThrSheXian(worldObj, position, (int) ZhaPin.nuclear.getRadius(), + 200, explosionSource); + thread.run(); + ((EExplosion) explosionSource).dataList1.add(thread); + } + } + + @Override + public void baoZhaHou(final World worldObj, final Vector3 position, + final Entity explosionSource) { + super.baoZhaHou(worldObj, position, explosionSource); + final EExplosion source = (EExplosion) explosionSource; + if (!worldObj.isRemote && source.dataList1.size() > 0 && + source.dataList1.get(0) instanceof ThrSheXian) { + final ThrSheXian thread = (ThrSheXian) source.dataList1.get(0); + for (final Vector3 targetPosition : thread.destroyed) { + final Block block = targetPosition.getBlock((IBlockAccess) worldObj); + if (block != Blocks.air) { + if ((block == Blocks.grass || block == Blocks.sand) && + worldObj.rand.nextFloat() > 0.96) { + targetPosition.setBlock(worldObj, AtomicScience.blockRadioactive); + } + if (block == Blocks.stone) + if (worldObj.rand.nextFloat() <= 0.99) { + continue; + } + targetPosition.setBlock(worldObj, AtomicScience.blockRadioactive); + } else if (block == Blocks.leaves) { + targetPosition.setBlock(worldObj, Blocks.air); + } else if (block == Blocks.tallgrass) { + if (Math.random() * 100.0 > 50.0) { + targetPosition.setBlock(worldObj, Blocks.cobblestone); + } else { + targetPosition.setBlock(worldObj, Blocks.air); + } + } else { + if (block != Blocks.farmland) { + continue; + } + targetPosition.setBlock(worldObj, AtomicScience.blockRadioactive); + } + } + } + } + + @Override + public float getRadius() { + return 50.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExEmp.java b/src/main/java/icbm/zhapin/zhapin/ex/ExEmp.java new file mode 100644 index 0000000..90a4f5e --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExEmp.java @@ -0,0 +1,62 @@ +package icbm.zhapin.zhapin.ex; + +import calclavia.lib.UniversalRecipes; +import icbm.core.MainBase; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.item.ElectricItemHelper; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExEmp extends ZhaPin { + public ExEmp(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, int radius, + final int callCount) { + if (radius < 0) { + radius = (int) this.getRadius(); + } + ZhaPin.empSignal.doBaoZha(worldObj, position, explosionSource, radius, + callCount); + ZhaPin.empWave.doBaoZha(worldObj, position, explosionSource, radius, + callCount); + ICBMExplosion.proxy.spawnParticle("shockwave", worldObj, position, 0.0, 0.0, + 0.0, 0.0f, 0.0f, 255.0f, 10.0f, 3.0); + return false; + } + + @Override + public void init() { + if (OreDictionary.getOres(UniversalRecipes.BATTERY).size() > 0) { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), + new Object[] { + "RBR", "BTB", "RBR", 'T', ZhaPin.repulsive.getItemStack(), 'R', + Blocks.redstone_block, 'B', + ElectricItemHelper.getUncharged( + OreDictionary.getOres(UniversalRecipes.BATTERY).get(0)) }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + } + + @Override + public float getRadius() { + return 50.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExEmpSignal.java b/src/main/java/icbm/zhapin/zhapin/ex/ExEmpSignal.java new file mode 100644 index 0000000..4585cf2 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExEmpSignal.java @@ -0,0 +1,85 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.api.IMissile; +import icbm.api.RadarRegistry; +import icbm.api.explosion.IEMPItem; +import icbm.zhapin.zhapin.EExplosive; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import universalelectricity.core.item.IItemElectric; +import universalelectricity.core.vector.Vector3; + +public class ExEmpSignal extends ZhaPin { + public ExEmpSignal(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, final int radius, + final int callCount) { + final List entitiesNearby = RadarRegistry.getEntitiesWithinRadius(position.toVector2(), radius); + for (final Entity entity : entitiesNearby) { + if (entity instanceof IMissile && + !entity.isEntityEqual(explosionSource) && + ((IMissile) entity).getTicksInAir() > -1) { + ((IMissile) entity).dropMissileAsItem(); + } + } + final AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox( + position.x - radius, position.y - radius, position.z - radius, + position.x + radius, position.y + radius, position.z + radius); + final List entities = worldObj.getEntitiesWithinAABB(Entity.class, bounds); + for (final Entity entity2 : entities) { + if (entity2 instanceof EntityPlayer) { + final IInventory inventory = (IInventory) ((EntityPlayer) entity2).inventory; + for (int i = 0; i < inventory.getSizeInventory(); ++i) { + final ItemStack itemStack = inventory.getStackInSlot(i); + if (itemStack != null) { + if (itemStack.getItem() instanceof IEMPItem) { + ((IEMPItem) itemStack.getItem()) + .onEMP(itemStack, entity2, ZhaPin.emp); + } else if (itemStack.getItem() instanceof IItemElectric) { + ((IItemElectric) itemStack.getItem()).setJoules(0.0, itemStack); + } + // TODO: WTF: IC2 + // else if (itemStack.getItem() instanceof ICustomElectricItem) { + // ((ICustomElectricItem) itemStack.getItem()) + // .discharge(itemStack, + // ((ICustomElectricItem) itemStack.getItem()) + // .getMaxCharge(itemStack), + // 0, true, false); + // } + } + } + } else { + if (!(entity2 instanceof EExplosive)) { + continue; + } + entity2.setDead(); + } + } + worldObj.playSoundEffect( + position.x, position.y, position.z, "icbm.emp", 4.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 0.7f); + return false; + } + + @Override + public float getRadius() { + return 50.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExEmpWave.java b/src/main/java/icbm/zhapin/zhapin/ex/ExEmpWave.java new file mode 100644 index 0000000..7070121 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExEmpWave.java @@ -0,0 +1,93 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.api.explosion.IEMPBlock; +import icbm.zhapin.zhapin.ZhaPin; +import mffs.api.IForceFieldBlock; +import mffs.api.fortron.IFortronStorage; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import universalelectricity.core.block.IElectricityStorage; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.implement.IDisableable; +import universalelectricity.prefab.tile.TileEntityElectricityRunnable; + +public class ExEmpWave extends ZhaPin { + public ExEmpWave(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, final int radius, + final int callCount) { + for (int r = radius, x = -r; x < r; ++x) { + for (int y = -r; y < r; ++y) { + for (int z = -r; z < r; ++z) { + final double dist = MathHelper.sqrt_double((double) (x * x + y * y + z * z)); + final Vector3 searchPosition = Vector3.add(position, new Vector3(x, y, z)); + if (dist <= r) { + if (Math.round(position.x + y) == position.intY()) { + worldObj.spawnParticle("largesmoke", searchPosition.x, + searchPosition.y, searchPosition.z, 0.0, + 0.0, 0.0); + } + final Block block = searchPosition.getBlock((IBlockAccess) worldObj); + final TileEntity tileEntity = searchPosition.getTileEntity((IBlockAccess) worldObj); + if (block != null) { + if (block instanceof IForceFieldBlock) { + ((IForceFieldBlock) block) + .weakenForceField(worldObj, searchPosition.intX(), + searchPosition.intY(), + searchPosition.intZ(), 1000); + } else if (block instanceof IEMPBlock) { + ((IEMPBlock) block) + .onEMP(worldObj, searchPosition, ZhaPin.emp); + } else if (tileEntity != null) { + if (tileEntity instanceof IElectricityStorage) { + ((IElectricityStorage) tileEntity).setJoules(0.0); + } + if (tileEntity instanceof IDisableable) { + ((IDisableable) tileEntity).onDisable(400); + } + if (tileEntity instanceof IFortronStorage) { + ((IFortronStorage) tileEntity) + .provideFortron((int) worldObj.rand.nextFloat() * + ((IFortronStorage) tileEntity) + .getFortronCapacity(), + true); + } + // TODO: WTF: IC2 + // if (tileEntity instanceof IEnergyStorage) { + // ((IEnergyStorage) tileEntity).setStored(0); + // } + if (tileEntity instanceof TileEntityElectricityRunnable) { + ((TileEntityElectricityRunnable) tileEntity).wattsReceived = 0.0; + } + } + } + } + } + } + } + worldObj.playSoundEffect( + position.x, position.y, position.z, "icbm.emp", 4.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 0.7f); + return false; + } + + @Override + public float getRadius() { + return 50.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExEnder.java b/src/main/java/icbm/zhapin/zhapin/ex/ExEnder.java new file mode 100644 index 0000000..d204748 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExEnder.java @@ -0,0 +1,156 @@ +package icbm.zhapin.zhapin.ex; + +import cpw.mods.fml.common.FMLLog; +import icbm.core.MainBase; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.monster.EntityEnderman; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExEnder extends ZhaPin { + public static final int SHI_JIAN = 160; + + public ExEnder(final String name, final int ID, final int tier) { + super(name, ID, tier); + super.isMobile = true; + } + + @Override + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + if (!worldObj.isRemote) { + worldObj.createExplosion(explosionSource, position.x, position.y, + position.z, 5.0f, true); + } + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, + final int explosionMetadata, final int callCount) { + if (worldObj.isRemote) { + for (int r = (int) (this.getRadius() - + callCount / 160.0 * this.getRadius()), + x = -r; x < r; ++x) { + for (int z = -r; z < r; ++z) { + for (int y = -r; y < r; ++y) { + final Vector3 targetPosition = Vector3.add(position, new Vector3(x, y, z)); + final double distance = targetPosition.distanceTo(position); + if (distance < r && distance > r - 1) { + if (targetPosition.getBlock((IBlockAccess) worldObj) == Blocks.air) { + if (worldObj.rand.nextFloat() < Math.max(0.001 * r, 0.01)) { + final float velX = (float) ((targetPosition.x - position.x) * 0.5); + final float velY = (float) ((targetPosition.y - position.y) * 0.5); + final float velZ = (float) ((targetPosition.z - position.z) * 0.5); + ICBMExplosion.proxy.spawnParticle("portal", worldObj, + targetPosition, velX, velY, + velZ, 5.0f, 1.0); + } + } + } + } + } + } + } + final int radius = (int) this.getRadius(); + final AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox( + position.x - radius, position.y - radius, position.z - radius, + position.x + radius, position.y + radius, position.z + radius); + final List allEntities = worldObj.getEntitiesWithinAABB(Entity.class, bounds); + boolean explosionCreated = false; + for (final Entity entity : allEntities) { + if (entity == explosionSource) { + continue; + } + final double xDifference = entity.posX - position.x; + final double yDifference = entity.posY - position.y; + final double zDifference = entity.posZ - position.z; + int r2 = (int) this.getRadius(); + if (xDifference < 0.0) { + r2 = (int) (-this.getRadius()); + } + final Entity entity2 = entity; + entity2.motionX -= (r2 - xDifference) * Math.abs(xDifference) * 6.0E-4; + r2 = (int) this.getRadius(); + if (entity.posY > position.y) { + r2 = (int) (-this.getRadius()); + } + final Entity entity3 = entity; + entity3.motionY += (r2 - yDifference) * Math.abs(yDifference) * 0.0011; + r2 = (int) this.getRadius(); + if (zDifference < 0.0) { + r2 = (int) (-this.getRadius()); + } + final Entity entity4 = entity; + entity4.motionZ -= (r2 - zDifference) * Math.abs(zDifference) * 6.0E-4; + if (Vector3.distance(new Vector3(entity.posX, entity.posY, entity.posZ), + position) >= 4.0) { + continue; + } + if (!explosionCreated && callCount % 5 == 0) { + worldObj.spawnParticle("hugeexplosion", entity.posX, entity.posY, + entity.posZ, 0.0, 0.0, 0.0); + explosionCreated = true; + } + try { + if (entity.worldObj.provider.dimensionId == 1) { + entity.travelToDimension(0); + } else { + entity.travelToDimension(1); + } + } catch (final Exception e) { + FMLLog.severe("Failed to teleport entity to the End.", new Object[0]); + } + } + worldObj.playSound(position.x, position.y, position.z, "portal.portal", + 2.0f, worldObj.rand.nextFloat() * 0.4f + 0.8f, false); + return callCount <= 160; + } + + @Override + public void baoZhaHou(final World worldObj, final Vector3 position, + final Entity explosionSource) { + super.baoZhaHou(worldObj, position, explosionSource); + if (!explosionSource.worldObj.isRemote) { + for (int i = 0; i < 20; ++i) { + final EntityEnderman enderman = new EntityEnderman(worldObj); + enderman.setPosition(position.x, position.y, position.z); + explosionSource.worldObj.spawnEntityInWorld((Entity) enderman); + } + } + } + + public int proceduralInterval() { + return 1; + } + + @Override + public void init() { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), + new Object[] { "EPE", "ETE", "EPE", 'P', Items.ender_pearl, 'E', + Blocks.end_stone, 'T', ZhaPin.attractive.getItemStack() }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + + @Override + public float getRadius() { + return 20.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExEndothermic.java b/src/main/java/icbm/zhapin/zhapin/ex/ExEndothermic.java new file mode 100644 index 0000000..5e55735 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExEndothermic.java @@ -0,0 +1,212 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.core.MainBase; +import icbm.zhapin.EGravityBlock; +import icbm.zhapin.ELightBeam; +import icbm.zhapin.po.PDongShang; +import icbm.zhapin.zhapin.EGrenade; +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.ZhaPin; +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.init.Blocks; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; +import universalelectricity.prefab.potion.CustomPotionEffect; + +public class ExEndothermic extends ZhaPin { + public ExEndothermic(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + if (!worldObj.isRemote) { + final ELightBeam lightBeam = new ELightBeam(worldObj, position, 400, 0.0f, 0.3f, 0.7f); + worldObj.spawnEntityInWorld((Entity) lightBeam); + ((EExplosion) explosionSource).entityList.add(0, lightBeam); + worldObj.createExplosion((Entity) null, position.x, position.y, position.z, + 4.0f, true); + } + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, final int callCount) { + List gravityBlocks = new ArrayList<>(); + this.getClass(); + int radius = 5; + if (explosionSource instanceof EGrenade) { + radius /= 2; + } + if (this.canFocusBeam(worldObj, position)) { + if (!worldObj.isRemote) { + for (int r = radius, x = -r; x < r; ++x) { + for (int y = -r; y < r; ++y) { + for (int z = -r; z < r; ++z) { + final double dist = MathHelper.sqrt_double((double) (x * x + y * y + z * z)); + if (dist <= r) { + if (dist >= r - 3) { + final Vector3 currentPos = new Vector3( + position.x + x, position.y + y, position.z + z); + final Block blockID = worldObj.getBlock( + currentPos.intX(), currentPos.intY(), currentPos.intZ()); + if (blockID != Blocks.air && blockID != Blocks.bedrock) { + if (blockID != Blocks.obsidian) { + final int metadata = worldObj.getBlockMetadata( + currentPos.intX(), currentPos.intY(), + currentPos.intZ()); + if (worldObj.rand.nextInt(3) > 0) { + worldObj.setBlock(currentPos.intX(), currentPos.intY(), + currentPos.intZ(), Blocks.air, 0, 2); + currentPos.add(0.5); + final EGravityBlock entity = new EGravityBlock( + worldObj, currentPos, blockID, metadata); + worldObj.spawnEntityInWorld((Entity) entity); + gravityBlocks.add(entity); + entity.pitchChange = 50.0f * worldObj.rand.nextFloat(); + } + } + } + } + } + } + } + } + ((EExplosion) explosionSource).entityList.addAll(gravityBlocks); + } + gravityBlocks = ((EExplosion) explosionSource).entityList; + for (final Entity unspecifiedEntity : gravityBlocks) { + if (unspecifiedEntity instanceof EGravityBlock) { + final EGravityBlock entity2 = (EGravityBlock) unspecifiedEntity; + final double xDifference = entity2.posX - position.x; + final double zDifference = entity2.posZ - position.z; + int r2 = radius; + if (xDifference < 0.0) { + r2 = -radius; + } + if (xDifference > 4.0) { + final EGravityBlock eFeiBlock = entity2; + eFeiBlock.motionX += (r2 - xDifference) * -0.02 * worldObj.rand.nextFloat(); + } + if (entity2.posY < position.y + 15.0) { + final EGravityBlock eFeiBlock2 = entity2; + eFeiBlock2.motionY += 0.5 + 0.6 * worldObj.rand.nextFloat(); + if (entity2.posY < position.y + 3.0) { + final EGravityBlock eFeiBlock3 = entity2; + eFeiBlock3.motionY += 1.5; + } + } + r2 = radius; + if (zDifference < 0.0) { + r2 = -radius; + } + if (zDifference > 4.0) { + final EGravityBlock eFeiBlock4 = entity2; + eFeiBlock4.motionZ += (r2 - zDifference) * -0.02 * worldObj.rand.nextFloat(); + } + final EGravityBlock eFeiBlock5 = entity2; + eFeiBlock5.yawChange += 3.0f * worldObj.rand.nextFloat(); + } + } + worldObj.playSoundEffect(position.x, position.y, position.z, + "icbm.redmatter", 4.0f, 0.8f); + return callCount <= 35; + } + return false; + } + + @Override + public void baoZhaHou(final World worldObj, final Vector3 position, + final Entity explosionSource) { + super.baoZhaHou(worldObj, position, explosionSource); + if (!worldObj.isRemote) { + ((EExplosion) explosionSource).entityList.get(0).setDead(); + if (this.canFocusBeam(worldObj, position)) { + for (final Entity entity : ((EExplosion) explosionSource).entityList) { + if (!(entity instanceof ELightBeam)) { + final double xDifference = entity.posX - position.x; + final double zDifference = entity.posZ - position.z; + int m = 1; + if (xDifference < 0.0) { + m = -1; + } + final Entity entity3 = entity; + entity3.motionX += m * 5 * worldObj.rand.nextFloat(); + m = 1; + if (zDifference < 0.0) { + m = -1; + } + final Entity entity4 = entity; + entity4.motionZ += m * 5 * worldObj.rand.nextFloat(); + } + } + ((EExplosion) explosionSource).entityList.clear(); + final List livingEntities = worldObj.getEntitiesWithinAABB( + EntityLivingBase.class, + AxisAlignedBB.getBoundingBox(position.x - this.getRadius(), + position.y - this.getRadius(), + position.z - this.getRadius(), + position.x + this.getRadius(), + position.y + this.getRadius(), + position.z + this.getRadius())); + for (final EntityLivingBase entity2 : livingEntities) { + entity2.addPotionEffect((PotionEffect) new CustomPotionEffect( + PDongShang.INSTANCE.getId(), 1200, 1, null)); + entity2.addPotionEffect( + new PotionEffect(Potion.confusion.id, 200, 2)); + entity2.addPotionEffect( + new PotionEffect(Potion.digSlowdown.id, 2400, 2)); + entity2.addPotionEffect( + new PotionEffect(Potion.moveSlowdown.id, 2400, 4)); + } + ZhaPin.createExplosion(worldObj, position, explosionSource, + ZhaPin.endothermic2.getID()); + } + } + } + + @Override + public void init() { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), + new Object[] { "?!?", "!@!", "?!?", '@', ZhaPin.attractive.getItemStack(), + '?', Blocks.ice, '!', Blocks.snow }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + + public boolean canFocusBeam(final World worldObj, final Vector3 position) { + long worldTime; + for (worldTime = worldObj.getWorldTime(); worldTime > 23999L; worldTime -= 23999L) { + } + return worldTime > 12000L && + worldObj.canBlockSeeTheSky(position.intX(), position.intY() + 1, + position.intZ()); + } + + public int proceduralInterval() { + return 5; + } + + @Override + public float getRadius() { + return 40.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExEndothermic2.java b/src/main/java/icbm/zhapin/zhapin/ex/ExEndothermic2.java new file mode 100644 index 0000000..a8e8abd --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExEndothermic2.java @@ -0,0 +1,149 @@ +package icbm.zhapin.zhapin.ex; + +import cpw.mods.fml.common.FMLLog; +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class ExEndothermic2 extends ZhaPin { + public ExEndothermic2(final String name, final int ID, final int tier) { + super(name, ID, tier); + this.setFuse(1); + } + + @Override + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + super.baoZhaQian(worldObj, position, explosionSource); + if (!worldObj.isRemote) { + final EExplosion source = (EExplosion) explosionSource; + for (int x = 0; x < this.getRadius(); ++x) { + for (int y = 0; y < this.getRadius(); ++y) { + for (int z = 0; z < this.getRadius(); ++z) { + if (x == 0 || x == this.getRadius() - 1.0f || y == 0 || + y == this.getRadius() - 1.0f || z == 0 || + z == this.getRadius() - 1.0f) { + double xStep = x / (this.getRadius() - 1.0f) * 2.0f - 1.0f; + double yStep = y / (this.getRadius() - 1.0f) * 2.0f - 1.0f; + double zStep = z / (this.getRadius() - 1.0f) * 2.0f - 1.0f; + final double diagonalDistance = Math.sqrt(xStep * xStep + yStep * yStep + zStep * zStep); + xStep /= diagonalDistance; + yStep /= diagonalDistance; + zStep /= diagonalDistance; + float power = this.getRadius() * (0.7f + worldObj.rand.nextFloat() * 0.6f); + double var15 = position.x; + double var16 = position.y; + double var17 = position.z; + for (float var18 = 0.3f; power > 0.0f; power -= var18 * 0.75f) { + final Vector3 targetPosition = new Vector3(var15, var16, var17); + final Block block = worldObj.getBlock(targetPosition.intX(), + targetPosition.intY(), + targetPosition.intZ()); + if (block != Blocks.air) { + float resistance = 0.0f; + if (block == Blocks.bedrock) { + break; + } + if (block instanceof BlockLiquid) { + resistance = 1.0f; + } else { + resistance = (block.getExplosionResistance( + explosionSource, worldObj, targetPosition.intX(), + targetPosition.intY(), targetPosition.intZ(), + (double) position.intX(), (double) position.intY(), + (double) position.intZ()) + + 0.3f) * + var18; + } + power -= resistance; + } + if (power > 0.0f) { + source.dataList1.add(targetPosition.clone()); + } + var15 += xStep * var18; + var16 += yStep * var18; + var17 += zStep * var18; + } + } + } + } + } + } + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, final int metadata, + final int callCount) { + try { + if (!worldObj.isRemote) { + final EExplosion source = (EExplosion) explosionSource; + final int radius = callCount; + for (final Object obj : source.dataList1) { + final Vector3 targetPosition = (Vector3) obj; + final double distance = Vector3.distance(targetPosition, position); + final double distanceFromCenter = position.distanceTo(targetPosition); + if (distanceFromCenter <= radius) { + if (distanceFromCenter < radius - 2) { + continue; + } + final double chance = radius - Math.random() * distanceFromCenter; + if (chance <= distanceFromCenter * 0.55) { + continue; + } + final Block blockID = worldObj.getBlock((int) targetPosition.x, (int) targetPosition.y, + (int) targetPosition.z); + if (blockID == Blocks.fire || blockID == Blocks.lava || + blockID == Blocks.flowing_lava) { + worldObj.setBlock((int) targetPosition.x, (int) targetPosition.y, + (int) targetPosition.z, Blocks.snow_layer, 0, 2); + } else { + if (blockID != Blocks.air || + worldObj.getBlock((int) targetPosition.x, + (int) targetPosition.y - 1, + (int) targetPosition.z) == Blocks.ice + || + worldObj.getBlock((int) targetPosition.x, + (int) targetPosition.y - 1, + (int) targetPosition.z) == Blocks.air) { + continue; + } + worldObj.setBlock((int) targetPosition.x, (int) targetPosition.y, + (int) targetPosition.z, Blocks.ice, 0, 2); + } + } + } + } + worldObj.playSoundEffect( + position.x + 0.5, position.y + 0.5, position.z + 0.5, + "icbm.redmatter", 6.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 1.0f); + } catch (final Exception e) { + FMLLog.severe("Endothermic Explosives Failure!", new Object[0]); + e.printStackTrace(); + } + return callCount <= this.getRadius(); + } + + @Override + public int proceduralInterval() { + return 3; + } + + @Override + public float getRadius() { + return 40.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExExothermic.java b/src/main/java/icbm/zhapin/zhapin/ex/ExExothermic.java new file mode 100644 index 0000000..81bf56a --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExExothermic.java @@ -0,0 +1,195 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.core.MainBase; +import icbm.zhapin.EGravityBlock; +import icbm.zhapin.ELightBeam; +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExExothermic extends ZhaPin { + public ExExothermic(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public void onYinZha(final World worldObj, final Vector3 position, + final int fuseTicks) { + super.onYinZha(worldObj, position, fuseTicks); + worldObj.spawnParticle("lava", position.x, position.y + 0.5, position.z, + 0.0, 0.0, 0.0); + } + + @Override + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + if (!worldObj.isRemote) { + final ELightBeam lightBeam = new ELightBeam(worldObj, position, 400, 0.7f, 0.3f, 0.0f); + worldObj.spawnEntityInWorld((Entity) lightBeam); + ((EExplosion) explosionSource).entityList.add(0, lightBeam); + worldObj.createExplosion((Entity) null, position.x, position.y, position.z, + 4.0f, true); + } + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, final int callCount) { + List gravityBlocks = new ArrayList<>(); + this.getClass(); + final int radius = 5; + if (!worldObj.isRemote) { + if (this.canFocusBeam(worldObj, position)) { + for (int r = radius, x = -r; x < r; ++x) { + for (int y = -r; y < r; ++y) { + for (int z = -r; z < r; ++z) { + final double dist = MathHelper.sqrt_double((double) (x * x + y * y + z * z)); + if (dist <= r) { + if (dist >= r - 3) { + final Vector3 currentPos = new Vector3( + position.x + x, position.y + y, position.z + z); + final Block block = worldObj.getBlock( + currentPos.intX(), currentPos.intY(), currentPos.intZ()); + if (block != Blocks.air && block != Blocks.bedrock) { + if (block != Blocks.obsidian) { + final int metadata = worldObj.getBlockMetadata( + currentPos.intX(), currentPos.intY(), + currentPos.intZ()); + if (worldObj.rand.nextInt(3) > 0) { + worldObj.setBlock(currentPos.intX(), currentPos.intY(), + currentPos.intZ(), Blocks.air, 0, 2); + currentPos.add(0.5); + final EGravityBlock entity = new EGravityBlock( + worldObj, currentPos, block, metadata); + worldObj.spawnEntityInWorld((Entity) entity); + gravityBlocks.add(entity); + entity.pitchChange = 50.0f * worldObj.rand.nextFloat(); + } + } + } + } + } + } + } + ((EExplosion) explosionSource).entityList.addAll(gravityBlocks); + } + } + gravityBlocks = ((EExplosion) explosionSource).entityList; + for (final Entity unspecifiedEntity : gravityBlocks) { + if (unspecifiedEntity instanceof EGravityBlock) { + final EGravityBlock entity2 = (EGravityBlock) unspecifiedEntity; + final double xDifference = entity2.posX - position.x; + final double zDifference = entity2.posZ - position.z; + int r2 = radius; + if (xDifference < 0.0) { + r2 = -radius; + } + if (xDifference > 4.0) { + final EGravityBlock eFeiBlock = entity2; + eFeiBlock.motionX += (r2 - xDifference) * -0.02 * worldObj.rand.nextFloat(); + } + if (entity2.posY < position.y + 15.0) { + final EGravityBlock eFeiBlock2 = entity2; + eFeiBlock2.motionY += 0.5 + 0.6 * worldObj.rand.nextFloat(); + if (entity2.posY < position.y + 3.0) { + final EGravityBlock eFeiBlock3 = entity2; + eFeiBlock3.motionY += 1.5; + } + } + r2 = radius; + if (zDifference < 0.0) { + r2 = -radius; + } + if (zDifference > 4.0) { + final EGravityBlock eFeiBlock4 = entity2; + eFeiBlock4.motionZ += (r2 - zDifference) * -0.02 * worldObj.rand.nextFloat(); + } + final EGravityBlock eFeiBlock5 = entity2; + eFeiBlock5.yawChange += 3.0f * worldObj.rand.nextFloat(); + } + } + worldObj.playSoundEffect(position.x, position.y, position.z, + "icbm.beamcharging", 4.0f, 0.8f); + return callCount <= 35; + } + return false; + } + + @Override + public void baoZhaHou(final World worldObj, final Vector3 position, + final Entity explosionSource) { + super.baoZhaHou(worldObj, position, explosionSource); + if (!worldObj.isRemote) { + ((EExplosion) explosionSource).entityList.get(0).setDead(); + worldObj.playSoundEffect(position.x, position.y, position.z, + "icbm.powerdown", 4.0f, 0.8f); + if (this.canFocusBeam(worldObj, position)) { + for (final Entity entity : ((EExplosion) explosionSource).entityList) { + if (!(entity instanceof ELightBeam)) { + final double xDifference = entity.posX - position.x; + final double zDifference = entity.posZ - position.z; + int m = 1; + if (xDifference < 0.0) { + m = -1; + } + final Entity entity2 = entity; + entity2.motionX += m * 5 * worldObj.rand.nextFloat(); + m = 1; + if (zDifference < 0.0) { + m = -1; + } + final Entity entity3 = entity; + entity3.motionZ += m * 5 * worldObj.rand.nextFloat(); + } + } + ZhaPin.createExplosion(worldObj, position, explosionSource, + ZhaPin.exothermic2.getID()); + } + } + } + + public boolean canFocusBeam(final World worldObj, final Vector3 position) { + long worldTime; + for (worldTime = worldObj.getWorldTime(); worldTime > 23999L; worldTime -= 23999L) { + } + return worldTime < 12000L && + worldObj.canBlockSeeTheSky(position.intX(), position.intY() + 1, + position.intZ()) + && + !worldObj.isRaining(); + } + + public int proceduralInterval() { + return 5; + } + + @Override + public void init() { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe(this.getItemStack(), + new Object[] { "!!!", "!@!", "!!!", '@', + Blocks.glass, '!', + ZhaPin.indenciary.getItemStack() }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + + @Override + public float getRadius() { + return 5.0f; + } + + @Override + public double getEnergy() { + return 1000.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExExothermic2.java b/src/main/java/icbm/zhapin/zhapin/ex/ExExothermic2.java new file mode 100644 index 0000000..00662fc --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExExothermic2.java @@ -0,0 +1,188 @@ +package icbm.zhapin.zhapin.ex; + +import cpw.mods.fml.common.FMLLog; +import icbm.core.MainBase; +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class ExExothermic2 extends ZhaPin { + public boolean createNetherrack; + + public ExExothermic2(final String name, final int ID, final int tier) { + super(name, ID, tier); + this.createNetherrack = true; + this.setFuse(1); + MainBase.CONFIGURATION.load(); + this.createNetherrack = MainBase.CONFIGURATION + .get("general", "Create Netherrack", this.createNetherrack) + .getBoolean(this.createNetherrack); + MainBase.CONFIGURATION.save(); + } + + @Override + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + super.baoZhaQian(worldObj, position, explosionSource); + if (!worldObj.isRemote) { + final EExplosion source = (EExplosion) explosionSource; + for (int x = 0; x < this.getRadius(); ++x) { + for (int y = 0; y < this.getRadius(); ++y) { + for (int z = 0; z < this.getRadius(); ++z) { + if (x == 0 || x == this.getRadius() - 1.0f || y == 0 || + y == this.getRadius() - 1.0f || z == 0 || + z == this.getRadius() - 1.0f) { + double xStep = x / (this.getRadius() - 1.0f) * 2.0f - 1.0f; + double yStep = y / (this.getRadius() - 1.0f) * 2.0f - 1.0f; + double zStep = z / (this.getRadius() - 1.0f) * 2.0f - 1.0f; + final double diagonalDistance = Math.sqrt(xStep * xStep + yStep * yStep + zStep * zStep); + xStep /= diagonalDistance; + yStep /= diagonalDistance; + zStep /= diagonalDistance; + float power = this.getRadius() * (0.7f + worldObj.rand.nextFloat() * 0.6f); + double var15 = position.x; + double var16 = position.y; + double var17 = position.z; + for (float var18 = 0.3f; power > 0.0f; power -= var18 * 0.75f) { + final Vector3 targetPosition = new Vector3(var15, var16, var17); + final Block block = worldObj.getBlock(targetPosition.intX(), + targetPosition.intY(), + targetPosition.intZ()); + if (block != Blocks.air) { + float resistance = 0.0f; + if (block == Blocks.bedrock) { + break; + } + if (block instanceof BlockLiquid) { + resistance = 1.0f; + } else { + resistance = (block.getExplosionResistance( + explosionSource, worldObj, targetPosition.intX(), + targetPosition.intY(), targetPosition.intZ(), + (double) position.intX(), (double) position.intY(), + (double) position.intZ()) + + 0.3f) * + var18; + } + power -= resistance; + } + if (power > 0.0f) { + source.dataList1.add(targetPosition.clone()); + } + var15 += xStep * var18; + var16 += yStep * var18; + var17 += zStep * var18; + } + } + } + } + } + } + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, final int metadata, + final int callCount) { + try { + if (!worldObj.isRemote) { + final EExplosion source = (EExplosion) explosionSource; + final int radius = callCount; + for (final Object obj : source.dataList1) { + final Vector3 targetPosition = (Vector3) obj; + final double distanceFromCenter = position.distanceTo(targetPosition); + if (distanceFromCenter <= radius) { + if (distanceFromCenter < radius - 2) { + continue; + } + final double chance = radius - Math.random() * distanceFromCenter; + if (chance <= distanceFromCenter * 0.55) { + continue; + } + Block blockID = worldObj.getBlock((int) targetPosition.x, (int) targetPosition.y, + (int) targetPosition.z); + if (blockID == Blocks.water || blockID == Blocks.flowing_water || + blockID == Blocks.ice) { + worldObj.setBlock((int) targetPosition.x, (int) targetPosition.y, + (int) targetPosition.z, Blocks.air, 0, 2); + } + if ((blockID == Blocks.air || blockID == Blocks.snow_layer) && + worldObj + .getBlock((int) targetPosition.x, (int) targetPosition.y - 1, + (int) targetPosition.z) + .getMaterial() + .isSolid()) { + if (worldObj.rand.nextFloat() > 0.999) { + worldObj.setBlock((int) targetPosition.x, (int) targetPosition.y, + (int) targetPosition.z, Blocks.flowing_lava, 0, + 2); + } else { + worldObj.setBlock((int) targetPosition.x, (int) targetPosition.y, + (int) targetPosition.z, Blocks.fire, 0, 2); + blockID = worldObj.getBlock((int) targetPosition.x, + (int) targetPosition.y - 1, + (int) targetPosition.z); + if (!this.createNetherrack || + (blockID != Blocks.stone && blockID != Blocks.grass && + blockID != Blocks.dirt) + || + worldObj.rand.nextFloat() <= 0.75) { + continue; + } + worldObj.setBlock( + (int) targetPosition.x, (int) targetPosition.y - 1, + (int) targetPosition.z, Blocks.netherrack, 0, 2); + } + } else { + if (blockID != Blocks.ice) { + continue; + } + worldObj.setBlock((int) targetPosition.x, (int) targetPosition.y, + (int) targetPosition.z, Blocks.air, 0, 2); + } + } + } + } + worldObj.playSoundEffect( + position.x + 0.5, position.y + 0.5, position.z + 0.5, + "icbm.explosionfire", 6.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 1.0f); + } catch (final Exception e) { + FMLLog.severe("Conflagration explosive failed!", new Object[0]); + e.printStackTrace(); + } + return callCount <= this.getRadius(); + } + + public int proceduralInterval() { + return 2; + } + + @Override + public void gengXin(final World worldObj, final Vector3 position, + final int ticksExisted) { + long worldTime; + for (worldTime = worldObj.getWorldTime(); worldTime > 23999L; worldTime -= 23999L) { + } + if (worldTime < 18000L) { + worldObj.setWorldTime(worldObj.getWorldTime() + 150L); + } + } + + @Override + public float getRadius() { + return 50.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExHypersonic.java b/src/main/java/icbm/zhapin/zhapin/ex/ExHypersonic.java new file mode 100644 index 0000000..bb3aab7 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExHypersonic.java @@ -0,0 +1,225 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.core.MainBase; +import icbm.zhapin.EGravityBlock; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.daodan.EMissile; +import icbm.zhapin.zhapin.BExplosives; +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.TExplosive; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.List; +import mffs.api.IForceFieldBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExHypersonic extends ZhaPin { + public ExHypersonic(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + if (!worldObj.isRemote) { + final EExplosion source = (EExplosion) explosionSource; + for (int x = (int) (-this.getRadius() * 2.0f); x < this.getRadius() * 2.0f; ++x) { + for (int y = (int) (-this.getRadius() * 2.0f); y < this.getRadius() * 2.0f; ++y) { + for (int z = (int) (-this.getRadius() * 2.0f); z < this.getRadius() * 2.0f; ++z) { + final Vector3 targetPosition = Vector3.add(position, new Vector3(x, y, z)); + final Block block = worldObj.getBlock(targetPosition.intX(), targetPosition.intY(), + targetPosition.intZ()); + if (block != Blocks.air) { + final Material material = worldObj + .getBlock(targetPosition.intX(), targetPosition.intY(), + targetPosition.intZ()) + .getMaterial(); + if (block != Blocks.bedrock && !(block instanceof BlockLiquid) && + (block.getExplosionResistance( + explosionSource, worldObj, targetPosition.intX(), + targetPosition.intY(), targetPosition.intZ(), + (double) position.intX(), (double) position.intY(), + (double) position.intZ()) > 70.0f || + material == Material.glass)) { + targetPosition.setBlock(worldObj, Blocks.air); + } + } + } + } + } + for (int x = 0; x < this.getRadius(); ++x) { + for (int y = 0; y < this.getRadius(); ++y) { + for (int z = 0; z < this.getRadius(); ++z) { + if (x == 0 || x == this.getRadius() - 1.0f || y == 0 || + y == this.getRadius() - 1.0f || z == 0 || + z == this.getRadius() - 1.0f) { + double xStep = x / (this.getRadius() - 1.0f) * 2.0f - 1.0f; + double yStep = y / (this.getRadius() - 1.0f) * 2.0f - 1.0f; + double zStep = z / (this.getRadius() - 1.0f) * 2.0f - 1.0f; + final double diagonalDistance = Math.sqrt(xStep * xStep + yStep * yStep + zStep * zStep); + xStep /= diagonalDistance; + yStep /= diagonalDistance; + zStep /= diagonalDistance; + float power = 70.0f * (0.7f + worldObj.rand.nextFloat() * 0.6f); + double var15 = position.x; + double var16 = position.y; + double var17 = position.z; + for (float var18 = 0.3f; power > 0.0f; power -= var18 * 0.75f) { + final Vector3 targetPosition2 = new Vector3(var15, var16, var17); + final Block block2 = worldObj.getBlock(targetPosition2.intX(), + targetPosition2.intY(), + targetPosition2.intZ()); + if (block2 != Blocks.air) { + float resistance = 0.0f; + if (block2 == Blocks.bedrock) { + break; + } + if (block2 instanceof BlockLiquid) { + resistance = 2.0f; + } else { + resistance = (block2.getExplosionResistance( + explosionSource, worldObj, targetPosition2.intX(), + targetPosition2.intY(), targetPosition2.intZ(), + (double) position.intX(), (double) position.intY(), + (double) position.intZ()) + + 0.3f) * + var18; + } + power -= resistance; + } + if (power > 0.0f) { + source.dataList1.add(targetPosition2.clone()); + } + var15 += xStep * var18; + var16 += yStep * var18; + var17 += zStep * var18; + } + } + } + } + } + } + worldObj.playSoundEffect( + position.x, position.y, position.z, "icbm.hypersonic", 6.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.1f) * + 0.9f); + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, + final int explosionMetadata, final int callCount) { + final EExplosion source = (EExplosion) explosionSource; + int r = callCount; + if (!worldObj.isRemote) { + for (final Object obj : source.dataList1) { + final Vector3 targetPosition = (Vector3) obj; + final double distance = Vector3.distance(targetPosition, position); + if (distance <= r) { + if (distance < r - 3) { + continue; + } + final Block block = worldObj.getBlock(targetPosition.intX(), targetPosition.intY(), + targetPosition.intZ()); + if (block == Blocks.air || block == Blocks.bedrock) { + continue; + } + if (block == Blocks.obsidian) { + continue; + } + if (block instanceof IForceFieldBlock) { + continue; + } + final int metadata = worldObj.getBlockMetadata(targetPosition.intX(), + targetPosition.intY(), + targetPosition.intZ()); + if (distance >= r - 1 && worldObj.rand.nextInt(3) <= 0) { + continue; + } + if (block == ICBMExplosion.bExplosives) { + BExplosives.yinZha(worldObj, targetPosition.intX(), + targetPosition.intY(), targetPosition.intZ(), + ((TExplosive) worldObj.getTileEntity( + targetPosition.intX(), targetPosition.intY(), + targetPosition.intZ())).explosiveId, + 1); + } else { + worldObj.setBlock(targetPosition.intX(), targetPosition.intY(), + targetPosition.intZ(), Blocks.air, 0, 2); + } + targetPosition.add(0.5); + if (worldObj.rand.nextFloat() >= 0.2 * (this.getRadius() - r)) { + continue; + } + final EGravityBlock entity = new EGravityBlock(worldObj, targetPosition, block, metadata); + worldObj.spawnEntityInWorld((Entity) entity); + entity.yawChange = 50.0f * worldObj.rand.nextFloat(); + entity.pitchChange = 100.0f * worldObj.rand.nextFloat(); + } + } + } + final int radius = 2 * callCount; + final AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox( + position.x - radius, position.y - radius, position.z - radius, + position.x + radius, position.y + radius, position.z + radius); + final List allEntities = worldObj.getEntitiesWithinAABB(Entity.class, bounds); + synchronized (allEntities) { + for (final Entity entity2 : allEntities) { + if (entity2 instanceof EMissile) { + ((EMissile) entity2).setExplode(); + break; + } + final double xDifference = entity2.posX - position.x; + final double zDifference = entity2.posZ - position.z; + r = (int) this.getRadius(); + if (xDifference < 0.0) { + r = (int) (-this.getRadius()); + } + final Entity entity3 = entity2; + entity3.motionX += (r - xDifference) * 0.02 * worldObj.rand.nextFloat(); + final Entity entity4 = entity2; + entity4.motionY += 4.0f * worldObj.rand.nextFloat(); + r = (int) this.getRadius(); + if (zDifference < 0.0) { + r = (int) (-this.getRadius()); + } + final Entity entity5 = entity2; + entity5.motionZ += (r - zDifference) * 0.02 * worldObj.rand.nextFloat(); + } + } + return callCount <= this.getRadius(); + } + + public int proceduralInterval() { + return 4; + } + + @Override + public void init() { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), new Object[] { " S ", "S S", " S ", 'S', + ZhaPin.sonic.getItemStack() }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + + @Override + public float getRadius() { + return 12.0f; + } + + @Override + public double getEnergy() { + return 500.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExIncendiary.java b/src/main/java/icbm/zhapin/zhapin/ex/ExIncendiary.java new file mode 100644 index 0000000..b248aed --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExIncendiary.java @@ -0,0 +1,127 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.core.MainBase; +import icbm.zhapin.zhapin.EGrenade; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExIncendiary extends ZhaPin { + public ExIncendiary(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public void onYinZha(final World worldObj, final Vector3 position, + final int fuseTicks) { + super.onYinZha(worldObj, position, fuseTicks); + worldObj.spawnParticle("lava", position.x, position.y + 0.5, position.z, + 0.0, 0.0, 0.0); + } + + @Override + public void doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource) { + int radius = (int) this.getRadius(); + if (explosionSource instanceof EGrenade) { + radius /= 2; + } + for (int x = 0; x < radius; ++x) { + for (int y = 0; y < radius; ++y) { + for (int z = 0; z < radius; ++z) { + if (x == 0 || x == radius - 1 || y == 0 || y == radius - 1 || + z == 0 || z == radius - 1) { + double xStep = x / (radius - 1.0f) * 2.0f - 1.0f; + double yStep = y / (radius - 1.0f) * 2.0f - 1.0f; + double zStep = z / (radius - 1.0f) * 2.0f - 1.0f; + final double diagonalDistance = Math.sqrt(xStep * xStep + yStep * yStep + zStep * zStep); + xStep /= diagonalDistance; + yStep /= diagonalDistance; + zStep /= diagonalDistance; + float var14 = radius * (0.7f + worldObj.rand.nextFloat() * 0.6f); + double var15 = position.x; + double var16 = position.y; + double var17 = position.z; + for (float var18 = 0.3f; var14 > 0.0f; var14 -= var18 * 0.75f) { + final Vector3 targetPosition = new Vector3(var15, var16, var17); + final double distanceFromCenter = position.distanceTo(targetPosition); + final Block var19 = worldObj.getBlock(targetPosition.intX(), + targetPosition.intY(), + targetPosition.intZ()); + if (var19 != Blocks.air) { + var14 -= (var19.getExplosionResistance( + explosionSource, worldObj, targetPosition.intX(), + targetPosition.intY(), targetPosition.intZ(), + (double) position.intX(), (double) position.intY(), + (double) position.intZ()) + + 0.3f) * + var18; + } + if (var14 > 0.0f) { + final double chance = radius - Math.random() * distanceFromCenter; + if (chance > distanceFromCenter * 0.55) { + final Block block = worldObj.getBlock( + (int) targetPosition.x, (int) targetPosition.y, + (int) targetPosition.z); + if ((block == Blocks.air || + block == Blocks.snow_layer) && + worldObj + .getBlock((int) targetPosition.x, + (int) targetPosition.y - 1, + (int) targetPosition.z) + .getMaterial() + .isSolid()) { + worldObj.setBlock( + (int) targetPosition.x, (int) targetPosition.y, + (int) targetPosition.z, + Blocks.fire, 0, 2); + } else if (block == Blocks.ice) { + worldObj.setBlock((int) targetPosition.x, + (int) targetPosition.y, + (int) targetPosition.z, Blocks.air, 0, 2); + } + } + } + var15 += xStep * var18; + var16 += yStep * var18; + var17 += zStep * var18; + } + } + } + } + } + worldObj.playSoundEffect( + position.x + 0.5, position.y + 0.5, position.z + 0.5, + "icbm.explosionfire", 4.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 1.0f); + } + + @Override + public void init() { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), + new Object[] { "@@@", "@?@", "@!@", '@', "dustSulfur", '?', + ZhaPin.repulsive.getItemStack(), '!', Items.lava_bucket }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + + @Override + public float getRadius() { + return 14.0f; + } + + @Override + public double getEnergy() { + return 1000.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExMutateLiving.java b/src/main/java/icbm/zhapin/zhapin/ex/ExMutateLiving.java new file mode 100644 index 0000000..74a7b1d --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExMutateLiving.java @@ -0,0 +1,61 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.zhapin.zhapin.ZhaPin; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityPigZombie; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.passive.EntityPig; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class ExMutateLiving extends ZhaPin { + public ExMutateLiving(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, final int radius, + final int callCount) { + if (!worldObj.isRemote) { + final AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox( + position.x - radius, position.y - radius, position.z - radius, + position.x + radius, position.y + radius, position.z + radius); + final List entitiesNearby = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, + bounds); + for (final EntityLivingBase entity : entitiesNearby) { + if (entity instanceof EntityPig) { + final EntityPigZombie newEntity = new EntityPigZombie(worldObj); + ((Entity) newEntity).preventEntitySpawning = true; + newEntity.setPosition(((Entity) entity).posX, ((Entity) entity).posY, + ((Entity) entity).posZ); + entity.setDead(); + } else { + if (!(entity instanceof EntityVillager)) { + continue; + } + final EntityZombie newEntity2 = new EntityZombie(worldObj); + ((Entity) newEntity2).preventEntitySpawning = true; + newEntity2.setPosition(((Entity) entity).posX, ((Entity) entity).posY, + ((Entity) entity).posZ); + entity.setDead(); + } + } + } + return false; + } + + @Override + public float getRadius() { + return 0.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExNuclear.java b/src/main/java/icbm/zhapin/zhapin/ex/ExNuclear.java new file mode 100644 index 0000000..0f49526 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExNuclear.java @@ -0,0 +1,147 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.core.MainBase; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.MathHelper; +import net.minecraft.world.Explosion; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExNuclear extends ExThr { + public static final int BAN_JING = 45; + public static final int NENG_LIANG = 200; + + public ExNuclear(final String name, final int ID, final int tier) { + super(name, ID, tier); + this.setFuse(200); + } + + @Override + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + super.baoZhaQian(worldObj, position, explosionSource); + if (!worldObj.isRemote) { + final ThrSheXian thread = new ThrSheXian(worldObj, position, 45, 200, explosionSource); + thread.run(); + ((EExplosion) explosionSource).dataList1.add(thread); + } else if (ICBMExplosion.proxy.isGaoQing()) { + for (int y = 0; y < 26; ++y) { + int r = 4; + if (y < 8) { + r = Math.max(Math.min((8 - y) * 2, 10), 4); + } else if (y > 15) { + r = Math.max(Math.min((y - 15) * 2, 15), 5); + } + for (int x = -r; x < r; ++x) { + for (int z = -r; z < r; ++z) { + final double distance = MathHelper.sqrt_double((double) (x * x + z * z)); + if (r > distance && r - 3 < distance) { + final Vector3 spawnPosition = Vector3.add(position, new Vector3(x * 2, (y - 2) * 2, z * 2)); + final float xDiff = (float) (spawnPosition.x - position.x); + final float zDiff = (float) (spawnPosition.z - position.z); + ICBMExplosion.proxy.spawnParticle( + "smoke", worldObj, spawnPosition, + xDiff * 0.3 * worldObj.rand.nextFloat(), + -worldObj.rand.nextFloat(), + zDiff * 0.3 * worldObj.rand.nextFloat(), + (float) (distance / 45.0) * worldObj.rand.nextFloat(), 0.0f, + 0.0f, 8.0f, 1.2000000476837158); + } + } + } + } + } + this.doDamageEntities(worldObj, position, 45.0f, 200000.0f); + worldObj.playSoundEffect( + position.x, position.y, position.z, "icbm.explosion", 7.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 0.7f); + } + + @Override + public void baoZhaHou(final World worldObj, final Vector3 position, + final Entity explosionSource) { + super.baoZhaHou(worldObj, position, explosionSource); + final EExplosion source = (EExplosion) explosionSource; + try { + if (!worldObj.isRemote && source.dataList1.size() > 0 && + source.dataList1.get(0) instanceof ThrSheXian) { + final ThrSheXian thread = (ThrSheXian) source.dataList1.get(0); + for (final Vector3 targetPosition : thread.destroyed) { + final Block block = worldObj.getBlock(targetPosition.intX(), targetPosition.intY(), + targetPosition.intZ()); + if (block == Blocks.air) { + targetPosition.setBlock(worldObj, Blocks.air); + block.onBlockDestroyedByExplosion( + thread.world, targetPosition.intX(), targetPosition.intY(), + targetPosition.intZ(), (Explosion) null); + } + } + } + } catch (final Exception e) { + MainBase.LOGGER.severe("Detonation Failed!"); + e.printStackTrace(); + } + this.doDamageEntities(worldObj, position, 45.0f, 200000.0f); + worldObj.playSoundEffect( + position.x, position.y, position.z, "icbm.explosion", 10.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 0.7f); + ZhaPin.createExplosion(worldObj, position, explosionSource, + ZhaPin.decayLand.getID()); + ZhaPin.mutateLiving.doBaoZha(worldObj, position, null, 65, -1); + if (worldObj.rand.nextInt(3) == 0) { + worldObj.getWorldInfo().setRaining(!worldObj.getWorldInfo().isRaining()); + } + } + + @Override + public void onYinZha(final World worldObj, final Vector3 position, + final int fuseTicks) { + super.onYinZha(worldObj, position, fuseTicks); + if (fuseTicks % 25 == 0) { + worldObj.playSoundEffect((double) (int) position.x, (double) (int) position.y, + (double) (int) position.z, "icbm.alarm", 4.0f, + 1.0f); + } + } + + @Override + public void init() { + if (OreDictionary.getOres("ingotUranium").size() > 0) { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), + new Object[] { "UUU", "UEU", "UUU", 'E', + ZhaPin.thermobaric.getItemStack(), 'U', "ingotUranium" }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } else { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), new Object[] { "EEE", "EEE", "EEE", 'E', + ZhaPin.thermobaric.getItemStack() }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + } + + @Override + public float getRadius() { + return 45.0f; + } + + @Override + public double getEnergy() { + return 100000.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExPushPull.java b/src/main/java/icbm/zhapin/zhapin/ex/ExPushPull.java new file mode 100644 index 0000000..6ca6bf8 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExPushPull.java @@ -0,0 +1,187 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.core.MainBase; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.MathHelper; +import net.minecraft.world.ChunkPosition; +import net.minecraft.world.Explosion; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; +import universalelectricity.prefab.vector.Region3; + +public class ExPushPull extends ZhaPin { + public ExPushPull(final String name, final int ID, final int tier) { + super(name, ID, tier); + this.setFuse(120); + } + + @Override + public void doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource) { + final List blownBlocks = new ArrayList<>(); + if (!worldObj.isRemote) { + for (int x = 0; x < 16; ++x) { + for (int y = 0; y < 16; ++y) { + for (int z = 0; z < 16; ++z) { + if (x == 0 || x == 15 || y == 0 || y == 15 || z == 0 || z == 15) { + double xStep = x / 15.0f * 2.0f - 1.0f; + double yStep = y / 15.0f * 2.0f - 1.0f; + double zStep = z / 15.0f * 2.0f - 1.0f; + final double diagonalDistance = Math.sqrt(xStep * xStep + yStep * yStep + zStep * zStep); + xStep /= diagonalDistance; + yStep /= diagonalDistance; + zStep /= diagonalDistance; + float var14 = 2.0f * (0.7f + worldObj.rand.nextFloat() * 0.6f); + double var15 = position.x; + double var16 = position.y; + double var17 = position.z; + for (float var18 = 0.3f; var14 > 0.0f; var14 -= var18 * 0.75f) { + final int var19 = MathHelper.floor_double(var15); + final int var20 = MathHelper.floor_double(var16); + final int var21 = MathHelper.floor_double(var17); + final Block var22 = worldObj.getBlock(var19, var20, var21); + if (var22 != Blocks.air) { + var14 -= (var22.getExplosionResistance( + explosionSource, worldObj, var19, var20, var21, + (double) position.intX(), (double) position.intY(), + (double) position.intZ()) + + 0.3f) * + var18; + } + if (var14 > 0.0f) { + blownBlocks.add(new ChunkPosition(var19, var20, var21)); + } + var15 += xStep * var18; + var16 += yStep * var18; + var17 += zStep * var18; + } + } + } + } + } + } + worldObj.playSoundEffect( + position.x, position.y, position.z, "random.explode", 4.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 0.7f); + this.pushEntities(worldObj, position, 20.0f); + if (!worldObj.isRemote) { + for (int var23 = blownBlocks.size() - 1; var23 >= 0; --var23) { + final ChunkPosition var24 = blownBlocks.get(var23); + final int var25 = var24.chunkPosX; + final int var26 = var24.chunkPosY; + final int var27 = var24.chunkPosY; + final Block block = worldObj.getBlock(var25, var26, var27); + final double var28 = var25 + worldObj.rand.nextFloat(); + final double var29 = var26 + worldObj.rand.nextFloat(); + final double var30 = var27 + worldObj.rand.nextFloat(); + double var31 = var28 - position.y; + double var32 = var29 - position.y; + double var33 = var30 - position.z; + final double var34 = MathHelper.sqrt_double( + var31 * var31 + var32 * var32 + var33 * var33); + var31 /= var34; + var32 /= var34; + var33 /= var34; + double var35 = 0.5 / (var34 / 2.0 + 0.1); + var35 *= worldObj.rand.nextFloat() * worldObj.rand.nextFloat() + 0.3f; + var31 *= var35; + var32 *= var35; + var33 *= var35; + worldObj.spawnParticle("explode", (var28 + position.x * 1.0) / 2.0, + (var29 + position.y * 1.0) / 2.0, + (var30 + position.z * 1.0) / 2.0, var31, var32, + var33); + worldObj.spawnParticle("smoke", var28, var29, var30, var31, var32, + var33); + if (block == Blocks.air) { + block.onBlockDestroyedByExplosion(worldObj, var25, var26, var27, + (Explosion) null); + block.dropBlockAsItemWithChance( + worldObj, var25, var26, var27, + worldObj.getBlockMetadata(var25, var26, var27), 1.0f, 0); + worldObj.setBlock(var25, var26, var27, Blocks.air, 0, 2); + } + } + } + } + + public void pushEntities(final World worldObj, final Vector3 position, + final float radius) { + final Vector3 minCoord = position.clone(); + minCoord.add(-radius - 1.0f); + final Vector3 maxCoord = position.clone(); + maxCoord.add(radius + 1.0f); + final Region3 region = new Region3(minCoord, maxCoord); + final List entities = region.getEntities(worldObj, Entity.class); + for (final Entity entity : entities) { + final double var13 = entity.getDistance(position.x, position.y, position.z) / radius; + if (var13 <= 1.0) { + double xDifference = entity.posX - position.x; + double yDifference = entity.posY - position.y; + double zDifference = entity.posZ - position.z; + final double var14 = MathHelper.sqrt_double(xDifference * xDifference + + yDifference * yDifference + + zDifference * zDifference); + xDifference /= var14; + yDifference /= var14; + zDifference /= var14; + if (this.getID() == ZhaPin.attractive.getID()) { + final double modifier = var13 * 4.0; + final Entity entity2 = entity; + entity2.motionX -= xDifference * modifier; + final Entity entity3 = entity; + entity3.motionY -= yDifference * modifier; + final Entity entity4 = entity; + entity4.motionZ -= zDifference * modifier; + entity.isAirBorne = true; + } else { + final double modifier = (1.0 - var13) * 3.0; + final Entity entity5 = entity; + entity5.motionX += xDifference * modifier; + final Entity entity6 = entity; + entity6.motionY += yDifference * modifier; + final Entity entity7 = entity; + entity7.motionZ += zDifference * modifier; + entity.isAirBorne = true; + } + } + } + } + + @Override + public void init() { + if (this.getID() == ZhaPin.attractive.getID()) { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), + new Object[] { "YY", 'Y', ZhaPin.condensed.getItemStack() }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } else { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), + new Object[] { "Y", "Y", 'Y', ZhaPin.condensed.getItemStack() }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + } + + @Override + public float getRadius() { + return 16.0f; + } + + @Override + public double getEnergy() { + return 2000.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExRedMatter.java b/src/main/java/icbm/zhapin/zhapin/ex/ExRedMatter.java new file mode 100644 index 0000000..8c2f427 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExRedMatter.java @@ -0,0 +1,224 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.api.explosion.ExplosionEvent; +import icbm.api.explosion.IExplosiveIgnore; +import icbm.core.MainBase; +import icbm.zhapin.EGravityBlock; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.EExplosive; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.List; +import mffs.api.IForceFieldBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExRedMatter extends ZhaPin { + public ExRedMatter(final String name, final int ID, final int tier) { + super(name, ID, tier); + super.isMobile = true; + } + + @Override + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + if (!worldObj.isRemote) { + worldObj.createExplosion(explosionSource, position.x, position.y, + position.z, 5.0f, true); + } + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, + final int explosionMetadata, final int callCount) { + Label_0434: { + if (!worldObj.isRemote) { + int takenBlocks = 0; + for (int r = 1; r < this.getRadius(); ++r) { + for (int x = -r; x < r; ++x) { + for (int y = -r; y < r; ++y) { + for (int z = -r; z < r; ++z) { + final double dist = MathHelper.sqrt_double((double) (x * x + y * y + z * z)); + if (dist <= r) { + if (dist >= r - 2) { + final Vector3 currentPos = new Vector3( + position.x + x, position.y + y, position.z + z); + final Block block = worldObj.getBlock( + currentPos.intX(), currentPos.intY(), currentPos.intZ()); + if (block != null) { + if (block instanceof IForceFieldBlock) { + ((IForceFieldBlock) block) + .weakenForceField(worldObj, currentPos.intX(), + currentPos.intY(), + currentPos.intZ(), 50); + } else if (block.getBlockHardness( + worldObj, currentPos.intX(), + currentPos.intY(), + currentPos.intZ()) > -1.0f) { + final int metadata = worldObj.getBlockMetadata( + currentPos.intX(), currentPos.intY(), + currentPos.intZ()); + int notify = 2; + if (block instanceof BlockLiquid) { + notify = 0; + } + worldObj.setBlock(currentPos.intX(), currentPos.intY(), + currentPos.intZ(), Blocks.air, 0, + notify); + if (!(block instanceof BlockLiquid)) { + currentPos.add(0.5); + if (worldObj.rand.nextFloat() > 0.8) { + final EGravityBlock entity = new EGravityBlock( + worldObj, currentPos, block, metadata); + worldObj.spawnEntityInWorld((Entity) entity); + entity.yawChange = 50.0f * worldObj.rand.nextFloat(); + entity.pitchChange = 50.0f * worldObj.rand.nextFloat(); + } + if (++takenBlocks > 5) { + break Label_0434; + } + } + } + } + } + } + } + } + } + } + } + } + final float radius = this.getRadius() + this.getRadius() / 2.0f; + final AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox( + position.x - radius, position.y - radius, position.z - radius, + position.x + radius, position.y + radius, position.z + radius); + final List allEntities = worldObj.getEntitiesWithinAABB(Entity.class, bounds); + boolean explosionCreated = false; + for (final Entity entity2 : allEntities) { + if (entity2 == explosionSource) { + continue; + } + if (entity2 instanceof IExplosiveIgnore && + ((IExplosiveIgnore) entity2) + .canIgnore(new ExplosionEvent(worldObj, position.x, position.y, + position.z, this))) { + continue; + } + if (entity2 instanceof EntityPlayer && + ((EntityPlayer) entity2).capabilities.isCreativeMode) { + continue; + } + final double xDifference = entity2.posX - position.x; + final double yDifference = entity2.posY - position.y; + final double zDifference = entity2.posZ - position.z; + float r2 = radius; + if (xDifference < 0.0) { + r2 = (float) (int) (-radius); + } + final Entity entity3 = entity2; + entity3.motionX -= (r2 - xDifference) * 0.002; + r2 = radius; + if (yDifference < 0.0) { + r2 = (float) (int) (-radius); + } + final Entity entity4 = entity2; + entity4.motionY -= (r2 - yDifference) * 0.005; + r2 = radius; + if (zDifference < 0.0) { + r2 = -radius; + } + final Entity entity5 = entity2; + entity5.motionZ -= (r2 - zDifference) * 0.002; + if (entity2 instanceof EGravityBlock && worldObj.isRemote && + ICBMExplosion.proxy.getParticleSetting() == 0 && + worldObj.rand.nextInt(5) == 0) { + ICBMExplosion.proxy.spawnParticle( + "digging", worldObj, new Vector3(entity2), -xDifference, + -yDifference + 10.0, -zDifference, + (float) Block.getIdFromBlock(((EGravityBlock) entity2).block), 0.0f, + (float) ((EGravityBlock) entity2).metadata, 2.0f, 1.0); + } + if (Vector3.distance( + new Vector3(entity2.posX, entity2.posY, entity2.posZ), + position) >= 4.0) { + continue; + } + if (!explosionCreated && callCount % 5 == 0) { + worldObj.createExplosion(explosionSource, entity2.posX, entity2.posY, + entity2.posZ, 3.0f, true); + explosionCreated = true; + } + if (entity2 instanceof EntityLiving) { + entity2.fallDistance = 0.0f; + } else if (entity2 instanceof EExplosion) { + if (((EExplosion) entity2).haoMa != ZhaPin.antimatter.getID()) { + continue; + } + worldObj.playSoundEffect( + position.x, position.y, position.z, "icbm.explosion", 7.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 0.7f); + if (worldObj.rand.nextFloat() > 0.85 && !worldObj.isRemote) { + entity2.setDead(); + return false; + } + continue; + } else if (entity2 instanceof EExplosive) { + ((EExplosive) entity2).explode(); + } else { + entity2.setDead(); + } + } + if (worldObj.rand.nextInt(10) == 0) { + worldObj.playSoundEffect(position.x + (Math.random() - 0.5) * radius, + position.y + (Math.random() - 0.5) * radius, + position.z + (Math.random() - 0.5) * radius, + "icbm.collapse", + 6.0f - worldObj.rand.nextFloat(), + 1.0f - worldObj.rand.nextFloat() * 0.4f); + } + worldObj.playSoundEffect( + position.x, position.y, position.z, "icbm.redmatter", 3.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 1.0f); + return true; + } + + public int proceduralInterval() { + return 1; + } + + @Override + public void init() { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), new Object[] { "AAA", "AEA", "AAA", 'E', + ZhaPin.antimatter.getItemStack(), + 'A', "strangeMatter" }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + + @Override + public float getRadius() { + return 35.0f; + } + + @Override + public double getEnergy() { + return 4000.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExRejuvenation.java b/src/main/java/icbm/zhapin/zhapin/ex/ExRejuvenation.java new file mode 100644 index 0000000..86817e0 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExRejuvenation.java @@ -0,0 +1,91 @@ +package icbm.zhapin.zhapin.ex; + +import cpw.mods.fml.common.ObfuscationReflectionHelper; +import icbm.core.MainBase; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.ChunkProviderServer; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExRejuvenation extends ZhaPin { + public ExRejuvenation(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, + final int explosionMetadata, final int callCount) { + if (!worldObj.isRemote) { + try { + final Chunk oldChunk = worldObj.getChunkFromBlockCoords(position.intX(), position.intZ()); + if (worldObj instanceof WorldServer) { + final WorldServer worldServer = (WorldServer) worldObj; + final ChunkProviderServer chunkProviderServer = worldServer.theChunkProviderServer; + // TODO: WTF!! + final IChunkProvider chunkProviderGenerate = (IChunkProvider) ObfuscationReflectionHelper + .getPrivateValue( + (Class) ChunkProviderServer.class, (Object) chunkProviderServer, + new String[] { "currentChunkProvider", "d", "field_73246_d" }); + final Chunk newChunk = chunkProviderGenerate.provideChunk( + oldChunk.xPosition, oldChunk.zPosition); + for (int x = 0; x < 16; ++x) { + for (int z = 0; z < 16; ++z) { + for (int y = 0; y < worldObj.getHeight(); ++y) { + final Block block = newChunk.getBlock(x, y, z); + final int metadata = newChunk.getBlockMetadata(x, y, z); + worldServer.setBlock(x + oldChunk.xPosition * 16, y, + z + oldChunk.zPosition * 16, block, + metadata, 2); + final TileEntity tileEntity = newChunk.getTileEntityUnsafe(x, y, z); + if (tileEntity != null) { + worldServer.setTileEntity(x + oldChunk.xPosition * 16, y, + z + oldChunk.zPosition * 16, + tileEntity); + } + } + } + } + oldChunk.isTerrainPopulated = false; + chunkProviderGenerate.populate( + chunkProviderGenerate, oldChunk.xPosition, oldChunk.zPosition); + } + } catch (final Exception e) { + System.out.println("ICBM Rejuvenation Failed!"); + e.printStackTrace(); + } + } + return false; + } + + @Override + public void init() { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), + new Object[] { "ICI", "CDC", "ICI", 'D', Blocks.diamond_block, 'C', + Items.clock, 'I', Blocks.iron_block }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + + @Override + public float getRadius() { + return 16.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExSMine.java b/src/main/java/icbm/zhapin/zhapin/ex/ExSMine.java new file mode 100644 index 0000000..d8bdf48 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExSMine.java @@ -0,0 +1,119 @@ +package icbm.zhapin.zhapin.ex; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import icbm.core.MainBase; +import icbm.zhapin.ESuiPian; +import icbm.zhapin.muoxing.jiqi.MSMine; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.entity.Entity; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExSMine extends ZhaPin { + public ExSMine(final String name, final int ID, final int tier) { + super(name, ID, tier); + super.isMobile = true; + this.setFuse(40); + } + + @Override + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + if (!worldObj.isRemote) { + worldObj.createExplosion(explosionSource, position.x, position.y, + position.z, 1.5f, true); + } + explosionSource.motionX = -0.125 + 0.25 * worldObj.rand.nextFloat(); + explosionSource.motionY = 0.6 + 0.3 * worldObj.rand.nextFloat(); + explosionSource.motionZ = -0.125 + 0.25 * worldObj.rand.nextFloat(); + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, + final int explosionMetadata, final int callCount) { + explosionSource.motionY -= 0.03; + explosionSource.rotationPitch += 1.0f * worldObj.rand.nextFloat(); + if (callCount < 40 && !explosionSource.isCollided) { + return true; + } + if (callCount >= 40 && callCount % 2 == 0 && !worldObj.isRemote) { + final int amount = 5; + final float amountToRotate = (float) (360 / amount); + for (int i = 0; i < amount; ++i) { + final float rotationYaw = 0.0f + amountToRotate * i; + for (int ii = 0; ii < amount; ++ii) { + final ESuiPian arrow = new ESuiPian(worldObj, position.x, position.y, + position.z, true, false); + arrow.arrowCritical = true; + arrow.setFire(60); + final float rotationPitch = 0.0f + amountToRotate * ii; + arrow.setLocationAndAngles(position.x, position.y, position.z, + rotationYaw, rotationPitch); + final ESuiPian eSuiPian = arrow; + eSuiPian.posX -= MathHelper.cos(rotationYaw / 180.0f * 3.1415927f) * 0.16f; + final ESuiPian eSuiPian2 = arrow; + eSuiPian2.posY -= 0.10000000149011612; + final ESuiPian eSuiPian3 = arrow; + eSuiPian3.posZ -= MathHelper.sin(rotationYaw / 180.0f * 3.1415927f) * 0.16f; + arrow.setPosition(arrow.posX, arrow.posY, arrow.posZ); + arrow.yOffset = 0.0f; + arrow.motionX = -MathHelper.sin(rotationYaw / 180.0f * 3.1415927f) * + MathHelper.cos(rotationPitch / 180.0f * 3.1415927f); + arrow.motionZ = MathHelper.cos(rotationYaw / 180.0f * 3.1415927f) * + MathHelper.cos(rotationPitch / 180.0f * 3.1415927f); + arrow.motionY = -MathHelper.sin(rotationPitch / 180.0f * 3.1415927f); + arrow.setThrowableHeading(arrow.motionX * worldObj.rand.nextFloat(), + arrow.motionY * worldObj.rand.nextFloat(), + arrow.motionZ * worldObj.rand.nextFloat(), + 1.5f + 0.7f * worldObj.rand.nextFloat(), 2.0f); + worldObj.spawnEntityInWorld((Entity) arrow); + } + } + } + return callCount < 60; + } + + public int proceduralInterval() { + return 1; + } + + @Override + public void onYinZha(final World worldObj, final Vector3 position, + final int fuseTicks) { + } + + @Override + public void init() { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), + new Object[] { "S", "L", "R", 'S', ZhaPin.fragmentation.getItemStack(), 'L', + ZhaPin.attractive.getItemStack(), 'R', + ZhaPin.repulsive.getItemStack() }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + + @SideOnly(Side.CLIENT) + @Override + public Object[] getRenderData() { + return new Object[] { MSMine.INSTANCE, + new ResourceLocation("icbm", "textures/models/s-mine.png") }; + } + + @Override + public float getRadius() { + return 20.0f; + } + + @Override + public double getEnergy() { + return 2000.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExShrapnel.java b/src/main/java/icbm/zhapin/zhapin/ex/ExShrapnel.java new file mode 100644 index 0000000..6c21483 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExShrapnel.java @@ -0,0 +1,110 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.core.MainBase; +import icbm.zhapin.ESuiPian; +import icbm.zhapin.zhapin.EGrenade; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExShrapnel extends ZhaPin { + public ExShrapnel(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, final int metadata, + final int callCount) { + if (!worldObj.isRemote) { + int amount = 30; + if (this.getTier() == 2) { + amount = 15; + } else if (this.getID() == ZhaPin.anvil.getID()) { + amount = 25; + } + if (explosionSource instanceof EGrenade) { + amount /= 2; + position.y += 0.5; + } + final float amountToRotate = (float) (360 / amount); + for (int i = 0; i < amount; ++i) { + final float rotationYaw = 0.0f + amountToRotate * i; + for (int ii = 0; ii < amount; ++ii) { + final ESuiPian arrow = new ESuiPian( + worldObj, position.x, position.y, position.z, this.getTier() == 2, + this.getID() == ZhaPin.anvil.getID()); + if (this.getID() != ZhaPin.anvil.getID()) { + arrow.arrowCritical = true; + arrow.setFire(100); + } + final float rotationPitch = 0.0f + amountToRotate * ii; + arrow.setLocationAndAngles(position.x, position.y, position.z, + rotationYaw, rotationPitch); + final ESuiPian eSuiPian = arrow; + eSuiPian.posX -= MathHelper.cos(rotationYaw / 180.0f * 3.1415927f) * 0.16f; + final ESuiPian eSuiPian2 = arrow; + eSuiPian2.posY -= 0.10000000149011612; + final ESuiPian eSuiPian3 = arrow; + eSuiPian3.posZ -= MathHelper.sin(rotationYaw / 180.0f * 3.1415927f) * 0.16f; + arrow.setPosition(arrow.posX, arrow.posY, arrow.posZ); + arrow.yOffset = 0.0f; + arrow.motionX = -MathHelper.sin(rotationYaw / 180.0f * 3.1415927f) * + MathHelper.cos(rotationPitch / 180.0f * 3.1415927f); + arrow.motionZ = MathHelper.cos(rotationYaw / 180.0f * 3.1415927f) * + MathHelper.cos(rotationPitch / 180.0f * 3.1415927f); + arrow.motionY = -MathHelper.sin(rotationPitch / 180.0f * 3.1415927f); + arrow.setThrowableHeading(arrow.motionX * worldObj.rand.nextFloat(), + arrow.motionY * worldObj.rand.nextFloat(), + arrow.motionZ * worldObj.rand.nextFloat(), + 0.5f + 0.7f * worldObj.rand.nextFloat(), 1.0f); + worldObj.spawnEntityInWorld((Entity) arrow); + } + } + } + return false; + } + + @Override + public void init() { + if (this.getID() == ZhaPin.shrapnel.getID()) { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe(this.getItemStack(), + new Object[] { "???", "?@?", "???", '@', + ZhaPin.repulsive.getItemStack(), + '?', Items.arrow }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } else if (this.getID() == ZhaPin.anvil.getID()) { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(10), + new Object[] { "SSS", "SAS", "SSS", 'A', Blocks.anvil, 'S', + ZhaPin.shrapnel.getItemStack() }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } else if (this.getID() == ZhaPin.fragmentation.getID()) { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), + new Object[] { " @ ", "@?@", " @ ", '?', ZhaPin.indenciary.getItemStack(), + '@', ZhaPin.shrapnel.getItemStack() }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + } + + @Override + public float getRadius() { + return 20.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExSonic.java b/src/main/java/icbm/zhapin/zhapin/ex/ExSonic.java new file mode 100644 index 0000000..7dff618 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExSonic.java @@ -0,0 +1,201 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.core.MainBase; +import icbm.zhapin.EGravityBlock; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.daodan.EMissile; +import icbm.zhapin.zhapin.BExplosives; +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.TExplosive; +import icbm.zhapin.zhapin.ZhaPin; +import java.util.List; +import mffs.api.IForceFieldBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExSonic extends ZhaPin { + public ExSonic(final String name, final int ID, final int tier) { + super(name, ID, tier); + } + + @Override + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + if (!worldObj.isRemote) { + final EExplosion source = (EExplosion) explosionSource; + for (int x = 0; x < this.getRadius(); ++x) { + for (int y = 0; y < this.getRadius(); ++y) { + for (int z = 0; z < this.getRadius(); ++z) { + if (x == 0 || x == this.getRadius() - 1.0f || y == 0 || + y == this.getRadius() - 1.0f || z == 0 || + z == this.getRadius() - 1.0f) { + double xStep = x / (this.getRadius() - 1.0f) * 2.0f - 1.0f; + double yStep = y / (this.getRadius() - 1.0f) * 2.0f - 1.0f; + double zStep = z / (this.getRadius() - 1.0f) * 2.0f - 1.0f; + final double diagonalDistance = Math.sqrt(xStep * xStep + yStep * yStep + zStep * zStep); + xStep /= diagonalDistance; + yStep /= diagonalDistance; + zStep /= diagonalDistance; + float power = 40.0f * (0.7f + worldObj.rand.nextFloat() * 0.6f); + double var15 = position.x; + double var16 = position.y; + double var17 = position.z; + for (float var18 = 0.3f; power > 0.0f; power -= var18 * 0.75f) { + final Vector3 targetPosition = new Vector3(var15, var16, var17); + final Block block = worldObj.getBlock(targetPosition.intX(), + targetPosition.intY(), + targetPosition.intZ()); + if (block != Blocks.air) { + float resistance = 0.0f; + if (block == Blocks.bedrock) { + break; + } + if (block instanceof BlockLiquid) { + resistance = 2.0f; + } else { + resistance = (block.getExplosionResistance( + explosionSource, worldObj, targetPosition.intX(), + targetPosition.intY(), targetPosition.intZ(), + (double) position.intX(), (double) position.intY(), + (double) position.intZ()) + + 0.3f) * + var18; + } + power -= resistance; + } + if (power > 0.0f) { + source.dataList1.add(targetPosition.clone()); + } + var15 += xStep * var18; + var16 += yStep * var18; + var17 += zStep * var18; + } + } + } + } + } + } + worldObj.playSoundEffect( + position.x, position.y, position.z, "icbm.sonicwave", 4.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 0.7f); + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, + final int explosionMetadata, final int callCount) { + final EExplosion source = (EExplosion) explosionSource; + int r = callCount; + if (!worldObj.isRemote) { + for (final Object obj : source.dataList1) { + final Vector3 targetPosition = (Vector3) obj; + final double distance = Vector3.distance(targetPosition, position); + if (distance <= r) { + if (distance < r - 3) { + continue; + } + final Block block = worldObj.getBlock(targetPosition.intX(), targetPosition.intY(), + targetPosition.intZ()); + if (block == Blocks.air || block == Blocks.bedrock) { + continue; + } + if (block == Blocks.obsidian) { + continue; + } + if (block instanceof IForceFieldBlock) { + continue; + } + final int metadata = worldObj.getBlockMetadata(targetPosition.intX(), + targetPosition.intY(), + targetPosition.intZ()); + if (distance >= r - 1 && worldObj.rand.nextInt(3) <= 0) { + continue; + } + if (block == ICBMExplosion.bExplosives) { + BExplosives.yinZha(worldObj, targetPosition.intX(), + targetPosition.intY(), targetPosition.intZ(), + ((TExplosive) worldObj.getTileEntity( + targetPosition.intX(), targetPosition.intY(), + targetPosition.intZ())).explosiveId, + 1); + } else { + worldObj.setBlock(targetPosition.intX(), targetPosition.intY(), + targetPosition.intZ(), Blocks.air, 0, 2); + } + targetPosition.add(0.5); + if (worldObj.rand.nextFloat() >= 0.3 * (this.getRadius() - r)) { + continue; + } + final EGravityBlock entity = new EGravityBlock(worldObj, targetPosition, block, metadata); + worldObj.spawnEntityInWorld((Entity) entity); + entity.yawChange = 50.0f * worldObj.rand.nextFloat(); + entity.pitchChange = 100.0f * worldObj.rand.nextFloat(); + } + } + } + final int radius = 2 * callCount; + final AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox( + position.x - radius, position.y - radius, position.z - radius, + position.x + radius, position.y + radius, position.z + radius); + final List allEntities = worldObj.getEntitiesWithinAABB(Entity.class, bounds); + synchronized (allEntities) { + for (final Entity entity2 : allEntities) { + if (entity2 instanceof EMissile) { + ((EMissile) entity2).setExplode(); + break; + } + final double xDifference = entity2.posX - position.x; + final double zDifference = entity2.posZ - position.z; + r = (int) this.getRadius(); + if (xDifference < 0.0) { + r = (int) (-this.getRadius()); + } + final Entity entity3 = entity2; + entity3.motionX += (r - xDifference) * 0.02 * worldObj.rand.nextFloat(); + final Entity entity4 = entity2; + entity4.motionY += 3.0f * worldObj.rand.nextFloat(); + r = (int) this.getRadius(); + if (zDifference < 0.0) { + r = (int) (-this.getRadius()); + } + final Entity entity5 = entity2; + entity5.motionZ += (r - zDifference) * 0.02 * worldObj.rand.nextFloat(); + } + } + return callCount <= this.getRadius(); + } + + public int proceduralInterval() { + return 4; + } + + @Override + public void init() { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), + new Object[] { "@?@", "?R?", "@?@", 'R', ZhaPin.repulsive.getItemStack(), + '?', Blocks.noteblock, '@', "ingotBronze" }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + + @Override + public float getRadius() { + return 8.0f; + } + + @Override + public double getEnergy() { + return 0.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExThermobaric.java b/src/main/java/icbm/zhapin/zhapin/ex/ExThermobaric.java new file mode 100644 index 0000000..5181c2f --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExThermobaric.java @@ -0,0 +1,124 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.core.MainBase; +import icbm.zhapin.ICBMExplosion; +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.MathHelper; +import net.minecraft.world.Explosion; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.RecipeHelper; + +public class ExThermobaric extends ExThr { + public static final int BAN_JING = 20; + public static final int NENG_LIANG = 150; + public static final int CALC_SPEED = 800; + + public ExThermobaric(final String name, final int ID, final int tier) { + super(name, ID, tier); + this.setFuse(120); + } + + @Override + public void baoZhaQian(final World worldObj, final Vector3 position, + final Entity explosionSource) { + super.baoZhaQian(worldObj, position, explosionSource); + if (!worldObj.isRemote) { + final ThrSheXian thread = new ThrSheXian(worldObj, position, 20, 150, explosionSource); + thread.run(); + ((EExplosion) explosionSource).dataList1.add(thread); + } + this.doDamageEntities(worldObj, position, 20.0f, 150000.0f); + worldObj.playSoundEffect( + position.x, position.y, position.z, "icbm.explosion", 7.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 0.7f); + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, final int callCount) { + final int r = callCount; + if (worldObj.isRemote && ICBMExplosion.proxy.isGaoQing()) { + for (int x = -r; x < r; ++x) { + for (int z = -r; z < r; ++z) { + final double distance = MathHelper.sqrt_double((double) (x * x + z * z)); + if (distance < r && distance > r - 1) { + final Vector3 targetPosition = Vector3.add(position, new Vector3(x, 0.0, z)); + if (worldObj.rand.nextFloat() < Math.max(0.001 * r, 0.05)) { + ICBMExplosion.proxy.spawnParticle("smoke", worldObj, + targetPosition, 5.0f, 1.0); + } + } + } + } + } + return super.doBaoZha(worldObj, position, explosionSource, callCount); + } + + @Override + public void baoZhaHou(final World worldObj, final Vector3 position, + final Entity explosionSource) { + super.baoZhaHou(worldObj, position, explosionSource); + final EExplosion source = (EExplosion) explosionSource; + if (!worldObj.isRemote && source.dataList1.size() > 0 && + source.dataList1.get(0) instanceof ThrSheXian) { + final ThrSheXian thread = (ThrSheXian) source.dataList1.get(0); + for (final Object obj : thread.destroyed) { + final Vector3 targetPosition = (Vector3) obj; + final Block block = worldObj.getBlock(targetPosition.intX(), targetPosition.intY(), + targetPosition.intZ()); + if (block == Blocks.air) { + try { + worldObj.setBlock(targetPosition.intX(), targetPosition.intY(), + targetPosition.intZ(), Blocks.air, 0, 3); + block.onBlockDestroyedByExplosion( + worldObj, targetPosition.intX(), targetPosition.intY(), + targetPosition.intZ(), (Explosion) null); + } catch (final Exception e) { + MainBase.LOGGER.severe("Detonation Failed!"); + e.printStackTrace(); + } + } + } + } + this.doDamageEntities(worldObj, position, 20.0f, 150000.0f); + worldObj.playSoundEffect( + position.x, position.y, position.z, "icbm.explosion", 10.0f, + (1.0f + + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * + 0.7f); + } + + public int proceduralInterval() { + return 1; + } + + @Override + public void init() { + RecipeHelper.addRecipe( + (IRecipe) new ShapedOreRecipe( + this.getItemStack(), + new Object[] { "CIC", "IRI", "CIC", 'R', ZhaPin.repulsive.getItemStack(), + 'C', ZhaPin.chemical.getItemStack(), 'I', + ZhaPin.indenciary.getItemStack() }), + this.getUnlocalizedName(), MainBase.CONFIGURATION, true); + } + + @Override + public float getRadius() { + return 20.0f; + } + + @Override + public double getEnergy() { + return 80000.0; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ExThr.java b/src/main/java/icbm/zhapin/zhapin/ex/ExThr.java new file mode 100644 index 0000000..a46bd6e --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ExThr.java @@ -0,0 +1,32 @@ +package icbm.zhapin.zhapin.ex; + +import icbm.zhapin.zhapin.EExplosion; +import icbm.zhapin.zhapin.ZhaPin; +import net.minecraft.entity.Entity; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public abstract class ExThr extends ZhaPin { + protected ExThr(final String mingZi, final int ID, final int tier) { + super(mingZi, ID, tier); + } + + @Override + public boolean doBaoZha(final World worldObj, final Vector3 position, + final Entity explosionSource, final int callCount) { + final EExplosion source = (EExplosion) explosionSource; + if (!worldObj.isRemote && source.dataList1.size() > 0 && + source.dataList1.get(0) instanceof ThrSheXian) { + final ThrSheXian thread = (ThrSheXian) source.dataList1.get(0); + if (thread.isComplete) { + return false; + } + } + return true; + } + + @Override + protected int proceduralInterval() { + return 1; + } +} diff --git a/src/main/java/icbm/zhapin/zhapin/ex/ThrSheXian.java b/src/main/java/icbm/zhapin/zhapin/ex/ThrSheXian.java new file mode 100644 index 0000000..c938477 --- /dev/null +++ b/src/main/java/icbm/zhapin/zhapin/ex/ThrSheXian.java @@ -0,0 +1,84 @@ +package icbm.zhapin.zhapin.ex; + +import java.util.HashSet; +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class ThrSheXian extends Thread { + public World world; + public Vector3 position; + public int radius; + public int energyStored; + public Entity source; + public boolean isComplete; + public final HashSet destroyed; + + public ThrSheXian(final World world, final Vector3 position, + final int banJing, final int nengLiang, + final Entity source) { + this.isComplete = false; + this.destroyed = new HashSet<>(); + this.world = world; + this.position = position; + this.radius = banJing; + this.energyStored = nengLiang; + this.source = source; + this.setPriority(4); + } + + @Override + public void run() { + for (int steps = (int) Math.ceil(3.141592653589793 / + Math.atan(1.0 / this.radius)), + phi_n = 0; phi_n < 2 * steps; ++phi_n) { + for (int theta_n = 0; theta_n < steps; ++theta_n) { + final double phi = 6.283185307179586 / steps * phi_n; + final double theta = 3.141592653589793 / steps * theta_n; + final Vector3 delta = new Vector3(Math.sin(theta) * Math.cos(phi), Math.cos(theta), + Math.sin(theta) * Math.sin(phi)); + float power = this.energyStored - + this.energyStored * this.world.rand.nextFloat() / 2.0f; + final Vector3 targetPosition = this.position.clone(); + for (float var21 = 0.3f; power > 0.0f; power -= var21 * 0.75f * 10.0f) { + if (targetPosition.distanceTo(this.position) > this.radius) { + break; + } + final Block block = this.world.getBlock(targetPosition.intX(), targetPosition.intY(), + targetPosition.intZ()); + if (block == Blocks.air) { + float resistance = 0.0f; + if (block == Blocks.bedrock) { + break; + } + if (block instanceof BlockLiquid) { + resistance = 1.0f; + } else { + resistance = block.getExplosionResistance( + this.source, this.world, targetPosition.intX(), + targetPosition.intY(), targetPosition.intZ(), + (double) this.position.intX(), + (double) this.position.intY(), + (double) this.position.intZ()) * + 4.0f; + } + power -= resistance; + if (power > 0.0f && !this.destroyed.contains(targetPosition)) { + this.destroyed.add(targetPosition.clone()); + } + } + final Vector3 vector3 = targetPosition; + vector3.x += delta.x; + final Vector3 vector4 = targetPosition; + vector4.y += delta.y; + final Vector3 vector5 = targetPosition; + vector5.z += delta.z; + } + } + } + this.isComplete = true; + } +} diff --git a/src/main/java/mffs/api/Blacklist.java b/src/main/java/mffs/api/Blacklist.java new file mode 100644 index 0000000..01e2033 --- /dev/null +++ b/src/main/java/mffs/api/Blacklist.java @@ -0,0 +1,19 @@ +package mffs.api; + +import java.util.HashSet; +import java.util.Set; + +import net.minecraft.block.Block; + +public class Blacklist +{ + public static final Set stabilizationBlacklist; + public static final Set disintegrationBlacklist; + public static final Set forceManipulationBlacklist; + + static { + stabilizationBlacklist = new HashSet<>(); + disintegrationBlacklist = new HashSet<>(); + forceManipulationBlacklist = new HashSet<>(); + } +} diff --git a/src/main/java/mffs/api/IActivatable.java b/src/main/java/mffs/api/IActivatable.java new file mode 100644 index 0000000..c5e4068 --- /dev/null +++ b/src/main/java/mffs/api/IActivatable.java @@ -0,0 +1,8 @@ +package mffs.api; + +public interface IActivatable +{ + boolean isActive(); + + void setActive(final boolean p0); +} diff --git a/src/main/java/mffs/api/IBiometricIdentifierLink.java b/src/main/java/mffs/api/IBiometricIdentifierLink.java new file mode 100644 index 0000000..884e934 --- /dev/null +++ b/src/main/java/mffs/api/IBiometricIdentifierLink.java @@ -0,0 +1,11 @@ +package mffs.api; + +import java.util.Set; +import mffs.api.security.IBiometricIdentifier; + +public interface IBiometricIdentifierLink +{ + IBiometricIdentifier getBiometricIdentifier(); + + Set getBiometricIdentifiers(); +} diff --git a/src/main/java/mffs/api/ICache.java b/src/main/java/mffs/api/ICache.java new file mode 100644 index 0000000..06a06d5 --- /dev/null +++ b/src/main/java/mffs/api/ICache.java @@ -0,0 +1,10 @@ +package mffs.api; + +public interface ICache +{ + Object getCache(final String p0); + + void clearCache(final String p0); + + void clearCache(); +} diff --git a/src/main/java/mffs/api/IFieldInteraction.java b/src/main/java/mffs/api/IFieldInteraction.java new file mode 100644 index 0000000..e6c92a4 --- /dev/null +++ b/src/main/java/mffs/api/IFieldInteraction.java @@ -0,0 +1,41 @@ +package mffs.api; + +import java.util.Set; +import universalelectricity.core.vector.Vector3; +import mffs.api.modules.IModule; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import mffs.api.modules.IProjectorMode; +import universalelectricity.prefab.implement.IRotatable; +import mffs.api.modules.IModuleAcceptor; + +public interface IFieldInteraction extends IModuleAcceptor, IRotatable, IActivatable +{ + IProjectorMode getMode(); + + ItemStack getModeStack(); + + int[] getSlotsBasedOnDirection(final ForgeDirection p0); + + int[] getModuleSlots(); + + int getSidedModuleCount(final IModule p0, final ForgeDirection... p1); + + Vector3 getTranslation(); + + Vector3 getPositiveScale(); + + Vector3 getNegativeScale(); + + int getRotationYaw(); + + int getRotationPitch(); + + Set getCalculatedField(); + + Set getInteriorPoints(); + + void setCalculating(final boolean p0); + + void setCalculated(final boolean p0); +} diff --git a/src/main/java/mffs/api/IForceFieldBlock.java b/src/main/java/mffs/api/IForceFieldBlock.java new file mode 100644 index 0000000..d6965fa --- /dev/null +++ b/src/main/java/mffs/api/IForceFieldBlock.java @@ -0,0 +1,11 @@ +package mffs.api; + +import net.minecraft.world.World; +import net.minecraft.world.IBlockAccess; + +public interface IForceFieldBlock +{ + IProjector getProjector(final IBlockAccess p0, final int p1, final int p2, final int p3); + + void weakenForceField(final World p0, final int p1, final int p2, final int p3, final int p4); +} diff --git a/src/main/java/mffs/api/IProjector.java b/src/main/java/mffs/api/IProjector.java new file mode 100644 index 0000000..0199e80 --- /dev/null +++ b/src/main/java/mffs/api/IProjector.java @@ -0,0 +1,14 @@ +package mffs.api; + +import net.minecraft.inventory.IInventory; + +public interface IProjector extends IInventory, IBiometricIdentifierLink, IFieldInteraction +{ + void projectField(); + + void destroyField(); + + int getProjectionSpeed(); + + long getTicks(); +} diff --git a/src/main/java/mffs/api/ISpecialForceManipulation.java b/src/main/java/mffs/api/ISpecialForceManipulation.java new file mode 100644 index 0000000..3210b48 --- /dev/null +++ b/src/main/java/mffs/api/ISpecialForceManipulation.java @@ -0,0 +1,10 @@ +package mffs.api; + +public interface ISpecialForceManipulation +{ + boolean preMove(final int p0, final int p1, final int p2); + + void move(final int p0, final int p1, final int p2); + + void postMove(); +} diff --git a/src/main/java/mffs/api/card/ICard.java b/src/main/java/mffs/api/card/ICard.java new file mode 100644 index 0000000..4c47839 --- /dev/null +++ b/src/main/java/mffs/api/card/ICard.java @@ -0,0 +1,5 @@ +package mffs.api.card; + +public interface ICard +{ +} diff --git a/src/main/java/mffs/api/card/ICardIdentification.java b/src/main/java/mffs/api/card/ICardIdentification.java new file mode 100644 index 0000000..06c8d87 --- /dev/null +++ b/src/main/java/mffs/api/card/ICardIdentification.java @@ -0,0 +1,17 @@ +package mffs.api.card; + +import mffs.api.security.Permission; +import net.minecraft.item.ItemStack; + +public interface ICardIdentification extends ICard +{ + boolean hasPermission(final ItemStack p0, final Permission p1); + + boolean addPermission(final ItemStack p0, final Permission p1); + + boolean removePermission(final ItemStack p0, final Permission p1); + + String getUsername(final ItemStack p0); + + void setUsername(final ItemStack p0, final String p1); +} diff --git a/src/main/java/mffs/api/card/ICardInfinite.java b/src/main/java/mffs/api/card/ICardInfinite.java new file mode 100644 index 0000000..4f35a5a --- /dev/null +++ b/src/main/java/mffs/api/card/ICardInfinite.java @@ -0,0 +1,5 @@ +package mffs.api.card; + +public interface ICardInfinite +{ +} diff --git a/src/main/java/mffs/api/card/ICardLink.java b/src/main/java/mffs/api/card/ICardLink.java new file mode 100644 index 0000000..460c031 --- /dev/null +++ b/src/main/java/mffs/api/card/ICardLink.java @@ -0,0 +1,11 @@ +package mffs.api.card; + +import universalelectricity.core.vector.Vector3; +import net.minecraft.item.ItemStack; + +public interface ICardLink +{ + void setLink(final ItemStack p0, final Vector3 p1); + + Vector3 getLink(final ItemStack p0); +} diff --git a/src/main/java/mffs/api/fortron/IFortronCapacitor.java b/src/main/java/mffs/api/fortron/IFortronCapacitor.java new file mode 100644 index 0000000..65d7874 --- /dev/null +++ b/src/main/java/mffs/api/fortron/IFortronCapacitor.java @@ -0,0 +1,12 @@ +package mffs.api.fortron; + +import java.util.Set; + +public interface IFortronCapacitor +{ + Set getLinkedDevices(); + + int getTransmissionRange(); + + int getTransmissionRate(); +} diff --git a/src/main/java/mffs/api/fortron/IFortronFrequency.java b/src/main/java/mffs/api/fortron/IFortronFrequency.java new file mode 100644 index 0000000..1e4f9b4 --- /dev/null +++ b/src/main/java/mffs/api/fortron/IFortronFrequency.java @@ -0,0 +1,7 @@ +package mffs.api.fortron; + +import icbm.api.IBlockFrequency; + +public interface IFortronFrequency extends IFortronStorage, IBlockFrequency +{ +} diff --git a/src/main/java/mffs/api/fortron/IFortronStorage.java b/src/main/java/mffs/api/fortron/IFortronStorage.java new file mode 100644 index 0000000..fd7424f --- /dev/null +++ b/src/main/java/mffs/api/fortron/IFortronStorage.java @@ -0,0 +1,14 @@ +package mffs.api.fortron; + +public interface IFortronStorage +{ + void setFortronEnergy(final int p0); + + int getFortronEnergy(); + + int getFortronCapacity(); + + int requestFortron(final int p0, final boolean p1); + + int provideFortron(final int p0, final boolean p1); +} diff --git a/src/main/java/mffs/api/modules/IInterdictionMatrixModule.java b/src/main/java/mffs/api/modules/IInterdictionMatrixModule.java new file mode 100644 index 0000000..9916f8c --- /dev/null +++ b/src/main/java/mffs/api/modules/IInterdictionMatrixModule.java @@ -0,0 +1,9 @@ +package mffs.api.modules; + +import mffs.api.security.IInterdictionMatrix; +import net.minecraft.entity.EntityLivingBase; + +public interface IInterdictionMatrixModule extends IModule +{ + boolean onDefend(final IInterdictionMatrix p0, final EntityLivingBase p1); +} diff --git a/src/main/java/mffs/api/modules/IModule.java b/src/main/java/mffs/api/modules/IModule.java new file mode 100644 index 0000000..f01ab79 --- /dev/null +++ b/src/main/java/mffs/api/modules/IModule.java @@ -0,0 +1,22 @@ +package mffs.api.modules; + +import mffs.api.IFieldInteraction; +import net.minecraft.item.ItemStack; +import net.minecraft.entity.Entity; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; +import java.util.Set; +import mffs.api.IProjector; + +public interface IModule +{ + float getFortronCost(final float p0); + + boolean onProject(final IProjector p0, final Set fieldBlocks); + + int onProject(final IProjector p0, final Vector3 p1); + + boolean onCollideWithForceField(final World p0, final int p1, final int p2, final int p3, final Entity p4, final ItemStack p5); + + void onCalculate(final IFieldInteraction p0, final Set fieldBlocks); +} diff --git a/src/main/java/mffs/api/modules/IModuleAcceptor.java b/src/main/java/mffs/api/modules/IModuleAcceptor.java new file mode 100644 index 0000000..352b8e3 --- /dev/null +++ b/src/main/java/mffs/api/modules/IModuleAcceptor.java @@ -0,0 +1,17 @@ +package mffs.api.modules; + +import java.util.Set; +import net.minecraft.item.ItemStack; + +public interface IModuleAcceptor +{ + ItemStack getModule(final IModule p0); + + int getModuleCount(final IModule p0, final int... p1); + + Set getModuleStacks(final int... p0); + + Set getModules(final int... p0); + + int getFortronCost(); +} diff --git a/src/main/java/mffs/api/modules/IProjectorMode.java b/src/main/java/mffs/api/modules/IProjectorMode.java new file mode 100644 index 0000000..3ed4ec1 --- /dev/null +++ b/src/main/java/mffs/api/modules/IProjectorMode.java @@ -0,0 +1,17 @@ +package mffs.api.modules; + +import java.util.Set; +import mffs.api.IFieldInteraction; +import mffs.api.IProjector; +import universalelectricity.core.vector.Vector3; + +public interface IProjectorMode { + Set getExteriorPoints(final IFieldInteraction p0); + + Set getInteriorPoints(final IFieldInteraction p0); + + boolean isInField(final IFieldInteraction p0, final Vector3 p1); + + void render(final IProjector p0, final double p1, final double p2, + final double p3, final float p4, final long p5); +} diff --git a/src/main/java/mffs/api/security/IBiometricIdentifier.java b/src/main/java/mffs/api/security/IBiometricIdentifier.java new file mode 100644 index 0000000..eaa760b --- /dev/null +++ b/src/main/java/mffs/api/security/IBiometricIdentifier.java @@ -0,0 +1,12 @@ +package mffs.api.security; + +import net.minecraft.item.ItemStack; + +public interface IBiometricIdentifier +{ + boolean isAccessGranted(final String p0, final Permission p1); + + String getOwner(); + + ItemStack getManipulatingCard(); +} diff --git a/src/main/java/mffs/api/security/IInterdictionMatrix.java b/src/main/java/mffs/api/security/IInterdictionMatrix.java new file mode 100644 index 0000000..4c1aebb --- /dev/null +++ b/src/main/java/mffs/api/security/IInterdictionMatrix.java @@ -0,0 +1,24 @@ +package mffs.api.security; + +import java.util.Set; +import net.minecraft.item.ItemStack; +import mffs.api.IActivatable; +import mffs.api.IBiometricIdentifierLink; +import mffs.api.modules.IModuleAcceptor; +import mffs.api.fortron.IFortronFrequency; +import net.minecraft.inventory.IInventory; + +public interface IInterdictionMatrix extends IInventory, IFortronFrequency, IModuleAcceptor, IBiometricIdentifierLink, IActivatable +{ + int getWarningRange(); + + int getActionRange(); + + boolean mergeIntoInventory(final ItemStack p0); + + Set getFilteredItems(); + + boolean getFilterMode(); + + int getFortronCost(); +} diff --git a/src/main/java/mffs/api/security/Permission.java b/src/main/java/mffs/api/security/Permission.java new file mode 100644 index 0000000..03ea1f1 --- /dev/null +++ b/src/main/java/mffs/api/security/Permission.java @@ -0,0 +1,45 @@ +package mffs.api.security; + +public class Permission +{ + public static final Permission FORCE_FIELD_WARP; + public static final Permission BLOCK_ALTER; + public static final Permission BLOCK_ACCESS; + public static final Permission SECURITY_CENTER_CONFIGURE; + public static final Permission BYPASS_INTERDICTION_MATRIX; + public static final Permission DEFENSE_STATION_CONFISCATION; + public static final Permission REMOTE_CONTROL; + private static Permission[] LIST; + public final int id; + public final String name; + + public Permission(final int id, final String name) { + this.id = id; + this.name = name; + if (Permission.LIST == null) { + Permission.LIST = new Permission[7]; + } + Permission.LIST[this.id] = this; + } + + public static Permission getPermission(final int id) { + if (id < Permission.LIST.length && id >= 0) { + return Permission.LIST[id]; + } + return null; + } + + public static Permission[] getPermissions() { + return Permission.LIST; + } + + static { + FORCE_FIELD_WARP = new Permission(0, "warp"); + BLOCK_ALTER = new Permission(1, "blockPlaceAccess"); + BLOCK_ACCESS = new Permission(2, "blockAccess"); + SECURITY_CENTER_CONFIGURE = new Permission(3, "configure"); + BYPASS_INTERDICTION_MATRIX = new Permission(4, "bypassDefense"); + DEFENSE_STATION_CONFISCATION = new Permission(5, "bypassConfiscation"); + REMOTE_CONTROL = new Permission(6, "remoteControl"); + } +} diff --git a/src/main/resources/assets/icbm/lang/de_DE.lang b/src/main/resources/assets/icbm/lang/de_DE.lang new file mode 100644 index 0000000..9baee37 --- /dev/null +++ b/src/main/resources/assets/icbm/lang/de_DE.lang @@ -0,0 +1,132 @@ + +itemGroup.ICBM=ICBM + +## Items +item.sulfur.name=Schwefel +item.poisonPowder.name=Gift Pulver +item.antidote.name=Gegengift +item.radarGun.name=Radar Pistole +item.remoteDetonator.name=Fernzünder +item.defuser.name=Entschärfer +item.laserDesignator.name=Laser Ziel Erfasser +item.tracker.name=Verfolger +item.signalDisrupter.name=Signal Störer + +item.bullet.0.name=Stanard Geschoss +item.bullet.1.name=Antimatierie Geschoss +item.launcher.name=Raketen Werfer + +## ICBM Machines +icbm.machine.0.name=Startplatform T1 +icbm.machine.1.name=Startplatform T2 +icbm.machine.2.name=Startplatform T3 +icbm.machine.3.name=Start Kontroll Tafel T1 +icbm.machine.4.name=Start Kontroll Tafel T2 +icbm.machine.5.name=Start Konttoll Tafel T3 +icbm.machine.6.name=Startplatform Verstärker T1 +icbm.machine.7.name=Startplatform Verstärker T2 +icbm.machine.8.name=Startplatform Verstärker T3 +icbm.machine.9.name=Radar Station +icbm.machine.10.name=EMP Turm +icbm.machine.11.name=Langstrecken Starter +icbm.machine.12.name=Raketen Koordinator + +## ICBM Explosives + +## Block Form +icbm.explosive.condensed.name=Gepresster Sprengstoff +icbm.explosive.shrapnel.name=Schrapnell Sprengstoff +icbm.explosive.incendiary.name=Entflammbarer Sprengstoff +icbm.explosive.chemical.name=Chemischer Sprengstoff +icbm.explosive.anvil.name=Amboss Sprengstoff +icbm.explosive.repulsive.name=Abstoßender Sprengstoff +icbm.explosive.attractive.name=Anziehener Sprengstoff + +icbm.explosive.fragmentation.name=Splitter Sprengstoff +icbm.explosive.contagious.name=Ansteckender Sprengstoff +icbm.explosive.sonic.name=Schall Sprengstoff +icbm.explosive.breaching.name=Durchschlags Sprengstoff +icbm.explosive.rejuvenation.name=Verjüngungs Sprengstoff +icbm.explosive.thermobaric.name=Thermobarischer Sprengstoff + +icbm.explosive.nuclear.name=Atomarer Sprengstoff +icbm.explosive.emp.name=EMP Sprengstoff +icbm.explosive.exothermic.name=Exothermischer Sprengstoff +icbm.explosive.endothermic.name=Endothermischer Sprengstoff +icbm.explosive.antiGravitational.name=Anti-Schwerkraft Sprengstoff +icbm.explosive.ender.name=Ender Sprengstoff +icbm.explosive.hypersonic.name=Überschall Sprengstoff + +icbm.explosive.antimatter.name=Antimaterie Sprengstoff +icbm.explosive.redMatter.name=Rotematerie Sprengstoff + +icbm.explosive.sMine.name=S-Mine + +## Missile Form +icbm.missile.condensed.name=Standard Rakete +icbm.missile.shrapnel.name=Schrapnell Rakete +icbm.missile.incendiary.name=Entflammbare Rakete +icbm.missile.chemical.name=Chemische Rakete +icbm.missile.anvil.name=Amboss Rakete +icbm.missile.repulsive.name=Abstoßende Rakete +icbm.missile.attractive.name=Anziehende Rakete + +icbm.missile.fragmentation.name=Splitter Rakete +icbm.missile.contagious.name=Ansteckende Rakete +icbm.missile.sonic.name=Schall Rakete +icbm.missile.breaching.name=Durchschlags Rakete +icbm.missile.rejuvenation.name=Verjüngungs Rakete +icbm.missile.thermobaric.name=Thermobarische Rakete + +icbm.missile.nuclear.name=Atom Rakete +icbm.missile.emp.name=EMP Rakete +icbm.missile.exothermic.name=Exothermische Rakete +icbm.missile.endothermic.name=Endothermische Rakete +icbm.missile.antiGravitational.name=Anti-Schwerkraft Rakete +icbm.missile.ender.name=Ender Rakete +icbm.missile.hypersonic.name=Überschall Rakete + +icbm.missile.antimatter.name=Antimaterie Rakete +icbm.missile.redMatter.name=Rotematerie Rakete + +## Special Missiles +icbm.missile.missileModule.name=Raketen Modul +icbm.missile.antiBallistic.name=Anti-Balistische Rakete +icbm.missile.cluster.name=Cluster Rakete +icbm.missile.nuclearCluster.name=Atom Cluster Rakete +icbm.missile.homing.name=Verfolgungs Rakete + +## Grenades +icbm.grenade.condensed.name=Standard Granate +icbm.grenade.shrapnel.name=Schrapnell Granate +icbm.grenade.incendiary.name=Entzündliche Granate +icbm.grenade.chemical.name=Chemische Granate +icbm.grenade.anvil.name=Amboss Granate +icbm.grenade.repulsive.name=Abstoss Granate +icbm.grenade.attractive.name=Anziehungs Granate + +## Explosive Minecarts +icbm.minecart.condensed.name=Explosive Lore +icbm.minecart.shrapnel.name=Schrapnell Lore +icbm.minecart.incendiary.name=Entzündliche Lore +icbm.minecart.chemical.name=Chemische Lore +icbm.minecart.anvil.name=Amboss Lore +icbm.minecart.repulsive.name=Abstoss Lore +icbm.minecart.attractive.name=Anziehende Lore + +icbm.minecart.fragmentation.name=Splitter Lore +icbm.minecart.contagious.name=Ansteckede Lore +icbm.minecart.sonic.name=Schall Lore +icbm.minecart.breaching.name=Durchbrechende Lore +icbm.minecart.rejuvenation.name=Verjüngungs Lore +icbm.minecart.thermobaric.name=Thermobarische Lore + +## ICBM Misc Blocks +tile.sulfurOre.name=Schwefel Erz +tile.glassPressurePlate.name=Glass Druckplatte +tile.glassButton.name=Glass Knopf +tile.camouflage.name=Camouflage +tile.proximityDetector.name=Umgebungs Scanner +tile.spike.0.name=Stacheln +tile.spike.1.name=Gift Stacheln +tile.spike.2.name=Entzündliche Stacheln \ No newline at end of file diff --git a/src/main/resources/assets/icbm/lang/en_US.lang b/src/main/resources/assets/icbm/lang/en_US.lang new file mode 100644 index 0000000..bcfc049 --- /dev/null +++ b/src/main/resources/assets/icbm/lang/en_US.lang @@ -0,0 +1,166 @@ + +itemGroup.ICBM=ICBM + +potion.toxin=Toxin +potion.virus=Virus +potion.frostBite=Frost Bite +potion.radiation=Radiation + +## Items +item.icbm:sulfur.name=Sulfur +item.icbm:poisonPowder.name=Poison Powder +item.icbm:antidote.name=Antidote +item.icbm:radarGun.name=Radar Gun +item.icbm:remoteDetonator.name=Remote Detonator +item.icbm:defuser.name=Defuser +item.icbm:laserDesignator.name=Laser Designator +item.icbm:tracker.name=Tracker +item.icbm:signalDisrupter.name=Signal Disrupter + +item.icbm:bullet.0.name=Conventional Bullet +item.icbm:bullet.1.name=Antimatter Bullet +item.icbm:rocketLauncher.name=Rocket Launcher + +## ICBM Machines +icbm.machine.0.name=Launcher Platform T1 +icbm.machine.1.name=Launcher Platform T2 +icbm.machine.2.name=Launcher Platform T3 +icbm.machine.3.name=Launcher Control Panel T1 +icbm.machine.4.name=Launcher Control Panel T2 +icbm.machine.5.name=Launcher Control Panel T3 +icbm.machine.6.name=Launcher Support Frame T1 +icbm.machine.7.name=Launcher Support Frame T2 +icbm.machine.8.name=Launcher Support Frame T3 +icbm.machine.9.name=Radar Station +icbm.machine.10.name=EMP Tower +icbm.machine.11.name=Cruise Launcher +icbm.machine.12.name=Missile Coordinator + +## ICBM Explosives + +## Block Form +icbm.explosive.condensed.name=Condensed Explosives +icbm.explosive.shrapnel.name=Shrapnel Explosives +icbm.explosive.incendiary.name=Incendiary Explosives +icbm.explosive.debilitation.name=Debilitation Explosives +icbm.explosive.chemical.name=Chemical Explosives +icbm.explosive.anvil.name=Anvil Explosives +icbm.explosive.repulsive.name=Repulsive Explosives +icbm.explosive.attractive.name=Attractive Explosives + +icbm.explosive.fragmentation.name=Fragmentation Explosives +icbm.explosive.contagious.name=Contagious Explosives +icbm.explosive.sonic.name=Sonic Explosives +icbm.explosive.breaching.name=Breaching Explosives +icbm.explosive.rejuvenation.name=Rejuvenation Explosives +icbm.explosive.thermobaric.name=Thermobaric Explosives + +icbm.explosive.nuclear.name=Nuclear Explosives +icbm.explosive.emp.name=EMP Explosives +icbm.explosive.exothermic.name=Exothermic Explosives +icbm.explosive.endothermic.name=Endothermic Explosives +icbm.explosive.antiGravitational.name=Anti-Gravitational Explosives +icbm.explosive.ender.name=Ender Explosives +icbm.explosive.hypersonic.name=Hypersonic Explosives + +icbm.explosive.antimatter.name=Antimatter Explosives +icbm.explosive.redMatter.name=Red Matter Explosives + +icbm.explosive.sMine.name=S-Mine + +## Missile Form +icbm.missile.condensed.name=Conventional Missile +icbm.missile.shrapnel.name=Shrapnel Missile +icbm.missile.incendiary.name=Incendiary Missile +icbm.missile.debilitation.name=Debilitation Missile +icbm.missile.chemical.name=Chemical Missile +icbm.missile.anvil.name=Anvil Missile +icbm.missile.repulsive.name=Repulsive Missile +icbm.missile.attractive.name=Attractive Missile + +icbm.missile.fragmentation.name=Fragmentation Missile +icbm.missile.contagious.name=Contagious Missile +icbm.missile.sonic.name=Sonic Missile +icbm.missile.breaching.name=Breaching Missile +icbm.missile.rejuvenation.name=Rejuvenation Missile +icbm.missile.thermobaric.name=Thermobaric Missile + +icbm.missile.nuclear.name=Nuclear Missile +icbm.missile.emp.name=EMP Missile +icbm.missile.exothermic.name=Exothermic Missile +icbm.missile.endothermic.name=Endothermic Missile +icbm.missile.antiGravitational.name=Anti-Gravitational Missile +icbm.missile.ender.name=Ender Missile +icbm.missile.hypersonic.name=Hypersonic Missile + +icbm.missile.antimatter.name=Antimatter Missile +icbm.missile.redMatter.name=Red Matter Missile + +## Special Missiles +icbm.missile.missileModule.name=Missile Module +icbm.missile.antiBallistic.name=Anti-ballistic Missile +icbm.missile.cluster.name=Cluster Missile +icbm.missile.nuclearCluster.name=Nuclear Cluster Missile +icbm.missile.homing.name=Homing Missile + +## Grenades +icbm.grenade.condensed.name=Conventional Grenade +icbm.grenade.shrapnel.name=Shrapnel Grenade +icbm.grenade.incendiary.name=Incendiary Grenade +icbm.grenade.debilitation.name=Debilitation Grenade +icbm.grenade.chemical.name=Chemical Grenade +icbm.grenade.anvil.name=Anvil Grenade +icbm.grenade.repulsive.name=Repulsive Grenade +icbm.grenade.attractive.name=Attractive Grenade + +## Explosive Minecarts +icbm.minecart.condensed.name=Explosive Cart +icbm.minecart.shrapnel.name=Shrapnel Minecart +icbm.minecart.incendiary.name=Incendiary Minecart +icbm.minecart.debilitation.name=Debilitation Minecart +icbm.minecart.chemical.name=Chemical Minecart +icbm.minecart.anvil.name=Anvil Minecart +icbm.minecart.repulsive.name=Repulsive Minecart +icbm.minecart.attractive.name=Attractive Minecart + +icbm.minecart.fragmentation.name=Fragmentation Minecart +icbm.minecart.contagious.name=Contagious Minecart +icbm.minecart.sonic.name=Sonic Minecart +icbm.minecart.breaching.name=Breaching Minecart +icbm.minecart.rejuvenation.name=Rejuvenation Minecart +icbm.minecart.thermobaric.name=Thermobaric Minecart + +## ICBM Misc Blocks +tile.icbm:oreSulfur.name=Sulfur Ore +tile.icbm:concrete.name=Concrete +tile.icbm:concreteCompact.name=Compact Concrete +tile.icbm:concreteReinforced.name=Reinforced Concrete +tile.icbm:glassReinforced.name=Reinforced Glass +tile.icbm:glassPressurePlate.name=Glass Pressure Plate +tile.icbm:glassButton.name=Glass Button +tile.icbm:camouflage.name=Camouflage +tile.icbm:proximityDetector.name=Proximity Detector +tile.icbm:spikes.0.name=Spikes +tile.icbm:spikes.1.name=Poison Spikes +tile.icbm:spikes.2.name=Flammable Spikes + +## ICBM Sentry +## Translated by Calclavia +tile.icbm:turret.0.name=Gun Turret +tile.icbm:turret.1.name=Railgun +tile.icbm:turret.2.name=AA Turret +tile.icbm:turret.3.name=Laser Turret +tile.icbm:turretPlatform.name=Turret Platform + +item.icbm:bulletShell.name=Bullet Shell +item.icbm:bullet.name=Bullet +item.icbm:bulletRailgun.name=Railgun Bullet +item.icbm:bulletAntimatter.name=Antimatter Bullet +item.icbm:bulletInfinite.name=Infinite Bullet + +item.icbm:targetCard.name=Range Upgrade +item.icbm:shellCollector.name=Shell Collector Upgrade + +## Deaths +death.attack.bullet=%1$s was shot into a swiss cheese! +death.attack.laser=%1$s was vaporized by lasers! diff --git a/src/main/resources/assets/icbm/lang/es_ES.lang b/src/main/resources/assets/icbm/lang/es_ES.lang new file mode 100644 index 0000000..5c05a7a --- /dev/null +++ b/src/main/resources/assets/icbm/lang/es_ES.lang @@ -0,0 +1,133 @@ + +itemGroup.ICBM=ICBM + +children=es_AR,es_MX,es_UY,es_VE + +## Items +item.icbm:sulfur.name=Sulfuro +item.icbm:poisonPowder.name=Polvo Venenoso +item.icbm:antidote.name=Ant\u00EDdoto +item.icbm:radarGun.name=Pistola Radar +item.icbm:remoteDetonator.name=Detonador Remoto +item.icbm:defuser.name=Desactivador +item.icbm:laserDesignator.name=Designador L\u00E1ser +item.icbm:tracker.name=Rastreador +item.icbm:signalDisrupter.name=Disruptor de Se\u00F1al + +item.icbm:bullet.0.name=Bala Convencional +item.icbm:bullet.1.name=Bala Antimateria +item.icbm:launcher.name=Lanzacohetes + +## ICBM Machines +icbm.machine.0.name=Plataforma de Lanzacohetes T1 +icbm.machine.1.name=Plataforma de Lanzacohetes T2 +icbm.machine.2.name=Plataforma de Lanzacohetes T3 +icbm.machine.3.name=Panel de Control de Lanzacohetes T1 +icbm.machine.4.name=Panel de Control de Lanzacohetes T2 +icbm.machine.5.name=Panel de Control de Lanzacohetes T3 +icbm.machine.6.name=Marco de Soporte para Lanzacohetes T1 +icbm.machine.7.name=Marco de Soporte para Lanzacohetes T2 +icbm.machine.8.name=Marco de Soporte para Lanzacohetes T3 +icbm.machine.9.name=Estaciu00F3n de Radar +icbm.machine.10.name=Torre PEM +icbm.machine.12.name=Lanzacohetes Crucero + +## ICBM Explosives + +## Block Form +icbm.explosive.condensed.name=Explosivo Condensado +icbm.explosive.shrapnel.name=Explosivo de Esquirlas +icbm.explosive.incendiary.name=Explosivo Incendiario +icbm.explosive.chemical.name=Explosivo Quu00EDmico +icbm.explosive.anvil.name=Explosivo de Yunques +icbm.explosive.repulsive.name=Explosivo Repulsivo +icbm.explosive.attractive.name=Explosivo Atractivo + +icbm.explosive.fragmentation.name=Explosivo de Fragmentaciu00F3n +icbm.explosive.contagious.name=Explosivo Contagioso +icbm.explosive.sonic.name=Explosivo Su00F3nico +icbm.explosive.breaching.name=Explosivo Penetrante +icbm.explosive.rejuvenation.name=Explosivo Rejuvenecedor +icbm.explosive.thermobaric.name=Explosivo Termobu00E1rico + +icbm.explosive.nuclear.name=Explosivo Nuclear +icbm.explosive.emp.name=Explosivo PEM +icbm.explosive.conflagration.name=Explosivo de Conflagraciu00F3n +icbm.explosive.endothermic.name=Explosivo Endotu00E9rmico +icbm.explosive.antiGravitational.name=Explosivo Anti-Gravitacional +icbm.explosive.ender.name=Explosivo Ender +icbm.explosive.hypersonic.name=Explosivo Hipersu00F3nico + +icbm.explosive.antimatter.name=Explosivo de Antimateria +icbm.explosive.redMatter.name=Explosivo de Materia Roja + +icbm.explosive.sMine.name=Mina-S + +## Missile Form +icbm.missile.condensed.name=Misil Convencional +icbm.missile.shrapnel.name=Misil de Esquirlas +icbm.missile.incendiary.name=Misil Incendiario +icbm.missile.chemical.name=Misil Quu00EDmico +icbm.missile.anvil.name=Misil de Yunques +icbm.missile.repulsive.name=Misil Repulsivo +icbm.missile.attractive.name=Misil Atractivo + +icbm.missile.fragmentation.name=Misil de Fragmentaciu00F3n +icbm.missile.contagious.name=Misil Contagioso +icbm.missile.sonic.name=Misil Su00F3nico +icbm.missile.breaching.name=Misil Penetrante +icbm.missile.rejuvenation.name=Misil Rejuvenecedor +icbm.missile.thermobaric.name=Misil Termobu00E1rico + +icbm.missile.nuclear.name=Misil Nuclear +icbm.missile.emp.name=Misil PEM +icbm.missile.conflagration.name=Misil de Conflagraciu00F3n +icbm.missile.endothermic.name=Misil Endotu00E9rmico +icbm.missile.antiGravitational.name=Misil Anti-Gravitacional +icbm.missile.ender.name=Misil Ender +icbm.missile.hypersonic.name=Misil Hipersu00F3nico + +icbm.missile.antimatter.name=Misil de Antimateria +icbm.missile.redMatter.name=Misil de Materia Roja + +## Special Missiles +icbm.missile.missileModule.name=Modulo para Misiles +icbm.missile.antiBallistic.name=Misil Anti-Balu00EDstico +icbm.missile.cluster.name=Misil de Racimos +icbm.missile.nuclearCluster.name=Misil Nuclear de Racimos +icbm.missile.homing.name=Misil Rastreador + +## Grenades +icbm.grenade.condensed.name=Granada Convencional +icbm.grenade.shrapnel.name=Granada de Esquirlas +icbm.grenade.incendiary.name=Granada Incendiaria +icbm.grenade.chemical.name=Granada Quu00EDmica +icbm.grenade.anvil.name=Granada de Yunques +icbm.grenade.repulsive.name=Granada Repulsiva +icbm.grenade.attractive.name=Granada Atractiva + +## Explosive Minecarts +icbm.minecart.condensed.name=Carro Explosivo +icbm.minecart.shrapnel.name=Carro Minero de Esquirlas +icbm.minecart.incendiary.name=Carro Minero Incendiario +icbm.minecart.chemical.name=Carro Minero Quu00EDmico +icbm.minecart.anvil.name=Carro Minero de Yunques +icbm.minecart.repulsive.name=Carro Minero Repulsivo +icbm.minecart.attractive.name=Carro Minero Atractivo + +icbm.minecart.fragmentation.name=Carro Minero de Fragmentacion +icbm.minecart.contagious.name=Carro Minero Contagioso +icbm.minecart.sonic.name=Carro Minero Su00F3nico +icbm.minecart.breaching.name=Carro Minero Penetrante +icbm.minecart.rejuvenation.name=Carro Minero Rejuvenecedor +icbm.minecart.thermobaric.name=Carro Minero Termobu00E1rico + +## ICBM Misc Blocks +tile.icbm:sulfurOre.name=Mineral de Sulfuro +tile.icbm:glassPressurePlate.name=Placa a Presi\u00F3n de Vidrio +tile.icbm:glassButton.name=Bot\u00F3n de Vidrio +tile.icbm:camouflage.name=Camuflaje +tile.icbm:proximityDetector.name=Detector de Proximidad +tile.icbm:spike.0.name=Pinchos +tile.icbm:spike.1.name=Pinchos Venenosos +tile.icbm:spike.2.name=Pinchos Inflamables diff --git a/src/main/resources/assets/icbm/lang/zh_CN.lang b/src/main/resources/assets/icbm/lang/zh_CN.lang new file mode 100644 index 0000000..110f7e8 --- /dev/null +++ b/src/main/resources/assets/icbm/lang/zh_CN.lang @@ -0,0 +1,131 @@ + +itemGroup.ICBM=ICBM + +## Items +item.sulfur.name=\u786B\u78FA +item.poisonPowder.name=\u6BD2\u7C89 +item.antidote.name=\u85E5\u5291 +item.radarGun.name=\u96F7\u9054\u69CD +item.remoteDetonator.name=\u9059\u63A7\u5F15\u7206\u5668 +item.defuser.name=\u7184\u6EC5\u7CFB\u7D71 +item.laserDesignator.name=\u9433\u5C04\u6307\u793A\u7B26 +item.tracker.name=\u8FFD\u8E64\u5668 +item.signalDisrupter.name=\u4FE1\u865F\u5E72\u64FE\u7CFB\u7D71 + +item.bullet.0.name=\u666E\u7528\u6027\u5B50\u5F48 +item.bullet.1.name=\u53CD\u7269\u8CEA\u5B50\u5F48 +item.launcher.name=\u706B\u7BAD\u7B52 + +## ICBM Machines +icbm.machine.0.name=\u767C\u5C04\u53F0T1 +icbm.machine.1.name=\u767C\u5C04\u53F0T2 +icbm.machine.2.name=\u767C\u5C04\u53F0T3 +icbm.machine.3.name=\u63A7\u5236\u7CFB\u7D71T1 +icbm.machine.4.name=\u63A7\u5236\u7CFB\u7D71T2 +icbm.machine.5.name=\u63A7\u5236\u7CFB\u7D71T3 +icbm.machine.6.name=\u652F\u63F4\u6846T1 +icbm.machine.7.name=\u652F\u63F4\u6846T2 +icbm.machine.8.name=\u652F\u63F4\u6846T3 +icbm.machine.9.name=\u96F7\u9054\u53F0 +icbm.machine.10.name=\u78C1\u66B4\u5854 +icbm.machine.12.name=\u5DE1\u822A\u767C\u5C04\u5668 + +## ICBM Explosives + +## Block Form +icbm.explosive.condensed.name=\u58D3\u7E2E\u6027\u70B8\u85E5 +icbm.explosive.shrapnel.name=\u6563\u5F48\u6027\u70B8\u85E5 +icbm.explosive.incendiary.name=\u71C3\u71D2\u6027\u70B8\u85E5 +icbm.explosive.chemical.name=\u5316\u5B78\u6B66\u5668 +icbm.explosive.anvil.name=\u7827\u70B8\u85E5 +icbm.explosive.repulsive.name=\u6297\u62D2\u6027\u70B8\u85E5 +icbm.explosive.attractive.name=\u5438\u5F15\u6027\u70B8\u85E5 + +icbm.explosive.fragmentation.name=\u788E\u7247\u6027\u70B8\u85E5 +icbm.explosive.contagious.name=\u50B3\u67D3\u6027\u70B8\u85E5 +icbm.explosive.sonic.name=\u97F3\u6CE2\u70B8\u5F48 +icbm.explosive.breaching.name=\u9055\u53CD\u6027\u70B8\u85E5 +icbm.explosive.rejuvenation.name=\u6CBB\u7642\u6027\u70B8\u85E5 +icbm.explosive.thermobaric.name=\u6EAB\u58D3\u6027\u70B8\u85E5 + +icbm.explosive.nuclear.name=\u6838\u5F48 +icbm.explosive.emp.name=\u78C1\u66B4\u5F48 +icbm.explosive.conflagration.name=\u71F9\u70B8\u85E5 +icbm.explosive.endothermic.name=\u5438\u71B1\u6027\u70B8\u85E5 +icbm.explosive.antiGravitational.name=\u53CD\u5730\u5FC3\u5438\u529B\u70B8\u5F48 +icbm.explosive.ender.name=\u77AC\u79FB\u5F48 +icbm.explosive.hypersonic.name=\u8D85\u97F3\u6CE2\u5F48 + +icbm.explosive.antimatter.name=\u53CD\u7269\u8CEA\u70B8\u5F48 +icbm.explosive.redMatter.name=\u7D05\u7269\u8CEA\u70B8\u5F48 + +icbm.explosive.sMine.name=S\u578B\u5730\u96F7 + +## Missile Form +icbm.missile.condensed.name=\u666E\u7528\u5F0F\u5C0E\u5F48 +icbm.missile.shrapnel.name=\u6563\u5F48\u5C0E\u5F48 +icbm.missile.incendiary.name=\u71C3\u71D2\u5C0E\u5F48 +icbm.missile.chemical.name=\u5316\u5B78\u5C0E\u5F48 +icbm.missile.anvil.name=\u7827\u5C0E\u5F48 +icbm.missile.repulsive.name=\u62D2\u6297\u6027\u5C0E\u5F48 +icbm.missile.attractive.name=\u5438\u5F15\u6027\u5C0E\u5F48 + +icbm.missile.fragmentation.name=\u788E\u7247\u5C0E\u5F48 +icbm.missile.contagious.name=\u50B3\u67D3\u6027\u5C0E\u5F48 +icbm.missile.sonic.name=\u97F3\u6CE2\u5C0E\u5F48 +icbm.missile.breaching.name=\u9055\u53CD\u6027\u5C0E\u5F48 +icbm.missile.rejuvenation.name=\u6CBB\u7642\u6027\u5C0E\u5F48 +icbm.missile.thermobaric.name=\u6EAB\u58D3\u6027\u5C0E\u5F48 + +icbm.missile.nuclear.name=\u6838\u5C0E\u5F48 +icbm.missile.emp.name=\u78C1\u66B4\u5C0E\u5F48 +icbm.missile.conflagration.name=\u71F9\u5C0E\u5F48 +icbm.missile.endothermic.name=\u5438\u71B1\u5C0E\u5F48 +icbm.missile.antiGravitational.name=\u53CD\u5730\u5FC3\u5438\u529B\u5C0E\u5F48 +icbm.missile.ender.name=\u77AC\u79FB\u5C0E\u5F48 +icbm.missile.hypersonic.name=\u8D85\u97F3\u6CE2\u5C0E\u5F48 + +icbm.missile.antimatter.name=\u53CD\u7269\u8CEA\u5C0E\u5F48 +icbm.missile.redMatter.name=\u7D05\u7269\u8CEA\u5C0E\u5F48 + +## Special Missiles +icbm.missile.missileModule.name=\u5C0E\u5F48\u6A21 +icbm.missile.antiBallistic.name=\u53CD\u5F48\u9053\u5C0E\u5F48 +icbm.missile.cluster.name=\u98A8\u66B4\u5C0E\u5F48 +icbm.missile.nuclearCluster.name=\u6838\u98A8\u66B4\u5C0E\u5F48 +icbm.missile.homing.name=\u8FFD\u8E64\u6027\u5C0E\u5F48 + +## Grenades +icbm.grenade.condensed.name=\u666E\u7528\u6027\u624B\u69B4\u5F48 +icbm.grenade.shrapnel.name=\u6563\u5F48\u624B\u69B4\u5F48 +icbm.grenade.incendiary.name=\u71C3\u71D2\u6027\u624B\u69B4\u5F48 +icbm.grenade.chemical.name=\u5316\u5B78\u6027\u624B\u69B4\u5F48 +icbm.grenade.anvil.name=\u7827\u624B\u69B4\u5F48 +icbm.grenade.repulsive.name=\u62D2\u6297\u6027\u624B\u69B4\u5F48 +icbm.grenade.attractive.name=\u5438\u5F15\u6027\u624B\u69B4\u5F48 + +## Explosive Minecarts +icbm.minecart.condensed.name=\u7206\u70B8\u5927\u8ECA +icbm.minecart.shrapnel.name=\u6563\u5F48\u5927\u8ECA +icbm.minecart.incendiary.name=\u71C3\u71D2\u5927\u8ECA +icbm.minecart.chemical.name=\u5316\u5B78\u5927\u8ECA +icbm.minecart.anvil.name=\u7827\u5927\u8ECA +icbm.minecart.repulsive.name=\u62D2\u6297\u6027\u5927\u8ECA +icbm.minecart.attractive.name=\u5438\u5F15\u6027\u5927\u8ECA + +icbm.minecart.fragmentation.name=\u788E\u7247\u5927\u8ECA +icbm.minecart.contagious.name=\u50B3\u67D3\u6027\u5927\u8ECA +icbm.minecart.sonic.name=\u97F3\u6CE2\u5927\u8ECA +icbm.minecart.breaching.name=\u9055\u53CD\u6027\u5927\u8ECA +icbm.minecart.rejuvenation.name=\u6CBB\u7642\u6027\u5927\u8ECA +icbm.minecart.thermobaric.name=\u6EAB\u58D3\u6027\u5927\u8ECA + +## ICBM Misc Blocks +tile.sulfurOre.name=\u786B\u7926\u77F3 +tile.glassPressurePlate.name=\u73BB\u7483\u611F\u61C9\u677F +tile.glassButton.name=\u73BB\u7483\u6309\u9215 +tile.camouflage.name=\u507D\u88DD +tile.proximityDetector.name=\u63A5\u8FD1\u7387\u8A08\u7B97\u5668 +tile.spike.0.name=\u5C16\u523A +tile.spike.1.name=\u6709\u6BD2\u5C16\u523A +tile.spike.2.name=\u71C3\u71D2\u5C16\u523A diff --git a/src/main/resources/assets/icbm/textures/antimatter.png b/src/main/resources/assets/icbm/textures/antimatter.png new file mode 100644 index 0000000000000000000000000000000000000000..c25ff57c23853372363de76fcdb3a39d2bdb10d4 GIT binary patch literal 60138 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/barbedWire.png b/src/main/resources/assets/icbm/textures/blocks/barbedWire.png new file mode 100644 index 0000000000000000000000000000000000000000..0736671b089bec65cbca32bebc92d3e62264b751 GIT binary patch literal 1332 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/concreteCompact.png b/src/main/resources/assets/icbm/textures/blocks/concreteCompact.png new file mode 100644 index 0000000000000000000000000000000000000000..7e8590b6a0dbc99d078c35c9f5b406b6ab0f33fd GIT binary patch literal 2792 zcmVP)WFU8GbZ8()Nlj2>E@cM*018Y=L_t(o!zGtVl3Yi2 zMUOYXk3Is~00~NDk*0yHCZ!3@WG3xYwFcD!WVHbmtt1*t8c+ZTWF|5r-D2jr+cei}}^qISxYlM<0AxKthy1qwBg|(I-2$)90ez!vk1nc!0r8UMmhGF9A z@rk->S?oeTjd&bIUD9_Qb=&aq!>@E*$1)kLotccm7(*P#G;Pl+%NWfBLNa^7Fiu2a z$mMcjyWQfw$4n!OozV}EkL*u-%xG!rn#YGnj<;7dWkEj%yqupvDAF|GzN%4DQ56Mw zex@uhy#MBoGQTj413?(m)(tugFted3D)z@CUE89xrfVA>9v%te7^Gwv4ca0p&p9Fr z5khkJ_jgRgz~l^L(Gdg@Zd|aVM>z0!qzstN!ufm#FVJDc+}0#X%H#|$mlwLOB}-Gx zG7&{7hr^oUC1<tjjJja-c zckkbE*j^!};8x#K{!fKeirwKv+clVFpz9kDl9#5Sty{*v=X8C;{g>a^?T*~ty~WBE zeRp9oF+yte?d=V598nlEf z81Mq7!I2jQQVRNEBG3vc1e@IfWQb7khkyD5&N{|%B#a{3ra?Hk^d(hUaX1`E;{=@~ z33Xi{a0nrB)-jk7Ei_rSCQTCh-XJ9i@hZ_g_iVRYx~5^XNwL;b)-`2a0gkTe2?8*F zAm+DB^HB5C#F8{RZ8%9ry()1Wo`FlvHRX2*Uv96mcA5jA47&Q57{! zKVXc(n3<;O@E(@gu`FQci8M-p6s;!AG80IJREjW+dC7CKG^MCYE|&|sYa5ouk!3MM zTOp)nG!_KhzI%&8@$u6qZmzEx+V0gpB^(b2$~+x&{Cp{qC`nYRU3qa{F1ZEHs~3G6A`)bQtQ&kl~7$Kzs?^qU#UmV-R7X9-te?@pfmZexb z)Av1_ZO3M{;r#TB4u9qO>zTW|Z#aK_;_CK>VH{CHB8BATa%Qm$pFVwH7)BPm@bvYO zuIp*qmd$!inyy$DgY%xDADPU=Znx*l*L$=?P&YMgTeID5iJ}C%c-pSVn1SwjMB@1E z(?_6jsw;?4yO}woKV&kb=jemXIU�Khm52qXeQpfzn%;XFj4rmjk~)`&m; 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_antiGravitational_bottom.png b/src/main/resources/assets/icbm/textures/blocks/explosive_antiGravitational_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7f66a9193183b2f6ba74be50b79d3a88812958 GIT binary patch literal 4903 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 pD}AJq?$-T(DGvL#JCz4eWXYNP{14jG<9Gl7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_antimatter_side.png.mcmeta b/src/main/resources/assets/icbm/textures/blocks/explosive_antimatter_side.png.mcmeta new file mode 100644 index 0000000..54a358c --- /dev/null +++ b/src/main/resources/assets/icbm/textures/blocks/explosive_antimatter_side.png.mcmeta @@ -0,0 +1,8 @@ +{ + "animation":{ + "width":1, + "height":24, + "frametime":1, + "frames":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23] + } +} diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_antimatter_top.png b/src/main/resources/assets/icbm/textures/blocks/explosive_antimatter_top.png new file mode 100644 index 0000000000000000000000000000000000000000..1931f858348fdcafc4ea8183081b1e43e9e55758 GIT binary patch literal 9439 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 Sdeo7nG@!a1Q^1$N{3{cS` zf&*}o1K|0W7cz1D1k@`MK&&9Dd@yon&iLp<=I#k69Dh8+h7Tu>Z*;nzcOj!t+?KoIQ04 zwf-9Y{Z*_Ov_2gb5S2{j7{jwKJj+dY+)N08D6*uf$68BieW__XuEt2$$Zk!mNmDwv zcec|xWJ^NuAkfj$!5^=`y{UqfOoAJus0u&+*<`leW;_SpYXzy%q&V~>a)l7`RX0-1Gz#}-@Z~pnk_;II5Y!v&XS0b)Zzia<0tHo_nst9nPlS(=00000 LNkvXXu0mjf)MUz} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_anvil_top.png b/src/main/resources/assets/icbm/textures/blocks/explosive_anvil_top.png new file mode 100644 index 0000000000000000000000000000000000000000..61e0756a58e5a558fe0bdaa8328bacf405c28743 GIT binary patch literal 4810 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 N002ovPDHLkV1kDPn7#l2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_base_3.png b/src/main/resources/assets/icbm/textures/blocks/explosive_base_3.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc36a9ceba59391431c5f4b3ed5c0946a5b21a4 GIT binary patch literal 4383 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 Z0|17`xEQV-002ovPDHLkV1j`9Vxa&4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_bottom_1.png b/src/main/resources/assets/icbm/textures/blocks/explosive_bottom_1.png new file mode 100644 index 0000000000000000000000000000000000000000..56eccaa5419bc5a5b5b5e9068a7000f0b63d1b48 GIT binary patch literal 4598 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_bottom_4.png b/src/main/resources/assets/icbm/textures/blocks/explosive_bottom_4.png new file mode 100644 index 0000000000000000000000000000000000000000..6c226db8028f16fd9c14525de0bef53e454b76cf GIT binary patch literal 4126 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_breaching_side.png b/src/main/resources/assets/icbm/textures/blocks/explosive_breaching_side.png new file mode 100644 index 0000000000000000000000000000000000000000..74c949f0eeb1eb9786a8ccd893e1f5e16be4ecc4 GIT binary patch literal 4687 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 R&Pf0O002ovPDHLkV1f|DyqEw0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_breaching_top.png b/src/main/resources/assets/icbm/textures/blocks/explosive_breaching_top.png new file mode 100644 index 0000000000000000000000000000000000000000..289332339f0832f0cd2eedb452cf3c7d8ae12423 GIT binary patch literal 5052 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 Hu0mjf%ef^* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_chemical_top.png b/src/main/resources/assets/icbm/textures/blocks/explosive_chemical_top.png new file mode 100644 index 0000000000000000000000000000000000000000..d0869a0620fd4df42c268f11f6b56d0595527281 GIT binary patch literal 4869 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_condensed_side.png b/src/main/resources/assets/icbm/textures/blocks/explosive_condensed_side.png new file mode 100644 index 0000000000000000000000000000000000000000..446327e1a92afa7c9ff9e6d2e73b0d86654eba2f GIT binary patch literal 4590 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_condensed_top.png b/src/main/resources/assets/icbm/textures/blocks/explosive_condensed_top.png new file mode 100644 index 0000000000000000000000000000000000000000..1f2ae4322c92b55585ff728957b5ecea7d884ee6 GIT binary patch literal 4776 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 M07*qoM6N<$g1JCP-~a#s literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_debilitation_side.png b/src/main/resources/assets/icbm/textures/blocks/explosive_debilitation_side.png new file mode 100644 index 0000000000000000000000000000000000000000..7b86c3cb4a89f2e030a98f365e2a190b9aef96fa GIT binary patch literal 4556 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 N002ovPDHLkV1nQ15{Uo+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_ender_side.png b/src/main/resources/assets/icbm/textures/blocks/explosive_ender_side.png new file mode 100644 index 0000000000000000000000000000000000000000..a54f9073cdd1ea5cb11de9394795a9dde40cb54d GIT binary patch literal 4326 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 UK0kHGCjbBd07*qoM6N<$f=^T-Z~y=R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_ender_top.png b/src/main/resources/assets/icbm/textures/blocks/explosive_ender_top.png new file mode 100644 index 0000000000000000000000000000000000000000..74a6d4794de238fdd8ab95f3dc06146028e45e6a GIT binary patch literal 4518 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 Ef{!P$jQ{`u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_endothermic_side.png b/src/main/resources/assets/icbm/textures/blocks/explosive_endothermic_side.png new file mode 100644 index 0000000000000000000000000000000000000000..ca2766fe91192fd148027e0d2c1a75e0e1f273f6 GIT binary patch literal 4850 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_exothermic_side.png b/src/main/resources/assets/icbm/textures/blocks/explosive_exothermic_side.png new file mode 100644 index 0000000000000000000000000000000000000000..71b8e0a20a59d9adaa8e86494c8153057d16b4c6 GIT binary patch literal 5037 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_exothermic_top.png b/src/main/resources/assets/icbm/textures/blocks/explosive_exothermic_top.png new file mode 100644 index 0000000000000000000000000000000000000000..25dd010920ac0b1396f6b22ba4f9b6759e39cdaf GIT binary patch literal 4723 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 B0lfeK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_fragmentation_side.png b/src/main/resources/assets/icbm/textures/blocks/explosive_fragmentation_side.png new file mode 100644 index 0000000000000000000000000000000000000000..6d18771d2eac7fd5606476bc2ea0b3f7a1a4eb2f GIT binary patch literal 4706 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_fragmentation_top.png b/src/main/resources/assets/icbm/textures/blocks/explosive_fragmentation_top.png new file mode 100644 index 0000000000000000000000000000000000000000..9eaa83929a8b2bc51f54beef30d331c9cff780a7 GIT binary patch literal 4743 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 Vd1qCe=R*Jh002ovPDHLkV1j8e-tYhb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_hypersonic_side.png b/src/main/resources/assets/icbm/textures/blocks/explosive_hypersonic_side.png new file mode 100644 index 0000000000000000000000000000000000000000..fa438761b45f2f0b66c9fe889142d4e5d954407d GIT binary patch literal 4667 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 P00000NkvXXu0mjfhc6!S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_incendiary_side.png b/src/main/resources/assets/icbm/textures/blocks/explosive_incendiary_side.png new file mode 100644 index 0000000000000000000000000000000000000000..de8c53f0c438c15b47ed5acf1fc06ea2cb5f9047 GIT binary patch literal 5159 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 VZ_IKr0a*Y5002ovPDHLkV1f(j)ztt1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_incendiary_top.png b/src/main/resources/assets/icbm/textures/blocks/explosive_incendiary_top.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5cad9538eb86a2204cce299c5990203345bfc0 GIT binary patch literal 4546 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_nuclear_side.png b/src/main/resources/assets/icbm/textures/blocks/explosive_nuclear_side.png new file mode 100644 index 0000000000000000000000000000000000000000..6f97220fc27db0a4d4cef067081ff225ed9a1ed7 GIT binary patch literal 5007 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 ZHvk!g$@{5AF8%-j002ovPDHLkV1m7Dee3`L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_nuclear_top.png b/src/main/resources/assets/icbm/textures/blocks/explosive_nuclear_top.png new file mode 100644 index 0000000000000000000000000000000000000000..0670b54257e93c6720124444ee06c4a42aacd82b GIT binary patch literal 4671 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_redMatter_side.png.mcmeta b/src/main/resources/assets/icbm/textures/blocks/explosive_redMatter_side.png.mcmeta new file mode 100644 index 0000000..77e6496 --- /dev/null +++ b/src/main/resources/assets/icbm/textures/blocks/explosive_redMatter_side.png.mcmeta @@ -0,0 +1,8 @@ +{ + "animation":{ + "width":1, + "height":24, + "frametime":1, + "frames":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23] + } +} diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_redMatter_top.png b/src/main/resources/assets/icbm/textures/blocks/explosive_redMatter_top.png new file mode 100644 index 0000000000000000000000000000000000000000..de2f3cd601a8a4d2d31ccaa084ef7320bf3607ae GIT binary patch literal 5850 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 Ef?qI@g#Z8m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_repulsive_side.png b/src/main/resources/assets/icbm/textures/blocks/explosive_repulsive_side.png new file mode 100644 index 0000000000000000000000000000000000000000..5e598c68a3ecc63cc7bf76b8c27d37c0353b9a3a GIT binary patch literal 4597 zcmVKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000LdNklZywIQcgATYu4KucIllXA?X}jC-4FMCV|x?Fp%`uu zCy~^3bZ-+6KK}{rq{ZDSxga8l3T}>wFgzg!tQa}x@iQyNlgEE!vNgfn2`ZFiXi&ge zzUhe5?G3K4UNhaC(liY;kd}#(3hlIIwl|}cLP?p;TN?;M>Jp-YsDgV9W)2N(#tqC2 zcbH6D+G$H(BtjFB5NIZmQVPrKCC#)!-aq<*s|)S4rD+-rXZdzPx9A8V0N{O);c;J8 zFCz7O2js@Fn;mK*ZQB4&x9DoZ0x^i9F%V-Ur9@gL%xnz4wX=m~LxSS&grJmCP}MO& z{W~C1lQS~_Vr+PI{<5A)nS~kCX-hkuuz2$pM~K?L(A`O?2A|%VqA{Q&_Mu6cNYF zaW_N)IcM6o!Lo7u_$lA@9DRO&>_&_YrDR0vC@dGYc5ZQf@tUsdaCe$XTRV`J9TK#* zH3;Bib!HBfzAEGL*_?Zy9f8$Ws|toAqRdau**km>5X=nAhDPl-V}+wyY#}Si?uUEc zPTTRzTf4U~tFtyUN~u9aWNh&Oym1tzU^t2*K}Vo^DQJuXbjLBQClY`5)lZpjO!)op z9<#B%LC(2vp8++XyZ4|2%*k$?Jvq72{)12NAx%B&?zKZeNr}m%1%y&Eo3kyhFJAN2 z&mZ#kdO^%7Q`)8mi3$wWff+PSB&A#tZv}~wmnSbce0a3BmT-ACXSTmX2mv$41Sn2y zLM5?O5EZaG3Q?_V*iPE9t*ScCuU20-#B#wy02RCxX8SvsIpWmM+?nm~^i|r52l_D% zzgI#KaK=?vE53J6=I)m5xO?d2-CjXS!l|@i8$G;qq+G;lm^DeRjm<*}O-6S!2po!Y}`QiTA6x zJ~mN70ZPsz-AYhS9zSKazl-Y->U@Fw!|1w4P2bg zF)N6}?T==h{^b||jR8Sc;C6SUr`6$S#pQ7Ps3xPTST0;WzoeNogb=uRw$FC>b&nI{ z{P>%mH(<8E%h{9D8=4@}V??TYx;wfqIQ5|45FG$jp_IbuUr$B=&d)yL`yYJ5r=J|q zcE3VZneFd#^7!d$75fo*4@`IO1&MLnRHLF&kttGzWtFvz{69RZI==k%>ubLL^ArC2 zpFfO3H2m*~{u^C=CoyxPWrG+&Af<%rsv}j5D)~sO96mf^esa!if0w<3e{p^a*RNpj z;5lY+_3VOspB>@uJ^3&y=P>^?ZdrYI93Z(`rJFi`|BH_~KYqcTyE7E!_D8cmxxmid zXFWDD5|o|0J2()6@Z#w=96UIzV&;6S8*WBBX;5>ktkloi%s6~_pNrG;QQP+p-y_D@ zZ$ib%{Nx2q6A3}NdVY0-l-%LY-JLqFQn%>f!6712eTLVSFU5%Ce7vq%2oy4Q(G-awrn19mu)&12IM%$E@J4YicK; zLbq5_8AE#7uD{>^;^PsZV{7{k#2Cq4CNw&3MJay6=7pf>x_?_o_`3XRREDEw&iv$j zg=BZU81s`C#2Bh-I=I^?ZnbN$MlpmK5RnSP*u-83$~ecNB3120$&j3(pYQRbf8LPe zAAR}bk&d+|nE@|D2P%!PiY=vl+mLL|Hb=DPT<~IJ5*kB4-}wK zAjW|Epp-Upg9Kr+IU(ZJvk%S{gq$-W1Vof((u{yHgPnt2jvsxuDLr^_Z^fX&`!%i- z9oD=-(?q=Y9rFIc``&C!2vQHEWnz18dz|6Q84m!hDECtD3gV9R$gb_K=C!0mXd1+; z!lsm1ynI^$t#y=cPL!T3q>(z~H;Wr{+TOeUP7>9GR+A!QQiD}{@@OQ6e?_Rt9-{Zm9BwPGph3satQgm?u0f=-o38LQTtZeZ fXJt83m-*iSSA4oSr*6F&00000NkvXXu0mjf$O*K4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_repulsive_top.png b/src/main/resources/assets/icbm/textures/blocks/explosive_repulsive_top.png new file mode 100644 index 0000000000000000000000000000000000000000..25841b70e2b0f35d898986c052add573ea434ab2 GIT binary patch literal 4663 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_shrapnel_side.png b/src/main/resources/assets/icbm/textures/blocks/explosive_shrapnel_side.png new file mode 100644 index 0000000000000000000000000000000000000000..0ade6f3eb38e4f68f8f3830ca92866811b5b1479 GIT binary patch literal 4496 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_sonic_top.png b/src/main/resources/assets/icbm/textures/blocks/explosive_sonic_top.png new file mode 100644 index 0000000000000000000000000000000000000000..a749784b517c782f017096f66a05a6a2782e9180 GIT binary patch literal 4905 zcmV+^6V~jBP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000P7Nkl#z#F_G|oNFW+VPIO>GBs$T+ z!~_RDaOj{XB>oK!FoeXBiNx@VG}1t$2x8g>6==)uRMS*fRaf16_G>vfw@z2tutqmK z`|ka%wZ8T3@5n9t_u2l*1Qo~yvI+xLLdbl)y27{a`3A$L#>|K*BO<5@r5Gy0R(S8o zxe!yr00B}dym0c*+_bQpZczz z0Ni-ZZt7}8GpLwt7L<(l3MD6~8d3(|-C<+P<71;s+#S-Ea3{1LQ#dSam z1r^16PtF<3#@7yBi=q??@14KE;%;LynP5^#8MMubjAIr8|6W<;)`JJAz2eMw*`$J5 zqNIcqM-h*r7?~KsVn*q*SCoL`cBxhxW6ywoVEGGoz_IUU9TBQ%UN| z)}?|;nK!eLGpP4u%XpNc@a4PirwxI@V1QFc&WX+Gl-;{_@yTl^u#!mzULeN^s^Ge| zwlNY4kPW$h?;aagRp0YNlL>|)B3wHfVU~fe-$v%>!;cU{pbe4tPoHKMBBMcrh_E@G za{H~f(lj+{#wRCF;a$fE3Vj>4Vj3gz=vIzq7DFPifHBP&$Wt+0i7brP#Gv3xF4_G`Mw(dcVVm3@ zzkiWqCzcS5G@bGOnKS(T%!jP4t)r@h5Eu@JjK^ahfBbO)Z_bcF_WMJ|Pvl}qHD$+=78^5x4s_Sj<#1_Q3U?mG7E z+s9K+J#`g;&FPdu(-2}n5X>?HRNi3*>gPS|c+ep@{=+LAh#}%s84kNFODTj9$T@TA z(xo0uUDq^C^SN!fX73(W*VZu%@4Jx{gkpyG&Y`MvzI6bO{d!&j=_X+?81&$_$8EBR@~6D=+UuxxNp8(dDTQHEqs8VV+=k$1$FFeU z?8!H}a<{Yof}L6=)OAgnm(+VtRaITv=Hu43EeG07L zSn5rTnNc~{aiA~0cI9~axs`41PVvA;ul@A#z}%h&sd)AHDiIH$U;?A^16S5Llym9Dpko0@^mNnQ%feWQrrR7ts9ZAcD|#~|GZ z?i)44(%ElOp>on0P*?Hgd+sKL!19F)Y-~;mF%n}S#Kghb45f4=EE%T*at=7>c<0>t z9fri;w6L2j9f0NaHTF-&p!9wYOH}GWA;%1*^N9aB@ftBh<)BG{A=+n15fX~`hSLf( zBT0LnEbbapIma{=wBTr*(6~7r6v~{G;)L4!xlFtHn!|FYjT!HaQWA=i)j{gA76*QA z;|qnHBI2&-jk>10hk}-z8G2#RIF9c767QZ{#{0T=x?9yKmiphg4xE)tHjh*e@95Um zVPeEQpAHn~D@sYcw|s#k3wzk=xQO7zDN%$@S*B1|VEYH?mszxeGC4z`Y z)H)ZPGpLe7i#SI$&-icWubg#cVGo0*X4VEo3@M5{c;tHX>S^klLE|Aqn={k4Wod2w zs+r#^;}_Yn&)c)OFs7CoUwKjrq}=UkW5OpBrfoo7g@jB9T_#)cgYP^{%9%E%{yWe+ zhhg0qZM}GPO-zYgNKORVwGnR>-+<>GB4M;GN=B$)zw0k!g%voJF9MYey#25$3av b4gNO(KiYc}2jF>h00000NkvXXu0mjfUS?H? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/explosive_thermobaric_side.png b/src/main/resources/assets/icbm/textures/blocks/explosive_thermobaric_side.png new file mode 100644 index 0000000000000000000000000000000000000000..042409106514baf8ac000d991027c66b8e20a267 GIT binary patch literal 4845 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/glassPressurePlate.png b/src/main/resources/assets/icbm/textures/blocks/glassPressurePlate.png new file mode 100644 index 0000000000000000000000000000000000000000..46b91bff6c201ec367d29a5216a4ee8d164e3a81 GIT binary patch literal 2991 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/glassReinforced.png b/src/main/resources/assets/icbm/textures/blocks/glassReinforced.png new file mode 100644 index 0000000000000000000000000000000000000000..d3c3f1725499ae2c035792d57232d3f676d51a80 GIT binary patch literal 623 zcmV-#0+9WQP)000McNliru-2(|0BQ>aP{EGkp0sKis zK~z}7#g{v8)j$x1zd5^J`zCcz8d?fEDAN*3{xY;w&?8dOpfrT!62EsSR?b7BWqlfZ zN7kP4=*-K`&(9q|5|WX#Q_khR>srQfVuM+Erj&5Nv!h_d5CL#^hGD?nY1@|j`<|2< z073`=48w@K@3(?HgIwB>?7mCFlIiwqY2iXSVIG zFJHeAV+;(##K%vcjf%K@ci{k0(lhUVd-hwLJDe+4K3Mx-97`z@LLg$WtQmkGzWOcB zOAG%!8q1oAF`$#fDN^CPt3tF*fV?wvSVB*V6Yre*yFgAE2d(ID7yA002ov JPDHLkV1mEm5`h2! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/machine.png b/src/main/resources/assets/icbm/textures/blocks/machine.png new file mode 100644 index 0000000000000000000000000000000000000000..7a7eee798f97b9eddf307a67c7bb6d9a32443a21 GIT binary patch literal 4557 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/proximityDetector_side.png b/src/main/resources/assets/icbm/textures/blocks/proximityDetector_side.png new file mode 100644 index 0000000000000000000000000000000000000000..7b43d4d03ec1bc4874e412c9d29d98fbc7998aea GIT binary patch literal 4655 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/proximityDetector_top.png b/src/main/resources/assets/icbm/textures/blocks/proximityDetector_top.png new file mode 100644 index 0000000000000000000000000000000000000000..c743fcd6c95e3c66d92acca033e83c26fac5b851 GIT binary patch literal 4971 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 Hu0mjfuKBCi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/radioactive_bottom.png b/src/main/resources/assets/icbm/textures/blocks/radioactive_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..484b9579a9c47c238c0a208c5fb2648640b1916a GIT binary patch literal 5030 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/blocks/spikesFlammable.png b/src/main/resources/assets/icbm/textures/blocks/spikesFlammable.png new file mode 100644 index 0000000000000000000000000000000000000000..834f4bbcd70222acd6f3d2744069b31d8d87f765 GIT binary patch literal 2977 zcmV;S3tsezP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0002YNklS1nW` z2D&K1%yu4=2N}qZB8f3eW8@M65fA|p5CIVo0TDnf5uNwjic5@NN*NhYT%?eDKd!k%UsJ8yLL9@_NT<9uU04;doZD zgM)XNTyB_ZoyKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0001uNkl;>fw1b>xQBl_V2lzx z@x6d|_WjQ`eG9y^7>6GDzI1S!)3P}S;9hDA)UrKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000K~NkllVe>t28P>)-L-JC-H#uYdo9*>i-Y)Xi)C&2?2p1Z4Z8l!|jo z&IJJP-EOc}qt^Oj?GN97*Pc^VhM}WYW9;wn-eCqlI8>FK3f?padmJOX+1-Z^C$M#gc(s9Ti6VH`0t zoO7g*^QQ-#6O6h!-fVjB@Q3k;s%4F}oiL!-N{or|;7K`=Q*-=y z7*Tax(uI->qQWqAq?~uQl-#i7=Xu`J=LlWL&CQW%T0pdc(7WaYpup+XiQC(|9Z-*7 z9(Q2nQnRk_vBm<5khG1d*_sSSsS-Q$GRj$gv;fE_kQ2}?fpHa z8Y&foham3BGBwin%%w*_vF#|_0TQy)Kl0)w2NMG0DzDP@5@eXW%c9I8S}k!4cGaYO_{2&9y@w5Pqk0P{34ZZ*$&ODPrGGE}W@N~y%Sl5?Sy zido&{y$PMaHlJFJr>8T{c~l$njrzig>-F&YGXR&%#NjyNyrbko*Yy}}zo8#6Gg3+% zk2mc;C+2D5*=9vc$)r>eY2aF8#H=jLhPrh`5uxw<{XWH&7+1i^ zxnR~j5P_{S8)gb6w_fl9)*=cBhr@x_uU~JVYxOU+?$6!a-n9R|qVV(k5MyFp+fWi? z+#6VmiDh11;K}Elsr%+a&gpu~VMBST6|8~g@u>-qIz_cjPR@Bs$@`{eb)#vtz{qMt^h2hyr8ug5e~<3 zd!QMtrBI~}7;NfyorE5~Ja9Ul_DH@q=$zka$Tmfd!$2v8lrt&C=NaQTvaavYS}So) z`#|#M{>`4ob)8w)l~O9xG%>HO6~}eGcCwdFe1$Zl37N>XLwb_?r_FGER?TV^?>*x*?X&S#t|UDu=H2z{XMdqN1@-QMo9d^w+~wJ@*C zo_aH*>)N1-um>z6Z799ca9vmK?oO><%fgq3&v@@KAjL#ALpKaqF^)GQ!g0sJ`FzIt zKrMy5u3S=P7>3p@Q=#O7ZfY4ikE*np@Jd4!rIbvHZSFsx7ZBrozVO|*-)`fVfWSBo zs3^|KuA(Wn29{Ia#YRMsDD6m>5;4ZjmM{zhUe)cOdiUX{|9Uk0@t=SDpB>FagczGF zd+!~?(DBFLfB%0!oNiLA{Nu-WFU4U)vY9cCBdX86;o;#kB1#CJH*fAaUuHgh_<$L$ r*CYG$yEbgY$hCC?^h3`)&-`Zq+|!~!A(YXv00000NkvXXu0mjf4hyKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000L;NklFOkyz4nv6Ts?BZ3jWLLTv@b%4SZnY;0N|YM9LAW4 zF)oeWcl3yUXN;lW&xtWn^wx0Bk`lPgVvNBz0p~1PmJwsX`$&u)5I_(kWX@r%Aw@6- zoXg1jIg*6Ey*=_g2ZRtjbzO0Nbd@}JSZi?z_;&Ty8v6Z$q9{njc9+6RQIJx?T1(S3 z#25)75Mv^QfO8pHW^pbf#z?Q%qZkwfA6eg6XLMtXwL&7c3s;}cS=>r7z!=fo6$SmG z&&O9T@V{tx9ljUqEGZ?75k!oFF!-oBG=`0hbuM3l-b)u5ozajUdj%$cgy|+=;OI|a za<=UQM}7#CxAhyMz8{^2@f(nW+FyPC2#`9q1g}_f^ZC3DpC!w4R#yjrPB7U7;}n3C zP1yM}h}Hh=9hkijBoG7BcVPN1(86Q#HjFnRHH)Bwa}MtVB0`oaAf2^_d08p9vz)4I zI=+ihhe+$#g19z~H$RIm)L3X`L~V_Jw^%`lk<6(k%*zS{oH0VLm(w&J>kQMKiPGff ztz&_W$66X19b12-oxE*pUj}{v_q?DHS$`CG3GRInQi9>vU<;V(=|B@$pbH_CX7zE{g>%*7Gr9Csgjy3%dk!*H>E^f zRUHUNXJGP{?rPi$(e$kDYP_iqC!6|yAxx7^jmr2fwH=??PeDqFEYA=TtTT#%loG*5 zybr|a@xDE3gQ^;_O>WvpI0*=l>h@LAoyO1#QBu3Ku)n2w9|*oZ3zh&Qri0D>uk7c1 zl}dod(1h5fNO!U(ht_G|MbaqbXQFI3&v*-~7h6cO#ky!YMMi4!My_2g^xiyk+&u64(^Qc`^y5n*Lev-`#IP*7DBc71*Q7wc;)OlLC&D+kyZ4w+1E@ZtH7c=VCuy#D()8ExO-%Jr)l z46DOc?!5C5+oNr=m5jm00Ld%|hO1;nhOvhC&b{B+POne6di@is`JB%T4^dVn^ZASe zg8}35Oe3(Mh%tsJi>rc{D z4Ru|UM00#QTdjs`yl)VZwn`S~{U( zT^pZj+xVuv4Gc;`vMb>X*MpM7aN<`zXtj;paAJO5cTX zUhXlxdr0t}5F4wbySH%scfUP(+XD1v+sU<2cbmFdcSJ;$a6!YWs#sfF=fMXaqAW{{5u9_R zR>kf(cn8k9w)D=m>{1xfc+Yq|CMAd=P*qi%>ps?5eB-IAs>4KIt_}Vj}e2l(y3@u*P4b_%$i04C$;F6u2Hb6FI}87 z#&$H^+P?IuSF`gM{_YgrtO=_V_RqN66j zcsxSHkY$d82M;mZowL2YO-krlkL**qol`^*k*?qc==FQd=X3rw0F)XOBH;Su`~Uy| M07*qoM6N<$f@Q1FKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000LfNklYB`yng+<0;npgLMfH@yY>6NW1a)o zCepsW_f(*kiW-T^7GuB$eGzI?tkFTlq>4Z6##cTcG zxT+!oviy;A!5Af_41l#}HCRfel=5us^UpqQ^Hi0-_mol@x;@q!Y6a^Is!EC(YYomh zO39>DC?x>`2%>_s7BxyOpbFMHeD9GeTrL;9_kfUdB7~W5@806Q#TbJ{AT8b-qxAj2 zFbq`6a!O${4AfdN#t>tqltRv#QYtxTtaUhNu+~vZq3b$^?Lbb2!|j2)@9r^1sFcO= zX46`O-3(h)rNwR-=!c%16NlRaB5m9nLyQSy9IA#n%%}=ESG;dy&N*tWl#=QC4(~m& z25MEHaz0NOYcSSOYeiKM(Uyccl@>!)Zf_49_BVLn@%HUI1OX9ZPQ)=Wj}wQ(fePe0 z6GCLzSYnE#*c{((22>5_cqXTesL=PGn9_=toLVl~aU7THGdS-#-M!;-|8H`N#9Y{I zH-wxh1yTyA2$y4kn)%`9KjHXr#bS$tht3vJQv{ z&b5TJ#wg=7H*7nPEs@{;?n}<+GaqWIN-2fk{OT82qwEiR9>06TAHV#|_pZ6NU;pyw zsBN4uPBRFos?c@5#n>t_wFEP!#TCFghqV?}UHds_YONd}j)WN2HP+hqU@C|Rs=C0j zP)a7oMAvz!V6QAE(%_UuP@`y8thMW>ZIA(>?|Vwg+}%BpQo^WWj6qdUHI&j2G>+rS z6W)7LO88FJF=MpxKu&Ezt#CS@*=#lh6WH%>2q7*IY*#O$l#;nzMs_)a2-7q(3@x?@ zE%8K9ZCqiDA?Hj?8Izl>oEmG|QVPyB?_&&XHv`@|cH1p|->Fe%!`gR@MJdNFa@-Y<j zvfh*px3{+pn}N+{gIS7BtA22Qe^05EoEi#32n_p=)>z8~{)LGsAZ#`pUc7h#z#L+u&QjKSyPIA6?>z`Vt%ndI^E|CLbS+>pM5b|i z79^WeqO6+>DaC7-&9HegUR%-}ACHY_jH23Pk}A?YU!z?WUFa8TDa>?y9qHFTT^aNij#1IJ~P)dV$&aF0t5J)K^B8y5E?CEq` zy=fIq+X7W;ZPoAPM=vQk6Xfh%JH7;Erd zx9UJ^Et}1-I#g=GT1(e^Hk$!KsHLnA8DmYGR|?h`oVAo%aL%>)BJDv_Ti9|gXwGGY zgotoHU7C~%Gse0F6@~NZgjr6iVsM?K>pGls>~C&XMm(QRl#&_eY1IX_R=jUQ6=6NF zh%`}ph2cEU?Dq#$l`u^_+}~lXrPAVBYDH^lFQ8o6?goVI8jjQHgt3m2GijbV$3)-v z7;DHelT*tb0Ou{L(lp@}hAK+Vi5QwJJDnzw%IS3G(@#F(_;73#DKHE@DvB|(vSKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0000PNkl^0XySn5gl`DJsf=DTd5c9n$iC{1l zRZ>cbnFN0t`zKOguZclZxlLaAvU^!x-5c|WAVpo^<~t=&UlhKO$i;_|AmF@;oD$`8 zW#S@7$)x$F`JY!VCU@<-iOqp_fxfx^f4hF#mM?ri)L&Tmxp&lf>EnOm{goDGt-?H9&6Z;!m3%a@p*J-N~%e+FQf zc2m#_V~a^DVIOM{n1(DrFdqeAem&IBDp7$IFL1By6$<~QUC5Zy)+IDls~Q@ z7T@nQlwL<@^ULJc4~ma|N|`cj)K9-Ddc3x*h*|NIN@OT86o*Z2x{!BWoNZ{44E|gC z7-${{P-iWj`S#rbi7Ry${nmt$;)e6%%~*Ulv5xK?wEwY&Bm3!2>hvrz@Hc^IANm{p z{}S|Dn(^|l2U%Fl39`430d zZ5tuaNwE8je2u1$r!a=s1OqP{V=trbAD^xt-Ws`}<&2(vA=~a^k=+XzHe2Q8>eyrM zo3y6~Va$&rXVkqNJUM|I4bOwexd$l%I-j?l8NMS>j{kLD>7LGk(CFvo zU+zLbJ{RH-UH!Wr0NaTsOq9HY4;YgY%?ZD5MKR%ZvW!zFBQR?(5K;FaN$H|vHhzH~B z^zXuG+uMlXN6QR$_~lh*ULq4G#txOz2VLDt+7;a+72`^pKfR6*Y zv=xu3ah*nrF!rWYpu@b*^7bNN;oy1^sq#m#5GqWUSnqq~c->8>+_NM+!92+y=7L^u zNf{3DPUWTWo}9PsH9mjuC>8Rc&-uH#mOz>XS7q}$EBZ)jU-gX@fTh{2buM8+vOP;o zmiE;fRuqRvkZ88lq-!HavGND*8SUw!!e3=a|1fd$5`i{H55NQij(P$1xGo+lMGeZ( zvihxdSs0rV>As7u?gFe1_@QFw!iMJKbes@Vb5II3fo}vO(?>gj^3#HwZYQ1JP1xt1 zT1B{Lo$Ufy2cnGT8cfHpS_OmPd6AOibhi+D^*Z$7tb5o$$bvxz=_^$o6~AM1hW8&$ zO!D3@pehth1PQ~pCUsXnjd&+x=E-f`j5H8xk(-IoeDd&Ei2EXzEkvkk!zAq^Ay59< ztsu63?a;Q^Q0&L;2gcJikTL0xYDtdapWq8yWq!bPf8n%{B_QIEW12)P+OWb`8C+GptCJF}Z`}3#51=FCJx6VWX;;nraL$9qJP2lk_6!`oRi4$l;f^J`o;C z2VYc|S@rq0cfy&MJx~}4sV+jEeA6cIO&5Gm3j|96ZgEv6CZ*2eM=76S=tX>gg3x68 zyZSNbn$sbS;2=+-)9$5T74rUTeTnpQ(}tT}@B7N7dft%9_OcjRs`aJxpvkf*!ODOoKBO0%EX$OmqPHJK{e~x);1vuY zB044Z@Z31hY>iWDOjSqKOivuJR04PL+kv;F6=fCpHkYSh_m-vC7`(cCIm}y8VU<4S zN%?6im@U_W^I>Gd7@7{!)09d|cfePf45?^O-yZ{~u?nkly-3fp*4GoG2!sh~>!~i3 zErPbKZPKYjXo(_~T&X{5z?0GqsKLAM)2Uh69ByS1o&1FIsm)d;xpf}WsX~e+HW89) z!L#XQ_1K>&_0*{MO>^G%%!hwDeg#OVayY?NUNmS2{4b;%2Ie3CR^P?EZW)sreKqF8 z?^4LA6Q3bE9VZ{DAY9#5H$FbDBnJ>9Qhycyhr9h6=rj*yo4$Uz?`4!9XRxW*lCgw6 z9Le!VY>L@L;xe5d2?1dJY}o!5^QUXs!miA80tJQ5P4P_<7SFc7vNeGS2#|Q)>fhy%8fPOFci%Dbfp(qvbm{*O* zZ~Ix)y_kgFv`4z-SIyF>t=$!WPF~FE;WORI>usyj3+hSoev#hdvUdv#d$>}5$l8o@ag!dEQE=Tf;%M$k40f2R&;LLvv7d z)SV7LMyo0&W|g`O(#ig4R^3dWr&qhyw%iTGSoACCkSuowR`M)jfDs*2$BNQnh&cU% z4ut2Y8iZTl_i!|`N}ozzrx%;~)TwK)Hj*>ca->)^&My(kfC^8cxlu)Hoa2alW9Tn$ z($*83o{$T@_jkP5v}gzZjZ3ZAX4TaSo`%Q@r-(W=h+xB0hfNk&f$=aed>IiEc921? zaT4rcA@2qw{vk_R(DCZgMGZ02y?&-elBOl6zN5RW#un)|F|}M?UKYUECvTLzf>)dl;)nbDHU&>?Cv=w8(LD2V zEgHw>Xo27HqA`B-o2Qj#FYLQ_3x&Dl8ZcG!-hzy(agP znp(>>?PR#h!nRWOw}?t9p)bO>DHqFZt)|jwY!W=tBAF1C*7zH|Ox%ar$Q;d#w(q2? zxJ6{MuV1{gV|uo+p#Fv^|Cx!`PkFebWc6GS@UQi`fGHaaP(ct;`DYSI(gBhfaum#% z(v42p8uKb*hr%;{+B+uqi)OLsv@T_@QLbLT2hp@PG=yvoC${Q*a^xG@RD-k3+_v!{ zv`9JfTaSI%>(z9k{3b`H)~erUjH@aL{dv*hyF7drA6<{Kye=QLcuuHw3?;B-Eu2)C zmv|rQ6vYXFDLG`=G&l3>^6x3Ze@V`>*TXB^ZSAXuO^1KLpDUCQ^29ZHIsASL!}iW= z^<&5IlfO^XrqpOs&7*jAu1dA{Q9r$eR>-O`rBF`$Bn3Vw+|&F%4r^K-KU@~`n9OT2 zY%6b7wzxEQxpfDtU<@*xr4tKLffV2;+6oCnC?h_Ym<;{u^3BF3W^WGj{DwN-N++|{ z8gnLBd?T2SP+eW{w_~0g70F^x0h0~$rl+Ux%GI+0kKel_GfhIID(D;R!6lF`Ap5SC00cP>q&7$0MbMIs6`@7b#3=N zNoSE4I1J`fsS~cQYPy-J?|nnHQ<8*S3h^>y${0S*Mq=-fspi3&)u{ z=c%M&1!poh?WBQKvvtPIuJn53%|ws|a? z`d20C6Qnd~Bt4k)@GqI%lAmYQD+d2nHYjYCcK_UJCdN7(4n-ESt-JVG@9BOo+Y6Pu-dEcvhBb9|RuTVEFC9VABuZXVPDwxcO<3_Ctu*3#=Q(A`6u$T4+=?v7H6efI zhZNqTO&lH)=MEg++nL=3LcqD2hW4C?GyX2B` z=tti?fa%GvE)kdCVK(m*6#2Fy>3s0+u1;_PIf0KiBA!Pd_Uaw*TZaF^9;98j@wmIM zKgB5(O+5^EkM*F8SXn$KuV}xlyXX;wyAE;8f7yh!%;)xexeJr0vL)ty1X+ zo66Y~*0-M|=$NP7)Jx~uEBG586m=~=1V^gxUY~7MtBM?D_{&Y!Y`YyT*SCL3wT%Av z&x6dMX)RT#&G<(Y?kA<9S)->T4ne|$m0yl4CB`<8mZg&`jWQRlA9-vs2LAPHv0Idt zm6d4d;DfQTpxJnzX;1^#WTWS^Li6E-$!g-e)|QqC^p8rMk1)FpdmC!u^Mcy*j)aFB z(d`Qh3sVo);sl`@ur#5&DKoMcy&9ndZthOv_WD@P&o?*fu&87xBLdU+ZUR5*zCs9u zQ+RpV-;!{f+_0>FIVx51NB5q$*Q_I4VcWPeQ8qOA@#$3gI`>Q9#&nFemfvDu-#2+I zwsF#@vyF_2NN74^0&(UOC%g`Aaar^INFlI|?a`FwjxRh`jhQaJv)x7hcezf1OOrLB z1MR(lb8WSY>~1&yGJGK96M@W#fSIcQG%9KDCP(;*_UZZe!jv*Ri+_A| zb*~Y+9|KfV?`Ea1qi(Z10)AU9_HEJx5d)t7QAlUT-sN#$9<5+)9Fbc)qi=hG1DLSR z&*esMgyWFCedsIA0M@TPH3D&QBdyu7MBXEi|7)}WSdTrj9_0Z3*UXD`Dsd9`(t!l~ z>!g+SJrO^;u{0Wk4L-4x{`QrGVC$C?6X6abqCHHk4fZzv2XJ@Z;z95O| z&AUgcf9q>sxS9W@X9Cfs*Fcrh=}Ac6BZy(%mrTOz9cJHIz$I683acg&NW~F z@`{&|aF^pp9ud(|0DDEnpU%Z`^ki1TNoF#Gx=*&upZ1i`aP#l|6_wDz3;V~()$>@6 zS|zQp2Q{7u?J+PpdR}fp7^nMx-v->bQWD~bc%K7(y7F%PgtE=h3kR)mZXSOu@&7Qi z(dz29+sdG)Op0}VNdJh3>^k#Rf??f;F*tQ%xEJ@LI@?pt;N<9N8X@qb#<-&nt$7FT ze*^&N9stvWT>wp5XXoWU!d^6LTbjJrf`1yL--#*XwpP98J(RFV>)3=EZwNcN%U-=X z|110}ks`v3bBuu#AJyFoCX6RbM$XDYbr(u3hrIAhIvw=bEr<0nxP{5-n4&8w*>i|I%j&dGMJ@!elPE{{E+ z7ZX++%dv%Ee;A5q*zDxh4Yw5Mp7ZQ_U2e_c;P=&I+qdkNi*Z}6wVl3Gd;m?RV}H1g zo%vY!ehlVvb|`gDHhTbcsCNm-%{nWO5Vs>d>rYtAPUnSo5=9XJ4r%K2#Ml|NYQoXpWiTAHM+McUEw`zxt?34N(wcOe$FUZ!JA%DII)oWJ~MEnu+^#`gHjl z0vY~+-F-oemj@66@+Rj`KC*!*>TKd8l~SJ|TB_ z9j2Nm?^R@gu8y~gqO>ikslq3#S)mr%MrzY2lHqzYz4RoBM^eW6#LZ(N^;#t_j7P$G&yxwxIgWnePj!~(CBm4D`VJ?U!S$e zo6ldgQMF|*mpBxv95CK73fH6pv{zRqg4E?qAd|e#MJk_4-7UpibQ%^6Myrp=bwq1n&^1E&MV}-P-JKaf-VJpN^Ds|l@#F_~jg^n0R(CL}?3bh7X{&e|1fyJV z&#^}s{+Y4;bO1ft(k>f$?A=M7OCYsgRqt`*!Ua;Oe}RZbZHm|o+8}T-2RGYMyne9# z%9GH`(Pzn?ITMhA;{6888{;LM)C#^e*wfyL{Zq*LJ&es>L%Dle$lv~Bn0>|rgM2Er zaYDGTsK?93)G=+W`pnWCo>7U8i4g8x5S3;|PvnF;0T%T-v!~eiYQfbK;DcC$@#TA4 zL*tU?wW@osSJkbCGXX8RJQN*vn{E5r3n$vt@Wy!0vIipW1OeP)U^;g1Gj&*T^9+J6 zerws;eI@V6JgY>>b?n6cVDm2E(2M_W>TKD+00`Q2B|3_?B+HuIA2HflJr#ygtz>^} zvF!PhOv_d4we?j5=kepEa?Nu=#RFv01T@S2UY^lBn<0na@T*FR^@+Ys1!R}~DrOzm zH4li|H;AN#V=SjIM)zR?!cIffgDwG8Cxruv&EgOc70|BEt#j9gK{+<(zzZjZirYfMtfRb~zPBQq;c`D)pQ3nK#+E@+D z6xtr?6LOdJYy^WY_DvX&)6NH|ErVZV>II@R1(EeKMiHc_zyJ2u$RcW92p`f3W9twA z+L+AJq;@kz*t5J(PNr^o8=;Z%W6|9+6{k0Pvv_P+nmW8t7ntE4}An>{-2r%4h*fLiqSyWj$3qA#znN zT!AYbch6QRJCpO6CA97VAAxcbFZq&#&p@F@DnYB^O4|N;dv)EtB}3oQ)`o8ecq%b{ zKh$y~)c9j$)Uwl0E6y+>lJrv}HYg$Sp+PhPU0RGAC;bIj1Ur zR2yZoY4VAU0*ehC*M_y9AH~d!I2&Yyr5j|V9>qCsdpll+IDA^wG|V1dBl^@G z`^@oJCEB9IQ$d#Rl3TW+s6R-^%zb4uHR+;d4p^5ft^F#kfY0D6 z@ZVaj`Y2cQw3Wf-9nieNpZpvZXJRmS4?(U9F^iCpirHIsMc{y2kRt? zS{cTi8+&#?+mq@3Cj(&6Ok^)4c7C4goaL^YDf%sy(_kU*Q)@;<&JCr8^i>4vn0 z{(qLh_)MGIQJ*h%G8Z1RlD4HWOqiddNl~u3HY$e3X@#k z2Jw=fYr$3&vh~9H84iwnSL5$q@n3DXIf#2|E$dcPSQN&(f{#4*$3ip0SdQJw|Bi<- zX16(@w057?ZXN}czvoP)j27>lHVGz{{8I4Mw0BD|2%jebqCjM@(f6*%<7;&pO#^+Y z0R0b^$?_ALliSvOlG7 zeC(O&t7!w=18Lf7$q*gS!nB7@ccRs)$r_KelDMWV8)+WbKPy5_U6PgvAXAC}y74A*1E@7HXoHy?zxuef*~n8F^36O2ij?-nfW z#x%I)EBV4#iB3jO^HYCcqCB@1m1K@)m}p&K1@?2wq?yOeuq>^mVA?D$q2#f51p>s! z-VKvth95@oh?d@L|CjLpYXM9m0z2;CBY4-+23v{*0Q$te3s}zo0RJswdHuBmaFfkg zVt!Ze{i`n1JR0Jgw^#0VzY)ZVzq?U~-(q^bCxLbPlT;j?WeEc~Km1#o_BY%6<5Y6) z=@04}x^!9LHgroqwyE@Kh}RG`jC5#+_G{^P25NmGxwD`*KIYhCLE4C)wdhQ1Zhp31 zT3>!9zbyu4ALh14q@_EwnnkLtlyDI>F1%iYC^o$Dop$hK)X)zrwR5B_uOIHjizK4$ z-;=s(&+P+NSQ$&N%o=3}5vw-cAjMm2yF$ZH@tF{?F`{9`a2@$4T?iM{p;wP2grA^80KRd&U zE77q?Okvs10bRUOb^IG*kx_EJ4h>SBtdf#CwrG`-2EI@yvE0`~AS&go5>V09RIaJC zMH`Ih{S-5qxy565ZuqDuQ_&WFZ_V#?&wVwqLlLR$D2uV$J@5UiyOJnYe$LF;UM5a= z(lG`0ZbLqw{{&gcT9{SV-#0jyRcnon#BiZl1`=b#vi;~$JS_;nd^bXwAx*e&3ulMM zkZ*fm3ed*;NYon*j^~i4nhA=lsXGerCDz>gKrxoMpA_WM6;-^9mW3e2t%gJEaDs6* zfaD-c`z~5z1+&!6!yqG0$cZ1ylHeGkki7>+I1B(+)XM|eS#mFo+-6jGUAqnF%q8E;*-H{TA9Lk=a9V0_8hz_#2@{( zVrRWmXX*G)?R__T29~3ckIz^DJ&g}I=&Y7^UeVIw8z7A>_12kJjm&;wR?z&X;(S@v zT5iK%30*0a7H`CDaEfhgqm*n}g~*yR-|6RtNF=jPlZ*gs8n_H2(=5te+ovF~uU(8w zAM)@l*QFA+7G>$%DIDIHR)Pv9&WqEn>|R-THLg_g|1%&+u3@Sb55aH_RiS=g;j|sq zq_{&B;QL-JniDQZu4v`9ypuIbgHEg~uy%EX_7%)UGe1062f{pS=MA zn^b};9=iN$)w|O1_3q=8^WZB?#OkB`^r`cg7dvZm~%vZ_hPD&fLL&8L+0 zu>0zH_u|}%o^oAu`cFV(?`x3;w(%?pY0YsM^H$PSO^x}au_v#CQI;C)WlGdhdoqaP z*f2Akt%#u^B1l8s*ltXcDN$f8L8Ha8^zC@dvNSa2msEPEF341ioHAZ%2&rJBd1pe} zxo&9mo**Gt=SABOfc;wAxMqrVvx9Q(y0hmE2+9{nt>sA0P08{`_aiCwf|oZ*Q~)mB zX0h$Wnzu!Mv6!R&ixy@Ez6s#Kr?qPQWsl>u`MRV1p!qzudIx%05^VG$ub$x$uDM_9 z){f0mf&qs(xugBTl>evHaLafJv?}WC^z1OQmTxXw6|4)p^Qp}R=c`$BF;iL07%pHF zh5$nQOlv?4hlC>t559`t8-}9vZ|jqk4{iw<%RgR0oG&+DcGQ(fw6hL4dB)3*-rNvI z$189zXmLlSs%vwMY5zh9WrTCUV>s-7teg}U{}wOXbwfdZr`P){QEW3(UuLVjChH`( zG+2^))$+&7oV7Do|&SlINr$v*W+4!8#~riq59x2%-jGWr(Hr zAMAz{am3)3safi#sSZu)6{6bqvJgpr{bIptSLxk&atX|MFDNcpUC#CeAJke)qnCS5 zCSv7#p>TsI{gpB_9sL~85K_bk%S@5GsJ8VYPbhE4*r_S_b0!H|$f+o1s%=en!q?ml zmX^Qc+>K^Ml|tUa21Poy+uhkkcYbTbGqT_EWmO-6ss1Eqr#|m0d(A`9y>v*G9|EKl zche-TpEycsY2}h*e|T+?p#8JC3nAdWo%zT$uCCB;mB3f?2E}wO4&Bq#!%hc9xVL#& zz8|}fQ53}35j59XfVVTQ{e|7;(CeLSW{vng7k6dItnd%doDfQT9Xcsup&&n%W?UC8 zXD*iemkY-f`D^S)nu!G!1sx$y$;(xkC#}rEMWOBVi~hiI=C+pAOd$Tymdp5MDkE!q zTimlR==s_1Tk!EJFg(06zLXfyMPNg>%UhiW)65xNw9Y}05HzwQHrY)WIk3o59_!e< zBXV@udGx3@8Dq!g4@7vgs%4`%1gPlJ9$%Kzjw0vWn~-X(CukFgPPQq@EbnX<>wQ+v z+3rr#l%C43k{PU0T*K#N{tuD!(*+bHA^p=sr1((PmYv<6dOShUP3tHNi%(F;@w$P_ z<$N1b#Kg^k!+tCWeKk_UVlAHdpYfm>EB@%0|6g_iT0n8vQr5| zK(T)L^QNB(-lZf%WBF*mf}((c10J(^MLs&H?DC>tF{?4(YbwOCYZTh5jdb(bSETYG z^z|qUOBk2N6LhpbBn8h-nB|X{!sXvZfHKn4#pX)CU}Gi4u6lgZ5R0+!Yv+uxrEg)} zOBen*CUm?Oy#IlkD6(1uL~Gt+(O7vsX5e!fOg=PNF1AJrv8sWvbLu*jXQ`o7@<@t3 zf&4haoVHBxuT?rgGB;2PWW4yypMGF-hNPP?T(udhst%3TkMM#&aMixvTV09tKAKQI zxNqDGK{@PEjR=18TuifOQtNXGe78C-mZ)7_+NftjtGUUNTahE)Q8tobhTd*K9m!W6 z<1$uv%5Xx1A*I`>)F=c*J}r(~{`Nl$6F-{aY9q%Erlg6t)2MY7d2t=kK&IzUKUJyn z3ePl>jI8GxgyNj>q)@BY(Q|F}%lgEH)yL;l25I>3FQ2g>psMVSk=OQQgHo2tA=`I2 zp|YG*D!+c&MT#7UR!`?0oHYpr7zP%9lvXo-PUrU$JF457c;-O$p_h1|L8#_0ywMoM0m$q z`_eEqY#}Y9-#evM(n;6OSveDc_=|ROXfMgHmVhXX<^1vrnRLk}hBC<{inx1IgpHWvsZ~3H{U?#K;hiU1Ic=|UshBsw z%HJTLcG;;~&bk*tnvTtcUp>w|<>Fzy`DRkQWjZQRoju)cjGxXgU!cc=Tp>$?4}0vU zb=>{ET9J~1k_JkB$}EFkIgh8H97JWdB(XLen}6smh(Svu)aNECxx9ew?!0^e>iy#M z{vAO9XvbSd>+=G`Y4-HqF?X*}(KU1fD-H2fQ{lOmhsy@fX9=z5czAN;UcZlUun%Vd zY)5Otv%csM;Dwe*-q7ArT+5hD^zaa7Jz9k?=7$tW;z;qVJ-hJr=k;uv47kn<7>et| z9kUIf``+u3 zlk#-e(9xg_Q#VbH{MiVKRCdOr8l8?jT5qt3hLb`_|2(T9hXECI%iBE*N0zYDUY+{a zdYb4)F(JQy@05e;sla9=N+~{MJ~i_A1uWIjA)3GsC<%rHEDI<;JnM`F^7*zpl@9A} z`QJ%}w#po));4nt=7o<|uBveXSLJF;HHo6^gaBw7-e|8JlOYdtI__w zvZCCC)uf+ta$SP=XREdh>_L`c*Rh2P>4I@`YGBLNCMuFAO|)Q$0j!$p;OtjlCkZT|P%=lG z)$B=uIrf+eD?BiExv*2X36B6mnanqe;dJIiIcke!zz3_gW@_Tv?<3i~SI#%Ki{+4B zvaMM{;Pm*S(#bzL`Sk(Wus#O9xR5ZG;e1OL94spXA-5sHQ-5NuV*LDRHMuCJ9y)Qd zV9Wu$mA8D7)$Lv%Of+qWcFp)k(c`e{Q3r{hcMf{xP(=(~)gdil7JPFyj=RvmFZj5R zxg2kKuFBW>y-oU1rn_-&e7RF((pPxHKW<*gOX`bPff&qZ<5QPRHoYP5bP0#q(a#KO zU^?R@WRsp2Wqyo77ylePps{=<&nQmm#S*LynYeKWhdMhBi4bkv(OESX!l_PuRf&K0 zD2WZ%)7EG=i9e~2CMrTo7C*JYqfUtQv`G9Ozo!k{C}w{Q9e>@ zf*3_?;JBskG$nRZiBTknR0RjPlpYs9k)UmuZJ)K0FhmuSm5dwgRQ%wcMeQIjHSM`2 zQbrYRC6~2%`&H8oMQ3ZSieY0g|BwjI+>RJcGCQfu3Yx_2%F81mHPU4tsJ_WO!EOHY z-#28U!5?T*zxRjNLlJGCL$!5*=2`^%SMnD=FJlTx)#aLjNe9mR)M-fyZ$B+!FM-+G z+bd$Ak$H@TYzT$H%at!TPYpVFn8cw0VP`;o4$y-8!>_Sx>JhN}-DE`CpBCDh7$&5O z>J;xCFXiAH9N9F3Jw`Ti#pved%o&4_#kPO#*Xy6@=M_@rV%t-aMkL1hKHE3}2SG2s z^OX>0mKu?isBZahWEW^b_6`C+)Ec0?S2)#6I9-PLp&B;b+JFU^q>- zWLaFYRuZYIrNEP)?DW*p=#?my+@+GsK(uoSerejOhU&dO5Xt8%T7WomRfHSR{);Do z2=Zve{%1Y|8<)>YFXMN zmnzSEsZj$u)TGLf)eI#vIDto4to0k*%}K>{gcRERcLLv~#Dlh3P_W$~QWDqP+jF|F%^&cHf;mocg-}X-=3RCdshb_yki* zN!G{ov57{VIfoM7Op9hR0kEck*oV=XvR6qXqF-E1M!fdd&itnp~ZXZyz_wi021{`$HDyo>Lk^lLUkOA*Cbu0(mp)@(=+?Ps~ ziB~&~nb8?*sGcZg)H!=^cK3xHnXGS|y3cBoTm@129)!XzJ$*b8BX>qEvMSoLMRoU$Y1Eb%n{->nbO@%>}7=&VsXCr2)fzbBVQ z_*2U~>BJ#B_?1NMSu_yepF93Q#zFD+V?S7i2OnHrM2FC_QD&8xRwlXr06m}z?(J&r zPDcAX^Ak6xKcBTs7t;x|{lBVve$bFvUEa=W)DhP&WcwWcuFX3pBpi5JU=P7)ql%yr`;uj;=qF7JBcCB^2Kz!}>-@eq~xWwzxFah7W3 z$}fUp?Z_pqd>bG>cWv>i!7=aki=@2RK%86i;7N2nVV4R&P1b?@gm!vK$1{PN0Csf>@ztZKD;2KEt)Wp!JWLq^8#1OGV!9;9!^7$}$R-SCG1A&kBAX;z%~H=a#f$yM>@#!#gb&1O=VA-LhBxp1 zvJ)*IQ6DAj@B;t|`J$B^rY8Mh>of3Yz zu>8~*KUM+GPP5XgutiCHbkxlB8hjy#Tj-EC@~KwV9Yb9w zP0J!<0yOD;rguY%qrkv#7KZTp0XRio37)Qlt(=Vk+Daaxv5!nX36b1aloyf%gBDc* zHk9UK2Q7tJv3v@a!CZ+vr#oa5>_KQo~eUwG^_CUn{xyd zwKC(?J(}>L&BD_bu+~r4hz_-o0^8|HW&BszQaGWYj37<=)y&Guxz$S@D`vI+O*g1s+D%LNvNlUu4HYnWp?faDQ>EVFSs~1iU)tFDx73(y z#)-v!c9B>f`56m965U0DEp>VH_c>0b!RsZmw+Sy5yECUj`UCvQ+VcGyf$!j?dRC|Q zPW&x|_6fDS6btZ-6DSAP2M6%*!Q?9bHW-si%F7`jKz!{8-_N$rjVq+`(~9hThyTk) zX~U6;e`eBiH-4Lm#Hn-p)t2TOBjz`Di=9FfI^bq;4OSe8QrQ;~jH>ACE|%wk=Q z?$t-#_|Qabh6fhHW5hQ!4JR%R{I@oG&93^*1DSz{z`?fpOFoO$MvGOkXGYUIrUgq5 zB2ilGmQD1dGPqcvm}hUQOGJ&f%{&~eZu=XbO=tmves=hJOhIh0Uq4f=rT8@cm(J>7 zD(Y#P7qF|X=1{=-vWPTWo9<5mPVc(g>X1ZOA-Q@5?^_4K6$e?h7~6kBy)|hj<2WV! z%Dxv}t5`pYZnU&NACS!7922(R3~eea=g<4u3nnE9PqLZzCj$v-<<4#U2@H81RQu1` z%pCdHE3~R-#q7{ajWUscyIm8g`p1Hb@B6$8YDW2p{MXlxra+_6N{Fn(I z9`{+I7IX1mUl}<)xC``&cRp9EWRU$nWG#S_Yx0Ox|+TcixXTK7AbOx(^HSm>UV zHY_r^v%vxR6#i$2qf(8Z^$L@wCcGYU%NF@wgKV*5>09+# zRh_o1G7z(2(`x5!J1Bi`GI~UP=PWT5H^vcdAT|~wcgN!OpP3E2(8)Jr%3;}D7QKmF zXJ%fz@@nNC)u?hfMH9yxpS=Etu8xLP#+57&uC=r7l!S*Yz*w0f-D9MG_Q(K{Z*{C*cE zAoOH`_!@aB!K*LNp91<8vl}dcMY(u%#XLZsS-(2fann% zAfj%(P^PI2v|%4H_+8VNA6%N1@ukHUGlp+Lma!{Jo#)qN`W32F*$Q8ucqBQB+s{F1FHP`l-$Btv(&eSCXCw!|q9F2?CtyM(B z$i%lJjea%G<>lbqJ-ik}GVt`vnC$T5_LT;ZDNRwucw2i`PzZ(vbc<3IhTZ2JrM}L( zRDsW?>fxkIR##<*c^)#xH2uv&qxV)@rO~^BpeX*pW&t~FFZ0Y1!~z-qt^frqFgLFT>~lz4V5=+J8F^$YK$iiydKy^23|)7?*BL6w|QUzKvQ2I z)+t(kcD^E_6$_j8|LX<_y6W7MJoTqP@!RWor~9h=s_Ufx%HQu1m5&SX+n1-8)75SJ z9rH1A&%5nxh#G?p)fLbGQyLc+R}D+Veg9plJJ&d=Q{bI=K?Q-Z-(7@e$an+cZ~`s= z6SB)!_}9(Um%c0i^?*BvY^}IerE{RYl6sVyk;>_Cp$ZqfX~LlmdM3(>YlU2WFWr8 z^Z+&T8st_vf#%}k0~si`UBFBbHQX7S7@f4|SaB`2css-GpbudTQbB*C^J!5*qsCBE=HcBQCs zarSyG2=G2e8U8xgleirz^16CD&HkFey4>9GoIs5Gq2uZNi;Jtrt7-8QiS;ih4_=4T zKAbh(Pf~8jf@eQ?9&tOL9_Z1m*|vX+C+7bCl5MwtDy6YEkXXIK-Di9ISGedp`2Or) z?xGbH{TV&?tg-E>Cx3a+-L47%Kt*9@Q9J=>(!Ip~I*Q>tJB&V|bcG@z^w%nlgk1r| ztolpu$XU8?o23Oa6jlZ2Yq~C9Uw0>t^91tK1zc~Qj&auBU)}#*t~dAE|Au=OA$@2_0CnHL+uA>%wSV>&ht6xm8m|bC$NNkzDML&Ps8%X+ z8(Tzqf$PR`uitaKu!t0DxecgEG27Q0L#x*(0HChEKA3C#l;`oLr+4g}V2lsVN0W%- zG5$h(dAz0{dDtEQbSC`7s-qi@=ACz53iiZgJKoZv>ujJ3%GCQm@EtoIBGG&ldcbj+A(|;LKr9_a(Q}=VWJzU$%39i>J@LYQ+#Qx4%BZ=6 z*<2v+*LuRW!F`ie007a)|NSq(t6#Tvhwsw*zc?C(>^-}_U^RIGxL$f%GA^qibh=K{ zy_RymL;j73q|AR@sy#T`))dX$L5sr=pvpc`!e3QgBP)xX|BCL-ZKZPJ8$sS*pV?pv z<~X_33I$!A4N*>!pMGWo zHkSJ}zaL4W>u*=EuVbIiDbTb9FH|I&+89ly zBbTEj4I7fX&27Uj&-b&=Uvc)^o;~|KpM5^B&+GMhp1ohMzkc(_q1gldq-(>GSDO%; zc2qnzD0+e-n``RRku>)hp1f-+aXl~p0$p3*?P{xJl+;SGAeImEi8VT)3L03z+c|sb zeerIDWs{q4)Hpaj4r`_5=$%oUcr$1tapChYD2n||57g8nO?gfY)TsxYZSOwmbyCRR zdun|0x(;M_>Ud+&G71%VM`?`fcU@7`B+<(Hu9QqTKiPBF{ugJgRnF9OV1_W`8wlNy-XL+SvOo1!a7bIR9zbcuMq7#oB zlb0Pa*A#uWBtsXW>~|Vq6*(pzaQFOOW%ud9t~2M?;KtwAwc>AV$w_tt{Z(VD2_ysx zGAQqc!9>*3n_SrB)^^UMsmcrkR0DYoKdjBs$dRbl(*QctshM`a;?;#K((Hnz;dj}lBs@h~rGb(M}9Zsw|KotxWzu&}#Cerp> z1geok^8R3xCa=C;HY86BhbeXXuro5Nmx1~H{!CFqLV_;@2@3?VC6d%R>w%?m5@2|G ze|7Rjq7tO<&ZU>39i&c^@Uy{4Heo;wisEuBAu~e00A6On+wgF5PqhPMSY&%`Hcdo# zU@Yh47j`)bSa2-;3ks!u&~5tb2Ov(mlQ_OBmaK$gUUsznRAg2Zn2pRdaNqQhW-hUk zj@$;SVHF`52-S(Z-Q9h<@0z4w?-0Sq$9@>mZ+yny#`?j2M5do8cbm>IMN(kG-$cm> zU$K7plh=lmr_G-gkTu4~1VSV{(f`?s9OcJ0kb_2^(P*X@mC4`Ixq<^tERuNUlX>9w zwGF*;6iWRBbZJie<&LO%-O2{QT(?XpvhEx14Q?mg8+frD-jjLM%BC3cK!z3krCi9N z{Hi7!q10wp{rKJ|aj#>^$59sch`;iK)GX?YOOL<^c0y5_fuC)uSa|$4m$rK8HY^Z% z4CN-uR;-w)N(y`O++ow%8alzRaKwCJvre`FWdc!sMf;$&^+ye-HJsa?N$)PkTc?`+ za<2KZf1+fDvP#oIs-Eb4`D#d8m$ApQc|7%@7b3IWet(>4=IU@QmO_|Q%tMr+hUOK| z-ZsmICV2+QlD^2@ert!%hAOb#D(R_r*x*TxXgdUU9sbHj zDr7nl%-I>;+KAZkYJ+)Idx z#E`2N`#6pw+_e!~$Ig{0z7?&pm9SW2e()qi0SlL-hWsk4eHKa_UH`ttVTN#?6Ppgc zwT=!8BkWe@Il@+K%$65+NB1o=+(Rc6ZAbM!&E*H=;xB-8KoZm=k*sU(X-k4SNujyJ zNd>iqG(w-!;cc;!I@a^)JSuAu2YbIiA`U$+6%WK{&VUn>PEb40(q@a~B|^mb&Z_}v zbYYNcr}wYM@*!4VqCx6xg>Gyjrk@e-D92HfWD@akl7w(`Qodj)ZQ}_V*Yaem-BTsFWkzge z#^Rk=!!edJK~AAiyT`G6L+&+^!QfC$c*}7~iL!riu@UK>odl-`sYX;=jjw#OjCGxQ z;uK75sbS5U0IeU+#i#+{Iq;6yDi%P{Gumx4nM9&>L@VAGx-s-9X>In>YMEeWeGIvIf|Q5R<_1@UF|(q0y{#-DaT@QF3Z5#487eA+Re|1FRS{(%`=3Jt}S$Hw7z=I>pUt7m4C09 zxU&(Bj;PTDMjSt6KIBuq97T>`w7;wfmf7cj0S=mV8qnq7r2^9_FLH-Sghr#Eo$}T7 z*~xs}J{hLcn=X^I)pJczdUiKWDw$ms#R=?jGb)WC*4{MB9K?q8Wt|KlJzHB_>LX#$ zYOEN#nJTV=T3P$6i8m;4eKxXP`s1s%FaG0LxlMrxG*kQZ2%pcda#tl5`+xPW=FAaF zxC3|3;9q676xi_j#9JB<%Zp*J7bXY4aDU^|FR1!V`$Ui2JtE`L#diLx)@HIWd6Q**YO&kNJI!nt3~w37uGR^{tn_+ z&|=U%C|`>u>l<&Hp7y4CY|1JHKhncRDCKI^C9sY2ppxU#5{dMFQ)2>h?eh=lD48yP z^kXbCiO9l_-NzOnE8&!0*{g1l?omxuv!yJrvUR+o>F*HFXLuWQRF_Q@$=c!vpIaz zc%+$l+v;dfQrgO^Qi6{RAh5Iain7CE@?)dmt^I%4IH#Mt#r?Dj&}qLQFsd4IRwYQlOuxPL@_ zELdP(B)_>2^EGUz{~ey2xpU1ZpRa!a;CfwGWY)SvT2Fu)K5 zMGLLGdaYWe-W#`v8v>MmXn`yf+E#^l_Z!Nm{}O+Pl{H(Vfjf0Y6@1TA^Sl zC*vfLj@1#$?Z$7myb@L}2XG1TQ@(iC3mayeatRnno4S42g5G`r z7?;qk?C*sPuMDX>)Q~CLt^zf%wpInx!`GpLJ%~R9Aes)WcmJ7#|B=3jB*Pde`vJ<% Snc@V2*N?6qhiQj=6K$YS+$rwGrBI+qix;QG-QC?iXz}9iR@{qApm?FUTX1)WK=ShYzxO7| z+{~RxZoa*{=bSzJB}!RQ1`C}G9RL7e$;nEp0sx5cw}=4LxA4QQ_uMl8fX-?2^{cYn z*RM3nu1=OV_7(tu>~LTLpxKzXX?|LODlxi7M`=fFJ}a;~*BmH%;jdqk2D7+|jXr;d!*Kh(<^V zm%iFvh|aT9JVA;mu>2C8BmdyT3;>NabXPfr$t^bmd}MdZv=8fZ zD_P~u6>beI=B(~zh74dl9%b8f6T?x99yGxL7+Hsy&I$m6O3Ixm7eO63--S4% z5XC#<8eB9r)9}*!x$%i_abA@oK!tTZR`eq0@z+xZf>+;6qJuuvlCyCzd><*ZD&f(g z=-A4Sc%(*wdQiO;&+*32?t4 zY!(|d=fNr#c!t7^jz=>M88mr zd59kdCh-dp5M&Wq6Hxw&Q62)m8o#X$;&4WC>?MB;#l=O_d_yFQR1t*JC`Pq}gf9MZ z3GF_}RvCp%oW~k@Se!`!c_LI{ldKKFF%)7<_$|oFn5gS51}>5bEw^OwF6}#6f|-bM znz!aS?czPkxP)kf5@@(M_!2%-mgOX@p_PTc<)qJ4pV4w7YQ;jQ46HG;egsBr^r3zW zsi?=VMkepagkLZC>!yY?V%OV=aEwh#XNENZb@-Rfo6Ap+d_w4=p$E7@xOikm(Ij-3 z1ISl0MG4+v@zpZX3FsvVHc}mlBD;*-(c?5uDkOx+QZl4P_9}Vh%7hrrZ=0z!LMo*x zr9BFKRrpoR%5~;scu8v_7i3lox~K3Ck=%(oa1DYTC0dI)i=2v?rs_VDU}6==HT>~5 zrTZwC(VT%lF7l0hpTZKC=VxZWX~VU4KsDt8_1FMk#x~lQ`zlydP7yU89CQx^IG%pU9{1Y zBpy|777i9-mS1ze6=W63s_#|ZW(aN6Y=B4VNBBqYXS7Pn%QX6%c+T!JRJLQ5w=A_9LghZR`DHqx2D zPRnyj^lSa4eRRW%OzZw=uxJTZU8j6d@G2^sVms=-)zOgBP|_&0?LH1V4#{fKE!XYQ z&0hKH5%T$~uwl1;w@iTMSE+ub_e#Z5J9&(T$%UEa?OIJrZiWhaZ2ERpnq>mV`s;n;XCvQF+>pBHXeWEi*M5ugoL&94F}0jB^C#tywa z)?6eX=}AA6T9UPp{3M-@^^d!b`y7`?Zbu?Rdcl3p1GP3aNivBKE_xHYzSKE1v9a6>$Ho9>c!X5={>V!CD3Fkdvh9a@^o0B)RjU6Jo+U8r2J z4HLIO;*uvxubEz$SRk)f(g8I${Ki|NXnp#(FvYigA9*(CdbXFd7dJM1Hg}rgdFNSt z?+($1ytyyNuEhQp@it=k=kZVbVa8!OCWA8ivSP)_-0wM06K4}QANW3;=ufoM)l$_; z)xL4$b}V$9cZ^?~Un5x4TeA{o7h3SmxsmjH_CCL+xKh0~_4(xY&sWc{g2MIF?kiyS}f2Q)dM(Ypj_v@dW7cUzxr%`tzJ@6Lk-qE!u8mKIl*O&h) zZ%=h(d#KKdY>E63OJ!Kv&FVLwI*(qZrkVdUG1g=#CsJzo$1qh?z~rqJAJ@Tl*S77B zrOt=y?rJN08BamKEVE&joo_>{gXx1x3`-2BiW!RTvemLVTOH0-?VL$M$;V0i$*;*c z3_y7_B^!mo(xG2@yQ7y$KHWBdZI*39kDiahkBaT=7fy9}#vZo#EyPHxxI2*4rzh1x z$}(+I0%}FrZ0skJE$)1rouV?FR(=!awSMQVb}Du{c7E6DH+*|>HEz0EASzwz z)*h?S=N}d+mFIw6C{9eS&@9f!0z}pR_rOHJKMgooVo_6be zbA0D5!DsucRV_evQ(^-SK9*YMK%+mb?ay&X{Hb976+Dnx!Ca#|OmSRsV`9qyyAwNI zE`2X8?&5xRT}6?TlNH#^WI34{ZSl^-56v&!Plhdkt+SH1(o?g$PO-YjU`Kyevr4iIsONvOMdsx(+R#j*n2R$g33O@awq6-1^p+ zsbu9gIgzU%%I_w!_2RAcZSoZZkJ$0Jo9_5-1laqtd1s$EYX3f(B}L0i5u!bx0f0qpQ-0I zGHkF6tYG*TBy?-LT$R@z)Gkw}X2dy8+?@z?d*s-00C!$`C1dDZG+eNW9tIvl4{xse z%I1{vp~!DCZeE-i*Kptp@~x?Yj3i*_zlS#un;ZNLnzO79{D?vD-wOedl|uqQiQ+Ez zT?%C#5f_7FR$#;`sgf+5S5fX*8GbE1>ZYnflDz|)6+nntUdvkK@LsG%F{SJvQK}e{$ z4C2O=Nf9Y(@-6g#2`g@{&bt>Vx-;BjuVUL5L=F-@??O73F$9DnE;>aQ4k*loc6{<^ zMQ^_Xzh0qcv(hx)xrJkb>K7{!agAU3kkv1b&p2n42obM9)VF*0xq9I4W~J=><<@L| z(SLp(+Zx&zOaa58A~5mQs=7eD6(!X#MklX7OalV#kR|!z1B9G3f>n2SpL|kwjLsrj zV6rUG50KnQgUW4~Q+D^S6i+!Lzcc=VO6}trM>L04(;AOvoWNR$o%%fNwLbfHt{Vd| zDg0nF^4_pxb`r2LXf<%xa>99i`0#V(X`|ypeYJ#~ z7vsIQI{K+EfA#*N(FNwzEka4ZF&Hj#CG>Q~_TQ4W?TjEj z7fQ%L*z09O<=GZ_C`eNbod&x8o1ouIvOY0+RNPk>N!JcXyNp=WCxur`Pr4uc@hwaS z4YlP_%DC#}V*c)93vy4+H|c8;)D}~5g*?_gAhgu;_e#93cSG^4Q&T&*6U(bt7apdkQ{-lSnH zzvw8;ID(-b{%3YZUt|hyJe$#a`zvv#_5aAcV{%YI(lT$CAQxRpOVl!aYSsYUS#1D6 z;EZ1eYzZV%#Gb5>yyOR*t1(rEN95oLHdy9OXlY^?um{dpStV|ZH)@_8c%8iA$goii z(~JuB#ZQ>fQzH8>P|ViSDbfpQ{k-qKS^RONMgV5XSBKi7g`9aRXsV%`b3J41F?m;Xq@>x@#!)!P50hSl3klv zW^RA;*o;B%)EaFQcJ45E7FLvP)%FUl8 zPyjJtrzHFrS-|3?$b}3`X@F$}J)H{f>HU`!)yp-v{98LayUbSyuvz)M5a*dd^^|yl zEnR6HFzY(f^Yjx#;E#^nP?%3=3mQO+)4@df+idNFed*Ui2bau)Qcigu+nQH#o##Kw z&;7K@aqqTLwSZV=Hq#h1>Z9}I51~)AX&R+PJ-R%S1|_>;1)znH{K9uPYeeN;n;2xe!{6E-_KaX&IzDCd^pu(`RbBs@@RCVq@$g#Db z_xqWlwq@7lAEjSrv$=3j0LP$=Cc4ux6xR?OP}LnEv%89xzsq%N(lC1rEGU6F*L<1 zD>n-HovkeC?9y;DtnH^-FyX+R@}n+%{Y~1-Z@wHckG`rpsPN0i#p{OPaZamU2Ee-) zp4K7pwo)~N#O8@BZ+c@b1Pe3=uiC_#O?7^ADk6&=$$hOtH}u)l>i&}yXZwe`Xh75& z!AZxmPNMWTO0?e&%Vj$1ON|WWpOWC-+v*hn=v`Gh%S@^p-1q0h@(bhH86BuvvUl#2 zbP*|%m6MZ1^1GY-4Jlm6`YDP?xN{?jAhK+F^dPBsScRgkxWaC|M1b=M!#o3q&v99dpWYwWJ`f92M zRhw)^g8u>7cY>hu5)$b;0jesLOCo{z^1B)0jx-8&_84))QqEqyDLaj|o>#lvUP6no z*B*D*RDv9OnjYJ3;~#c@^}&3HbBF;#i@y^%71WU`?GUptUy#m$ z@qJAkBWD!d{wEj?csKGqh~H_5I1secCL)JJRd9CHWVdWlr$xO=N)5ooMlV9=>tAxJ zciA&HJ#nbLFi!g*T-I%c!ld#J7&d*p%|Ouoil}VMmlmtKSFwXI?G{v01!dn zV{@v$ws5QMJ}IgEzc0d$Sf*W7i^{S`RTjuVF2ai(-QxQ4G9Hcn#jDlvbz8b|Rj#4A z=o`V$;bNd=RXJPpM@&T`t9m`yQK&a3=X?JOqPixCWCRPx5W$}q6@=6{qA(d7-GGqnbrM3Gm``!8#4nL zeX4o)iwXgXG=G19WA}@K_UB{wjfvG}c>u}the6-C z<7Io6Qk0Q5`%j1BSYmZA#C43exsVW=9s$zRcGGh`hSK@a^(8kWPEFI3f@GX(#I56e zn1S8kzidu;er_HdR;2&5O~FFtyy#~Z#*lS=)zxb=3VhPiZ9Ye+sC|Yw0Hf9wRcqgU z$sxH^MK8gQM1L6etJ)kS2JQ!o*9F95i#x?&1kK@Z4H#!Jo<3lyI$ru!`5Oj4EovRa zv(5YDy~Y;;*x%Uqfr=@@*3{)g1ftf_cR9N*ea3H27c17A=HGO>&yNa$`-Q+a1&bn0 zw?VBZXZ10(sA*y7_4N3F9{-br_J-!3bUzv$UxhwhhZ6u{U$dj(`|l2v7@8bUPc|~h zif&|^4p@+CpPmR^9O26gTJF0|zAvB64^%yV9M3EUZJ!kbAx^NxxfR#%qrGGW^eIPmjZ*tJBzbn;evBPJKQ1=Eg-xe37*+u<04}z&AGx*b$_| zX42Y@>(7I=t}|}G1>u#45NTNUD}2N8xTRd<;;yw>#}}yColdOb#?DyReNWD2?OSD4 z(}Mf8fGCnTQll#<65z4P+r&Qp+;e~MbRfDDlW1`zNE%6BfE8ZS!6|=C!f6hTc#s)%qogPc5h}c8(*T4_m{h z0u5b!D$uan0w9a1S#@lUWLnP)#d~gBUcV&6RA)IDdn9W&GY6r6FhtjhU*#9AjwnJb zP)#uc@*b(@1vY-wj<^nbVrR0={5k7mq*&8AnUG3^8<9aGsAj!E7CLhtL zIXn1JrN6z_^SEu5TQxoM_q~&Z!9Gi)0&AHn66AH_;y||;d58n_gK9|7rmm*Vk^9wl#1Nqw2YDuG=~)%OAS(9)Lf= z&{ZI0SHd%Ca24Xm#1r0=VgK=hl(ltmci9RSBmMy;qAoOs85<2Trj@JZo6Q2G`j!b1 zSR>PQzXAsC#&8AJYGC^34WUnL?w~MebM`zo;VAYfA3cV2kzQ1&zl%oc&{d$5txQv7 z$4uEw)#~9AyS51Gz4=6b_ez1JS&lRa!~Ak^aO z78Z119#p@+4v~X|g>G)oJ2dm^Z{7SS0vrw_X^X>&ywT(@A9(*%F?e8H5&S6ox0oz1 zE8DqvK-%WAg9yCh3=CW7sM|&f+(dB}pl}wVx|)P8Cl3g+W*kIw0-uQ0xc&Y^lW%~M zZ@rCT-z|6XK`RzqaV%h>1I@yK>tz0`+gYWZ?QKL53<8S(;&r~MVDyX+*Wx~F-G0P$ zA)xz3DA~{9_kl<0fk$}6%`!M?dT2;m8FV35`LF5{IMR>4VFNn{^T1ZV;^{)wosBYI z#7oBzSf?E3#=rZkc-ZMzhQPBdszf>G1*-!ZBYze9cb79T10g|^g|53U2bHxm&#Iuw z(O_iQ+gZ_PL2U-b&u?MnyQ_ima$(h=mOGKi&>JvAO?bi?tSf3)C3Y0zI#ivxeV!kT2h?LYftyNi;rt z0N1*nNF_L14BvkZ(fh2^C~*9q?(vEmw!^gexw8y5p5MMm5X@9i>Aja~b^@anxo?O!Xo3clvkXF8U)_+b`GY zz(6Sp9-`012;v{?A689b!tc+|qctvL2JFRaP%7rz>uBkL~%8_>Fnphcei$!OOlAbYJi>zg3i14~?TH(U9@jD@2y7mr3+VD9>k~ z^wjgq_)V-65VE>-@zB=QH4sP6Uk|?M9I!mV@3P6doKfKHc0w_Z3C8;?@;nU+gFIYp zI+vSle^jUYPT+7+k=w;%mUr@%b)p?5DHP_XbH3&6Pd>ckRcmr-BqXPk2GLIQ6QJ1m zv)&2g?77KZbiUYFbQX9)NZX@I+rzf)1}Bq#pQjqDr}`b&$9ZypQjl6JSL*|VzDD5B zQ(5?34d#1tlNr@{zC1Lrr3AJHBs@|eq3-=08o{7XjF!z73w0vIR$p`m$O8phvRYGEA7k4!utZA z28AShwghZ5HziyhzBl3+xFP9A&~Ow@J3VvJs(ZVdl3?J)>c8y#p~khFFe|JJyO6pj z`zgzhDX9+5JQC5i=_amzHOMfPz-Mv%UO0Z%6)Y%>okaABg^$FKSAzrb9rO!N43%!4^(*Veq~kH&DxNeQ%H9e64-Qp^gXN zd80M}5w~04Qd;H$CIh?$_YV#tpKo->zw z4EP8KS9s-Vry&E+Ctn3$c7QMO)DZEPUYwU3U%)B^bX|aAyl|J;z5OrdI%H|C1PlZ5h!8sAng$x za6tD9mT)72o~dODx_oYCa|?WX8}(I_TF^zmS_r!majw7F1YB*uaa zd4*0(6M=A6;ho)q02TO3%wY{lA&kz%4wU_i{B>Etz$U_;2#|+Le(8Qe*!6r|CxTxz zr5nSL=_y?Px2}2HSwKh?ZsPn)pHctbM0;RI@lcP+BS1t_p;EHRlm9eergs7z6@6lg zcYT5e0IXtqZ#+MtiBXN1CU9^~z8l^_XrA~FmD~;#-42dpRb{{7Y%lg&x@d+a9T8OUG-tK_pFF79{%E}B>H+F%+)OAdyLd8Jl;G;b?<|1*cjdvmgHSs_t-f_H-u464 zV`B<0ebg@q=U`C0E?dvjKd0>zBiQHv3J|C*a$AVA1t&vb9B06h!sCdHNC;EDKmJ(b zWW7Z^28YECntf@%IT2w(T!SY+7&~5HLTQAA zg&qTb8lQ*zLT}K1_$>^eu#?Ty>ffPvTOB#to^|$Ir^22RX~8l#>fW3V@%iGi^XT&J z(*&Y?kjw~rfVRzF&EPAY##p?D2FvT1eyV`zk3`$n8s(mj}!2y>w4TiP%9!52d7Y*%^0pDjW2{_ z!lJNV4#Eo9la6`JZrVl zW7~Qqp%nJLY!k^7%YhG6?PQc)sEzwCp)KK- z11e;DX|;6c!uf;fr8wZ7hQT+CoQRW=K0rlt-@Cd(IS%FUxygw!k{1qbm#UptY$!Ek zDgJJk@fXJroIrY{y6+pVHRj~tIqcd+5j z$@Vxi+Nm2{d5R$8=O=vFl+qbApRaD_Jrg` zZ!^F9f!Z;EcGWiFu*IG2L3WRxFi+z(I;KhcpSHJH;u9r|ha4Ven(h2$x)R(Lz z5+!<922J^D?bLlowBfyjwFUxGgCX7E7^lFS?D+6Em$$P(s#2jX42@aV3yOVS?$s8U z@anxI3PkfN3T2W=cJ-q6%_(dw7Fdy61Hede1BL^CJa3>6PBw zr@u$AMO#Y@0gCXOebPILWy*Vm2EwY>Ut0L8{D)O$cZ853W*}hBT6)?GsSC$=wDh1% z0TBb`&eo+SUH@Louq6E-{~q>7H&-{-w$&A5;Hgzv(t8nLb;+jHVp1@?XZZcFl8!8* zUnTySgBmL*G}F|JMu&1V+`jNXzZZ%MsPQ`6%7l=q3Pn!b%9}l ze+jR#fVQ@_-m}%#kCQwb{x{z#uu-~hCcb#X>kaMSRbAi|O@mgHsK`7BtU)eRrtdN^eKf;6gNb#cd~ z*5d$av&#U2B&NCtjx(_=F%blwIK6VbtWCb=h~nM|`FR3i(16niKZk7;?hoJ_aq8y2}|(Kn#uZ$mb(tK|8S_SlQM966s72*g|MpVy-qWm`}!=a%Qpul!) zx8qLNWrOR&Jl|s$|H%h`oc{^L|1{956DSU@jo=N%&Od(eH|ImY!HvoTwIIsrgxVO+);`cq+dh@P8S}ryieDV^tZ=5T$ zLiCUxKeZ<_xCL9I!hP=a2Ji(zVLU-W;+tMQa{N>_-ycJQ2=#!!Q7PR+#y}ohZV9Jk zURGNyHP!+KAQovS{b(H~f*_kAq9AL$L(Tt2P3!zmh1AdFpEY|U`tcsl4Yn6*K&vG4 zuU?{e?UM`r^$p)8s(7J>X#WPioeyie`<%MwbnVP$!~e~p|%yT?2GF}q^{B&gzTZ{J4PFs9hk zBiYLPN((XrUcy0_!y@I)=R$&qT?Ukhz2fwdpF$Q5A%2M;A5ad`flujIqe_7@#4Y_> zo2ipRliqL~UBlghbINu2PWM|FvEd`dA6E@32qJJj6!xE#7XqJQJY}u_o7WHR;N*+c zFBq)T7{Wn+UOaky|2Ud(*#$dcT7~Fpc)7T2Axu{SrQbZ}nR90|;1ClNXB-HU(g}}T zd)n12#o9ed~wo>2Jnv5j@tIT>~U^73$#H!^>YGuWda9eOjb zGvq(E7~a8yz2w7g9!Oq96;el67H(h{ss9B5ZWD~(bW6TOBQbZ*exD^k+5&nVj!+L( zcwWd{f?Rf_O`r9q$o*a@P66JjV^b}o%b2?Rpfm6b>BZh-(}#^;Vul@3jT$}w@GcQc z*LnkCw6U?UtLOL!ykhF{H=8$Rvx4p0tzjb*;gN8A1P)>mORy2@r}vak&*rc-p^WNW zwtZ~%jE7JcNn3+wE2`<0Ku;`FcNa)5ww=7fsUh%{Uv#ATJQmKDRo?-G=)uN1tZcE0s1EuikgsvX)$J;&D$=3&Rs;;<+=3q zG!-Ed2A@AvPckfDl%-~y+o8n5CXaKEcl!WbgIE(GToqAY-Vnk&4A^Dx|Kk91q|Lo_ zAiOh~CIFn91SnzU>7EY{^3Xrj?euzfyOy01k(Whb_oumi=;?>R?N}s3&-w1K`goh-Fbx+0$4VrPJOlBqkLbu(^)5b=BfyoSWR{K5<2kT zR8sw){@^_mbRgarho|ZKOx)qVNAsx#HW{-)ZMoFhus%&}A*8(GjSankUFp>=A_~Uy zQbF!J*C#H-q3fL{P|=AUtKZdf$QBtcA43@mTAg68!@eTalAb~g@sP)1AW^fXzM-a4 zxp$K-hymYcuC*d7jNhkc*Yg#+e7G~|e9vKjun7$K2{W086stdIdAv-svIdC!Kwe72g^#pO zs1Kh4akpIZ*yL>pp2875^dj*|6jE0Kl;`k{V_-7f1u1fmCK}T2D zx7fW0x26iun#F(4u&gU+InI;dV{Sam|HW*o=E!M2TFdBl{^ky}{ppe72RwG`{;+>Q z$c^m`sZ_XT!3Q4fo3$JS4O;x0RXYP`0d!Bbw_H6#jo?wt0zb*@4pSZ($}ki6vivUa_TQQ!LAtUyM}CY z_Z+p$%nF1mAjTkrm=#dygZQh+H2UxE)&Mlk7S@2gfc!c4l{qleRAsko^?AmkXX&rS zr|yLbX9!_>=g{6xvyNn_>;iajk!R@g-jA3z_Y;v{&dL3^rAdlAT3)uUm~H(5=xiLI zl*+HKYux<4xK~@S>A421oOOFy>~X0rXtspot98v#;I{%odCk+V2OGJ^tW&00NM|B> zOvk;B5WLyxQ3KXWA(bk;k4d<(=sPBD2wh1^Yze3#`S+(KxuVT7^%1pY|M&ayg!9k7 zunmKk^NWr1vjXd;N<`SA6Kp{cLBL6?<*coU=pDOmA?}=rwHfPoM^6}Z-O<}MI0O>( z&B5f?2#2b0PzyCN+4yYEAlVyj{V}#Knpug(jD@bB$TylAkbapNmVXFbh)nH!g-onO znGs^vHVF)r^5B}^fR>9%=c1-AJS6s-0G}%>!Q^JT9MRl$?|3oK8;Lj&^rQ@Jqovk&}%x-I{lRIVp?`>b`hR$g?oRrIzKXC&B*HlJ8Tgn2Jie#OSm(;fZaAR!y@J2u;oA zm_f;Zj1VniorzAcLV<5-yT6C7Vnr6pzDYo;a%hwG$4>S^ui(bfZ#O#81oQ4c_DTYv zYL%)!2Y{(UUVlfRI=6Mj$B-)($@X>oJv4MKiK`bXs?P3ma3ad;x%dG_<^%mAt8Gum zJmTwTnyjZ=BKOc4h$`iis4)Ut0K-D}$MeO=2PCy zqZMPZhFBK9%sU!K#Eo`1M3CCHzp}#*?2!gsZL0Wf9?Q{_9bq8K#_hcO5j~J3-=?q@ z2vWG_Gz)JM6+vlDolN08Goe0H$m-HPjmT*#nzVaQhm`CI zV&BOffh$IWfa+#B|NJiNRjP@);_B%~Fhq5cDPxM$(I~g94@A<_kV_$X7)a&l?@H;5 z&pPd9{HFBNkS(~SpSKs8v8x$LS_2&JHdUepI%r;(*xOPJeSA#|e+UdfAt5*p`RjFR zRS8>>K|eW^^R1a!61lBgSQCbyDmiaUQTLxv6Z!Zz5DV__$r2GwZR?KxG*sd~XO7JpX}hTA z!eLAavWv#1x4n3YA!{X7w$sab(bpBqj#+&vU#DcfO-FzHcPS4sHA#mTEJ*8LdGCJl z+)@aiYqu76AQFxhb#I@?JK@;pMS9n_%6~^48rLA!iyVT=?Q@lXPB|G3rX{`Yxeb(! zXeHgQ{)vgY@)0RV**64lG=hUmonsl z!q4AdVh>Aho~#utet)y2x302PB@n7|H{h0${4v;ergsGX_?RDB?EXiOzE|1yZlI=iqxVXLxR?GJED4CeZxh8^r2sJS7`AC%tQvt?JJc_IwC353n8^!nmt?$2|Tn zp-WqpCuzL{e-tw`PungcLtNP|3YjobGB#BSgYYE*T_ascbf` zObyrzTOg$68mNH_)(&z`;^bgD3q zyhj0>T-9I#G=I=0>ihlXx3s3O(1-patC(zousX?w#sdkp3q5=U_{=0t4hbS6QRN%o z^+*?2*g3-fBsrsII{C&R)i|L>TA@&@SFa0Eyeh1w*y{50=dm?nvvPullBV^{fxTcO zyKQQ7+3CvP%FHE$5xxtm^e*gO9m-eHRK_CGw?^Gs22G)4`ThP-Zu(fN$1O?0E4L(B zYjt6_!42s)Pd(i?RV>zIN7Hk3SHn{YNj{jbuPP0TsA4v-XlhCFH2Oq!4-w>t^rvU- z>%VeG(XxMh9gEWsMC=*` z^Fuf1kic*k#m)=A@~Y3j#VbWSbqCSPn)7eOoZBj?^EniA!Wof%(9u-_v6G^?gD1-H zBZ61hAU^QVIhx#wwxBz2G7nUKX*1KE8SdG z?7i3xiPlA_ZmQO^ye)>M+;zcKCz(!}tanZfO8bx0lo=Dh(7P$`w^Kq-)!(U4`UXe>F=!`^5U(Zb!!w=?@TS z{(vkW2;*l7MQ2ngf)2_Z{?xpYi&ACC)TXaYIsrNr8Ydk3{6R{ZS7j^tHYhVA&!WBm z{^xMJRuyvR`Yu}XjN2+MOb+D13qV9}5O9fsVr zZ-StbVv5u`vG1i@k~E;Sg>0wAwsjGO6OT_M`S=FJC`5GTVi92kgtz?4KMD=r)r=t^ zr!G9SJ|T7H=6w0TQIC0@V@0Z&Sjs;LU%LFn?THqZrFBK*txT|!4q30vGTv(zYX53J zKs+U07oU1#8CNIk|XbH5Nr|_Zvc_&kb|Y?H|f> zM^6>eKM}cAadfLHpA1XGM163rLre8GLwGI-j+|_9?;Jrlf4@}XQHBUSl)Kpt+NmbN zmJhket(u~H}N3-;}3uyLC5B`~0|f!1o_L6CJjq=-ZuObW!%@&Oue zQx82Po5O*h{@V@HM-y@rk=~LZp%v4Gyvs%Hq5|nh}n=X}*fEMu84#VPAiiF>b!SkjNVSheV9* znTDIjt*^l!5|l!%^gmhVF6Apz*hgJIX4tCu?yCQxM~3U5Jg)nm4pw;|1;}GVnfp{o zteBZIMUj&dLQg{@eVcipHP5Xe4IQZL>xScYk!AJF>Q^k5@=*oaDg5fnkF>7)0-t6^ z^O6D>NIrW;G50;`F8<r7ZcZPl8M5}> zp`JNMj9A~OaG-eL$_@$E!8?c!fH7#*XYikyHAnjvk%V38tyKN{Pf5R5kN3Y1$;R`=ycJYh`ouXIwiy*W6oDH4 z^}BpS$@$p^H(TGT){)97+N zHWPWgRmp^ItEK0uPw3w1 zH@Px@o?Tk?hO+Evmg%vFxF=(-RxGtL=hvr$5^_DdmwXbMXc^Oc3 zu%Z$rI0WY0sTWJqA_urz)x^5Ot<}acl<$HnPJQWy}F(0+ix^329vseT; zx_6!X8};D{hl{1lpS3-<>mFcXaj@ocK}y zdMfEl$d`JXF0@JTK0l_G`SZP3nc-x5Ux;)?l$07yZp4!0d-$@cXmJg#SQz{?-Iu~I z(3U+lXMB{cxKZspuMhvfv4q!+8%eV}w?R27JF%D%=E+P_*xQf9$415dTbAyG_rH(n z>kXfh(G=;3ee*jRSkA2aejntO+AYgXkfe5zhbyoTm4epBYkRXmQvz!MjJEjCz z1<_U%`i+|pKxMz(cipQZ2owuy z?`<+`+KEevMNR{9dIcI}omd!aQWnStWRC$p=7md=t5@i8vpZhUwF^~3#b*SF2IOwD z#vuU-$3UZyFe<4c)PrANj8|-OA>Z~4B?lT362s=)w{xxlTlZEcYHoQkP>+~;+b&_$ zSX50Ysg6J}0syZ*#rwd~DhS!9(h#38fT~@aE<}>TP!&2Cgi6BFjfeu_$W>IT-l^AH zx|Y5=$~-77=sX4D%T~YvY)XFo7Yh-`L%#uqW$5? zq9)LWkTyxft+Jews($9?P|&v|xOq3ITQzSXMoPp)w&2c55|V?bx3~!PviobPf>L%U zMR7bH6Uo&+vQ1R2gI~ls@SnG9k^t}mt7vww5a5WTlb}qJQ_1SK`SqhO+>#!UEn*O8 zIL5db8EMQHHO+%}IH0+K2g!^$NwC)xfjfX@KlQ#yXh$}Dl3;IBEP2sbYR3_(Ev3~L zG9C;RUyP+UgjlWW|45R16Q%)RlBJcG->U_M%N5_yn<`gI|on z9a!V^|H@MVMuKBb-V)z}OmBehSi^GF8axEGV}&LJ&Bt6jS#v~hB4DUXD7m##2grIo z0kG!Ljw;0c>N-y$1W6$Bz!MEu!LMM4P_#rL&j zl3wlh*-KToFBfV7Wy0dvbYCk07M*o6N_lNh8*LL8|;uL#)Z zo~sh=V_++d4F!#!o#!PCZrn5m0}2t2Yw*e~TL443QfG3TCNdDC8pdKa!@25JqR>83 zr9fkbYaQI^Bu_WXa>tsG2skQ}rx|7kIdxQmr|WsL(Z8>D*{6^sGc?{3Rn+J~fUXcA znP&cO3IA<|Yk`fG6dfeh3VaT1`?naOQLG~Z}Iounm`)vcj`nlOn z6O1ejp8%x2g-}nhq?Ne| z-0t6U#FTDWRhOC)r>%s;&hLJ|cT`c&S-^R_P6p46CBz?SucLD8hZo3Sg_g((R=+QX#w}`9^molBYv+_G3&yo%64TFd9s6{!RW+*g@ zH`+9&I!VrKhE}D(ko)`0j$hBcmy{4_9xWG>Cn@;1{x>O8+zWsMZ*N0sm_mg`ElrP; zKz3x%tVgOKD;3N*R{_}CZw|WRGz^x6P?J>k6A?42gKQJsrK;0pD2-%w z97$w@h-ksTW`i+sAAe&g5JuUk4#_7a{s=2`LCO>df@Ch~*V5BS3a3)iTG-Z$dPW4! z+cn?-lnwRM;+P4a>sL8pDzR7Sa1am(PGXhh#r zYaRBDh&({=(-yBNm4bS$GdY=cEVs+OGCH9f35$9F?H(|0cGLQ;3jS#6q>!9qN5y4{fuygdtL!M;l*)O|DE#; zRB~W+KWXaROC7GUwT{FkZl$}dYV>Qp9Wc+EotpD@-mWA8sM@NKQY2Yz7M~E8Az6p&hLWPz7*Zp|aIM6ecS~6s z^keh??{6zlV(%4j)rICAps~Vj38_pj z8>CqRS|kYWRvv^BP-DQB1yb_B8A+;zCR1$ZT@y5FZgbkDW4WCoSsv-&iAADeaa~Pe zBeSHKCy1=$w_t(P-;CZo_x20TSFeE}SnwoLB-_!d2=&QFhqlIHFm;ubDfj6|xSpW% znB`tkiIAv}!T(=|iE-JHPkR5lT6G9y*UF$}q^W%@$4lr~s$@5)VupUvEm}&bVB#Jq zgA-jw5n`}Vp;i@KZbvwm&lH%Zo@|p}MnXxFMX|c{kz0FePM0OBeojpMnNHbYZr$gc zLJ|zWYHe6cBJm@XhHYV3%dpa!`tg`)l}QXsS-*Vv|Ed+sQnAzpRhy4T6~VGB=g4#3 zt_cEwY2_woQ2DZu`&f~UNpUgor6J{-+4nut6(U`Q>se3_d5*SVZN=GO_2Nil4Dp~q zS9wrJ;|eU57voI)VnX65?=v{Jsy85LwoDHEps}mjEzFXdN@GQ%!f5BIdP2ln=GKmw z{8%i&#%zNyKf-E;yO2e*P!Pjv%HAk{sx{9vNL4e<3K0Gdx`wg%m2|FxxH%93p_${r z`g#daSQ0U`kq-ruToWM$LiWR&f~0tpTPYCKVJx(qfUBduF5bhAlhba>B02c6F-!{W zvYwjg!38nY}*9yWO1&fAr80CefZvM@4<7O=tNCH&(F)>Zc4HVCjPEy|6*)0i*-03ZNK zL_t)wRz2{VYg%~pCw9C&ZcL``)qb(QpiDMy+!uCcMROmSEof7)kz8rPn=kLuhF6l z<&7adLeIHuROIXPW_NTV9?F;~#B*MTq%;6AdU-r7q)onSeddq@HtStx z2!}qOXK?2BLX6>!g>RvN39mxJ;x@yImAwL}5AKY9DGio((qrllH*&MkKp1DBmy}dk zU%hrSks>86KqblOboK8HT>2wWc8l_e(7%j^}eRE~u1ehHeZKwWw)i&RPoaF32UKzEhdQfMnp+oPgiTR(Q zWK9@0_tCkB?8ZDY@(GZW9>nj*fyO)#DJKsNt+N(@$wfIxnj2nm;#v-hNWJ}F;%8!{ z3>=Q^y#VClKj?_g2)%n1jj-b8(b?X{8=UumwUUU@zC5~E@|jZ}d5!^HkYN|OoDk?+?Dfe0Ce82Q35b^pZPX6vq-^Iq|d4@C}ly9R%ryUFlmfPKNhh3;U0&F z^lB|>&*^E;tlS1YmeT$DyW?2#YLI5pd;7pldMYvZdBGCudlq6~M^G{*Ke`K`tbEJE z5GQMf#SKeRWz!8;lt@y>ZdcV*_3J>+vV_ED6=dyu7}M~SzNmb7R)R!dIY|L6IKvYc z6?OjyzpIs9<%C+wZ4Y$u^A2j@Am*~)P+czOzL6Ec<+U5jcQ69z0epFI(Mn8a72&IlK}2A z%J5usu+}_Edqn=ow}j7qCSZyuo*3Bws}_T1Nnzs@RbMB{79;b#owut^0J^lMhF+h% zOi;?yWH*&$Z^Pna@OfsD56o^T#&VA5*bfDg59le=1d+)hMQD>N`t(4=;FuW317fK2 z0v6NB*p~oqrV_TW?%*a7V32y;>UwytoUD-{C4#!J9jW;a^lH(Dg?Kw*s4&BdS3K$Q zDR~kLJ7mpH28KjSVzh1`1*2M`%O8!9WutkM#j%nNFp^I^b3+)e9mnV9!9f`M?&FwU z3<+5AYIt6h#yuCRlKDG8m2ge%B}J@&VaOyxK*jS6&bz^G^C(f&^CizJ(FeKfFHZW>y%dNbOa%o+# z-%VJKrzQrTk%04d#R)*Ii@SJPz^SA|u1aG`MN>e{?qY?U{B+QM=g&`e!BnZ(!)`tA zMtbZ0^AaBSTD1q{fEcq>%UsuFEoT&#*i{dx2_gp%`cU!=SATzKdL=C$j$D|=8EdCP zv%)P&ORuSl|qFQ}#FT-h0fJ2*|yr)wFuh_^Ac448|M?=dEw7OF;R{If9OFxz@J&#yc`AxNPWJcy{h zH->~I>8`(K7}>q${h*o6ubo%Gz5_5*pAPvO5vfvJE^#U7M7!@o5lmCT@wnucQkpL? zS|UFm_+cW#O_8WLJ7hST z|D@5N=0sO>@69DP;02Bs?EW{6B?m#%9sT09idBF=> z5m`AjX6CvkulZ4#zLvLfP^^QjRI{OzO_U=}0TIa~paCdT$(nipwJ6Z{8%Pxz#nq~>0l8a$)iJ6plthm*tCQ>pE@xev={e;6| zNpngP0zy6wTlatL`#2D2Ox`njm!B0L0L5hJYO@{A+j+Zg34jF~5BA+>z7ea6SHKn+ zTJSF532qQc4-ZQU!6rPbiZ2p}_Hf5S8A^bTM6?g?RVnvhE6@A^o3K=}-;7R#5{x@A ze$$8{?+#Oyo6!VIVu~@jkq7kHBH`zw1V?}q4Q3>V5s3wVp&>0Lxru=wd|s5SMG%3% zt0;)+oflEfkb?#jAK(dUn!NgHwzKzXIf#hpMz2~kj1Dt+36+Qpj(wrFU?`uVX6|#3 zUJTR{qTxKT`{Oc?u$~=M5!r8{qv7xc_#9>-hMHIr-6R0!r&^H?;}sap%tiv=LhQ=+RTk64UQhZeMaziazZ3L z44G`E+gh>PO^vMF9ri3?3-`eBc9m5E6jM8sv1T4h#lya^4*Z!1GxarS>G$Pp!ZL3bl0XH5XtETa*(nk z^>4#Kv?``u@gQCa-i`;DAZ_{#uyYfCn$d{B?73tqb=nco<42V-YDYOXf1+GN5;6 z)kjq-L9vchs|Fk$$EA^uX_zpO+0CrCvEds}cWeW=S1eO@(kvkP6 z?jnW1BBMlZK&U*gBJ^mmFO&@;S+2;{M?c&1)dyt^<8PA~5BqYZ8VVZ)=g00cvD#M840oid$X-RD>RXH(G zh|ogjdB|21p&i#e*K?#fZ`U&c2+2;C8@SH0U$VfpG1q(G!nWfI?8-5{uhr@%CMz$HIkf^7$*6bK4R zvP0$>>TU!BK(u<_)d__p)d~X{qDzn?W3s_@t7fDb2B0cSN{~6nz9+-eN^=1WhzUoO zU}dT?^#`+?>gY(GT*w{Mj>q{%K;91gp^X=+)K!GkA{q%Qw*2aI zmF?(LPg1LMEqbz9mto3dhWB%SJq&hCOHfv`6_5r_jWZ4`iDn)|Hh5~vB@Bs3HgVFV zUP%)<6Dot@I%HMEDeK;3%Pm+DLmPTook5{z=Kp!SRtNyZA5!&-oe59bEGCNCc&!C( zko9cUkme;1d+w6~)VJ^KWUphy30}5n8mDkf$+LSx?!r@D=D(p#^P z10S~H z21iL5Jo0Ps9#)Qh;%$;Ta!-;wZU4i7Izs8fP(C1{d`a#(tp3Oi43~}B9Q{4 z>Nhf$BzHQu?bJF*qXH%jhdxRAX?H9{Bnmdu+$(;o&bp=XID35@%bVQ9D*GF-0T5FE znKk34x93Wij1WB9>Cx3>ssQl?i{8*r{f7bZ`B5a2^+2X5UY3 zkdpH^s&fvQqrrt3j}dm+U8?NrK*q|R6YN32-UG1VGi3Ub0w0+|8A+~`f=P<|0~qnu zUpMrAV`vi6ke<;aJ_3Y1*I#L?>^GZ=XNGrdd%YhRL3=m&2On7;q~E7^;SYJg6I0Nq73|=z>*DEeI3bISgL0vBTgg5*nib;cu0D>>S~eH-Q*O2mTDm7{_hzN+d0- zz_?+HoVhY&%k1{fJ@60hld@MAc>z<54+gc+9SkC0Y^LFJ3fCqSjj{Bmv7`#sXf1BtPj$=Z}g0c8D_1tZ? zK!y}^m7d4Z21FRptR#6`c3dme1CB(7d*dQ`n29A7%{*js7?G#WVelCb_p}MqG?6WD z_D=VC1VCD#gcTI2l4ZhIUp5CFG+Px5^{><7M~f0`?fLVSJoU9|Hfcod6Cei%LE|7e zr=w7nRT6_+ySBR&9g@g391XTjt#J=BS`nnej1IBaflE23>sxOYzWWwZt@prl7R`5^P2|+BhM4IO+$OBpuj-;IO z3=!FAtpVe3CRW&h2(GA$w@s#Lhuv<6fn+{wG$EkRu#x&&Q!3)(aoK;deV3ri-y+ zue!e9KC5)2n$q>gNt#HL2)&{a>KSmQVK&75|C2|!O_Li)N<2IU+|EOb5A%3 zEr8JJ*HpQ)l*kMdpfH~2f{1l)}c zKY4bk2+3Otf{si{a!K4q7AOtS5`Ld@fFRB)wT6f(fca;-4#kZ=?1 zueFD8S(;7gZdaW27nR>o<@O+9Q~GwhX~REXd|tTM!0P&^sMu9j`98DE^S~ilwF)5X zCCyBnP@~pgJ1Cz|;gEPul_8@{VOh)-cjihcC619~i7P%>f~ZjEjTkKL z=S|Fme>9cBkeukM@{iAm*Oro#KO;$2&C?5c4nbj04h+`18}7$ShFp$@jf4gYg1PNR z;aAp4O}?Lu>yh_8dG-&xS!BDlGJgKpYD}LZ?RgXsq9{BZ30OM_V%7R#Wr8KOR-m}& zMPalP?pJW`|DU&Ok^lq@R%y{{#JK7*w^F2;?x@n#zV)z{@nMhYn!|WiLKOnQh7S?R zFlJ9UymwEP3Xcz_3dTr32H9J%Hw8dDw#9=%HMYAG=*X`e&11aQn&eg1uVz7zNf0CW z3H48zlVHRk$$e;)zQ~id9z2gAo0x67130hDwceEe=WGsw-e8UZO-I5E%J0JZZfoL;&zpxUk!134(< zyTFieDO)1AK(<^VV~HO__p+WT&n8(&i33*8mrt1l6Kg|b&cWZ1j$%FzY-7vrd;=Lx z6)Ay_!&^_j8^<1J9lxgOej7M}6HiBXLzYMeSHcu1V8^7CJjeYin;eWZ+gQjBS|u@3 zldIv0dqqhskcJf5nnc%kGS|+kL-KY;0M6T$CjeRJ?@aVwbx*yLtW{SY?k>$v*1YUe zSBYURX(2|peNC>ikd>U!W)%dIPFA3@UNj6MW=?_){t;0u3-|j%mQ@D$kJ;@_br9on zEn#pcy460g?*Y3d#@enZB#mNM1Oy{bVje+g_%n07s^B;uF_j6^?gI0%qAmyQ_WNXL z!m5WXHzb0Sg2-8tITSRTfJgkIw{JuxDI|;w!eeUfK2ch@86wVxQ*d7hhwY6^;?;IZ zRdKk%u_+OfWG~+nnOtddK88u$g%N}FZ3Av+10NZZVjexqZLZNIYiojb@GvSR50zkl z%9%8zu1$pzZjU*L=?M=6Y^66FdcW{s@E~YY4#`Mq=x(K%J{5K4WicXp>HBHSUtlt_ z(ZVYJ;CO76u?7E; z2E>NW z|8dl8yFZ1Dl7wqe&mpz0gSw zt#c79bH!9jhrBaWwMbMP+vpWlAO5_RR8fZ9rwlzpg5bD)0JbNkMUKp3jD%$iQj>5+ z)f5uPHM2Lf>DTfr5!ryn!`73nab*}~i!|`0kNj0~Vwh+wNx;v=UyVUZkw$9r^bXPgy3G9nNUTd|bp{Auph z18XATX&1$#RQRyq&kJYXO*%$|R^umsZu* z3l2tmUPx2lQ^yQAR}P~I3tMcmRF8+Gc!I&a0k5bf+6O(TmLh3UUKXX_S!+XvK`+tA zk7BT_J^z(QA_o(?(p0%Ze(>O4zss<4Ro6xxlgA59wo_;twxqfyQ00-NM1|MtJO+ky z2{|Q>Lg|BEkOJ@)WST9Ab6cUopsk%zhSmXBWiENNdq63eO0d*JIH82%gpKf23|(pL z?KmIBNo#Ayqzuys2SX>U<#>)Jm}_2Ehtr@WlK3IK93=I&f{4g`0;nb%Cwa&YKi{Tr(V{T$<}#0Z&%6zP*vzM z&c_z2l53$7BpQa<;iaCqhdND zdoIMVB^&P=mA@piCr?KVF2DeLDrGa0T_4*aO|d{zpIAyE{smG%s!72S30$*(<{YJL z8p@153(UoE6Q>oyO|UtRm%dP_j~wokSSeuwSs^6`C($CCql_bv#Du{@!-Pb1#YxzT zCZ&|2s}VB_MpGMQ^Ph~{d#ix=YYo3g(vGpkGDJ}A z5^l%bKffxRkHTxlSfX?HX<2H!cPWY0s_}gHMAMAMWGdvVdfv|4b!q`f@#$pIgD!0x zaMISxP}%9`0u-b!T|t{(&xow119}arlsssz!nyx#{sAd@5KS;CPXPoF9{s~O*HM;b z>q=S8U)Leqhr@kw?r5I8FnlX%fC;FL&`=FYRcJWSG2Oy_Dam*}N{Lz~%gE>zuUKIthLAF{O*PK31t`aJ-pnLM8 zb)|u>wWdWhtcu4O2FTF2hH+0^C*_Xvu#om-&id}8A-C5T8jphkt`7TL^3Este1+UN zF;Gbl-IFbAO}HCmey^h@mDC*+j9NRV$s223`nf4!@n^1Rqn$IA3}v5!bpxf?W^`}E zz$*)$)jgP7HHbunM=*1XNp(0k8M@vw+DeEVMna{MRWeVx3_99L$sFJ38xIkeplG5&U?{SnS>}S{ru?KR{Qrg-F)!?=Zk8st2Rai z{+be?G8j+Q?wgJ(J@`*lnJXdGYh}pR{kdfz!*;}v(uB^Fcon)CDzV{&m#usYO)wk- zdXmHG#ykqF1LUZtu!K+P*;1@0(ByNH&nvQQJ`w&#hd-{u#U&6z&X66!S(+DzFdLru zDaq6aBN=qfpko4{y2?QEz7GWjw}~EzXs``<|Exl2Syf<~g7C@h5|gGbwG}S=X^%sh zFylC+SLf}#U10(Ma*AuiUQW%y){UR#fg4$dao+koy`7Si6gL8 z#UHEBkij7nlr)w!qHpkntI&22hv3gHIZ-Nd003ZNKL_t&`AaP$ah0R-0 z{U_@_IL|oH)Mrj6OIRllsg*Y3RywvQc&siF3Of=58BM(8B%JP~Nm&QQ^hBthY{l?1 zQpSnQnhnE>Wc{QjbOo!#SjN$e_Si9^vs$f2`|Iq0C=CD8dXjgoB{#Lt(@@d$IuXHA zLlv~!O(E_DtBMbaA>9`8(t@H2 z3gUc}skC5E?>1XmYY(L5rI_b=@fieds#u|R0$bJD!dJ;pLCBquoa{sszd|Hd;WG5d z?RA;YVHU{^p7-ma)mPq9TB72zG8*Po&AOPr#M&d;ZEg3veczWj{vzQ`uj#ngrCgd$ zi1mG(=M*3%no0>82O^&E80RKrbZ%ii1j2SqHStWc!{3^3z)5T*)~7Y>BFz8bmQ4S* zPpPBC`9uqhlX7M9EV7~mgE5$tQG%yKt1M6@^>v3(JP)AC!}QX54y2?YsUBD&$>_;O zOC!%KSdSFe{78*&^-<1B32O`|E1vk1cm>O{;CMWcl(K!s-~6xtyK)Xg=k3Z8fa(i; zg<0p0)yN2U+e5?Ix&^o5Mjc25F?-;uOAIwXFjQ5AKYSr6VoesOLfitu+E+c;;kMwG zRJlHA8wp^RU=*4(XOMN7dcdEgx$*S`V45Zmdd}ghN|Wp)!P#Lu3=iH_so$>{2Dyx_ zkBq?7r3D?hdtl5}sI|HgkxgB6$iFo%S>d^=P%Q||bCXvl-+n1hob>V0{hE4^cX?#> zwlIP-dkOwACwD9eTX7stDIMr{!Hea&hczW9z}m27pM|8K-&eiPUESqx5mh@CkO| zT-KS!L+~3p1DxzA)`-Q(n|72zLRoHZgs~vCKv9Pv$KUIgw1Yix3@yqFtp5(tlNOpe zQR{+>8yDTpu=?x=Nn>uid*GI@{3g?T%NS-2Q>!vVKl}D)-vg{X-czqy12#5UrSlWY znvtI!^8_2aiLvO0R)i9)t zk>jl;2EM`&nemiOP;!tQJRXSOyn&cdThUtwng%HOh>M}M37!Cm?6;snsOoDS`Y7s( zB5kHfDd(7f-mU`&0BbT2kI40kS+<}ww!f zZeUq@<(k|iv!mk1bQciEJ@>DH!7ds@qDcM)=9kb>kRstYS-Q(1Xnz#CBFwggsQ8%S z9H8Sm=61HOWQC(4&e-3VA;@nf0og=qObmwBhUTe#am$EL!?YhZ!W+mxBDbwLs9B4! zB>Qg!N{IM}5%ri+ArFvvu8$qS$`~mBTZUmj8Eg|svcQfzNl-@5voP*LStAn31Z!!; zSSeVRW1Ihhx;mb}`Ct8)XM2G2c6A7V`++Czt9EBOSuwyh>5=PdA*`k~Che}lkl9i; z+}WZpNYz#kpv9$rb*N?~dlT5_xp9!52>N*f+|~^C2msvb7uPXYHXkzlQF)AVoSV$n zu5^xLUVvyGB^)wGs(>_eD@M+SIpPU1wQPTigofWJbleAK$HlPI&Gx^>pmue*3PGjO zQUF)AQaYD2`lY3`(bBu!4z&Wu<8ipAV->$u_}l*0JX}^!_}_Iu17ru=@TOO)`oK2K zVH2!_!($vHH6jEXlEkf<_mQQJ_S9obEJOTCZic!-J972CG2DjsJ#qr29yWEqMG5uE z<~dw>3mpdsV?pk1a8;cX5Viq6O_7sLG$H%%XA}@CYu}crOkVYugm%!HC6tVq+1Hf! zS+*b>v!{jvm{98xwJMH_c61`!Z=ZwzdArgCAdj+yS8b+u73$eKL|u3)+|W<8M4)8L zPc!WaKliL1))Rd>e+Ua=_{oM|I()|g_FB)7YaSGn7ohY)28>f}X@3Wsod`}MO<_+c zMJWZFL)Q^L^C2)OKK3*dl7y0?n$Q^@s+1}kBO3mH?7hp9BuS1W2tduFdS?FrLzk9j zx-#5Uum=$U%n-4tn!}doL6xXGD>EbA?V&0F82m`rzX?~G)T)7W=Tat38SWF)m9o^y zR0%@eQ3%+bx=JTmshM2YOaA(O1CgwIf|!2WtBO!ll4>$P!YgK;1I|QPNg-UzOOw&Y3?v zOK%4-uu_$Kc{T{%qXz`10;#%t=W*PJH6x=J*f4X#AAjLt|6SYqFcJg)i#bb69X}V} z^Mv3G!1HjdxbbnnMaFavTvDs!TH?8$>t_%Ep>c>NgwzlxN)Yk94u0g|KW{bJ4j-Fi zUmOq}_Uz}n_F@TEp&D%ZgQXV8kVaudqz2g$+iL%v>@{B=(y)9ZDK{WiJNg8R9i>u-SoG|SC2R`J%U zD}~Wu7>NqP)UcBT=6Rn!(BuR9{>_CiClIja)pn51a2;=^GcFwR0$c=*L&tJTDiazk z7?6BOc>)nMWW>-W!y#*OBAg(hNts0sH2r>BRX{+ASu;PUgc(k3aL-n)yDv17};R!zJQ@2e{0y<OVZs{31Oq8B&)Oy{Eu% zM5mt7?lz0qT6Ij_b4|XcxCe3tpA$-fk~&=*pVQ8}&@vQ1m{?A>e2+lA3wh!C zF2Y{|*BB|y6;^@pUcIDuJ!$gwy5wFS4>J6q6lt%Ef5lnQA$!`TH{}Zcneqc!&DUt_ zsW`t@7*@dgy57S*>Wsnfk!Ey9HO2rX3#$U+J{tEjFN4<^&*c02TbS44A7zct^<4jP z4nS;w1FRdEM-GN0)O-W0d@H0dZP?~_-Udsd=+Mw9 zdeVvliFXv~as8apvM_k{g2jLSlh^f<;dcpzOer-ln#FEQK~cNpGSJaKZ|HzhL5*i6 zd?|RB78dOG1rtSea>y z4c-r9Q>!e2HqD|RLNq5ip^&-C0DDrUeE2B-;wJ2+5Qkg^Jvqn-i3AqhgE6Y%@$NIR zlg#$Letb4V?%S7-dbmRR#$V7T!#nNU@yj@o^N@wECg6q#jB`S}oTQU%D!`}&H9BM` zT}g{X7)>sL3TGT)yfLrK;=9N7iKN#8}67p({b9r1eo-|siw=NM0& zyM7?MbI0p_W# z`7ka$U@UMO)oa;!2dX7UH&;EsTr)H=!l-cfZGwuh(l?3p=QI%5xy3%7OlkxR0HkHkF9Z!fPM04RJ=tG8NLq zROG$~@P&f6AR=-lig>+Le7wc3*HeL>>+iz>h#mEQnDK#){?|AGqB%-84+=ye51Bv! z#9)6HRb)EjA+x+!*vK~bP%K0S0ZPQtwG1SC7*EUxndL$1IGw`uE1*K)>g-ei>&JpK z-!|oU2RC*fbj5-#xz|stR^N$pI62~!ZJ~7rIQPCeJ~*XOz8mte|2-72Lzv7bc(W|0 zw@9Uos=Y21Q6F7Im~q7IJJE$EwT^hT;Yc3rS~IsBOu zCxBM~u%3#wMXEJMkt9W@vV^z=V|i&P#gY@pX%vb1v|bQuZjcb$ojF~6p@pIEzt?KA zn(Yibkjq3~FO%QD@1+p=l5syCK+p9zSpjTmT0M-U)KPsze3k!iR0dZFdi)Mg{$9f`}^;Osuz^xsd)9buGeI`~-uK3uZINiTtD0ZC=l0XY^5KJQoN=lRbR5i-_apzCsfV7WyoDowOrp3?%8$S4JQv+-7jzJEg?r@4H*U zx$EDdQ;|cMtao)pG!{J*p*~AY9F#b?*G?kK+Td|YA%(F5T`Cv8$DW#TG4nOe4-ABH zO~*qF1v(YeKf(ObSk!)7R~XV=u4}NKh=%DNY#zmXf8ClKL=sL-2m;f*Be=d~dlOS(4FyCBGLdLXWB zxQf?~D-rQc*uOhIcCeru{jiIu(7-{Q0TH>DeeYcTwMgD@_SAA}6k2_Gp;bsZJFwC-7vo=7u+Q!^T7!~Bv+FMR{hs&n*9%&U=X$Om<^bRXX}a{iXx*D# zxi%*_v~cA~qzr@Vp^6OnNc&Ur4Nsp~ID|c$lNpdRAM$u+Iks16_oy`eRv6Coe6Ok8 zz{SwPhBf{DQ|H`?Yn)^5DItrA&bL#w3WJei0^wTPe-b1uZHf~zMB;;7b7$V+%w2gQ zq-joqriV$Ecfygv-fTYS|noY4IQy z3}(0TZkYTe(EU$vE#_N+E7{#xjqbiWIoSvYQ(e~-D?>uZy3`1O-dLq?#tR-zmtLQr zZ7aG`ku1La80<(W=u;um^ECd1v}6O>k(w>6sC^!5&=4Fhj`yCF#Bp$NG!vJD^yh^b z!~nFAONG5l`dfs+&)fHssKp?pWegX)E<%KIB_Sr`{w>$_>#0D`^}`JS%Bz+M5byA7 zyfK5&7Z1;Rr7##wNz1*u^_We`J-d%Vg&_U$qfkm2@5IJa)i?b#?lv9R(pi8^3Dzg8 z(`aI(NOZ-luSjAfA!R`p)@9e;pF4cJFsmNi6jOc_5T-5W{p@&V9Zx$rGO2MFc%LvC zYDv{39T_#hugtbb3quWSB!lU_G7lz!in;tw>}X}4fH*+dnup*RZ*l*Y(yH&SkA3wN z>x-V~sAL7Lhvl-jpYQbZWhojO<89kze_C}ox}8@)o^pt(j@YPYoh3LfatpsTV%XZs^cGvg_wP!9iW+a#>jd=%KH= z6a3EhPW^kDNQ>XTToJEXh*y?CqGLDwsIkr-(YX$gh30t4`P}`mT0xFXbDMV9Q^NxAXoU*lBDV!PP)0CX!9w7!^$9LbSk+OoWMl=JkGF+=@4kcY{^xjL z;^cWs2tS2J@}B4adVDe)eg2D@NO zUwd(0o%rxpOu51N1ixpq7g$gDOc+nH6(keio27{m7G2%47|#1@UOAwXr8WYi!*s0s zbQiC^ISjI`G$u|eu_a%maOk@-iy%$)LAhAg$dV1UF)s8jI~6j+z%V7G33@;zFuEX1$wTZ zZ2(FZw>6P58I=V)J3Vtf2P+AwbNM^_7UHv@4$Mc+cMvdRjPw+acq$ zpOloe;Z7TkHxbaM<2vvj86F z6~pSReO!mkob(4-_u>Rph`=CqL##Y@G^3*&vK6Wx)r$EBzU}&ptcE5#=wug%G3~^W zkAPGL*w@bYpfph<3mz-SmJFEphPDa0CT;~wWi^v~jD>22S3J1(LCkM9ZD3if&H2$= zd~X$wlgx7GP}IafNG?k4DyS1q#yh*4p|rJDeTHM~uP2%Cr2cU*wkmXK$dK3Tg8e>K zet^{1eZL$_9r3rkx7l_YIWN}-!~fcPwV zof4Ytfag8eE9)JaW~!X1id~^ru|?JeMbcNly-Vn|N0#ftip$TI1WPYLD&W7+Mp4@Jh%gcP=nl+ zqgxGn*|?@_ANu}zDhkT#))%2RC(r|bz_IYGXDm2=$ABy*ZV&;n6a7#&3Gb{SXuN{h z;Cbn$)M#u3E5A+MP%=2Ddq4=8id4=kIR!l$9P$N5sDY*v2QVLxx zlxx7w z_Xyu?fKLZJ00t1|y1VcDUXP3sAxLe^66xULrv?ufOf9Z5{Fc|tig=_o$)G;^Y{&v` zV_V7Uv8hQn&|t-l|nL*H=KZuESa8WILg^H zs_lD4pZNJN?s2F3!a)L-MHdK{ac?2tgUqdB>Nnl|4x%T)d!p=;i`^dIv$gnZgrj^Z zTuhW?sqW=n-_aDo#7YrbbMX4=Y{27(slNYx=eP*K=GgF3vt)r5A{)>-TAH4{NQ$h+ z8JiF$Evgharu6)6uGoqa*cKEu>U$cF{sBG2%K_c%hsYZq&#;sc6j=o*`KY3@GN4>CK+DMcD#Dj-ocUTy3yZj}KM@+y%!Xp5gv zRnSNl=xm1z3WkJQ7mp$*`V2gR1rEtd3pO7K=TA-sx;&PDg62Ji$PSV@%Yz=wsT_=* z^lTDT_m3|&dv1*(#A1I)(|mXgWsn^gfzzwr^L54 zSwz;%NkN$ppfE%%!l{`}6^svgf4}8_{jdKi@ApFke6AmE0LE~NdR3`C{AEJuKt4}a zJI#4OyeAXgj2OyUbb*Oi`SFVrpct)r%dcNAdB2x3VUgl&jb9E)T#{2S6#uAC?Xbwv zQ`Y{_ZYg(_gWw5e?+kL69->?js*}_!VAL#9n^8`MBGq?T zCQhM>=+URBWjE!9KsIZpQl%iZmL z->lSVU#jXLO*hJ2t2l`4#8Xs}C|GHJz|mKUFZW3;?+J&{pLIjL@3CxdgJ?D~wz=mE z9Q_d3bdc^pcI4BofyG;~-#9v5xAG7eb&}K+XFI|e|pFj65QLx zUMhe6^;=%A>#0D`^}{OwV@|ppqg>bCGqlMwyd_fO;HN)-KDq#N=RCC4_EK?jGB6^v8f4{SdD3d>J$&3!`fKpe~ z8plYMx53abHD~cT8T|q8V)6&96d9}8xWM9i?xih}u(@ipoPuLbhP;OI@n~5cE^v?I zGjdE8*wBRGOh%+w!$ThO^lXM4;&wSS2B8g_$b&1}$eEs^8-@kv$efv{^p6iDj01*hx zR*KK`!BDU-Qkf)#AAo?Z{o0TU>X6EGA1;H~bzV}zHQmoW_9W=tW56!28N9fXOI%Iz zY$`KoYJ@EA(YB%5QvTd!I76WuY^uU~emo!@W<5n?A~r}m9k?X1@;0T|B|eH^iIK*- zzLViDn!JEE3dY_P^8;uYD(PWH{pvPIw!JvN|Kc$0N{Lb|VDZ;uU=6-+!C;$^2da`% z4(f?;D$y;>%C7<4SaUIF9R zhOH}@o+MGr7km3^2Q4ssS63}2W#>yIDb!}KUH|ewm%d5#>g0LXr!~R#qu%*_V1XBk z@tw^?7%d4wC$Kqd_I_^}6vrU#4RBK+ZdAX20-5}x@A(6G2;0$MNPyo!iU zj6bi|Fo;t@DDo(z>uu}@a4(cDZR=Y1wHh*)0n#(x#TN#E(D%rUf=)=2Ml{=vY*3wo zl#?Lf4NSvRoz1bMbVHKh*T)GhJJA6`|Rb9 z&GbppfFE2i-nBKlxat~9Nra70_Ta(o$Y&4McB9yQ-dd4KMz+H<21Of+I>Pw;{*B)B zecz(0^7VBk33@2&Kq<-y-hv*I(cAvS$VGTtD0Zl!*qiqDv|zKFB;o zgKfJQuj3v?2n5reV4^#~)oA59WGpST?_G90I$$#_ez5j*Ov;0!dQHK>bjRr)*A6&! zs?~coD>D}#uuxE}pgc;0UC;taYKQD$hGe!k6IfhbMXg4ODt1czfhzoqtdyPsEYe4F z7BYiT&VWRFTH9XZZoZUFNe-6wG5$9srdU8i;#u~%T1y56*qJy01=+_MB|=sl*Gqto zpe;4-lSPA6h=fJk3YtsjH0<8>{qLuO10X)-$U;Aok^UEeAu>^2-OU(M2kaZ^7Zv4_qgT#zMl&8TtB=50QWrA zii@4a+%?J5x-V;U~40h0C(<>FHojd1VAenEe0|E__YA`D%xU=|+SZ5e{Y}If@ zSQoypa?SHC2#8iQ;XWv69W3OExY-%!cfs&H6Ig4qj)YB-Q&?2VLb-t$)YSPwVS@3` zC%=PGhxDJV7N^eK)4$(CUauE~^58vu`0u^ss=?+jUlHU2DDYCaSw(M@iD2CFJ*LF@ zApt(u&#wToo1R(h%r@8UfWiVYMuZ0`>{0O$8Cm_}Xcz?1_UK=n#550G-wFo6ZE`AR z=moF}vFUNzaoEY`^bH6@Or-QXNDZePd8|EHWY7*&qzr|!q#8&r)6<;8Xt2ODE4%C3 z5%%TDcov^Q#o5~)-}kL{>%)}8Z-hgMsEC4$G#ZxtE@Rq?EP&kW;QO4(d1c_l`S$hm zB&C(8-%pr#t%1@+NQyAGP2a6Cq1a$8g$xG;Ee$`CBG>ziz5RU;`NyxX%2x0je#R(3 z9=_6S-iAP^wJLMl5_TJq zItY2*%LPv&vwrRVM`(q$q=j?8TFfT3(17n#Z;-SS-55w9D?|dD6kJEJbD3nrke=#L zz!}zbI7k)|N?g>->8~PrwZW=Jj_!5n*oWP$!e{D~nb1RdQX1G?VZAIJ6a5*h@LM~_ z(h$WVScUE(TXxV@ETv6lVWOlfF%pXzC-rf%n?sUadBQhlUZ0+E%2#gWLfTsBSKYVS zKmhS>-g~y(EZ;KTL+tvJUtczHioslp%&b^VZSHyqp;gZ5`KLEJsJYn(gr}Rn=N;E%(TA&+wqjROFg}|0y8pxt{Akw*s&gq~pQf zzh#>F*_8IBf4b$QG~u?$4`AbzDq0K|4=+FdoFWJK#kKLPlVG(0#cLP9fIzBlfWsku8ZiVsl%qVyg*Dd z9kzbl+g8!2KptN(xC-O% zg2QNl>`IX|qk;mRk-VBs-*9v!49ng~u2itOh8SHz$IK%3b%ovicDb%E(XZ(@Fs8<| zuw{{^rT2_`mZm}wn*lSXCigu9d%W>c6_hoYXTUPmo>*ubA0=Hn*WYBbPmp>0>?y&p z?fStbF&ocOs}EZ%jxoma$bYYYXUnTXv-p?OVvvM6ya{jKj$RgO!#tNxB-~|&=#Q{g z9b$(yMH>z@ybDU!>BHsqddWZk`M>4Yum2(c{O3QP3iMn*yaMo%(Env3-*2xxdKu7} z*RE|&xdyNxYn1EI8OiuA0-iy^6@v1@(WQQ-Ns`EL&ptRNHFk?^qdLTg=A@c^fhe)@ zBbpcqK)m0q0>@ULRm{c!hO}0cau6F*9%P>0{Lv(su~AADNNLmNDwgBKM*sAhs~F^G z=6;y=@bKex1(Mq|NqUwOoeFa+Fnuo}Yj3L^l@`V7Sx|#}a4m*3k>>;wuf#|Pv?KWec^_KYIC~)v;c}Sh!x(~6!|R$w%*T-H^(C*bYr_0t`h+VfNFSWv zQMno#FeZJ>2<7Ybl`>mZg8~ZC%^9Pu4HX-cf>n|}KPX&6epKbtTvEFqV`skc8Ol1s9at;?J zO_w&D{FqoYq-$^mLS@1p7`4y1Gso4!L_%*u6_~u{wEHg(gIB5{$aIFz&>3W)qZM&Y z_|3^KrWsetLKiTMiCw4Clp2SOrG;;|j5SD&>qbL4-D4WuGQO#aI|5E%cdB8iv?Ur%nM)@ndQlE||TW7)8-y%H>YFqtDxWxRpcVA`SrMjj^|0FlVEg zj)ix~E!TC;Aw<1G!&c*Kx;NaaabAQ1!soA(JkCV&hc{^^E;r3LZ=lbatz?C&WHo~c?aV?r~4 z2sy zFEwzo5x1(Soz@CYZhOcznTS+Bv4Eg@PCCGow*jFNUii%tj)ZqJ+&rp3n ze1Mi<&DXQH!PX1fLTa2>Odcu#UQf||5UZZ6^zXvU9Cbg`Qf^V z!xC!|GhBx#HTuXI3DV>kGjz%p5<}=goQng^mvn2YU3?jwMaF?_+?nTkuK#!gFh(cu z%q}3);z(wM`{|0;4R-Wwjx9UufJ8a%4>Hf!p=4UfKotMoe_X)UlQYj_0*cTLJT$KS z8Mf90Dx0=lU52++DD6jMA8$o!5@6)dt#1|uA?E!mfWw=Dz{)IzWRUoIbtkiiq((C) zOyfz}^L2?=6rNCqQ7u0;8!mnctU|1Dy;i5N4NLmn^Gn7rDQa0UuC*etKF|ziem$ zCXPlr)+X2G^8KDG7JMeKsma%3&8biK_b;?4Be&h%3=2H|`5uwBD(WhpwomsBJetqp zC326|AoK)lM;85BI~<1NoU8%L4{2V~KkPaNYhiXtogK^{KsAs8hh(BZR_c|0x1m~C z_tn}MPECC_4^RDht{+DL&^vxi`^qHKje_RUrZq!CUPKyd!P!* zXyPZ$8sDUb9tx(Ms94XD_BPaGZ@k&C*_Al zoEzc6uL!r_IT_w#HGJ#!2Ie$>-pKWZ148A%j12i{>D#N|8cO&eNM{TO$Xouf&+o`k z#e5+Vlm9FeTu%;qm}PPLa~Ry&ZGc~|U-G`cCmVh+vX%4udNwap@*E&;O7q``*Z`^&mG$!<$}I;6h0;X(#80qN9~Uo3ql%0}@@l0~zr zEf4*zF?J_}tOxFJZ|J-q2S|XN2MIu65B=b1xaBbgOk5x7P6v071R1;)7SdGKUfB0Y2^?14+B zCb~~txMo2kM3n>MADHoG!J5|dfJi1R2ESW!uP-WOMeCcJTd~X&C4xQsL@6}c<80Mi z#bxeNtC`Dt13r6#YsJpHnV-lQ3D9(IdSEWM#K61D>@5c2|;$x{k>v z)y~N0&!)Q(qLp(s&#N5RX9gAgsU%Hu&QKO@{Td4mgp?I349TZD4rITid#)zUV(UX7OZID^9rO6 zEhjQx>=9D4z5W_`_Q3~8#6fotcjQV0OgsiUCi20lD*NjykT@lSxoUBTRq<}vQiTls zAabV*E0A?Fn0Diy+-S&vg(9NQv{?~p$xx4_{2h|7IDkq@s6{S_wq zl_*mhOd)X*%z9|wdua0duBD+vW&$0ZWW#{p4|ylFRR`|0nK-9Bb#hdMq<3M;CcVMr zdcw`Au~FUSgz*^-^j#2~$m?F*rfNl7VWKFc$@L~zjg&~Kw8`J!-}3AA#XEO$e&hxt zY85vXi>$P>KG@U5;%5QAG7 z@+ZUm20KdIwGY9pdD{6)PrTzoP7MXw5IaHRrnOIZG$uKmUzsH@9P%QBV)!OibZ8dx z09Vc$C!V_WX|d5sJgu0Z@I2t^7S(EmB8YEvOTUdt`LtC z&p|}~1qTDspZWKfUh?(&lHcFo^Biz}>i={7omK#K_ytt?euF)0c(%7xxhM*XJLiZ1 z7CDl#ym{iHMqjo31k893d??y6dH?Avp=L!!G^ueAw9@m8W(kjXO^50EBFZ z1E!jhgb^ZwRUzBF8HunX;y$qi1TWG({7Z@zq&nRuIpiV0K`32Ut|0f*X2DyhAo=d6 z#8VepvgB%I3C*7)=S{$$4T%;RtrTwr6X7<~8?Y?a<}!!|E#&#IP^K*UVLz>1c2~X@ zwZ0HCb<)ih5vO#MBE$0iqmrr{`yP4zP?t78IV$8eOG7;8+!L(#pzKb$W&9g8003?oKi;CtrC_(;r!~GI7lYp&sh}5b9pI;XGDF z{CrRX4nRLM85VqERzY-}X%r3?kpI!|;b~Y20pa&kp8pOjhR90TR+v)OeE`3U!W7Ql z43*^`fio)<#!JRm=FesIoKj5{k~k6y;fO%^rtMcLX1#)fBr_k@=bS5w#jNxeeLYQk z_O%b|!aZeRbq|hoqQfRGcHX$|GG!=Vyr(Dn#v4&go@~4R9eOX4uCxX;Wuner_KJ=9 z0g!gtvjd1+D}~bOX85BUo6W;doa>f4uV)rThyxPbku9FPgj(%CTT}%gBQE{%rAFh`d+ea9bZalEG7NE56NO=F%P^m7qaQ6jhEui~`4;MP zHA|jinkVct5IB*+ak&)|W0OIvz4%9FdIi*om#Y}ADk9mg(#&AT=${Wfdc6(h0Q_ND zv(^-!N(S0@Dx}46Z6Wtxan@2ZJ1PI8m?l+DKIYPr*J7PPZH;uTxPsH7qWE2TGB&VI zHIpq`wj3hoDnNBjauKeB(#zo+X)R@8f<`Ha80WQSQgK+-I3y1;QWR@}d0#InYvja( zv~PECW4;MS)uOW^nikDl*|-^K*mc0pSoGa-PhPK^)h7ZbSxP$iR*4EhTAuq@RKqtT z-;;{$H~<=O$$|Ob$cE~b1=7B+Bn|^A(|tltpFO>;Y*Kt{mg`tqiW9OrRv>G#1+toQ zthPFRj@~#DM;>50eD3HWHZ2Mk$Ug3caokS@daj>e0n}mJQux6CymGxqv*=aYhhl&V zL1LiU$pZvraOIia$U+@5ho&P5ijIk8113NV3PTxlZ8IZ3=X$@6?p1Ic@SuKKP}49IOzcDpJVu@5LW@Cwe;E zt)UbUBOL`Zb@V7{bL`0ALfk1`G zQPY^ZhmgLwP4g*bY`?1pjAVKz&JHvNZ5OX#%#?vz-W!C3*S0udPxzkSZYb*UvWqAYa#|Q03`-WC-E^fN0!Ub5{u@Ew z9U4uDM6@xz`H&>`H}M!aC{>(U*3vv*G>Wt^(XO%uR+~U}$xy`BL@k-f*dkPiX0`-R z{A2MMdwdbs!z2Ny^=P5<$1pGa@cu)UlR6D*QTR+)iD z@G}Gk4_96{gdU&5woc&$A{aJNYX^bV3=AwofOe#WbX3wL+9;e|5mVFA)kB0^sf=Z- zK8=n)=FSE41MVL2y z7aaZ>x(Ftm3#@m9Z9I&2*R(stW!!_*1#J**jZP&>(o|`cbzivxETSV0fk=xX)^xtK zND^!XIbMg^N`YL(U#(~WI51c7IY{uZi)5k$B+?<_uKER*`Rc!vv0tv(htoK0OZi}WkG(s*ZwL}6ZD|p&k33)*(n{Ngydz=v}uav}n zh2rvm{`-H6_$~K6u5jW9i1@K%y-2fyp&x%QZ-!Aw2US>Uuou352g6bJo zugrDRw)RY-A5T)<^S%nd6G119Vgh9-dN%9b04B$WRT6?5+oY8f2*BDg`5$5S!=!`n z$DxT)NC51aZ~G2Wsi>;#awK=oT%a8{v~LE<%c%3u!%A!2pw^3))6R8dLY|hLFXb5Q z#ILZ}l_p2)Q*`_eg?ngzzs1<6#6cN3?csEYHa1CKbYIrTi0R_@H?pw$*x_eYYZHAn zbQT#CzB}Dvvz*e!Aep5Mu*i}4SyME!?A{cFjI1xVH1~1;&16IiJ*enr81#9HW)1tN zP#|us{lo5?i)(j?OuNvv001BWNklFXyl!;s*g#4}=6Ym;K)>&z2@ zBLVqIGXeEperOJ7iIQsML!()$ z%>#dWwU0a)Rabm&Bx8w?He5wFH#VL~8UZTdJ_Sbk_*ndPAp{eilalwr$^h2}ihnlY z;RvJgHn_WZgApq#)&GU}H#Y-lor=aILiW5WpD@$S-c|O=>j>TYX5CIPuh#b2vCH0@ z3;yiW!Ob1)b2UHz>b-y%C(_J&DpHj-?O6N^0*~2B#-PK#(j}#t(=ARxb6u?0GO`fv z1wo@3{@?#+#XH+e-uEqjyIikdPX&6epKSo9 zJR0RdCZp+M5Q; zUNYG*VNj4s#ac#E@h>v&0q99&2nf3-28`-X=t;@Vdv3&_*AQwImTF2C6m4wt@CeA& zL7Kw&VZ8(D7I?LI&mjMz7pPi!E&Ctzs=y##D*V2GW?RTp6(sLwPQgb|`M4^QE@1_Q zN!C|oiow@+K87b+y7>s(T=cnUK~YPf$C>_Diq1ca28$O)Sw3evrU`n(4S!cK)%qzKy*j9+{yZR zm!SHVP{>FQH=<_?-9GalNQ(+950``XejK&?h~${Le1E^?y1qc7Jb(2Vqcu0}gVWYr z3y=X-#Uq4BhKwbD{d&FR_a$;IF3msxy5+zA>p=jX>xUbFnV5C0*vdPlf90Dl04+v9 zk8H)?Vb>Y5Cv+PVA5(0G$#Q8cYocOuy{>80a<_e_cK>~Cg-Tm&u8^sSb~zp%T5y;d z#uI8-pcWq#$k4lh=Yai(4qpW}=(s9}qTSwE;_XmHZ1FEEKy%H?C4-sV(~VJ124% zyG-8iAzxo#+)#jFnI1Ae$g5!?2kt|@UKb5GlY=o$yCS(VqN#&q`#=B3e{GzH=X$RH zcmt5hd}E}iyV<;9XJQ&pv?KO|hCy+_w#~DmvhC;E-^A40+F)7^PZu|n`@Tu{%;dlX zrRiaJKg5X2WVwGz-NvGiXhK>CAEprW($|Az>XW^@stAZ)`?{k<96A z=i1x|{b)zaYaKt7-geuDH-)oe2b1zhLi)iu&};e4uM@mAP*&f@QxM6Q;I8H6i~&x$VJdzm^=! z2?xLQ zeR`4u{IAj@jcZji1k>vZ`&IH$$Q=2chTu?xDRu7SyT5~yK~OIUyXdXdCrZQxXOkW+ z=Sg*?oiGX4HGT!mDO7(o2q*MIN`u{evqL-yr?^e7p+0 zoVh%qLPCB;@IK-;z3ke&_?cJ0Jd?OL%_Ix?>-sNw-``W^AtwD1BsBoM*Jv1qRC4EY zJ=YI604wZf9hyE|zQ(ilvgDk@*UUg^tDM4{LxBeYE_ zgF0N1Jj}bt59T`ZdC$%hGHz*A(Bw|~!Q;MV2%MXOt|5e2+vX1UX-&XHsvax47ysEW z4f&Wqt_Ovj_w|dD1+Kspgf~R|zF5nkJn*DFC(>U|s}4Jwn7~ICRW3X|v8|;`3KHek zNr&z?jn&K+ z(Qj|>S?@n`+OMc+kug-hzApLifBql&^>t0lXWic#@kvYR6mt#IEcmphGmBKAo-Rh0jtaK zqO&pSiH&hzz?N2;fE=niY*kdDJ!f0T@7dW1z2ll=4bGJ-;)8ncPTT7%S6bt~<@I_^9sl=`|N6%-daeD6fUIy=9b?FSzZapo zRy&Us@N@lm12FEJ3XfTl=Z&xQ|@oGtb-E|J3b4}>6d!6ea3&1w*Y%2gpOPtJ17@~F2BfGkj0FfAmD;sQF zFf7S|xRln(!d!{Wy9Xom;SOF%Yih>t9OuKHTGx?qaXBd#DvGxB>v%wGcd=6>fI3ad z9^aKwSbW+NhkwPiB~EkN)>JCplQ>0^uYc~uIl-=0WO|gKk$=B1f}w!Mpry85YkF+5 zGlgV1p^zXfK=PS*+U1Di8HA(KlQRFrJK@yN&(8^@5RL`Qn@l%6bGpAPm!aNEEOW+~ zgu39Sn6grW(-HAA0h??j2P0&kTK_B8Ni(?7e`BFICGQh}*te*K^mW*~B(^vHlggs> zY6}r24SY68u5;pt)kcv%jii}uQ*7noK%q#I72~K9ac#7_zK&oEVpZOs!%QaTE@ zh6wI$369Nx3;@;hhm$;03BN0mn3 zY2{bn*J|`skLLrff_#kjde<{&uwu&l$mD8UJ8l?#`yKVVHTehb?UpTdP<0tqz$KVTqpE90|RPKoD4(t6{`Wy7(l6Uc_DK(&Tv$Fc` zYlvuqVyaCDUeCxte|be34WEc8{!Z<1WCP%5W~TD}{g$tv-wjjvoj@?QnCB*n)V`F_St6>$RbL_dE>u-Pnpa*>%*D9{F zd)+KAWp>hBq?UZJv3D`>;{?ZVS-jFG-DXmgj9dpOtrh%#A<3&l7d77>afTxZ$_6rB zB+1FxB^6)bCAy^s;Onr8?sQlZvL4E;fV;d5vE;U4m z)1}r0+43L@Jt6g0AM_loR1SxKc5{%~ka6uGVo*z0y-P(Gg znoE`xqGhw5?`uE3z_AK=B~Fgj>8P%VXeqQYUgP)oU-I?!C1Z%ZE|q)S+ZrVrnT|A_ zOpJ8V?se($CptNaxMSQROCnma%)7<2d*e0r2ygDIR|t}cy{YeHg6NL#9Ne`}Z#YkgnIKQbEIkGIseuJmMT&gy_#~{VmG#WSJT! zHi!K2{#SD0>&EA4X!GYL)R3jk^s)H+;a;M5zTe*4GgHiW(=M~*6;a4$-}hU-zD(S&L)11( zD0N$>m041kI`%b2eaSsse!Z^cOln(jR=&63 zG^nyK37#uH+4l;=$$i7~s(n4;AE$J9+M7#b`}byI3sp-sh{#3|ey->G(FTBcOt6=$ z>0TSlIQFV5Wy=~I?!HK4e@YVj1S5j~dieMUEDkVSsSpm3yPgWm7Apcp5Dpb2po?(Q z7nqd@5EN^Q8+(FVBe%ty*AFDa+*d)&DW|!F?CX;Ehd5l76YlFAMo;#fJ1i?&vs&;FE4_r6o>`_ zkq-L)L5qIgTlr$8!*}dL#lOcbqqR1G*AzM1i+=uzFkNcJSg}AZ?}pbUa{J7rPb#F3 zwn{SkKDDhh*mhW1R7dc)(mDl;wE0+$l7RS$h{z=_-(vQXdkp!yE_vVYI)CmP)Cp)e zjEga;wMZZfAp;eW5jMTh_~iGI005Yek(PfEBvn4jNMp@}=2+FJI^R3b8sNG94h?{A zleZJh=|G+fB3L)zDT9;G8vHX1e^>!z>GYCe`&v$55rGF&{{`AW#i;%HatZ^IxjIp_ zD;%b|5>gI<(fa{E8DL&Jpe?QFI~V3cV_fc0uZIbeFonYZo)GDtW#EF7j2Xt))gc{EJ(`EYlG+ zO^1X~mXNpRwCB_=)hYxN6~jYAQRM)it$}qm7BSP!1y6)s7{Qz|1Ie(YZH&FNnZwnvLmZG9Zn_ z2~9gTol<@Psq0_gZ#=0ge5UkuUBsnhLvtD`T-i$^{0HuPEQuv6m!9jn{uV0$YDj5E z#c3i~fEBD(IeS^eORBxqon3M8gd4+w<|rAbZ_)%MS%WP^GLIr4)M5^xi`5uTfLPX_k0 zug{*Q`wi|kGMUEZ{z5^3_8R@$p(buQd2xYfDhpZK8p?SgYiMD``60hPXR6?o%T7A ztFpuo4S`p*tN=qhJ>C6~&?V<&w_cWs>Fo+=fCD>TTag4M0>Z~jHd#Ai-<;@9PJz(? z-1p!e`}+NM%>b1#9Ml&!(-J9BF$`@KAWt?!5zJ^GG_QgZf;H%~Xn){zI20M;S)7v= z%XsC}J>irBSIvGkzec~F>$)iO%^ z{Rw1F3WzeLtO$sr{6;S5dG+MIk1d zn&wSHYs;vEf_V%VDLoXe+}(+P_5*-op}AXZS?;nQ(49?P`{e<9!BJ5B(kqt@ZWQW~ zQm=Yt28BYm!-uB%DDFfqD{VE}oemc{`Vl(d7){}@h0kCUruE-;*%p%&t;sv}z$`Be zcK&&Mi&E-d7k@umJK_+3a7L>~+=?IuQS? zH4$|%OTwGzURcR;5mYl$qDBzn`ZJZBHZmB=-4+Xe>e?+m+|OZ1MP$;=?o>CpfB$oq z4VWJwU6&IdUrvjd;4Dbk@g7z~Vh{)3f1fwQpPm$~F_x{amb0lo? z%$~-FyJ0P>;Y>Ol;Lu>zpiXm|`2+5IKzy!>h<}cH{zE<4tgNL_zTKS=NPAkVDtxYw zNE+!Bb_wN#{&DivW%nHgak=KnT4^N02i_Bh!C^lm>RI3*AwM*cQ2eENA7~L>X~hWW zp1W*53-=guWnfdcDX-+sz$;D-$#Xr|k2V14*B?YCE^J`=+fJG|&=Q1pG^63nZnIAj zw;hJmnsXgPQzk*|*FU~Qb!3PN@}w~ArC{DQIUFYfPx4dGG^azul|0KUkZ2z66A+kX z-hGIHi{eA=5G7!cq3?Hge+*Kl*0CN zy$^C9P@txqs3{QC8u>mhZUPlECJqzqf?F_AL8xG$nUOWs0^i5=`q)RpVYRa>Mm?G9 z-uBPhAb8!PooCj;?AxwVa=^1O#&V?dA$DEIbq0Du=n(+CKtsRIj=$Dwsr>hq72rFpLB`oRVObK@uLzLNIPOZ#KG7%|+XO?dkr^Z(}Z zfkkIpg1-Hh_k9Zzmbq5IF%&HJwz$ZSzcb|j;6L0w;VWl+EPrs9+q-t2qefLL1#q~F zgnN5OH55g0>8dgwikh-VdwYYPPK1>+xAbQI@V^*$sbA>$(kQ7ZDwv zoR1kOH8SS{n`n(S7c^0o82aJ)lmnTv2R34(V7|STI@i2VOCq_}_ab3?4H*oD&Yf0T zg&-6Hzz&1o`3z~=#O)M;~b&|6|0H>)kT^`O39FFN>7 zGXJ!$?aqV*_sJ1jZEXb{tDq%LZvCF_g@CMsVzSk*DXSZvQ$_BMWwcdEBQUCh zx~c+x5WWpg#g;!1iF*)w5)kYT3G*arGfii{U+)G!Y{r6ag4hr!+*27+GfJh921Uv; zx#R0X*EE$GpqB74&4(Nb zv{&&x+~vA18RHh!%BR=Mh`3$sct11&2t|ilKv6Y8J{xD}K{AI@Zv3(l zty>csq~Mu&Yu>e?LRiSH6@PE*EhqjC%ZS^PQTN z;(gya`S;?lD%oHcZpw#bXVoh>p>awenBO#;SDvgqC$^M48Gh8tpGPawS;}L= zRt0k36z;3^l?q$z9#=!c4D8b$RmEG;uq-TruAI@RwVH7(Lgj-HuWL3DD!+cc z_xnA~bVwd&+~}H#`&|UJ>&g%%eEZ`b8^O&?DUN!Y*z8fZG0j#wA0l@pNp#`otcbnP z7zpGmxJzHg;HDrl2Id;jAyeT@T4Z9KZaejpQ{rCudqN{8PAXbw144t#lPyBPTV4m) zk=H72%=`q^97yVnbW|uNDiy0#vkRirA2i^({w^y3c&hPCF;N-I^(=Ss;K0}2+fId_ zCP9&8RTHzjJ!~8{dtO0MRmTJHgjb+hkS=#F^t+dRilKuEw_*&1i|6wG%mol8H(cyY;pzkXie5Ca*yv7 znH{ipFJPYJ$9N3}WU(Z2OKi5iTQJ)%8ve2<7~bh4le-}eIT^tlMP z{XP)kM#S+t#_D=<88WaZzXMMmk*3*G3xw1%TpHmkvOWLh@Q`vnc+Sa(Bv1etE^ZR}`|9xM^Cb*ys z(qa^O6Y)FQ{=+2}$Mb!UCYbPGi%ahv1pvARo58*#vmS0oU&yK#G*~ zcCVuDDU%ej83fY`Kl$oIxJ&I`i?B$=#}Ilp@d)Bk$%HrJL*xOkM@IcdWCIzQAXF~M zMR2*_w_LAZqI$Q(KR(}Sz=O`s@g2 zZOtY)q|4}HT8QR;gy0Z^a^<-~o8-*CCXBTQu2G6$IWnP959@~KdafUD05UhdJq(@` ztR5#P&LsbEYyZppy|Jn(07zQkjmR!*^FL3B3aWSCcbpx*j?j|Y)s^SHf-Bjys|`l} zXvCi)ALd~VhC8u?o}cW!5SFr7MzY$;t*;Iop5DUmy?-k%UGg{pRXJzZQxhP8n(&Xd ztF-XfvWw1?J@S(Ww8C3rA0YsmxfAgvjg-p8^f>0{o`2>p^6A!KdMomrJ5a@>g)3P% zm^nvIo4r!P=g!3(i@%DKy>gK`2Q-sP*%0n~n_Q6C?rKU$bIHQORb!MOJdf^j9|v&EwcKs(&=jgL>Ll~ z^cMe2dst|GwdDmQxe0lbK$?{UX}FPl5e=ymzBRKVxyFp%1FG-V*=R zRw~2x(v%X?IRL&T=*{WTZV&u=0I75Y2%Cuo7~fV3RSV2_lcr}5hcwEVp&4P zKunzE`7S}L?D%=sq9)O|;yb^Kc{uHBm{29aj#Z=u(CD^C!OtX-jTUQ*-`E)NcRGWB z!^W5bh0-qpBy7NE7-N828ccVJvObJFR*@Sg>wa$yLO!yf1NpF^WZz)?30vdNT0h>m zyQvJcRm#qbJV{^mJtoJ%acn1!h^kA^KctlEC^Co`sjcS8$>c~|BzCP+Myd(Oo8DbG zSrAOE7Lm0`x+6n$W&wD*X?ds z8DRL2wcl0~HQRTde2O+Wdll7?|8#!yPD;ZCVNn0(d%AB~dGdoMk~oNpjh@9`3^#yi2UsIU|hUBH*mM0T^W(zTLtCRnkG<+YL>@va!1Vf zZ1N!&0w(X+*#lny*J|`B<=POMHErVxk(hmvE7_XdK~6l0vlTiu)*sZh;@|)*POKC+ zQMts_$^rDj|DWq`w*qhuHbwH?pY-CVd$~iH?AY}o%w&_rXd{WqVI8rZgtmm6tniCxk~y+iwSBF=)5}#h87hepvr;;Wt$vfU@NGLpw!r z)V!L~*1-F=0y47=u`HR72xV=IQIW(SR$$NdTtCtPC^4?9nwkYUO+OS0*6Q{q7^Hwz2rt@Fp(Lf|h#Y?u$^b)cnMX3RMbVox}VbEYgbX`a);M03VEawyj>H zw%4$)Q=D~y=ZEAVBV8t4v3Ao_yQD3`*!~c(CEd;B~gmk|zDK|jneZNIiGC4hu}2bgE01KDU3;0hWl7MN8#|3G{uSa zLcqfy`9Wh2Bw%%UbHc}FyN1|%5YR}OB28Dy`*&&C@|yYUhj$%bj?vM+O3=a0p%nhy7IXeOcnptN#K*EugpzRRU@eY2u;XXblr;an(U z84J1t!#o}8Ke#z=Zx_F>oQe_U@MH0%UGHq?$W%tP{VJ~xj{aOMxbzUY+y2ILrKEIE zm))Ll-hveI&h;F36yZc6K^4^_y_Rf~KXjAb6QaJ03iwg$mdw2gI4)PVePc%~SXx@o z6{}8`9k2QtEKKg(w;Tmj>zpi(iGp~D`KDEydipMWf4{}_+TY`|3V5!cZva|mH&tq6 zwVu5G+szMqx4lU?7;n(zKOfT9>k1H32HM=9n;$Zqvq9nDkC0E9iR_^zb28%yQQ4T= z>B~PnllVMeRW(dbWF$^u(W(4FA zhBJS)B3>6iLJkqnF2@PfH$qo$ zB+l-EpVTdgJn`)p+zmTgQserJNsrBNLz%(ivFj#zoFDKuNya@A7gs9E5r?g zPVwFyQ7cliKxDPZ>viRTghhWm_5Znkx&gp!uOPRG_QTviL#YD#0g%EB?<`#OyeE(_ zC&tNihlD?=Z2CCh?Lfvt9d-AyXULQ%vzUH@_=L^I7!klSy~UFp>7BHM5OtZCL|)6u zd2Q~@C-R^$C9&r_I1|cDxQi*8t$q7mUOzY@I(_zq8sG`*EkO=->kgkSzBW$r!_`Oq zjw(u3{O7mHoCqG#Kb2NY@|!Ca6J!sJ0YmY@T9&`N`g!)j&2mqWRB-J(!3&%wsFYZR z(bWDyzrK_gz%-Bdh>~;DCY|LF-M#5)r1&M+%=h7fMAKNu1S8&3-!C$)7ZZOR%9I zXdHENQ+&N%qBfi8JKlq-$ouI4p6iDj01XRK*qW;YsqHA$lOqAGa?UF-WivL($v2?> z(QJfU5?qU)b%-ENpm=!g88I$4{+Hp-7XG{h5?W3ECjr()a+B zN|Zuyk*vTFL5#5_qK6TQaQ;H|vG6mt{V+<~I>e%&8Ek2V zLTnf+{?mK@N_IPXYPf%DX85};$IbF{z)4wf<&qK0=oa8|4^INBkH&c4h_^$|B)Y>2 zXk+#3)=>FjwOCXB$#-N1HMw88>!;#R4NH4|5pfAbNkr7HJma!OjR@z~47hYMuPtLJ zTm_n3uZIQrTtAHf;Nh?ih>@hWlkQ%R51^`S5B71#NB-Jl?%xkTn+BGgSR5i_V-nLQ ziZVWQSK%0N=&QDgef@P{s0iqp^|UijZvql2){Y+jlR!f}WPPdAp8-KNQSOO)cTAo4bi8AOPN2A|8H3z$7&_D`Lp5JL~UB%E9n6OfkD=& z;BI+Of85@ZJ8?x+P^sGDgUJ|(8?22CDYd@wEkK8ilx15=wHF!m3M4}P zLpq+Md!W119-Ad>fReb2!^B&81M_pp(4<(~*qngJxU*4U>84Qemn2d8LibLEfA^%= z_wtyw2z(V4xn36sBcc9ZD&dctFO)*Be;=!@wr+4~*1_-`VxB{ILA_JnH+>!qN zdMMFWE@BFH$anboi1wA4atYW+s-Zu4vy2mmw%mouI@&21y zdyAau<&9tnW^s7gL12pH&RkVZvjTqYx)TKPl^3^YB+m!kRoz{#*VP?_pX<4PUGo6@Sl^^)u5L zCLNk&>gV@mLNskG$I~NY+71a(m;<1?XS$o&XK2^SO6P-ZvC0M_p=nL-u3J1YmZ>$( zh8)&#s$2zLF-Ib0c9NF7xtfq&TVBLBqlSuXWbr#&w3%S(PvT(3?q(qe)_sKXq!!MU zrdI5p(6EWfx&7-)TizghmiOj;j|?{|l!^EDXH-W2MZ*RBl*6(Mkup=1=)um;8D*L1 zpZ!rD`>)daKBY-2G&+3{QW5$6`!9Od@3*fUf#-UzA8Y{jqCRij_xmtkVh+3bHnnjU z_^zeT-WsUOygKL%Xa}T0j!~N(k3DdSW%!WS^-G4l6Nbmx@?89t;9Nh@>~%rX$(N?r zsDh%3x$d~AWc#?&;uwvLc(tNO6eZrQ1DSxrU_S0g>yS+b_y>#NC~&&L-W;%ld+Adg zYZ({y0XNG+R}?idDwxHf6@agG)L2bdnhgzv^ED%talK;c zTB(JY;37wHatxT-vXEo(54+^Dq;A%=%Tdmy%h4Py0k+1byzh1UoCjJ}w*^!XIyDTQ zmjC~N`?6w8E-`_q*_Z43?a(ZYU*c3`3IvZ|15i*SGXUU(|Mj~=tzadF? z_X4bDY77@2x4hrqZLM*Ol?wa0p6h2C0Dcf;dA84KsUP5!;02vGPx5tG(^^1Pv`wrh zUjR)0D(yK36EQgq594+~gv4+5+~9p4q~0a%t5Nt^5XUkYnPebnEQVwVO2zWl`y(a5 zidjv$lonKP=vyFqMmV-2-i|C__lq*oQG|UBLPGa38=!FLZOwqBNc393J#A4#| z7_D$J1RI2k-uGMn@sD3}kB0>KTz>-u03qs#;hY)wzCDt=E?a1tJi%+7xZ`xV3cz=` z$F{kqM=$?|=U+}*ntY+Vd#mwVJSm8t`r0!&2R=d|Ir2@VeTP(a4)a=@)Q3ACGUYTeaa76+i3@h(|*6gh$o5`JBj%T?+1in zh0%n*c#9o25(-p&t*7KSMSF^xX3V9H{P+Q{5q`EvLp63Uf-Htxb@QcH}ScSWS=XjLq0Rb5&dxIhC>`1$q$-q zHPJ5jLkXrR1q$_m85P|cCKF)Zi;E0RwF8;OAQA5HnT+Ow=?I;xZn>O<6i9_DWw;dZ zZ!{7G6`w8OqsU$H%*|mKpM6XpJPq+XZ>OV!P4;WLh4KWNcKQX{hLU;)Je?=e%R(2* z$2R6pjUOAC;p%9bA_b9{8a?gGCw9IxGspv(1IRP~KiA&^0f^$GA|m&{XHJ3pYSnXG zXBK|u<-kMUqIgj{H-?x=q7lb^w(i0~Gn4zi)7ZpJ8!6G-^f`S3!s{Fh=J}v&8g%uv z!kvYmlhX>#7~9kvaPOZ;N%Fzbt+ieGZ*fn*Y2`nBkD<%YNi)ktipG|aWALm ziH_i_KE|_RgCx>C0Tk?X{eX6aGZB)(lwf_Fk$Wa#E;~%Ooi%&Eqa4zgG|cG04-WvU zdTaF)tDu@XD^O?q?gL%H=gQ&r5(4Jp8(dvb!?+O@a!Adr+yHM$f6?4|--x59-##4O@qAms5wF)}YoZf@AsBwQS|&rI z_S}-RR`-m6D*i#>w1oSkfM>+;2K(#byRHWMzGv#^bzNJ7b1we6@srE8{3$xm^*3q& z0&&eE9I0y3bF%?n2iXxGcBsR$=HkPLcy}`EgC_4Hl^|6~f>yu)F(u&snfHGV7P{<= zrnJ{|spP+cM-}Bg%}i$|+S&3BFvxVr!fX)z+Z_gW_qnsBZ`-A7SG;u=wf%qWz0H;z zNscTGAegF|bKn0-?>V=tB!=T#xC1bQJ5{s!M!5)Xx?3$}lEDZEV6dO#VM8WC`SW~l z^0p?R4sr`~B)tT;upQz(>}NI@d6Qdii;a^fMZv|ix){qcSG{os>X0AO!-ZVB;xIiD z%=h~;)(rvcV}hRQG&lBYdYN#zhyHLvg-}A_Wh(a=OI~OhH?5{CZg&|;<#STcTJH9> zOE)``0`}QjKW7$F&ozMe>x3l0W-m?ESz-0COrSV|R~ur*E1_s|(qRu#dVHi-^r*o~ z0t10i_IX-Q(E7y7uxcVV*LJ_?r?f_3gktkI(TAt{Kd*1r0ARLzWzJ9Ne2l5{MFO6~ zgtlIu z?EA=UB!j!ZW$8dM9Wrw@G7MQut zG<41h=(+a)wldNKJgjXU;N;bgNJ=NaDcJH(!SLUXed zNF#Jpn_O>!3La| z_d<#5r&2&TJR7o2?Qxc%hs55H9Z2uMvJG;?Wmhyd9vOIVo5{aS-i(~ZTevQ1 zk6SPhOI5`m9N>9*2?0BI_;Wg#zi=Zd36v9M=TQijeIYEv~6rSa6Va_g(2iP}_oiYnzNGFJTTgwO-O8IcPuGb{1 z0zW29hEzpvA8AF~g=HhnF%^P&E{PB;?YnUiLNo@NVbNN^$%|osMhAWG`*Y9I+&##b zRYfEjMROmN%BHHsGcj;3tI7sk~ynGTyv-kct zndkF*UjOS2z=ZhA-qvFWo@O%mpxT5bb;a`1{#U81H1I5^N90Cqh|_wvYwNY~a3EM$V&)-VPA_S5bLD4!VbLe7Btaevw2;$Db@`|i1# zIC{Tsto3S6oD5k`5GqgoFgane;HQIHnkfwss#1L^MT#5uoAm8bAjV)t#BiaBGyY99 z0cNP+kY>1Z%B*)t&{UXO*{n9~lQU&gT-03N?{{WBjOMv8+-2NjUjN=40z&3KOaA}nJ4zEVYOi~)QyN>yW zbnCWqIFQ?@2qBA_sNgN(P&N;P`i!RoE1U-P;6)#&-T;Z29Z-aGx}10T9vYuXh72Os z#e_?k(veKbr!h|CM(p<5Q-|~7Y+CQ(G)0c#>F`*Wgri=Oqu~TKJ0SyUEJPC=+{38f z)Fxr9Ao(h;8E|7|&1;Pp0jsk44EljFU)QZHgIB^K7DPQW)os~Pi$@ZrFQ-cfSiioP zjkGupY<4ga6EG*j^~pRXu0y1+lmQoKKhnwyQM%3_LR9X&@^3~-`+rH|XCDGSa|r_R z^URJYFE0nD%K`VmGygxYZ`J_#!W8FZVl}-2e4nghIR*B5TA0?((wdijmvi~viVFt` zxi>l7Cx*Jt0AMFM-Jrt$+3B2ro+NIk}15Z8?eO&Y~Wn^+#BlmfqZB#xK zX7J&sDAM!fQiagieNL73#;3K%4quk&EzV`5@0x**u!!c#JU+vK2wi1bhnK0)Sa!6t zenoRC+3@wx&?SwInmsV2+s&)?jDnunrx{SCNkXe4qS>_Md(3IO?oIV-25TxGZ7m`n zaHG{2-(wa3X=qgIhk(;DUD9UZ2V~E|sx}+n#U0RI;Bm!8U4d)}POd0?7D5xWZ&q&5 zq#X6sbPGzF>z4WcPcVA%6J&dTznis7C9%kaEnb?L|9iHH(q}+1RPiS6Te8V|-}h5- zp4azk00J7bl{6LyR7~y#?RIHZx#UIh4|wssldj^a0Kd&Y(-udpQv1vgaJM*QoXdtj zj4@=h^*T7NWuQy$U#&6p*%6HFKe5TtlS$1Uzt5Y5AWZ;-nG zfV(bszY)?MLf#0JZ(_n#+)MQO-OR*5SUmEHYSGhR9}7b0U|j7&EW1=Yw*(rd*N%yD|>9sl(n zzR0Hr9KMJ>F2DY`N5_4y=SpcxM?psVZeZSk@HJ*LC8-8TQ2IFUOSYbtN|fB>zMX~L59*F~uv=$e+X(nCOf!ihIv0i1 zfH5b3U8#BVA(#ZfSw#En%*DTFvg1L~ce@eBfs@^hho!|r2g2T;yYiC zZ4F{@XHp^%{<2u17i>EI870_RoBpu)`#OY~5Xh}jybvZQ{w|LfL+2t{h_Zvp5aYE%REF zf7_8ovu$y2k6mfvQg)hY)Z^KnK!5{$PDV;J?Vh6nt?$Wq`i)xF6C)_H3iTn`6J@ZReBG9N=lhvvDWhcic@(YnW2_rjwCcwXPB z0gxH;agTcu_ih*gvE=mNsq(#UtI-3O>U3qSTdUf%9K6iFcuoqf?&?6NGb z{lbUJqpp8VK(%rJ!=+2NiJKDu>;6#KjrT7@%gk}wFnekF>Bx1j!Z)gkObCDM3jhEh z07*naR3}RG=a+)86UC9W-s+@7aGC32G2v`!B3lU12Ov3re`Hr&uPYPrbRk`Hi3V?jbSgw#@ z64aC-SiDV5P-Wrxye!BceMABQ+Aw}Xsr&`G1v%z5z&_DP1GWH^%eE*YfnuIIG2bUAHN zJ0Z8M)7J?N=;S<%$x$HaDZs#NTq70SqTxJe(8P8!W!@1`{MQ5ZddYnkp-%E179yE- zeY)eyM7T)zhS}3EVKoA3*{D}z+KHbhxn}un&g(VGh)3n9zRB;M;*6B2eq00@IdRA4 z!_G~HNV<{6FfmssgU%Z~8!)EaeQ%Ocy2$sVQ!YUt0ygRLW>Io3{KzF5V=T^!?>)=& zdR~9B0f>TvX49SyVdooSFLsf` zBP;;rkJdOOTrt5qj74>x@^wF_Wj8qim=YR=GzxP5-MFid>oG%2puqXbk&NFPNfPCJ zkfR+k7gEUy4x0r0JGL#PmCT!5J{5myiiYA;%-Cj4O?@8DpaDdUdi-qEw?`3ukEvXF znU%Ai_9OeM!(XxSd99e|9p&JLF6AHMqr!;BjRacuhUY8^OX=KR5Dq*FRN90I(iqI0 z*M2Wm#=)gdP3+c`Zug=dpV!RX@WKdDW~rp9cj>?!t-g-?a3{`)w)-U4f9~6TD$=|N z(7{nZF&5k*%<9qhK5HGR(os1aKst%?$pv^`-vI$2cyu1XHEoSuZYEqb9AIq> z!rAqN5GaP&h@k(yxXEP~!0Xob>CJU73x=&p(@93h$^gPja*YxDVFzO( zT}h9*_Av~;^4zr_M zs2Hx=9KX0B2N`H@*H5dKn&fkR<=niE5zo^K_EPZAu@}S`pU)SrYK+o&XHUK>M4$xK$dzqd(=hW{OL>?21!48;xw)-ruTNH3*X78zC zUK+d)5A{LM4K}}M=Zm{@oHDve3^gFqjCl~gB@$$Vn5FyABm8U)7S_h-cVQ&oj|byC zi>(!7Fl}*2SW~cpZC|Xz#A?8DuFnBKU%B{WuoNZPXYuQadfnIvniF*>IT#vKQ+KV9 zB>nUkj5w zpL~cHmkcRlqbD=naw0OtR89z_Y|k`3FR6x7^1WalRL{vkpA3if#yWRQ#q5%CmzT;T z3w&OGya90O@xN#rJATtO?MBO`z@P^b=o_=!er=^`RZlOs8q!NkwW_e_B$2)imlw)1^VmiL^(t~9&Z_LizO zokuPKn3SMo>eJdFCQXE^wT~=}c^(evijT%rHbD-7D9QeWKx}Cck4u&*Ww*yPrO^mt z67a!C`PpRJ=QJOL%N7r8ie^NG&Uj9=nEOzUcSa6xlU0{RXzaxWNAgfSpm&3c9$@Wj zP3$)`L9CSF37^+bvJeUZK1T{zTqtWGwqiTC#JBroHdK>mVlwi%kJXyOj-Svf-M8(5 zNSJkmjnTnG$E=zK_dd;^vN7;`P*wsUHzx^{Mhrmhs}Mw|avLhXpV>S^w6OnPBthIa##E4_sTJaywQLN{#o_}tb2$@~-e!o+n{)taO zFzHrQW%Cl~Nnyo6=ZBkM%XSPp___ySjAD{&;AROK6n`^JoGa<$@FAD2BoZ1ZXQ6*8;MqnTq3}@vYf}N{>G_LaKaC{fHDW(&O7fFY4`Hv-xNIbpv`ch|xaO z#EucnxJDAO>sp2LhRJlTER2z!a<1h4w|n1fr|>i_g~Robd>UY?7C>*zY$_dYUno&S z7F-(#p^@-fpU3DJuOm9|BOARTo601fC-143`0rJy;q+_-jC~D+pNWb~XQCteT(}H* zy)L=mgJRTuaWy7qqyFWu_xq_p&+E@400OM*pt0{oyrKRj)y5d=JAy9a#D%2G_BslUpzT|tw z&hFd^CQUlW-{Q&vTq>DwFn`8%U6lN%dez<*AYvs3q=IH`8UJJ*1_w;!Nf07pn@lW? zX4)Rv7J<&14*^>~uOhl8Y_*Xx$Rf=anuU@x+PUMi5KdQqkmI>-Nt0zUEGrj8^7+25 zYbuAXOYZl3^T|IoH7a{kAYfK>+QoBHrjj{QMpfhWc2keOox9>o>=L=}k^4UT z5L`o6x~IZHMZ8Q?N6mWM*)h*RS`I{LG*0s#UsOF?u0FK=u3Cs+!ZN_*vSw^q&%KX>yD_8 zYZP*XYaw)t@pg?^>esJvC26{gT%uyvob2y=oi+9Es{=CRBEniFBPN`G=-p7^ zp{wC|yIz1QKET=t?opdeqgX5s^}{B_$6kST-U2?i(z$PYI4~cj@A}uxXA14Apt(GKimLlvvDmKFxYwd zJ{@Srn@qxsUCY8X7_esYiK55mLZ^@&d>qF*1U}_(*KV8Eo*zb0^1aEL?Xu_UKnmTq zLa3=^1Xn-}xo20AJJb}!Q4#X_S1T)PyEusGlPl$M ziPRDw>!zC5|LbKbZ@usJJ+`SauFuFsL!QL^rY={^tyy31@$2g)KYzWK-0}Xcj(zyOnlx*QpDhprG9(ZIDcI0kk|S|h z93+fFG#&5?QBd9NpRI--kmoIvF^83)?ESZh%$416mob#q5VD$HyDl-aF zDuCzp=No{c!6br=>3D5dC$O`tL&H{3OHH8KAY^9E-~nFjW8CpFgBUt@h$YpwKj(u^ zjt4#x_d<##j_pAi5IGcNIxI5sRMIZCkI*K*cHg+0$7aNe13-HG6H8jQJo-3D-uHVp zVCu^UzqkQ3ELi-JqbbA7CknwtD|%c^$~ zy{2?;ZlQDCgkdZcKC_T5Jw#8|N}%UQ$Rc9i@_vtO`plFjaT6g&y!?&PhztSAA@8+A zhB_MuRMiZ5-?v<5%k$r5j9-a_m|4D$jwTETi=QUBr9wS~bor$8(}?c3Ur5%1&Dfr z&TUo`k#-kAb}HybA_)`fNvqGs0Y&6#L!NjusqYgplD^I%KNx#kVyy{L$Ku#@m#@+F z#;F{GM%sRKj4_$SNp@4(>#Ob)J{Mmu{H0#dny>)c?(S+hx5uwRF@NU}f@bZIAxG%LNZtOtUFbDE{m~>C(-95cZm1LS#LN?2)(Vyf`J1w_LB+=8;1v zMy#Dg<XDX#fY$}~ksL0BBwUbN>Wo;QG&ShZj|BjTOLQ=G;0?no+ZMec29f-e&zsK+lql#>V znx46sO?bS_elkt|H}98~4|^(`%7)L+$zN1{{`@7c%V@VA^3+M{)E&AOM5*@Tk48}L z=zTGyd<{lfbi?xy>k&Cj?MkuGoI??WT7gD~Wua4DaoHtfxO}}_TwbfVkA_G!nW1Y! z-2J&g+}xWBo=Wr8SjAGd72+Bu(m=`@SOX2;;(NsJvZeqk!k=<)$TS8$3Oy51YHmOPW=z9*j2DjPEG> zIxG7`JxVtzYxtv|#<~(T5x#V5P=FH*GS8q2Ltb z;3C)ehYZtmmrW~#!w$3zV>)vX40UK-5HYR@pW@*%;C-lE=}tCQY9Sv^n}iTlO_Xnd z7O1IVJ0Sy36W6Y--oF!K=zo~d6Mk0Rf?kLhkmQP0%F{)#$=%Q!f{c@t5Sp-GuKOuI z%UC=A1;xiCxR8V3LCk5_%einPHVW;RgHbo&zJK2$GVW#SqvG3rUFK0NWvxQnS^Dvx z*Yy$~o~&{AiM*KF@;G2l3-8^Hz9Y(`+k&we^+5|}e7~|d1>r$4|7`H8M=F&M8_xdB ztIGE8_G{qcq|ntR$J-SQgqj>lvbx{fz%@F_Tk#x9);_&YPA%2;Iry{9X8VL#pmU>$ zOg@J{h5vbdlLlZ6+-+CRs@XgYeYmKZjPXlM{}NG=_x+Z?zAkx#Mu#BzrVA!gl<-52 zrPR739%^v=j+(4t_bH>>+@d2L?Vtq*S1`azMeU{S_5oaCW%!v7N8( z%?Cj6k>Nh4d5l=~BugUtp@&1iA7Rl)406ER8w8ZNX}TbG_}-V~&NJUV5CAy@|6pM% zh!n|ci`y`SjCryxau*GgpB4G5i>ztZq3LQIL!FUfMy7Hv*STqJJ4lXN@z5ARaa!Iu z0KD3!#CjG^GT1Tdc^PB2y1G0xj;oRePqUJO8{v~5Kon3jqx&P8S6eC#vne^;;+;jB z3>8VhXRBQX(3r@p$g&p*3EF~_1b)wlbVd24(en+g=5yc&$PU3)wj@G55fLY?y@(Y-Phl-$bTFn)JpM$j6{t1M z>hGabQ4?!*u&%8WTVLCUDEXey_jJ3<)pz86CQxdJ``sHiM3>&45r~7k%QhXl>;Y1} z#8$NJ`i$8Kq1|g&fN;#R3lv{2t4_bvAra$P3xw=ZPCA(LE-22F>NZ@OD7{xzX<0$Co^XgJdj zq501S&&~&SdQLdbKPMVakIwlBa2a$fFGpz1Nis+Fig7iu$*!PEYEvijn!oemcGoRD4xjt&-d-~-qve1 zuCZoXeET7Ukkmb1=09i80Q)d$mOU?eN>DmtHY%%N!;g0enliHkmTqDjv@XP(_2o>LokX3&5(elS5x0?&kdMniLiu{f{Cb42!zP!J1e6gP5?bU z>=pXepdQtYT&kui^ZHH=fLB)eoC-<@T)ycoLi0Cr zJI)Rlf`*w`=D)G!l(zG%7n;NLp>hu@f+E@2=%m{vz57m*qQYfXo(H5gXDh<8X+0Ny zo)DGcM~4OrteD;Rz@DxcNbh!Nwj5CwFL{*b6y4Blmo3dvwfq{e;;QV0KmPvk2Ky5t zz;?|FpRoqeDE=@ByU2Add+w{)Z90=k>h4O#?8a$(DpmS^XQyM*bG zyYArbD4+7s*?^`XW^{Y>G&0G^TSr5dHOUUxS%*+fS$4(E9^NnI5g%bjWt&>0)YSd2 zy)8*GTfdlab8rZ}d?=XhtslJ}x)d|j2-4RTArED*fEl7Q)d*v;>~CxeMcM@VVfQZR zaOWf;!)Hy6k)^GVh~jCMw!d**xEbT(&vv*a8`J~*%?^{;n{$_{TAw{#LI!(}bhD&x z0EFv<`25gk2vUq0C}78r`&phk zWpjKhD`B)EI>Ddw5aWG0gvM?SP*1Z9BH)opz+=xxIUd8izWuq{G~7`$@iCTRi>FJV zAMqM(9s^EOzCzBEkiG5+!ST)aU-YmRXhj!U=EDa$$*HlfJRI*dS^9&Tp0o2+Q?5f}Mj)w!U=8r8)6 z2W*8A69O6PJQOfz>EV{hmy>JDS9i{cXAks_uFt*Ghf*ccV`4xaH45bL?AVX!dkzhr5nfzX+J#1jrqD%YjrpHcFH40*QPeIL|7aj!_m0knPOg`Y=-EhT`0s~T0b;j;;*@MKce;Q= zI;8EQG;K#P5v$?G4ku=5YA<zYx_^Sc?%d%v#BjxuQx{orRNtbOni=%^Dmgp+j*&Z1*GcZ=I&-;cVZmvadH1)iV8ehH>y7`MD$)A#?rk!5{Ed@m{<)0Sy-y`Da>Y%#6?zr zKz`XU_;@COw1Ajs28>QUU;9vWM>7paK8oc7KYRtt+SV|{-!KJB-jW>F1jv`b z^7XhuB|h#LRGWD;QYidR-IBy?@FOYu}YK1P?_78<%V- z)+G0JeZg7*oay~E5f;(XY#Itpo`-MlbVq6B>YNQ99No#Jv@!#PPP~YtL5TGJkU{Vk z@-z;@dniDAdLY?9w-wYxJh%|zWHuh%8_eb3^rfEf*K5>U_c%B~CeGPBTM*K4iOMmdr`ujln$ zRscxYN!B_Ju~@8C>8Q{q71-ot`uk?L{(j%})})0{IFgCjBmOl1l`OZl$HW#eQBW1{XlwEwL@L%Z;{(8wpWFWZXl{VoI-T?BW|sI-L#!T+c(RYv)xg zuD_KAyNW-5A3~BkTTK8q6k3Q(PTqcS{*zV!op!ik(eI-2dQC5i`~D^6wa`@{vJuln zETLG%iQWuQ2CsD$HmfA{2yM5^*EO&8b-iSayTQ*KUE9U1mXLdDB^p_;g)IqlCEQW7 z?hS2Q$%@ND`bwK#442lk|3qJjLBe8foh(CpaP_da-Fo~S;(lo2J)5y2qF$ml}sCFAeEr}2^B@_xS`H^Arh-BtkbgxWly?$Pt-TY4N#kV;ci6eA|* zczJz8_Ipg^Ge~3i1c>R1_oRNzm1k_cArTl!+$Q>*!l8K2_r|0n%IuXr+kW>A&`P39 z!xzg!i)KYcJQH?->kZgcG-)yBmEn6ld_mw;Ymh_qxi;oD?XG1HvMH%#nMGx%7e&~? z#{eaqK%l}ida6!*O-xfOKi0i*ErkO%9vHNepEV|IJ>8?I=az*su)AUweg!nrWO=dF|t(Nl>hu3FHXuR@J#)$s2rHcC&-tpugXrV`<5G ziE4QvIr~}ApS8XC@5rC8@5|~syUVZlugM9~7jG-z87@!$M(`XTxJYtHMn=HeXp+Jn>p(m*slBOwKtiH#LZhJ! zR06hk%;D-8AuCW6il{UX96P|r6`Z44_-f+yHu1>p(616o?ZYZMI3Z|Deoy$yuR}9#LtSpaW+(Ozg(g| zX0vXssr-aA=IsJ$p{r55E}Ltr(a^y7e!V}Nyh0hn<+^?>=zp$=L{04V61%P>K0mML z^^F>Ug4Rq;-uHWj{K%Gsha3QvPd@T~&@qEy$XLmEV6G#5N2tXI#|O9!Y8t@^jAUpv z;izTz4<zBSqE;qe`7^`ToOQ3=q z8t$8!6X7(rB&Qylms(?3oBSF~zckUN?8X->2Wzs(9)J{k?zy&|DQT6FUI~;6g;B`o zzjy&KV&?RJj~NvlY;2Krs1tHtmdGVaX-RQuMpT@OD7J(|kY_*KueeGumhH`dH=D&d zwfc1Bvnu|t*9CIFwdcm=mb2xwC=lRay|hbJ_r|zZ2Y|fgN+cq#otiH8g6O76g@VGBiLlGG`gk)Z%t0xD84f~dgrqxSY02ZDnWi-s zYm%541zqE0gKjr#;1k@MD1;I^5uOBdkGfC(X`Yk@KSs`rPGmc2l1KcVqY??%)UQ&B zYxq6jQOkv6H^`YrR?E%OP5%1vlK1;P?R6-Yl^q@D`UO`)yA)Hr80d(?kW{r5n*5GQ z+6S^$t@~xsLggNwB+RkU3t7+QWg_qU-fV8Euv_!vPe@10pFt*@-Pzd(8aqwI#S4-W z_HB@jKM*Ym2Uda8pB|J#%K(Z!H)=&O?+07gxZ-jNV zMneOUu3D|hdM=nih{zjSd0WLy!w@j!WNiMtp4T640Mta@?^~|xwV=&G?E4Q#S_G7K9~B7LjFBBNpf;m- zOwFlq3|(-oiu;>(_c^_4Y1mVcq9=P6mp#d?q*ggOdXTqN81R8`7Z>n!?-OHF5lFdX zPUNakn3Dlb6#f`sRU26j6fU!=8fEIVOlQ8nUSjI<>+Nz~x}aokuF2cN&~x8m6#xX$ zc&??PCRqHbxmhR)`9!b}KQ+#eMWbbzO)yl;?R{aj^#^Ih2ASocaAWi&FOW<(1~pvcu&NW|_L zNyHLlfzUU+4qo8#D3Y@_yrCJRtvldH9Fvl$1p-na)6QGP5MZbsOWf9$weESp6*m zI#3QfEwpB{iLy$3jWM!8{FpA+P#BH-eY44i`*%U=c4_({OxC-~KR>4d&D4-<7CD~$ zff%dKYCo;`T6HXZgQns5^YR@y>*HMpTk38tpEP@E^qDF}2o~15-eZ35iS4IU5RIb3 zB_NCQvRdYq8Rk1^t})^s_tCQ{oH$I8fq-UR-FE~DyPJ}d&ZhZu-tSv{yyf-!0p1*| z!Les0@Vx$T1Ms@OCgg0I8P}8SBJv*I4zIdtod{jB>5+H&n9>2CbHk!~cZax>%O10q zWt)b2r>;w%wmG1szpjV}oGleITL)Man@b}7?8HBaHR@)U+$u@cbl+l%kEsU0qCY1w zVDqs%-JMX8y$Jw?#VFGs)&6~=H8Er>45x|t{fiS3V|tF?b&si)hM%0_MXK5o`^siF zWPxa<9K4HEbdOS8Xe-EOy1~$zQ<`VOprcX5npy`(VeZB8)Tkc9e9FMbaxF65>1LC0 zU9Tl0`<3oQceAdhakw@+fj3F04pXn6qIQun@7&N* zl3wsQgd11|uZonm);&=?2-z&d%dm`xxHC#t8?+CMoil!>NHY`l zO}o!~(~|FzL!N)4MfetTO8tfUftRrp0x45HX1aAonze*OZMXw`hht6qD%#?cL2?M* z_t~JWYGVd;?csSX*@NH7=xBb5OGIv%xLB%~Qz0DaL?$I4|0)PRTwYhRqIOA(T5p9; ze>3?5ST1{5)G80xwOk=#^&v$tyzhH`?$7)F9z#6?dW7Y#EoqX7d3}XItDjNGP&^Yu z3TDTIMG@kZgc89n$%IYcOoR$q6X4{aB(wY=P$C%l4n64*5-X(>PK)b-R?Os$iGC3I zJB83D2U+VU2%pHoJ_()I%Vhkz)^|GZ|KS2s!lwavUVpd&FjYz+8zZ{?vG@QA&UCWb z()vOSrZgNLI&EaFW6+P194+>zDxE!!`#;UYAmmg6F});Hz_r98*I~hD{k0!~{4pT3 zC0Wfu^nqzWN;cLH{?3rzEQNh1P*JO-0KGaFfYV9DP;^<+=FT>l?CU!l>wr%OKT7=b zMWzF<2dMtHukve6B#c}@31w!FmLcfUSiS<9fxw_L2`eS~g3h`mqJC0FyuGB;C=GV%i6tAl(1TK;`wa<%VbgB@ckr_nxzo z_ngrsVfMyeENg1@b9eS(60B)B_SqqA3yps^S3{||1fkEHf&o#bn3l`CVQilZBbWP*V!naQ}{^6S@oaX3^id%=CATRPKOrw`R!C(YMPD%%*Sj%CWL1UySLvLuesL+zXH)V zxpS6%FaA-GRE-n|^POE=-g;e13{okEHm>XIkngZ(tqF*I4{l_7XbRZc$dA)r!uqM< zj}`s^3+M`8VJTdLq}K%Pz@0!Y0v4>kj-Yp=N)u>gr3c$S;M6%m1(EN{wFRa(c4xe8 z^>nZ{X1Xdi2!-Y#X?16HG?WLg5tS$VB7$kb$H?QDC|BL<;cb9sQasVue>dPQ z{J!Xv#1UPPH_0CuY~1&~cnc#7JNkwMPbmB>(rs6rqMgUkRR2Unk0=n{E8Ph+))wU} z;LZIJNTTAPLO}(BHz~7agU0Iynq4*%C;`uika3#LvoxT8QF)60^ZGsw043vvb}3-l zTS3;ey8TA_!@a-vAONtG#n7K^m+EpLsUagh1O%QM^nL&UGUVkiv<=U2%uG zaq8TYBHOM=q^(tSJMmdHAm{HK{Dw)9A^&cpUCNY&u4pOFWpJt?%4!jDP>7yBTX### z?)b1mXnYO_XQQ~^UauD;N?KockEXWm`9_BSQhIn;`C=P#E|_>l*%VZ%DUju?>FEbj zM977waPzsIg9=+Z1Vc3$u{ghn)2u7`=MrhNV2SHDl4aY@&~y|PI9?+Q2=iD-LXd*>Gv%_!G5`8^Cg;w976HaMH( zSoz;AJ)^q}-QP1w@q91H_qcNcBl96x<4h~x;C$>21@lgBYaCt}DBS=S#25bqMl+Ch$e>IR2% z+}(4*@g0v9-p`UNtyT{?3F19K zYnf#f<9hNH%%6_WOd9t|rEBU*XfKTv2q1 z;g%_KHN3E>{CbCYHrQaQBxh5lB0a`uW}gowcK>AABTvbb^{-$s<|She&x@GK>5S5C zg~*MZ?w%ir!ueR_)mp_olmGMjUMql**uV~+4}oHg`|$FAPdxJ*AC# zAU3<+LhcpT5qm-*(9)#);N#S&1g~lZ5rxORpnPxt`63)=jOar5W6(B*2|&}RkFMrJ zm$jG#UeM0(@vVmXP6PvYs%_&uniT zcKez}oFaEMg^4tXfmJ91k-)GT)GMcyPjw^h&<5A>I6!;XA;^i?*A*-S;^M3ah}k~F z;@WlevhA+%_spMP2XRak!BLQ8C$lUrCap3msrNF5L*R`U4jBg#C% z+n&4^uw~rVV;|zEyuvwB?_dqRtuHu766Lt@; z{r-ZqT^4B(dLDG@%%39|U)`DwNEX~}mYdH2A~wn}NY9^8gC>G1xfLqtGmvTu^vY9# zrJoKw7ylC!Fav_deMbfrCSpIY=k@1T01h#;@pQS&RJH56n1rJOv916N z9|AN)MeH~6w7a=V?91W-@0xCA_tHvWx%$OHtS~?O@&O3;u@amr;&Kb_K1d^c!Yy)F zTM#C)oJ)cwq^D;Y9_!r;bkrxosSk+16||M}Hy&}#~_xiVF;kuLg z+%aC!;Xcy717g^I1vvFJP`_V9Wyu#;QS}IXszRpH?WM6fW)F*9V}CZ>BE-t2HBXr2 zw-bB|>Bj7eIm4rhMzmz0$sGdjz$q)^Wb}3V4!t2#gla4mO34M4zTe^attnYYQ#^F4 z7Z4pN50K^;<4Gki*EBL^tUZ zR*JJ=O=?#66YLnq9?UtQgQP13@S#Ge&l!?U2~e`A%k)S?+bpa^puMZ|WMA%OV5Qow zjSIT3iFBrUSpw*i)d~3o>;+{__PAds1R^4LPj<5uYi|&iur4bqtNSz!OB&?=EsU3^=U4@=$G@aVRz_hLl%87+Z9`1e+(82{nr$gvc zhRgPhltkE1Q^LA8mPyeHWGX^pM+l$S^ZFwVfI@*3d0jT6N9~#^R?-Yp4xKm!f0%7Z zWQS|Vz-O|W44&}t;5F&)cjz^wRuhg(cTQV|E2|YBqG9WwlOExVs%@_+^mmdfrz-5= zyX)_elWH5Aa>1Lq2=U2$nnNQx8G&Jgqvk=^8mZBrMqtM8~AiV%&MT~ze8g(O zS3||&KE7QijP!OF!qp~HWFnhq#mRNhw`K*UkEK#5Y$iQa zFh87gFpv|{&6(=ijz2Sawg;>|?1(_Qi@blm<^8^8jA?51zHfQS0|7j*KimLh;L2)o z-x*Y~bgTezS2Jxa9?}okqw~YbJG>}5ql#NZgz9zJSBsd93K0S0nQ=R?*PYe`^Z!>d z9c!2B*>o_x+elk3Te8>5F0@m?(m_uoqkumZ{|?{gp?BEz#*sb;lwSN-!!ndo?c)7} z1{$yX1|x&EyyQ~4B2IBS9N=LOD2&QMyWI_PET?4$6^HvR_w90BKjhc@Eq+hOzg%sA z6CM|TCEHAy0*JU_z{;`4P)WAY#*mSJ!F{Lz8$Hw!?0(f43x&f%z%*8;4ouSJ} z$g!q;5c=q6h`*454)4YP9uQrs?Da3$U^Ekl(3lT&9w@$f z8b~LVscyW64bDa7fjB{*Sp3}aFk^EdnvmRy6~779(NnV`L~8L&_`kS#N;T_^^*O_{1<3!#ZkQ=(&sMi2kjbf<(#ySZ1MOrDuk*a|W^Ywg|; zn0z=KQ|rpPGm0=q>56*Kx&;F$p=Vc{WR+0CW}tw(>L=4jdBeb3h6Lwtbi5TAlS&P$J~@O~HUtLk#64?!K$=t(~nX=|Tr^H9o( z!HR(9Qq4$A+=bk=HG_!wxP`OJ9S+g>9Zt+=fr235ZLaLeOOh%{Lmp0E{1l1YCqX1G z_B`{FXA0=@l_HQ6g4UiEw;10RMdBsyHypIyEL*vW>YnogoPs6H6TMVk^C#8)17-wq zkBu=7`34`zW6owQ;lXYYQ+rHyYc7YrB~(J;_og-1W%dG1X-dlkk|iDNdE3By>ZW&d z94N9PB>$te4|(znH8^!`jP5@HH&ASh!ZYS$76~bx?3|@X3B9U|<~m`(VH8og zzCwtEc9=mXi&3HwVXiHz80R_uz8k7tj*6wghg%76{BQyU11frPxc}xzr_zXGAzjCdc9=azvRBB zLu9BZw(|qlIDXpdq(l#!643EW$sT#)*Jh4obdOZFfiohZVQ8gkpf;Kk=y^S_Kh^-` zV>&_tgL18AyIU4L3{NhNJ{FoP`T{=fb=c!dVD97A-)%8oLCW=nrnL@5Dd^f1g=w-J zzAUl6kwmgN>6$sk_#$j>R)=(m14h{1y6+R33KiEY6BM0X#^$x?`3VKHqu~yF1(aVt z2M*WItiwqeR#li3$t1_qTLIM^it2*arM<3e773SXoPf~Q3uU)##ju}3fTT4fm0%YQ zjVbP&p*RzAuiMn02#A23FN(wPjktyl9PhxDasUK^T}-rT+Iba2gxL>>gB;oX(147+ zQ9coDdpRkHU17H^R1tmP{ksB(@ZSL6BJ(GdIVDBPvqCJCt(gU7r-Fu4@SSUW_J@dF z*V59z<$mAtdcEX*yIiK^jo~6PZU>@cTSE$ZH)yJVFe75KAQ0KsO4Ts1lyp;AjPMv? zrOw>0DBEp5ujlpW8USZ!IR{CPHCVA#K8I}b@CR`BP20=xBL@XlmcRe-g#6E zf#V9&#{Nn@Wjjg2Dk(9HM@iIN7JEU4Dr0IfoMs-@~Go z$5dWo1GFHj)vQ$tlXD|qxfAS7%zyaL6Vxw?Aw#>Q)n(tk&(Cs;sjX{tk&|GcM<;oH zvwd3d_P)xf>wR+TJK5=u&D_g}&_rH0DsWniS9^*6h>P53w?y8->k(3SQE<+zM%snB zF_`#wU6u%-=_R+Cyl;^ev`5V`ID^3d_Kmcg`~LJSsDY%C2(7J220gc|8c;Sqk_y?v zXLR_zem2HqKM26{`UV_;oL-m2%s=f%g=0;pwzZqw?1UgBzTv}EAw&?FE1Jc(e!zl? zVc)o|C15|Rh4ikZxN(pi#e=DWK`AI;>josd+gghfC02BN#!=8IeJ*5EI~`i5=|kG? zu+rI<%udm*Z&Z~ql>ZqOjUZimtY%1&A;(6gL+&E7@1J3TjHE4X*0^Q||MWaC2N(Y7 z$ikA+b~Ou;kOPG8TM{J}kaBt(pt;|j93v643e-sT$}Ik@R;c^`qaP+YW`0PIIPCZ( zy)w{@2~n)=+e3n9YqJTKU%!A-^kn*TgcbA?nWO*!AOJ~3K~#6y;&!)4$8Li^2k<7$ zz&y(|o7FRAW#rBVRAj$iN%31N;;VT&OC#5divU)FTjWZ zn%^AbWP>cI$VpI`2uq%`!L%?D)fDO}WlJiWVPvhZhqin4zW;^D&YcJ=RQO9Pcy_F%2Y@|C$N4Y== z9HVKi=OOHtvC&Y92yrGvjBQ!vuxkbcAsW&?0e_sgmNVR(er@|))yS;|d5Byu+^>6T z)pM7Q&982l5vC)b^d1X7*2Ahvz?2HL?B`$|k+woQ7}`*S6V`QW1=C}29JIgZ>-njy zIW=#y7_JL5Du%nvj&Aw-`T>d?mFWwm(H=Mc|EWHbp!yrTHZ6dxLo!nW4xCh zmJ6&n=fn>rVu3rKNF?w< zQ*;kTkhFODi{Q`?@rd# zcujqX+z?8oTO-wfKkW)mdksOJ1R`m=t)+A`3qq-Id`<`7g6lG3-k)+i93!2j&Z*$& z%=^>`wF_Wtz~rCkngU1a;FyTlbEaJuGWp}jkNg~Fi%2W}Z~&jzH$VWu{GujEglkRS z?_XfAsZ`vnC~|NI!f*J~9Q{$7G^1)YodIO;1bL26ntAXmd?Hk>7vokuGfrZm&oVQwv29RsEy(G4wqKLPssX>;D>sk}#5 z%5cCb`X0BuUYA_gCHMQ5U-!KZ?p1h4IZ9UiwXX~dLI2{dDcnPR1`Mgw9=ZAjZ98mf z#9GUyd?4ol9Q_wr8+Xe+Jdr4c6(%-24jp9h4?I!B9)xx>3X|2GT3c_n=w@hu-JeLn z=k*;L07S|*D7Fq}G{PzSGY;R_p;e#=nR1x?r`;jG2SxKA7x|!`336fB@0Le77iQGU zqc;IbsoG&hHmc%VxD0B`L%zl~w7$XE1K7Z5l%mkY#40zL_s)Y=H4dZp)b6`^Tl&W< z{9T@6GU=^ZA1BeuA=t=qa*YCJMedryxRjRSo_=GcH`t%K6Kw(ouLdF$`pIM7*_*;U zgIg-_Wfj4YH(sx6!S6%f@9E!ecIAo#Q6elf)&iTztHSqysWlrH(&N0Rp7+sc@Oj&7 zXE7dI;in`#XapD$YkY#d)@PSRXILW*mJHSlRopZSs~PZuM%i4)d%eeyuh&b)xR={! zMUV&FKm1&A^n!yOr+MKXO;wS{Wc^0@x@9PK!8YxNBugj7*B1(z5ov`VZGV-bmAUY9>*7-DAu{fga?aDdyv3)P zJj!C}1kv{E>yn>8e~K=ZfiAU&M$< zseeMNL243&8~nP5iyt(GFK5x`^}N1I1Aw#at}`McPH4AN&+D*7^_mg1;pcJ0g`Peh zB1;ybq~wb^;LGz{*!Mn2dvP?)!p}Q9B-ywRVe(g>@~1J7h-?mj_-D}DQ{gY4 zgYW@xhTY-7O-U3;BI@sAvE|7Z6#xbyP2Dm#r*F{DpR86#S|jh)&waOy1+Iu`4!4s- z2nzqc`UnmoL|m+>xVHO~zh9w%mUO-I9>#)NbaaJ`pKtQt|8=eRWJTU1_;#0lc^lCi z#}kkn_PD@%pe9sps|qZ^CD*M6Sf%?Cq!E_xn)UoCP(cUCCo5zM{)NkiprB8ML-RhT z^pW>kSq^YgU)&GZrE=dxuIr-BVEnsrBk@z)cV2$_N|wh?O)CGn5G)@9jxRZE5CbnW z@JN8bCsXniQ84|Q&5+8EAFmAI%Hr?iDgMvvdo}>*6xV`W^Cll&9^ojt8!iM7Vp12H z=g@?=rU%sNmLw13I+b8Y-0@YojgcCmnUxWE4UB5y6$@LXj8oZZ;y zdnBxr`A!x6-D3gu>*7|>F#KDE9C(ND8PmQKFNSnY{mT3aNOugFw)-r^-Z)YrP4xi3 zdi%}b_~xFO2mKHhKyRe)R8f(bcCpa3sZ&u+y*j|g7+6QegRb`_W+U$jG6vFGjTG3x zUhk32m`Dsj9uQL@vRvW%n!*`XFO>zl7FO%AY^B$<@BD1wN(#9N16z;TqF(Vcxq}y2#uL8pq+7Yq5~3 zNXtyquOW8TnX;!na^ve>XykB_zy9kb|NQ+^e*E}a0Yf!hJ)FPi^(`9!y0M3E8TBbu z^Ma5u8=M`}HbQr?>es>4bG*CJ%`Cb@C=^7TT*J!9r~Kpt{-1F701~0@5A9~1iu-sK zboiQXcq*4N48QBUIh8EfzB>_(t#dt{2ZahZ4!=Scr1kqRE&Ek(Nrv5hPrSSwfgua~iUG^1U%kFMdb)XMbo|WfyBNTnQ0zR+QIXv>FjYdA!^Eio<=S z;E-HMgRZpDZi>Y=xZOA3VG4&ej(d7b2>4b^e}A~=w4irR%4Bs-S2f_xR9PX=6lm%C zlbpNGJ+tW!%E;ul->mDPHMCr2a@m!^RlKHoME}q08#VylO>KA!!*B?=Fd?%X)V%lo zE>4gMpBopwei#?2Q0VmYfIVf0R#lN?H%VzV;W%2wOW5Bs*^dc=xMPp$xgh4)`FAJ6 z-e9yTza_EdmUjIz>kR62&SM60_e{WGB~1TAt7R<9IgPYL0cp^75jLkaaBmdw_i^ur z*1DQ$Z#zk9PMKS>-vK@+&jWPz^FtyWvcNOA#`18Nh61?XRZLCE7amn2Bp(&P#eo!t ze2fm`=c6=`(Z23=AQP(f4uy%dx#H1m zwGA{2WVhJBfF$yInf&w5PxLTQGi1#m@Lr%z73SQke$>??2Y-D}Rr`&^? z56z+~HO=KJS;S?_Ty1{+_16#i=bwM%^?J$Q|NOH|gw_XBNi(4F6#wV-tq=frF=d07 zkVWAH7LlyO4}Sl&^Y0vh*jDgza8;wzeW{d2 zPJmpx0(RMNzxLC`<)`cX!Gnn+}4W@z?Kah5CN#FEZ-I zY;tMxvG^WXN#d@Is(|t(h-9kl*-!>YmTQI1{3mPwOidIjM&0tb5FV?hRE#Ed&I9m7 zQp_e`AVv56me6&_)@{bRq@w7TDD0s-S;eoB9?IrNox_o$YBSse-@q6i6Hn`@MvhC$XC2jjZY)BabH>AXW{ya(kZ zG?l*BRtWqlS{2Isa!qQ>WsU-K3>pHFPK08Zn-9q_$8qobKX6UUsc%7_N7U2#vw2M^ z!DJ5gWOEb+0;AI88N1)H;%U`v=LY1?yH9sclPtr<*hmDqkMqvS>tB%r(EQ`O73_x_ ztZUz^*%N|tomK=;y;VR$e zfvUN8XUalhrpeSr;W(8&^O-z`e45@EqrsDC`5I(n-As$Hw%7gHbTmLT4fAPEHEj06 z@HxF4{oB10#gwOZ39QX~rbgW-_94}9Ct|W`PZ^wfu9K9S&B{jbq0|^mo=m*?%7-8; zZm(PcmobUeHuFw~J`KS0`X&v)b*YT;CGN}q5rvS?CaJr~vqIjK&EKaL_lO_JW4Z z1^@SHM>-3}b%h7L5uENL_Lsl=dQVa*5s?89vA{LwASe~xB56N`9`Wzft>M`ECM{>h zAdOjTHmLXqv8*=}TRy_x7;p@1B^|o@X3^{3e=peOs*pq9`qr~}@$THg*P)6(0u=!@ zPX)slT@ORU9nj>vW1)8_x(BHw68O*_S@zYJHi7^L0EF!y>_310BfozB znl{7F{{MM>mj>XUzu)rXzg{xlLqskh6tOqE=uXySrm(fHzY4Oo*v|TU7d)hPjL*&e zH66xECPMoR)2(4o#i#$ykvqyHCfg_JAsd{Q01zU8;QeIT1C0(Yf-8yvK(# zGt75;VLH^)gW$tXwjJc1?aq7$+xETq<`U`-_dBVgU#35o2&8LbVyx+E1PaX+*;S^b|frD$?hvS8)=t4ym@8qx2=`hwv4Ln!mM z{(|Zm#kBYf<*AT*`{`7WFm!cH6^J@F&$R^$l?e{rd-|!!vg)Nb z7>GDwlgnKIs%4a7u=mwfz0WNEcIr+ln5ays6qF}+xL5nS(s#KbAA9?DX*&abTW^kg z-siLUKOsQR>zg$I?vu9b_c}ag#-`ZS(y-(l=2zx1{E!e!KW1w(5^;dL>p>%C`&ibW zX8A)*!5wZ}OPt$rCSx&*fn*|)UD}6-8+*8qL=K{XKw=kQ#xtKRf431dng3g)IRGME zP-t?>w7n1TG=64JmBK^-1e!2pVpEK&?iNS7L7|7kQt?{Zwhj<)KKd@J{CU~x_=gkr z<3S5Qvsu^b!Dz^__$%99@8AM{;L_CFrMd3m-w()F&pcS@fKtMxZE144DPrIn4{r{5 zrzB3W+|7v@Ns_h^2?Y#rBGH)pDmLw@GXYT+2R@Gdekr9+Y6z5YlGzXy;Q8MA%4a0P zV$&TueKO+j8kv%%>5nlw^>J18JHR9TB$yx?zk3V?%jakEe_r3P0hq2_YudSV1%v5< z%_`&wR<3qnjMn0JRrN4=_vAU8_+b)|g>yIA)`0F^-4Dh8RQN?iSTD^F<)O3jaWD&J ziDBuOEg{6zQfK^aj}#sor(q8k*(Xs!`DFUgLt)a|@9!>vPGmu+{07{Q+iz|a<+Ti< z4D+5DfJ9)~h>6dD%*doeKwR{kG0&4G{(%B&bXrF6&1bURjI=IcLZ8qo!Pg`@ZXhLM zB4D(H0|;b9JVW@~KpTTrwSb6-gI(@uss)zURpCSA%L+YO=1$jDBv3MY%9Ybt1XEt~ zgWj*o`qc=149`Q6ohC;*d2pu&w#k)>oP`v8mW^T z!$b3_Mbt$St=YAlRF~=?8v>Kp>q~z9`uQ{h&+Gd&05b{CvZKabay?{99q-;L`?>Rn zz2iPT`T=fd0~#zev>s?ZbGr{=XJW*s)-w_ zu{E1$Dcz-CbwA1B|5LJ|{y5Pqa~hZ{;oL~L=EUf$DJ(Dj{xu+SG%8?cb3U|fl~S&o zN{#Y>2~wd!3G$j`Y;+{}8Oa`9MEnl)LEDN++38RsY112e=VXb?J|LQ^0&3FM8pE|v z1DfcCKPSE?Sxr=NA0z<9KsvvzvAMuU&I6+mvnRI$hvk;n>$R?(le1|&^BpCu2ii$O zn9Y1PS|axtc^0P0lbT#+^7{G`{hQrJpV#yH1`WUt#}V|4(zsSioW>9~P*IfkwS%_* zOxbE$Gx1ozC%bMsNqCP)MMMM)d!kTw9s?7`%0^U=Q{=St1RGxO5F$IuaZ#x};Vqb^ z6|SAsriUhnV|{sIlP1G*AS5!;OE;1xW1o?49@pyEuV3Q}4Upmk=*&0rjqorHQvOmtIF$;7_ z+QLp+BW(|xSzw)4_C{6okOpSsNC=riil&2FLupMFT!-t$XbZ0Z_S^!Unp;#%)~W#c zE@3UKN+@A2sSf?>_KXPTZWI~yx{Q8itp@dwdx2e8U+Tnr9`gG7%4_WqQRy2Qq&L2 zlE})6n}}H*q7_AW6d%9l8!vjCaHTP$xBcvawJxL+_v1rNtB}KUk17i)eB@fz;rp6| zd4eQ-(X@Z4uXmi>C34Q!_|D;ux5EU0nh8Z zAOI^eH+F>NTMviqeDKdc^(-Ow<#i4_bgv@xFT`v9ec<2Ckfjir5ZUUd#-PY~yk`%i zj{LceNgi4O?KdeIniomVs*2xe=x)SQ)$jdWWpK`gI9sFad!GDt`s#2pB1n9;wjK(joJQ;p1Bm! z*2KqqHgJHvumdEn36+Nm`5=*$zGB3FX#Sq@6#VD)9UB0>Aa>VL=vKR3!9z#((2`0{ zFNU5mVm20bj%^i&1ZY6^=TXGRDZ;PmIGlXE*nrCLP26X%2DdWQg;4&ZMk;@Odx0(uE-me9o)ad|JJrSfLzlfRSKNL>eY7tTLD zJi9?C6-*>7Wbv8&pV#+80O&z>0oG2Fe(g?iIK`EvDHaf%C`+5WS1r$CtFBcDydP>{ zER=3~4MGkX&T0w<68E$pcn&Dy?uj0IY6PyyBi?=c{kXFB*A-bw5BCWRgP&E@`wygosw&<(ME%n;rx5o2JA852Ehxb0{=zO1G>-JD`L)`uRd)0Rs8JmZ-T29*!Ll0~px?c)uZvZ~Trt$=y2s7yzUTG4zC{DzxG#%I{;)TWU<>C&ERM_+ zB6Ue4sbRI-Ct^Nmx`z5ZQMLpyVxdd2_4m5_!SPE@Q=~R-0~dZIPa!<$#O#J^qG*xo zASdKqqYGys5VQ$SfcrsoNb2(jAEO@vz^|QxbO;uS0Hv zZ_^(aqxqgE<6F1XyqQiprCt*fcCxC*sV?o3C1i52L| z%2J>R=~X;3O_L;n@EqCNMf)NTu65UGeSzy6^sqpvX)O7mieb4uG|kAL5ZK9kb716q z2Mc*g0>hYSPr>{IkLQ1yh`3cVEsHIryvnFGzXRW+E`j@JSIWJ$j?eC}24sUOm*3fo z*XNgpaC|zG-tU>XXr}A_c9HFrcwW!z4>thi)LX_je8}QN%r>jN6Ytpps$q7@&r_jr zoMV3?7?#OR(ZmZf4d*&rQlF`_MIzb9;0=^3{f_nBH1@ThZwFSSCHiM)v0`+ysIteM zvhk6V6QN@`3+{LYS==Xtg*%;S2u91OM?=*t{0iTjSG3cQA3sEO$QW-46#(yYdn3Y; z$7uPC9{cGjU?$fUMSg6PDt=EvG$ikR5xJ5pVCAX|cSiUSICrka6~OyiWU;v~iR=iT zfF0Zy!#kkT=gf4IH-2^@luuvW(VQm(gZ@AE-mXWoB*zjXc|EdvN2|sDQ@sfbECehd z2oUt9e<}=SrYj@-8uegC@*J9ZR_{wkKDYxjsIJP4aKC=9kvu#fSg?Iac?MKG@xY~) zo(j0{X^&dmk9f8S`tRK^``e_z9sAm+Qlp zQH?@6;F7wz5+o{6fK&1aXbh*e`KH!D_w*b?NQLz{`E(R-D7ZsoTOIhT*yr{y`#QtZNfEgZ zgDkP>b8ah3-J0it&4KXmdptlnv{pW2+;Uwe_ZX`Yc)#AS-=F~y2E@cn<$n6>J(m=W z>SN`l<9^oo;5>)*^r;`6$T-MGMbfk*CSQZ8aSU7;cv}n{JOf11IgP`M&TfJ(1ra9s z&2^g=__dMU-la2H8!Vsxi|%e8!r(u4VuHyvMSM z1rz})>@4>45HmG--uEgb)jY7_lINk1&0@wdV{nTW#6BYZP%s{t8%YlX97q3yB?r8$ zIRe%-NLNd2l-jg8-TtfvF-10og3*s0?1M#IE?8q}zOSwl=n=KFa@l$Utn3T1xgI5D z6W!c4Cy7zOK@UCfReoWD-O#G`3>>^NPT^pJ&6uE^Zltn;-$n2t*7FWicMJ>bCWy}kMHhM43LWk^c&);z3hVnVR)>4T4Z7K^c(xa*oSz%hngX2SVCk@!U{&QXDIoT^K4%FnrsS^AN7#*53y_#QFWJ^hkxj9)(@#eYzdmXFbbo#1m<6RZ$_9S(=wq)(z8po;N1I=V9Wo_CNd zGLwc30UHr{P(xMMUl})Ss3j_Xy$5H#K=zO$A}jBa9WIr!Al|R{>l;@9e%wVO>ps@~ z8OaMhcNK~L_q3gvC2Km#0Cn5ipFHA)NNwBRT7WOm@IaixI7v?%%&Z4CyB?DQlSHP7 zOeFrW4vulqXoF)|gFCxBT%sb%K`v%S?q@HP?O@+LJWO*&9%5!jR~}a|ImN2V5L{3A z@_8ujcCKvHN^&<=_=@r(NS8fuBCckl**F9<{1P=6St!rY#U0lwe6^myiIWi-jwT*! zZ8O%yIcm)ylOUO^uvPed@I6sK?qtMNz7rJze1R_oOqaN~04v#97$ebcq{o5Tgpg~p z$8fEk&YG!!$1IM{qUW-YXj&#;XpsPEa$o;FdXiLh7+MD-nh=eN6T3fSiQ~@)B7iQP z>(BY-H~`!L=Vy8nR)+*{WBxa*##0IvIUE~;4$ym0kRP7wk|<|pM(}vdX7lDl?sxrv zzrMQxC^xxzs0_d5UQcq8mJ~R~y2p<0k~}?H*ZK>{upT2N*&NC6r0aA`J|(UDSF|S# zshKcQCrEoLyI#D92zgtqZ?1xRNbm~|fU=iCLfxa_?@pj9-}4=24ssk`2S0`g!TC5O z{Sb^M{gRxK+u6b5*xkXOLEr$d;;5uIuPO2K^QSx>m+1A7`+kamT$7p?D^L4W_c?s8 zk^E<{s!-0C-w~xMJ|lCd!`60e0>BE<@fE*2i~20a4h7l(S_iV558`=W*Mra}z$CpQ)h*bnm)0PlDa;ayD~4RkGYNW${eJTDHfQ^e1AMiX8~O z*(_vI-i~CI#1_!8QRmEb0MvZoBAhAAi)y`MK!6-M{nztSh2I<6#{3>Qch-X*O^V8E z>c(Z70Ykawu}jQudEU1ScezaEGJ98`_v@Qi0B~sd$u<-sRMAV_^w;cLBF@V`wG*t>vXaea zfzhL`xw|VWIz2O^=vA(*LiE^^;%+BZ8ke{uK*yzcir z5HH1*fr{v8QN+a{1^fI1s^qW(Rtm}46XLvrr2uuIdo>Cm?00qBBZqzPTv^P|H?r4c z^s0C&Y%R+Waivg}VO7cIEQ|kTD))V7P|lQLTFWoc<64a(ykS8;AP(6V)SjeH9qIew zEBJ~KA_4i_wNM|?L_vadm>Cf2DIF#A9U#}@{Xf?_zL@ouGjb2l)Q3a>Ng8X5@8ZON zh~F7J2<9rpGgZhOuWLY}J47DW$#roBUx~`|>odQ{B7&-13k}M>#{2bted`LKMe(Tx z=}dVd@@~ufB4U=FhoX_w-4P3_XY|Mn z6+ZJn-Zy8Ipxa)dC_~1x{&_a3@ZD&RJ0i=6qJICW_**tJdEW~oI)S7P7x{Yrxlj<5 z=kpf#A(yE|~4U8-zWwn6TxhG>Okv(1a80 zeobVm&vcJb59%o2`9w1?%t&@)qhH_~0Ap%9gb`Fk(vqjux|uKMLTTRa${J~{B8zK* zDIp8XbKku?u}TqT4Q@9}uZecv-5 zz)T*O%ID{E@&`<1++XC980rFSP%4dZ8DWVYE<;?skrKikJy>}Z8xGWdhiF-c6Mtk# zSt7%|PpF+0k|lB=%1Z9;bLBTU!ZFZD%oiB9mn$dOkdHCfIJ#UcXX3GnE|Z=ye(eQv zk7~HPGi0n1++D`~DVJRtg+7MM*VoU9!0GgnFlzx>@7MeFeGNck^p_C;$7LEo&BWt7 zF<|+e4ZGQp;D{;{?GUwYk*^4?<{m$$dDsIB#pI$BTcn%mvR4K7HZ9Collt{|m+`cQmt_wH}a zA2F@w?EQMbzPkZ%XZ|-HrE&P7RjrGhGr2|1)~B&={l)sACOHTY@v_U^j6V85If{6o zf$%yE<{{<>J5O)g18*coZfZDJ9j{vLR53d};ZCiCutw{yod?-nSlbfc!0NC8X1^ZL z2?s6IXg>10MX`fv((-vAO?v%Z7m-xosb&fzNwTzx6l&BtJ08DJ)MIN+jVP6J0ZAQ1 zFl*Zvk$aJrsSK)AZe_w0zS@XG`Y3DX8S$%!5zODfMX7MX09 z8`ioCC8)es^Fv-n1z;&i?@k4I#fdA?A+7>Idt(`(kBF;kuW}*(?7UE_G=<~M8v{Mnune}b#yk9SDrie znC3sK5BdE3DI=6Vzd+;OulMVp-T=%A>t2TjxRfo{b3*pgruL0=cZ#0H6@YD|J}jM7 zm>o?~93E`k<+Bsl76+=j#m{OtR3VrT4+14)o{%VY2_wRjF>19BPC)Q0g+WawxVqPqURP6aV_Ur{7zXAurGz zs?MGERK<-Y^K%hhrc7Q4Pc-DG-1)xRK+;_msji8Kls(*~5t?GqEv-*!QuhETBx02^ zqH&P9$}nk>+slsE!co*!)JDFS5vEsCw%$FfL9I(D*ZL=)kpcJTn2w=li$8HHyuJ7r zAvzXI1~Sv>zUfUq95K_rzSkwyeVF|1KmCjR`+xi!AXx9>|9<^02*9}Ix~?o%W89)< z^7nuHcex&qG>Gv&ZHa7CG9O6Z81qP+VT1rTvbZ-SSWGI3(aAP?J`f9jPezJX*pJMih{QUWE@}K|n|0>Vt z=jvqVgJ^ofKoOdBLIy&wj(>-j46mRtltUFnsxOIbN>FCP%?Sm28H%(fr6zR+a~Ce8 zNIJ}1_9V$Io$>HW8OZfO_~Uz_xp_E z$iaW6{PxuwTm}JIlanItzESx8vJ}Ne?zbJE1Hz>SYMzhlDbYD$c)eLi_+#-L=X(GJIAixcI# zH3IIC(MXhiVZZ?_iZDE+?d9$n(1?J2^D{_z_+xWu^Unk{Jw{zaZBehw7LZMQ@tx|n zP6_w9V#5!CvQ-F$;Lci#9Ui6B5ZP(2eR_tmwFe2L?oQzQEI1qgx+?N;JaZhF6g!Ed zNV40!FS1dUY68LQfH@1i)(LXw{BEil4&x*Gtm^GPc5u|z>}Oc$aF&?%6Qt~-p}W} zAde5}nePiPT_LZ0F`o3qwVQ4PzBBBGPUI+e*L(FY8f5Fc{kB9O`khJ&>p38mnu04NbtZz_J zfRq0K(<$AhzBv9|508S08J@A=%Splr6^sL?H`)Q^^(V~i~JHF5R+0}f`N`@{R5^14%?&wPFj4hpasg;T({%z=Q* zZIdCLCNNyHphp4)A#JOV^Q9#zeEUKSFc*`MUa5#)Ag?QzwVV!z@WEd-oIDybtVuar zpg4pBWRcQ#*=%BSLalVY3(syAo+hf{{ zqBZy0H#HCVK~&h&p?DDBu(;j>W-KY>`PK-E8q#6oeQ9Ct3V~y z$x}etA$+gm)1@$wH-+cdb!qdn*+MnKO7;_cZwhi(11Ts1pHu z@?#)ssXJLsp%2gE-#07n{9O8mG|qeM>-kgOtpE4x_gn!yMSlEvi1<_PQL(dZLu;^4 z2cjKx))?QZC)WM3J7$f$Cjo37jb3_w-VLIkcTF!85|RaL?7QVO2A8xX>DXX`(D9x)M)9t(|qyWZ<-% z&6NpV|CG;>8=e!&;1pm}Us93^4c17A$+g1=M9c%k{SMV1IKM6jtYlgRaJCN#E zBdOLZN04w(zn6I%PHTuN0`tqd$JmjrSWnmq=MsoUmNFzr_WsGzSgDxHA()CA285|= zB{bIh!SpK9Tex+uHBBN{OT=9 zU*F#VT-Pl>|6CB}RmopwB4b>uSdMmZwc_78V27om%j+9`#2$Enk&cu%xD$%~+P^-2 z#qd%4*0kdHBLEQ&dr{;gWG0Glx#okr08akSk{%`n>71=?`lFj6gt_mG4ITTCVU5wi zS}PCANzXJaACd|9Nv5=Dj2b>!<+WrtQmL0KmiRBhqX*=4#I3H3QEN#EDlDb zN&+ieHMuCNI+X}8_I6Q+-}AmQ9qa)iPIAK{aTW@WminC6Ep`V&-f{PFR}7KuhA;@!T>7rBI`sieW9Vii!NK1*8LQ0!}n4|Vv zliMO0mF`6{0y3gqCbFZtq1FzPLvPP?SO8aZ1<&MqcFL9U27@CdN6#WrA~Beseh03E zr9HDA8ZL)bn>Owel4qTzzz_-EiL^xwR#FCl)u8~3MNCy5k4vuWAzv~Bf*zO2WhUdg z-WBNm`rZbBS-jX07vzW9-#%doNaAqMnT>!*3-M71*66-`hkd;-4L+sg`6Ag#cI>w^ zG)L^>HSGjz-eCu5aX?^WlS{*q%;}ka7YIY6&PVajq_3_K)&|{9*D!c{RhUhQT&5yI z()4w3T{MaMnSep)2=B_p%NenDnGP1K3h9Y(*e7CvAv^0kA0^qd1q<61M=F!3JW-C2 zgPEvB^JoBt@Y*8l5|9pyK{C?X7q3l)@~nSrLA(qZ=ct%rHIP`2Ec{beMluQtG>Z2z zd_cj8kf|Z!mt4l{h01Cuq)Z!1g!aSkz7;VuYk3ddzzL0xc$hc4ir}isCx8oQ0Yp)E zUQIYG!?P&~qM?IKcJ*BMeM^w^N^QqdNN-l;4n#t;OI+?+AwI5Ln+RRo4#NxxG&*rB zR%5N5mvoXWbKsT}DiPhskYL-ma-bDks1a{Br8^{zng*Y`F6;b^r_s!-rt-hH>r z+>-eSTh_L_k0MhK(c(~n1#1;{KKN_Wv$ES>HCSaVRwcEv7M~41D)1zqi#wtD*hA>q~WRs2xCFj|NB$`aPWh z;|h#|XJbDcnf7b#6edNcIuQzBvey(S=Ojv4BS`M6AFDyV*WbS-*y%659Yk6{R^KD& zagB9d)(n4roBGjvB31&)4It+`E_h+VyLFNRh+W>4{5-30LSej*v4U`Dg{ZhHkangx z>GEf|(!B_P)|wwV#_Ls>mYxI00ErM-(J02G!^6b96i`Tcg-1=U#e9E1KcDjT^IzqD zeyvQ9u|k6;;rji0zrM8rQ0seK0TL3(wRE@Lji+fGY+8GaFYeD{qQX#^Dxglzq+P#l z#!y_W3hpsd&K695g`K8dnnl7C3TfN3G64*s!Qg+Fxl9JMXz>lod}r|hRw1;j;tfPZ zF7urJXjd6mIkNzyp&zwhXI}#}-Z`AxI;os}|C#DIFrJx{-g2wEl^hh63cw2f8F3ib z#A-{{mXXKdnkU_icsUGuxej*Lx^6uwdr%CopRaf=qM>wMEOqqGzq8;*#IG7G>qT2Y zjyGhgoajuiZ8DE&+?1iNd-AXJ|%-)v<$zRE$G${r&j3-vTmiZ#M@X_}1b)+p8aWAuzOVe)?7q81Gs zHw=tMGD|f+7hexH6Pg(SChku$9rF2g%jeh6Bpk;%_3>^1-mmX&04S0bcW)rEV|c3_ zzySSH03ZNKL_t(QtwHdakouhua=3$OBO;-3589fd4d~aiA~t(3GN*IS zjIXev7CG#`?O5}_X}P}DWUuhqWaYL8L~f<~SAof3{e7#+zhHC)pL0l>pOu!at)@nlrdB;GkN+g zkH?36eSOMsl|O&}d{?0N>zf+@*&jY%h8@F4Lk9+T#TeQnvgMvLB2d$>K_tD!a!aq4-vT%;=Pvk zc*eb2Lau3xf&o8kGV~$2lUB18OWRWKUb^XpQF?AS2GqF3711s z15cB%)(T^}DEd~!oOk5j{u?wTKKwAL)_bq!W&VQjX;&3eO2qH)pSvRm5mJNDeW(+1 zbwi17oGnql01m}-lG}zC%U_js`$i~r7H>dBqlIExJC zb71kOcyEk8uhojeJ_z4)5Jj)c$;}yJR3@1O-Z~rBna9@WLvQjf`Sc1 zHBx@6Jbdn}k9tmYlb9-@3j_V_p=np-oGjl4HkNWAqhjb$4Fm2&?)%ON-r!Zly|WT8 zz!$_11-o1nJ1Vg$Ktw1vfy29YZ;3gS%!Z`H{rLNtC|W3oifjZ$Oewub<&6aS^Mc;u zx-JpCLa!{*bS)zrQQc`}M6a8~2j7$&jzFdp^+PP7++$-NtVHzPq2+ znp6;OY;&GV8IVM=3}-o8T5Gd;curN1!ya=KA~9T^_cMP(r2ob5ts)$s35sEO4MamQ zKvIRS1MY2mG0}xFhWH&2@FgFQ4|#n2A*$EfeL)mfX_U} zn4O9rpmiz^o{WDa^06Fo{_p9shHI6$)}!3)R49CMDZUqQyhcnrCKn#sbpRP+9=n$!Lt~`78eT4LUM+KbuVbYE%GCPNuD7;vZlLh zp<-IjfCEjfuwm|@Jrzi$k&K6%>j4OpvXRUNjR-nD9@y-diIFJ0=5v=%sh6q-Iem## z1Ul1p6fq2p!e|ai=VBj9bQiFB{-{-9vZY>mmXMM_#hYp=m8d##theCs1p} zx`!Q}!9ZmcioYMOWpAu@uMQC=^@fG8t$SyZ5=GEq(0w75iz{Na-Vq0kzRHX8eJ#ma!1`mReeX{|KZR?|kL z>Wy2{mS|;+&(*m$4Kf<-RF?P={sx&EYRqAlh3Oq&;2cbe z*LCGi8u!F85r!jNWC5UeKTF64ubS^e=)zK zfU?s)PpUu#B2-hhv&2(dFA3iGXrWwaNN4O@gU9jvcM(4k-uLe?o;lNM#)o5oPONgY zqOkM*4q^G~0A!@%e4_&z?s5;$?_8X%a!?K!@ZoIcE^6o;EQ9g8u6u%$6IGWycm0kF z5_=-YVFn3t$W%f5lJLH0U1OG23Xxz@dEoH7@OyA*y5^uWQUWPzNeKMcfBpa7A%XAL z_pShDhrVEP)d~Oloc4>^jt8s&>8Z(g5VkXgeYTW;y2Qh84E3%iVBC#6OidvTnQaPJrYI(tuc{fFc0Qjr(UnUwln#gbIy9BQlr3 z@LH}kx?=jJSyD*U(l%G1aDlQy*6x0+Yc__b+av9TSK~R-UV1Fa+O_1LUJ8|1NembC z=cia$ci8`XA~&Vp*o(J|Z+mHeHeLV%FL(~wJPFYfX>Bmw{3a1|v<5ML*A0kRndGcz zNJ>gM(SkeCn+~rd2gkyV(CT>`W7Hao&KQTLx*RFP*vml+d@ZZtxYuTLVf!@{Hu#C} z#793DWIrdQR*8;bREP5*Ns*Vy^RDzzB$@t~|MFkoc7X5K_cZ|b^SK^6YbQ)i-Dy~o zH5#Jfbe}?E{}~6L$IetLJf)&xh13UKe~kVCNCeA=(F`);J&9T22OmVQu@0;{hm;F9 zH8H_1E8E&~NSjC4^e=EhTOcPkwykXR$R>BNK$R*AR+$I7e#mfkZbNI>vEc9l7OeX^ zq#Gh$~m!?dX^1}`Z z2SSCDS*(C!wW6@&A5%M8rFS?xBxb{T1Ii@=8ZfX1?$h|7kv@rVDzszn*M>jSPNMBH zw(}mliuZiJU}BE%UMi_F(-o!PJ02S+k?`5i908$~!#&L-HDR#n&ILaizVmoY9`{3Z8a75~Lo8cy6JL~GbD0-PGhNY_kJ zA*IIq^?rSO1E54lLKsdqdt5=-UwOcslVGK*)lQEKdaMxc=UvWx=>_lmG^5)50IFj* z(-uafNrt1R7$jmW-(kOhWNl+wnIiPKJo??xsZikB)ZX8;JL$=8kTTd0L6rI%JWKPS zb^$j(-Hn_a&3u#_fX!DP<$}_E`P;Qpt*|DAL_>v`Sul1P&QikbvX%(f4(a@(!IBHu z24Guj35g4N5EFoHeY1L&*8IdBe~;M!*s_Q&l%#y?@w=*Z4K`9L9A(XN)xFumoCIEb zq;I}B@jLcL<2?BjlYa3u3T_&54<)m!lK$h`OUfk5G>L#Q`N#V2zVEqXAHLQ*3+cNw z*Dttka1XOBI~MVJ#j&~$LTEi0 z{T1DF-gyIs!bJMw@SDE3_X^FUiG($3yQIv$i1I{Lgr7VbIk+pbb zpa-)Z=Xpo@VVNS$sjCzR3XK6K5384pAtu2`vKl4!foA}c{%X=LJAEIL`&hF<@~lK` z9J1C$nQIXSLTHczXiH4PwGZ|-y@Cdu%x+de>P~qP0OUIhCGrHW>`;X!fTFz zP|lEuo|IaIqj))0$zj?Yn~@Cfmbn3%WVUs`a6rcKKBpp2|4lcwj;KN8GonG!+>dlB zoYzcAMj`lD*OY?euA%)(Z5S>I-7Z`ayq=FP1-^rG!2L9davLn zyJ&FO5k=h_v={ED)TFMkCJfi|%@PvNO=BMs?a7|+*ZcL`AOKPYQmRTY%&rD zx8>BwhCz_dmh}L63NClSBqwy!|d>Mweu$YsVeXR;?v-$18J}Z4t&eq&$&V`eIK2O3C z#*-aCJ3FI5Bn5O1y(3O?-rz*Ymh5Tvm^RG%D20lT45^X~#4%yJ2Jk^hGH0jkYOW1a zIU$z06G=)`6_IPDmkx;IH8K$sM7JCXoqBLy#D?2jkOG)IiL`T|B9{$`ifiTRZ0-4e zyio;5S3!_`a+aGnzM0TNhD_ee9ssQiu+c~6&Ci|ebm!s;KHf`@SyhfK z@)`$YQZ0g@wZdOb%XP7YDq-0c6jF@#SzyK@83q(g4vFcihpP+AT=Bl!jp+(ud4=Y| zUABV8z#|guikz8jc-!Mn6=aAE@mDcMe|5};M@IT?w$ma~(SKkOwSt_f%PKeu)ybs~ zo1`7uhP}V;*9Ud?NYuhz)TMQQct_2->Y6qP-AYh_?)6v1&S zz+J9}-wmQ92b7|P265dy)s5wHX>s*S^N8UcjoR8nYXV# zl$sy+A5SAEIA>Q*^twapFa*oQ6R{z={p|wvtIU#vKah_^VX6wF04NUsVce0l`&qA+%jf%xOpVeOu#{6J4N0_1)ODh?)7bjhcp% ziB_{jQ~Baqj3iFFWUbOsyI{BvFq=TSgf$ZxF>=;Z5-TFDQ3It(bDS&B3kBHQ1%2<) zFsa{TC-ke}?HPmXw3Zqf$h4d71mSI0fK*TI(r}Qx2ZuYzWh=H?xe3y-7s>8m8B6RS9Y)Xa5FYa>@)Y z5&*Q;>wo+o|J!(%q4(?C8UP|12}k=D+$IER*FS5s-K>Kg$#^*7sSS~POb4x)Vkp7v z+7j3h4y5Tv*askCZ_@c6Ca;h@$_rwZJI9QuQ0%9;HIgJ0x!iRcO)(hYg4fu(d=PAk zz1&{T7RhjZU<t5-* zZlxfpXz)}jY$lqIk&SG`5{HMpy@1n~^|gaYn*0y?f z677P|iw)&oj7p6%$gF6ss4QT342voTeZR1$ghOn=!rW)pdIL{?=>F0^SVb1A17gk^Hd*aonki=|&r{9Q^tdZ>Vf z>lL7q>2lh(qS;)m1D42wr>Uv$reAdVWX{ud&sE6OFo|ufUHK)Q0o+YX>Kbb85oy}@ z21WLrEHd2d5O&5U*QG(mJ7D;WmLYVHm4ukTlh1n96O2_oS{ z1Rf8gsAz07Br@wYAafJd0lQaJR+M*zt%he^*lH=1Y_WL3>LlPq z7XM1F7%)CH%EHfUu>bRRaJ2ef@Q676<>vE$Ug}cLztpDCCE|(|1FZA|2Mx zQ*ct8@a^LfJ^_bom}o)#?>eZ%el@R*`x2vA)7OtgnI@#{q zD`cjv`tIj*IVipn|M%-RY5-JN6RwRg701`5N<%VFQocwo*MiDN=DR1XT}N&f{+vQ} z9A<2`ROkwy&GB^J4Rf~nviE6 zh1w-5vi$U~)x_P6BxvLo7@s{XhMmI7v^Cj97)2s(o_~SLX??gJ7lY=amXfNvb@&VwNJocaj-QTM<<}^OMRdn%7NQ zX@!bw38!~EeHGzwws4?C9)*BOQ@IbuZW%wbs!vwA)~c)0-{3l`&IVUPQDOAolmx8pP5mTR0WsCv3@eO?RNj-m6TP>e1^=X$*NMR9>R zGf1xMlCS42pPyd~NpX>Ji)SP9q{h1BkDBY4;EznF(P&VNazDBXga28- zW?G$Oi^fi7^SiyD_q+JNU%y`iV3!bPK5kE|-fNlJ4EN>V9n-c=h;Xso6;kFL!ddVD zcQ+Ba^YBXRTZP>1r39$yzq#!#c(BVBPiM`}f-W1;-QTT4E)4dl zQ|4z-u7$MR^<4#9-zn8D8X@=2J#qGKTZGl&&dP&E-Yc|3v*@GaWZZMnpv-#G?HKv~ z%6;eQ#F-sv?3R~Atp}Cg7XzCo<90iN7wN*~9r|+GLn(d_$ zbe=5NJl&T}`oqS0A~Kh#4f(on8Gg&hhsoF1*J|_!1Y%jfpJ`l#XN&@BvA!2GVPgl~ zGA^od;j3U6NR{SF6@lHqLw0QJ=YV7g*8BB-{eBIAnz$C;f0@hem#E%ykMczijXtuN zE5xLVUXXNl`P)dtnJ9X$k=tkG(@&kXlBIB(nURC&>j$eRbm8HJ1s#3zaZISDVbG+_ zdvBN!Xo4!ow8o?ZkNWz|nXI-7iD%ZlwDdFm#plI9JCI~8+1+RkYJucr^QG)*jz!1! z^r7|rRPmQacr?;jH*I>WS3@fFDVXkIy_+fmnCwsbdt&WtISHerat!vEkcD39RmMYO z3}C!7qJs{VG(9#CcxajCb#G;~ub5h?YQ?0j5a{BK_Gi|0R3o|Jgu*S0Sp2|}uL6=p zCOJZ@A^c?Z{zefrrKbB4_f>n3DHUGP-6})w=Tp>Fe*XMitHhC0KE?4S7e(p22+6G) z?lWFZ`bfOBB5a1^CHy(&2LMt)D?mRGHYM-3_v`)oeOCbCZWqs}eTc4rk6^q9%x~!F zo!xRpyB0#gTIAWy-_;b1ibt*P`f5Aoq9^4Zd?67lMsKT1Y-PHGq8+BgxMM6lNjyVa zR$xC|E?&MkewaiLqgt+nXSvl?{Hrx|W!+ z0EZp=)w^t2>CAv{lVGo%qmvNF`gaWlAedR{{YTNR6h}UUGxr`oXC^dKae+8nielz) z7&&l33U!Fab!1$zwslVr2kND&RthAv*zb2`nc-~Kapxa#)h0qlPZbVC+IU$1ARm;P zKq4GErD$RzVp$JMvNmV5Gw&B2Ub<0-t2sN-k`NzBmVJy7uMOKS~;zD-mmxT+Yo@Y-`5Gp`5K#4E^)b; z@Utd{atahGJa;O%(8GJ>-QU9StW;->jPx|)@%`|xNu~sGX@~+6#^D@G+?N5<{&q+? z#A!1K!UQrcIC1MISZY_?31npt^6tap8t6&op|`_-FX?sQcy7Q&4rV&icCpL)&uY=JXxLGZmf=^PkbosLq)nU?$|3K|;#ur7j|N<@bpY z{YmRjOo4MF%lifNJ?z^*D1VE&pa3Ucg{IBC?dons&bWh(_ZqS?u8qNEwJ z?0klO9isax1oF~-?XXd`pvldMe{XF+vuDh^V_0z&|JVtK9JDttY>p)DekfC?F>w9V zngEIrRB>HDb2M)SK?b}L7XsA|IJTQWqg0hbaB1JO5eQC)>D|dKv#oe=B@&A=M5{!X zGuFUkC_ z1I~dE30nop!10xet{PBWYsbVQ9ETpBOA7L&54Sp zxHyDc0$Z#pz%q2Y%Q+bm#RG1tT>NQuz+^sAcHSenT4xGk{d;a==-^V_AmuKp%EJkX zjO$Dr?vw_nyRK~8$75SJLz$)-)OA@N#sdy=Y40&o&QPD|sH^b(^9VrT1!IGLeRCh= z0u%28VecsX(O}&x-dB|kjmGVu7x&~b2qZLOGpoESIbF{B^LgkW&<`Ji`2+=nAJCrW zCP(g(uyU*K+vt1E_hgW8*xpkofcojVYSGxm5z)=*FPX=f@H*9up@NaLcnEd! z&^f!Dr{RsL=Vg|nG?DM@?R|19M!u-X<0@!%0O8KXR#1+%pTjOMOm*Bkf!2ud{nEV* z&=oNeU&jb$A!uLII7*Wvk;!lBhY6KsWBA>B%dCh7E{iV25UaBk43V%xzu0Z>xYlV6 zWEMB|rup|&U+_J03bN5{+QjfA^nFkwKJL}YY;Vev*c(j%{aNJKl#!BYrBT*%hj|VA z@0qHLYa$lMqCHOxHrmk&;i9hPB;(aIUqb1q&7WU1^_3vmQGY=znFPH96b9qEn;!Mtu07I6OyxS z0_&4>uy04W%W3TX1@_1c>tj=MEL59i04IXQ6c)S&`g1^@%R@%xh1Ad+Y*}w0nw%}q zTy4)wIF32O?q#YJDT{JLYEYI!p?ufR;XtT2pUs(9hbA1jf>T!c#OoG<#BwlA=6=s3 zKovnXs$)ZG*36k)0FiFj?0m5ftncu@j{=RaDnbLA<#OFyx8nizVV=U_(h6r7p#sGS z5#jY4f5u9WbmAxwZ>FIidNS{UYyw?{R^37UFn8dhLrjnnuN&`$Q3>7FJz-1CZ85#+ zx^C{xBf}tKn*)>RxyPmo90MyDO4_~Y+kGhE>9BZ7V+8_95*r^f#@C7lf4nQu`}NHT zKuZXl%;mAV+)*;AGTc2D-aJq+@FRs{3-wzX}(ujW2m#g;4aX^z{xohp$iW1la&2CQD@f2%&<|jBHN673C-+nX5oTu1b zX`F%eGjNh^e(#u8$yZJ{6yVetj=}4iZn`s(E?wdk-x^JR@5QQTErkoB{OGnQhrEfC z1Xi?ckh7eFasdsdutQeZrFf!ZBMEv2F~p*l6LJw`FL4>-YM_wdYt}s}YNu`o*<~4c zsaf6=x_wVAN5L5d;(xEyKxrBl0h*P`kR$&r@rl;2H&{toD0^hc7*Ae<*}DL}U*FvT z2r!Em@eZBOg3#pN!*qPl&{i#T7LbpH#(hNMV5FD9!=I^c3p%ffkn_-W%LXndLDY(; z*-IP*GzksbpKeD>GYR_3fw~c?5c%d5L9}PV0G*{Y(6G1t)$j9zmpT@crqz-i@>JvN zLB-!k+0%-wLtcg57#RtQ!!Bf93Pr_LUtC5#gxG*9q)W=CV#2zn`;>%J;QpRQlQBx+ z^zb{WFpIRfX|@c01=A{_DD7U1L^-f}9=FIYVJr{(t}MviRyVXt?+81X?&ubVMNKb| zT+$$by`{QP`Z zp!e(h8vvEY9@cW+i&MnAJc(pgh2hzO*;0Q#;MhybnC7t03nW5-fxUkASw|ai+gOc5 z|9N}vHy)h-$Ue?r*omr?qgWXSH660Rgs;knX8M+Zs~xh*4-SO(!W@A1-`aN;sCDWN zh74u-8@-^}({v2qx+&j4?SzNs}X&pfr zRQzTgHOQF|SS{7X3k6KMO*uiuxZ>%nu(}R|*BH{9CV<@4cT}WT!evAytFgHr4|0~% zBU*vq{egffzb2r?gs&v&RGP67Jqcxm3$yL3@eQJ%P;+2gLn$yFzf;ZzWd9GYxKNuHb6mQA1u*C4lM4n#I^i075l1Gi21N|B2F6_vLM6Gf*!)6H$hKd9=62iy7uiFUJUB-K%)&tyG z#k)i8cnwwg&}BGVXRNcwC%OrhsHIrBiz%RzAA7Q~8cgnd$gC5MO=&ctTb?HO$W({IFX(HpXM5j0m%K=X zx&3tKFe7DgF-aW%f!qK@B;0LHVH1Txl9g`7!vV2@t7x{NC-Da`fJsfk^>3d{aXmmX zM{rehM~L5#Ylgkq@u|s%rkBu!^*x~lY!4@r<~15-U0%Stjh;OA% zhzx-rA0Kkxo_c@NGfzbI2n&@@L%dOEH4jSWUXfxk?zT&9QL?D(8U(?37Gm2-egc6~ z*J}QTd-`$odk5Vh>p5VjK^!(b4SnLz*!=ec5vxAwdn!kAm9t)fE>=^qbA;kr1i{%J z54o;Ktw$H1;ZlFg0N$_PpaEEl+_^Wu<$641TKe7aKwCnBY88FCHwt_ha~AqKbev^& z5#704__qBc6jOpSO&dfX9tGup&#-1kF>spD=30iZVVU8i#3wC(I1fM|qQ-aXBzcdE z%gcrfb==wk-&8gLoVmS_|2MOM`dVt0y zr+wcM3zRrA#OpNa_MJCJFk@3%9`cF8G^RgYf021D)n8cu%BI{XUWTQTW&YJNgjS5u z+oWhpMFoRx;&TQP@hb;8_tu2dK1Hf}(RBgYt}?k6r(s9td^G3_Ezzv9k<%z*nF+#{ z)|7ZD^PY+QdihQ45c$3(!N4VN2$z@ILn_>-2#QX&!M+YBPZ{!Rvf$n1GnE|}`(RW@? zp(D^h_;N6fhDK_Kxaq=a<*=^RR?54Y=wRSf=rm2Pv4L^3$cNfRb5m`V=UT8cCW zh|L6xOw=3K4JCYwlh^u}PYBR3YSvQKJ69lm~@S zxYU&FRnbKiLD@GeO!*F>V%4mV)<{+qaNbSpeUA2A2T$cXhb^r)>>(2s#alhy6)~MM z)EUM9kk+*F)2kXhr(5*8+PC#OqvZX1zy7HWfXI-aKR@MP{^f6ST^};;r~LirpYr^= z^Ijce$UO$7*KHBFaxgO)F83IMOy2m@W`R6_M!H3v5t+?*c5gq(d=S`>(B5tfyWmfi zwU3PAFHE{q0jQZ%!}xO_u~&H1f#(3{k^6DO52i(@VGrT*o%nTj7~6wU@_^?xw(P+| zb**P{8@0RMbn?GG6wxpRA@?m=Z$af`R+AR4v#^Ze#5+lCyK~S~*Tu(9To>sT&6(tY zo{M7Pt7cR~#gL)8k0L{JZ>leH>(dLfZvmp=iXLV(0nmyQW1jvGFO0ndW#jv(| zLWVv|{jk<)gPJjpovuuikthwHeev&Z`T6rH;x7O3AOD`~9DhRq@7M3r0Q~W{zsVne zOc?LJ@3{uhOP-6ck`}9L?|9l-t8jSF7#R4WZ5OQ|!I}^H9fbvb`JtelyJZK$&qx?{ zA`PQKw+br&fuD}@Gs^=a4r7YfZAfY!!}#A{_4Q4P)`v<(>KsI{oe%Gm+uLbc-SyDO zf}fMr*nf`-tuAyUKf=^RJdVDS=qY^NpC3(VbOTUm)e{Cp%jxgFVP7wUidi8M+EzLP z?gdL^skh_wNXclDD;1dd2Is*QUUp#Z6JyO;CY5Z)|rG zc@vj|GIcNhBCRo8-z{j_{E)cmu*(ifZO9TgO+7Ti1*P8^-z%^h@kM$Zi;Ndedii!n z$rcAN{<=)iTJi7ie+&l|N;w${1a~FUpbl9Iytf}?N>fih0`bq+WisxkJRTon*CqFT zzpKvs_4_mc<9W;1^GmMBwF;o6lU)z>IOoyVG&mnFFd9k7EMPfn&|<`;8aE1u(HF^4 z-DPhE6peZ4MS_@PAkWw*1WN3Rwq1DgS&+4Yosc9iqWsY}WuiKNj)PvGiz|ekAd#_u zevlRJVIoR?>%DyQ$AJS;1!NwGv!I&wCP3j33@XD|#Y*XS&);d_(icC=fJu$} z*pUdpy$;y>zUM@htTkBs!1cN=JFJt0awS{5T4AsbMy<)MfSVlcPb+dask;6+4^HS ziOxKU;VutTQgIaLr`$l1WPFcu6&&8ts1@Rrc?$h{uXte7*0791yTJOIRuB*fRi913 zxpR<$=J_1*@$qQSwKa83r7~WR2dom`ulMUWX#nnVPnK$Phnr}?s40O)rPF@0%r?}G zblgQ0yJ<4&S?dHb3L5(WG^_&CW)bp=AT2=wHQJrjxol^Bqs~~Pl9j4eQoQAG>0mn9zhxqJdXyi!n%-;;( z6GO)7{MXh&*=Qsy-|73Q9#R>zrbJ9HDO#+s4EI)2DuedOdg}2D$0@XH&epSFqeU|| z&KesGL7$HJ-bCi^{t};=B12MUsak~JO~nGd1wZCTXenLx_E;#4%q!M+IQsI(jW=Wj zc`>c8N19%h+GYOC+0fM4G5`0~9%&vbF!DH_&C4D#>~47l@7MeFjSYYT8!jH?;bXz9 z3K5;!3VKV-DqOT4Nh=#n+$EO&RksEJ6a5164YUAFZWIpB+$#ew-viE-&i3v_5mySD z1ThR1)QC;pU|o9tx4FI}7zK6uW<$Jd_5~yI7)e0gmTd3?f5tG`0V0_@`s2^KwB1>%t)1=|yf-X;}fa=E3Wk{A`1?K7ez_IA<|*R`X@F3 z=!E8A>H2tBLVDc*2PfE=8ju7?vaYNwyL~NA=QvS_pxa&T(stsLmsCuuka~D@!|pwH zj@nYx*m_o$<6sfY?8UTy-mAjF8!YE0^K;p)N7?)a4)9DlYYu@Jg2QEKD*~}k<)H)R zUuOh){^=EDz9Nnk4$vTvXBjA#P?Nzuvb3&Ppm&f#8dw@;N)@$t`O;j z+W~HtNG6TzpSlK{P1;!d{2!NztZ<*0@I?&xI7Vc_$78M#ru+A@z>af7TObmwCg2Kl zNwEX3YpWypCaYEf;=S?d7P*isf4CNm0yJ}~zo@)8_3JX3k-X;%3b$6! zx-%ywUgjn7vp`00{pK&SJ3y5Im)LYqq2vZxX@_$)qQ7V&yxzV@SoFZZvO15M(UIx8=khrZ*!F!<l;Jil0~{IB_+H$xB<9xUI1d^73y9=FF9S8-(JcNq$Up-nS&yI2PLUD`DpQ^?v=c zR{&!GnKqc#4xu)(6%B;eW2ans@+}(HcT3vY(a#Cs9x9jIYsX%lyR~WC({4;*%MQfD z-2IP3&<)C~3h^^Bcu*l-&J_-#au+l!c+@vCnotZXHc6<*E(`KSD#Xb|!9N}em~9fx zgK?3oLb6p?1ib9CXx8Bv$%`=Sug^Fqv?xHtzr~ z{IfXJSUQ7m=JX%USSKUa=X#3SC2Y%}fW&)qWb{^q6Y3GuQ$dx33g%q=EBy}EG>0TY zLXiOKFM6c|N~6#q@YMUNu#}6R?ksdbt0=?^DqErlH2R zY__LA!&nGj$w24C?+N0}Z{gmooC*FH=JjYJ72|q}?6+T}X?n9C4*Tp(Npwu-Tv6n9 z!8MRV@kHqP7BpPyJddSxn#@Ug7ytL`H){aaeQS$wry_FMjH^W0Jy+@~VD1qQxRn9P zU|3S2sEtlOa+S-9YzRXpL7^ncfxnN&M4qW{l81NfcQ@BS&uG8M8Hsd8wJFo+*Ogxw_@9VyaHC?Rl#(j%jGyU$SXl{rd$Ea*9)o`nrpcU^( zo%(JO3Wpjbu3{50(rG`}@fDK{y#F z|C8g~aet?_4g>t%Y>8`Ti)gs6iD^o+h-|2A;p>F2G$P#VuQueZz#^GTGcGy`XRTbM z!^Dj@!S~2&B&-+y-jLMQCFBE3O3EFCRvt{^RPwXe_&!0$F8FuF3Dc4Tfsn0wSw6}| znt3|uB|z7kT{&q{=PslsgqS~fk^A{6mtFGwdP4RA?#5l7&yiEVxX7IyjvuaRCH85T ziqLl)<~|qDO^hSATeNd&`fUp|DuQXGf=-@*dl?#ucBe!*kMcI)tdlVukid$iR=vc` za!@M7>fH>yU*FsSRFYmm-3kY@!>&-sOaA1r)yXy8XFnfGq4DGB3Gau401w?b5C;Sk zF&VETntRue?sP>uTJcC0Bsh}+wx_xt@NuKzkqQT_2<$193`j&?2jxVe9RuG<5c*^b z2cD?SXoU?}_v*6%=Yi;JdcutR(JW?_AZ7PrH<;~(zvnZg0g7vr^Odt;;tDXCcHcpl z=40>YDVySIefO5oW8){%ZD{dc=k-LHvpJ}5=?jzTTtFQT!#LIuP8tKszY$i9BZ&F#?Yh1$j!`DA>63+%i1Mp0xpGWi!cQTTEw7^MJ`KIm2gbN*^A+I zRcR5#E}2@ zJR|FVakLfjQ4=4?|bTPm-nhjn{vskTn0@;HCcI1RZwPxT=z2TTr<9Oq4KgPZO&MhLfBS+|b!zB(j+Z$%&__>u7@xM-( zL*z`;C9zBX>KT2RZzY?1AsAIflrABFVsLI4T)N=7?C+yTM9=2nlIQbF#y#bRYTU?) zydY_6k@fn@qpyU5L&PW;B2m640WM@SR27r-IAQp|1*tyIf}JW6x$p1@mUa zsH)i7^~>7nPkYaOw_9YSlOd4i??3IL@j5xl-C##+hhkvLHt*t_5#Vk*BXZ(4M5A;a zTn7b6o@}EW6I=Nslr&MRNf1o}W%3P3k`@148Sgmt2Z_@1XJXv4A5D3X$vuCT6_P}( zGKJz_W-vJkixT7wcye-F;_gK2=*$<;hy=EFUwc~7#;jQcwtp1%J;`YK8ImpXc@GWh zQ!5!^HHlntADkk)f1O^dM9MYQEgVau(IvNoebV2q0NDjkl}9KJ3>{1lQ~K7ZwOoYz zd5fBh*`uKaXhhYnpLZFlQbQXy*AaH){#@ZkD);@BJO5ZAeY_ih_v@QqCIG+om|v%~ zt%JlUV_3(w13X32dWOqrIbO*S!-c-rhth z8D(`Y2rKi}8q8EwuR}8fE2>UVP-zGStDxc|&GW>?>_b#ko==zS@enhWj~_o4`Y7_} z&!6(&{`>#)zr4%P`}J)IK!+PA>Fp_@lNDDu#C;!9!gbDN+j(;b4N zK=e|__d3SN5SwtjQ?002bf`;9UQuGyhdK`^rcCw?;p0uV5=T!ntcnS@dXU4jv|AB&`Qz77c@d$Z zCJ6svbBoS@Cj>eho-97+V%n`)sSwzbd#*+@uh(>@qA9sD9PqtYd^Fyh4so&qjS2e3 z6LIndwZ^?&1032>k3oro2IlfK6=9Z%i}?pwYR!U$E1)5T%U=vI8=MHE3|SE zKmm_f0@^^jlkrmz$f7k!>yo%p?pD`h`FZS31SgeZ2$V~yRUk`2nWx}BmPwM!buGfA z4tZSDQ0Q?zCX_)#v`^^pJj|N7tm{auFMuWxSvqIi8hNA7ifw1=`mjh@diy ztTu4sDjZj_FL%FsSZT;hI20YxSpL*Vd!Vl;2R84B1y4oMpk?8AZCMa#+AG?&6g|5d2Z?`@Nq+*3v7}pM zm+HBnq?6w6rCQGol+R^z>U*#fxBRdY>c-H%8#@t7;>U?UKckFg>HB!mcvNG?>#=gx zBtmJd1H$7VQMk!NL301&@ep6g;P4?IA0IM&$fX}L#?N;JdcVH60hk6h(@+0-&j;xq z1E9BFgmfpt81Bpj5=raSXD|P9qa#LpE_eN9A-u=kGy=X&k(lp|MnsZ6-(>@;D(TN| zZDN+b3v?B-GQ!U#0*6ISP3%f2+vLu>#KDq8?_*&RrcQqCjhl9eT&{w9UAz2{6b>+< zOIx8#5+HI%;98Cd-+{|+>wh=C334C$^cbIUdQ-&O;X26rLbvams`ubr001BWNklI3fbZ8g zHvnM*6b2riFf~Gaux~Z&@<$$q=-qvu%~tr0NRnX?!o@WqcG!A2T76p_V8JbGHIoYW z!J>%7z=}MsECD1yI;EvJ7_bQ0gbLcNwtX&Jw(c+{5|nztTS>iElANC*?tqQTCvsz%|f4Y{n~=S!B%kSgG(RZeYMP~ne^L*Y2g>c|#vtUXeZv`KcKke$M=cILaM9WVP` z@G}@Gp5eZ2#%`ZzpUoZ-H34UAaAxiKvT@c#ON!iUj3@v)rP3RICuEE#|E3axCNWTs z%ZwVpX>X0E26{$dDroTtSS_P0RfX?M

JatG&q&xWv@u=hxS=TDQeddN%;?*Ecr+ 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%0D1B3uy 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/gui/gui_empty.png b/src/main/resources/assets/icbm/textures/gui/gui_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..7bca84cb295b695c3e8d1a3092cf3f6f24c21c41 GIT binary patch literal 125076 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�E#;qJ8;l0pa+>9AiA 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�Cqe0o6672iFHz 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/gui/gui_launcher.png b/src/main/resources/assets/icbm/textures/gui/gui_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..3bc6c036bdcd47dea7477288029ec602ba7383fe GIT binary patch literal 117320 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

ByS9Y5%+LDJYp899qXY3c#pe_d zgDTI(@X>(AQjrrOyW5?^qC5@s+sjcdvX`ZNr?$+Tg z*oZ>-f+~Xq%+FKq$XMbbPJ$>{J)fHPNg{&Q@((4%URGdIr z?3FdZ^1M~K5F&c&7Yay3qMV=5C)R2Q@%Ljqau(D$=3^(s_?&j*4|V_~-|1Gg1;Zk~ zcc$J1!56$kB>7tNy&Z49WpiNept-7l`ejH&N(AteN5GXs;NpeC2{?WO9DV?7&H;Dd z15RE8cMgHg2Do+`c=>9-1MQEqMF7?{d%a&fid^&SBO~V*fAYCFOrW^v#PcQ$&^14|O*M7at;30FrKIv%i z!8Os?^mM-JTz^TabY_G11P91e$hN!wHe%ReN|QSii1A!xKo-KfCN6>PY_Qasu+)KTmCeM(EVqX6FV;HGo9o=Fi_7lkoyLflWG= zbjKgCfO>HyK=fdc@cT9zAba_Ck0_BvB^4++u&&X(64dUW9fJ|;%GoPGElrU-HZ^`q zG@enL(+AH6)$t$N2N-tGSxaXgNO>_($#@X0Jtma{m{UXdqEs${71lC|#$|&c={npl zjv2^>Bxv_XwgQVcDfTcBQ)@61m$ByJ>0i*19P$BXN<5Y$axEc)X;LOMqohBIEEQc# z?hlcQ5+yM=Aoket`IYF=PqU02u$hK6W@byws9-Fp%e}m87Q6P#vIMzmesT}E@qTdt zJbb@w_8)vy693-$gCY~WdK*}`z|Gshix%h7v0ql=6MgX*ieJiv)h(?-g3sJI- ze5d6pD*M`ImZ^h>BMZJ)1H?|ZZ3Z#~4NWV2k-^HP%w?mioX=o)TM;LT8h+N)HwdyV zj%8C?iM%IMb5VAx0};7eCo5(_8+Gdu5s|5He_%FC>b{>ujXw}v7Ati+T$hyCp>2fc zd)cKaG|1&gToyg$g$61&(hU(n}W=Xj+Tn% zi=~?G+>BBJMlCxwXpk+gZ`85lR;aGEOWGo@Ygv3XM+1>b4!X~_rOQH>2&WExiFf0L zmk`ZNc17?;-Mzb|mH%HnQkJ+5jQYflRCX}?$K{YXvE|dZuxb6s7X`5xvF?-$RT{&z*ITvFPUxemCGh95iE`0F3XXGGAoQYR4ZDXjr*Kz*r zI)B#^2FR9`6!l#7GjDb*G*aTs<{I!1J5O>>eW_6Ry)zHR9GFgMpo{O;# zX&+$RAiq;g=J^`N;Js}w7sWA`!o4xZ6wM;h3%_F@vX7)K=W1DG7^gunA=NfzL^&75 z#44AFU{yqu9}V;Ovazj{t3dBYGP+g>2R==A#dwzQ;sxo(3eAj%5T+htS9)p%19zdl zSsM$e^rTQK{<15FynvCekkVjRYzT*Of7HAK`q4mcC}Q&IgAt7dz&jrU&+ZokphsT= zAAb+H_iG>>01v(bZoLbA^srp~Cr8Bx;KftGOw0Di{x~B9Kx;>`YBjgWYnTO_|2QY! zi37FFp$efTU2;}i%z@cFwk?uTFWh(G0Ujl*Ti5*00l!EPj2l41entA3($;)sewmpw)alB78#ABvykC`C|Y#G+1A z>KrtM!owD5p0~H(>y#AZh35O>MpgZ0Bao0ez^<2C(GM8Xv6>fwD*;H&5_~H< z*Gl@YHi`(^{Ez@R$@xfWeCC9axrPFe?*jU!fX$1@QIV0bRQLhfp@~W^oDnwbkQCib z!%c#zdTBO3i0DKcH6$;lo_+&-@cnX~Klwx8(L><9Pk;r$haUisehXZ`RX8KJ4}q7@ zi!)%>{SLH0&K3cH7SdBntt(2fC}7aWC5l~Y(5+1}kJ3aoHnDZAeEJEF5zj4jX zeELq@7d;wMgW2ghg!Ke;qq?1}nOWo6=b`bH-4#y|=8qIZPB6)mA#Ae*$$odZ>Y zWm!UDt83frcbVx_o(;cBZiL|!y#e}}zE9fv zf>r`5)SjZ*jLYsTyTHvkF!JomL*X*4`30d2FFgk==q@*4s=0C z)GM9!eDm)Yl$7E^Tbj6RHuZ77>s0vA--&za1xLP#eTRGbE1BDf$qQD~^(%FyZ5v76 zo%1=X8v6L1-6b)%1zKnGX8tG9pCv3y!m=#bY?iRm`_Fh0)mBsXqn~a5vmiy&`V(rv zjQL!>>l1GbMv6-l_r!0vUR~FMvb06sd?QFtKfvs?QHFC+3&ZVN*zAc+a)jWQ=7ebI zh`~suCYH1yiGss^_%pES55$9hlBD8{2_6yD&0bR|KpRw@Rk1dE;mH%$D;Zj6+%|tE zpEh)c|7kuCiHLVDDfF3ki|B3vT+Y<@REB8yB{4x$%P7$~C6nBTuxvzSMfmPrG2m{8 zd`;#N$dSLI!PCI)na9!1tN>sGqqHneKvazulP{hDpZsg!n_mI%epIf=^^b}#z=z)f z&R+y>-YuK{wOfVTa_u_s=JkFD+8<|(0E9(bD)ilM|J*sh^^XZz*h&oKurxM~$<;9x z&O5o0fTl`XTZxjRX&N4lD!jXOc(6U}!Neta#`lsjHi~J@rBw2~bYAZgX7D^Cjuykd zSdVFl)WwU0@7Fq&ILjXwv7Tfv*h$;234jrr?Z*wAY-fz}K*f;QU9(Jave+sj!84`O zJvS}9RQO(oJcS6iH&;Ub*3E-qNogP+0({;npMsM4M1Un}h_`LX1Ue;!ZGf7Q&1Sb6 z6IJ<`Z*)4|x78z`gAPXmAg1lE8|`F>YzBTqd}ft+I#D4qj(T`BL`WQ>kAz)sjT^d+ zQ=mg;Se%Xds9^LW*rn5n>3m$shG#8{U9+Mnl^uztvm#Xq$rKwsH5qhtE~GGpk3Rvv z_^-hEOOS`(Ko9=_xc>{_?Fn%IUaDl3ccpLvw%h#{q<&?YHL)FG&)l})F>Q^T1|WWL~oPHAqt+3EdaDy9}N`BUa7*BtcY<$Gut z5wtva3($df5F%#~^ozKV9E(j@Qec`lSh%svQ>UUhE!I~_NG>4(PbVFv5PzaO|7?dW zAl5rwIqgvdw#Egq$D_@!v-xKmx`ZUQ@Togie^GyoC8Y0=B!j8$IvBcuKpX@pZ}C>td(R|z3}WryM#Y_uPKj*{Qw+wX@6%i z)Re#(#tD=4WnALaxE1A`t>)~Q>vzrTO2`j=&U;@0-}@Zc3iQKIfTMd@KK@=IecXK? zIQk86{hbmCeBlD{<^^#1+K%tKKlaBzBLdI|q=cEFnBX=8o@NwO$x~dRn_0?a z_N$$RZXqVY7UPsg+fgPQj-O2fyclPzD{}VPy2y&{RtfQNvL7_gJ=s33&DlpU~oSbFvZ1>2|==lIbKF)$Z#*Rh!vjy5` z(45NVqzMgP57G1`Hj0{Cw2yDX$`j|{Yfn>KoBu{QT%Gc64S68=AeiVTFi& z|AZv0Yj?J~p+y~1X6MO>~(gRs>Da<@Ue8Z{AxL4RXUZ#7K+TauBT#~YEEUPBV26r zci(W`3Fj%IM9DXQ1b4EwXsQZr_-bAM5Nss9c0Eyd4eR7nTD%JlP`@+hB`v16FOFiP zw!g*lmO1KzgM)JrS%N~r7tP92XJ@tqCv>Wl4Yea8^5)M8Y%wK|;qC<5!YP1-M>!IU z3`%n~^|W@~oWly;D5KgV5!%oa_ADKuWl>Oz772hyZza{Yo=N;m!K4}y!mHy9c)FSAK7Nt z#iF2S-&4D$s>Dm7??e}xAGu{&uxyq}`YhW1l$I*PYtI-d3wYciv6f_u=IBNl3;LcQ zIU@tMMA2wkB!p@p{Qz?ZL=0^q`>y$`_t_?LkIn2l#@8h0gMf1Ny_-PUWHbE-~aO4hdA zQFhgMm{Uhiz`CxaPp=Q<&aa`wJdYXnZbz(L@>qjL3C6FXJWXdE=Ey15O=2)$3W;^0 zOQmkU5s0|EWH&TJ9ROrm0WH?c$8V3Zq-4`v33FQiY{s4!vPEt|DnS*;akd?@tJtBq zaD|7GDZd~l+>Ncgukbl5DM~O=7uY8x7QNDDAOEavuy#(Xy>VdItAvqDd~cb11GFSR zdmD1V?Cft{=^=LC3p|?E;d=kRse1n}_45X01>OJc90&wRnLO}Q`2HN1ER>)a$55os zs5gu!B%&q`cN?ZvU97f{T3jWp>xyNw!D@5tUc%cI_r09e#t%`S-;eR4*M&|Zw)+W# z4yl7d+NyjVJ-4L&I|5!(%)We&I!w2P+pBxn=;Q6y}OU>RN`{SPj0jLX2BFN1aPp-6g+^xCIiWj6suvRa3RqkX* z(ppyTJSOY{BFm*owyuV`cl5#6DWjUYJ@OVW3~iqaOHFZ$ZhLV51L1_kvKTgE8_ZHP z`3BWqH_TC!ca3OaFak*%q-BA*^esyXys4`{&+JFi9$hDc*0VA6`Q&qho+GHRV+PIc zdNEW*`U}RLKb%icOmLEQR(+9CHuy|Vj!uen`5L7dQZZUklzJ^{_X)aADQWOXK=*as z2f#B6O2|{~4SSz|aRdgCf*6FB)kXYaW3yDmk-^TSIp(s8)OmYWv7ekOn`7&Qg$4SxgdlGGv9y90hcV zW@R(tg}SENwT)(iu=I&#Wl{GcWi4@VSSmB#9UR9i(2R-rl-mM~iEjZRKW@3qh6>?@ z0&*0rTv=MUqv~@7MeV|p3^LN0-@Bs`LchbvO3%BQE5H9xB$XybklJ$1YPx!t1I4Pn-=H1NqfBsVv)A~J zv3pR{|H}>*^SF>@s`NQ=&0oi1#_VkF+Px=YZaaUVc7L+C*SU2l(R@b0JOp=9YkF%4 zrcttdw)@E2w#lAsPf$pAp0i+#^E4W{^n}aiSKq#~2V!O?jTVW)@=5krt z?^bBE;YGWynW1e2d1-l$nmJG+i*4X!yR9tu^4)Si!Md*4Zgag1;r3K3(o{XunNU@(sWy{yiKZy*!6YinU`3y3VwF;?yFij^6a(w1P2rqES zcuo8}S$)k59t+;)(^^yS>go?-=d^K#4wjMv`0xwh&WFI;6}a;b@bH`B{hv>uSFQrD zpO>H@U4i91u)f{zK>Op2IRI6&EaXETOk%?PUgLvTAG$TKG`&-FW^L289ouHd?%1}C zj&0kvopfwF>DabA9rFsW*yf-6{hohw?Ve+e8dbCAJc<(g>`t^;IAR_qzO$9b2T`mV z0EUwbH!a$i_DbLLbA9L(!CMFd-@0vG4Ky?3WNLLFU0e|N{Jg}`kSc=ef zN0Kz6F2@t%!1iALg2yep#Q~Ujut=pSQ8||VoE9C z*5caZ5-+U5Oo(jMn@{Z#q{_ifP&Ee{NbM~NlLS*}N-Oo=$@5jf-^5+N;SY=iZsWXuw4SIHMsY^JKGYj9v1WY1 zSiNX+H)6iNkGk`VF#wcco1x|_h2HUA2e9b{I5v9O)tHk(ZRlMSZv4Nhj0vg<*3`xK z&ON*O*Wt9;QdlJKwOjPypbIY(E-?2Vrxu7&*E{qC7MvJz5Za(;4PL8Q3xkZKeKQcl zb}}A!F{6jY0~832tCQqS{)zdiAjRTe$Hn-FDBa1p=;1ihT*d`KdDFp@l55Mrb5b-^ zgR>N(M`4dYDK$6z&)_w*r&DV=CY9Xn{8lrxLEMI;6uKtcF5YkchF`X>ry6|tsPpiR zN>!A+z$L=A0-Vytpv%CSAzTP0C&!llrqS=)$UjaZlY{@ad7lrC<}#x?&T^Bd6HTS1 z-Qd^si{m#j-d~`zS+RrkbiHJB~SB&)2En&BL?KagyNY+PcniUuVYr~~Y z>T|?9=3j80$x_Q>b=GW9%|wvvAW9RP zSG$x4uh?(0i059X&VYolZ24p%m^W86FcoF*^AT-u+2!Xa0<_eCxXKJJqs(2Zh{aKp zwQ&G?5M#BWu!Q~yk5TIaeK~nYv4MP~7?XH1N$va?4xQRsxDK?d7*7$I1$_Ia+91C{ zZ!k_I=?QYADw=eJ|_chq@=2{uWWVEN}a#CH7+NlO$0I3Ke%sh6gk5y zCw>EwW=ZHr*qtg?26>p`f4)AQ29;>8T1EuQD!mP#iJBDBNVk$j6(QT6@?-5?N#Fk_ zr8C9zp@Er+T#;&p+w{kNz2+Q2kiv9+K)ODMY5(x&22W=IAFB_7Plwle0+2T3oqH5~ zIJLqAj@>VFXM1xg)}@t0!tn|x-vxqfxW%Y74sD(pkY(0WVTmIJNvzIRC9UR$3+4Mu zAZGTr-Gg{kt7JY{n0&ETGCjOBURWBpjBX6EX&=-O(k%+lT1WsoX@M%?z=+$Ou#c(Wi09GATm;37dSEZ;T_j})CJuw zG%*f}&!x@2subM^$AlOfU+8&d^YY)$npRX*;y50HjaLJQgyVuKb@vvKUyT8sch`SN@<`>HNVSoI&8qFNmq@ zeuk1aoPHoLCXtET_IB7U5NWQ(=EGtVljYZGX?O?~q<9FBYg>(a8BZ6JkFEC=b75xV z&}FBl^ULEh4Ii*RBl6zm)HMD%Yd`}fjLiVvm=1dR-}a&;xz$sEAtrT{mcp>hcm{VW zxnav%9BLCV3~cF9*NK3fz>;rh$_j_u0k~DKGDA$J8%*)iu!)v=>-4QD*Sn<*z5o8# zPkFU7gC##{Q6WUSPmTz$c^Rw(CHuE-YSI4AEON64U{W433v1Vk!g$~NVe8)Mc-Ef5 zf;^zI(g_d93`rp-FH(NmWj{Z_vFI+rS0<4zRq5puN#4qmjg*y<-2#;G^d$|*8hG8< zk)RR0t^=i`R0*uD(n{+E?@@Z|h)Hi7wwHLVPnalGI~uLl`Mu9*#wO2!NOKn_X(@`uM#DbQ zT8e8$K?-tf{i(ywkB#U*L z4t&xV^=9M&uenVtOdwoy1tqQdaMK)nLnX*_v$3nTbdx zd)+-T#6bDr{}a?{>pQYF2}#YWnN<#Bnxh&PXj5GV#f0end~(2~9bm)-upWno<$6Ksc#GBU+0p$}S}n9a272}1-;MWP@U~l?Vi(dT%z38Flp;;C%5N|d57yraHmof2!WTU!_@)ny?%bA2R>NiG z=0=UwpB84?BpVquwRpkB*A4p%&_v|FH_R9N1ElE?mlrG*gK#_MWvuy5Eb(M_R~{sI z&i|UG=%?!7!xF9|Z~M$dY!4vYS_+wb$X_HA3E2S*u1mjA0^=*8tY4{A83hs@_Drc= z)?p>Ze0e&_veN(J;&Sorl`41G1-?|Ss-vgFf+?NCRo{QC2r>gO*_GWXEbCHOX$%Y}4Tj_+U;yv? zV0TOol0*)q;|ywJgqwT-2s49wf3|Nzj5!3}Vau{z3m`fMCU+rZWi?Qw-~L&Enqly$LGwY)p^m^G1e z%Kzj*_?Kxqh8}G0SfawA>b_(H?5iXa(f+Y^lR}?@3CB0te=H*T%f9*dtdqt3@?kal zo3`@2?iY*OU#%rlhapzgF?rz+Ci)@s9;76MeLlkH2ZflzSD&*72qS9Mm~^J#LC z+b>dxIQhRj@4zp@@(bl|r|H;M*GJ+9_`j98NZlzA*VnuIu!Adh>O<9z76rLWSMPVZ z;Y!W3L~wkbo*2ZZ0k@D@C`auvxy-#C__nzlLlKhY9tr3NChDnf5_W|l@beGxSDOJp z4uu~>(dU7iV|UD5c&V(ML7J~N>pWl3uKrMMq8u4lfXB}!sIku3IpcHZu{rhG1mCj< zo{P@hN5iV|E1}O#w;poWGv~=?`5=&stLW>rHQ*{LQ61c7hYKCw6>Bk_03#^LD-}W9 zTjQ4f&FK=nt)c=L(a{I;_RyEpJ)ZXkhvO~WD(&^HQ_%CTDf6#KiU!-jmHNpqqCO}j z28@V)#!q(x$Zwa27|5u8`}VWA4&f%yKS91a9p7(5AWvwSjZF zh}`J1d+ruc?t&5<_DM7Mv}v#L%VY9Ayzfn~ez~O7RS}9E{#W)>p0_-(_p3a=r~M_N zv5T9z=DjU;p4W7HCTy-$6q=va?AGdcc>M3u{F|NK5QH6`XMTva-n|W`Ry|<-N@Iec zq&O2QUis%!7v&GX_u_M*(-N1f9O@7pWEhj;jJ+jpf+A-Y|0m#Isi+jN!>8K*+Ct&0 zK&j$zk8SWgJ`wLLKf`R_y4uu{2Y({EfJIy zQub&RTkQ6&`;q~#*yXMx3-tDr+~r1p)zaC4$S#K(})H3 zeV#pfeFhf*qzjF1CXF95(AK6XBH)y28o9ZXH>2r`H|G35*Qh`yfy%$$ZxTKuW^X(E z$_OqrtU@AaRkR!GsHCh|9YGXCX>vj}uJY#uAjPixJ`U=Sy{&$6crx2MH57u#uG(V3 zJsQ1KTjlYgJGuqivHXX%$T>huDe1^=LNy-7bdYvjodS%8aG}vrW zXKo%QJt%78i|e88YA}3m(d}{Mt+xpw&$YveL=8cqyOo&g3{DG-g81L>DjkO^=tq3& zooX6V75075Fv6%qDmHcZ>!|wrj*?PQIu@%=)`3p~k{%(qu#&J?UpAqpz)FFMp{=!d zaTbl(h!VQyEcQQdKOAXwxzo%B1_pvJ+zCe+FWAzrcE&WZ0rbD%&-U7OPlMg}ME6)i z3GG8<^;4LRVo$;te1CAXo#g$~N;g=$q+H1n7@H9_d>|h^YKW*{NFo6*reSW(wuY=j zA_K30BY9U)AHu0KL)tYm)+g{nU^|^3_%=HJgr%aQ^1M63$#Nsz!UPiBMML1sV_#^E!5KnZP3mhrvwPu^CaFiMVeHRJTOpVG&Z zHAyt_Y>Hp#?v2Ev8PZzX_nojc*zUwR(^uLkyc9=$;)h(cg?IHz0w@3b}UZRjLKe?p-$vNdEksk81Fd=WnllseA$S<2sVboRkfOoO|K2xN{y3klK zM`!4BAlEu*4~%8dDfS(kF(0_OVOH3-|D(6E2bPD$-XM!Us)wECPm>8FPQ}5=5#~_r=t@CRP06- zb|4p*bmJA5^Oo&G^7m!pneswVXG!R~JM&pjk*aymA^=&E*hGXse>8=)Xav>d${7KrfuW=bC>G?Fw)SvlNex=iz5rlj>Q3nZT zYVnB%)GECr^ZUiip_-A7`r$iBOE-QP5Dr@d|B`%N58$<|4h)gTXXmKzz}sjHKe8O?GM0corfa!ftx`wrll z(7xufdB0I(X33S z_)Z!=sb1!a2kR&EDo6N$W!p=QeXi>&h~^ZXca7Ai1Yf>I{g^n!ecAlAPmbrCpZ z;DRORVaO_+Fl@)^&G+)RX~rC{_Prue0_u@w^>;@!dSyWfCb)!{>QFlid-2boWNY-G z{53z7?;P-d#k{o;grm|rptxtpG0IjYFE&;((q!5>?5&y@AGOWMFr)47jm}?|V!g8> zwQ750p!t18E0N<9!Zg+uld4v=^=aAC=&p^5o7KTcU;RNb3#6zn_V@weR?8EcAk!=E zSKAHN=&I*^DFKVN-9?V?Ekl-Itlx1`D@M3)9Ft#OK>(9>9)^9!O${i_l7(~ zpf>n-PEqRe3#3-$1uTU9<^*}~;!MDF=@GNZmK!e?=&9&_n&uK>(uiioBrzEf!=|76=#P7-*IRRN9;ZW! zLHip0xmOsA-{m_H+5miI8#E0ZFd6sV)w)7He-SHge(Nw_*bpGih7{7PbsL?Qj)nLa z>_txD@dr(yX!kQ+5VmT@Xmbx<607DDgo|Uvu$Q;t1w?oh4L`KpLaD%iR`O3sx>JJ= zhrkYXqZeOhB(K9QUMg2CICO{9%vq#Ka}h^$o@Fg#H|;P#sU*QnbSft)A+TCrUipR! zWmLgNBQeJmqtGv7cCo#QDcD}7a6{Jx9qB5gvMU7ts(~HPtUSz2hEbJnvLUoB>-J)) zpsA3>b4*rJgJGR$s$_EZn;AY0mO0MOwP$&+t^gy!VfXu|2hOUgm1OO-BtgnO78{+x zq#1Lfe(&nu69%6Y4jdV39sleig@+@YMvha;z)!Nzqg+F2)4kHm&9RUm2^@@4`rW@D zY3t|YWlc@$A&pSd1^q@>7p}=r>1@N2P`YW3M;*Gf5bOH%P~F!57aZ`B@Lj9Hos~ZQ zK2W^xVYoa%J-vzAoe4di)e34Y5`qpl|Ih3c1JVplYcb+JgQ8V6El$==A7Zcy(fBR6 zYJn~LYtqHiEdXQJ4zjTngPW{oEEFA=GHDA3Kgjp3fBDS;Jk}PD!>WZ0e?L+39b;k5 zn8XJS#MTVh>tMHNL9#5b+r1oJu`nalc)H$9Y)*`A=eu3<=rS@|4`XrRcQ_KGy2&q$ zbU6#9B2__)rv{g|^i(%jhCIt>qo3gPbRbw1>SCNQBR@o7 zv^Ufc5v}qo-RJDYRHIkVzmuXY8|{=>H9bT@StCxKy~n%OTClbM>~qj}GB(_#j6faL zWQeW)Tw%6juy{+~>!alOXSqn|V-8#^YaHl~@?kUT|AY`lW#rmO$w3PA5TFt33wYQ8 zTm2>?JOxT7e4p=8^}k%dP$AdtRTFr6$nMX^ej~ID$e{-#hF!I%`=>rXVqKQ2(z1s7 ztzyY}#bpAwN0vLRFMjev3n*553yDe!N*t>UC|lH3YEQA0_eV-wHUUJ|9JKG237cEI zTo2Hv)n2AS8{&6hyzQ61nJRxvE2M?^&?J;FQ*@uW_MeQ&Jcb)F5KLmf0<|!jzR5$D zLUt_GMDyf2Ye&FCRqb|fVjokQDrGB%{0rIg^$UC4ve6>~!4c-ab zy|6dFy$%3~*AYRG^m-7z|D| zI#cfPmds=U|I0JlD#*wmMsbbhxw%~~$zA5|Y2lX? zQ@@dG@sLQTU6#ACI!pybXF7@ov6jVTIL`&Jp%^C_PclYRNb^sUJC@BtX;uqZ<;!}x zI;rDR7?_p~zej0|0laldb#2s$jQ2N-Q{(J$AUi!W>D9ZUm9rZ+m6Q*T#VLH=uQ=_? zPzK)Qp^Z(Hg7HJI&NB=pO^363byt*Rwz%@pY*%Kq!{-LGBHN&9O#BD zfUMZ*p1Ig2?r(hoLmv7=N#g5rOCox9D298&+Y18`KQf77=6Klr?@{oMTck$rh)1A8 z4b#D2QKY*ktP?uTGww=puUYnZPM$yscBML?n}}r%WJ6q#vl`U6W81#e)60XfWI4O&Qv z^aj1ITt%hmJMPYSD@5QfG0RR#@y8&%UtagL)YfiH+$V_<+ZPI$CQOQFp)rp(u0mu` z9qaFDgyXMa{=zZNgfGw!53KWJlad^moKASNBMdZTk>Y(*PkF%8cdD+MK$DxJ`VI3V ziXg>suraOe=4+1BFbQ-od`Zem**?|F(G7KJD^GATK~I!%6h9qIfAt3TkuX=2q|_2s zi}}9BcomKfzT6yceM2ST)i-jvqCC6Se5twoDh!6~Z9hE?N%m80+icx#`(ez9zr*9( zoEE$qh_eb&OKhPPYYzoBaqPrO)<*i77znWnHQ^9!rGeNl#^mGXqs6qY_DUut{6Dl@ z$TC`)?@-Xws;>3uA2*WRhpPaHvfv=Yt>5eIb1Z0bkD; z182C$Q+9;vw?q9u{uv|sx+1qb!rtCibbsE+0u1Lsze7Q>Ag0E-=?p^?ya)*$;&o`a z(wnFXW3y->woLc3PP@%Ad`B_a{&_s*?U1j*K}hTI__&cM;(A^H?&qDZPyT_s{cKk& zS8nv|%-L#hcgiLa@N#IN=fd_eD@sg0b%W|f&t=ycSm7mdS=Di>_T`Dh>w7X*N7`A7 zxow+Hc3)>|g4>zhvH?$rgv$QjKnFDc?D@y18;#B0@`=l zu^!8lQ4{ou7Nu`p?`xfPnk%(E8a{n)^k0^<^Gi#D9ip`4rL?sV!Njl)uH9ZOvDLzA9vJ z{#C2jssxVTYOTRGFg$hG(J~d0p6ge9LS!D*!gVQt{lVx=)F3Ljh+KfU0+k*=JFN&V zh_&v-wZ~s-5H-FIJk5a?m#j8rSIP7Euq9wM7dtl|7^>44*RaHWkPxzQF^7F@Habsp zAsCVhJ9NQsV_H+`+H*QMY#0;1qp-{-ZMtkym?eDo!uc8_vLpKKh-zmwi%b-%rmg@CL!zAD~iEYx_K9wW#Rb ztDWVm(v1$>MRaY8T!@>Up6jXRz1G8F$b0mWzKG%COqtYDEmrs>9q zd>5Ja_7D})3O71Q4ySeVq}O$?n77x9qcjFLS^dC1uEs?Yk>sUVB!$$d`u>@rH!ILu z)Se$N%|?hsjTO4q(ZR}oc;I7Xn#0^gKGmQ)UVfqqAa?oZzdEPuYhYHwrf=cdfG0}x_YXU1Jt85fn zss7ZGxbrXZ*kciOIfyP3&p!8` zveEdq?5L+bKohnqk57R<1#(8~!21QW!8-wbc*5N@1G20F@(B^*4{6gK&QMXxrgJ4q z&oT5a<*eOkZ0L@`P7x`kW|bunoo50Jlo>b5&DA}>noDZs9EUvSTzT5Yp;>qNwtR9D zs(CjIF+q>54q-Y8`w#`O5_`7agBAn>t4amM@=Osh4u(7_NNzH!zKm-Jm+khq35 z(}B2~g!Lp&s@Y}E$S`Q}&j`IGTI2^H=3}N>iW39gt`cq6j#-`4_GJSHP1&(1i{FTM)WVcg*{0ij>6bW7sHQDH$>m>3>Ew;_!k+=vtA` zIM8h@12T+AX+&a3a=#3fl$ z5&etqxE-TCSH%304^nlyQ?9EZZsNJB!4H zN(V{8$or3f`%$${yl6jml7M2*n`oD0eJxcAIb#Co80Bq$XRFe@IZf>&?*0TlDk~<*smzHY zA%yDBd;ci3>8hW}+{BtWLg^rYbH7jN3)`ZmVR z0-d~i6~{%MSQkbn#WmC}-BptaX(moOcb>}TfUkB8TUg@R57DflFL%zIG>sW=*^37~ zd=2+zdz_bgy_w5$a9~uH-0B60ODM20=I5UkvY_GQJxK;ioD0M^B5W9qip1apjRU(B z7x6H$ZYDHsau=%*iQ5Dt0%5KPvahooX-P~3mXOotO=?laQ(Gl^bOK$|pu*FomIz*- z+xmjyBVa>pcu%tmdpx+Tt3(wvFxofsKrrW|{eAD+W36xWLBJ%&=3*hZX`q-+BKe+SHt@>CPKc+>u6yf0?Eh?z3W!8%jn^`!G(lhr| zxDwZH`<#8EA?wAkii1AfU>Y4-!4EGaU^{URuLH_=gnL(vTAhU2Tu{*CO612o9&PZ$ zc75PRTM*+{@B3`A0qFMRbtm=HPNWY)kv-!l{hA=9sxqoyKh#1XL z{Ouq4MB2io7A07`-~e{Z%@jMBeh}avsAZ(BWlQ9qmR5kT9KEnugo-#3A z8J@Lwz@-pULCI*H$@R>N$le@wgGe`$g|j26*t(L=-a4pohHIPQ_5FlAg0SqZylGkT zLNQC4{!t;OkGR%ran%VuzEFw=H_$oMork-!reBWw%2y**h^B{vt2NJXOI@8YkZ>9lX6bxc{}#~{;@@1-ReCC zf^>0_n@@x~u{}wa41sU#DJZLKIqCG7MGvhcgbu>;q=@qk zR3DmZg^Wr<$y2mh$ra<>g{ogJ^c9z_8uJaXGj-oKk-7t0=+VKgKf*c&VSFIj}N(68wGQgOXMWQRZG>(U%t$JKXeaX}ogHgx;-0>QjaXE|gX-qj5h7xp;ta+2sJ936=? z`L6`}z?sYvcTg9SvY*JC4w$?2#u5~O+RmxX!xl0E+PAC{a9 zSL}yVrws;`V7WGkQk~ZlR0C0ate=w9EC$)6^J!O@Mu0ydut-XFzagCbP74c^TM>bM z>8hS=l-?}se>rw&o6ceqT6blwpPE-Ku+_#yqhv_gBZDetVp2rqVNppnGs+uFc*iW$|2!h_mNV$S1AvX?ryP35#p#WE)@8PJ zG&%8SmD;F*Chi(%_ThOJftpFncGyEtLDeT1>>6^ztRR!1B4JT4`G}93x*F@oU|dua z$~y}L1?aP2R28Z$q%fT53Q?dS7BlvI`RX?ftZBI{)xWtZ4#i*W=YH~z4l0Bzt9dR5 zYn2#K&22iW&2(;uQx5#1BA7f-^-%D{5OJJ5D$?ef3!ek+CIj@H%OX*7i64>RmgQEo&tp-Vqg{;L+9zb^6fW+1)j}}z61rqIMM@so+dp! zZ(+CsU_BqY+u?isVF?H@L<%mszj0^N+#q;>&YWzWEo<8wFG;k~y~UXZV)?Q}bDw#h z(6mG!X3fRIV=)GcKY4(#Y!j7gE5F}3>d4MDEhai4vbpYx>>k#mQV#0}ul^f$XU;2C zI^jL#P@`QaF&zd{Js$)kh{iEm`SIn1a)=B5oTO`V6!QT{XMt+P_WC;IeNdSive9ZY z!=?$5kYrLQVlWxeV3+DCFxv!u^vQ$bRd#mPvMq6j2vxNL_m_HC^WI3ILs4$7ez_bT z7VaMZvLcjM4s^{$2$NCH1iI547OXi&eps9>JRID;ecw{%`AR|?F+67@wt3`_vq6oy zJ93zRTyF;XZo`roOHCsU?mqwHmzFu2sZ?#lM>l(_*?Z+`8eXq5=tDE6(q9$yP`QAg z3Qnmka$D_MP-i-q3qK?$Z-Kx2GQ+b#(JEK>6TlCmw%LqMOl&l4uX(&2(E&yY4Vysg zcA&Pq!H}*%9Cko79Khz{17$U2h23tPlOXjwwEg}6Ye~dGh9@}TY|}z7Iz<*#3be$= zyyk!MhBr1Rx#P`${-~S5E%dq3YRX_!7(}S!4rXuTuRpSa&@<{jXAQWSFp(CXqMxhv zKeiRPmOrw@|5I=l+wtJSt*#zTv>ZEtAQiT7;~L3@wC;+k@=-n@-!X8by}!UlOp}AS zlld=kO6P`C$|%W3@R!tFFV~UwG#5PY24BD$IhdiRMDFp9ze89_$AQgF7Ha`4H1y%N zs{G+xuo=^!MBQXs-vk=I39w#|&rL9rbeY?(J4cy`R7b3{L_{??BirPB-i&F*n9?sH zv2wD6E>{0B77W5TKYlKIk+hTRxbsiijWb@S@{WmC2D$d-h8daqbl5pa3NFK}cY*!Z z7S56cMwMs=*M|owZhaP{6CD)ZjwFwYl?(wf$1CBg1?7rloKOjNOd2#uNTKP z2xOJd9gMQUMF)*k;XUBGTWm)^R$`IDqV=-ob2hpF=4Q5$tQXS3$KuQox-EN=Xct`i z98KmqO86S9_f`p!WUT@g#u{p&qqjL-*07)=`XC$vG9kcpv&tt~5f`|34uCSU|yj1TVVS9p!P&*q$js=-%b?Y z+U~F4uV4Q$F)6?RdLC8qbbNp67#=e@O0*_7>#V$DS4~}rGYVtpwg?wet)o+R1&+Z+ zCZt_}v{~CC3OYS{(0mnAmI6vUg37m<19$7@lYZstfO8*0EZB`ra(98nw!hsSn$%~* z<$~9UYF*7ENhp->JMWoIeQEBEeA}j6o5M#_E$!%@gE|e>E%tI&qZ^b`l>X|8;dcQ=h24}l|` zhp9wL#&h*A1H$A$BQYA6!s_4ybw~FKhYzPAhlQ8|>M|@+PPVa}SupUto}0$XWi|q% zN~#@SlYK}MN1Vv|csNA^@i_yFcT(d%zxzYk^lyoyN#~wj8Vw8$@n|J(swAc$do-aJ9cVTW}`kk(` zSTc`>kbW@&O=xkkrz26jUwLfp_DciG=Qk!ez~gCa@UhRY4GX>vUh8@?uJ?8Ad!-PI z0`hNe)ViBqfV78`u=bmTw*V9Nq=JWh;8^Bkeu5ziaHQs5nQfaGpWNh+5SLNrq`j%_ za`U!B+ScqVeXGz@+;bpb{=>=P>k9p^vL^mxi2tJ&Cy(tRNX|$*Kv12>vwUmfuo0;n zG*4OL#279=!R@@3%o!_yn+PT0!mjsRJei{PnK9W8Jq7Lr`@|?qYF@?BEa&w;WhH3F zVL_M0ponpZ*{oOl925EHzq7>a@;DPLP!3 zT;2#?V{^Dg(}irT0%Qn7hLNgNbOq{g(PwOPFnL?FYv*p)ZsJuGpME5Z*bk>aUHSnG zdMwjq$P{7XCxG;s;O?~J6EkU?BMMzdU~As55%IFQB^r}Z6$+nE=oA}pv{Y8FM9U;l z{|_C&@>cR|+ZxCiV_>#NU|anpBfmd{ZijkFP-E(!fe!fp%{hi=vhHzA#q-@SPr@Y2 zTFtn|hQHIjd`%{sRy_B?YHUJ?o49S+t2al>9A2#hh}s#wvkw;rE%uljNzE3D=8U8t z!5={@2qDFh%TwikR4k4J8VT*Odk#Ab|5y)Ras_U;BqBs(t#040?)&gFg{6FOEzM&a zd35i0G;k9}<8cHi00`W&f) z8S}>w&h=^9a=RY|F7hk?dfg*;ovr9Vmr-SE0ruwF%v1w~so|}%b6WlM8|gVhOPHUt zlT`0@Elt=%eG`S4-Dzy#d8%*;&pJms>!e`AA($15Ntm-%n6BogcMFnPpKJq+!jL2c zVXHJp9xBf$5@DhPJBm|vtPJ#J+G{l1c2f&eq z=;zT9jVg8bFeck>5OSXrd)exo-=NH|MKPqTbvL5WS8n6bpH6FalbaxZ;PIKpxD>HA z&7QJ&7&m^fCyk{W@3xfAdmk%giHeoq)N2rqg!S9gKU*)_*8Qo`Ujd7r|7b2fjW2w; z5nmWWn$f~IuQrVw(8>&h3YFBi zH%L9LTlgWfE&>9&b6a~wInc=zv*&6eyTItj1Uku)@7M2L;!aDmp>3nH{5v>! z;C_e05&5ayX(uhGdbe4QhS*3ngyU)wHZDEnJW48UK1)dvLSk zeR~o}{Z7zsFD*4tAEa*@tPMm#(%kUEBO6Y&qm1^{<>RV0Vz%6T8*Fi~Wd}#LVylr8_D|CzQmG;1tC$#@>+F=epHaapq;wm=GYCCr9=*q_;hM|# z@mVncNr{!)zi-6Y47PZ10}QTq79QJR=u96GtE8Ov`erGj!AVeC6u);>E30C3u}}S% z8SgvmYBf;KcqeAF=RXkf$O*a8FFwz)-{;xGaoK!LS#kk)qtgEltVwu{@2&5g#DkAm z9v_f$XEHGQ@s?2NXR*(VaOxddYzrm9%*Ey>O;Gl5AcjRn3s+{faK*(VyW${Jgiaet zGnxEZfy++Jkl)MX=o(J%pVl{LzglaH9Q;~n#bzxt7)G({oMg=)En^{zox?= zFCWL&d1JF9{->NKA{%kv8~)%fG4Wr(;73wFOhz#u12$N)mRUQu zRy4;r;D04USmTEEuX38)TgI6-4lac70SZ*AJH%8p+wfVkjTDgMOpurwsua%T$J~TQ zrj&`V6&&fuYHj5-drR$RYO?hn5^0X_bTy!>u!VrSkYSOAj;|aUK)sEie6$8L&eM0q zJQ8Q?LIdhdI=(?UYllN-@z5+zQ`@<$oP4Krs!tlzQY*zPcWP5Im{=?&Q*#nqrAb=G z&(IdZ?!1B5e3kOWG#k?)^2k6_-HQfD^~F!*cvLX#DoKh=+;U;sG&x_W(9u6ya_wC; zokHat_PDcXfz}w9tDgr6M8SZTC8vWtFVF4(9o#NAe8z=)@i9= z%eFnW6{N9QHqIAdB(ltvt72yV8I<}5HWgFi6KU>yq5nd8y$0RC(g$mc`0C<-U=UdU zHCREe?~ma7PIA4c5qRgt1@8ZPVg}tw@O@{romnxP3}g#bnG@lp)5J!DE8iiqcKhb} zCb6UYV>#RLOe>ITD`Q0lMxzE9c$ zo;k(radArZvZu0DU9*IMd3Gjly(X8OIdNX5@J8i@vjhXkg6GG!9hf7p6|-u6)}w<4 zU}^wRC(n8R#BJXn%lA!VC!;trh%{4q{^CM_18k29p^=vKBaz@U!;z9)h;=c7Hf+e@ z{rScQ1jE7aO{a->PBbA(wjDMhjTsw>k1AMJ*%XrJJS~NgIq43fUxTO*E)uY^?d3vf zu^9$o$#6{zvxphfayj`sc2I`um0EuE0|8LmwvB)#c!Q&Po1Q9y)uE>%!>U+8N>0ex z#`%2y&tdQAXcRWezeWGU3oxY^n1b;9byyE}_1#2ugA2Y4B*OH*kr|=`il4&q07o$~ znAeBx0T2aGRt{@j9w%uUf+~#=iunTaKR;Cr(w{dvv=ricMbh6v$On-{y-bufv6@o3 zj>?>2qoHQv<3@gRjJ4Elm32s`BL$y_0bxDBa(?4zHKC$~6Qd^Opv`9pwLJbL2tx-d z{@x3}D3&0w=MWX*!dvHC-^BLO1d4=|7o6xGC@5Rex#Wc;SmMom_;lt?Nzf-tTiz7` zX9QVNTE-!ecMrSj{{8*>7yR>p30?@(XGb!#T~=nk4lxqRZM1{xLrC%`S+Jx z3AUJZLBKJY&F1@;1$EbSLkqVw1KYh!@;E?zSbD-)ZC|Ja|IrZLAnSeM+QN^&@Yhlb z(QZDmW{=1!%=lrVKHsIe>fRW~i!eP21-V@;&oaEq935)vO(|Djh5G)q5iHm(pTIN8 z^->>%t|0RJV0OsXSFHgdOJDuh<~^(@pTL-gKBT}Gg6H!d1>&{y<{L@CQ{TG-8;;Aq z6K}r9=JvKqw;lT~%KP2dMSwKi5BdhT(=9mx4Px26U2_Qa3007oA6XV|%T`|pTTgzw zQ!Y<3d^%kx!`xiQ0=EDDKLE-=HNUj)a5T@iV{|5h_ul(pDQ=EB`6Gzh374pl@lVs)%t8ae*HDb z{5S3 zc>f2$3$Ft0419V6eEdU5@6huZ&@=GK$HN`)_6GRVe=V17=yKc}0-!T>!wEm8k*7qj z@cvh4!YMRrH-1@_Y_$fAOX2c*hlv+ zc>68;JpTYt;J1G3x2Yf?`6HoR?l=g_j|USFv*V*$f~0aHU~G=2FBeg~^UkjV5PbI! zeh&cfSHJVulOjiHdLTS5n2C&DZgh|=aE5Jl8ZKyda9B#e{q~y>*!>Lr)$jbZf(%JPKnz_# zDzZZUCvjdh)Ar%8tXA<8s^+0sxaC`Bb;SzUmvh zIrMQ_TAF1FL+s>P-;pd*TWhpX_UZq>d-1?9vrn8wrffF+%twmYHW zjemDeb7T{r-o?#PwhcoE-UORl1_m0$pW7DF5zR}p(s?3k-a_q4!>}cjB!wG%?HS<^ zO$f+f~=LHR>q8X zC&4|xU$+F$c@4t})b5{Fkb$8@+WW|;@W|)ncd?F(7J{*m9F`IwTjM;0o)k1=sa(2qWVy!C+(v{PHvO?cq!& zy&RY09ua_;X&XVNQ=YbX_u}*W77J$DDCwaI;+S>tZ6@7?WvngO$%eB{2QSIVc~T`v z3_YV$j=IH;Mt6c`-bVzyJG;r)K+UC30c^^?>k`NZ&wX)_`X=FuINrk~jxk=~TzKwC z*hf9Adt-KNariC;(eIFDQRst)2swP-q{8#Rz=q$di?DrOQcr?C$LV03ZNKL_t)FF?iqS2A{i3 zb@}7gP&@#pQoXYFWgQt=lrr2nM_i4Ql^s*hA&gcF#V+%Ev{^{SX1MRc zD5t1;_})z17%R3!oXn|R(dqe^cY-tU+ZHlF`<-2Np3hEqPlQu#8`c>=A!BZ+MBIM8G9Bi2FVfo9$-{@oYfMsV@z zbVA!?nL#JFGcB>KyeW7$QaZ_H?#+7r!pfJ-zQ=({kH|XLXJ&O|g<^WZ3%SK1dB8IS z8g6N^DOa0W|8B^7{dKX1k4@an1Yu+oi+>~8q9iNgNVSX6NNdxDkve*FkBcr}(#WG= z7bMpb@<7l%uaia%bPU>Xm<_U!Cv0(A#!(DT?*QEkjfuH+D z=tu7Z-+TjT8@6Bm7VvNX1nreq$A@|DD7Ar8}5`AY554-v~YFFAt%()$YSAmFCG%n-7Zp3gR$A>86ExH)1o{^8s~Y>#P6}< zriqZD4sjs7EA8{|=Ka#^<_!0VU&lC&I#II>=CsF#O?eE{7?6)54)uOjFCKF)03y{B zc5bYIX@h?<3m+~;*tCjk9XW(7Sm8j$AQ6U<$i0^DVaAz4JR{;A*uOhZX1Y|$SZnI@ zgY>)vVRk&HGSm9txe+#Y+$LPpEq8vK5A~Z#Jq0mH(iWw};fs>V~TglPJYvDc3I~bwOf9d2AN&uVpE?>Sy5mTHE z+(B^h*dcC0ldu}`&YC)@$P0ic7s`a3-HFZqOsR&o^B?DPBj5J<{lTgSTfoLb=N+eH zU>;6>0(JR;h8S$hV}$CY7J(}4Ge7Pb>&m^5YNY;D8ow9Rn_otMInAL9yxxM@Qbj!*;)jBt*LiJ5EL9{H~90}8YNB^WNMm2 zm}kEY zVg^p>+5r0F??Zm!4Pe{Qzwrye$3FmGeihhnfUkcI`0NA7%dd`^|J4KF>61|eT+)Cp z$NeJ!9ZaVhW+yT8f@+rebR~6+{mgi%jUhkg$r_GabAi(&gDZ=~p*M3WWY;$DT8>%GwSx$WoCVLA{j5&7v(rpm79WDa6=)7$ z+C*lgrL}}0M8Q$RPxw4g3f|00H`LkT@q=hu5gdH{A{xE%A^Xu~gVb;(}YHZVpxq_7>h7}$Ic?)Mt;93mPy(in}TCk1Xl zV5ZF3`8xMzM;@V#+gR+q_c?Ol@d-;pIZ~RQ%Y_Wg`5l!v&=MNKaJ_S0Tp=Qa%0(nK z`}v1+-?8jh6HF9{pq(N{OBD544M{WK8@!&3kwXri8e~g~vt}N^gXge+|Nj7j(gw$xW{{&(4rnLMB{*=EFcLOKUyAu@0tpj);6@6(v~{w z(}rz!*KOOp3$#t&I!DfoU>^&2aKz>vx}AS3EVlW34fSf<25IAejUeSwsBxmEB%TH& zxDKlnR+52MAZzT)&=6Sx@qBS$P2@-5PJW4va%2(-o23B?&E9>4vXMuK0NCcJfn&Ap ze9>Cb407)g9EEHM);Q0hcuv%aWgcJINXSqdMh?gK*?inGP_mY;tzsZG2?-z+%+m-} z(wGXjx4>6_8TjF!0l)mM@zK8V^=Sz7^7#1|Ujm+f2|TzSFT8#*jDRl3<+x7-V4vw_ zO~wPfZKq&tYq+`fu14lh$kpg#3<21v3kV5Q%6qp6Rc#LAsz#X4i1Cbt#XWeMU=vB3 z&|noea_7s=b!+#Kox(UAC&{bQ&VRgl#y^n*UaY!9O#$kRVQKd#CG@-%_34P&>FT?lZ(o?07CrqR) z-v{A5xpECwu0-XW2wU+s(#4n08N^pXLrwG)#i}K5T-ouLercE(pNoxMu{QHK57W zAk%Fv5t2AU(-yr}^tP>?a5|lEI$eb>-!=Me%z&=iL?xs( zY;7yadaV%Dc!NBemxlJ4<%`SauSE1w?lEGKab|kNi;TbDJGz-4`8)Qqcm>;hbgM1p ztjDNBCq%lr6|;9BLVD$Ax(_O;=$PBm*FILx%kMemH)=%fksN8BRgmS z@BSI|m);mDf3JQGc>hPhi;sbu4m^4l_~^rt6Ce$^dTyuzt{#-2hRbm|?g0U~z3q7L z@Kol4CM9a&2_W2AsmskyPG+fQA!*J)QKX?|4sChBzNv$g@iRR7bQbxY8<3kkDd42+2=)eL2=}+_#GsKYL~JnlFMCY?040|`zZ2S zF2)Ga8~0T&Wm&b!jl!jpL08WUEhB|Cl`%2Y9~*R|aR?{x^$6ObkRV4}$Z0axhp5!Y zeYR1IGJO0IE|d8hFn*Z<|*2b{{;OjuLAG? zcodpXJ{`orn=i-9&NmkyfXi|J2*7jCJ%p&>v~4k;TpR(d`aexJ^%YgfN1AfbjJ6?| z$~1E$vmcQ;zovPfp$KCg)WpKCcCp7r0B~naI(_D}NiddaZPTO!yN=6tWF+%bxTcc}%2BE%0)ca~k|= zp9fOX>^NSPI@506@fu$(R0jW!F~7w>LX#m=u)Co{$FIn4i_ytT4sH@9J6+p68_l?n zP^M5@ut)vS&4+6sbdMSLB-^&B@0S*=e!mVH=#?AiOjLtAdgFyKsnwwSa0d)IE6`l3 z$F{yafe{}?kQ1e#X!11$aK(8F)XFDld6Kp2|&Xd?DF<+H3w-O!#)25PUwE}2wL)Y7F z5$)a$o21M-4qK$O_wl}#0V=`tRhkRm-HkHbdRHk>Uln-)VWpbk$RJcPvpb}Dbq?Lq zxoQPMCtrE3=d}j9NSrI;F$83+r2{ADf$FTNk}?~r#vDg|;hjnVq9u5yL@S7Z$s9A3 zJv#94NBC*UN~@Oy=iW={K#MEjgrmIBY}tmk7B);aG=2IQ5e!LL6l^R#3&6heHjJ4c zPJ2S*f^fz=`s#y!s^qAsDgVGe`*^#mFe;kGj0qdf9Z`@-!pgr<`MyHNYEkmA~ zY}ig$qY&#k>_|j_>qo#3{uH=<0=)ObLHzskKOM<{@BVN^|9OsV()YJ-4D%V z3H)ByGD&p@M5k2LC{rk?_O1jQWPi2i+o zBzLqZFLAai%V;LW)~D5aI32QAg?kVjq!XqBa*hfBbriwe<-nYnxuXP%B}pk@#8!W=qVfR@_1HEI*G6n3$HC;DhjVa4<~A>2)m{B$xz1L^G(j5KjrC$n zCRj}Rt2WM7EN~u28m$PEdvgk;Btq@@o{~lo@ty4Fx<@%^G#Dl5FDYN3OVJs;26Gyn zGU4}s47~P>z_tO8UI9M)0C@Q|;O1ud0et=mK{&ow2dwoMd)``0sAS(x!X#T*9+8uoo(A#?4A_Y()sZ~|Z4PdNBDNwe;?$Y{PX z$@H{<>Jk{mta#zVk&-jHs2y(4kw@W$4iy6{A{E6~u>5D>7MgFLdy%MS@|u#&(tI~I zzvhOL^<60{TOD~|NL*yT7s3`gV0$Em3>Qv0!I4H2_8El7cXNd>ZVw@0wKLaF8!j+2 z9dtI$&9D2A!^U+tFA{DLg2S@obUNj8=g2@WMJF{eO?)hKI$dF(u7JR_NWHxQ-u(ga z=q2FOcY&KT@X>pN0Qi$1k9+Kk&qrp!lP|~bzIien0zduevI|{~`$GWSe;hFbbpAJY z2Gq%j9QEFk8O5YQUkPS0SrnhVvnIX#9tu4Xupvr@@fHZ3Mhu-Y-h=oQai&oiXp+4x zTW2Fb_SUdb=Xz|LtJ#ppGVKo-hD4kuI2jASBKy2cQDq216aFlo1kHKn86v)UZdkf? zdwUx$i^NMvMGKv~CT)@rx127oD_op9G2#-K|2lN~#Z!mrRL40(uCcGqUU&GJ`5Q=H z1T2AT#5YmvBI!m`l_V#H&&iPpcUDX=--NB7hrj$D(nOQh^>DUpgp4FxWaoNJ4-Olr z``k;WCjt`^b75)sR5M4s>B~W4ndp`gGD;y&1V$nh(H$o~j5O-ZEnzd~SR6?uRnMA6OJu>D{D z8h|t8rPqLu-vwTLWpDsqcm(XT^M?Y@KLYxN18_O+9RaYsY=a}SA9)_P>OzrYC^1NF zrt{Y&oz7U+U4eEG>*>0G_ZW9Vw!04=byRuAO+^Pm{PEe?0dS9nLlt*1&nm&OCfcoA z?HX((xv9=jZY9@IHac?{IE7RykxB6m_a%OWd-v0Q&f_yxG-14mZIY#6KNRiVdE@U`b35!i zA#yM%1u@8wbrdnZ02=#xEGMz}FIdu{9GXp;q9x?BD+h_!jM|)dn9#Oi?~~s!M=3o2 z4-|7nsLtmdkcR8)hq!+51ikOLmF982^4jarAN|Sr5Ffn@y!=(@kN+HKC*ZTsfCn!C zUw$@z;nOF;bI%X+po~2tFuQu8B>H(n0cOqLIXvx52qVjKSa5Rv8s< zZrxVsP~g5j&oEG_5-&SzO26Dlnd*e!u4ti11MJbikDeebxwzIF~k@9HjpmM6;?6{r?>H^V9=fae;!lMIK03V_vNZX%e?9%m|S4cnHPGme&W7x<0|kcFoD- zQRleM##~9RJ2?oJR9HL)oGYXS(bAl)5a)t;NYw4i&z8GLt&z?0H5!C1wWUW;j#*XIg6z z9ZYNM0$Ao`8^w6v4ApZytPy@fE+y{6?}&wK?B&o+%{OPw8>xTx($&fV)XrY^37t4_ zqEk;$o3nF~l6{~v?d({Ge%yVogMcwgmASF<*rCp+$7jBp3tz+)7h-48si$rp!qX2V za~vjDDUT1hTFROCkyP1|)?12epxZCgec>BX1E6h@|HT-93J*kK3xfLX1Mz2y&zN}( z{4>Jcv{asgq-RhfJ2LJCE%6jZRZ{RYz-RSso~JdD({=fM2Sr>W*bsSBUlll#n)?KF zQNDy0_$;S$#;dn2dviqb)DOl~IqecyWudA-*D<=%nSQ!DU9hso3Y3QHhY!)uJD`f| z>jyYpT^D|b;_uvkf`9brm4N{4JMj4jz)N2No_szKfT!mH|KB_Xu#MUO!{;wM(B-&i z1Ry=gN*3Ef;W4?|*RshB>rG9wbepe_+53bVRptZSlTJLIRw@vZsY@)>odH{nip~CqLFOE1dv+wR)N1wNM?;ss&H+RK5 z;p%4@_7I%jX+yF|W|EiL%MEtrS$Ct?^xjDpmyw~W6<73BWZCxsaT;2JgL7s?gwojO z>`vf{`>xZy7;|ZJrfjt7NYVbQ0=uQgX?MQ|Q(^GuaZ@~){cLPFti`v2DrGEaj0KdQ zxz4jCvuPG2XG0ijWQ9Rv)>1a3FWH+TG8Q`B8`acHmgd2V);3AXZJWHGZNm#MJi>zq4{>$< zz#TkQ6~Ft{uK*d#h+ozWu=yKdM2Vn2> zK@2T&LxZ3%1IyO3qu(;e#xWazIG*LyF*ph8AdYl;1RQC!g`DCJb~aDl19Z;(2CS(F zm_26h)Rmy8jy81y^NV>1n66RANVC{GW8DttjLTf!I2kmk9x)5W^={!FC#?Bw`N2l z^#3`Cig_b3zRAj)j6UGdZ=oh*1}{bmx)JV#nPZXfll9Y-;OYdt|M4gWZodRhr@{Vz;Suop$CnYn<+y(YAls#)5Rx);xcB3vz)Y$`3h&6? zWm`%TKczG;#oYykFvH&sfN)?js|l)I7EwM= zoCzSDIEI`9FgrV&t%r(1J!mL`e5n6YT^2=UPlK`l?+)Bp`p$yHLWVyCjSBm>)n+u<# zCbKvm-T*mhY8?Y~ux^6=2Gr9kkCunN@PS5gK1G0gAFn5biaYQ4+>){^JR^ke2S#vO zWA2YVaGjhwHRXBObx3{+%BTk7d28Fuo!H`e=~`@_HKU>?IXsS?H+ea5%{ofhqnY}Aa3hTkDR{%?^lNAgbrC|cCTCuwz>qxewCcUj+5LgqV4D4l zO8UMlY~DR)b-Xb2=n=R=W<{#0n5p#&^YCTiFVt>@ta72AQ9z(2EXP0*g-H4idR#ME zC)Np?P2XYua69PMt*ah{z>a;t^^P=n8oFFh)oL%zp(|0$uvP1@ijB>dc_697MTWc$ z;Mx2=hJzoJa~3tZ*>SQUL{>ivneLQR1>ont8u!5b0OGrb4X>tq!T1-gWfv%6PC)U2 zU}VH}@rF!5Y_r9q#e3(QS9nyVlDZFptCifV%PIigq9LwZ=H60U?azegY!t;rip z-Qo{l|9QwqA3{&pz=t0KUwH-iuQU7eJL%R6xuS0gO5PU=OE0zj<$bz)i{oo}a@ z+<6LPgV6Z?6{b|xJ6z-0@TYs1-+Oe~ik^J=kvgI7#70Tkb>wnZ+!<|$=&CsHN?!02 zozZb!!&~0m{N^GpitDR!Zg=N+%&ldfGa;UV(zViD384}P;pzr*f9z4f^`4Xclr}3Z ziGJHAXxnLeS=ffxhx1?Gp}Lc!Uu-DD8E_y9*2P2A@1@?)biHDx@92!00%9N=r&A-> z%RoX#0v<}l@f}E1a$gkm^VtgxLniVKro=H2AKmSHCx1xZi41U@V6q7_Wgp75sD|j$CgZs z{EKp|_VfgpUH`TXi{R%TK9A>~e>CN?hE@T;`#_;z`^E7*yznyc@h6a1ULP>)^DhEV zKfCNem*ajB0GjqX{I;L(p795SIiAZ-I&3TY6Z8x%qkx_kH8!GAUXUbuWbMq#1!=Cs zC?##G8j1oya>w9%Vuxx=GwW?b>gdMX%_6`d`*1w0bJk-y(cNUc?BSjZs|Z7}e1S3F zS9eI~P@TD0i`k1OdnSV5<30QAy0&ddvu@A({QeqcL>Et~v(0!cat-J6d33niBD-B_ z6ysepNwa89D+y9Yl4!Oj^Z%;5+$ENTOu3wL4DTEf%-nW!Y-Cuy63F|^n*d3_x^{8^ zYz~9_Z7KbLX--|OY)&#foouV^ltmwocS&KhqzK+I>av1wJB#ZpFKDhnk0SkLVFMM=y&+tUe}G8(lc^G=13!hgbY9={;f%Is4PQ3 zAM+)GX7hZJcqWBVL*`RRQVr!%Wb;t1ZMz!gNmmVzAAc36ZNulEe~P{D*w3R#{M(=Y z5dZjv=b@i}1Yn1L@*eQ~OM@ezmn?wGaqk5H%bu#1Id4?9DD+Bl61Ewcfj!eCBj&3a zYIkEcdPwu^ooq|F%P;d~hA?yS|A}+}03ZNKL_t&skVgetgbsmbz>QqiZXlA!1Z&t# zC42P)Z*Mk>5v*Nrz?@ljmmwOHF?HHRs9S@CG6A?#8DN`OpTBpTp*Fqm*jig05{Gxf zfZ+vgZp@1Flu`9wbMHy|hVa6VX@xG`Zc-eGpmmcu4g<9)F39a&8yXbbsikWL;$w*E z(H#}&NrEPfzbCSLOS9$(R3cKWkD{_qyd__bd%KnANQ>kxd=~7Y^+}95iWH79%`94b z{yf<~z!C?g6x`W#>3C2@<2v-Y`B&1bH4800!>wUPh*!0Q_&w{f<4gX*d`^rz(CWwz z?mMA%oM#crAS>+_=Wg3JLIJd#iw>4bR^uo@Nbw>*GP45H?zz?kj~=}UX~50X8+`fY z7dY>u2>4qsy@3De!2{sakAVk|fcJg?JpLN+#RUPl9QVxuNV7XV*u1Dy(1<#%>|v1z zw+ihw%^ul)bUrw4qhg!Dgu1i6FuT@CnlF1IUTVnZA|v5ppk0w8aOwBV%`Fy!(S5X5 zih#f)@&Zach2~IgUcarISO|g2BqrYcIV1?NC`x=k-*8yJp8BBU2C`3I1%qyF{;UYE z14Y2yZN|Dn8hSC6ai0g`1w_6>b81Fw;$d#~<<0+o6cNKqU#I{wuY*wu%zjZ68wJpW zLV*pDHkyqK6?*e$HD>qj1>v=TIH69v_<6wWNJD|5X@oH}>q6ZxXe^KwEoq)jMmWLW zXz7_UM9K_)_TJNo#-1zB0!WBd6di`J#66}52w#lYTrSr&-Bo;#a%Mtv_fJIdQQIg% zlZq@VOzbbM0GAe_Jpxi4*)t?}rGJuJU~wuNM9fY<*Qmp{?tg6Vf?SZ#yDR-ZC=-*_ zU%#DBc>ehpvG1SY;d9U9e0z&8zWfa5e#YN^;Q{{fb^<eM=i|5Tkkb=;CIa`|^h!dFQ6n6tYuyj6>x zu2RAv%~iXir+^@G`$LsNDWw6*omQ|Z`@mh{y8FK~xs696Y_H6l|JV#RXEAfZpb1Vb zY;PjXd5{T!WB@(wm(8dN$;@V-U8kf)cg)IT++Z2@Y*O^($(QK+?Ocp^N05|i$!*%+ zVw&`bdAnPo$no8Tt5KYgV3qnNTifA@87MFUwt?s zLi1dmQ4og7<5I8lif|p`o8-}#7L}d{@>Gfg>5_G#YZpVxrfi8 z>y9QHFx4Ty{jE2~?0-K4&%ZE(fiB18xX%#)&8_u_{VS3PLt!4Hs5x_qP()^8ojRfL zwwL%hNSd#CKO|Vt0PaA2VPhvlHF!~?s-JJg$be8M01b#Qp#ES_8xuXB7FtMaQeHAv zqCY7i6h*rqpb8tIRCmQ(Af#^GuV2l^Rk9P714lYOcWW}<{KR7;w7EPYd%m?cc>zc> zX1hMUpT{Uc0iAZdO&S^0w3*#LyeAyyoPD)Q~G@|N0mliI#>U~k%0cDP6_6}@KuKnh-v(Gn z#9wLtvM70Uphp6N?SZZ`$eO)lbzL0D6X#{1MIhS93J9s`xUa&FSv#NrA3;yJk%|9LE{|mIq9$E@S8(;Rwz$ihshBn!@z0Q>nUe6qbGlQMg@#n z@9cV2N;0(BYd#;wb`DK_qgZK4iI3M0p7YPt+G%c#jePCfoIXexzf7k+mxxZ7Nh5)Y zioZsi8|Mb>bB-OxK5Swa(o|>o4FmyP=twcv5p2HsTd^6%aLm0MvMG>oO_;h@Ln+Mb z!0v@@+pwQ+Ct34^eLs^cV~5B_ZiM;18Qna{YeH7O3{vcbpN7@|X%rGf@wz%?los+N z=CM%L0Ye{V2~DG-mSnX|)-^Q3QK2n(6+U`6GBQl}@W_2Q-`-$9XOyk?PQC}-8UNwB z=~WjM%aWw3KyxB2Kf9K42-&drGp?_%@xlu);&k;KuCE{9x#ymTv<+>$!tearzdt+z z&bOBx=yKdM07#(y~c?7c7Ac@VdbSt8$u>ILz%{Bxy8c=&tX43z}4vnZEN`A zbHRrnzBi+)cQgTh=be8K|Ky+lv&#;2IqtgvNC01mYEj}co6wB3BB@#8#2d^o(3tGm zPUI&tg9)omEGC&g?YMlztZZmVZ5`{E5?cKHU zvk8w*&wDIIjb>X@0nNJAJ45$T01nK4XR@EQyUH7W?iRy@hjxhuH*FdJ+~V_Xm;|&) z`|}RdzDH+HM@Tq>*d{3;C~T2rL3_G&X|v!-Xavd8P{$ue&{8Ij#e95HKgV~aamaX| zHn{|$Y!HbKpDmZAS$0Lw_cXA~{quW7A!eJu*$&(M+e5GRbGjc>7*&G!NxeW1#3Gb6 zNIr36>hFScLTVVMaUeXFI5h>0xF_8oRyWGd*~_C~oD#n_p?lD^_d-{*5l~jqsE?ae z`|=zZXC_dmoEFHVk$BF?a0!@_PVsra>H)6;z_wk_LZRd8>KfZ=!?tZW-`?Q!FF&7k z^?0Ix_pkmI{_r3D!^Un9?%|J;y6R7c;g5YD#XE1mN$h&sT*uHfMe+t;K$9c7FetA2uB*F z2z@{C`KL^Io9{!dQ6DN`TBUOIFl_*~S-hMhi}5_;3g^0u|n5x@4@ zD-aQU``d4n>nw|QpJ&N$YD~5szPg6$0Sxx8HOt-_^o5#z)PJlq46LaSnt=dUVaLUeO2# z!sI?AcTx$!E}kKVn8Qatcm75=xI3;kjRY#xPesPz=a}7gld>stQkp7>g2eZaK{|>#D>#DH zh5Deb1g@<&lM_&Xnjmv$IAr)%qdM@wAs#z4k%OQXUbgk%T1d>NnaWKDDT926NH$DS zkBuN-9C|SzEw_rhO1ZR|q>X}K(cvkr)VgYl4vrhGk`=8h4HW}zN)306xa0sv=K`yx zm(;lHxYg>lWWGqexok7Tn&$5&G>}Oe?2`}|857aZmolxOZ8Wa1XI3=9W{LQhuAY=i znJtE0bTQ7z))pwvk&EG>NX>vOsRW~9f?p?D5Fd86IE^Ima+EW>oA<`gXPQ>JVK0EKoMhDl|*LeE0A3CgFj>~Z$hy1<&>c3TE zagQj}GgKQs`|ML}r<3b*o#ia+B41O-OiGhH%oBW=<6hI=?UJOPWpNOwWUyN)#AT3& zas;R^0HP_9RLPvEiMzi~sIa*!U@-Dy_Q_qLQc#SM3%OHAnK@@TIA#(i$WEPVC4xFXQKLi99GAliO&vM5aHj<(a*2{u=PHRe7xYkJP*ICAQOs z{d`8v&ae?#_LiuY+_?Zbl$%mMg`Y13`#-)zWLdachPWP_VI?FF7IOCkkvF9has2)1 z`grHBiFg`T#XM5GD~AN(-OpvGTJob2{WN{oF{(OE^66?^#m`KrHe_;@%=HgZoCEH@ z7`_S(tN|J8SjTzaCn@m;AHM%CzI^fow>M9cVb~x3qknj@1H2sfhX9BTd=)sKZ_wHU zJbn5Z9zA*y=ktvRbGRec(miok7QW!|U}Pvipx_l&&GDhlb+)l!$ui$#@>(J+TK|w( z?=`qZJzS^B=7mRVTS&?}rqPRiE=t^!nDdK9Q6QyCTG#6yvv?88r~q+%NO%%R?fl~t8yT4k z4ST-q9`d5hHhOlkD05j(ixw}Zt@wc3!Hw-(%2uO>CXrdNE zMWOvXNm&C8u!p>p0Zw#yWkE2=U$Ar-Ri5R82RHwb62XkJXjg>R3~ySRRLAR-iZ7ar zO7=G}6Q=|pgGMI~Z-VCO^O{<+of0=f3r|9gi5*`+-DpKqF~r4SN~m+Xf&{EB#RuNM zmo3|U7IeediSy_O>N7X)HWe71Mm?TlsTuM`R*6J0o3F7+#=2_`B~lJ;7-iB?gsYr& zz@6^T){wgRb>y+)9#V`1+yg>#U>C~`<4Z9q7m?!tDGq=UTiptIPSXgF*#8}14~*V* z85Bh#C1!GCOV67dLv}1kUmA-^kpJrQwQVhpLZIfI5D0`n-(9h5$Mw|}&gb2YozP`rI)2Gnhv7N4bW5U1`+Qd+Kbpyf3)un3q~-C(n}zc7RMq zL)RFxmDH`L=P7Q~;C)!<-`IXzAsR+Ooz6!@D;vSl?2G59?vA)& zD~Owjd-vPD5#POIO)3rEhLIC(oF{E_B%=w-ZD$=x^3AS&Dqlw9(YAq(-Q1jUqTC5t zDHC_EPmW;BtJB(8U)u(`esI}=F2_BO0NQ{Y&rhG=>eSG-4XyVC{pWeLCOKDZs+#81 zp@l}t3qKfLF79YTN(5ah>%tnCi>}#wPRm+fn79iT;wezj%Z#+Wx;i23cH_NUt3Lj0 zWt-jKYL{glyR(sJHvRHlB#&9#Y$;I*s`Fw_lH=k`HP2;PyT4g@lX}jeF(65PNxmwx4-A^I}zbm0!U=lvs-I^ZX%@YGXB3D z_dNnQ1J~ClK+o7aYn&OrpEs|vNk>i9GlE*^&lb;sy75==x~PWotS)=`bGPZqWqY{3 zS%?m6^{x9GM4s8vPScpv>Ey0+HiwPHGn0ip{KsL>F!*tq(cF-lG?yVUgi1YT${Pof z+j73Z1feB&l(EOqY7Lz>u69j?pmIt63C^FeO}|6aq#%TQc4?7X5A6EeiDI0WKp3&$wQ8r;N0>&J< zPg`HFycGvl!qL@B6NsMX%(1x*vdxCY=Iw>^AQHhT8OdnmA+U{ZyRDl(k3cLOi6xKX zkR_EuM5+r_gZgHig5_W`IIXmTc=v7#I=QmZW-z^w+zcqfXCkzQlNMu7>tz!)t6Ozn z_Xrz88ulCCBfJ?JZ4C3gQi4#mti~h``dC8?Osj=?K0DscgNHQbDLA?#4eFzoJp0$K z#i(Y5_U+u;*=~X)Co@AMSG&|r`3{aqBpGUY-uP$TKH7_;u;_Lq3}b`xbVZNI29DAt z#aS=N;}QzJR*w&rWT<3g9b?l+0%7-YP0I1A2o`t-KZ>u@wgHoS(L@fOGB}Zu$5QNo zz-vpBm2VL#j_kRRtgCXOqJ<7&K0}b91nC>F53AsQ-Y+}Q<+$GhKvi(MYN;cIONaJl z$d%jyF+AJRL+{_64AxS(5I-CXvt7!A=nrPh7TsA4>|RIVEl>|0shVJR5pyz_y@SX2 zO7aAE*k9NOze?{kjV4-K=leC#C%vYHN}{a5lw#ThySI4j^4*O&G zrx!`v%rfGEC1Q>OzESEVlW$p4=}wK7l`$cBYi!%>$_3)&%$RqFgI4tt2rnb0&A-ZI zEhK6WwG3~i32meC3y;{QR8(ewRP$s=$|?|wwkGtXjtyd@rb$Voq*AKU$!ycjMBu8* z7*WV$q_nr0qB>u5wQV?U4gG=uT#oxL0K&tZ>-$*DonyzdMiKn4|LlJ*kXhd3G$X+Y z!e@VRxx>Rg?X!~Sq!BCvJbwHNpo$;=@!$-+k|c z(hnYAhJ-Sm#9ra5?V10LU`CgIiw} zTDVIKF)#N4%X1=fv{+Ji;_H??`*p~hKPVZlH351ZZu@Ro$ywUUKpWWb|wZZ1s zth(%W09*1Vnit**Usku|rDHx^oHTWkT+6K&Cuhe)3#5L>LaKz}S7Rlx|9(PY@&ek5 zM}BgQykmWqVm}zyg)3Br0Ee3ks~@~@A>V?#>bshvS05MN;EX>L*#PV-f7hmcm)SL* zxrwjWrRv~uc&*b2VS!mRqce+HXR!+=BPr$2pg1VRvu~svB0)ldL77;~UA!Y@lASUS z?;n1E4sWjYxf6~_zoYn13Mq}x-I}2Hp+dO1J!9X$jPKTWh${Mi;Q(BYpMe4(9MH&Q zBx%15-pU3WcKpU~{;dJ&k(*c80Lef$zXr!*!cKh#mj}!iGrf_Xw)&k%=MW?^)sDB` zdK1u&-~0W)52)fl{L8=Yy8Rl&5+OW@7+VBE$qiGdd%oQGUAAhnxCtX0om{BeJ2+#mfT^< z7w1lFFvaHr(MRStrX!dwNZ}{I8SCOHcLw)*q8ZlBKcNPWNHIg>L{B zscRdr5&{vc=A3DJ%bB}qj_ox*M4tgiBI3k8KK~*)k_I!~uPqtqnmq}QI=&tneV&1@4FyeDusz0cQhD?1;Zc8Np`b{O-35!2%?+wT4(t8;V`GYqff@a zxq=O(L1HroDHeRw&d_fduoQz4@+YX>l#!^Wbi$2CnzZ>>%|{d67Tr#BGM=tBD6!CPKbqv^Z4CC=Wd<=;`jS{VCagufR5{I z&*-!TN0qql6BWqv*4Bi`kZ?5zDClY1WJ*7gM^|NLXiY>lPO{>42p$eLf606iArvW! zPf3{;_T8-c*tUj!*J&T#0qKMArz4Z#e0%od^)dpu96vJ!fI+_J^LZ}lRoh&duracC z>v36^GNsvQEPR}DHW}(FXqyxVR<@MwP~9hseRq%lVPF?>qOlPN!Ot1QB16k2OMVlG>e6g~sd5+w*!kveBS=e}TTY=~mRbl)NE zta8^@H};lu2Ebu7%$)9bu%S9SC%VcAe`*p&E3Gw0X)vAihKpP;aIbpj-g_tHL@7sL zyjG{L#MlUePmyhk3CRG8MRXufhLnu450W)9BVU$Gx0_XQ-?42Q_HI(X=G9l9n`uj} zV?))Ivo}zs!Btrrj)8)ddG97SWsc6pR4<+UDs!BpG4y5QbdCcNfmGX2b$H>O3n?pj z-4+}X5Y)RabNAN5w*W%uMY=9Col+vaD5D#M)+nPTcF*<|?nmzCtN(+qQ#5j6!mAZh zAVmcrGem1Hu&2{NqE_j7001BWNklZSyFeriZ?cjd`O4MKf4(l(z}mEE0Ie z&)Z<9LtL&vkZs5=(WvFPnI43DD|hv*38PbgT??2VaHshjpV#I9WRGL4JRTZ zOr(SrJS}a!dF(TtILUru%)O(aVkN-v;uwDYUeEzkvKr=9R;VoxEFp_2$cM56hUBo( z=AV^08THcx^zvAi>ucIP)tm47O4$@T9aTHD1Ex_i!T6V67J5ook&d^cI>n{5Rs}ym2X6!qh=*_@(38XwQ$M`l2!AK3hv@J zJ=%>3WF7zrxc?~qD=pjwi(u%Q^Kpb0u&hMTkZH{hWosKwSJyPtwS`MPMmK+d4J4s4 zvPv5QG-5W*P~FWf*4Y*zJ}pN{2hSppE!6xTuv)mX+he*xb4%zbNGrxa;ugdp z+h1iyL*m6G*S|8AsAJ48^4$n!gOQ6xI&N=o=g&1?-#+=|qhqG&<+vPw5d}b#hQ04j zK085hKJN&oJ#L zY$}VMz8JokNePp`!t6-Uwv%uEZHxHi>68dqGx@jw+KD zXv&XpM5xF+Sr&P|-JxA^KA#hJ;iZ>ezI6YWT-Ls!8L|`Zmq)R)fNbw=f*};jcuYMZPS8w zYGaS8XB2oG0f19JYq-fR8|U&MlHVngvMK z=m1kup?8DL8S)JTXWKxqJrU35;wuQr-T3=qOMG_gQ%O)V!{N~pOHxLtZcrX;&?j}+ zS+b3+ZR%EZZZw?j${|M)4mG$Br0b{7-uLr9QzWU&<4%`37(T){BKs)^Zpj^;e?g-T zjk6fdiPSkTA~cb&M$NFfO8U7V4vh0W=w{Tkp(}9!6n#Hq-_NN~H*=}YlKG^~O?h*Y zZXyu7S|-eW0^aZQ*_1M?7x({y$q;3(rS?$N;el^d z)=7v!ySR)n$#4$lbnh%!n2!Ke#{Kmi(hBxj_~~u!|w5(NA7#n_1gm8OhsYmnZJ7v z-Fv87vQ(8Ns2&b=m;;erC>KH~jj0Af^4U$I7A{PTwe3ER`TD3=hQ7YLZL}iWe(Jo8 zIiDlkAAx=E)AN4EzVH4$x6?MSbA(}8L@y+Qu~Kp&lu(`de5yFRo^|$4%GEsH8AV)6 zo)-4^cHVhhWypsqhf-|0a{PC(%{EKwI%X_(=TT($G?wAx>60%n1;FLFzXCuBS~Ypp zQRnD{CLTdsH|ibV=2bu2pLQK_n0+#3`@W|xE-Liy9l!lun0T=@>?D2ZD&5l*%o231 zAj7p%=^H_Bn_(g}r=)pt(r+i}K5N&ru3t+45vY@&5el;y39}@dUmJ;Ds3@RDE+-En z2!haF7FM`oB3SM;%8}@G&0vQ~b5?YSeaK=U)X96_LzMXZw7d|Skq>vlLp6Zpe{Yt$ z96rQsaNqnTS@QcLFLh8ZN8PoOOq4ob-ySkjVmf(AJO*xI)e(;)Jf)7#@@EMZMBFk$ z=0dq(I&!s*4J$+M;!(8X#hQ^%v&@aqB#NR=0?0J`k0Sp1`eAS~e1c`hP{4s$WSx}T==JHj^NOh_O*6`=u*{ro)l z>|Xe+k=y0C9Dkt&07?XJCqH+KW|i6rX$D9uB4DH}gUv)5LHE7Dog=}md(aO+0doY+ zMy_{q=>v+Bp3Wq_SfG6&nhgGcObuoP!Z2pTQDiSDRy7qI)d*RUwEBIg#Z^Kg#0yxT zW-KBC+d5kDO6NbOa1`GlyF1i{(jr>Y9CZs1kP%Pe%h9LFJAsOX=#*M)XiBt8$sP4t zNHUmAu*V$RY*uJAK&+rt3T&DuVehdcv4L?#rk-^~Xp=6ZmLmnsvK=m74M%fkEKGb9 z{@Wvk-cb|)8!-287Z@!F3#AbGsrbt~NK(VSU|C1EiTl-L<1Vk+hwo5xvY@xNz z-_>Wv+&QL*R7T=k13KK)h2Ohv4NVyi-_l~)TAUx2-TB-N*NJ^y)Bd+7&{J%02D-q##N^2)bYuL7J$`a#UUjOPh`ehrs9QQW@$hUk> zR|6JZau|+?7Ym8>#{?h^Epm=KjR$NjOp^gU4S#sP3Suj_vaovm>y#_WBpgXHi9zW$ z&6Ea-Gr)y_rmn4}jo#eEtnUogwN~fe#kGxR(0(3MK#e3D;A~{GcD5Xb3~-1^E+wjF zz&rrh0Ehh(T17V&lbKx4@yT98gp_9YV-Xw-@-~$OCkj%^va2)#P+ehLnP`)3_-qO! zI&%y(JQoUXb97Ff0bkC2j-t+Und~^1Wq2WzlqIA}=pjq@SSctoV?B5c7F#=B9EF4? zTjr3qnMxve`B|Qr-9LK*H;l|1;a4W@H2kMI$H!ZOXR1v!KMMuzigAIG-v<>;?rPW* z8pAc4P6&T%JS-DrBfvXG0Y|9OT2Xp24b^2W9rySkJ>EQhGLN9({OADPP=v=On2b-c7`F_Tw}Y`6o`aN4$jbK4*t z@tiqz*WzXeX)d|U0J%gEk`qo(a$VpTG{6Yl&8)k3y0uc#3hpmw$un$#cm{F*OFHZL0^NB_6Wesei~)(U`* z4zaGfYf7QZ&@^w@c@`Nnc$41|e1{ebkn;en6P>@O(aNecbC=L48{>WaO#`GuFpNZ` zZ6q^4O}g80zw^ zggOK^Ia7V4HIvX7WqtUryaRAUK_xCpqSkicSfe zc;Ud@jfysC4@sopC^e5e>h9hU0PFiR3M9~(-Z)S#VXNt4O4YVTe1)7$=Tk1t=b9_* zJ2C@<42f1a0P<|ex-uPcJkoRNWan$_c>hASt)^2)1;tN03?b2^f)FpfoUf9YNMVQs z=MgUsUj$vnqdOfHmk0?N1{%#5b5%*3kwKM>HbS#0RUIt%X(Ehv+Ms=8Y75V3 z)naymoQx;we}|nvEzX=pV4nLKOAVp38a^;|8o3njQ~VS#4-kf9!@tC`#H68 zl12sfJKN9KPRgW>HpWS7v533CozF@eDcoi`3XU=BW%$?4kfvr`6SN{>v@=ly^YPCT zIxV(I>Nd$P+j68OLaq2Y=uGS*DX5lBJnQoV{@0?!`Dur#FjA3NG9Z`(kWnZlX1`E@ z7f2EpihRWuHBJg$(ghVbMgo+qn`5o%)Hv+ZQBd0EE{S7wwNIldq}LjXz|XduGp#o& z56Wos*H!Xs-%H|p33U1xz-MR4f?0zn#KhY3`3z}o*e&n-W#_pZKO+c$Z8|;TMS1fd z_jy}pyZlT!Gn*n%Ii@sH{>W`_W)N^C5AIN@d+*w4HthLzLq4Y~$!*a{3l5#uG;Qs% zt0_bGr8$alm^ErP^44RvXy+z6BpQRvuE1OhlLWF2L!4mN$7q{CPr}XaQ5o&Id@Q6cUWO;8B1KtXQAl z(}*DWB@G+xdlqR6MYv^J!|jATwjY+GYLL(j#Zls)c6~-+TBM*$5wjK#Qc0T7C^nGO z{rt6(VHN(ox%d!53z0@9d~Y0W{yAP)pt?_&#tpaU9s7P8_d(y?=Rx&0cp1o{KS$`E z@hY;37ScMjqC`SYoWxDwQH`{WGAybI&M}yA;QM(ZM>8Q(htb*PxEwzN2mrxpK0h5Z z?S?+x(#8xfN2f+85T;XCgto-P)yR7^>|w1N%lMuJ&1CjGAq6%gwU8h(=a9qhRMJA2 zl?8GDxRPEw&E!#RSS5A&DOZ3cYM{@UiYjr!mKo_Nxvoe9nkaNa&7wg#(*kp@-<{^y zl4VOQSF4}9F4QsJFZRNUWM|WOe4$Fkq8QgQAxZ(KYC=H-Lgp>upt-X&_EDI>o5wCR-1p6p&;W}&UOX_0tKd)R{S%D+?4nLr z+X4;gop-NyyoyJ$erA{b^X z$vkA;XmjHe(VapXTq^|3h$DA#>INt|pl4Rwg_PEz)O{)Hj5T09y%Povm^v?L94un< zJo5mk>WA8DDY2zhXx^`TWzzXPT^-V%^Kk9+JIkR2Pww!PKN>5D$dXj1$}nxfz&=}+ zYO|_1%2*Gige{sgdmU->XXyBNzv{@2X*#(Q;p~Sr7p_n~ z&p;&7#>aUf(2~f>=Rfl!M0P-T+}@la4LIN4l1x<(3A>rg(vrjFGF3b5^cj_FiQF41 z33eLfnB`Ky-Ld)GvF}5|a{b^TzWDqzvXZ_Wm*Z!k05Ecv&&Jvb(sy{DN0qgt?s_~7 z!{RsG+L-iacAvuoTo=Mqnp=yc4a3~oI6Tgfh+z@h-IrVrq0$xJJL;O5_mJ`hga}%+ zfvd_)ZkzCU*Tm+B>JnC>$cZPDZ$5v&B(HN{I5j-S@7nAWc~TFy5SlX|6>W*6CJg^; zlDB0~SdK{6Xf|_bJdzthS&{479AhB6Mt%NWK>CrV846LkRHAD4(&xnv7 zZvGho(mPR?;2Cres$q|b#cKABt%`2N9Gb&LL?XP}YZ|KJK|CyhEPi!$l#Kd87GHuW z%=t5EDmK}9FRX`idY^?x4IamMj?d?_-;N$Pi*D)7!d402>Bxwy#pFF|&d>c{O2Zhw-xE%K|0%%do$~G)SO}>YH z(e!Ha`bI$aq9k!sh&zJK4!I|w);F6vD~wbvNqTr&M9e5CcsWvxLnNifG3+Xoi(c(n zvz>5so8~PL@|*7@B~4K!$;HN4LQ@x$H>2aO(4gE7UAkeDLS<5!9B)+!yXhGsV@Pbb+yd}SS(C$L?>tOFF;mLvkVYm< zC<#n`A|*kvCcViDU8n9bMqvugBLPLWU;#?$Kkl!YA&Tzjj+{ljvwyGY|)k6 zrp5Tj&WAzWcNrY(MBuuH<6x~=LUpJGRp^u8*FEjCr)0%AXU%duz|zmT`I{`!zj2G} zSqQbY&`ku#`T3>R%qH!1%~6s)brmZ;j3a134XF0r3>bb&uyEvqBXIQcZ25(lEYEa`PwlzASc9u3|qnj zKfs)Ttfwq9b#n~!O1fuQ?Z91nD|{0YquT>?fK08Ozce9VfrAkbk3I6&~gla>TijD&^}@bd1Envv2-NMTAK^?LKDr#DL}l@=xch6map}>*7_y zNs*Sjkt>{BLaLCm#lL8TmI>B^eUO{O&!n|BBeb^|FRA{2@=CZIm*f9G1famIn0kFH z2=Xk>ZgNeVQ_Rvdd4*eRtOx$;*7e#$W4*)J1bVd7V6&PaR#_)vn@;F)TgVQP`36w3 z5iN^W{EQ@>JAh*0s+7tnzHuv=xI0`ez}7b8Il6fr5YdQP{%P^jB~Zr9bA;#oig0X$ zq{Ru#>^U|y?rHn9+uOTh+nO`mJB6my^fM#Pu|83`57YJgR69OZPIxnW5MU6s?)IDQTF@>dA$eW;4GX@;<;=G_(I0raDXtWe}>rT3MmGR%^RM;1@tMb8w zTmj2xIwr1Gq@u9@ZICcIK6kkX;=o75;)1=kJg3|1Mg0 zIb_Kn%!AVcO1MH3cek?zxO;B6EQ$tOSQ^Kk>gu+b35shsyb$%~#;HoOs5^A!l~ds7 zd|rgpMg~F##iLJBTt67wWGBUvp;#+{<3o|HeGdX!Qn+E^Jb3q8HidyIP?z4~HGLL? zOqfe!q=R6mIKMGZ7ebD>+sxPXXtOvN>rj_pT@@4m#?$8X&RH_^bo4M8S&oYkJ(jrw ztF(`~pC4tm!q-(uscJcr@y^ea zJOGfwu;Q9@l2dj|hC24l##QTOa$u)gf(&vL*_>?+YDGRE4_)miNXo0lPW9et+OqfW0SiM1V_os&o zX>Dye^o2JaX<2gU9jK>}HG1D8si79wvMh*)!8i^7PD(Ngp8-L~tpq4(*_hx?ep2LK z3xtBSe!5zNGZWSiI*6uBAp3vYySH9Vt~;;ezqP8K-MxK?9lIyah=7y>*g*s00+3L+ zLK=y;;de2JdywW8@E*8^Tkg0S!5~I6LxM<#giP#-5AAMu_kNzLT8oQy`ma^>Y}+9- zZK3Z+$|U1<@BJLAYMuTEyX_wOE$eu&gX3J+d!lub+y}~)%7VI*w$=~)rjLcQ6F_&k zRX+axzTl9l!g#RyZ++~$-RSPJvuW?P;7nKC`EWJvcAt~2chOhDzE&;kAQiIg#+6;X zno+RT$$nHWfMb@}t*MX>j|9gFig!LOOti1wsV;NKnZje`+VG~uwi|x7xg=eGjn-q7 zV6#TXd%uqtQZ7v9a#l;o&#ebH545gpcTG-yW(2}Z-T{bxsnE3jUe4)4-7~oZp`xuzq;3m0xNqCm`>*X{vZJ1@pob~)tYNYga$R#E-yvn7G!_^ozP>+#^)xPDFS zkA;rv;*Uj>{kW2V@Bgl2GeuImIjW}(=*S}FErcX{O8u0rEs zm7yAsQ@(Rot916!CbqS2Y;ir_wKmgci+tRbutyrxFA8|DX%I&h_E)h311k6 zdu@-df6#mHyFeoQQ_B%S3lKA9a%{e}_c@r*f59sny6_FJwOjFBd3(;gE-ldwwVk6~ zxt3-QL$7wb6I32{rRKjg>2R?NhHEK*b`laozhZ7FR{d(r`#C*GO`6%hY0JK{quf1% z_raiH&&2QjE}~s5_c{KqYf)^oVC=3>*-h!IMfS&DaW^S*YVji>Y*LVX_qp`P5Va^9=r~#5_a)8`8dw+k7HVgLz_}(Y6_U+t-2F4d#T`m_! zAiVqufHT|3HJW-H6k;Ec*44moT{XJ?-~9uzMVEW$4=a83=i7ZMS68KNzXq=*a_xlS z_-r&@sRy8YS9@Jko}nO2Z3Sz7>lk1t)AqD`Xx3(8rr@uQCO@b^=&uw9=o_0H?|QUS zxi%22A86~jaBZ7h((mkfyO%R5gKaHs_Nm?RIkLL)v3BcwtjCc11x#~|A1T*TKl!;H z)Fqid0ouRkQ5cHaXgrTsUlV^nu^5gqx}AVNEznLv53AnA5}>)&GRA(I+6vT3OD>!< zO%I2kVe{V2E9n~f9DFy@ka~G=#4+4AEn7!J&yO;k*ZqdNgI89{<`Agc8FStqHw{6K zyY{{AU^m7b0cqSBvH`iS9dX4LFHqxZt*-pLZ#T4UFu)7 zm4o9!8t3jXX(%aOb`o6QqrjWak!6C=vPyRCvD$x|VoGV3V@w}4_wT{|ZEJIAI5z1w zq)aR8nt>F%f<>+NM5s-@T=`zdr=3&RHax_ro6}scpEPez0i0X-;@v*ruYCgGYAM>Z z#kH;LVNGirIMbK*bh`<`@x$2f+TQj%3h~~*pH3*snR(C_g4T7(gRLJ{0As7zwyoK{ zw|K1uTbpd8zZ>fL{{Cz=?zRzYnqqEwsvJ2S%phvZo3?>YyKQ`%suf~idbE2u50w+` z*`&KV$ua|bun$#Vf2K3#QR6{U#CT?33(bt*U49^j7>A;DHs9V4_451cD-EE>aUa(r z;>Y9ce)1HC)ueg7yIk#q7Shq~VwBqRq5B9+_Ced#h~0arljpqE9ft^tlAihN4}V#= z#7ou9a;^QaW_)EW)>AT<8ViQ8`#&Uy8ZcY^s*Xu{Yk>k;lJrc5Mk+vgUw=Ojy@<-hm+hiq}bg{TQ zt!O2%`@wmiu4#`=LM_VF9|6TW5Y>S{4o5OwRf9g#-FvUsUVl^1pFh()yZ+or(pzsm z(z2}j;8#B%jv=JW`A*NCJ=VUDwCk=R8`a;H!#&vg@B3>gm(0x*nKBD1gKO;Th1j$I zXwnY6NxN)WGVWk!&h0vT_Rj!&%?vd-O*O*w8HK*;r=nsA3gw!~sg`!qmnH^71x@Gr z$w2w%rI?s^T9!+T^@y=f>VTJRUe}O2a9uRdsffxnIh{_k?(WX{Vz&>@bfZ3c`V(PtiKzw_vuijv-Y_j?+Pg2pR<=j!k@ zmg#i6SJOX8HJm3(di3ZmNz!}o{^05>u(j;QDO0=>$A9q2n1A24dF_Y(M~}WKN&4Zt z-@mejeow@Ex7Xmhg3j(s{QaXz;@fYh*YobX-|N2!r^C-<_j86oM%na8Gl6r%pG!k- zeV!zx&&TP#!_VjX5m7ywvK3^UDO&Y~pRIP+s_U+w?`sP|uiOTG_q*Tix+fO552Idx z{dK+b&Ub1ILkOELm*3UrpFh^`JbFh_(-(ZdWB-Q!J}j^2hwuGhX!B#5b*b;0;l_I? zUOTwyrpKnd^7T)yUeE7+udC1Bb)USic~NI&>mP?CJ&CNO1ZPU7KsU&Ropl%QAc(9Ug zRq<@~xm^0wyLvVm)d$<{hLw0cm^jxq7}O2N>Tlle#l^PO8i#>D3_r?66X~>Hfw{wt z_M<6+-5aojzlNU^yX{f8-xC>DyyFVV>3H4W=Uw+{{O+Eiq5a*lr`@%xeb zZS$_y!nN_BRE>1HobPmZ_uO>oYeziaeCv_Uch7V>&8?Y~^YYWIb=!1zex`4H0uxeX_&X?4= zs+?P^YYuaiVLk?_MU(1O8e=%Kx@bdSiY||R>f!a8G5ZIZNxSNc!MI&E!Sx#EuCIdT zhSsvCL*Ved=qt4yzd%zj$6Z-jYxjeG^L8P}4;dTy*GKQ~Go)g-mE(r*B3>OZ_q#xS zp`@{bUl~em!>JO5SkvP3L6!5q+t$~?HFtC@(8rhzlNonVk*}oCmFuNcVKjBEU9M)= z7s)bH0;Ka4~AUd+DuD+AghadbOZR?$W^v{2!pZ&#${lwf{k7HvZci6|H|D5-IHQX+z{^(YSaWlt# zv5TMa&THGY8Zg;)-?Lphhmz9mdmbBr_4jJ2TG+=i$UNiJRV9ojPNPk9@)RaSP1AJm zJ-4o_o_+pAj~{=cr=Ne;R~eM_AOFL@ClCNHZwDZ(o6hI6wz#Hrqgs>OJUFAS4*s_I zN6hD2!K?<-`Mzp2w;dQlNUcD9?e^uaj-p+V*};HUI}v(QxG0W;LwNw16}d@UO3x(M z6-;ryr7hMbAtvhoIA1!}6{5|Ma9s`Y*srN`kfFP>02?FvkIqNOw5>QSEn_??6f-=g zO|E!tx9oJa{BJ#LkFg7iOWU1g<>OT|*IaqX=D3rneY2=sOCW?G=Y77WQg8JTg6+cI z4N|RG(GZay+ww6)SM$vML8*kAg;0(eSGj~dNakgF| zyJkFji|DArVjlFja{Y8c$FZg;=5M}h3JF|=3s^0sy zIp+-&X2~>040N0gE-K}=h%FT5f_(y|-t8Hn!{_G(h9--9lA;!K_ zUiT(qUr#>9E3JTIxAH#-^Q!N2pPkUZ-*ToI@&nnXCYC|IelMH0S+Mk^GjVhGJBeDv@EMW`shQw{ni`ZPLp%euYUER&gVPL z^OWlHxjs6{j~iyUw45Hzm8wpQr1kecqFI3Zd-S1UVOSWj|+5tXzLAqiCKH zO0dl(9Y+&4vMa2sMPeo{OlM9|2Rwn##$lMl==YJ6kXtJ zF#&L|VX^Gnq^DY)q4hvVzm`+Or>IV(g-QZHKSCS-5-n zmNUt6J{e-{R^07Db6jRO<}8KKt(4QBdFKu%EBmubcX$k7%OlqTvQ|8EV|j!Ajdf4y zgHZgTX^rigr+8cpsjqTB=C}Ln9n*F@2+@8ircQzz9`tSUQ+|#2+VwB!8}ST-(ZOdQ zG)?6{CY`IE-ww-Qn;36*isZVU_2X8*%}%fduE(AOrWRyAM#wuMYFRh7 zY;=rK%jGP|X`WA}EO-74z0ppWb_vf70`C>q>LS=yGe{u?u5)Hbj%|sjh0L_w4rL>t(hBZZsub z=Q(Y?b}2V*$orO=-P^%Ar$SAWuYcZF2uCZ*ePCO^o$Yc7*tpwyC^g^9y1T5bW3=0P zGO3JxJ%hRuH$hz9{yp8Z+CQAUveCRDMt zL+(n?x}i6Z+id~chw9PTYClJxpYZO=Kx{i1cB|p~5Vj>`ov9Sqy2bT_#J-%c4qmhG zc1K(nlOo$_NW)q7P|#*}HC3>#c9;Pygh9>Gt8nJTSKb^R?IB(C1HorSs*S>eR=BwQKBmSjHar_H%GP-S=Ba z1LVz=W^(DZmX)zLD}SGleA0J1=l2n!Ofe+4-;;8#s~TyqYBx+6559%eJ0cv!BGe#3 zdpYepa(XAtr&Bu8FsXgr{XRCDGDms)`{Dfafx$XC3qW;buhj9F*D?eE1{2uXCuiEDlGwK!c0*RjP|2uH++yqP5aT^N zJ?0v#z36l6Yx{GTWs#p!x4iP6+cn!Jh~7JG>#7GgH(D;6qHATBOCg(eUG(Z}x4ON3 zsAtb!)O&8*Ry}?CbSOP*juG1BCGX;H0vAl79XV;+q-mby<0dyh(6+7elhe9vd28Hj zU6(p>NY4wGx5KCUY;lVF zo3<@=@axJ{+t$BoF;8uZ6!PvtD&xGaYr2=B82s_|ngEzltPTR(7VGSNS=O2oI8811 zXWQ1AIZz%_^E_#q=Jc@Ig2JZ5M6ntL?UX8mO-`3}(d4JPa!7?TLwCcq6d$uHsFC`y zozFUx4}Tb`S5`bBpYwThW*EyYocoI(Wog@HMXt3(RX>QQn&Pd7eyIq!uIT|$(%EW; zL>{nfHNhNE>2k!e%}1`i(al+P4cf~OrF2%A3oMnuOz*lK2v@g#L$}*f2I*~!bwydu z`(sGKRH|LrT&_`{p44fD=gm2j8|uZkYhc?pbFz_B$ZR*nGI6Y3B4ZsS+kkHJtn=^L zwjjk#r<;Ow$|>oe4brxdc~nAkj)^;-&Hp;X>m5r4O!(m z{zRrfLX1Ivno?%Y7PM`fDVLYKB*viEUVmMRQLn%Ls-8Z5RwuOEw(9Q1T`dh9!j=a; z)r_1Hu$O8Gg!)~(m{zaOPpwZ#^txQ`G|vwd)>R>_x;$TWd;75dzG-q=*OUe~O|#~C z&Yzdpwx)Y8z5o1ung&4Kgs~no$!x`6J5TQ?;AQpQ;*k2B{}L!1!X}?O8>Ra_N>OY3 zY;tA5TG`VC^R^v^kemOsra{V|<+iRVa4@X;f646ue)~rNA(*9PYOR@Ot&5gr)r%J| zS~oVA&nm-a2L84pcP=W1t(K0hTe97WY;2`Fz0*Zb^K?;+PMcq9C9t|>o(H}Vww97u zZ+5%+?af(pE3+B%jahaR+QYTf^vNT<_D=ksR1t#rN{wxFmj@A?dp*X2YzZvn5XQ)~W`2H!1)JVA-OAjgv8H_daZ zgy&ioNhoKyrM0tn^?kQ(<&XxJZOISaO<_x)-#nl6@ZoLSfr>U_yq(5(o#ssEx?qAZ zV@zpZekh3;yI|E|N+Gwvxfr5OHz#>Nce@YXPl|EXx`2bEj&@#DvO{Mn~^ zad)m|ZA%r+<#MMt-+WV_KK@iso;=m%ayC0aQJ+71ss|5lbiTXOWm&W?i=y*7%_m(h zFY@F|n&y+HdDipipUb;+3^?WcaXOu(uRoFSc#da=GLq5nosA@;(j1c~DQ2 z53hNi({dtgx}49N=ULM6v?S;!N z7SvMNQb#$T)4yDP5P4lLXKm|R2jSAJDB2aWOh0x>-c8*~I_6ceU9q+lJl~)1$J`Ei z*qAQqhFfkrQnopxWYXz&@y30@m1tASS{hkeRk|)1DwfrYt)1Y_8ME0wZ=Y{|FC{fH z|2x~Zbw?L%RU2E-VCd7zTBe4tlOGM|t6klJ=!X6du}u(T2{euMyGZZ3P0DJ|1)G;P z)OQ#gB(+_aF%8zFY!2K1A*WBa^0N6D$ff%t9cQ)e?=mNGC7VJrX{UJtvIX6p@ARv` z{DmGrexc7kd(wRuAq4&M7yna#_wT){pZ@eO^k;wmGfm!0E)9OqpFh*(vg#*4`H6o1 z^AELdnap39ZM$eu- z$z`@feSalmC@mt&kzh^-Hi2^rt#fCMxX;IcWjAumljbt{xGa}c(%Y*|Os11=9^9lw zO4w3Y#5rwh-rPLUwl2C{&YGr^Zf{@J`Fy8sTQ$!oE$c`4KbuNw>GJ$a$}2 zSv2R@JkKXBOWNsp{P<&qkQNm;4<6_=pES*0({xienl6`%mdjaDQS&_KG|hz+Kzv<~ z0HpKXb6u8IpMLUdee&_gY5O=|yxx1obxrlLeV$S0;HC1=>gu@<5Bm_K3A)XJO|ETW zmsM>_B@9DVx3tom=Q(E*q}_>Nip9HKz5UpB1oGCaH)qK%Z=pxoy4+XGp4n6LuI_h? zebXStKEhrH8-86EV4F^822E$8{kxcj5WB(8mXsSKj%%)c*Vw2GnxzV(`esM@yO{DS zYRd&%x@lETpPTZ47PhsfjP~ziY#D2ME4aRcoOhGio^Jzt&7F3p%3GN{`YBy2W`*vC zbNH@djftbMZKYd^X#4EbWVgk*v;tMJFEG>njJ|kO91Au$C+E)j{rD7}E*sm@_or_) z<)ypx3q5>zEAPF|=Q~|4m+s&HvzS)3lb^J$FVYHmnpJiX zgY)^gYwNmpMvd_@?SGfD#chH#b*YbA?HJm2WLoK6FS(0eym&S&7SiYU%sow$MoDg3 zw61H8F>_`mhhuRo~)eIXy>Z|i1e-cie%&b7*RWy}|P=_GhmM8qmHbytG$ zqD(G%KlqoM{d`tUH|kP)VqYAm1*vV_!#_mZA3gRf!7GDxEB@0zoNF)et_bkHI==0H zu&b!1qk00dtBzZv)w^8si|%UWR0I~el0;;R~@faLA-tqZQG`!DhB({!Td?I5%~6+aV939 z6tYpCfauEg(MryiKk#|?NY3?xRr_G-&Q1C3-QjEQ|LKqa$A8oB{oX&&8*jd$KmD_x zc1ds{Z2Hc3{;KwVF|!}dy#m%Rg!x7mL3 z(;w^8Pe02+*?D!mZ3+rCqCTCdr}JPtxW*W@gv<5cGNkRMK)7{C_v#-H-C$>;mz}$Q zigt9f#vw;uroe}~Vk7$%OYEY*`?Ysh2fh27`$*<5l{Ps1PCE>gZPuUw{4TQ9PbfLSH*+R!PaPK(e19jxAEVV8CTQs&6EfH z`-b~3dGYD~Ya|8}M={iGcip+ZNi%e@cAy+5mG!DI|0vWt5b9T!`D=6Lto!NH&-Cc+ zZ)u)R`lCPklY@8e_3hvNJNoFOC%U^k?^-)7mvdf~OLun{+02CTnn|xA$W}Q_M?=0f z*NrU_KD8irbwZvN1Yai7{hkIrihX*WEzw{LSjE`w+#EOW>IZApsGu|n+qPKSI85Hx z;~HBO=<4;7Uth>w1F!RD^&jf7O^Rs=j6is~6M!J;$AA9c_35XN^S$HS%s-U>mQ{9+C@L>{&b(OsulMrzxtpKULAa5O+zfz%<4qN4QKDa1!eVF zk375^nyjcjkn2|SJx{3JE{0urwfyt1_Tkxs5F6a~WqwXI) zXKecI8b8xIYgS0uXJ@wt>kQW1`HI)QB9>Y#51E-CEj~BznTU_Y&ypjG%YSEmJrY*C zb6H76?0VM;`dwwUIjVAM?>FT6FnlPgwEl5>wtm^_&o@G^Xx*-PEA!TT*8BH$%YFSm zf8YA)j~Da)%sSykntb_-wl9ABdF`A&iDH-h>Ms`GZ_EC8dusifwR^v_@BMRY@q2CE zI{y6}->+V~xNgex&e+}`TmH)IURJmJPv!0GgU>^ZpJ#`Bjqlh0|8R<&=u-X0$)}$` zO#N{Gd!o(R9}zKSQX&b|KjaQNl0 z&r|Og-nX?lugP$(PX2FP*!?+LTB(e^*2eMw^8WF@^Iy68N5+5Sf6ubN$N%T)ylYl1 zwL0C^cb0$gsZE{PzOj1eck63id9Hq6%ln+=xn;}t$Ni5>>iD^<>*o%YsWN|ab@LkT zpW3@(^;QeUJv{IC|Nqzg{eJ!Y>QDcj>p!gjch>$-bN%1;^`AT$M!{$Zpoc)i!T+pP W%`;y%nklRX$$7f^xvXM*R5b*E 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 F^M7H_zCi#0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/gui/gui_platform_terminal.png b/src/main/resources/assets/icbm/textures/gui/gui_platform_terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3c684714f14c81ed33108fdf271b43e9cdbeb1 GIT binary patch literal 4563 zcmeHJXHXPa5`GAhvjhQg$w^?yNQN156c}VkN*)lAAW9M(a$FFR>>#M*q@aUC&>;v& z7z88^L9&40EkRJi+<3QD_vdc+c7I*f-j7$^RsCM~*I$3Hs*^668!*sv(*gh(j0|Iezj8ueVDmKTQ~?uGK*q?{(-1ss1UNi1 zT|J12YN-G!TU+V# zVt6CY3v5a*r(E*2rQ1XExa6V~m_F|G15lK~PU?2&I0VmFi^nUaVHmGUt-qlp3b?v1 zo-7Ym`D+6(9~3!sA_-~WMyXMvd`}(=Z&7$%p)0zzpW<21r2P^UtxehP`2XNWulOEz za&mcTX~MV@>fq9A8*zeczlyUxzWyyz{b+yhXC^@Gn1B!!>?ftu^CFch3)5N+? zucR9sHPR7}ct->}ja;z^3ARN`)_^qK{L~$}5`iS>eet)#!$kLmImttE%{fKz?3yN7 zc!pHDlNOxo^GQ%a#o6k3U#(anW41qsB?kN;?>bmvG{>!yb{ik z58Av6I7_eiOn*k{cAHm>8vab*U8oD E?gD0F(L&$#eUC6c)&BLvf^IrHKU_}dIA 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 C4lSDi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/gui/yellowdot.png b/src/main/resources/assets/icbm/textures/gui/yellowdot.png new file mode 100644 index 0000000000000000000000000000000000000000..0b03cc10a5554de251bda4de31f5ff99ea0208e7 GIT binary patch literal 2798 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 AR{#J2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/EnergyCap.png b/src/main/resources/assets/icbm/textures/items/EnergyCap.png new file mode 100644 index 0000000000000000000000000000000000000000..a02faa16d6739afcf0a9c608bd2a8f061af5ee9e GIT binary patch literal 1730 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 r_xp{-0qS5r#z5K00000NkvXXu0mjfWuR;* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/antidote.png b/src/main/resources/assets/icbm/textures/items/antidote.png new file mode 100644 index 0000000000000000000000000000000000000000..94eb1bc6a6592053635b96cf046105b69f6ec914 GIT binary patch literal 2910 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 FV1j;fS-b!M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/bulletAntimatter.png b/src/main/resources/assets/icbm/textures/items/bulletAntimatter.png new file mode 100644 index 0000000000000000000000000000000000000000..9aa869df9c9f21d03e46badd05715d77d74e3111 GIT binary patch literal 3918 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/bulletInfinite.png b/src/main/resources/assets/icbm/textures/items/bulletInfinite.png new file mode 100644 index 0000000000000000000000000000000000000000..d61229088bf6ecfd10d6b6a4eb0d884b32371966 GIT binary patch literal 3993 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/bulletRailgun.png b/src/main/resources/assets/icbm/textures/items/bulletRailgun.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e1aad01259c9216f87d6c09a2f519bc1b07634 GIT binary patch literal 3959 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/defuser.png b/src/main/resources/assets/icbm/textures/items/defuser.png new file mode 100644 index 0000000000000000000000000000000000000000..927159a09c2221ebceb9731c11f06aca78f67aae GIT binary patch literal 3529 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 DGs~G~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/grenade_anvil.png b/src/main/resources/assets/icbm/textures/items/grenade_anvil.png new file mode 100644 index 0000000000000000000000000000000000000000..037082e6a4fb0ab89c5e589318c50eaf2c1c3698 GIT binary patch literal 4688 zcmV-W60hxvP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000MjNklc5X9!iNI3p4~UC85}kNn&CWlf=o`8INZ?9?y1{ z(+5aZ(Etf<#sB?$-~XKR9sPetky7$`O67Bw08kWVQAPUtndcaF;0RPrSu#P93t8=gOMc-XnLR*_OJ%D^=}?f2&9bHB5lGN$Px z5D1c;&!VYpB>QhNh|Lx_;I$j6WEr?~m`EI6b>414}zvdL6rb*pt#P zgg^+Le0~8bVe__I_{ZSu6bcI%x=A`chi%(f6$XYb5SsSP#KhEB#A1$KQIrQ&P4inm zKdPz{2!!zYESg%{NYADy7mK*IL&33G+Sx{_SmynSGbk3IDE*5b!dz~CrQ^6{G8yLP z=18Sx2!%p)bapT@G=wKTJSmZQbageeaq~Ksw724U9w1wn$2&rcGT=DQ{KCQl#bS|C zsYJ0@q&FVt)mQ$GCtV!Z#`7E^(IDyB1ap}bo3{+m*wl>cdTKVCTmG31G&R?*a~)cB zVW6lAQcB`0Rx)~YnCZkM3NEHk5RL?CYiq{yT(a3&O2r)gtK-;Z7uR)Hd?o|e_V!ff z^Y#0(RB@-88EnRJdf+22LJ-~EwnwMVQPcZ1iXBtQf)YWxzVBhOF zjsr*;3DM-GqNZkNl{w>GhU^^N4_ z=XwA9S=xKM2?m3t66Z-JrYM*5v@dN%BJrf${o>xiJsnG$b=}J!02U@ElY>{B1)H{R z5L&=|)pfjeuI(a(#^&`~ICk_XPd>35fZprk?AW=3a9s_JO^w8wY8l*rfam`F^j!yE z9)30!4mJi%dBPORUB}L4_x)EIev(d(9lu{u)pb?15vn6KcoIgAk1#Sag5UB}Rb9oJ z^=r{o!J`lSkyG!E^UzZd)6&!Z%)yt3p9Kg9jBy2&V`paeT{ezCPVGyZ*Un|K_X}N+ zoV>uy`6;6H^?0_Vr?-c->#wJ_u@MkfOlQsnqz#0?Fl+&(9mV`FxjQ7+98xrfHOlE>jnh)Hl?lA{l#o zh_+liUsyZ9^4=9}c<&}g$48(4Vto5+l79EL*cGV}+}h-xA+83DDCTDJWnbKQp6# zDidzqx={g$MgxlD*sg86O1V_TacrcN2whxa079W4LRV>MXk+a7dG_sngVXQ5$J3AQ z`q8E4jkVS7ilP{;oy$U>%7g$XPoAJQRu%XA{3DL*P$(3z9S7yZrc!2UYK~!;I+i79 zYHHxE!|yPan8ID+GM(`4U)IzA80-fi=+{O8<%I)>=C6o~^MwV?^SqH#sf6cwAMl$H zn5GX+({LOYiHoi)`1~eyu^5)+BNB~p%dH!7iOKn$zy9Sz@;_+FY+2G7x(X~;ZBFDU<)c7f$``fd_|Ff^z*)!8)8*kpUrm8Bmy`rM>phTfqDuIN){yy@B6q(r>GU-`L zg%aDh-R}M3f#3doQE2~3X}Gd)+4V^G$G~mh`sUZQbBPHI-9%_A(O4a;`qn(WX4S^; z|KAK;(oGxI23uNNuD|idfg4h@$$?lb8fj~7NxU)m+Fd`p|2GSZHt>1sUjqODFDzp4 S7Q6=l0000KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000KENkl)@u%!*6kwv5~x&%?wqEJMusyhlTLI_%#IPatli5)wM?d$vaz0Ntq;wBM|-NsE8 zndQ-(neUmI^PL$bB0NgbJYul`N~wo3GCeaT0CgpZfUzI}lm=r4wqN||D{GvH2uegA z7{K(*l!PGkI?!8%x*izSN} zgOg8-u?mrZ)|NvzOL-hz!#V%l_3IhH^FR2W6h+0Bt;0<0dy2Z!blY&`m#--ORbO6L z!mR~(@7?#&CpQB=FOX!n_K1L#YM`ZWYeZ5$6JD+S<*V`XkGWC$o+kERMr5n*469f zd}#q*|IHiJbx9OOK%lBT)@quKjBuN8lf+`JV&C3v?ArAtXU|=y*^1b*Wr*V~!5PDn z(a9|l)iY)-fStXVfL215rHqen;pC|+Xk`E)1lY5CD_R?tZmxpTblTOR@>|iy z<^iP?QDmv>Fvzjd?48)o`1m$1Ub;z|CWN4gBSW*<%L_F#q@?96e#Kee{WladeV~?doQH0i-x^~oc&B4i0&YYdYXz)R(s*3h%!NCI~ zT)1=tr8L?Y%A&@(8W8fl!g)`(Q`{ebQi>$8WLd(sxfMRUatmt}jYdkAWoV;0uz!@< zGxJoHBLtzqctTjk*^zxcsufRJ`2m{uvUEtGC z7u3BY*_sGUPVSVvsEK1kS$WbdB1sKF0!AwiOzz<9xj8^U1g$OOd$w}!+&pDj4qCJG zSflYlFvj46ta1K@DX1$)qZwnZAxR@58xu##?I>yLs$%!9EzF*t!x)Q500r781Vvd5 z3boV8smhuVJeMwAS6@1oA3pTbU4=L{WLbhSnoUC)t`3L@NgNZ$njnh0u2D)6g2Opa z-miFKbCb?$pWq!U?Hpq?0?eMirtUkIzx(dncMnEJhbeMTtCdn!HQH*r-JGGvQi{^y z{DA*=ed7scXXhCk8^&mbh_JNWMMM#NKqZ+!wN}@QrodV5{v9FQ$E86WYf+9%?P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000HONklN<6kdOYKqJ2Urr9xU>pA%$4Zpq|xT zT>ZYE^Lw73aL(~X9(CtK2r+Qu&wu;7;_5#Z3nlw9$0wsC9(APOYL5(@wYhF&7-?#(wkYv zr|mXUDU7vvDnLkuaTaZ|tH5AF@YJ`yBigNIEez_EHbdr(Z4(od;YKiorxeB*j4?RR z!vUUBc%Cc=0`SDC(_-!Bb(?H-I!0@p$(f5H7TYmlwaVn4IjTbyoV7?H5uU>rhOb1AHk#hjuKU?7_E^4s!_y0-+kW=1RzP{m8^`> zw&29rIPbMGk|d=_Q_@a{GU-B?^624%Sd%+HQ0&+~&f_PZkPi)TVqrnxvm;H~%tVTg zaeUfrQKmUoYjl!8XzBDD^tw$Zr>Dfww%Wx)_gH-M9sAG#Ypo_pdxO!i!sO^E?<_Bo zWG$**h)XiUFhuztWiQ8+7C-bEuaEugvo^L2F!$uKApE48oBY331kB z*X&+`$fvu}!jzgkNg4Krozdm59va~Asb>Yk>wfRhL4NT3X)dgg2I`xn+POrx%2Aq(??aMdbS|#xbR{ctJqcPw2P1guWt; zH|VAt_#(jOjwq@ZY0>xU^-ATJKmUc>62Ot?p4(THrqNzr4tG~V{?cmEh&xCezV8tR zKEAK;Jc+S}EYAphzZZnzdN1#WLFnx~|Job*mO?Q9^{bLzyH)>fwv5`Ulv_Rr6|?)4RCOHG*4905Geu~cZM}c2?{SUwSz1clAvwUd(R~~!&{KadVE$_QY z_|0#;Alf(Hw09FkMJQ1sg+O2lJdgVDHUQpUTBX%X@dH1OYPDxpKUi7ZN=v^d3ES)M z$xj+_XRXz{og5Bp3}sOuoM1S-l}}l}!J(-DUrAl5RKCAe@y{*8U5|{2GB2#J1XC0B zdwvXkpIU7g0GqXO)$ucD&%Jy0VZ`q%!;f!nIH}}BsU;uZh-vrkE#W-fxFv23bV$l2D!dHa26cgJ8{4my%r4*=M&?5 o^0Vj84Q!ou&ixzUi#q=r0EEH?!9Qykb^rhX07*qoM6N<$f+a8!lK=n! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/grenade_condensed.png b/src/main/resources/assets/icbm/textures/items/grenade_condensed.png new file mode 100644 index 0000000000000000000000000000000000000000..25dac2ab517af81cc95e798d351572e4e500c150 GIT binary patch literal 4761 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/grenade_debilitation.png b/src/main/resources/assets/icbm/textures/items/grenade_debilitation.png new file mode 100644 index 0000000000000000000000000000000000000000..037082e6a4fb0ab89c5e589318c50eaf2c1c3698 GIT binary patch literal 4688 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/grenade_shrapnel.png b/src/main/resources/assets/icbm/textures/items/grenade_shrapnel.png new file mode 100644 index 0000000000000000000000000000000000000000..50d1eb7b48bc0e2ddc1fca72dbc7936b60038f2e GIT binary patch literal 4307 zcmV;^5G?PBP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000I4Nkl0?>W1h-R@>LWSgWhNiPywTPzj4Qt-kk7TQ0c zMUWs!gF1_)_ zYYXj8qd!)!T-HUH9vSEAU$1fb-5b30t#7jS&R+m%@1Oc!?fr#U z+lu`3pRDG!JsEi6(W&fXs}F!tEnyfrB*j1$Gdf<6U=R}YeFlQS-HuD$&`2_YjEpqP za?e$&!B)#oFLdn(#@Q9ZoLS`%K(5BecbD<${@WSt(??MhvM@web#x<#s))f)Zr{$H zFIDzl1@}yNq0d~sOsXk}`Uq*_5jqyWppXbMUMAq(xx-kwOp+$3!T?3m?`ypJ$}1v} z{?}Dt6{>i>Hm0sp9UbT3%rr_G5=RkwE=S*S@SPS?5~3&yW7uAI8`{4^b4coesT0K&#`D3DSKXyVEiD zWS}VuZYeJ#i2`~mvvB1ywW(25(l5|+l=5Ztkumb6GIIwW!?ZTp>a?hhjiTjtGB7?nyS1lI zczym{<~V)U*IG1IE$X!q9LK?JS#&xMvaH~T39jcM0G92bYC3ku#p(Lu_4gLC=S!7r z&wT(OpEv0CT#lbO0D$8-SWX`qaKebD)n%*Mg)C)bvrV;H#xPVQMf%@d$FAEa@IwF^ zE9;o~ZO>}4K-1c3Oj}kLQQ8jL?+47!-^^Yf8%`;5Hj+wl7QxeUN++W0|)s>+zA$>QP?i?>!e zeE0yCWn+4N|Afo5=(aju#K+*ni@vUg+dBAG-C=`oKOw^HNnU%%{f+SNZ7g<_b z#j?71o=>4*lEyKcYumu9YBm^pB6|J&MORKKJpRQaOiqlTYbsMy`*2;C=K2;nLqyk9 zdcBx1N+^_a%pRJ?>-*@sG5kojy3j5Rl9=^>ZZdIXnkSwE`2oB?Q(gpx1dr{J{KXm>j#YRb&a80AUfy(F_TD8Vp>QR=0~l#>q-WxNh6oP!I}&z;{kRH!}au zCF|bazN1ee3_9qgI%;JEx7#F$dI)JotJNiIECEpd!ZGpk)hok8XiQBy(#+gJ&kIL` zFevlEwTru*A3t?+{EvTrYm=*2hA+eai@)Q44FCe9+w5c>^!ES&002ovPDHLkV1lu& BI^O^Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/laserDesignator.png b/src/main/resources/assets/icbm/textures/items/laserDesignator.png new file mode 100644 index 0000000000000000000000000000000000000000..0d37e509a20eea984f624dbe66db91e72e17426c GIT binary patch literal 3114 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 XnsmKD3qr?200000NkvXXu0mjf$7-31 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/poisonPowder.png b/src/main/resources/assets/icbm/textures/items/poisonPowder.png new file mode 100644 index 0000000000000000000000000000000000000000..fd2d06b455aa5521dd49a407477e7b5ce1cbf74e GIT binary patch literal 3099 zcmV+$4CM2PP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0003-NklcFfvau^Y+LjAlR9&fE89$4YArpBBNhjR)|4fD<{OlycgbM9=`h9DdVq+9*jM z9s;hJS9>u&X~)0ZkT^aBZWLvBzr`m2RKO_!q)#*-FWNiKX`L%4yd$6_E2RoLch1wI zg3niG{GOASoH!m8*w_wj)3*r_a|PG^>IjbmNu-GFJIbJ#65H9B^{*NEhY#}WvX>&i zIH6V82;9bmz~z$S`ar(S`ad*#W)=NC&j@Uqz!0#ipgEuhfcT8o@LdKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0007-NklQkth`J?|IQC~VIJWGP&?c#rfu6;&V}I}So%5dKM2Vt^L59kJ z;{rf*`a)5Z+oZkPZpEi`zvUP#NNs_v=0JM#z<8yC&;`2C z5xPzg_^dq`PInJrnkJs-;Wxb)?EO}5t*uaU=(kk7 zBM~(;6(}KAijO zc*+jAb4_D^cbD&9zu}IQdHi}UCtT7E?yW3$-2Iulpi|6_TG6fRHjMzhX2|pH_V;I} zVb_D`w3r>WqJ_&gUNbgW-IKiA_t^g7E9dqyIxQ>#rlGc+KY*WPjUa}Ioj(8oOTgiA zh-s*U$pFM9@S5RZGLUpZ-IIgKKtJMrw;{kxSWFU8GbZ8()Nlj2>E@cM*00g>8L_t(o!|j%9Y?DO{n2Cm4hKvCYb^&z*gGdZuAV`e!62Zx3VMfeAk#X|_7Zn(W z1z`|Gx2OvY*;paEp&>xV5D|uD4GUuzyY)SO=-REczy@FZuqQc5oAW;B|9hV2ylGUl;?G9tX6>>nK|BO{CtJg{PSvfndxC8@IJ z+f=EI*ZEejA-rAit{11;?t93E!x^%2*EFACct)(eRFWpQ?cXLX*_Iwd2=9-`2%}UK z1tA1Uqs%n7socKZ%&F>n5iHRwQ2WIcMtuG&Yv!&XJkm&RQ7*axIsmR7{hRhnF3}?Z zfWa|l`Rs5bu6Af|S6MoLC}9XDy-_ai7B(lCXm-N~>Dk1_#`5-#4>1}wK5=h62tw2S z&$W7oI8s(86h*QyGnV0TMn)zK0w1tFH>da!F@euZc3Z(Q;TlCyK3Tp}js$cc|N}3y6csK7ofS{eY zCxA9uD;?iYr|6$l#D%|b|J#Cjd?HIWWuvNH&xM76TMCxVdY>)!EdZ>^_?Vjw4HQ%r z0N`qHAzR%z&N>4iL@;51lmjyWs5)(D`}j@VJYK~|XLbY7p?a1VK0 zzp-N0DsJ4UXXh_Fe0zq@PWX)=<-iQ`t~HQ)y$*nj6Go$SxEZnGGyvz8C4xrf$^28E z4t35R;K)Q96BeEXAnG-f@8WGuvhZek9SDIygOu*z0A7fQoIwEmnLM7ykDkO(i?5B{ z%|q=5(74Bmq9~-LrDL~O;cz%Gq=ozPLNpr;?u)x{SD-<>Qz<6YPDjuK0&=-{0O1~4u{K^O%?Ty| zax#~r*Xvnbyc!_Dc5m;!g{rE4vv-_zB0_@;_Xyx_h_((DeYlpRvz{XJ*hT;MMwE+j z$zuTcanX18^!|qmZM;sVmu1NzuMUwVo5o6jJN6f(CEFq`*%p~zmL=26vZOXz+v~3( z(Hn@A?bA7bsG8HWM=`qS47Qg>dMciI#8dID_Fh-qtAy^B{iwnZ1<{907*qoM6N<$g86=SvH$=8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/remoteDetonator.png b/src/main/resources/assets/icbm/textures/items/remoteDetonator.png new file mode 100644 index 0000000000000000000000000000000000000000..0e851f34583ade1d31de14498b4ded000f92348f GIT binary patch literal 2992 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 TGe_cD00000NkvXXu0mjfeR|5C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/sulfur.png b/src/main/resources/assets/icbm/textures/items/sulfur.png new file mode 100644 index 0000000000000000000000000000000000000000..78207ba1c75943b0581c35d0984f63e1614d1f13 GIT binary patch literal 3087 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/targetCard.png b/src/main/resources/assets/icbm/textures/items/targetCard.png new file mode 100644 index 0000000000000000000000000000000000000000..96e7f21e7c80e06da62816322075757c8b7ffbe7 GIT binary patch literal 1371 zcmV-h1*H0kP)WFU8GbZ8()Nlj2>E@cM*00h5DL_t(o!|j%POqF#Q z$3MUGayXnDh=2y_QqaQHPU+l8ExaU#*t*$r!)DqS}4oybLipPA0eGxxByrIKHnO&QSsX=?|Xm-Oky0e$V&we4pQ*^FmMb z#Qz~;W1?m6=qTBpv#0ismyabL)4P|9eYyf2`TYcDXP+RWU_JII8$ac(A~qr%fWw!rajC^4It2jG zFTRf)KGcTW10Ih`-i!f6AQ+eZv*;-7h>OLiv@tSo2?+@alrPG~X0YkvT09EE(EdwZ z{Y`PGvQ{XHWY(Jr3>|3Wc}E-<4@}anF3n8C5f_VBaU-RIF~Z0XIZLq_Y#{|ECk^0X z<9Mh&ja5^maJAwJGx6iCx9ERpA6t%ABMGec%$zK)?%EsF{jjwwXlZO^^W231A)R<2 zK(xsyYmdFkxBsRiE?mWTx0ODlNAcC{d8ks=^TO0{WSAs1e=(OgdHy|&h1iI2igu5p zwXuo9-1B-pr^`*s@;nri!ok&>sjIujU(Ie21kh3VSk-B)LeL`pcGtKp%vdyt?Zq|z z1MQ};WLHa1$b_H{|!t#$Cd|vQ( z5XAdyk}1gjowRi;xpAYO^Pha7|E4(+FoN>wY1mVnsVw;ufLYs9QM^88PCo;{m*0#6 zgUXDlrvdcY1I$^S%uBOQ0`TsD82#eCmz&7$k82SI0g3_X@r4G^AeJUa0x)mq1U6& zPOai3t5G`QVgVRmxD2z|Oy%-?|4U4VwOdwq8&y?FkF)DzJJ;aEBt%HzP62d;@Cr9} zqnRZ|&$283VnALm8X24N0svWMM;^HQyA?@RqpZxzkeN^Qmla!6BtUcZYcj`?D03W% zvN9_}R%T_$Xj3=dhPn!o<4BaZPQDW)tgZ5{MwcvVzp??Q?D1QD`)>EG?()I*oj#6m dPxOQq{{b}*Dh5~oOymFn002ovPDHLkV1fZ?dmR7( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/tracker.png b/src/main/resources/assets/icbm/textures/items/tracker.png new file mode 100644 index 0000000000000000000000000000000000000000..07b171691c470ad050921fdf80aa777c3a653462 GIT binary patch literal 7203 zcmZ`;bzGF&+I?}50g1sN6e$O37#gV=1QC>yl9r)ST9h7`p`-)>rBkFE1f;vWW9SY6 zDQWod-gC}9-?`pD=C^16v-kU~^{n-*cgF9Tf;929JJ$dJAbukANcnQ50{~nAAMf%T zI!e3mav`vh(X;~q!kfQ7I6!nPB>-Ggd?_jU?3tPM8*4i=Ya6;Jl9F^budPj9S{MU> z<9M8ksjA8RGNQLTgW>>(Zla=W_iDk_0FL7TAwEzmA5+V9_uU0# zO(IGM2knJZ`zGXpEI#@cAnqI_kqU@E#zDtLGO7THxB#-l&|n^T#sMIi+?NIbblhQ- z3l5&*h-x&X*lDAW<~iUMvu-cc9bX3HgAX1zozs!+6yK}ZUtjn82VR#)ewVeWoH z!FEeP|B8OJIA^_6)NLLNA7o~?695uJ$S$khJ#*|P$?fhI2r41b<5;V~ySQgyFn_+- zlVu|g0JCr0`p(&5MR(95cxcP>&-XWR&0Y{DzC8#qDTIg@1Bt8S>bo|-u#rmoP&PKU zxUew#v{6D^zg-=5Zd$KbtA1v25h$AIC{#Yp2G&eV7A$)()w2_^6{m{<@ zf)4eG+=;u!dAK!flpqP!33>tt|m z1TfIG`QB2xCmX^q!>#PEN~b16y(9MeiqJcq$K@d+tpJb5sZXUe_eV^jlGq?ov1D1g z;2p2Wp9y=7-f%|;lPAXXzW#bgEKne6xi`xUG9C<?pXGO_bGqC;xdisKRgGu&2NQ_Xb9)mOud4L4r=7=An#+oQA@vOgi0N2EOa#1cC%0 zFQs~>dtvFaUm44-@o55;;jF%6Urf(r@y;jTY+iB!42ClJoh~z#TIR zvxAp;D{soLPky3Ni0D=C?^u;yiC6*cIS>*1ka@QFnlj&xp#)Q!-gcnOifJrHoa zMU_jCdp&YF3KC_lromdm>Pi;Ue(lrKPmG_aSYfIenW>pmnS^S)Y8|S<881{&xsTO& zRpv7Y2E((|GUJ}Dt5B(!W{9M}%QQ{5Rz-Yq(>(LT(`=AyP?Y?llvtoQU)fAYXn4EG zk)7V0ILqfPhQE=qpli(4p0y(KjJhH~EHfiXNRsy{uX>U4?ne^@cs|nhF!qfC!7_7N z#IBqF)U7R+ITor^KDjb(V;%F%@Q84YESW5&Ea~+sf!vL>xYR1C3e6J?$-|bXOgc=` zror7;K}OJzwFkrRFVtI+%+7uqS2oKafrLl7o> z;xeDkc2ks8#F!Q@Lt%!n5cQmq{L&PM%me)`3iwa>>x6muyr|$5&y=QKr(kVqYiWmK zgLS-~_q3!t^up-E`JxXAI zcw!-YSBR4}SHQ}m zdir!@_uX9F9O1kRMI@|M*TyNSyME6*jXZ<%2D@;$xSX%TgO5KRlCq|g2j1Vg>2N>j zno~V>z3DwzpFp4QsH6@njlzx$tGsjQ_mE0{Cx#~86!yh3FQ$wSm2$*#lQF{ak9&zr0QN?|mgz-{J5AF{7%a$GBsNL^9Y zVjf`y7n&NYo78mqwF`x3#j|y7bQZN^KM2NdC0uOWsJ}5AT9V=;tIk2Ku~e1)N~loO z)(LxUp6n`{&vU$N(Qp1Gtd>KHSsUsRxo%aA&hqA%7j^9(b;UU5>x6387QIpH6C)eC ziW)G@>0XyPHXG#5<#ebQQcELRu$On zpDflNIkf8Aq;jeJ$@hH-t6h0;25+mzs^O@~519-ZpFBA!IzZ(5Wv(8EpIGYVC|KHV zw1E0SXJ9Bv$w=AY5Ou$ps&eo!+qyJK3vKmz+?E3eu>i5!``G3=sLdm%h1COs=>r;K z;c@#wm+V>a0IfZ>DK+esMD$Md;~16b6KwY(~-|*U$^QknJ781)Rs_FD}SGDcs z_^QW1nCVVWVBDuTlpE*K1QPqX#AVsAd-@f`daIoD&1}EaMZmI1rAW8V&bK!^h1kWL z>fh9(^Mv&**WRp&o`(%6wp7GcMCX?2n3rujR~5UM9IR5s3wBTLRXJ^wUkne$3yDou z?K)c@G#%_ulTW(6W;*Ncs2Fo#+RUj`tkl~R-*`ACIr(k~p?y9vx;5ecs@5TKw{JrF z0MFaA=R9OT7$SK!I4ZcqhuCL5{sCM_Xb$oEZ1prvvd5^0F`nZ5^La-u1v$*^aA6{ z0EKm^UejX$xUTTz(L+_o@$ZwC7Dhv;mhCN}gQ)_+8T_aH0_>`vzdLUfyqC}@&dW^C zV6J?1M-BCi?H0>DOzKlVtuOFufW`8q1R9u4dZ;CXPcQYwl6lC=EICtNO2wWqW22y@ zBBt=WGp&9?rDA;9a%^>ESrN?^d!QJvgMCGfxn}r=)3*cn?xO@3xZS20qn9{BP&T2| z@rX8%yEq{kK>>K!6^p%p1=*h(aVsrG9SpGoN=X1Z>msP_MZR0$;s{agj;|j2I_23B zKnls#U!_UgmoWl|GZd$B4nyY)p;-u6rgS>Zv;NulV@WZDB3F`L_`D1SxT0ySGO0Aj zRA8@`bq6lC`OetK*vv12KL>mv8$Aw@-Y>kLa?~1OsdUy_I9wpATrzd7(<$D4R*Fs} zG#e$j_P8osu>B4trIxli0pafQBW8K?Bs(QBYscwHd?KP8)Q3UEBoE2oIq|iVr%7GjABf4duQYD{3zVCCT)5OQtRiu(G%@7yal^Ep`Aswym}Sp zgYT7E7<5nDnkXql;VvRSE#nOGVqXQw&X8XFF;yC^Kn9D)Z`_Y{+v%-NB^n*wZ51%> zcBXlt2|EcJ!|%|UF>Kg1t*5c1&|w@Ti7h4DYX@^)p$~zyf)_v(0gzi$?)=#J$$EFh zan<=@?OcXfKG0{>9|Fl1zEX71b$u&f_TyGCB+?MCbVcK$>+RV#hVP4pUZPEQFD&3oXZ#i z)J$j8S1(etw`#+KODvc78{{-; z1#sgT61|KLO=anJ(K+Ks1r#L*-FsGDDmM#OI)~2?#_xcPA6VhLSXRSHEs#I!c$O%= z#4vMVR6F~asAW_93U>W>Dc@cm#=5zs!1F)%6$FdTCV)cr11;{XDp?Lwk2^80vy)_Dcsu(fqe8P4K@(x9N{>=xI zi{?GpZA=-g^Li#r?yE>g0}rX!dzc+bW96Gan8XApMm)`Xrn|rsiJsImq1SFg6!_jB z+C?F_P8!)aL1d3>_{JNie(1U)7fM3Le^k~A(N5_|3l8-P)l4V9IvRR8%1xY zVs4e`>dhpN2g$joG!7;x7Q61oABnG~+=$I@thn*uhM}Trw^LpGM1sv4SmhCxqisDr zllQQJH1wLG-pgjcsiRsE@unLJlFIU$2S2!M?>aPr$Nj~()&1WuEyS){vOP$E7~QsB zJtJ8Bld`|zfp(qg|A|S_W`g(r>|8^F>hMfn#MXW1^`ciCB`esjj&a!n4Z!3LNvIsL zwH97Nck=#jhJ6*$&6mV;|Y+O4vG8`)}F)RoxC|Y}tg{n(Fk9qA%#D zP3;D&?ZAN05xOX7!AS0O-j|P3G~O{kIvH~6<2o~8Y18XaLzdkLR*1(H)~Wgb8uMBH zO9EytZ$!^__}Zul^ji&srMx;oL*6V_uZ8XIKY!U`yXxgGp^ zjhNs4{~z}UC_27y(z#weTCNQJpR1Z4yIu)CvsfR$;HINvG;h#h;{Ch%78l9XUq;jl z^163I*-BEO;(N>|u8IZ61 z0c8s_c-eNWq{T!e=xv;0es1b+5wFwM#P1)FXFM0Rn&RGl=C|Wn zbaYbNIDeDBqzrW@7f&#!TsrA=q=+?|!S`u8aPZz9Dne_7(%-Qw+ZbxC!( zuHgsy#!td)IivALfw8Lz+^+b^52EGRvbY6;Z%39AKjQkiSYStzvJB_4Inp})&_Xpp zODhxneIDv?R`|c1inDH?xF>_xoG4}MW4;SVg9FjcAwS+HW?GJ= zEzl=#C&u_A4UXH~(@mm@CpUjsK(AJv@M0FUv2*3v;zbEyLQ_Vk*0*}Wc zJ~YugSKChs{%q7}07uh|tgjPVoi^uC=h!m;(>{7h{%s#Yd9al?XCB{Tq*cb1>tpfU zZ$HW-r>t<0+(H3~dtEP2Pp+8slXBpVnveci+5hrI=&&{*#;={!9%w->V76URXm?+m z4CA@BkjntpoHxz>&x`)35fgv~b5`PC&Vfs!1e$&9rlXUEHN5c|-QM0ySSKv0`g--m z#B0*{N$}OVNuOr~)JvBc3!wWBs%bD#aO%|dA?~?F5PB_%uEuf|KNSQvJ%hG`gO}$oo0q{jF%%itBILU) zH-8QiJHW)aEr;7Jkvxbfg0Sa7|63S;#=?a)5cb8GhZvH(MScT%g1YV|7%0XQ9SreO z!P$j+B5>N0eD`>`1loJR0&b_z|Cfkc!JM|VqsMtMvkxMjJcW#r*FU2$AvK*Z&jB!< zGk^VNkyi(Gvy`eOzclTk{Qo}Xcm*VDnF#xZg8onSLZ!MN7&qjrLNAXaGBcd0ICyXpY5)DCJ0 z4(3PKYX!7){EsXk4*wAk&tJngf^$_l`L9~b4^3J0zNLp`4}!@-+nc_t2+r9SYTKs# zO%*Dc&tF&|u{~hn%wO8{PoRWO&K3k<%xFGuaEokCv<-Ty937(f!?$a0GkJ-x+KFh$ zWi~c?#gT7KW5MO+{?gkaZ{@}5f8Smg7pO~JSh}N->+TkK$T=UsQ&eIBO62q2AkijI zX=WPs&w=uwUQ7FgVd5m!&ZE6vRB(dpp=+i11N_C4_F|}gt}W_vbW*BxT%9Tlf81+} z`9q!0V7-hQ$xg^WL~;MxL)2z{SKff^~iG{31Vi$N+gLV zJu^GqjD^M$WY<_yxM-66KcH0ea_=f zhb5<2I=M6{Y=HLY&xxfV6XopVV~?gV7cLi~KF;XeudR%wr7rIEL(+6;6r0c0hJ`ey zijmvJ>mb~Q6)`HAylaol=bGnVA7EDe@nas#p{gfRHXXg;T&~Mpxybxn^0)^gqF2KpgKX(JsdDaa&O@-izEjL> z#mGDY`9p1*iPpwvk4db}pub8uKXjc?0^f__8Ops_XnOQB;=eEWmusV4 i6J?`*gi=voOap1p1LOOqaDM#_2t1Kec$6!F^!Psly}xS! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/items/tracker.png.mcmeta b/src/main/resources/assets/icbm/textures/items/tracker.png.mcmeta new file mode 100644 index 0000000..dc9fcd8 --- /dev/null +++ b/src/main/resources/assets/icbm/textures/items/tracker.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":1 + } +} diff --git a/src/main/resources/assets/icbm/textures/models/aa_turret_friendly.png b/src/main/resources/assets/icbm/textures/models/aa_turret_friendly.png new file mode 100644 index 0000000000000000000000000000000000000000..57592e84ef5cc9a2910c4250044832afd9502a64 GIT binary patch literal 4867 zcmd^D^;;B5+n%Kxkq)K1c46t-MV1ChNvVaUyL$;~kP&omzS51kB^_9 zUqC=WP*6}vNJv;%SVTlbR8&+(}*EcXQFf=s0efzeNk&&^nv5AR^si~=%nVGeKIIQOiFD6sx|>rn~+kQf~ieOsV%?|g$;|h_M zkdc5vp~nH0c(}EW2GT6dZqMc-cIh=MZ98B88%Z7KzeDVb;Re%n!qi^r-BOEf1m08X z)dFcQ??Rr}ZMn3yP?0n(v52~4w4X2|3cN^%WxIoImivt&_m6!ZdM(s^k^H<_ccLu# zF*^8U`QyocIJ_p*mQJLgQdqIPZm`;)LdSnG8?$MqJQSh|DgIuojx;Y5J2%RAe3s*u zaf+?w*c~lXzAL7KL+hI6rMsAaI?`V0+){2=Hl`yo2z+vcvkxVf9To^|59$ZQYu;wf z)^nfIX6MZV^S1SJry6XI_$psi@sSbWgsuL{d$`i~dj|_l4rHx6>?}M`&67sYV8)Zh z?*-oI-uMI~04TH-(|Wg(V^hG%{^~R@72}xU@e)C}xuWTvPV43fLlK`sEt5yfZnDK5 z%_~g_r9An`Uo@ZY8ETWiwNFHPBN!Q)d6+2g`xd5`TrboL=xA)nOd^n4AXzjwp*BLk=VjPBtFIfTCqHhG$$B6du)g#O~^E>py!!scG3;#0wDAh-3vCXpl^}xMWg&jQ$~~zbge8) zKQh%+RS7K-i;a^IU9+*SX{<#}z21?Cn;^E*F=n((D&E@DUFT4f_Ftcw*7os2Kl?qi zpMT@(^R2X)3(}9w=(~czLGrHc^o&V$H+SQaoZ&wmIECyl1*O!B1pTpsZ!bR+_FhSF z(dS0Z^YI;G!G@j|dZe~mMGI2?+Fih1zot~-u}xZbbNe@cv!4bU+KuS+)YJB%a&hc- zo3V20D~;mU9lg~KUYXJNtDls|Gp6{p`(8?*R!cSmG&+j=XbqenMi*Zk`rfpqOpH0j@cpW%y;(|4#i=khb?_}N7!tf8 zPkmK)lLdR4++X)u?Yw(#)WDK5g8Be^mP#8l!nb;5HU1aW!T(})Sd7EvZ{{qT0n%Ts z>8C_PZM;@lzpj8brf&QGnBi^x8+OHNVQ!8wJ|R5Ux1VM|e5oXSqk?$&^gYi+k%#%T z$kro@k~bX-6F8^WxBI_=sny(`xpy+=ri`_1RxSDOTs0Ta>G=<1Rw19pbgN86y?qO7 zexwiSx(9v6)EB#+PCpQq6C4~;6_F@HZ zKj)%!lof_K)aZ_;zbRpN>OVcQ7G_}Vs+j5W@b}zwmi6~?oc|+$M)ht|nQg75Q2fOM zMswxy`ea&3jq~H*G!DOPyTs-`nOGU?5;s~u82WHFG5EK;+Qmyk7W)T})2clD3d|nV z1gxJowsNF!-mSR6&*92d@$f*#uXmEvUWc_e5 zzA&5XfD&Mp=WbK0?C)8z>@*emQNW=!BX;-bK*pXc<*`@>;F6I#_#L7;-_a(Sd7#J3 zu}t>NsA2Aqa{d#S=6v8j)GJz^joJ^o+|l;Rn@iIe^3T`b@^o=FEpy$Ji|*N}Legw* zJZW*JH7A)Wl)MUJy-L5DbWIP#u)Kq|tvHe%h^!Gal@sA~AA;Tc8iwTvQdw^w!K4{r zNko`UHbWrYN5QTxIN06Fru3M%n}livRMXKHG;dJYVLl(2 z983hDw83!weO%YJ&&Qa}p)ccoM~hn)D`AWj@6Jzid;&(Rjn(u57VHOaHJCNby?W@xb<{Bo3Zkc#8u7)p$eU!$Yi`Gf5E!Mm4b%#g{b zi5{NpbT=Uy)Id+gCML0}(Ce|OjUOYQKp14u_a^22;XVd!+QqW@urEhXbF^i#Rc=jC zHl?iLYF42%o}1{5hkxh%!;Hd1=l$W2eW*uBCVqFL4Ev6XpVL_uz+%e%*Zz(EA)@Ba zC9&uVydj<#()_J&jU+n-Iy~O-kb4276}RKuO6A#lhQG~kE-txocX~$eq_HEUa4c%H zB`4`s{~sPFSw2iiDdcjRLJR!Y{Z*cAq?sEv1r7D7;7^NL5ARgpQQY89DLSSFT9cNJ z@H-rt7MpjCGew4d_baRf{kNEk<6n{i4iq|hlEojs$A<|1sRF3f*c`yTXYFCo~wgL=c_+|dMMvkXheXf$%M=8BOl>` zzw#fGG=%hhScHS3Ml3iuKoV-dF`yWBz?sB?&x|h@JTB6=tppjVunJKQfPA@VE%z7U zHJf!c&n`A7MJYa?gWlS4wP)apyqfhD{|{=1uCCDX?LaV~PfQ2~U0b_OgsHf=%jj+K zd>f*nJ_qMNdQOY-C`drkxZUF)w^&;Cb4&~`K<^LK>tw%05&9A zFhK9Bjyp_EZ|>wIA?k>eS!p`%ga#x0bZVHOSx%#9(F*v0o9!~uVQGvNEK1Bj$==Fp zz5k^I*_lGm3^~ZkrK#i9FJ;$zlH)9PJu7qU{v_RRKreg)?5&oqm5xaaXt6sq&R$`b zrBy$<^{;&-@0r}3jsCn~2hP9T`c3KFei{1tVE?pfO0idimuoa*9xThQecyVY?Kc4IZA}B zmb70H>$ZbMBK_L>t#5si-&R^C2{b7n1EMccK#T-vj1G}528wrQBV~H)k4>0U z7#u)+CHOxuGaXoSBH?r!?^?js(EN<8a`YtFEXoC7eRx)X`O)LTmHPc< z5u_9euJPhbB3ptxpa~g%262|UC>t%%G+PnWO;*4ykQXk!{ta`p_?Ee4DWNndk0pR0 z9&;Dq*NK-(&S-ntMJ-@SZ^Ufb{A#yTs8B|MIQdfZzxkF9I)i#KP(<6gy-4K3#9B#I zFPy24LJUq295jq=M7$z;3cQ}aawk@e}&Y_biVGd}Y|5*7q6hPIbCy56j%v;z{5|Xtl zuA7a#CqN3frSxttq+r!rvlP!)bJK>N(M6?jv?R4flWf-aLpU1@FcZJZ^_7stZI!&U zXcb?z!y~&%RqR&pXmD%dk53eIF0)V(3286hLbiP>QA*C3*d@^57K=>bA+0jGmdk(^ z=mn?hQ6OWY*tX4-zNK+f%LJy93c=D9r%C{V+&NX>bUPFFsSzPLAAx;Qur!j=pG4To xGvPGD;z$#vjoFAHXnT2|a(aw8Ai8tz3Vhuwg% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/aa_turret_hostile.png b/src/main/resources/assets/icbm/textures/models/aa_turret_hostile.png new file mode 100644 index 0000000000000000000000000000000000000000..852b0153e079036457caebe0a671fb65929894cc GIT binary patch literal 4884 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 O1++B{G#;tpV*Ud(teXV@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/aa_turret_neutral.png b/src/main/resources/assets/icbm/textures/models/aa_turret_neutral.png new file mode 100644 index 0000000000000000000000000000000000000000..745c4dd665e15d4d8d74f7f62c96319c3fb42b3f GIT binary patch literal 4862 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 L)z4*}Q$iB}!eh7C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/cannon_hostile.png b/src/main/resources/assets/icbm/textures/models/cannon_hostile.png new file mode 100644 index 0000000000000000000000000000000000000000..e49e5fe6366d6a5f65985771303733836149863e GIT binary patch literal 1047 zcmV+y1nB#TP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m?d01m?e$8V@)00007bV*G`2iyt| z7Y;dN6mD<;00WmvL_t(|+U?!jZQC#yhGDzNeE}QZKtMNe;7zgIhoCurdwp523gBUd|2V$B zy#4;XKXkrU0-r2*-4Fl)fB--MAOKXz&}ra#!F65NtD4L?1LG1=k2wjbz*l|7@E7t~6@!i1C5B}aF$1GrqU@U?(#?6KLz*cHhtEkF+GS2h;lY2t77 z7_)v47GQA}=c5Qe_WkMrAOH{m2mpe>42ccarc6JJ6u?loyWJb7??Pz@V}2K)&>{vv z=I&|Cb}$zJ)J&8)nd)YVT5ih70WLrgh?=bv3%~_{06+jB01yBO00e+~cu46^Z8y8W zKli&)?kV{B>&LslL*{syQz=jMWC1Vn_W;Hq-mOS=x(QnKHH*BtJ7pk9fH2|9g}-Swf4ft zyq5)70G9>rTDa|I_wR13!1soVJ?RSU06+i;jREG`o1b#NrGFm}3xNDAfK3_d0Hful9l2_s`7-BR00;mC z00O{VK_I5*qgsDz{ht74V(2@7h8Uj!CgvEK26uJ-jtS}X^;pmQ0|De>&Qrt^;{v+I zB7g;0ficG+02Tl&0P3{>Q|||OOvqhZ=PP1AKu#85y`&8xDdZ%8vFiXS`~ml+nRpKDrY@-%o!M%Gdx`!Ln>~) zy=$HK*g&K;vHHQitq)mwVx$TtZau@4uB*wjLgow;+q%t6{!<+Ug={?n7oB*&p6B2q zj@KXVoc8v*_kP+_$;y9rmHhtG3u|ls+3R8v>s-~71&k{T*mtn?{dsrj zyy=5mcei~inZV`bU_3cuR?8vfhMt&&-{w;pEEpII7?>U~upD5#0)%Q@3SZi_Q>N$S zMsS0yT9rCqCvuW-0oYa+kVOn9*7F%my}W+Mu7i)i*L-bUSv#}nZC>q?3%l9`6xbOU z7esB_s;pu5|HZuf=Q!K0xdc67k=!$}hna&>fN4X51b0MT{(R$N3x$S5&wsKwWUz83 zoYP9uQ%vv>=+vH6YUPls-||k};msYZuQB^t0`=J^{PaKdVR>D=ECbkj2ca2?!IQVL zE}x&um9Xyk-L_kudjqF6Z>-}8$e75i@cF}(0?P;vhOD$%b9KIMa8cz?ebOMH!0B@K z-4VtXgfAKx0{9)@bM2ek?`d87|NA!Xx0nC^o3+hgu|Ufv8HP}6hYL{$-hTV^C*>;l zKaT9U-7b7?pSf~VRH7^y*jGqAY-R?<0?9agcCt)3cve38_Kvyzk6$S)KVAGLZ@KfCZ7Y5! zTP{6kWF#laow#7dwS6Ch_gS~-UX{H0zuf%YYH7PKcQ-a?%in%^ao`EdQ>1$L=3L%s62_^NlGB z`3&wJOXhO?etpKjO~s0kC`(wYB9MKd$HtA}r_u4#E7SAlGl)HxviP)HyZ(AZcKPir z4h4B@enD?xT^ptwE!<18+kvUlg5gzZ!_n`|cjC$fuWP5+Gq4-{T6{h`?d9S6O;WmM U9M1~x0J9;3r>mdKI;Vst04z17J^%m! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/cruise_launcher.png b/src/main/resources/assets/icbm/textures/models/cruise_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..3864bcb4a49e1d6ac7ac6689888fdf21625b031c GIT binary patch literal 869 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^RlY zAw%ze4>_O+XMsm#F#`kNVGw3Kp1&dmD9B#o>FdgVhf|VMR4eP7#9amkrl+1Rjv*Dd z-rlv%6Lu6~cra6Axrck=$#R1zalzVm4~#DaF6d}#(*D6G@^ZzdPhK*LL0u&UTn4NW zH@fRLeLQFMt!Dm|6Q|Z)oA&(a+1c~ACVM0p&D8lWn}5%w@G<}U-SL|o^pB_H8*gQ|9`D+8z7<-+gg8bLyX+a`N)d9Ev?| zi$Cm-U9#&#(#DSK*X5Hh-#M~uXXk&p)ybE2k}m7ayZYhr$BM`5u8+6NFE^6v-IVc1 zMKa;;+qc)ZPN@~1{xJ8)zqiNdCyOr(aZPEEuzzb?SN`32wcAX;)sC0y10@q?uU_4K zW#jin$L`m}oMt#K-aLQ$dF%IIjYOWUF+PxHdOxR(JA42CdGbjM=IA}RBP;d%xtV`J zil*I{4eMX5tTf*p6$d&{IVlZ-OuVkp^OkrSQU{YXTzT@JNX&YJ`3nnp6xV<;~ z1(V+~O`pH7nAmuj7z>nkozwXD{`t$|e~&l4w)^(&=koyJDK-n2uxZ?Ry87px-2p`m zd$`}7HRf?)P+$;X5D90QcZ$2VqT)i75kqbF>ga91|Gn9J<^Rv+pQ?&~+ORNWTxZzL zSHqF`TI=EEoNZtKD2B1#y088y@Cl{4o2q~eq~59Fg8>+Y<+kqEBNp>U-4Z%#^)JcTSvV)e3>;M zO58xM|L{J&2NK8c$>sjtU;pvOddt^A!W;~-3_D91S5-A6bsxCe9JBwSu&aWm@qvZw qi>E@u1869N1K2Md!1RqB#61xA(EFv?YEixlq`=eF&t;ucLK6Vv-+vSU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/emp_tower.png b/src/main/resources/assets/icbm/textures/models/emp_tower.png new file mode 100644 index 0000000000000000000000000000000000000000..e12bdddc567f6cd7bf3580290c067406007e0138 GIT binary patch literal 804 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^M+P z@V~@rhv`5O&H|6fVg?4j!ywFfJby(BP>{XE)7O>#4jT`H85_?*jx`JnOiMgn978H@ zy}j!=X_k)!+k^GNn~!Lx%>2Z#;n({w@@nO$R#`GkO6xS9beM)&Fg|!FLXx|Nr>W^IzX=-+kIAC|DXh{rry}LBV|a zkKTE?N7kJ_m|Xi&l!HP0+cWJM+s^Ob_Q&=&3)2VAx<5gTVQ=@ZXIj9-(ZHp^pw+;z zf&rCNa8>BstG%xl-q{%xI@RcV$vf@!_rJf4Jmxwp8SHCXH7QLYWkj_uz%v6rdhmfwR9A5IOThfwWcJpdgrhUsZGaT&d>hVxZtjy ztC!$Xmn9;B*S}s!cwD@6$&H+@{OZiP2kz?KO^u9GV7Q$ttoe5PhgDjFfs15f<9F7_ zELwGH$DKRThd-x?E|~K7e4hBmn|~@}AEs@t&yDD7WlgxTslBV<&dt}mZ1O&8x|+0i z`$wM8cyMQ`Q}O#-i6S4IL>s2^Gv7X(x^wB2j9JfOZ_3L(pQ9}MP57|D#MV+K|L;GS z*D}pL&|1#ae(&E$-epDS9=~|7WAh0orVFK&cQ*aDb9IsO{%a@m`}r@s-qSzz6S-G2 z{4c7wzVJaSFY{cUC=Z6boxv~G0z+}l^Ic59R7n8X-O2a7uh=g0OhFi=($m$?Wt~$( F695Y5V-NrU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/fragment.png b/src/main/resources/assets/icbm/textures/models/fragment.png new file mode 100644 index 0000000000000000000000000000000000000000..71e69edaebc6c7936b727ba5ed77196598b757ad GIT binary patch literal 2942 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%0DO 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/gun_turret_neutral.png b/src/main/resources/assets/icbm/textures/models/gun_turret_neutral.png new file mode 100644 index 0000000000000000000000000000000000000000..990bf9e5747804143757035609e049634168e072 GIT binary patch literal 33756 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/launcher_0.png b/src/main/resources/assets/icbm/textures/models/launcher_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f298130412f3735cb0a7928227a60e3ac43aa53d GIT binary patch literal 1623 zcmZ9MdpOj26vn^5xzA+ezGXB<#+1^o$I4)$89Q#3F*6l%$)#9w8Uw&)_0 zOBC8NG@-PvxvfaLyA%^i6rzlsL_40R-DkJw^PKaZ^Zs$pe{Tw#<%q}W;s5}6XD23C zsluhgpp?DI*1tn3Pz=}64oJH6#*_;xV5=h&keBGPw{%lFSf10a7ywk8mI`W%EZM6x z(fgfU?9tDW1Wk%MXW-lj0LW*~OvVm=--Hh>vfpimO`b`yn*rPt$9Fzwn#`e#MW0c| z3hepYzofdg$?q%hIux`7`v8FA)<iOmQ%1#1)I{nf5dCJNVbwZsdfZ`!DuH(p*^NK2q2$*AdlLOK8mwPIE;~d8 znGN1J_Bk@oQqOKM@PLaU>N}tX(-4=(VM+6^+L2)d?p(;3Ii@j!3oa%~r(_vZDi|6r&S&Jj~RjaXDyEY;`y*ubTdXeNi8<58H+FI@( zp(i&)`z8;*T!=J+5Nu3FM>A$UCLiadmVn=_d3FToete1n64lCb?0W*hYk)1n4Z%0I zw?xC5mr3L2oK91y5CTg-367>)35P8|jikyHF-g4yW=A#u@o_S5{ky)h`taKIv1|>d zK@b1u3EJ46yrMe^bA@@QE>qlFzJ$93tCqULYN-Re58f6^%R?dg;S*_{+**S7jkk+ z<^B2n6XObnRYYW@;eoewm00Al?zgkCl2BrqFAcdiKFTpC*RIM{?O-kO^@q3xj4X~A zxd2C8m*BcTS&OmYmhdQbyM_4B?3$D-cSlCnK+pYXNZDPplCs~W-X_e2oyeeo^PNE* zPvX9K9Km}`i7$f62{aE{nM8q|00#_J8@1IRh{g3so>6h$lCJfn)de0VX_f5s$L{Lt z3-A2{Z7cRQ-n2k_Bv~?H)S%@%2Zt6Hsa7@%#-#SZclDibvJsF$K=JhSFn4#o?L)K4 z&oyza`>i)l4UW)aC0^Fh0BRZJu<}u(y>$L*ar=Ym!le_pzVN zE>$VUL+wfgn`G-+O6f*bT%h@eb9bLweVEp2#?UI=_?fLkHOz;i3SnwuD5t|nSlvII zl4ne4bm0gq*R6Fh-u1;(8;2iMpW-_R5Yj8RTa?^mHt}6cv&N#tKEPb5Z8yMAQ4fn#@x{PqaUVL2&9u zX;g@s8QwrSE6Hj@QDR^$+-3ZwZy*Q5L;fWcP;VK%koBaWL6(`v$NB_GtzFEVf1=?R z4gG_E3}hCD`6a6vq!)j^L0)$av`FyguIX1N4FiJV%WjCKWsgt~Q9(WQ0?2}0$P!v~ zTM)8x;oVAe2@P!ua8$mt(sfd^ki*|4Mcnin&q+9Z`2NuhXVU+&=9}pGx~eCgw#oIi d2+MPQzd2Y>%No|c>ZLOEfwMh}DY5fQ{2Q<4uA%?{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/launcher_1.png b/src/main/resources/assets/icbm/textures/models/launcher_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6c0283fe926b3b69013e9d3bd0c3edeed5f3f204 GIT binary patch literal 1584 zcmZ`(do?yx*oUDiabyF{SYvdQcKaUQK2idZ?JZ zhs2DnO&X=VP8#h{>$R0flfsZ?&)GelJ!jA7eD3Fd?jQG_`_CuS)7?=KtA+&tC^|dY zd#@<8N;Gn%KC%uItq3f^+tCj2UZ_v3803Myj`m=Ar31!WQlu+_iE|1{0AS6dRl?e1 z%MYy#QHjoOdr*V&>iBJX{F3;s0LWK4+uQmkzxh;R5i6z<&q=iPEB#)VE5j+>TrR#0 zGF?7z=lH^`~*I%%lGOylY0cYQaunHWlBAT1&! zI&*BqY-}mH`Z_d`cvrK2JE!aBGl|5ow)=U?q(}L?&!1~vS$rHFMdDLA!S1(xJz*^* z{j(O{k0ot5#^Le8;F);ySz{(TCe0O3JEyjtNt@R11UH(Art5EEOdMsej~V@ZIY`dD z8&U8K97S6Lfvw-AoxDGcRG~y;I2!KC#EbVr?|0oX7@~)iS5%C+X)dUCWV=zl;#g{n zw^AD#UZS8jDs=ul3J67oHeoH_4F{VnpP92^#H&?uQ57cDw!ky9**2FnnUm-MI_45M zcssO~X;o5(r2k@%zo{?iAQxbIdGPH-+r0gt+5%40_|1}13`5J4b%7lWkA*zJ89B`o zZt8ew^0=sO*P2%(7!a0>jck*pAQukN5j?6%-$Hr0o?11+S_x`cj_%?&qe<65VNlL5}Xb@=kU&0vTB7qBTz z>*b$%@W^>Q5{H_rdhM87?kcz+ua22Z3dIy9LUs+|h9&bYY{m5gx$H&xLnw7HJvC^2QEWr^E zsv3EidN6?{43?wJo*?41{PLmFbzfV?4{nqNjs~5j57@JZoBd`=1`yW9qu9~XZ#5r! z z;mZYMbnku_>pol!COQzAJlVN6yq*$fqIPylTt%sjV=%JC;(b{TW&S0e?>*zr497J} z8$tz)qa#U^0jCojS!}xo5B&K@TK@O^WQd{qUV(o;?1bWhea7S|QTzZLsN{@`I`?f8 z%&BDFdDhpr1vWTz94pLkA0h4k-WYOmA!%Kag6L3F3a(JrqxKMberhL)d<2!YpG?c; zokW&z_`nV(5L#Nl>(9+onEIKx2N@Z<{YQG}_ntHa5C}`tS|6X+N4D`BQ0U$21SYG> z{q9s;>N4vZn=QYo$z`!n^=*bG-u}RLYevcye(dGCY;8d_r#jG}bD??hQVG8@7)+&Y zfYHnf(=RTDP#Z3On_}&JzC&F_MWsHZ{6U~Wl<3^jx4cZ99!BCx5!X{y1?I{Ijn zEh8*?R;qq9)e`<#KG$_V$kd1pyBZ0v>;&P_R0<*{itdZJ+H~3%fn&T!P%UI9-XGP# zd^~(}se-N9g`}h0i87a_xA7JuKW|Rryn76yDQUOqO?+yN}RJAyd zP!a&z&0heu$3FQ7CzS@0?`QW0vC-Q9K#p+2P8ViL7KrEm^!cmMA~jA>wC6UGMXvAu9$7$YZg_ zQME@+_mn-@+`)_9#X+t&Eu2Z{V-oJY6v{?s%IIz0b`3kvr^?a?x39)ck56v}uhSV` zxq$|f0N1s>Io&m2GVI6D6Yg33q-ATncK$+rm4t>qv%te4$5H74JkOrSbTiYeX5HND zsmN!Mu*~Zwntu$zK3Q5cxU52sr5ZYvtC<+HH4;i;?R+^Eow}=AL1%+;LB6ioy+!O^ z3@fG=awa?)cax!x9qs|BjO#Doj!lxe#v1@hVh&+DQ#c0ugG{o$*=Fu7Nus_&7Qv@} z_^cRB@lnTSr03;6VA9$OdoYKzV(U^$)ID67+kTt*^bk!2cnvx1oZB z(aJERv&xdbw-|lT^EKAYkerUS8*R%r3UhWL`R6Q3?X@z}m&R{KN>+sFYBHNS#*v}k zIxt>0)OX~gnGTJ7AeG)b?-x&^V8rLb&WYJ;B@qihy(A5C#>xh0o} zO%x(@B_9_>SF#mE3O=5PyK2H|G{2g` z*m=?_t9)}juJ0)gbd*MrMPdLnEsigogEINYCQ(5_<}zKvr@lzEo+ilZq=s6 zN}2qol&mAe*9$N~hQy7P8tI{E%3R$R*cc&A;z9|6x7EVNQr1dTgF8jyL^@{+tdwuy z(S@ScFh?)_*8aR+zS%Y!b5%4MDHK0XnF-KDC=MNhLROujnc~rl$^(pY=!UgVZ47>= zRSxFs{!>BZ78|Da{5wwWUS;W)IIq?zV*lGtt zv9lK#JWOwWWWoVtkng&ZB|%@A>7G}*;mMM&%*@2k<5Q9)iCy8{ZGVG&w!+3L0HG`O zuPn6Ju*VsWu>1JC7gu{?S6}u2tHa&LwuJdR=BL zVs|y?>}T1=p2&R5xOY|DDDO0DtF#X-^4|o3#7g*aLL1WLVrw>pEiZf-q-jOnvVF`;PH);2V#4rPSTOEoYv7$`08nYme1j@Brz;;;7BuFB z;C2{7-f30<3lW1t)Sm&?`)tlBpQ6%E0S;c14Zi8uSi#u6#s^rnle9HqO`EI% zKGl=RX0CS9nsTQ0)POfq^%0Z%80k8!3=gm&IDm!u{{g=*`C@TRzw|b~z z&c4$QIvos~-rrm*?6BSf#pT27MPA%uJKcm!`(YvXVD|i?$oiQ{w<9SsJy|a3b%Y8J z>ew=LugdkPO)M%L=y4GSAOk4p^1tEEtK>b(4nt5XxdF~XSlAmCphkR@!w{=X8+up# zpidR6_#b?WjMGLdP4}%CfQz^dcn}|e>Y5Mz*5cUZ=#*bQfb;e{a;o2eEq!kP#V9@Q zL$eLR;N3N|Yewx4^p%+<_|Gos{sljht`gN6Z06Iai6!*4r;*v!e zs0zdBn|lR{b#@F%_Mr9 z^T$RrQvy)>k%$j9j!o-Nwe0?v2kPq^HHg)c2%?VV*UtYdQB7r-9p(4)+LI@OzFh3- L=IhGbN4)SS2Pfu2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_antiBallistic.png b/src/main/resources/assets/icbm/textures/models/missile_antiBallistic.png new file mode 100644 index 0000000000000000000000000000000000000000..ba48a20e6c70db970aed3cec95165a2e4163b914 GIT binary patch literal 910 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^RlY zAw%ze4>_O+XMsm#F#`kNVGw3Kp1&dmD9B#o>FdgVhm(U*Pa#0PekTJ1GoPo6V@SoV zw|8yJ78{7PB^s)8d-~tXNr>7s`=*1L!EVl6vkBL}-0WO7!}(FcpJpDW#Ch94b}DkX z&$qii+VHaJCC$$8#gr^dTy@wxcbzDx{^4Ga!I7kDsN-&94qW{J(YH zyjN4cX)|%0+O(;`W!ADzubt&j7^0VM|6BZisSo>V?u6dhgQ^1Y_3zwP#eLswa+Xo8 z$mUQ!Cllv_1rzOS>iPW^i0moux+z-YEw;hs*NjQepIgk^?RS9j3gf=Y>O6hDQ%~&r zL|F^&7%sQc{9d?5f_cvC33aV{&p%#DZiw||1Um3&>diaHH$K)$SowR#X~SP{5^_E+ zzf#M(sbTJ7ks9U0t_yUhHCi%Q99a8BxpuYkeC7o@>=COhLR8HrOTC@n&3P{N_`Cy) zr4BlEE>DbK#Nc&T>|Xzc_w`x7jDO94{r4_+!phu-!P^^)8)A;_nK-L1_WH*ln+;p@ zg-$XFS?V#&y(Or_%ffia`1rQ{S0C{+s+{|2*d~$O@qFK=T8onS%LiwC=49B^u=YY} ztm&D%!S&Bz(aiu4dr<5%Y_N&vo}Mg!*Q#dU{SV*uZ2#*&jp<A<}vhnKT-6u4QExEL50l&rdP^}wAO zRu&LhSTutZ8bgAeTD_&nGKQR+jCrwq&sbzY2EddsAV2`qe}+`KOAHs!^VNbxJzf1= J);T3K0RY#eZrlI> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_antiGravitational.png b/src/main/resources/assets/icbm/textures/models/missile_antiGravitational.png new file mode 100644 index 0000000000000000000000000000000000000000..ec2280f7f4d187c371983bd508a3facd9bb6eae4 GIT binary patch literal 1319 zcmV+?1=#wDP)Px#24YJ`L;z|4Y5;1&<`N?S000SaNLh0L01m?d01m?e$8V@)00007bV*G`2iyl2 z6bJ_FQ{htp00gH=L_t(|+U=abZres2$G@}%6dK&AcHk_DmOg>dcW|RYZ_o}I46$Ph z1ZWV+KsI-4rKNs@3{?TUe1a^7;YC1z4g~{r5E?X-g9;wv>tIWeXj0-;q{O2>A3%Ue z{y-9UU;h5wk>@FaR;y)XL9f^IlshJJPu>cydCM!kGJW+WNli5+Nz>ae^kQZAk|heaLasmX9LCkkKC#cj_ zH&KQ6)z^9NTygv3o`}BsN;=PlE9j`@fZ*S7Sru^txh~^Z%o#?Mz7bsH#lTNtL5K){+4$R zR007k*ZJVQ0DRvr-rCv&RRFjU0@Av6TYFd^p6xmS_Q_h0fgq{?a6Sb1zHb!*Z0vy~ z5D)+qItd)Rb(AO@ z;#UG$JY&g6tc5t5{M80MHImQ|HLcpdVs9^hX()z00;mO03ZNB0Du4h0l<7J zjMd`-0098NMv^-Ir+sfA3`0rM-u6h%op)+Jzt;6XHwsRw>R&z9`%hI#QV;~>9z{q3 z^El~O)xXtg4=3B7eX*tH^J_KrhdM|5Iv+it<;$7_>}`)`IzLLMJ=EUzh?Xy_0Gd1R zGO+A1cYHY8P1)@y6hlF0fb?wTCJv9tv0ta)@28T04RDD z00;mO03ZNB0Khl^;{bR7a7F;rPvD|~n|0U$9sm#kWQixqIB<^uu&$@e@C28abZ-Pb zP3XjvJ8^Upj(5bGeWgeOPbBk;(dl=m@h+lmWZFi9!vQT?)+(U=TU(8v8}UB=$kXs@ zsMl{_)1qY*z~Ha>Pqt|rT@EjGSU;piH+3A~$(K*`;olFmXep}zn<>&kwIgO6WQI5+j_Uj_zdB~KT}kcwMx z@A{Ulau9HM_)OM(;zDNgiH_--YtAk`p)kAPfx&5o$tv!ZUY{>3JSb0RYC5!a*D9&4 z9Q+-I*A}vehKeRCCH0hshW1}O`{@>6yR+=P6F+PG_O@Snz5Dl{dPe=T=QJa}sqg=3 zW#!To*TJB~5awlD^t*}Swc6=`4cezS{rmH0Pvnn(|KyxF7M}m~x30e2{`ljK1#5X2 zSF4s^a%~V_$u{ee$#1Redpoz4UVknB#rTz>v$LSn3jTKI&qx37dnt3;y}s$%4US!6 z4+4YNu3EJy_pS_62ZQie#-b~4eJ!Pwu5{+?zg+m0F;0eQ1=9w%pq=Lz&w06y;rZvE z`i;MRUli&2t2!IcS+nbXXP2R$)!~`Oj%S4!-^Fg2b2@(JLh+q%E3dwsvf}+N*&^{| zp5K4}r9FIF#HrY#b9#5%qNSUzxCQ+Akulw!&mh0jV!Osor3UYvL0wAcQzjVioVjX& z+$8@O%sHAjZRX~+wLME_Iv}v&W#WQB$t7B>OgtyP{mwHFExoXP<+qGem0^s_UR3#B zO^>MhuN29)Y;}jLd&95exBSGHA1<4{d-ZbfihR+Gm(C8iQ;z%3-*>$%`pge=X~tc5 zo?cF!t?RwvCr3l&Cru`m8^2-?N;&HHaTpZa+PP=yFeTh&Dmi&;^{QJro$5>~Dm&t) z-|AC2eTuQF^vAq{J5DSNj1CMZ7%!~(yno+5Cl19ud-vYGTXy2tm4D0M33o88mt(x; zwKV4R#stPwo929BIR5xzkHr2qriW+sF;@6^%l zV(59g-|Y3~=)+O_+dz&uU}M?vGC>fFVdQ&MBb@ E04I2Yn*aa+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_anvil.png b/src/main/resources/assets/icbm/textures/models/missile_anvil.png new file mode 100644 index 0000000000000000000000000000000000000000..622bbe52ccf9e6659e96e72bd45e26b0cd3625da GIT binary patch literal 4176 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_attractive.png b/src/main/resources/assets/icbm/textures/models/missile_attractive.png new file mode 100644 index 0000000000000000000000000000000000000000..1a4003987e3652b4831ae95584ef14b670298e85 GIT binary patch literal 1846 zcma)7{WlZ(AOCEO8S*sGV(WI|#zl9_S3>4`EUoVHFuAcsk|MRm+j2A#{6Z-J?C9AB zVMQ*eN0OoigBpk=Wt{z*y!(t3#199k2)`#2O)W#oJ!td#Hg98vtrtW zrV?!vQ+7fXqoSXOdmBmeH^O{RXe}k(@Fhtkm_BD_cH|^h@+&fF{^O}W<_}Nv&rEN; z<=&ewZZDc!ldVxg6176)@`<0^lNX;ktti(h0Zi}p%?|RoQm%1c^i6sCtAO}?b{sMi zq;5}91idr1wE<`dT*ITP8mw=A&E;`7c|aGme3Y^9#XYN1+n6hm!w^rXu0A~`=fla( z^VXD&Hhyc?%Zy!g0-ZSPR68oI@6%M)WO*&czm6}0#`n7gK+4sIMIzrCLF+;`W`sY> z6D1ZK$|lA4petX#oOL-DoKp80`umwF5ih(9j{Jg#jbR)3u?_`o@IVBS0>O^M>@;W8 z*my{L_{HZ)$6M{k^=x*7y4%mHKRu77`=o|@yomru(U7rB`;wDyK1K!cW7BL4)+oug zio#cOjm-DqT{(v7S5XZ-sATynrdkpzy)N{)WTjf-;<29|OTU7o7sG6za28h|jdjh<8o=4rHIUp?ajI+J zeocaM9ggpwb_DZy(S&kNYhKj(S|(%5log0i3TarIyL&fnE`fP)$bxU20aVieprv${QRZDK+Q|#7U@=)())nXdf1;%XGbF7u43%OmD?4~arCu#(Q9_?H{%Es|}0EAyWYA$G0O&Z>un zg|#eIw&}Jj5VDa-rFZnn-ZH-VKV-*>oskQtB|3^CAM;#*hk6I$k3?jg|G~v&FUsQk&gD;j zW?IEe14|3MruZJYZBGfoF)GL_;Pj;{nr{U_fdbb1Bs#bomK}#oo*6M^C7jhs6NNhK zR2p&k`hh?HZaf4}#FHFNkmg=?;XCmCk4Vivt&_SHl|4O`)HEwahQ5+sja#oZbvAs&O?7<7QW?kW4-Z zBj{jkpyZdTb)+m3`8ySVd%;_fx4Iv}tGc<$Fg}P&9Kj!#KB<~B)5B(#s}a2r9yj^H z@qaPinr52f9K7{5qkpT!#!I{woF}Hzh3~=-TL)LzGScwbM>I%!&=LWngEsmTn>Tc> zl)zBEX8Z#hO zNo{+{3)I>2r0Cu7NvgL`-H>Y`o($E3a%f^2P_~) zy=z#s*g&KqF;iXr0n5wa-%Pi)wx49(#D3$p!|v2sSH4&}t~(HRF2y!Zn#bu-P5ooZ zX5E~>Hha}mgb#}bc{$H;yk1&(>R-LnjH~xz>e>XdZPqQdJFaQZRCd-`mp$mTWSLFh zW63RBjsMrrcV=N=bYKu*U^!qPdcc6kxx=u{r~mpr`&VsEf(pgY<7-_K8NJH>8Sqps zF!=a8CwkrN;ij*h3of5ma}C$HH9Y?wvf`=UYjGW>o+pnVJKNmb%+TN8?|SR)?|BTS2~lC92Axwb zC1{09cBryeyxg^Z>h9+!_R1n68Qxt??FJP$R;)VF|F_l=JTGjY824*9uoig)l0BOlV-(onC(W(BhZvR;&^E zbq$Q6TnUjs≈hNB+1sy)j(7LDDJ|q7bSclVaF0cYW)OeZKNr@guLn8xv$MlGb2;NJb8a8MuxS&+z5+pqooeimh^h8wnwq_;K}X<- z00Yy4vPV}|H|{hn>0rRLE5S1DzlBH}LyjfWohr)+6#;PQ&VF_W?XqjHlV!?3 zZEt_~=JWaYo-7)t*1uiuf9k+oXHeMO(4BOEcZ16|{|4)|pP%ouXXN_)?VFgLy}k2g z6IZ#X46T|sfBIhDAz;$}u=L)4?W5NPiuoB2xc+0}T=>|^FVdQ&MBb@ E0HOq3qW}N^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_chemical.png b/src/main/resources/assets/icbm/textures/models/missile_chemical.png new file mode 100644 index 0000000000000000000000000000000000000000..57b0259e41ebfd1acefc507ac4daff1bac921875 GIT binary patch literal 2155 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 V|M2=TGblSTc)I$ztaD0e0s#BwcT@lX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_condensed.png b/src/main/resources/assets/icbm/textures/models/missile_condensed.png new file mode 100644 index 0000000000000000000000000000000000000000..2451391e2fd21fa30803abf63ddca8c669ad3e1b GIT binary patch literal 1798 zcmah~`8%757XFf;LQ*L~@mZ>Fts{17sUU=yWJOIbVKpJzaC0LcpkSGIx%UX5A{%~KNU>w);L@IcoLaBHv2#!9Z8}b z9h?vBPVzC^-JCNUQONzoOJ>*Y@0d+>9~~aPdprH`hGJ^ud^QiX7~8MNfTF~y`9S}a zNZA4xLv}KcLI9AmSMTTEuSkL^6u|~0HCYaR_ z4NL4&_?5o+NI|@zLq3rx;$5g(40S`sCM4t(6cl7&{QkV@A$mL>=R5nfNkx!eTB;pC z(YhPV7Hl429HSD;m0is<(9J|*;8Z{)6L}yhzTy@w}!3NHOdN>>)3@34k>(}xrsw7a0XlB%W zaWIh=TI4?Ji6bTFVFJ4sIUIY<1y6`y^3iRVw-Qd(C*PvUKy0zhtiIDZiS_k$;_7P+ z>hQ4RIDAiiR(|vQd~A_SD?&%#&(H5$DkVB*X;TUQfUwnMhD{p*WJeH8CewF+cM1?l zRRU0C8VjZq`U`Bt%1v`&Dw)dIYzua^5wa-?8~O4QUnPL+T(*`?k&M>Z z-M8nrJ0;Td!_EzJAp=Sw}iM|l7y z04!&<-TIhIn)M50Z-ZkU{vZer?aO8EB=qDr^OyqJ*P8NyytR~Hji5`WQbtmd*y4e) z)aA(vjhZ`hgO_#c7$IB19I;RL?d0+R0@T)n;Ha1u@tvuuh7w)9=hLFSETZ(egaSwq zef9Ga#Ti=_G*p*W+`s%zs-y|Ru>uIee24%Qyo%ow`& zFqkn5b)v*p(Xuuo3!$d5?_EdJe)4nmX|r1;Fvq5Xa>3gK=S!8RWi!XmJ|w`(d}dBc zr76{;3a?V%yv9;u3IB4bcF8qrFdz79q4I^EXGVU2W|w8efA58dNqxBtC02}Tjgh)0%T8c4s17o97m8YLyC-LG znKT$=H|}@|*E6&3FKbM$pwK^T-;;q3u$5(dMe zPCHihM~=N7%D0H^$WTK+FK)o|H69l}Nk_i6J#=NRcJ0#F^a>$Uez3xTmTNB5mi8tz zZD6vumD%>6UXp51!M*pz%6KQ^B9T#Fq1xXWS1v-Wg(tw=e(%Q1KY5HsX)5&WoVSk= zTezkIz_F3>a({$bVtQW8^UqEP6-lprM!*?TiPr@dg_6XUTXL}7H$u5RcO|}EC6u-B fne_h;Z?+ZXtkI|Q>doExPYQ6bCEyyZgVO#1fOa8P literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_contagious.png b/src/main/resources/assets/icbm/textures/models/missile_contagious.png new file mode 100644 index 0000000000000000000000000000000000000000..4734e917b096caf0908429370773424e7bf527af GIT binary patch literal 1605 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_coordinator_on.png b/src/main/resources/assets/icbm/textures/models/missile_coordinator_on.png new file mode 100644 index 0000000000000000000000000000000000000000..2a5bad3c639dc314e65b70f2fc52d8c0e184ed95 GIT binary patch literal 13747 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_emp.png b/src/main/resources/assets/icbm/textures/models/missile_emp.png new file mode 100644 index 0000000000000000000000000000000000000000..7205910f05c5e2c2d8148082e745e1d5d94414b1 GIT binary patch literal 2091 zcmYk7c{tSj7stOdVU{o>OTuLg;ZkN$YGj!-3^l|^*|#Z6ehnGP62@BgBFdVjk}LaK zhOuQ_S%z-7BU=)xvHXT|33uu~zvVg4`JCtT{+#oC&g=Yh609tVB5)Zv001K9W&|=n z(tkKqh<|n&y1(WJ5RFVU1}X>TmiQMTk8?xdEdl~?UcKvV=%kSA` zz6c34w=jXcgGoU_vLw}pH+-esoN)R=Fo&D(OcS@2X6@xtIgI1s7RDN74JN8&y$e=^ zxjTL{DLSDsgTeD8Cf+E~73GST!w~Rz_xmuEF!TbdUOiLFc)yPgDTn9DcnU93k=abA)y=e6tU}FSc4KN1%e7ziF z-JYfAkm=d2MmK#Dh`tT>fT9k|qmCK$*WnR((q~Zj?^T-h?~2dBm=MBVP26shN9Qo;R(aOsV-s#di>1QMq;OjCx=)Pp_) z1R|pPNowP0u+!4F^C{*jhLNZ`g!d7L7+9hr9S0NvP{DutvKa&Q*{;@a<+1-EAUu+5 zU-fr3G5~x65$s-#`->o`0o^(*V(I$BZgGDD`e^6#8(~foXa7s}leq{m%akrfc4r%g z0v?_SD-DJ!%HaRLfzvOj)7k4--IpQtoJZoJ{~5{8Vry9!>DogK8#QZVth7WF-mOdb zo|ynp_}KZRTvq>K`q2p3sHdqd=P6rLPE-fNAMyYCKOP@dWVQHWcF+?MK;EVm7Xj+O z5Fr`F(QB2qvz^ZfXt6))kdK*wZjse9s8Ec^wQ)DBTIXPwY?D1#BDW$4jxKJ_AK4k@ ztbK4ucHLxZqOrjP&Utc<+k4rik0QS}C~|z3L4m~5a~<~$d3IGnImzI}uv;a!=>ew5 z&S37b4Zu_TR*8%eh7R`{=u=U-Et*szJt4UOypN=qkwYkpZ!O;--7Y4c-!;{;uL_c& z_n@&JEq!O&%e0`1DD(8Qkt`YQgX8_E(1vn5;FApVdSZ<4-13>Yv7W1!Hde?xy404$9;RhDrg zU?%%dCeU-jJIRZaYXdZVL}x}Y`|=dO=rcU~H{|0Szq=HTJ)W14$t7wE&eY^c(MvB!=Y>W&`?kL*Pk5 zflERTM;@%rl1X|-AFlKQ7#@Crw+)1;q?wbUM*2_KHyo#Z}jdvRx+1TVWR zWl<~8#Cke0g0oK`Ct(CnY=;BCU0Ix@ZVEXy)3o9t88F6Q_84-)k;^Y&6_W$)2%8=f z_#8jcHl;9CYj0{mwO4at)eRkWFUF9tM?&R0oz6I-DCRe-hCiWn=^^*h%lv4ToZd{w zX14v8U3Sv8_#Rr`q5|F?{o#8pbpvMKfzS{Ei5#X^85VR_(9)35Aj((jfrN4GfIsCN zoV4}AxT`CHb1S~r`zI~XT1?@4;?+&|!`z#NkW^n?NNzu^$2u(C7#V@%Pv=XDj(GDofr5*Jv12sq3&!!tAq@^ zx%KFpyHR#x)eRrxXd8ACr@r0<*$Dvs?=0IrYTQ03DHLbGx)(<5TpXfIvSxDpJfZBQ zN^VfFYk&u?HConaNHMe5xYo?S!BK0~0kRc8ferDIr`eb*&t)?p-kCK>3yPbcD*B*2 zWtnF@g%Z@^NP1lio1Gkt4n zK??uwSkB_Lj$A$M>!rik5q&4hs^;ZW>q8vwCRc^hFCKEnjIXgUX{&v^nkOfoH{Z~V zpD(qybIf6H*Y0lvscI^u$V}Pvc`A&CY~`8t=rmssmGX;RCVur14M>XRP4~Mge(Ihn z2qL)@u;#+f`O3F{Oc$G2Zl9SFB{?O#^YNuTd77=it9QH|PJYdjFZSydL0wy%_6tS$ z&j(AKSqVWo9^IV#B6qPCJkY4Jo>pJtRV{f_)3ApPLU3AjmFHd~!GE2crm!}%aSTS4 zcoU|(dKHyYnjp+p?wD;X_F}{QnBw?kFjjjiLbWnK?^WCRFkbd8%feTRC9SOZ&!t{9 z6hBoJ%z%<^YwQOPDI{3;fn^|48^9FZHU<=Irjz-Wy|DX;w7#nWi9#4DOnCA5 Pn;bAVu_RO)yG8#EPkN?E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_ender.png b/src/main/resources/assets/icbm/textures/models/missile_ender.png new file mode 100644 index 0000000000000000000000000000000000000000..5194ef6977612c1b17ae3ee3a4482334c8074eac GIT binary patch literal 1977 zcmYjS2~^Tq7ykn$F1eBAlA@+*T3WV>OOj%0A)~e^n!D+^W#T@#P->P~xRtp;nT^Y& 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 bd@~Frg9+opsjjIi%Nr%Ky*sJK&OhZpF1=9} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_exothermic.png b/src/main/resources/assets/icbm/textures/models/missile_exothermic.png new file mode 100644 index 0000000000000000000000000000000000000000..e5c45d47cf3a1ca150289af59daf7bbcd0c6156f GIT binary patch literal 1885 zcmY*ac|6w>oO|xM-#^aH_H=jJrF=jc z0DxUC&R8!w(sm54B=;@0ft_*yW4)a0fzlqG5AuytkgF3GNSCjGdV?2eIUvZ+KCu9x z+OlI{8;N~cPQv0`&YXsgB2aq{B5+@TR`P>mF4$Avlo8q8G19pZoi@9YNG)xL>EW(p z!-^TE7=3Mov6ZIEnaA0t|FSpXx88|~tc=`-l4{KR{r6k&$r=8p0kjIGOLV@=L&Omk zdOq(;Y)*guL1X4m(xeL`Zi)FXKsPObn?18j>Ep@Wv+}s`igau(- zqJ-`w5~;_wz*&*DvW(1Z!KWZt9VA|dC0i=fSkP3>+^6uj*7CyI;e;c5ajx-yZsr#X zW%qL+N6ho8r`<#6{7aiNE@Wf%Z&a#zCxDZO{MqGEuO7n&tD_FreW1+SR=5<9ek(k4 zd2Dm=bM0$)YpN+jm+G&+hf+5+UwjZ^wxKvLEwSz|n?teQ&)~~DLcr|f4TG03n@VZW zER1&*pj;Pm)51i{dfxj1=@$SS$YV{&QbV%AS*=drtL^o}Wn`p@b^64&7jH@iCi1-} zLNrD5qM_W+0o|`)6T&}c*96XFnZaH)_1cfUV(appcZP={8Sg| z`Gb+y%vN-(iUy1|tsl3ss{nLX0}6%W;lrX>k-f=6mq*GN+EowfiTlYv{oXj^Qz&7r zcCvcw_+mK{;?cCFA2pOWuG)70&x_*2VymVC@(VwjuV@M!wt!5K=p?N~b;l^KP({jj z(u$8-ESn0swU4!*rCccxwO*F>3nWg8Qio zT)udH4_!C8W>CC%K^56e#9MB6@x>HZX!MyuwL^K0`J*Q|P~yqJr`q!i?PAC}A;@l-$@ng*P)Iy^ zZ6Pn3Za{TJ_Vp3cMN14xUOh^96H2~=*5D^|+)6%wXnV0305dvqswHT3Z3f{WL}%$R zY{n0BY(|1sFGX}w&bLkH)z3Yzr5X~Uqj6v*@Z-s{Q*CF05w~@}=A6D0SlZq7zEyAx ztu({%`yANoL5`3AIg822AfAIQq94K1(uU{qZ1|z64tnv)a=njkCGWaTWTilS7ry48 zEp7|u`-V*F_i?GcL7=0U!)a=SuO(g=PFc3ZG_~%z7JDn0CTK5Hv3qO?w!X6^CR5)$ z&xU$A1&huVC4y7Fv3|5amdF!&%PDt`>Fb<>g)w`IlukZ5)Hu#S7@jSVdUsg;4YSQXWGnp?Qe)>)4lJ-@8fci!)fQF1ouRof1f~*`V&g zljW6-C(&8aSHd)&e-vZv%h$TT$|+8dYP?M|(SGHa1HCm0I@!5u_8TuW|4K5e*&ht5 zdnDGnRjmclaA?njQKc#wfg0_WqA#<|fkT!=<_~3Dyc(`Xwvs8hLkRYJQ1PPkRxr?s zW9H^c8i2~XF3|6BEBPHjY4f%!iCa;I_W-lxz`z9jr@_QQ@g8sZ zbs*+}A1_jyTKzi93hOx-(rJH8J`0;IH1#x&A$O)`x|%(F#|gk~1(H*BtaEMV=FZ3H Ma@rkRYEPj58>xR`&j0`b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_fragmentation.png b/src/main/resources/assets/icbm/textures/models/missile_fragmentation.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2b58ef70c6e1bed6b4a4c9ca9d3ea7d4a4d86 GIT binary patch literal 1087 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^IyG z@bdIGKY${f1s;*b3=DjSL74G){)!Z!AbW|YuPgf~) zookqP+d#zOq>^|+4I}@%lm*cjHacu~nz`#6Uu;pI-d^YHeix+{Bu|VCHu=Gn)pvl8 zl{b7^N|4Y=|Cf7@x~jHs`+xcQe-Ym7($+;9J+mAlr`>w~M}4VUuldw|uguQ%+3UVv zeAe3(TCDuE)nn(OH?KE@2jqp<-T$q?%)kVJ2kK)R43BB7-OBZ);_dtFLlX>`S@`~4 zb@$M5IQ2j}xx*pp%g>NnXBGzkvF|-sqT&^`vk7k$%`~LFkHCHdZ0yQ z*9s{G)=Sw8Mhq5(7BXp~J65gIUlVFt5q ze|hSp!mm>kpT|8cK3aNbrFL5q%Z_?Iq23s_zYQlD`egduKYg6VdgE=G=drb`xENIq zY|@Es5O)ofm{yd@oao0Wck0uY;_clRjyLi!Z~);&fz8?#KH?6)J=hv7Su6Hvv*({` zvE$=pwcz&&pWr0l-omtm!$OE-4%55&-3M=PTG)TMYj;D$`sQ_wdN7A2d|i_ly(8_X z<1&Vi*VqjlmN4XS$M0m=xUF@4t@Mrv#)yTBxfxgpLWYKqbIg)<{VU1-{r&H)^U}Zm z+Rra;lwwdSc>H_u*>5%L;*1y+7*gz6TYeqZ3--Ql>7zT5^#QXw^M!SR&8=I^1&&~#S`YW%_jq}DgV`k&wEVp!GsPLf(dcmQHN%7B&)2`#e>GuQrq%h{zn^dY z{6G8l*_ZeC*Ik*#vmxPI{&ycn@ATbwt62Bz8!H?*r1E06)EX8$C4~d0mNT-PXjr(q zY84BIg2?P=uc!ZVYT3pUtdbDE;lhFK&F_t5Z+!m0wYm4c)qxxO?Ow@mcI|urIjD}W zHvG>|tA=8>2eT%d-#^}>-_G{z?((%WH)j;r{%hB-eyk+!nvj-z`;BD72AyDq>nl?V znLOssifJy7JKN5)Pd5F_v<-K%8L}j^7#6T~_+PL6Z~61*-|cG5DIMom-CrZwP#5R- z;cfDnvWYwsW-QCpn^y38dR2&<#AlhT1{TKcvu)bU%D%|Hzpd)RcEYErtl)O!g7?SH zO)yE$V^eHU$YD6n@+r#9vEhsghhR=tL#way6<~HgATq&p-|v6V)qaN_2)X}uyY`B= zTmOE3aP#)2*w(uN_V&{m^s?D}7#X=YpM87G`p3G)#cU_GX!VQ6TrXU~sI)EFaD5Jg b`ah;5kw1&0ZVM;_b2o#htDnm{r-UW|mpZ^( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_homing.png b/src/main/resources/assets/icbm/textures/models/missile_homing.png new file mode 100644 index 0000000000000000000000000000000000000000..a040a37c4ea71ea2f4efa00cf7b61cd656848fd2 GIT binary patch literal 1903 zcmV-#2ax!QP)Px#24YJ`L;%PD$Naet*;%EFs@ju= z3!uu%e~dk05lA*61uPrdtJ;%>7lBLxTP}dwyMU&^ZlF8`oSvRmN&!{u35!5N0gxsV zw}R`c0c!bq0kV1l+}G|cTm3JxrvNsf3&=YzIC;?uUsU`(WdGw+Os%#V>04s@jtVr+_l@j$EeTt7=c!29l--;JzHcD5O`lCk+-r z+0(t?$k}{f)t+o%3dra3e5OeZ2T>xnT(%ARPb0=^; zDd6XiKh}DKbG+v=Yq9_i4-ePBV%9YV-vaiq049?OXMqubFai)p0Ky2+Zt7}zS2gYv z6s?Q^+a3Y>$={rXZ5BXJf2#Eceek!7HW@w(pa2L3KqvsRrA6Rc?!t#Mi~xiJAQS*0 zq){wgoGtr1g~P+8&)3)Z=jsZ#x3>@xbf0yxzqgOw-CY2{`T02u!?tz-A3l7<#it3> z3~CAi@a6goZf|bz_3Kw09UXDz+bV$T&!6$>VuI;Zp*Dpn04PKRstG2O33hgNIP+~4 zz}3|iObx12s47&aFawfAkR*VJ;PUd4Gv8JL{Cjr?RfU;Br&Ii=3Yftx0ZbqwxVyXK z%(u4&Fc{zj0E4MQRRIW+L;*`-W}Nx9?gQ*}pZP%r2?R-!AWc&wi2#xS0(84w&U{-1 zaIn7*kpxL1kTgY_rbyF{6GDUZ({UpB z{_qfcdwZPuHtz$xcyWa8&JHdvFK~Nv14&an>vnN)a6sob4C(cLGlMMN5;SCcg$9^d z{IqE?z+GqFMw|@{BH?Smf9b1&;<#=cb4G=8=3fN;0e{nItr0-Y0AH1x#J`+tB{(`L zz@5pyRp&?(2sEBIsB^f9yVlGdF9;|Tj9Fep7R93M7V577Oq~GK41@jGwh|Iq#)YRQ~Fa*NbgJEVz0jxm)W|*2` zI2^f!ZO-8UFdU9x<{S~69PHFPI@)QlbFaZ}I#rlX=g0G+%f`zbJ{*psI7sagKrtST zzZaj_;e@40S!iG?OJX3|)%zbl$0)X-8FPM9fK~mPZ_~0<7W;eTTE@H( z;%lz=x59YY+0Y`++#P_q!(97o5P)hHl>MrY;XXuxS?7cp@4J44zk^^ze8e}X-wBdM zJ3)n;T5i|KU?LFK0P9EraPe8P4H~yOBM>o|W}*mwli5`oHgtk`)S%gk!p>eyCz7el zg@2n97Zbob1YlYy_`KA-1pbzgaLz?&p`Q#ay}=J`ci;p={y&j zEvo`uQ5SMSJnX}CEae5WBgCpdzu#}_L%lm@R_q$07=NH-D-%|Zq# zw4EYM0)!A!A9FGG-Me@9rr+b^W5(qc!5s;QxBD&R8*b^(L}AQS+3+I@g^-Kc6!F>BA7fDwSy z5dpq+Bj}+O&Xvm)Kp{{7Ic7g-nI9;{8h~s=1StE6^>Cb#fDwQ^K?GoNMhGE<5JCtc pgb+dqA%qY@2qA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_hypersonic.png b/src/main/resources/assets/icbm/textures/models/missile_hypersonic.png new file mode 100644 index 0000000000000000000000000000000000000000..497dfcc04a04edf56936d02c72cc84bb8bf15ce9 GIT binary patch literal 1137 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^RlY zAw%ze4>_O+XMsm#F#`kNVGw3Kp1&dmD9B#o>FdgVheuG%koja7lk4W&SMIf0 zao>Kwb6&_7 z_T5eymKN@YKGqd>@fKVW3>w#%X7o>9F+1JFykGLu-b32Qw=x*A%L^4UZe*Lk*`ATn z;797>qS$wD*6>X@wJ5;`6oiWN3w2n&noHApZBFeorM0NuIZh1G!oR{aobi0c|G3>`jgSSQcTurs=0 zPPj%QBLnw@S2OS5?RU~)e9h>@UHtZ2ga{W0TtCQ54XsOpIg*y~b2F$$H*78NchG?v z4wl@>1oT+Sn`amI-Dc!wKvkGH1EDxa9o0TDta>(1Bz6 z2WLrz+_uZzziVA5BH#oVet0miUiC}=?#!wQli!zdXf*7s-16`D?(Nkp4!N!}@m1F2 zcKpa{;26E)LR7l#hN$e|`daz-#nzh3!mKkh*ZjU&_x_e}{`RyFx9`vGQ201&_s<^} zfA9SDPrI}3psquSQY_c9Jbqg<;ePx6tNI>dA1aPLf5)_|Il-7=<1f~&463|;?#e{- zIjyNX&0SiW!MK6SC}C7>r{Nd{sF%qk6%^f6qHD6dqb6JTL$7 zx$ytC%JMaJ-T(F9Z_oTL%2MPlVJ?=iV%z(!S;=!Mco=N|g`Fv8(d%Aw`eA{AlG5|f zPhWoCzWwm!-wVH;e){O{s)?*q=3UELyZ0EwwauXm<-pt!~IiwzDlCXNP%*6Y_COd=WW*buO)t}0`8KoI|W~O}-XUy(~g>QK~6_zoa zU@Bld|3z1za*xQIHHyWIJiK+^%RQ`vH^v@r;Qrt+e|@>B6*n;PaDxX{hbT`5eK4Aik%opUXO@geCx}PtlP8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_incendiary.png b/src/main/resources/assets/icbm/textures/models/missile_incendiary.png new file mode 100644 index 0000000000000000000000000000000000000000..2d5be1b1f0fb14653824f94157b74eb3129d2e6c GIT binary patch literal 1936 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_nuclear.png b/src/main/resources/assets/icbm/textures/models/missile_nuclear.png new file mode 100644 index 0000000000000000000000000000000000000000..28065e224cc65146082cc7de81f1970e822852c7 GIT binary patch literal 1023 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^L$` zEQYFdgVhf|DC-R#_IF#`q$=6X*T$B>F! zZ|Clxd&@wiVdw9V|2pdrhOsXrTKSd>@~ z=rDbW*MGyR#9$)L_{M$t7ggh1-p70@qbE=O?A9=6F27Td!@6_nU$_Mt&gDzTzJ7V` z;5Ei2b3~*v>kYXxYQ+lveEj+S*cP>d+WV%4a_?U-Zge+uvGG;ckmERp=CZhw5Pao^$~ua)k%cn>eQEwtc+_lB6czcOa8ylcR7 z1+J-qK_FS`#`nKxOOAha_S-1m-olhK*M0W={qM~Dw-zW)EtCm8(YoLdlf?`%tscYB z@->FX`0n4ob~}cx^>vQ=;$!W%ZGY|C$DIHC^3Tiv9aRMOJyzYp&Rv!1Cn;92rk&#H-AQZQs&!j+#5cwxS5n#RIyq0Sy>Q6 zj?~{^jcZYH)+`@ z`*Yp5VBZFY)=z%C!0^1nz|L?z5{!Qs7K8+xU#}=#^KZ8D~1s&Ks=lz5O z=Ym*F9nYFNygp(lG39pzGZV-A1uvKc4&CK5iDhwmycv{FL10Cjy-(M{ABny@6G2>0 LS3j3^P6Qz*wh4GanlQI9QK z4Ei2RB=sm>e7*Hs^3?lxu2lZJ@-2Opu#M`wKdaZDkYOw;`?r#%IQ&Q6(`)B_!wk>( z*yw)!R=>YZ!0ATq&)Tx*BDbIGiLOuM*l{ezxj{jLvn0*7C{4Fy<1rI~(@z;JD^4>O z&Hq_E_u=<{@-vk?IWAa0tap%Q(A@mD`gUQkhD*bwKu#7$2L=HK76u@-g4x7=y%=La zKFf*1@DJ)Rs_(YGD=ja4e&zN?n`><6TCG6-U!Zq~-=V?E zQf+;(oYB@2rkF>}8)wNf6`iRoI==%NJ{%3ZmNy2UEHyRy#-h>Ek0H6@4u|L>;Uz~=7u1?l$Doqw#Y5@VVtIY)@XqT z<>zNr^BJaI zD2)XQB}inHhy~nAzU7}Lczo*q;~#1>D=NO!epd`ra?s*#z+Plv$bSAe z>BL&`)^&G3Z(kH@T*RCwqjxeW~W=tuul7g~8L+ K&t;ucLK6T~_ICLI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_redMatter.png b/src/main/resources/assets/icbm/textures/models/missile_redMatter.png new file mode 100644 index 0000000000000000000000000000000000000000..1a5cb69c7e3203964fc3101eaa4522f112d659c5 GIT binary patch literal 1068 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^RlY zSq#SNHJ^bLXMsm#F#`kNVGw3Kp1&dmD9B#o>FdgVheJq!hjsDBU6&XbnAdo^IEGZ* zdOO#9+A0GPSN(iT&ema`@~{ z@kKLv0z_Jcm}f0JsUqMSxMEpm+b=Q8ZI@pzQBlgh?N{5r^6~E-f8`rviyw$AseS(X zxS_I;gd>Xr(*du*zQ@K&3?~-qcz><1sWX{(K3!1IF!TK9KaZbZDV z50vw-A6@9mWcu)1`rGL`3C|T8_AYOn(^UG&^kTiKpu_EL`OMe1<=#J8l__s*v#}@a zd?A0XvbW?$6{Q2qxu0#8Wn;}y-E=CPMWf5Q3EN^9$8g|DADk)80Rw=!CcE=slexob$zn2QLJm{?6|y_5EDUv@v-T1BT} zlTP!y2Ki0}-Wb!nGIu(*-Eu2_zwq}*27#6}I;R(SZ~HlO#}U>8njN#_W-XbK{5a>b zt2qAxrf#o7;fIV0iC^2g7*>g^)$XdaW%>OtXYu>B>#w|Q|7O^B?B+fdFDZ%6QyXft z?p*z3F@vd$Pf$T<`^<&0I>!|oj=Wr6@N0Kta^`~v7N<`s1|K-*$WX!Xq0_fD|K#6S zqRvVT!3+uv2bfh{uFYQG^fqPnewn1=O`%!ha$-FU+xT67l~3qD&tL;o;{eKUj0{W+ zEDRhB0x*FC#^?GImj4s1;s1Z&tO&9UhEhg{q?F+EpOX*&W^utZjiKOa_)OEX%o&&T uK`wG&*wDlNpwK`NVHM0kV5WtEYv=1DjD33FdgVhm%dfSo(3b%U1>l76nfi$B>F! zZ|_>?J$92h{_#Ff`<5L>Vjbq}24W|e3+8e!3H_y8R@^lw`TPb4CKgMFE62YRCRot$LiX>5yab#y1{1;Wx7E!@>jZulw`6ubGR12?86U7dHqvO)zxR-MjAh z|F+8)5?M2TK3QMudYtjarzh1%@5fA`P-$FE+noE>Zku#~=y}7;Ee5OAP*MllQVruw$rY@X}-KII{1z@@>0y z#|%D5&i%7)ns8TS1wy>fBd@wIga zLK=AI&YvIL&u_`FeEIUZIpsz(1sWs_bWdv}XfM8~VKDV~kCsDx&8Kgh1)KstIO_S9 z*4Rw>9_Jc(;>3&h{QGSqPR8x4l#O}yCCTDSjoJ0%@9WJkvMlIc-t=3obmgg4Q#QIC ztoB`QJT+A@zS?s8zbY=p6*}6!>(`r}DAsbg&-1A zKEp8n&i$L4!a9pjZ3=M>eDUg&*SVd&tJoM{Tv%Nm-{NR@p~fyea@r?F4(gy6M;n%jMi|jDO2&OZV=%q{`d3rjN~i z(!`p#rJr88xCUle%{_U2YRsc4%T~4>ch(g<{m(JDxNraKmCvFXBkoSvnIE_B?NdXq z7$tS}>APlcyIsBiPtxmFmE@4nsY2OXHKx@ztXef~>LQKB_WNe*x0$>@X6hdleOlg{ zdB?5y`_3q=+r9gGsOpCDxpSV~zZKW_?#8pwp8=J5)s|K{OuIH|J^X#Ef8DH}6|)&G zusm=uzopr E09x|$_5c6? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_repulsive.png b/src/main/resources/assets/icbm/textures/models/missile_repulsive.png new file mode 100644 index 0000000000000000000000000000000000000000..e044b337f31670374fb653506af295d94ac883a4 GIT binary patch literal 1894 zcmV-s2buVZP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m?d01m?e$8V@)00007bV*G`2iyz? z0y#0Q(fXnQ00!nsL_t(|+U=Z6ZyQw<$Ny)>o4A$8Lqw$P*&+A_NG#Z}X3+)-Y(55S zJ_ddwx?tT63nV@QV%L4u%1unum~?~BVR0YxaMIeY$C-@(KPj;@bLLKT&;Ops9Vdbt zxPSk?&1SRmF_e$x5Nw(sKDNToKR?_2J?eDdTOhgV#C48-i}Oj-1VAVNLIDs8fHayG z0Nc=5wzcknFanSb3!u~KpwsCr7;Ne|VFVyGtpRq2@($moue*aghKvAA0c4kvPN!p4 z-k{&_uOAjS{ZMAz6tFCJFa^XKpx5i6+wCrW;Y#+Kn)r3cY4Fp$jii8HueZ`gtJ;&A z3t*L%zm7d&5lHSr3RpI@uWC^s0s?;4s-$eVs4pLy{i3M)cLP-8uXV#t#uvAy?}-lfxTXDrM7NW zds1Tobi3V^R`ja&k*)z{LWd}WdU^bt4eRsN1wA?WB4q90w5Fsp#aE^7J*y2 z3m?ib0uTy-PymFGTCsF-w(S2A2oINDU0mRw=@hfs3?hQ|y*3UH4za(#4*+=bG0F$A7AT z8O##E1R{c~t1HfYb87&D0Zsrgm?~5ifFMZ}uoPy-nQ!Voz+U^FA5@S)kR%DxG)0mK zAPFEqyWQr@H&p;fhldbJkR$?0Q>1B%G;KK{Bnc!*aCCIUnQy89_V@Sk;qfujBtpam*PN&Y6D^^auP;qm@PgH3NKA zZW6ya*Gh17P=Gs={ix27CJ<;mZ&2rO6L+ndJ6;e_CK$84h%Aal*)3FG1DHAis2K+R zA0A`q*VK^MQg>BB^05BYmVCEbVoE+@bJ388Fuye1$Za!C-&KJk?qRYn196lV5 zqBuz95kN5>jpKo^k^`gBIPUC?$3;6s&Tc%84}V6v@xq2semql!S?RtxK>@&c^b5>A zNFY@TAn)wc(?@Z2etY_;=){8EsXL~M)4W|NY{&7`3U+EP#24(m@QUNnL6vs_41T)KhDHIQkk6I-wovtlQnJ`_#QG0e*O32p9zTA}E}+UTz|?%(C4jHwL#gh% z0EwQm&>0jQn0ejIwSd8?F>3gsA#goH>@)xq$=X3L2!nV*u?DEV4TL)9)W*K zl*RrYxt1|6g!r24{jD%wb~dz#rMm+#cbIE`3j$Ehg0f%rG2DkJPF6{Z5cvw-Z#jspWQ!3?>3$4X}+A02iMn+n{lqGXfEVX(o!`Hz}{uu%Q#gqXx}R z6n6GvI+09WF8teqxR?O8App}t!560827S8DPsbK;{+6_5>`{_POHFKOM|^JBb@S3jy0Kcb&z^ z5z>vsLbH%T3T>wdlK>%v5K<9qC)rQG`^*kMai8v;K3)7vpTCEHy>;v_e)_Ud=l%KP zA58eSQ3S4gVQ_x=J=qZftV?<2mya_N+z|mxpPu7wDS$Lg0Po8A`BX4{dcI))u9|?{ z4*VZM6ab+B2y1|C!785-fDl4REm%4qKli_@%07*qoM6N<$f)-O`^Z)<= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_shrapnel.png b/src/main/resources/assets/icbm/textures/models/missile_shrapnel.png new file mode 100644 index 0000000000000000000000000000000000000000..8b95f58738dc27756c25dd22e356cf079a7fc1e7 GIT binary patch literal 2161 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/missile_thermobaric.png b/src/main/resources/assets/icbm/textures/models/missile_thermobaric.png new file mode 100644 index 0000000000000000000000000000000000000000..668457b5015d9dcbea395479cd6d01dbf2f6ee74 GIT binary patch literal 1259 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^PK9 z@PGT-_->#GXMsm#F#`kNVGw3Kp1&dmD9B#o>FdgVhfAE5#UkbNJ|+eRmTXTK$B>F! zZ|CmK7IBnlub+LyUqvvmupr}L7B^0L0qR~YVp z@4cnKNob=xP?&cOf42I=(hrx4~OWbDwG5@bSLiE zQ?y;KFrQtCK>-L=+_J)0w+FEX*a1Hfrdlr@hh*F?AYGy%otN* zA+)4`!@~CM`kxVI@7_*$tfjE>^Mb4eTrl^Yu-zFg_RjF{1V6?}v*iyogm4|$^kEM7 zge#jq?9pfTU(0ajLLe&x6G6z}@LEUzNYAg!Yq#!yAO5>O`|rPaCAItK#>L##c^k*~)B+oo0hHrS$~!ys=V*ih6f!yo{LpQf<{tqWv5!qjBI!ocKk z>*K6iDG75PSr-NeEbxWKnceP70yK{NInuff&9<{++FoAwws2A( zOO53ejtQ|{M<2~9^7rvEneyZA?oBrSMsA&Zf>=vtbShl9@-$(mZL!XU^Y;|0rp-xs zF3s*;92F;ch1c0(V}wb!+J!5jnQt!bP2|v?teomtaO+ z`GngX6D%43A#o%J@3!?@^!)8eNPYXzf@p)>S@t+n;V&}KD~8?XIP|^FDE^(4r~{kewg+A lm*_RWr5*Wz1rHFse4@W9#J_5i{?bkm*VEO{Wt~$(69DD(A^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/radar.png b/src/main/resources/assets/icbm/textures/models/radar.png new file mode 100644 index 0000000000000000000000000000000000000000..a2122446f21e8a1a543801911cfd84d34430aa85 GIT binary patch literal 865 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^RlY zSq#SNHJ^bLXMsm#F#`kNVGw3Kp1&dmD9B#o>FdgVhmDz6o58Epseyrk>7l2KV@SoV zw|4{kRvCyiJTxlwOszHFY`07OU2~tITGuvKuD}0|OgA)es`vA+&XRRfEaoWYQ0y_R zE4?!%=!E6FnNuzaOgQV`JNb!8Qs&{sd`JELdkXJ;W^!p@Q)1v?U}|7cK%yR8VfqvL zb(@_SuWQ4cwktn!4bCW@*}3%QrCD{{$N5FI78NlFFt7lf3IZ3jZnjRCqZE|)(e2_g zM@G5*!ZXCYc5gf+?pVuSAgd=T^(@VO7JX4m#2Ft+nC{|GVCrCy`n%&ZgX*7qLMJn4z0)rdVf^PR zxZpL|j}QklG<^M8wfD{~d$GOG-302dZ~L0QqSk-^&p%m=bDdFw;@87RVr!1y+PrM( zfAgg#0tv2t8}@%p)%VV}H8q>4Cvt#y3X7A_k6Go>n|(BO-+fm;Boou{aU1uI)!(C% z_!er+mpokifAO2ocivqukYbdZwE4OE?w#E$6`$O=IjyXS!Bc^Q!SjKTSsBfxKK!$-Xex7pyWiI@TZ3*`eQ~*P$@k389nXtr$>r_go)L5_)w|*Z zP( zb+&I(SvTuBh&RmByr+5P+&m?QJ{d-viO5Nf!F@@XslhRe>o(!1zrV5nestq(bGDDC PKvCrB>gTe~DWM4fkZNG} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/railgun.png b/src/main/resources/assets/icbm/textures/models/railgun.png new file mode 100644 index 0000000000000000000000000000000000000000..54bffb052286f5abb439358852ee5115bc693e10 GIT binary patch literal 838 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 bY_4z)SeDGv7|T`v@pClF%E_|H!aMaJ#|T0= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/s-mine.png b/src/main/resources/assets/icbm/textures/models/s-mine.png new file mode 100644 index 0000000000000000000000000000000000000000..59466462aea567276a9d576c28c28ecae4a4b208 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^x|DaPU;cPEB*=VV?2Ic!PZ?k)`f zfh-1N^_tH>inG8YvY3H^?=T269?xHq0u*E~@$_|Nzr)QTE~I|{w!Aw~sLj*GF(l&f z+o=~h4=C`soWJB+!W3Q@6kgbrCh}WVB>G^N#;LvbiZ2A`bvmh@+xf$$U4Vh%TGW;Y zd&4uH9B4B5qH*rlp(h28gcuoStXX%pux!^AN8=5f|8(&DJ^u3E>~$ukpMGcE|9fkW zciF6-M^C%2S)JoiQOY{~^5BKTbLPD*;6Ki(n39~Aq@^kmGb?Nw&_xWMu6{1-oD!M< Dq55Lr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/models/sentry_med.png b/src/main/resources/assets/icbm/textures/models/sentry_med.png new file mode 100644 index 0000000000000000000000000000000000000000..4f29442badd546773d53e71870785234d77621b2 GIT binary patch literal 566 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv`!TrA?s(vI<;s(_|!^K@|xskrs_ zuCHHMT zwta$Z88a&bQ^R2^{ksoh=Eq-?nP%E~jKzo{JFVdpug?7|f7p&osIP7hWqr-$cB)~9 zHhZw%GH#HG*9v2|tX#{HcJ0OYlTH^d8av$EyZY^|l@BH|3NRelm(G}~+Fx52%iunX z^~wpLc^iH^KKOk3bV~S#Z~sWcdR(Vi*L)Fk+tfrEjCfeGYC2Zjw#OB;4h+Hk98|DWRg zYn&-ynTG#H+$-)zJX$g1aoRDM>H}iwj9ZNxe})9usfO&H9~8BOx8DgA)!0FU?Qgad Wr)DfHHS~N3QsL?9=d#Wzp$PylSlwy> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/icbm/textures/noise.png b/src/main/resources/assets/icbm/textures/noise.png new file mode 100644 index 0000000000000000000000000000000000000000..a442aed931f8f85c5ef429a2d484b7d2c3897317 GIT binary patch literal 4748 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 literal 0 HcmV?d00001