From 9660ea67874ea3aff5eac682b372ae8959cafba4 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Wed, 4 Dec 2024 00:30:48 +0800 Subject: [PATCH 01/19] port over gt6 bridge/extenders --- .../metatileentity/logistics/IDelegator.java | 14 ++ .../logistics/MetaTileEntityDelegator.java | 168 ++++++++++++++++++ .../renderer/textures/SusyTextures.java | 10 ++ .../textures/custom/ExtenderRender.java | 55 ++++++ .../SuSyMetaTileEntities.java | 33 +++- .../logistics/MetaTileEntityBridge.java | 47 +++++ .../logistics/MetaTileEntityExtender.java | 141 +++++++++++++++ .../blocks/logistics/bridges/inv/bottom.png | Bin 0 -> 417 bytes .../blocks/logistics/bridges/inv/side.png | Bin 0 -> 417 bytes .../blocks/logistics/bridges/inv/top.png | Bin 0 -> 417 bytes .../logistics/bridges/inv_tank/bottom.png | Bin 0 -> 431 bytes .../logistics/bridges/inv_tank/side.png | Bin 0 -> 431 bytes .../blocks/logistics/bridges/inv_tank/top.png | Bin 0 -> 431 bytes .../blocks/logistics/bridges/tank/bottom.png | Bin 0 -> 374 bytes .../blocks/logistics/bridges/tank/side.png | Bin 0 -> 374 bytes .../blocks/logistics/bridges/tank/top.png | Bin 0 -> 374 bytes .../logistics/bridges/universal/bottom.png | Bin 0 -> 418 bytes .../logistics/bridges/universal/side.png | Bin 0 -> 418 bytes .../logistics/bridges/universal/top.png | Bin 0 -> 418 bytes .../blocks/logistics/extenders/inv/in.png | Bin 0 -> 417 bytes .../blocks/logistics/extenders/inv/out.png | Bin 0 -> 355 bytes .../blocks/logistics/extenders/inv/side.png | Bin 0 -> 141 bytes .../logistics/extenders/inv_tank/in.png | Bin 0 -> 431 bytes .../logistics/extenders/inv_tank/out.png | Bin 0 -> 379 bytes .../logistics/extenders/inv_tank/side.png | Bin 0 -> 141 bytes .../blocks/logistics/extenders/tank/in.png | Bin 0 -> 374 bytes .../blocks/logistics/extenders/tank/out.png | Bin 0 -> 382 bytes .../blocks/logistics/extenders/tank/side.png | Bin 0 -> 141 bytes .../logistics/extenders/universal/in.png | Bin 0 -> 418 bytes .../logistics/extenders/universal/out.png | Bin 0 -> 425 bytes .../logistics/extenders/universal/side.png | Bin 0 -> 196 bytes .../resources/assets/susy/lang/en_us.lang | 12 +- 32 files changed, 476 insertions(+), 4 deletions(-) create mode 100644 src/main/java/supersymmetry/api/metatileentity/logistics/IDelegator.java create mode 100644 src/main/java/supersymmetry/api/metatileentity/logistics/MetaTileEntityDelegator.java create mode 100644 src/main/java/supersymmetry/client/renderer/textures/custom/ExtenderRender.java create mode 100644 src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityBridge.java create mode 100644 src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityExtender.java create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv/bottom.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv/side.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv/top.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv_tank/bottom.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv_tank/side.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv_tank/top.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/tank/bottom.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/tank/side.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/tank/top.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/universal/bottom.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/universal/side.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/universal/top.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv/in.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv/out.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv/side.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv_tank/in.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv_tank/out.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv_tank/side.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/tank/in.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/tank/out.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/tank/side.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/universal/in.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/universal/out.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/universal/side.png diff --git a/src/main/java/supersymmetry/api/metatileentity/logistics/IDelegator.java b/src/main/java/supersymmetry/api/metatileentity/logistics/IDelegator.java new file mode 100644 index 000000000..65b57f757 --- /dev/null +++ b/src/main/java/supersymmetry/api/metatileentity/logistics/IDelegator.java @@ -0,0 +1,14 @@ +package supersymmetry.api.metatileentity.logistics; + +import net.minecraft.util.EnumFacing; +import org.jetbrains.annotations.Nullable; + +// Mostly a marker interface +public interface IDelegator { + + /** + * @return the facing that the input facing in delegating + */ + @Nullable + EnumFacing getDelegatingFacing(EnumFacing facing); +} diff --git a/src/main/java/supersymmetry/api/metatileentity/logistics/MetaTileEntityDelegator.java b/src/main/java/supersymmetry/api/metatileentity/logistics/MetaTileEntityDelegator.java new file mode 100644 index 000000000..2a4e0d32a --- /dev/null +++ b/src/main/java/supersymmetry/api/metatileentity/logistics/MetaTileEntityDelegator.java @@ -0,0 +1,168 @@ +package supersymmetry.api.metatileentity.logistics; + +import codechicken.lib.render.CCRenderState; +import codechicken.lib.render.pipeline.ColourMultiplier; +import codechicken.lib.render.pipeline.IVertexOperation; +import codechicken.lib.vec.Matrix4; +import gregtech.api.GTValues; +import gregtech.api.capability.GregtechCapabilities; +import gregtech.api.capability.IEnergyContainer; +import gregtech.api.gui.ModularUI; +import gregtech.api.metatileentity.IDataInfoProvider; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.MetaTileEntityHolder; +import gregtech.api.util.GTUtility; +import gregtech.client.renderer.texture.Textures; +import gregtech.client.renderer.texture.cube.SimpleSidedCubeRenderer; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; + + +public abstract class MetaTileEntityDelegator extends MetaTileEntity implements IDelegator, IDataInfoProvider { + + protected final Predicate> capFilter; + + public MetaTileEntityDelegator(ResourceLocation metaTileEntityId, Predicate> capFilter) { + super(metaTileEntityId); + this.capFilter = capFilter; + } + + @Override + public T getCapability(Capability capability, EnumFacing side) { + T delegatedCapability = getDelegatedCapability(capability, side); + return delegatedCapability == null ? getDefaultCapability(capability, side) : delegatedCapability; + } + + protected T getDefaultCapability(Capability capability, EnumFacing side) { + return capFilter.test(capability) && DefaultCapabilities.hasCapability(capability) ? DefaultCapabilities.getCapability(capability) : super.getCapability(capability, side); + } + + protected T getDelegatedCapability(Capability capability, EnumFacing side) { + if (capability == null || !capFilter.test(capability) || side == null) return null; + EnumFacing delegatingFacing = getDelegatingFacing(side); + if (delegatingFacing == null) return null; + TileEntity te = getWorld().getTileEntity(getPos().offset(delegatingFacing)); + if (te == null || (te instanceof MetaTileEntityHolder holder && holder.getMetaTileEntity() instanceof IDelegator)) + return null; + // TODO: make IDelegator a capability when Jet Wingsuit PR gets merged + return te.getCapability(capability, delegatingFacing.getOpposite()); + } + + @Override + public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { + IVertexOperation[] colouredPipeline = ArrayUtils.add(pipeline, + new ColourMultiplier(GTUtility.convertRGBtoOpaqueRGBA_CL(this.getPaintingColorForRendering()))); + getBaseRenderer().render(renderState, translation, colouredPipeline); + } + + @SideOnly(Side.CLIENT) + protected SimpleSidedCubeRenderer getBaseRenderer() { + return Textures.VOLTAGE_CASINGS[GTValues.LV]; + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, @Nullable World world, @NotNull List tooltip, boolean advanced) { + super.addInformation(stack, world, tooltip, advanced); + // TODO + } + + @SideOnly(Side.CLIENT) + public Pair getParticleTexture() { + return Pair.of(getBaseRenderer().getParticleSprite(), getPaintingColorForRendering()); + } + + @Override + @NotNull + public List getDataInfo() { + return new ArrayList<>(); // TODO + } + + @Override + protected boolean openGUIOnRightClick() { + return false; + } + + @Override + protected ModularUI createUI(EntityPlayer entityPlayer) { + return null; + } + + public static class DefaultCapabilities { + + private static final Object2ObjectArrayMap, ?> DEFAULT_CAPABILITIES = new Object2ObjectArrayMap<>(); + + static { + // Item + addCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(new ItemStackHandler(1) { + + @NotNull + @Override + public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + return stack; + } + + @NotNull + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + return ItemStack.EMPTY; + } + })); + + // Fluid + addCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY.cast(new FluidTank(10000) { + + @Override + public int fill(FluidStack resource, boolean doFill) { + return 0; + } + + @Override + @Nullable + public FluidStack drainInternal(int maxDrain, boolean doDrain) { + return null; + } + })); + + // GTEU + addCapability(GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER, GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER.cast(IEnergyContainer.DEFAULT)); + } + + public static boolean hasCapability(@NotNull Capability capability) { + return DEFAULT_CAPABILITIES.containsKey(capability); + } + + @Nullable + @SuppressWarnings("unchecked") + public static T getCapability(@NotNull Capability capability) { + return (T) DEFAULT_CAPABILITIES.getOrDefault(capability, null); + } + + public static void addCapability(@NotNull Capability capability, @NotNull T value) { + DEFAULT_CAPABILITIES.put(capability, capability.cast(value)); + } + } +} diff --git a/src/main/java/supersymmetry/client/renderer/textures/SusyTextures.java b/src/main/java/supersymmetry/client/renderer/textures/SusyTextures.java index 25c11f9fa..fa465778c 100644 --- a/src/main/java/supersymmetry/client/renderer/textures/SusyTextures.java +++ b/src/main/java/supersymmetry/client/renderer/textures/SusyTextures.java @@ -4,6 +4,7 @@ import gregtech.client.renderer.texture.cube.SimpleCubeRenderer; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; import gregtech.client.renderer.texture.cube.SimpleSidedCubeRenderer; +import supersymmetry.client.renderer.textures.custom.ExtenderRender; import gregtech.client.renderer.texture.custom.DrumRenderer; public class SusyTextures { @@ -13,6 +14,15 @@ public SusyTextures(){ public static final SimpleSidedCubeRenderer WOODEN_COAGULATION_TANK_WALL = new SimpleSidedCubeRenderer("casings/wooden_coagulation_tank_wall"); public static final SimpleSidedCubeRenderer PLASTIC_CAN_OVERLAY = new SimpleSidedCubeRenderer("storage/drums/plastic_can_top"); + public static final SimpleSidedCubeRenderer INV_BRIDGE = new SimpleSidedCubeRenderer("logistics/bridges/inv"); + public static final SimpleSidedCubeRenderer TANK_BRIDGE = new SimpleSidedCubeRenderer("logistics/bridges/tank"); + public static final SimpleSidedCubeRenderer INV_TANK_BRIDGE = new SimpleSidedCubeRenderer("logistics/bridges/inv_tank"); + public static final SimpleSidedCubeRenderer UNIVERSAL_BRIDGE = new SimpleSidedCubeRenderer("logistics/bridges/universal"); + + public static final ExtenderRender INV_EXTENDER = new ExtenderRender("logistics/extenders/inv"); + public static final ExtenderRender TANK_EXTENDER = new ExtenderRender("logistics/extenders/tank"); + public static final ExtenderRender INV_TANK_EXTENDER = new ExtenderRender("logistics/extenders/inv_tank"); + public static final ExtenderRender UNIVERSAL_EXTENDER = new ExtenderRender("logistics/extenders/universal"); public static final OrientedOverlayRenderer VULCANIZING_PRESS_OVERLAY = new OrientedOverlayRenderer("machines/vulcanizing_press"); public static final OrientedOverlayRenderer LATEX_COLLECTOR_OVERLAY = new OrientedOverlayRenderer("machines/latex_collector"); diff --git a/src/main/java/supersymmetry/client/renderer/textures/custom/ExtenderRender.java b/src/main/java/supersymmetry/client/renderer/textures/custom/ExtenderRender.java new file mode 100644 index 000000000..fdc5906a5 --- /dev/null +++ b/src/main/java/supersymmetry/client/renderer/textures/custom/ExtenderRender.java @@ -0,0 +1,55 @@ +package supersymmetry.client.renderer.textures.custom; + +import codechicken.lib.render.CCRenderState; +import codechicken.lib.render.pipeline.IVertexOperation; +import codechicken.lib.texture.TextureUtils.IIconRegister; +import codechicken.lib.vec.Cuboid6; +import codechicken.lib.vec.Matrix4; +import gregtech.api.GTValues; +import gregtech.client.renderer.texture.Textures; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +public class ExtenderRender implements IIconRegister { + + private final String basePath; + + @SideOnly(Side.CLIENT) + private TextureAtlasSprite[] textures; + + public ExtenderRender(String basePath) { + this.basePath = basePath; + Textures.iconRegisters.add(this); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(TextureMap textureMap) { + String formattedBase = GTValues.MODID + ":blocks/" + basePath; + this.textures = new TextureAtlasSprite[3]; + this.textures[0] = textureMap.registerSprite(new ResourceLocation(formattedBase + "/in")); + this.textures[1] = textureMap.registerSprite(new ResourceLocation(formattedBase + "/side")); + this.textures[2] = textureMap.registerSprite(new ResourceLocation(formattedBase + "/out")); + } + + @SideOnly(Side.CLIENT) + public void render(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline, + EnumFacing outFace, EnumFacing inFace) { + for (EnumFacing renderSide : EnumFacing.VALUES) { + TextureAtlasSprite baseSprite = renderSide == inFace ? textures[0] : + renderSide == outFace ? textures[2] : textures[1]; + Textures.renderFace(renderState, translation, pipeline, renderSide, Cuboid6.full, baseSprite, + BlockRenderLayer.CUTOUT_MIPPED); + } + } + + @SideOnly(Side.CLIENT) + public TextureAtlasSprite getParticleTexture() { + return textures[0]; + } +} diff --git a/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java b/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java index 0a867fb5b..e263814b4 100644 --- a/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java +++ b/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java @@ -16,6 +16,8 @@ import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityMultiFluidHatch; import gregtech.common.metatileentities.storage.MetaTileEntityDrum; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.items.CapabilityItemHandler; import org.jetbrains.annotations.NotNull; import supersymmetry.api.SusyLog; import supersymmetry.api.metatileentity.CatalystMachineMetaTileEntity; @@ -27,6 +29,8 @@ import supersymmetry.api.recipes.SuSyRecipeMaps; import supersymmetry.api.util.SuSyUtility; import supersymmetry.client.renderer.textures.SusyTextures; +import supersymmetry.common.metatileentities.logistics.MetaTileEntityBridge; +import supersymmetry.common.metatileentities.logistics.MetaTileEntityExtender; import supersymmetry.common.metatileentities.multi.electric.*; import supersymmetry.common.metatileentities.multi.primitive.MetaTileEntityCoagulationTank; import supersymmetry.common.metatileentities.multi.primitive.MetaTileEntityPrimitiveMudPump; @@ -41,6 +45,7 @@ import supersymmetry.common.metatileentities.single.steam.SuSySimpleSteamMetaTileEntity; import supersymmetry.common.metatileentities.storage.MetaTileEntityPlasticCan; +import java.util.ArrayList; import java.util.function.Function; import static gregtech.api.util.GTUtility.gregtechId; @@ -164,6 +169,16 @@ public class SuSyMetaTileEntities { public static MetaTileEntitySieveDistillationTower SIEVE_DISTILLATION_TOWER; + public static MetaTileEntityBridge INV_BRIDGE; + public static MetaTileEntityBridge TANK_BRIDGE; + public static MetaTileEntityBridge INV_TANK_BRIDGE; + public static MetaTileEntityBridge UNIVERSAL_BRIDGE; + + public static MetaTileEntityExtender INV_EXTENDER; + public static MetaTileEntityExtender TANK_EXTENDER; + public static MetaTileEntityExtender INV_TANK_EXTENDER; + public static MetaTileEntityExtender UNIVERSAL_EXTENDER; + public static final MetaTileEntityMultiFluidHatch[] SUSY_QUADRUPLE_IMPORT_HATCH = new MetaTileEntityMultiFluidHatch[3]; // LV-HV public static final MetaTileEntityMultiFluidHatch[] SUSY_NONUPLE_IMPORT_HATCH = new MetaTileEntityMultiFluidHatch[3]; // LV-HV public static final MetaTileEntityMultiFluidHatch[] SUSY_QUADRUPLE_EXPORT_HATCH = new MetaTileEntityMultiFluidHatch[3]; // LV-HV @@ -221,6 +236,16 @@ public static void init() { ELECTROLYTIC_CELL = registerMetaTileEntity(14634, new MetaTileEntityElectrolyticCell(susyId("electrolytic_cell"))); GRAVITY_SEPARATOR = registerMetaTileEntity(15052, new MetaTileEntityGravitySeparator(susyId("gravity_separator"))); + INV_BRIDGE = registerMetaTileEntity(14733, new MetaTileEntityBridge(susyId("bridge.inv"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, SusyTextures.INV_BRIDGE)); + TANK_BRIDGE = registerMetaTileEntity(14734, new MetaTileEntityBridge(susyId("bridge.tank"), cap -> cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.TANK_BRIDGE)); + INV_TANK_BRIDGE = registerMetaTileEntity(14735, new MetaTileEntityBridge(susyId("bridge.inv_tank"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.INV_TANK_BRIDGE)); + UNIVERSAL_BRIDGE = registerMetaTileEntity(14736, new MetaTileEntityBridge(susyId("bridge.universal"), cap -> true, SusyTextures.UNIVERSAL_BRIDGE)); + + INV_EXTENDER = registerMetaTileEntity(14737, new MetaTileEntityExtender(susyId("extender.inv"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, SusyTextures.INV_EXTENDER)); + TANK_EXTENDER = registerMetaTileEntity(14738, new MetaTileEntityExtender(susyId("extender.tank"), cap -> cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.TANK_EXTENDER)); + INV_TANK_EXTENDER = registerMetaTileEntity(14739, new MetaTileEntityExtender(susyId("extender.inv_tank"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.INV_TANK_EXTENDER)); + UNIVERSAL_EXTENDER = registerMetaTileEntity(14740, new MetaTileEntityExtender(susyId("extender.universal"), cap -> true, SusyTextures.UNIVERSAL_EXTENDER)); + PRIMITIVE_SMELTER = registerMetaTileEntity(14800, new MetaTileEntityPrimitiveSmelter(susyId("primitive_smelter"))); PRIMITIVE_ITEM_IMPORT = registerMetaTileEntity(14801, new MetaTileEntityPrimitiveItemBus(susyId("primitive_item_import"), false)); PRIMITIVE_ITEM_EXPORT = registerMetaTileEntity(14802, new MetaTileEntityPrimitiveItemBus(susyId("primitive_item_export"), true)); @@ -237,9 +262,11 @@ public static void init() { registerSimpleMTE(CVD, 12, 14653, "cvd", SuSyRecipeMaps.CVD_RECIPES, SusyTextures.CVD_OVERLAY, true, GTUtility.defaultTankSizeFunction); registerSimpleMTE(ION_IMPLANTER, 12, 14666, "ion_implanter", SuSyRecipeMaps.ION_IMPLANTATION_RECIPES, SusyTextures.ION_IMPLANTER_OVERLAY, true, GTUtility.defaultTankSizeFunction); - int id = 14500; - while (GregTechAPI.MTE_REGISTRY.getObjectById(id) != null) id++; - SusyLog.logger.debug("The next available ID is: " + id); + ArrayList ids = new ArrayList<>(); + for (int id = 14500; id < 15000; id++) { + if (GregTechAPI.MTE_REGISTRY.getObjectById(id) == null) ids.add(id); + } + SusyLog.logger.debug("Available ID(s) are: {}", ids); //thermodynamic stuff registerSimpleMTE(FLUID_COMPRESSOR, 12, 15000, "fluid_compressor", SuSyRecipeMaps.FLUID_COMPRESSOR_RECIPES, SusyTextures.FLUID_COMPRESSOR_OVERLAY, true, GTUtility.defaultTankSizeFunction); diff --git a/src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityBridge.java b/src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityBridge.java new file mode 100644 index 000000000..9a5b8a202 --- /dev/null +++ b/src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityBridge.java @@ -0,0 +1,47 @@ +package supersymmetry.common.metatileentities.logistics; + +import codechicken.lib.render.CCRenderState; +import codechicken.lib.render.pipeline.IVertexOperation; +import codechicken.lib.vec.Matrix4; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.client.renderer.ICubeRenderer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.capabilities.Capability; +import org.jetbrains.annotations.Nullable; +import supersymmetry.api.metatileentity.logistics.MetaTileEntityDelegator; + +import java.util.function.Predicate; + +public class MetaTileEntityBridge extends MetaTileEntityDelegator { + + protected final ICubeRenderer renderer; + + public MetaTileEntityBridge(ResourceLocation metaTileEntityId, Predicate> capFilter, ICubeRenderer renderer) { + super(metaTileEntityId, capFilter); + this.renderer = renderer; + } + + @Override + public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEntity) { + return new MetaTileEntityBridge(metaTileEntityId, capFilter, renderer); + } + + @Override + @Nullable + public EnumFacing getDelegatingFacing(EnumFacing facing) { + return facing == null ? null : facing.getOpposite(); + } + + @Override + public boolean hasFrontFacing() { + return false; + } + + @Override + public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { + super.renderMetaTileEntity(renderState, translation, pipeline); + this.renderer.render(renderState, translation, pipeline); + } +} diff --git a/src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityExtender.java b/src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityExtender.java new file mode 100644 index 000000000..306f2bed5 --- /dev/null +++ b/src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityExtender.java @@ -0,0 +1,141 @@ +package supersymmetry.common.metatileentities.logistics; + +import codechicken.lib.raytracer.CuboidRayTraceResult; +import codechicken.lib.render.CCRenderState; +import codechicken.lib.render.pipeline.IVertexOperation; +import codechicken.lib.vec.Matrix4; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.Capability; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import supersymmetry.api.metatileentity.logistics.MetaTileEntityDelegator; +import supersymmetry.client.renderer.textures.custom.ExtenderRender; + +import java.util.List; +import java.util.function.Predicate; + +import static gregtech.api.capability.GregtechDataCodes.UPDATE_OUTPUT_FACING; + +public class MetaTileEntityExtender extends MetaTileEntityDelegator { + + protected final ExtenderRender renderer; + protected EnumFacing inputFacing; + + public MetaTileEntityExtender(ResourceLocation metaTileEntityId, Predicate> capFilter, ExtenderRender renderer) { + super(metaTileEntityId, capFilter); + this.renderer = renderer; + } + + @Override + public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEntity) { + return new MetaTileEntityExtender(metaTileEntityId, capFilter, renderer); + } + + @Override + @Nullable + public EnumFacing getDelegatingFacing(EnumFacing facing) { + return facing == getFrontFacing() ? inputFacing : getFrontFacing(); + } + + @Override + public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { + super.renderMetaTileEntity(renderState, translation, pipeline); + this.renderer.render(renderState, translation, pipeline, getFrontFacing(), inputFacing); + } + + @Override + public boolean onWrenchClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, + CuboidRayTraceResult hitResult) { + if (!playerIn.isSneaking()) { + if (getInputFacing() == facing || facing == getFrontFacing()) return false; + if (!getWorld().isRemote) { + setInputFacing(facing); + } + return true; + } + return super.onWrenchClick(playerIn, hand, facing, hitResult); + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setInteger("InputFacing", getInputFacing().getIndex()); + return data; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.inputFacing = EnumFacing.VALUES[data.getInteger("InputFacing")]; + } + + @Override + public void writeInitialSyncData(@NotNull PacketBuffer buf) { + super.writeInitialSyncData(buf); + buf.writeByte(getInputFacing().getIndex()); + } + + @Override + public void receiveInitialSyncData(@NotNull PacketBuffer buf) { + super.receiveInitialSyncData(buf); + this.inputFacing = EnumFacing.VALUES[buf.readByte()]; + } + + + @Override + public void receiveCustomData(int dataId, @NotNull PacketBuffer buf) { + super.receiveCustomData(dataId, buf); + if (dataId == UPDATE_OUTPUT_FACING) { + this.inputFacing = EnumFacing.VALUES[buf.readByte()]; + scheduleRenderUpdate(); + } + } + + @Override + public boolean isValidFrontFacing(EnumFacing facing) { + return super.isValidFrontFacing(facing) && facing != inputFacing; + } + + @Override + public void setFrontFacing(EnumFacing frontFacing) { + super.setFrontFacing(frontFacing); + if (this.inputFacing == null) { + // set initial input facing as opposite to output (front) + setInputFacing(frontFacing.getOpposite()); + } + } + + public EnumFacing getInputFacing() { + return inputFacing == null ? EnumFacing.SOUTH : inputFacing; + } + + public void setInputFacing(EnumFacing inputFacing) { + this.inputFacing = inputFacing; + if (!getWorld().isRemote) { + notifyBlockUpdate(); + writeCustomData(UPDATE_OUTPUT_FACING, buf -> buf.writeByte(inputFacing.getIndex())); + markDirty(); + } + } + + @Override + public boolean needsSneakToRotate() { + return true; + } + + @Override + public void addToolUsages(ItemStack stack, @Nullable World world, List tooltip, boolean advanced) { + tooltip.add(I18n.format("gregtech.tool_action.wrench.set_facing")); + super.addToolUsages(stack, world, tooltip, advanced); + } +} diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv/bottom.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..6318e000b95fff268df3e2058985f21a39da93a8 GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G^tAk28_ZrvZCAbW|YuPgflHUTbPhP@wNv@tL+>Up|2hFF|lJJ~Rg$&ttP{{oqo zF22sbHkpRZjL372DpoI?w#&5MVdzvYXwP}IaieXfnrlMYNj4$QnBFgM&F_Ef@z#7e zuY#$ee^t}bj=b%&TMs{E2=rXWC0P3Sqeb>?U(U@PN0S=)7$SN$Na&yVTPMGaP0)3- z1j8AnN1FF-m$asZybo1U3s4Xc?%)t%>W~!S_&j~*ZcYWYFIBeRZ|9zVx+!&gv0Mb3 zK*Kg9Pj^zS?CytewYAuuo*JYD@< J);T3K0RTx0rCk63 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv/side.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv/side.png new file mode 100644 index 0000000000000000000000000000000000000000..6318e000b95fff268df3e2058985f21a39da93a8 GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G^tAk28_ZrvZCAbW|YuPgflHUTbPhP@wNv@tL+>Up|2hFF|lJJ~Rg$&ttP{{oqo zF22sbHkpRZjL372DpoI?w#&5MVdzvYXwP}IaieXfnrlMYNj4$QnBFgM&F_Ef@z#7e zuY#$ee^t}bj=b%&TMs{E2=rXWC0P3Sqeb>?U(U@PN0S=)7$SN$Na&yVTPMGaP0)3- z1j8AnN1FF-m$asZybo1U3s4Xc?%)t%>W~!S_&j~*ZcYWYFIBeRZ|9zVx+!&gv0Mb3 zK*Kg9Pj^zS?CytewYAuuo*JYD@< J);T3K0RTx0rCk63 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv/top.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv/top.png new file mode 100644 index 0000000000000000000000000000000000000000..6318e000b95fff268df3e2058985f21a39da93a8 GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G^tAk28_ZrvZCAbW|YuPgflHUTbPhP@wNv@tL+>Up|2hFF|lJJ~Rg$&ttP{{oqo zF22sbHkpRZjL372DpoI?w#&5MVdzvYXwP}IaieXfnrlMYNj4$QnBFgM&F_Ef@z#7e zuY#$ee^t}bj=b%&TMs{E2=rXWC0P3Sqeb>?U(U@PN0S=)7$SN$Na&yVTPMGaP0)3- z1j8AnN1FF-m$asZybo1U3s4Xc?%)t%>W~!S_&j~*ZcYWYFIBeRZ|9zVx+!&gv0Mb3 zK*Kg9Pj^zS?CytewYAuuo*JYD@< J);T3K0RTx0rCk63 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv_tank/bottom.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv_tank/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..efb1b176ed015a5e72f5f662e70dcde5db085c3e GIT binary patch literal 431 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 K=d#Wzp$P!o(W!O- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/universal/side.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/universal/side.png new file mode 100644 index 0000000000000000000000000000000000000000..0fb382cebd2135cee0ad1c19d925519965b2354c GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pdfpR zr>`sf12zFJZiBPM^=p7aY)RhkE)4%caKYZ?lNlHo^*vo2Lo7}&4KmDYHV}F0aaJZl zOSXe+vFye}j1F0DH@w??cyBuMH?Sxh1YM22Vc}5R8=k}I!KvYCU30tY|NiIipX)PD z_$Qq7Gl|D@Qo{av=jkh6N3F8cnv&Y6bGqu#j!hZ>T#5iY&VOqryeRl_TESr>a0swz4OGyJF4#`C<>+ zN*R)KzDcfoo%A8emLnuo_14qpdGon$7rOMV)AYG4V{_uOOy(@EhW(X(4O{FFlwUSj zXq(yW;Qg-q(f5ilhxnJZe$$?23iG#f+}Ys$iEGuWxc{tvd`%4Vo*&$p8*quw&pS*+ zwEHM?p4`)&JF=&ER_{)fsFzN4>PV3|e_@Ne&eNxF7uV$fVK^Om`oq2jq0fPV$>8bg K=d#Wzp$P!o(W!O- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/universal/top.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/universal/top.png new file mode 100644 index 0000000000000000000000000000000000000000..0fb382cebd2135cee0ad1c19d925519965b2354c GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pdfpR zr>`sf12zFJZiBPM^=p7aY)RhkE)4%caKYZ?lNlHo^*vo2Lo7}&4KmDYHV}F0aaJZl zOSXe+vFye}j1F0DH@w??cyBuMH?Sxh1YM22Vc}5R8=k}I!KvYCU30tY|NiIipX)PD z_$Qq7Gl|D@Qo{av=jkh6N3F8cnv&Y6bGqu#j!hZ>T#5iY&VOqryeRl_TESr>a0swz4OGyJF4#`C<>+ zN*R)KzDcfoo%A8emLnuo_14qpdGon$7rOMV)AYG4V{_uOOy(@EhW(X(4O{FFlwUSj zXq(yW;Qg-q(f5ilhxnJZe$$?23iG#f+}Ys$iEGuWxc{tvd`%4Vo*&$p8*quw&pS*+ zwEHM?p4`)&JF=&ER_{)fsFzN4>PV3|e_@Ne&eNxF7uV$fVK^Om`oq2jq0fPV$>8bg K=d#Wzp$P!o(W!O- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv/in.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv/in.png new file mode 100644 index 0000000000000000000000000000000000000000..6318e000b95fff268df3e2058985f21a39da93a8 GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G^tAk28_ZrvZCAbW|YuPgflHUTbPhP@wNv@tL+>Up|2hFF|lJJ~Rg$&ttP{{oqo zF22sbHkpRZjL372DpoI?w#&5MVdzvYXwP}IaieXfnrlMYNj4$QnBFgM&F_Ef@z#7e zuY#$ee^t}bj=b%&TMs{E2=rXWC0P3Sqeb>?U(U@PN0S=)7$SN$Na&yVTPMGaP0)3- z1j8AnN1FF-m$asZybo1U3s4Xc?%)t%>W~!S_&j~*ZcYWYFIBeRZ|9zVx+!&gv0Mb3 zK*Kg9Pj^zS?CytewYAuuo*JYD@< J);T3K0RTx0rCk63 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv/out.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv/out.png new file mode 100644 index 0000000000000000000000000000000000000000..a7d2a8b39207a5a56200d7c94fd0dd9bf3b4a1b7 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pdfpR zr>`sfeQpkJ14DVyBRxPNwj^(N7l!{JxM1({$v}}0o-U3d7N_@4w&puzz|)p|W%Cya z*@We<1S@11udO=X;9SyfaKNQX=*DD?G~+^7tvFpKmT5ZfWq-H+d(0%*nZM?G=$chs z+jh&=vOGw05qU93yzcYBc`njxgN@xNA|0swQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv/side.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv/side.png new file mode 100644 index 0000000000000000000000000000000000000000..06a796bbe5f2e6b415aac0fd828a8633cfc164a3 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pdfpR zr>`sfeP$6pQLVu5d%A!^Y)RhkEsWZ796b5XkJt cE1?H8{BM;0!@4c!FM(8hy85}Sb4q9e0B^Y@dH?_b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv_tank/in.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv_tank/in.png new file mode 100644 index 0000000000000000000000000000000000000000..efb1b176ed015a5e72f5f662e70dcde5db085c3e GIT binary patch literal 431 zcmV;g0Z{&lP)0EO@8hsh7Z#DJbkGz=t~)+}JOD6BQjM;-Yaf6FMqs2V6H9e+Dt(N< zToOP5LsB~&Am``%F86Q=0P;wcm!CW*m&@fQ$g+$i9|__(LJ$Nu*>1Nbj^i`}27jGS z9eW(d3`V=pVB5AE!NXg)uKYX4`FuwDnIeiJc%Fyj;Q-flv3^@)P*B0`K7&ou>=&?s zRgE<5!c{Go%Q~ZU-UyN;DL2BR0pdfpR zr>`sfeQpkJBU$<1r``gE*pj^6T^Rm@;DWu&Co?cGa(KEphFF|l8*G@@>>%)E@+0;c zS~r9=o>(m?mZ@N{Vfgic{lUE@4j~FwJfVF`-x=iu>XRQut4@@0?9hwMoGp9y&bd2x znGQVC|EqlCyX~!Y&65}=-WDs3U97>Sk-H$};h(Z&20Q}mneL|k-J~;7w%_Bj$jRWQ z$VUH9-*>9G2b$;}_{rVq)DgIUQ4y!@=i1HzLy5uD)z4*}Q$iB}#~PcR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv_tank/side.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv_tank/side.png new file mode 100644 index 0000000000000000000000000000000000000000..06a796bbe5f2e6b415aac0fd828a8633cfc164a3 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pdfpR zr>`sfeP$6pQLVu5d%A!^Y)RhkEsWZ796b5XkJt cE1?H8{BM;0!@4c!FM(8hy85}Sb4q9e0B^Y@dH?_b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/tank/in.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/tank/in.png new file mode 100644 index 0000000000000000000000000000000000000000..7de298027d1a60f74255daacb9e62d9251c0be59 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pdfpR zr>`sf12zFJZYi-7+p2&MffOGd^J0FkPnM%|dpECPABBUFv3h7h)cZMmMd{)zAvHs=4{={QIB(pXW0* z{83G7+?Lx}6+U5;V`%7paRbGrCMi0r5(>Gm_iMl0)%T*??XrnR7t_z5Jvyg7e$Bck zE^*@i=i|v;7JbWEdlH?UvTbh{OSCDg9eJp>V9KVav;J=IYn5ja6J}>TCgIk&YhB>9 zrM@%fJ!jb=AeKDk;O#2&#(6e!r|y4>Y`j}%p49i)XLf~E>a`8?pV-D+-}|4-cBYD_ z(;^M02fqbk4oonYp1vl`|G$ApywB_W2BR0pdfpR zr>`sfeQpkJ6VBl3onk;Cwj^(N7l!{JxM1({$qWpP+@3CuAr`0i1{>xzI|%GiKgw?q zx|7T(O?8t_^CcE9vA*~2*Ggq4=L`AT*UfwGQD%Ll@XVs= zFLoX1{ImD|WI>jLI~oMmyG#m-`(iC~{xe6k{rW;Rg_Z*gSFO0&v&2s3cq!-RT)y6IB!6 z-T$~|`yM%Dkh1Un;Zm81Wvz`ibF*@ccJ4l?H1}2J)>rxFi4trjvEk8A*_H0Eu3fhO a8hhKut37S+StEb}#o+1c=d#Wzp$Pz)2BR0pdfpR zr>`sfeP$6pQLVu5d%A!^Y)RhkEsWZ796b5XkJt cE1?H8{BM;0!@4c!FM(8hy85}Sb4q9e0B^Y@dH?_b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/universal/in.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/universal/in.png new file mode 100644 index 0000000000000000000000000000000000000000..0fb382cebd2135cee0ad1c19d925519965b2354c GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pdfpR zr>`sf12zFJZiBPM^=p7aY)RhkE)4%caKYZ?lNlHo^*vo2Lo7}&4KmDYHV}F0aaJZl zOSXe+vFye}j1F0DH@w??cyBuMH?Sxh1YM22Vc}5R8=k}I!KvYCU30tY|NiIipX)PD z_$Qq7Gl|D@Qo{av=jkh6N3F8cnv&Y6bGqu#j!hZ>T#5iY&VOqryeRl_TESr>a0swz4OGyJF4#`C<>+ zN*R)KzDcfoo%A8emLnuo_14qpdGon$7rOMV)AYG4V{_uOOy(@EhW(X(4O{FFlwUSj zXq(yW;Qg-q(f5ilhxnJZe$$?23iG#f+}Ys$iEGuWxc{tvd`%4Vo*&$p8*quw&pS*+ zwEHM?p4`)&JF=&ER_{)fsFzN4>PV3|e_@Ne&eNxF7uV$fVK^Om`oq2jq0fPV$>8bg K=d#Wzp$P!o(W!O- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/universal/out.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/universal/out.png new file mode 100644 index 0000000000000000000000000000000000000000..f6dc2d0a40067e49c5779f56cd10fda7fa151fc2 GIT binary patch literal 425 zcmV;a0apHrP)Wm31zTDaLI)O&0F3@q?Da}1!Z5^k`-oGrC<>%m*1+1m3{+JWgb-YE92(*@ zMI6Tng5V2p_cCy^*$h_Wm}UnsI_{d!$*zlZC(SUs%J>A`7z ziraWCwr#tAK%PG{l2Y1vjQTN6lW~i?1sVhLJjWqP7?`zOKOLYO2IFS48Dv@h_8>VV zh@yxA^_lw&RH_@Ozw(WY>2%UG(f54@cu!vM03s5`O+Lh(Chm6KZWB=i&-3SRVZC0# zaU58d1w+@NDphbQF~{*3k1sGN%3byADBsTK)!!9Jk_15z{ubqHCceU;C=ac7f^*Hh T1_jp#00000NkvXXu0mjfSYWRI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/universal/side.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/universal/side.png new file mode 100644 index 0000000000000000000000000000000000000000..b56846846694240e308143ff8a81461448146599 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pdfpR zr>`sfeQqIM29;^c@7@Ipu_bxCyDwvdb&7bP0l+XkK>y|?| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/susy/lang/en_us.lang b/src/main/resources/assets/susy/lang/en_us.lang index 65f7f7282..632a46486 100644 --- a/src/main/resources/assets/susy/lang/en_us.lang +++ b/src/main/resources/assets/susy/lang/en_us.lang @@ -753,10 +753,20 @@ gregtech.machine.fluid_hatch.export_9x.mv.name=MV Nonuple Output Hatch gregtech.machine.fluid_hatch.export_9x.hv.name=HV Nonuple Output Hatch # Other multiblock parts - gregtech.machine.dumping_hatch=Dumping Hatch gregtech.machine.dumping_hatch.lv.name=Dumping Hatch +# Logistics +gregtech.machine.bridge.inv.name=Inventory Bridge +gregtech.machine.bridge.tank.name=Tank Bridge +gregtech.machine.bridge.inv_tank.name=Inventory and Tank Bridge +gregtech.machine.bridge.universal.name=Universal Bridge + +gregtech.machine.extender.inv.name=Inventory Extender +gregtech.machine.extender.tank.name=Tank Extender +gregtech.machine.extender.inv_tank.name=Inventory and Tank Extender +gregtech.machine.extender.universal.name=Universal Extender + # Metaitems metaitem.catalyst_bed_support_grid.name=Catalyst Bed Support Grid metaitem.conveyor.steam.name=Steam Conveyor From 546672d7168fdd60d84e2ba1eb92149e9e498bd2 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Wed, 4 Dec 2024 11:56:16 +0800 Subject: [PATCH 02/19] done (hopefully) --- .../theoneprobe/TheOneProbeCompatibility.java | 13 ------ .../logistics/MetaTileEntityDelegator.java | 31 +++++++------- .../supersymmetry/client/ClientProxy.java | 2 - .../SuSyMetaTileEntities.java | 18 ++++----- .../logistics/MetaTileEntityBridge.java | 11 +++-- .../logistics/MetaTileEntityExtender.java | 13 ++++-- .../MetaTileEntityEvaporationPool.java | 7 +++- .../theoneprobe/TheOneProbeModule.java | 29 +++++++++++++ .../provider/DelegatorInfoProvider.java | 38 ++++++++++++++++++ .../EvaporationPoolInfoProvider.java | 2 +- .../supersymmetry/modules/SuSyModules.java | 1 + .../blocks/logistics/bridges/inv/bottom.png | Bin 417 -> 1860 bytes .../blocks/logistics/bridges/inv/side.png | Bin 417 -> 1860 bytes .../blocks/logistics/bridges/inv/top.png | Bin 417 -> 1860 bytes .../logistics/bridges/inv_tank/bottom.png | Bin 431 -> 1668 bytes .../logistics/bridges/inv_tank/side.png | Bin 431 -> 1668 bytes .../blocks/logistics/bridges/inv_tank/top.png | Bin 431 -> 1668 bytes .../blocks/logistics/bridges/tank/bottom.png | Bin 374 -> 1655 bytes .../blocks/logistics/bridges/tank/side.png | Bin 374 -> 1655 bytes .../blocks/logistics/bridges/tank/top.png | Bin 374 -> 1655 bytes .../logistics/bridges/universal/bottom.png | Bin 418 -> 1697 bytes .../logistics/bridges/universal/side.png | Bin 418 -> 1697 bytes .../logistics/bridges/universal/top.png | Bin 418 -> 1697 bytes .../blocks/logistics/extenders/inv/in.png | Bin 417 -> 1860 bytes .../blocks/logistics/extenders/inv/out.png | Bin 355 -> 1806 bytes .../logistics/extenders/inv_tank/in.png | Bin 431 -> 1668 bytes .../logistics/extenders/inv_tank/out.png | Bin 379 -> 1612 bytes .../blocks/logistics/extenders/tank/in.png | Bin 374 -> 1655 bytes .../blocks/logistics/extenders/tank/out.png | Bin 382 -> 1649 bytes .../logistics/extenders/universal/in.png | Bin 418 -> 1697 bytes .../logistics/extenders/universal/out.png | Bin 425 -> 1702 bytes .../logistics/extenders/universal/side.png | Bin 196 -> 1451 bytes .../resources/assets/susy/lang/en_us.lang | 11 +++++ 33 files changed, 127 insertions(+), 49 deletions(-) delete mode 100644 src/main/java/supersymmetry/api/integration/theoneprobe/TheOneProbeCompatibility.java create mode 100644 src/main/java/supersymmetry/integration/theoneprobe/TheOneProbeModule.java create mode 100644 src/main/java/supersymmetry/integration/theoneprobe/provider/DelegatorInfoProvider.java rename src/main/java/supersymmetry/{api/integration => integration/theoneprobe/provider}/EvaporationPoolInfoProvider.java (97%) diff --git a/src/main/java/supersymmetry/api/integration/theoneprobe/TheOneProbeCompatibility.java b/src/main/java/supersymmetry/api/integration/theoneprobe/TheOneProbeCompatibility.java deleted file mode 100644 index 73f48d0f9..000000000 --- a/src/main/java/supersymmetry/api/integration/theoneprobe/TheOneProbeCompatibility.java +++ /dev/null @@ -1,13 +0,0 @@ -package supersymmetry.api.integration.theoneprobe; - -import mcjty.theoneprobe.TheOneProbe; -import mcjty.theoneprobe.api.ITheOneProbe; -import supersymmetry.api.integration.EvaporationPoolInfoProvider; - -public class TheOneProbeCompatibility { - - public static void registerCompatibility() { - ITheOneProbe oneProbe = TheOneProbe.theOneProbeImp; - oneProbe.registerProvider(new EvaporationPoolInfoProvider()); - } -} diff --git a/src/main/java/supersymmetry/api/metatileentity/logistics/MetaTileEntityDelegator.java b/src/main/java/supersymmetry/api/metatileentity/logistics/MetaTileEntityDelegator.java index 2a4e0d32a..b5184e140 100644 --- a/src/main/java/supersymmetry/api/metatileentity/logistics/MetaTileEntityDelegator.java +++ b/src/main/java/supersymmetry/api/metatileentity/logistics/MetaTileEntityDelegator.java @@ -3,25 +3,24 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.ColourMultiplier; import codechicken.lib.render.pipeline.IVertexOperation; +import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; -import gregtech.api.GTValues; import gregtech.api.capability.GregtechCapabilities; import gregtech.api.capability.IEnergyContainer; import gregtech.api.gui.ModularUI; -import gregtech.api.metatileentity.IDataInfoProvider; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.MetaTileEntityHolder; import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; -import gregtech.client.renderer.texture.cube.SimpleSidedCubeRenderer; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.FluidStack; @@ -36,18 +35,19 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; -public abstract class MetaTileEntityDelegator extends MetaTileEntity implements IDelegator, IDataInfoProvider { +public abstract class MetaTileEntityDelegator extends MetaTileEntity implements IDelegator { protected final Predicate> capFilter; + protected final int baseColor; - public MetaTileEntityDelegator(ResourceLocation metaTileEntityId, Predicate> capFilter) { + public MetaTileEntityDelegator(ResourceLocation metaTileEntityId, Predicate> capFilter, int baseColor) { super(metaTileEntityId); this.capFilter = capFilter; + this.baseColor = baseColor; } @Override @@ -75,30 +75,31 @@ protected T getDelegatedCapability(Capability capability, EnumFacing side public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { IVertexOperation[] colouredPipeline = ArrayUtils.add(pipeline, new ColourMultiplier(GTUtility.convertRGBtoOpaqueRGBA_CL(this.getPaintingColorForRendering()))); - getBaseRenderer().render(renderState, translation, colouredPipeline); + for (EnumFacing facing : EnumFacing.values()) { + Textures.renderFace(renderState, translation, colouredPipeline, facing, Cuboid6.full, this.getBaseTexture(), BlockRenderLayer.CUTOUT_MIPPED); + } } @SideOnly(Side.CLIENT) - protected SimpleSidedCubeRenderer getBaseRenderer() { - return Textures.VOLTAGE_CASINGS[GTValues.LV]; + protected TextureAtlasSprite getBaseTexture() { + return Textures.PIPE_SIDE; } @Override @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, @Nullable World world, @NotNull List tooltip, boolean advanced) { super.addInformation(stack, world, tooltip, advanced); - // TODO + tooltip.add(I18n.format("gregtech.machine.delegator.tooltip.non_recursion")); } @SideOnly(Side.CLIENT) public Pair getParticleTexture() { - return Pair.of(getBaseRenderer().getParticleSprite(), getPaintingColorForRendering()); + return Pair.of(getBaseTexture(), getPaintingColorForRendering()); } @Override - @NotNull - public List getDataInfo() { - return new ArrayList<>(); // TODO + public int getDefaultPaintingColor() { + return this.baseColor; } @Override diff --git a/src/main/java/supersymmetry/client/ClientProxy.java b/src/main/java/supersymmetry/client/ClientProxy.java index a952c6d2a..a8f1d5611 100644 --- a/src/main/java/supersymmetry/client/ClientProxy.java +++ b/src/main/java/supersymmetry/client/ClientProxy.java @@ -15,7 +15,6 @@ import net.minecraftforge.fml.relauncher.SideOnly; import org.jetbrains.annotations.NotNull; import supersymmetry.Supersymmetry; -import supersymmetry.api.integration.theoneprobe.TheOneProbeCompatibility; import supersymmetry.api.recipes.catalysts.CatalystGroup; import supersymmetry.api.recipes.catalysts.CatalystInfo; import supersymmetry.common.CommonProxy; @@ -46,7 +45,6 @@ public void load() { super.load(); SuSyMetaBlocks.registerColors(); SuSyFluidTooltipLoader.registerTooltips(); - TheOneProbeCompatibility.registerCompatibility(); } @SubscribeEvent diff --git a/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java b/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java index e263814b4..f2459f37d 100644 --- a/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java +++ b/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java @@ -236,15 +236,15 @@ public static void init() { ELECTROLYTIC_CELL = registerMetaTileEntity(14634, new MetaTileEntityElectrolyticCell(susyId("electrolytic_cell"))); GRAVITY_SEPARATOR = registerMetaTileEntity(15052, new MetaTileEntityGravitySeparator(susyId("gravity_separator"))); - INV_BRIDGE = registerMetaTileEntity(14733, new MetaTileEntityBridge(susyId("bridge.inv"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, SusyTextures.INV_BRIDGE)); - TANK_BRIDGE = registerMetaTileEntity(14734, new MetaTileEntityBridge(susyId("bridge.tank"), cap -> cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.TANK_BRIDGE)); - INV_TANK_BRIDGE = registerMetaTileEntity(14735, new MetaTileEntityBridge(susyId("bridge.inv_tank"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.INV_TANK_BRIDGE)); - UNIVERSAL_BRIDGE = registerMetaTileEntity(14736, new MetaTileEntityBridge(susyId("bridge.universal"), cap -> true, SusyTextures.UNIVERSAL_BRIDGE)); - - INV_EXTENDER = registerMetaTileEntity(14737, new MetaTileEntityExtender(susyId("extender.inv"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, SusyTextures.INV_EXTENDER)); - TANK_EXTENDER = registerMetaTileEntity(14738, new MetaTileEntityExtender(susyId("extender.tank"), cap -> cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.TANK_EXTENDER)); - INV_TANK_EXTENDER = registerMetaTileEntity(14739, new MetaTileEntityExtender(susyId("extender.inv_tank"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.INV_TANK_EXTENDER)); - UNIVERSAL_EXTENDER = registerMetaTileEntity(14740, new MetaTileEntityExtender(susyId("extender.universal"), cap -> true, SusyTextures.UNIVERSAL_EXTENDER)); + INV_BRIDGE = registerMetaTileEntity(14733, new MetaTileEntityBridge(susyId("bridge.inv"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, SusyTextures.INV_BRIDGE, Materials.Steel)); + TANK_BRIDGE = registerMetaTileEntity(14734, new MetaTileEntityBridge(susyId("bridge.tank"), cap -> cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.TANK_BRIDGE, Materials.Steel)); + INV_TANK_BRIDGE = registerMetaTileEntity(14735, new MetaTileEntityBridge(susyId("bridge.inv_tank"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.INV_TANK_BRIDGE, Materials.Steel)); + UNIVERSAL_BRIDGE = registerMetaTileEntity(14736, new MetaTileEntityBridge(susyId("bridge.universal"), cap -> true, SusyTextures.UNIVERSAL_BRIDGE, Materials.StainlessSteel)); + + INV_EXTENDER = registerMetaTileEntity(14737, new MetaTileEntityExtender(susyId("extender.inv"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, SusyTextures.INV_EXTENDER, Materials.Steel)); + TANK_EXTENDER = registerMetaTileEntity(14738, new MetaTileEntityExtender(susyId("extender.tank"), cap -> cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.TANK_EXTENDER, Materials.Steel)); + INV_TANK_EXTENDER = registerMetaTileEntity(14739, new MetaTileEntityExtender(susyId("extender.inv_tank"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.INV_TANK_EXTENDER, Materials.Steel)); + UNIVERSAL_EXTENDER = registerMetaTileEntity(14740, new MetaTileEntityExtender(susyId("extender.universal"), cap -> true, SusyTextures.UNIVERSAL_EXTENDER, Materials.StainlessSteel)); PRIMITIVE_SMELTER = registerMetaTileEntity(14800, new MetaTileEntityPrimitiveSmelter(susyId("primitive_smelter"))); PRIMITIVE_ITEM_IMPORT = registerMetaTileEntity(14801, new MetaTileEntityPrimitiveItemBus(susyId("primitive_item_import"), false)); diff --git a/src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityBridge.java b/src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityBridge.java index 9a5b8a202..37b2b7fed 100644 --- a/src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityBridge.java +++ b/src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityBridge.java @@ -5,6 +5,7 @@ import codechicken.lib.vec.Matrix4; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.unification.material.Material; import gregtech.client.renderer.ICubeRenderer; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; @@ -18,14 +19,18 @@ public class MetaTileEntityBridge extends MetaTileEntityDelegator { protected final ICubeRenderer renderer; - public MetaTileEntityBridge(ResourceLocation metaTileEntityId, Predicate> capFilter, ICubeRenderer renderer) { - super(metaTileEntityId, capFilter); + public MetaTileEntityBridge(ResourceLocation metaTileEntityId, Predicate> capFilter, ICubeRenderer renderer, Material baseMaterial) { + this(metaTileEntityId, capFilter, renderer, baseMaterial.getMaterialRGB()); + } + + public MetaTileEntityBridge(ResourceLocation metaTileEntityId, Predicate> capFilter, ICubeRenderer renderer, int baseColor) { + super(metaTileEntityId, capFilter, baseColor); this.renderer = renderer; } @Override public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEntity) { - return new MetaTileEntityBridge(metaTileEntityId, capFilter, renderer); + return new MetaTileEntityBridge(metaTileEntityId, capFilter, renderer, baseColor); } @Override diff --git a/src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityExtender.java b/src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityExtender.java index 306f2bed5..2812863de 100644 --- a/src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityExtender.java +++ b/src/main/java/supersymmetry/common/metatileentities/logistics/MetaTileEntityExtender.java @@ -6,6 +6,7 @@ import codechicken.lib.vec.Matrix4; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.unification.material.Material; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -31,14 +32,18 @@ public class MetaTileEntityExtender extends MetaTileEntityDelegator { protected final ExtenderRender renderer; protected EnumFacing inputFacing; - public MetaTileEntityExtender(ResourceLocation metaTileEntityId, Predicate> capFilter, ExtenderRender renderer) { - super(metaTileEntityId, capFilter); + public MetaTileEntityExtender(ResourceLocation metaTileEntityId, Predicate> capFilter, ExtenderRender renderer, Material baseMaterial) { + this(metaTileEntityId, capFilter, renderer, baseMaterial.getMaterialRGB()); + } + + public MetaTileEntityExtender(ResourceLocation metaTileEntityId, Predicate> capFilter, ExtenderRender renderer, int baseColor) { + super(metaTileEntityId, capFilter, baseColor); this.renderer = renderer; } @Override public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEntity) { - return new MetaTileEntityExtender(metaTileEntityId, capFilter, renderer); + return new MetaTileEntityExtender(metaTileEntityId, capFilter, renderer, baseColor); } @Override @@ -103,7 +108,7 @@ public void receiveCustomData(int dataId, @NotNull PacketBuffer buf) { @Override public boolean isValidFrontFacing(EnumFacing facing) { - return super.isValidFrontFacing(facing) && facing != inputFacing; + return facing != getFrontFacing() && facing != inputFacing; } @Override diff --git a/src/main/java/supersymmetry/common/metatileentities/multi/electric/MetaTileEntityEvaporationPool.java b/src/main/java/supersymmetry/common/metatileentities/multi/electric/MetaTileEntityEvaporationPool.java index e5a766a65..fe1f2d76a 100644 --- a/src/main/java/supersymmetry/common/metatileentities/multi/electric/MetaTileEntityEvaporationPool.java +++ b/src/main/java/supersymmetry/common/metatileentities/multi/electric/MetaTileEntityEvaporationPool.java @@ -35,7 +35,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; -import net.minecraft.util.*; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; @@ -47,11 +50,11 @@ import org.jetbrains.annotations.NotNull; import supersymmetry.api.SusyLog; import supersymmetry.api.capability.impl.EvapRecipeLogic; -import supersymmetry.api.integration.EvaporationPoolInfoProvider; import supersymmetry.api.recipes.SuSyRecipeMaps; import supersymmetry.api.recipes.properties.EvaporationEnergyProperty; import supersymmetry.common.blocks.BlockEvaporationBed; import supersymmetry.common.blocks.SuSyBlocks; +import supersymmetry.integration.theoneprobe.provider.EvaporationPoolInfoProvider; import javax.annotation.Nonnull; import java.util.*; diff --git a/src/main/java/supersymmetry/integration/theoneprobe/TheOneProbeModule.java b/src/main/java/supersymmetry/integration/theoneprobe/TheOneProbeModule.java new file mode 100644 index 000000000..9ee608bbf --- /dev/null +++ b/src/main/java/supersymmetry/integration/theoneprobe/TheOneProbeModule.java @@ -0,0 +1,29 @@ +package supersymmetry.integration.theoneprobe; + +import gregtech.api.modules.GregTechModule; +import gregtech.api.util.Mods; +import gregtech.integration.IntegrationSubmodule; +import mcjty.theoneprobe.TheOneProbe; +import mcjty.theoneprobe.api.ITheOneProbe; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import supersymmetry.Supersymmetry; +import supersymmetry.integration.theoneprobe.provider.DelegatorInfoProvider; +import supersymmetry.integration.theoneprobe.provider.EvaporationPoolInfoProvider; +import supersymmetry.modules.SuSyModules; + +@GregTechModule( + moduleID = SuSyModules.MODULE_TOP, + containerID = Supersymmetry.MODID, + modDependencies = Mods.Names.THE_ONE_PROBE, + name = "SuSy TheOneProbe Integration", + description = "SuSy TheOneProbe Integration Module") +public class TheOneProbeModule extends IntegrationSubmodule { + + @Override + public void init(FMLInitializationEvent event) { + getLogger().info("TheOneProbe found. Enabling SuSy top integration..."); + ITheOneProbe oneProbe = TheOneProbe.theOneProbeImp; + oneProbe.registerProvider(new EvaporationPoolInfoProvider()); + oneProbe.registerProvider(new DelegatorInfoProvider()); + } +} diff --git a/src/main/java/supersymmetry/integration/theoneprobe/provider/DelegatorInfoProvider.java b/src/main/java/supersymmetry/integration/theoneprobe/provider/DelegatorInfoProvider.java new file mode 100644 index 000000000..412b4e613 --- /dev/null +++ b/src/main/java/supersymmetry/integration/theoneprobe/provider/DelegatorInfoProvider.java @@ -0,0 +1,38 @@ +package supersymmetry.integration.theoneprobe.provider; + +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import mcjty.theoneprobe.api.IProbeHitData; +import mcjty.theoneprobe.api.IProbeInfo; +import mcjty.theoneprobe.api.IProbeInfoProvider; +import mcjty.theoneprobe.api.ProbeMode; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import supersymmetry.Supersymmetry; +import supersymmetry.api.metatileentity.logistics.IDelegator; + +public class DelegatorInfoProvider implements IProbeInfoProvider { + + @Override + public String getID() { + return Supersymmetry.MODID + ":delegator_info_provider"; + } + + @Override + public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, EntityPlayer player, World world, IBlockState state, + IProbeHitData data) { + if (state.getBlock().hasTileEntity(state)) { + TileEntity te = world.getTileEntity(data.getPos()); + if (te instanceof IGregTechTileEntity igtte) { + MetaTileEntity mte = igtte.getMetaTileEntity(); + if (mte instanceof IDelegator delegator) { + probeInfo.text(I18n.format("gregtech.top.delegator.delegating_face", + delegator.getDelegatingFacing(data.getSideHit()))); + } + } + } + } +} diff --git a/src/main/java/supersymmetry/api/integration/EvaporationPoolInfoProvider.java b/src/main/java/supersymmetry/integration/theoneprobe/provider/EvaporationPoolInfoProvider.java similarity index 97% rename from src/main/java/supersymmetry/api/integration/EvaporationPoolInfoProvider.java rename to src/main/java/supersymmetry/integration/theoneprobe/provider/EvaporationPoolInfoProvider.java index 48d6b42f0..a5df2c75a 100644 --- a/src/main/java/supersymmetry/api/integration/EvaporationPoolInfoProvider.java +++ b/src/main/java/supersymmetry/integration/theoneprobe/provider/EvaporationPoolInfoProvider.java @@ -1,4 +1,4 @@ -package supersymmetry.api.integration; +package supersymmetry.integration.theoneprobe.provider; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; diff --git a/src/main/java/supersymmetry/modules/SuSyModules.java b/src/main/java/supersymmetry/modules/SuSyModules.java index 3924cd29a..b8731b7a9 100644 --- a/src/main/java/supersymmetry/modules/SuSyModules.java +++ b/src/main/java/supersymmetry/modules/SuSyModules.java @@ -10,6 +10,7 @@ public class SuSyModules implements IModuleContainer { public static final String MODULE_CORE = "susy_core"; public static final String MODULE_BDSAndM = "bdsandm_integration"; public static final String MODULE_BAUBLES = "baubles_integration"; + public static final String MODULE_TOP = "susy_top_integration"; @Override public String getID() { diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv/bottom.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv/bottom.png index 6318e000b95fff268df3e2058985f21a39da93a8..74e85c7c462c519d9a792edc1aff5460e05c4ac6 100644 GIT binary patch literal 1860 zcmbVNeQeZZ81Kl2H{22t4TKTw3QUOf`fLn|eU>H^%X$iNZ>jUoLS&Yt)%-jIzQfan4ZDZK|%iN<3JNV8D z468Vy#yXsi=vGlSG%rvL33_vyiO?9fxjttCxd%G91e2;BB7Q$HLEx$qB6j$rbkuBu zDYd2Fg4_FBV{(6wEGR_%7JPF~LS{ z4R10mhznkZlxdp9dBH33a)6WNjW|oQ97XdK6Ci0`^a~Tt4J%18f*?>dOR+485TxCwJ0M5u_L?F?7}~O>nvQDdxXTD6Bjbb! z6zY5qnpvXN?LwVU#i$%GDaK2?Ipu+hT*8?dE1h?)$P`RN4eE}KuuKVy$`p;3;0w}f zS_y4C&Alk1LT(G9?O2})sdi`^8B2!Ey~yL5Vqj*rytR*knQA7*@<|R^$ZHPd`QnMVg+6Mo}Xu zzyUXbxfsKUXlL2~fDJ`W^xYAv$YR2>&QnrIY%`92a`R2zxaSNI~f z!<~gyTE+9NBLdm&?hqlnvOSn$2@BTG_if}a5++}H= zqMOo0hB~6Q(7gSiyR#0%%BV=VAr^e?lOg8yMNCz5S4*&pfBeId;g?=k51*}FpBmoP zbFzBxXN%5Ue9(7v)kxc~t)8=~nsfWt%{_m^c(m@&Y5o#+Wp-0-dEHRN`@PN|JRBh! zFN`I|pPN2^H5ZOg>cT;GRjc=$nLPE^K%lmK=;2uW+Suv# z>w6cy@XIxEpdt=OpQ(QDXs5KitA1qZ$xCMU#1FHtPR+%>%NVBywj={@k9(xSP~X(t o=f8a^U43fV8-HiN82h9A$Fgr%W;Xp<<^Ja)&8^{28@pfp2O)!O!vFvP delta 390 zcmV;10eSw!4xs~(B!32COGiWi{{a60|De66lK=n!32;bRa{vGf5&!@T5&_cPe*6Fc z00(qQO+^Rb1`rAj0KM?&h5!HoE=fc|R5;76lQC`rK@3Izpd5sX4vCJ29Dr$PScjp;g2Lu4X_HFA_)MbG8J}2=F2TYvL`~CjP z7KpG~tx{eeF~VuB%%KIn`yq7zU{jV@zph*2bXugzWYW4}I2>Xy7}NlZ2K%%h#Z#yr kp(+?Xk1n(rANUu(0FS=SL#=!BF#rGn07*qoM6N<$f)ov-hX4Qo diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv/side.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv/side.png index 6318e000b95fff268df3e2058985f21a39da93a8..74e85c7c462c519d9a792edc1aff5460e05c4ac6 100644 GIT binary patch literal 1860 zcmbVNeQeZZ81Kl2H{22t4TKTw3QUOf`fLn|eU>H^%X$iNZ>jUoLS&Yt)%-jIzQfan4ZDZK|%iN<3JNV8D z468Vy#yXsi=vGlSG%rvL33_vyiO?9fxjttCxd%G91e2;BB7Q$HLEx$qB6j$rbkuBu zDYd2Fg4_FBV{(6wEGR_%7JPF~LS{ z4R10mhznkZlxdp9dBH33a)6WNjW|oQ97XdK6Ci0`^a~Tt4J%18f*?>dOR+485TxCwJ0M5u_L?F?7}~O>nvQDdxXTD6Bjbb! z6zY5qnpvXN?LwVU#i$%GDaK2?Ipu+hT*8?dE1h?)$P`RN4eE}KuuKVy$`p;3;0w}f zS_y4C&Alk1LT(G9?O2})sdi`^8B2!Ey~yL5Vqj*rytR*knQA7*@<|R^$ZHPd`QnMVg+6Mo}Xu zzyUXbxfsKUXlL2~fDJ`W^xYAv$YR2>&QnrIY%`92a`R2zxaSNI~f z!<~gyTE+9NBLdm&?hqlnvOSn$2@BTG_if}a5++}H= zqMOo0hB~6Q(7gSiyR#0%%BV=VAr^e?lOg8yMNCz5S4*&pfBeId;g?=k51*}FpBmoP zbFzBxXN%5Ue9(7v)kxc~t)8=~nsfWt%{_m^c(m@&Y5o#+Wp-0-dEHRN`@PN|JRBh! zFN`I|pPN2^H5ZOg>cT;GRjc=$nLPE^K%lmK=;2uW+Suv# z>w6cy@XIxEpdt=OpQ(QDXs5KitA1qZ$xCMU#1FHtPR+%>%NVBywj={@k9(xSP~X(t o=f8a^U43fV8-HiN82h9A$Fgr%W;Xp<<^Ja)&8^{28@pfp2O)!O!vFvP delta 390 zcmV;10eSw!4xs~(B!32COGiWi{{a60|De66lK=n!32;bRa{vGf5&!@T5&_cPe*6Fc z00(qQO+^Rb1`rAj0KM?&h5!HoE=fc|R5;76lQC`rK@3Izpd5sX4vCJ29Dr$PScjp;g2Lu4X_HFA_)MbG8J}2=F2TYvL`~CjP z7KpG~tx{eeF~VuB%%KIn`yq7zU{jV@zph*2bXugzWYW4}I2>Xy7}NlZ2K%%h#Z#yr kp(+?Xk1n(rANUu(0FS=SL#=!BF#rGn07*qoM6N<$f)ov-hX4Qo diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv/top.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv/top.png index 6318e000b95fff268df3e2058985f21a39da93a8..74e85c7c462c519d9a792edc1aff5460e05c4ac6 100644 GIT binary patch literal 1860 zcmbVNeQeZZ81Kl2H{22t4TKTw3QUOf`fLn|eU>H^%X$iNZ>jUoLS&Yt)%-jIzQfan4ZDZK|%iN<3JNV8D z468Vy#yXsi=vGlSG%rvL33_vyiO?9fxjttCxd%G91e2;BB7Q$HLEx$qB6j$rbkuBu zDYd2Fg4_FBV{(6wEGR_%7JPF~LS{ z4R10mhznkZlxdp9dBH33a)6WNjW|oQ97XdK6Ci0`^a~Tt4J%18f*?>dOR+485TxCwJ0M5u_L?F?7}~O>nvQDdxXTD6Bjbb! z6zY5qnpvXN?LwVU#i$%GDaK2?Ipu+hT*8?dE1h?)$P`RN4eE}KuuKVy$`p;3;0w}f zS_y4C&Alk1LT(G9?O2})sdi`^8B2!Ey~yL5Vqj*rytR*knQA7*@<|R^$ZHPd`QnMVg+6Mo}Xu zzyUXbxfsKUXlL2~fDJ`W^xYAv$YR2>&QnrIY%`92a`R2zxaSNI~f z!<~gyTE+9NBLdm&?hqlnvOSn$2@BTG_if}a5++}H= zqMOo0hB~6Q(7gSiyR#0%%BV=VAr^e?lOg8yMNCz5S4*&pfBeId;g?=k51*}FpBmoP zbFzBxXN%5Ue9(7v)kxc~t)8=~nsfWt%{_m^c(m@&Y5o#+Wp-0-dEHRN`@PN|JRBh! zFN`I|pPN2^H5ZOg>cT;GRjc=$nLPE^K%lmK=;2uW+Suv# z>w6cy@XIxEpdt=OpQ(QDXs5KitA1qZ$xCMU#1FHtPR+%>%NVBywj={@k9(xSP~X(t o=f8a^U43fV8-HiN82h9A$Fgr%W;Xp<<^Ja)&8^{28@pfp2O)!O!vFvP delta 390 zcmV;10eSw!4xs~(B!32COGiWi{{a60|De66lK=n!32;bRa{vGf5&!@T5&_cPe*6Fc z00(qQO+^Rb1`rAj0KM?&h5!HoE=fc|R5;76lQC`rK@3Izpd5sX4vCJ29Dr$PScjp;g2Lu4X_HFA_)MbG8J}2=F2TYvL`~CjP z7KpG~tx{eeF~VuB%%KIn`yq7zU{jV@zph*2bXugzWYW4}I2>Xy7}NlZ2K%%h#Z#yr kp(+?Xk1n(rANUu(0FS=SL#=!BF#rGn07*qoM6N<$f)ov-hX4Qo diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv_tank/bottom.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/inv_tank/bottom.png index efb1b176ed015a5e72f5f662e70dcde5db085c3e..b646bcaec3fa640787e0a841a7b1d0d65f11330c 100644 GIT binary patch literal 1668 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 delta 339 zcmV-Z0j&P_4E6$$EPoOJ01FZU(%pXi00007bV*G`2jB(}3JV$*$hLX_000JJOGiWi z{{a60|De66lK=n#14%?dR5;7MQ!#FXFckHXnmL52WJpwdw6ntj-~h0f9DwYh2S9=m zJi3Y}HV)8S;}u(is4XZeRXTjx`p@tA|L1Q4fczz9fwpaldVg1tvO!f^1Qrtq0mc|cfx50ymZeRYp63L(5Ef&U!P|N_fu1}b%HQ%?f!%&L zVvgfXn|L~9)=aRUu;x&E*oXe lIid6gp7)HkvwqxP_yo_F)4*sUJDUIi002ovPDHLkV1ko%mPr5r diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/tank/side.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/tank/side.png index 7de298027d1a60f74255daacb9e62d9251c0be59..880e4b753cb898a2ab8b5580c583f461125fdffe 100644 GIT binary patch literal 1655 zcmbVNU2GIZ9G@m)YLQ5#(grJRmX{j3w;y-y-HqL1+iU45S86#z(WL3z?%Z{Iw;$|o zd)LN*XlVQ@wLDmnR!EF5B^3=7LK?M-@C!3%+Act z@BjOM&VOHMZ`-z}WJ3u6U`?8cCKdIY;tszJ~I)NM@}NQz^dir|={iFA7ALz+@#k=|Vs;zC9f?onC? zO}ulkEi4VjCBIB>t*7czkPxWYMpQ~oXckO~bcPp_wey*!sSL!9i*$pdkm?MzQ%$;w zDZh(nB#sj(uiq8%O0^zIs-^@^@UWbhn zgK89LH7ge<5-~P~43>9sj!zk&EERA@pP9%gmn9Y_u!=R?B3QnFC1DDM3h-Ofs%imk z+0FgLqMUEHL|fqj1G632()&yaH}?~boAZVlJ-V%1J^H`+Q8+GmW56a8BU?Aax}L~q zsy)v_3AHYss@kn+vYxaacC_RKZ~)m@q@AoWyufhoupmH>AG*C;I3MJ=EHp$4K}I&Z z3G4~;JmlTbBm4ub%Sv?MwoqAuQQcG#iISqC7-kJEmeCdp!JuZ@NRx0dAkxHCm!ilJ z$%2=ceYK3o$MKBp_S7)Q7vUHb^+0V)yM^nNEB~dPAoB=b?#x-5B6pkGiQIhvw1ja1kSS1g2<-O#IQy> zmq}U_e5|w+XbAg;rw;RnKIYao9}|B7mn&Mod1k7#5{$N+t4=Qo)8XIBDi7?N zXF7hozpQ%Zm-SWOu0k6YhgYwxoL`QGiw`6Z1;xsdZIhEFi%(83_6kSpE?z0?_Ekov z-cq0Hh=SkK%=ia8JYz%G_iY-tQt7>)jp8G{SBEYxU9CCpKKW(*W&ZhMy77&rhQPv` zUFVp0uGP68lrCv!7Wy9gV{ZBT^7dW3F8$nJH0v)Po;W)*VS(zg3&-CpdH3LH^=#Kk zkV>Z~R}R`Bt}etu=@X~E+AiLhtynkre%F0z5geUsnfN^RK+*gaPxOm)Y_jUbM^5oW zA9X*v=T-ibbC+Lvt#O{Bd+RoSH~i~QC&FWoU$5G~fAsK)d(TXlzx3&alHlyq^&`qi geM@lmYvxbz-1%en`kEUXonJ$+xh?Q^WB0Rv0TI?Q^8f$< delta 339 zcmV-Z0j&P_4E6$$EPoOJ01FZU(%pXi00007bV*G`2jB(}3JV$*$hLX_000JJOGiWi z{{a60|De66lK=n#14%?dR5;7MQ!#FXFckHXnmL52WJpwdw6ntj-~h0f9DwYh2S9=m zJi3Y}HV)8S;}u(is4XZeRXTjx`p@tA|L1Q4fczz9fwpaldVg1tvO!f^1Qrtq0mc|cfx50ymZeRYp63L(5Ef&U!P|N_fu1}b%HQ%?f!%&L zVvgfXn|L~9)=aRUu;x&E*oXe lIid6gp7)HkvwqxP_yo_F)4*sUJDUIi002ovPDHLkV1ko%mPr5r diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/tank/top.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/tank/top.png index 7de298027d1a60f74255daacb9e62d9251c0be59..880e4b753cb898a2ab8b5580c583f461125fdffe 100644 GIT binary patch literal 1655 zcmbVNU2GIZ9G@m)YLQ5#(grJRmX{j3w;y-y-HqL1+iU45S86#z(WL3z?%Z{Iw;$|o zd)LN*XlVQ@wLDmnR!EF5B^3=7LK?M-@C!3%+Act z@BjOM&VOHMZ`-z}WJ3u6U`?8cCKdIY;tszJ~I)NM@}NQz^dir|={iFA7ALz+@#k=|Vs;zC9f?onC? zO}ulkEi4VjCBIB>t*7czkPxWYMpQ~oXckO~bcPp_wey*!sSL!9i*$pdkm?MzQ%$;w zDZh(nB#sj(uiq8%O0^zIs-^@^@UWbhn zgK89LH7ge<5-~P~43>9sj!zk&EERA@pP9%gmn9Y_u!=R?B3QnFC1DDM3h-Ofs%imk z+0FgLqMUEHL|fqj1G632()&yaH}?~boAZVlJ-V%1J^H`+Q8+GmW56a8BU?Aax}L~q zsy)v_3AHYss@kn+vYxaacC_RKZ~)m@q@AoWyufhoupmH>AG*C;I3MJ=EHp$4K}I&Z z3G4~;JmlTbBm4ub%Sv?MwoqAuQQcG#iISqC7-kJEmeCdp!JuZ@NRx0dAkxHCm!ilJ z$%2=ceYK3o$MKBp_S7)Q7vUHb^+0V)yM^nNEB~dPAoB=b?#x-5B6pkGiQIhvw1ja1kSS1g2<-O#IQy> zmq}U_e5|w+XbAg;rw;RnKIYao9}|B7mn&Mod1k7#5{$N+t4=Qo)8XIBDi7?N zXF7hozpQ%Zm-SWOu0k6YhgYwxoL`QGiw`6Z1;xsdZIhEFi%(83_6kSpE?z0?_Ekov z-cq0Hh=SkK%=ia8JYz%G_iY-tQt7>)jp8G{SBEYxU9CCpKKW(*W&ZhMy77&rhQPv` zUFVp0uGP68lrCv!7Wy9gV{ZBT^7dW3F8$nJH0v)Po;W)*VS(zg3&-CpdH3LH^=#Kk zkV>Z~R}R`Bt}etu=@X~E+AiLhtynkre%F0z5geUsnfN^RK+*gaPxOm)Y_jUbM^5oW zA9X*v=T-ibbC+Lvt#O{Bd+RoSH~i~QC&FWoU$5G~fAsK)d(TXlzx3&alHlyq^&`qi geM@lmYvxbz-1%en`kEUXonJ$+xh?Q^WB0Rv0TI?Q^8f$< delta 339 zcmV-Z0j&P_4E6$$EPoOJ01FZU(%pXi00007bV*G`2jB(}3JV$*$hLX_000JJOGiWi z{{a60|De66lK=n#14%?dR5;7MQ!#FXFckHXnmL52WJpwdw6ntj-~h0f9DwYh2S9=m zJi3Y}HV)8S;}u(is4XZeRXTjx`p@tA|L1Q4fczz9fwpaldVg1tvO!f^1Qrtq0mc|cfx50ymZeRYp63L(5Ef&U!P|N_fu1}b%HQ%?f!%&L zVvgfXn|L~9)=aRUu;x&E*oXe lIid6gp7)HkvwqxP_yo_F)4*sUJDUIi002ovPDHLkV1ko%mPr5r diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/universal/bottom.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/universal/bottom.png index 0fb382cebd2135cee0ad1c19d925519965b2354c..3a0018f984505d63b5aef1a8b9a291b98ad51f58 100644 GIT binary patch literal 1697 zcmbVNe{9rL94`ZxaSXDd5|u@2QL<(9+TM@dwd~x+?#3Ni=XSfW!5_^2cz3J2Yirx> zdXq>3TLK}*e-;Ti3E85=C=M{hnGpnKU;v|F022@=21Z~%j6)&*p}yYkE=o`$OS-GkUnQSOU>jwh^sW zG=S1}3KvMyfqG~=?-43og0K>GkPa6?dI+ilCq0atW?Uqic`ztW6QfMnUzZUEcRsA$ zFjR&hlF6h!>9i|ajG$nYjbOkCENXBqrJ7c@yVBt=FoMvhlH4Ic(o zowXsM=4fR-<0t4b!sJwfvXhogX`m?NaB8O(PYV|X0>nWA$c7HFR1OQ>#IiZ~18Eb9 z99lO5T~MQpZ4X52k(3IEFwm7wO#p!|C~SdOc%mv`*4B*48sNs|YC!G<8gK?7#MVFIah9qa9EKCHE zGr0S}t_Vdjl!I~o6Re0*H1$xZC@@h)OK{LjQi6*CLX~4_X)McxWZmFo0fhWM4616E zB#{wGXA}rd3U|BQ9-I?gH14INUYz8;ZjYB2X`bh@_x*~{X+4}3i2F@UpZ%?7vvAl5tYxkR!A-7- z0U35K4Ynxb$ekesnX^9RuZeiycsESRc~nu!AKO(|W@|~mek?*GO zk|z%wUJ_n=Zu)N1sVC1C?svBhwQOp$n?J;Rl5Inm`p4uBGEMPw)Ho z{qt8Y#Yh9zpC~(uB|ESeLghSKeC|d z_hXf}PWXGSYug7(^N7&-s<}ep(7N*9@;BZb{p0qkZ#I0~x8;k1)SjQZMtX}+UpTYk z>ah(=?=439!hGekJBH_Cwrh2R#dTjEsxNtSO>trV)|wYixY%+YTMgCe8NNJu>yxod z7jFMLb+L8Pxmr@6EUWswdEbYJqaFC6m9Lqn7vJ-Jz3zkFol$3Gcm0azCZ{?)M^0TC cX?}f4m3gNqwu;}o*ZPTs0uBC;R=>REFV71}!~g&Q delta 383 zcmV-_0f7FY4Wa{(EPoOJ01FZU(%pXi00007bV*G`2jB(}3JWmJbAPM=000JJOGiWi z{{a60|De66lK=n#FG)l}R5;6}QZa6WFcjrT%^YAV9f%5}9kIdzKx#(VONLAh*+UP2 z1S2p~)m_*)Ky!^(YzasSC`mhf+j{@M=kMn)0g(O^V)@HzkfrQsOws)J}Q)D zfh@~I$Cqq#b zqTTp-L=;5`UqeiKa2_3bjBmFgeBYlI;D&VoV{G;ruIpm(Vm$~{RVCWx=Wd@0+i^sW zt|?5@96ZSL9C&G(3V^?PPJpyOz<1Lyp*?AXKuhk6;`ew~Kws&7PL}0q6Ay<7+^|dX z3aYAJ{{>DCf&iZ9!Le;n(hg2bRumPB#RG00<+-?Plu3KLVHkfKWkQH#7|+nOM=a&# d?W25e`~b^Y%kaLSRp$Tz002ovPDHLkV1fg5rRD$t diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/universal/side.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/universal/side.png index 0fb382cebd2135cee0ad1c19d925519965b2354c..3a0018f984505d63b5aef1a8b9a291b98ad51f58 100644 GIT binary patch literal 1697 zcmbVNe{9rL94`ZxaSXDd5|u@2QL<(9+TM@dwd~x+?#3Ni=XSfW!5_^2cz3J2Yirx> zdXq>3TLK}*e-;Ti3E85=C=M{hnGpnKU;v|F022@=21Z~%j6)&*p}yYkE=o`$OS-GkUnQSOU>jwh^sW zG=S1}3KvMyfqG~=?-43og0K>GkPa6?dI+ilCq0atW?Uqic`ztW6QfMnUzZUEcRsA$ zFjR&hlF6h!>9i|ajG$nYjbOkCENXBqrJ7c@yVBt=FoMvhlH4Ic(o zowXsM=4fR-<0t4b!sJwfvXhogX`m?NaB8O(PYV|X0>nWA$c7HFR1OQ>#IiZ~18Eb9 z99lO5T~MQpZ4X52k(3IEFwm7wO#p!|C~SdOc%mv`*4B*48sNs|YC!G<8gK?7#MVFIah9qa9EKCHE zGr0S}t_Vdjl!I~o6Re0*H1$xZC@@h)OK{LjQi6*CLX~4_X)McxWZmFo0fhWM4616E zB#{wGXA}rd3U|BQ9-I?gH14INUYz8;ZjYB2X`bh@_x*~{X+4}3i2F@UpZ%?7vvAl5tYxkR!A-7- z0U35K4Ynxb$ekesnX^9RuZeiycsESRc~nu!AKO(|W@|~mek?*GO zk|z%wUJ_n=Zu)N1sVC1C?svBhwQOp$n?J;Rl5Inm`p4uBGEMPw)Ho z{qt8Y#Yh9zpC~(uB|ESeLghSKeC|d z_hXf}PWXGSYug7(^N7&-s<}ep(7N*9@;BZb{p0qkZ#I0~x8;k1)SjQZMtX}+UpTYk z>ah(=?=439!hGekJBH_Cwrh2R#dTjEsxNtSO>trV)|wYixY%+YTMgCe8NNJu>yxod z7jFMLb+L8Pxmr@6EUWswdEbYJqaFC6m9Lqn7vJ-Jz3zkFol$3Gcm0azCZ{?)M^0TC cX?}f4m3gNqwu;}o*ZPTs0uBC;R=>REFV71}!~g&Q delta 383 zcmV-_0f7FY4Wa{(EPoOJ01FZU(%pXi00007bV*G`2jB(}3JWmJbAPM=000JJOGiWi z{{a60|De66lK=n#FG)l}R5;6}QZa6WFcjrT%^YAV9f%5}9kIdzKx#(VONLAh*+UP2 z1S2p~)m_*)Ky!^(YzasSC`mhf+j{@M=kMn)0g(O^V)@HzkfrQsOws)J}Q)D zfh@~I$Cqq#b zqTTp-L=;5`UqeiKa2_3bjBmFgeBYlI;D&VoV{G;ruIpm(Vm$~{RVCWx=Wd@0+i^sW zt|?5@96ZSL9C&G(3V^?PPJpyOz<1Lyp*?AXKuhk6;`ew~Kws&7PL}0q6Ay<7+^|dX z3aYAJ{{>DCf&iZ9!Le;n(hg2bRumPB#RG00<+-?Plu3KLVHkfKWkQH#7|+nOM=a&# d?W25e`~b^Y%kaLSRp$Tz002ovPDHLkV1fg5rRD$t diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/universal/top.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/bridges/universal/top.png index 0fb382cebd2135cee0ad1c19d925519965b2354c..3a0018f984505d63b5aef1a8b9a291b98ad51f58 100644 GIT binary patch literal 1697 zcmbVNe{9rL94`ZxaSXDd5|u@2QL<(9+TM@dwd~x+?#3Ni=XSfW!5_^2cz3J2Yirx> zdXq>3TLK}*e-;Ti3E85=C=M{hnGpnKU;v|F022@=21Z~%j6)&*p}yYkE=o`$OS-GkUnQSOU>jwh^sW zG=S1}3KvMyfqG~=?-43og0K>GkPa6?dI+ilCq0atW?Uqic`ztW6QfMnUzZUEcRsA$ zFjR&hlF6h!>9i|ajG$nYjbOkCENXBqrJ7c@yVBt=FoMvhlH4Ic(o zowXsM=4fR-<0t4b!sJwfvXhogX`m?NaB8O(PYV|X0>nWA$c7HFR1OQ>#IiZ~18Eb9 z99lO5T~MQpZ4X52k(3IEFwm7wO#p!|C~SdOc%mv`*4B*48sNs|YC!G<8gK?7#MVFIah9qa9EKCHE zGr0S}t_Vdjl!I~o6Re0*H1$xZC@@h)OK{LjQi6*CLX~4_X)McxWZmFo0fhWM4616E zB#{wGXA}rd3U|BQ9-I?gH14INUYz8;ZjYB2X`bh@_x*~{X+4}3i2F@UpZ%?7vvAl5tYxkR!A-7- z0U35K4Ynxb$ekesnX^9RuZeiycsESRc~nu!AKO(|W@|~mek?*GO zk|z%wUJ_n=Zu)N1sVC1C?svBhwQOp$n?J;Rl5Inm`p4uBGEMPw)Ho z{qt8Y#Yh9zpC~(uB|ESeLghSKeC|d z_hXf}PWXGSYug7(^N7&-s<}ep(7N*9@;BZb{p0qkZ#I0~x8;k1)SjQZMtX}+UpTYk z>ah(=?=439!hGekJBH_Cwrh2R#dTjEsxNtSO>trV)|wYixY%+YTMgCe8NNJu>yxod z7jFMLb+L8Pxmr@6EUWswdEbYJqaFC6m9Lqn7vJ-Jz3zkFol$3Gcm0azCZ{?)M^0TC cX?}f4m3gNqwu;}o*ZPTs0uBC;R=>REFV71}!~g&Q delta 383 zcmV-_0f7FY4Wa{(EPoOJ01FZU(%pXi00007bV*G`2jB(}3JWmJbAPM=000JJOGiWi z{{a60|De66lK=n#FG)l}R5;6}QZa6WFcjrT%^YAV9f%5}9kIdzKx#(VONLAh*+UP2 z1S2p~)m_*)Ky!^(YzasSC`mhf+j{@M=kMn)0g(O^V)@HzkfrQsOws)J}Q)D zfh@~I$Cqq#b zqTTp-L=;5`UqeiKa2_3bjBmFgeBYlI;D&VoV{G;ruIpm(Vm$~{RVCWx=Wd@0+i^sW zt|?5@96ZSL9C&G(3V^?PPJpyOz<1Lyp*?AXKuhk6;`ew~Kws&7PL}0q6Ay<7+^|dX z3aYAJ{{>DCf&iZ9!Le;n(hg2bRumPB#RG00<+-?Plu3KLVHkfKWkQH#7|+nOM=a&# d?W25e`~b^Y%kaLSRp$Tz002ovPDHLkV1fg5rRD$t diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv/in.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv/in.png index 6318e000b95fff268df3e2058985f21a39da93a8..74e85c7c462c519d9a792edc1aff5460e05c4ac6 100644 GIT binary patch literal 1860 zcmbVNeQeZZ81Kl2H{22t4TKTw3QUOf`fLn|eU>H^%X$iNZ>jUoLS&Yt)%-jIzQfan4ZDZK|%iN<3JNV8D z468Vy#yXsi=vGlSG%rvL33_vyiO?9fxjttCxd%G91e2;BB7Q$HLEx$qB6j$rbkuBu zDYd2Fg4_FBV{(6wEGR_%7JPF~LS{ z4R10mhznkZlxdp9dBH33a)6WNjW|oQ97XdK6Ci0`^a~Tt4J%18f*?>dOR+485TxCwJ0M5u_L?F?7}~O>nvQDdxXTD6Bjbb! z6zY5qnpvXN?LwVU#i$%GDaK2?Ipu+hT*8?dE1h?)$P`RN4eE}KuuKVy$`p;3;0w}f zS_y4C&Alk1LT(G9?O2})sdi`^8B2!Ey~yL5Vqj*rytR*knQA7*@<|R^$ZHPd`QnMVg+6Mo}Xu zzyUXbxfsKUXlL2~fDJ`W^xYAv$YR2>&QnrIY%`92a`R2zxaSNI~f z!<~gyTE+9NBLdm&?hqlnvOSn$2@BTG_if}a5++}H= zqMOo0hB~6Q(7gSiyR#0%%BV=VAr^e?lOg8yMNCz5S4*&pfBeId;g?=k51*}FpBmoP zbFzBxXN%5Ue9(7v)kxc~t)8=~nsfWt%{_m^c(m@&Y5o#+Wp-0-dEHRN`@PN|JRBh! zFN`I|pPN2^H5ZOg>cT;GRjc=$nLPE^K%lmK=;2uW+Suv# z>w6cy@XIxEpdt=OpQ(QDXs5KitA1qZ$xCMU#1FHtPR+%>%NVBywj={@k9(xSP~X(t o=f8a^U43fV8-HiN82h9A$Fgr%W;Xp<<^Ja)&8^{28@pfp2O)!O!vFvP delta 390 zcmV;10eSw!4xs~(B!32COGiWi{{a60|De66lK=n!32;bRa{vGf5&!@T5&_cPe*6Fc z00(qQO+^Rb1`rAj0KM?&h5!HoE=fc|R5;76lQC`rK@3Izpd5sX4vCJ29Dr$PScjp;g2Lu4X_HFA_)MbG8J}2=F2TYvL`~CjP z7KpG~tx{eeF~VuB%%KIn`yq7zU{jV@zph*2bXugzWYW4}I2>Xy7}NlZ2K%%h#Z#yr kp(+?Xk1n(rANUu(0FS=SL#=!BF#rGn07*qoM6N<$f)ov-hX4Qo diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv/out.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/inv/out.png index a7d2a8b39207a5a56200d7c94fd0dd9bf3b4a1b7..d3820edf599976758df386358b25b63063db2b3d 100644 GIT binary patch literal 1806 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 delta 344 zcmV-e0jK`V4Eq9*EPoOJ01FZU(%pXi00007bV*G`2j2?_3o;!a`^xPA000JJOGiWi z{{a60|De66lK=n#2uVaiR5;76Q!#FXKoInk;s=;2*b*q@I-qkLcmO;A`rrrP-lRZO zAUX_Hjw1H~9uR+H;#(z=96^XKS!tUc&D_r1-2%YkFa0Cf_kTUwu7i>Qk=qt^U85)p zC~cr*;rw>SFboi{0^Mc(vMiAuk4V!L$y0(^flu=HxgVY$4S7x=fo@UY!p qPPbuM7Ia-#d&+l2zE%57zwLLu%i(}S&W6qa0000C!3%+Act z@BjOM&VOHMZ`-z}WJ3u6U`?8cCKdIY;tszJ~I)NM@}NQz^dir|={iFA7ALz+@#k=|Vs;zC9f?onC? zO}ulkEi4VjCBIB>t*7czkPxWYMpQ~oXckO~bcPp_wey*!sSL!9i*$pdkm?MzQ%$;w zDZh(nB#sj(uiq8%O0^zIs-^@^@UWbhn zgK89LH7ge<5-~P~43>9sj!zk&EERA@pP9%gmn9Y_u!=R?B3QnFC1DDM3h-Ofs%imk z+0FgLqMUEHL|fqj1G632()&yaH}?~boAZVlJ-V%1J^H`+Q8+GmW56a8BU?Aax}L~q zsy)v_3AHYss@kn+vYxaacC_RKZ~)m@q@AoWyufhoupmH>AG*C;I3MJ=EHp$4K}I&Z z3G4~;JmlTbBm4ub%Sv?MwoqAuQQcG#iISqC7-kJEmeCdp!JuZ@NRx0dAkxHCm!ilJ z$%2=ceYK3o$MKBp_S7)Q7vUHb^+0V)yM^nNEB~dPAoB=b?#x-5B6pkGiQIhvw1ja1kSS1g2<-O#IQy> zmq}U_e5|w+XbAg;rw;RnKIYao9}|B7mn&Mod1k7#5{$N+t4=Qo)8XIBDi7?N zXF7hozpQ%Zm-SWOu0k6YhgYwxoL`QGiw`6Z1;xsdZIhEFi%(83_6kSpE?z0?_Ekov z-cq0Hh=SkK%=ia8JYz%G_iY-tQt7>)jp8G{SBEYxU9CCpKKW(*W&ZhMy77&rhQPv` zUFVp0uGP68lrCv!7Wy9gV{ZBT^7dW3F8$nJH0v)Po;W)*VS(zg3&-CpdH3LH^=#Kk zkV>Z~R}R`Bt}etu=@X~E+AiLhtynkre%F0z5geUsnfN^RK+*gaPxOm)Y_jUbM^5oW zA9X*v=T-ibbC+Lvt#O{Bd+RoSH~i~QC&FWoU$5G~fAsK)d(TXlzx3&alHlyq^&`qi geM@lmYvxbz-1%en`kEUXonJ$+xh?Q^WB0Rv0TI?Q^8f$< delta 339 zcmV-Z0j&P_4E6$$EPoOJ01FZU(%pXi00007bV*G`2jB(}3JV$*$hLX_000JJOGiWi z{{a60|De66lK=n#14%?dR5;7MQ!#FXFckHXnmL52WJpwdw6ntj-~h0f9DwYh2S9=m zJi3Y}HV)8S;}u(is4XZeRXTjx`p@tA|L1Q4fczz9fwpaldVg1tvO!f^1Qrtq0mc|cfx50ymZeRYp63L(5Ef&U!P|N_fu1}b%HQ%?f!%&L zVvgfXn|L~9)=aRUu;x&E*oXe lIid6gp7)HkvwqxP_yo_F)4*sUJDUIi002ovPDHLkV1ko%mPr5r diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/tank/out.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/tank/out.png index 01c069b9c2dc6f616e6c56d9adea3030f510d71a..1c5a639fe3901bb434c1da67c218c0023a2e5389 100644 GIT binary patch literal 1649 zcmbVNe{2&~9KRt>7(y0cVNRXbn=vlzezxn{m(^ukhi$fwIT}{SG`qfgTQ6`_GR8ZD=& zrRUXf#EOL40K`d7R&W$?nWRq86jk4l(PbD%79B>^n^8;+ z3>j$CPZrN0a@Fhd4|qHthkS9v<1?UPzT+N z4Mcl6k%fXF(RE%fS_j=O2y19bkX*b_$BS-Or~|cL;1cNE!w_+X(g!;I8*;+P&d0w3?ao6Y&_Ik#%0=1ly)8P=N)Uo-z_y;R@tY0ws}VnFK2qu*6NFPyv2Z+GMhT zHm#NcqEXJao1)F|ppN)XWa5+oQOf|4Sd~{yk6{a&G5jxf6pjnl=%Cp^vW1N>#)*8S zI`S;EB;VxBEaN4Z4rQ|Lkzic5NV@Hh@C01~TB?-8^z*)Cm@Bl$rgoa2WD6%Er z0Ct5%5r|Gu`%f@d)V{%6LKO)5u#uFBm(--(k9b|{&q@o0Ku|L+S%WC(_c26OPE{4) z^wf&pC~~pTB}dt)=u%i2Lc~VBeQu{qsPzbLF@N8WVakqR{=V`*?{73zQbKa#_IU~s z0?jyqjSyCdmz{S0X7dOHRFed2Fjoq3Lc=49$#1rLtyABua;BPcBd-k`Q&BI9}u$P4vL^g#chBVT- z4AP=rKJA&HsG{nizcK9DKJ|+D;!&ZrWqkfDHClDoTe~;tOZ>-v?Sa*M9c5224z8(W zbL%*L;+xMBJ8NXef#HFQ)-zY}C%$+5!(HD`{wN(cztuh*yT5YD#rk#U?wjl0y#MRw zZ9|uqpLK8j4LmlseqefRxOAJix@qFn!v1{+-Z*l6x@anMDAM~vV|@GEuCHPbcE?j& zPF-t!4J|oYb}tOfzWPDUoxSdn;EI>fn~`|YGKcGEch9(EDRuaA+e2$qYOZ_Kq-M&u ze0R_>Pc2;E@yu!cy&q<#?tpDo=PwP-lo#n=9(wX%*~xp(7*{|2=}Ps;7kf}caP{+V zcl>_+k7H~1l}t`m++92=R<3#$jDLRO;!}~`V9)H{9&X*?%bs(A*Y)u)8Y9q+bY eTYKU4E5+jzA6=OKc;kruQwX-S``>Tseflr_eJ>dR delta 347 zcmV-h0i^!%4E_R;EPoOJ01FZU(%pXi00007bV*G`2j2?_3p5E+d$|?>000JJOGiWi z{{a60|De66lK=n#3rR#lR5;7MQ!#FXKoGnq#Sbu5uq9g|*8!d5zysg`&<8&N_r?XH z0?}cpaum4_@PPOm6IjKOoR~PeNIq$s9nIX%+#UnK{!_n#ZGYRMZW<^F5V@{VmL;+* zgVF>_7LM;n)^#0|ZxT&EexBz@c00sz%%Yd*y1fjpgRY%;mK!6KdN tX|?KaH(?kCbX`|l zdXq>3TLK}*e-;Ti3E85=C=M{hnGpnKU;v|F022@=21Z~%j6)&*p}yYkE=o`$OS-GkUnQSOU>jwh^sW zG=S1}3KvMyfqG~=?-43og0K>GkPa6?dI+ilCq0atW?Uqic`ztW6QfMnUzZUEcRsA$ zFjR&hlF6h!>9i|ajG$nYjbOkCENXBqrJ7c@yVBt=FoMvhlH4Ic(o zowXsM=4fR-<0t4b!sJwfvXhogX`m?NaB8O(PYV|X0>nWA$c7HFR1OQ>#IiZ~18Eb9 z99lO5T~MQpZ4X52k(3IEFwm7wO#p!|C~SdOc%mv`*4B*48sNs|YC!G<8gK?7#MVFIah9qa9EKCHE zGr0S}t_Vdjl!I~o6Re0*H1$xZC@@h)OK{LjQi6*CLX~4_X)McxWZmFo0fhWM4616E zB#{wGXA}rd3U|BQ9-I?gH14INUYz8;ZjYB2X`bh@_x*~{X+4}3i2F@UpZ%?7vvAl5tYxkR!A-7- z0U35K4Ynxb$ekesnX^9RuZeiycsESRc~nu!AKO(|W@|~mek?*GO zk|z%wUJ_n=Zu)N1sVC1C?svBhwQOp$n?J;Rl5Inm`p4uBGEMPw)Ho z{qt8Y#Yh9zpC~(uB|ESeLghSKeC|d z_hXf}PWXGSYug7(^N7&-s<}ep(7N*9@;BZb{p0qkZ#I0~x8;k1)SjQZMtX}+UpTYk z>ah(=?=439!hGekJBH_Cwrh2R#dTjEsxNtSO>trV)|wYixY%+YTMgCe8NNJu>yxod z7jFMLb+L8Pxmr@6EUWswdEbYJqaFC6m9Lqn7vJ-Jz3zkFol$3Gcm0azCZ{?)M^0TC cX?}f4m3gNqwu;}o*ZPTs0uBC;R=>REFV71}!~g&Q delta 383 zcmV-_0f7FY4Wa{(EPoOJ01FZU(%pXi00007bV*G`2jB(}3JWmJbAPM=000JJOGiWi z{{a60|De66lK=n#FG)l}R5;6}QZa6WFcjrT%^YAV9f%5}9kIdzKx#(VONLAh*+UP2 z1S2p~)m_*)Ky!^(YzasSC`mhf+j{@M=kMn)0g(O^V)@HzkfrQsOws)J}Q)D zfh@~I$Cqq#b zqTTp-L=;5`UqeiKa2_3bjBmFgeBYlI;D&VoV{G;ruIpm(Vm$~{RVCWx=Wd@0+i^sW zt|?5@96ZSL9C&G(3V^?PPJpyOz<1Lyp*?AXKuhk6;`ew~Kws&7PL}0q6Ay<7+^|dX z3aYAJ{{>DCf&iZ9!Le;n(hg2bRumPB#RG00<+-?Plu3KLVHkfKWkQH#7|+nOM=a&# d?W25e`~b^Y%kaLSRp$Tz002ovPDHLkV1fg5rRD$t diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/universal/out.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/universal/out.png index f6dc2d0a40067e49c5779f56cd10fda7fa151fc2..b98e184e9de36d7b9d38ae74dffcaa866ae2b731 100644 GIT binary patch literal 1702 zcmbVN4NTlr950THj|~E07&PcgAsJ)z`f&$$*KwObx4}Yh>^S8RL+G{dpmNvNwr~d~ z#)&2j_aPWJXNZ~+j9ElY7SsiuA#o}~RHA0tj3bP=%pnp(7Bo)g>v4C{WxBW~ukXFS z-~0W)|2#F78MQU62hLgMNL>%#o0o6$a7t5ansfx&kYkP{6 z0P3_*xImILYIj=vcA?xR2&E`Z(l&y$6I3})+Lsat3}b;2+HYn5+qH~G!7BC-Ypw^1ef)~I0FlGL6cNNQe@O*`taoCT%JEfiYZD9NG{*0-8cViy3*8^DE`QNt-3C#_zZX39v0a&99X3`wp*IhY6{ zZ}7K(ZC;9ED4MbU6Re0*p!<$cQD6d!7UH3oq!8Z*2vu&2O5-@DR@Mz(7C`{Mt+zfY533Gu&k`9B_9jk~2@I-7Cl+bAEFuY)9w+j=@umTZ_eU|Rp zGi$Wrb^uBLBiw5+T?rUrUIUeF(2I9WCju%@n02^j2XU*3(X+qRY#a_7fw@eyAh=01 zF(AXvrNI_8+4M<2f+V%nvXx%P;StYvxr)llUq06SLVx;~2iRUVqbl`aX2C#Vy}I80 zP})01=Y|WyX`ZZ;saF>-HwODZKQg<;bFxmDx^&`!CqH|$WOdy=PoJOPKkMEy^wpBD z^wq=T75SMZ*wyPjt8e)_yt&`}(~xpVxFO3AwU-=1THl(Tt6oOU|De_~BZ9U+V7Rft~|4Zen^h zjbEuR+LSe*r2P5R><7JHCuMhQAGNIPYYhb7Z+`KQ-bv9v)H|oXT$q!6aq+$IyWcO~ zDB9bg&R^>qAEB6(fWe{(Nf jzqo1g;jxk8o4Kz&_Dj!2Y4hhl&Y39x2?d*&IjQ&&X^?yn!!Z5^k`-oGrC<>%m z*1+1m3{+JWgb-YE92(*@MI6Tng5V2p_cCy^*$h_Wm}UnsI_ z{d!$*zlZC(SUs%J>A`7ziraWCwr#tAK%PG{l2Y1vjQTN6lW~i?1sVhLJjWqP7?`zO zKOLYO2IFS48GmG1{`Md_B#5Gj0ri>t3{_S7D9T;+>nPvO=hfd8NRk9W k5dIeBYbL(JpePTmcY<@xyaol=2LJ#707*qoM6N<$f`CV>f&c&j diff --git a/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/universal/side.png b/src/main/resources/assets/gregtech/textures/blocks/logistics/extenders/universal/side.png index b56846846694240e308143ff8a81461448146599..c0c0a370966d02f09128205a1b57479f40542e9d 100644 GIT binary patch literal 1451 zcmbVM%WKp?7>_7b>st?sAclCU)?|`&AI;Dx?WVOWrk1+c+EZsI)7{WbCQYW@Z7+&= z@gS%t5fMQYJSgfxe1VE5Po6~l13anqAb67MWFJ9AEjBQj*YEp%&-u;{4;|XjzO!8r zgbn#YYlP36crl_$`b)bV2 zTrd+>>dGAqNQHRBXA#G036_V+wiEatX+1ANN34IATh#RJkLai{7Z5N)B03Xd(m%^J z?r9kolqsW8nf}F(8uBi#*HL?>Alg`~H{qqt-_0d72q-(kZK@Vkrk zyPw`{3(gxsyi8gU-y}_p_`Gw4yhUAoIMC1A8_rw3h3<2oE@~T3iJMogep#w*-}L+~ zI(PDd)z@)m@#EgR*X~Vxc=zi4{lnI!vu)kE^PK}DkEi|7>wT~HZFw=?c{_b|+<3aX yeg62$9k}Dh`Dn4{QR&UcO%HB;-TKYCdviUo7OKWX;qb1wo#y+8tUG-Zr+)wjTFos0 delta 160 zcmZ3@eS~p>PQ4HV1Gf<4rMq>17#JAXOFVsD+3#};@iM4PTYmR0P>3zb+ueoXKL{?^ zyL>WGB+%2vF~p)b`N#kN_ROjhK67k~pZ#CvJNuvie7m>yio7qf4mJr23jW`_XV1Ue zH*N`;FvRLc6dY>d{D1nC*ME0+cVUo->pywZgbGPXgF};z7`j4VMr$4VwjO9YgQu&X J%Q~loCIJ3DKJfqm diff --git a/src/main/resources/assets/susy/lang/en_us.lang b/src/main/resources/assets/susy/lang/en_us.lang index 632a46486..024f97971 100644 --- a/src/main/resources/assets/susy/lang/en_us.lang +++ b/src/main/resources/assets/susy/lang/en_us.lang @@ -757,15 +757,26 @@ gregtech.machine.dumping_hatch=Dumping Hatch gregtech.machine.dumping_hatch.lv.name=Dumping Hatch # Logistics +gregtech.machine.delegator.tooltip.non_recursion=§6Cannot be attached to other Delegators! +gregtech.top.delegator.delegating_face=Delegating: %s + gregtech.machine.bridge.inv.name=Inventory Bridge +gregtech.machine.bridge.inv.tooltip=§bRelays Inventories gregtech.machine.bridge.tank.name=Tank Bridge +gregtech.machine.bridge.tank.tooltip=§bRelays Tanks gregtech.machine.bridge.inv_tank.name=Inventory and Tank Bridge +gregtech.machine.bridge.inv_tank.tooltip=§bRelays Inventories and Tanks gregtech.machine.bridge.universal.name=Universal Bridge +gregtech.machine.bridge.universal.tooltip=§bRelays Everything gregtech.machine.extender.inv.name=Inventory Extender +gregtech.machine.extender.inv.tooltip=§bRelays Inventories gregtech.machine.extender.tank.name=Tank Extender +gregtech.machine.extender.tank.tooltip=§bRelays Tanks gregtech.machine.extender.inv_tank.name=Inventory and Tank Extender +gregtech.machine.extender.inv_tank.tooltip=§bRelays Inventories and Tanks gregtech.machine.extender.universal.name=Universal Extender +gregtech.machine.extender.universal.tooltip=§bRelays Everything # Metaitems metaitem.catalyst_bed_support_grid.name=Catalyst Bed Support Grid From 08b7ba89341e8c09fd595a7240e074c4d197df52 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Wed, 4 Dec 2024 14:32:19 +0800 Subject: [PATCH 03/19] change stainless to aluminium --- .../api/metatileentity/logistics/MetaTileEntityDelegator.java | 2 +- .../common/metatileentities/SuSyMetaTileEntities.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/supersymmetry/api/metatileentity/logistics/MetaTileEntityDelegator.java b/src/main/java/supersymmetry/api/metatileentity/logistics/MetaTileEntityDelegator.java index b5184e140..7197ed31d 100644 --- a/src/main/java/supersymmetry/api/metatileentity/logistics/MetaTileEntityDelegator.java +++ b/src/main/java/supersymmetry/api/metatileentity/logistics/MetaTileEntityDelegator.java @@ -57,7 +57,7 @@ public T getCapability(Capability capability, EnumFacing side) { } protected T getDefaultCapability(Capability capability, EnumFacing side) { - return capFilter.test(capability) && DefaultCapabilities.hasCapability(capability) ? DefaultCapabilities.getCapability(capability) : super.getCapability(capability, side); + return side != null && capFilter.test(capability) && DefaultCapabilities.hasCapability(capability) ? DefaultCapabilities.getCapability(capability) : super.getCapability(capability, side); } protected T getDelegatedCapability(Capability capability, EnumFacing side) { diff --git a/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java b/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java index f2459f37d..a4bd64e35 100644 --- a/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java +++ b/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java @@ -239,12 +239,12 @@ public static void init() { INV_BRIDGE = registerMetaTileEntity(14733, new MetaTileEntityBridge(susyId("bridge.inv"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, SusyTextures.INV_BRIDGE, Materials.Steel)); TANK_BRIDGE = registerMetaTileEntity(14734, new MetaTileEntityBridge(susyId("bridge.tank"), cap -> cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.TANK_BRIDGE, Materials.Steel)); INV_TANK_BRIDGE = registerMetaTileEntity(14735, new MetaTileEntityBridge(susyId("bridge.inv_tank"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.INV_TANK_BRIDGE, Materials.Steel)); - UNIVERSAL_BRIDGE = registerMetaTileEntity(14736, new MetaTileEntityBridge(susyId("bridge.universal"), cap -> true, SusyTextures.UNIVERSAL_BRIDGE, Materials.StainlessSteel)); + UNIVERSAL_BRIDGE = registerMetaTileEntity(14736, new MetaTileEntityBridge(susyId("bridge.universal"), cap -> true, SusyTextures.UNIVERSAL_BRIDGE, Materials.Aluminium)); INV_EXTENDER = registerMetaTileEntity(14737, new MetaTileEntityExtender(susyId("extender.inv"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, SusyTextures.INV_EXTENDER, Materials.Steel)); TANK_EXTENDER = registerMetaTileEntity(14738, new MetaTileEntityExtender(susyId("extender.tank"), cap -> cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.TANK_EXTENDER, Materials.Steel)); INV_TANK_EXTENDER = registerMetaTileEntity(14739, new MetaTileEntityExtender(susyId("extender.inv_tank"), cap -> cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, SusyTextures.INV_TANK_EXTENDER, Materials.Steel)); - UNIVERSAL_EXTENDER = registerMetaTileEntity(14740, new MetaTileEntityExtender(susyId("extender.universal"), cap -> true, SusyTextures.UNIVERSAL_EXTENDER, Materials.StainlessSteel)); + UNIVERSAL_EXTENDER = registerMetaTileEntity(14740, new MetaTileEntityExtender(susyId("extender.universal"), cap -> true, SusyTextures.UNIVERSAL_EXTENDER, Materials.Aluminium)); PRIMITIVE_SMELTER = registerMetaTileEntity(14800, new MetaTileEntityPrimitiveSmelter(susyId("primitive_smelter"))); PRIMITIVE_ITEM_IMPORT = registerMetaTileEntity(14801, new MetaTileEntityPrimitiveItemBus(susyId("primitive_item_import"), false)); From 224be3b2f8f7268fec8d1b8c41478dd2d432e4c9 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Mon, 9 Dec 2024 00:26:57 +0800 Subject: [PATCH 04/19] feat: basic elytra flying api --- .../java/supersymmetry/Supersymmetry.java | 10 +++ .../api/capability/IElytraFlyingProvider.java | 14 ++++ .../api/capability/SuSyCapabilities.java | 18 +++++ .../api/util/ElytraFlyingUtils.java | 70 +++++++++++++++++++ .../supersymmetry/asm/SusyLoadingPlugin.java | 13 +++- .../mixins/minecraft/EntityPlayerMixin.java | 20 ++++++ src/main/resources/mixins.susy.early.json | 10 +++ 7 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 src/main/java/supersymmetry/api/capability/IElytraFlyingProvider.java create mode 100644 src/main/java/supersymmetry/api/capability/SuSyCapabilities.java create mode 100644 src/main/java/supersymmetry/api/util/ElytraFlyingUtils.java create mode 100644 src/main/java/supersymmetry/mixins/minecraft/EntityPlayerMixin.java create mode 100644 src/main/resources/mixins.susy.early.json diff --git a/src/main/java/supersymmetry/Supersymmetry.java b/src/main/java/supersymmetry/Supersymmetry.java index cec990e9e..67b411a02 100644 --- a/src/main/java/supersymmetry/Supersymmetry.java +++ b/src/main/java/supersymmetry/Supersymmetry.java @@ -1,13 +1,17 @@ package supersymmetry; import gregtech.GTInternalTags; +import net.minecraftforge.client.model.obj.OBJLoader; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.FMLConstructionEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLServerStartingEvent; +import net.minecraftforge.fml.relauncher.FMLLaunchHandler; +import net.minecraftforge.fml.relauncher.Side; import org.jetbrains.annotations.NotNull; +import supersymmetry.api.capability.SuSyCapabilities; import supersymmetry.api.sound.SusySounds; import supersymmetry.common.CommonProxy; import supersymmetry.common.SusyMetaEntities; @@ -54,7 +58,13 @@ public void onPreInit(@NotNull FMLPreInitializationEvent event) { SusySounds.registerSounds(); SuSyMetaTileEntities.init(); + SuSyCapabilities.init(); + SusyMetaEntities.init(); + + if (FMLLaunchHandler.side() == Side.CLIENT) { + OBJLoader.INSTANCE.addDomain(MODID); + } } @Mod.EventHandler diff --git a/src/main/java/supersymmetry/api/capability/IElytraFlyingProvider.java b/src/main/java/supersymmetry/api/capability/IElytraFlyingProvider.java new file mode 100644 index 000000000..91d0534ba --- /dev/null +++ b/src/main/java/supersymmetry/api/capability/IElytraFlyingProvider.java @@ -0,0 +1,14 @@ +package supersymmetry.api.capability; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +/** + * Logic from EnderIO: + * ... + */ +public interface IElytraFlyingProvider { + + boolean isElytraFlying(@NotNull EntityLivingBase entity, @NotNull ItemStack itemstack, boolean shouldStop); +} diff --git a/src/main/java/supersymmetry/api/capability/SuSyCapabilities.java b/src/main/java/supersymmetry/api/capability/SuSyCapabilities.java new file mode 100644 index 000000000..30ac79026 --- /dev/null +++ b/src/main/java/supersymmetry/api/capability/SuSyCapabilities.java @@ -0,0 +1,18 @@ +package supersymmetry.api.capability; + +import gregtech.api.capability.SimpleCapabilityManager; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityInject; +import net.minecraftforge.fml.common.Mod; +import supersymmetry.Supersymmetry; + +@Mod.EventBusSubscriber(modid = Supersymmetry.MODID) +public class SuSyCapabilities { + + @CapabilityInject(IElytraFlyingProvider.class) + public static Capability ELYTRA_FLYING_PROVIDER; + + public static void init() { + SimpleCapabilityManager.registerCapabilityWithNoDefault(IElytraFlyingProvider.class); + } +} diff --git a/src/main/java/supersymmetry/api/util/ElytraFlyingUtils.java b/src/main/java/supersymmetry/api/util/ElytraFlyingUtils.java new file mode 100644 index 000000000..93adf3711 --- /dev/null +++ b/src/main/java/supersymmetry/api/util/ElytraFlyingUtils.java @@ -0,0 +1,70 @@ +package supersymmetry.api.util; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; +import org.jetbrains.annotations.NotNull; +import supersymmetry.api.capability.SuSyCapabilities; + +public class ElytraFlyingUtils { + + @SuppressWarnings("DataFlowIssue") + public static boolean isElytraFlying(@NotNull EntityLivingBase entity) { + ItemStack itemstack = entity.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + if (itemstack.hasCapability(SuSyCapabilities.ELYTRA_FLYING_PROVIDER, null)) { + return itemstack.getCapability(SuSyCapabilities.ELYTRA_FLYING_PROVIDER, null).isElytraFlying( + entity, itemstack, + entity.onGround || + entity instanceof EntityPlayer && ((EntityPlayer) entity).capabilities.isFlying || + entity.isRiding() || entity.isInWater() || isInLavaSafe(entity)); + } + return false; + } + + public static boolean canTakeOff(EntityPlayerMP player, boolean ignoreOnGround) { + return (ignoreOnGround || (!player.onGround && player.motionY < 0.0D)) && !player.isElytraFlying() && !player.isInWater() && !isInLavaSafe(player); + } + + // non-chunkloading copy of Entity.isInLava() + private static boolean isInLavaSafe(@NotNull Entity entity) { + return isMaterialInBBSafe(entity.world, + entity.getEntityBoundingBox().expand(-0.1, -0.4, -0.1), + Material.LAVA); + } + + // non-chunkloading copy of World.isMaterialInBB() + private static boolean isMaterialInBBSafe(@NotNull World world, @NotNull AxisAlignedBB bb, + @NotNull Material materialIn) { + int i = MathHelper.floor(bb.minX); + int j = MathHelper.ceil(bb.maxX); + int k = MathHelper.floor(bb.minY); + int l = MathHelper.ceil(bb.maxY); + int i1 = MathHelper.floor(bb.minZ); + int j1 = MathHelper.ceil(bb.maxZ); + BlockPos.PooledMutableBlockPos pos = BlockPos.PooledMutableBlockPos.retain(); + + for (int k1 = i; k1 < j; ++k1) { + for (int l1 = k; l1 < l; ++l1) { + for (int i2 = i1; i2 < j1; ++i2) { + pos.setPos(k1, l1, i2); + if (world.isBlockLoaded(pos, false) && + world.getBlockState(pos).getMaterial() == materialIn) { + pos.release(); + return true; + } + } + } + } + + pos.release(); + return false; + } +} diff --git a/src/main/java/supersymmetry/asm/SusyLoadingPlugin.java b/src/main/java/supersymmetry/asm/SusyLoadingPlugin.java index 6d8d9849a..be641f144 100644 --- a/src/main/java/supersymmetry/asm/SusyLoadingPlugin.java +++ b/src/main/java/supersymmetry/asm/SusyLoadingPlugin.java @@ -7,7 +7,10 @@ import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin.SortingIndex; import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin.TransformerExclusions; import org.jetbrains.annotations.Nullable; +import zone.rong.mixinbooter.IEarlyMixinLoader; +import java.util.Arrays; +import java.util.List; import java.util.Map; // I am sorry for this - htmlcsjs @@ -15,7 +18,7 @@ @MCVersion(ForgeVersion.mcVersion) @TransformerExclusions({"gregtech.asm.", "supersymmetry.asm."}) @SortingIndex(2001) // random number idk -public class SusyLoadingPlugin implements IFMLLoadingPlugin { +public class SusyLoadingPlugin implements IFMLLoadingPlugin, IEarlyMixinLoader { @Override public String[] getASMTransformerClass() { return new String[]{"supersymmetry.asm.SusyTransformer"}; @@ -40,4 +43,12 @@ public void injectData(Map data) { public String getAccessTransformerClass() { return null; } + + @Override + public List getMixinConfigs() { + String[] configs = { + "mixins.susy.early.json" + }; + return Arrays.asList(configs); + } } diff --git a/src/main/java/supersymmetry/mixins/minecraft/EntityPlayerMixin.java b/src/main/java/supersymmetry/mixins/minecraft/EntityPlayerMixin.java new file mode 100644 index 000000000..c278bb0fe --- /dev/null +++ b/src/main/java/supersymmetry/mixins/minecraft/EntityPlayerMixin.java @@ -0,0 +1,20 @@ +package supersymmetry.mixins.minecraft; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import supersymmetry.api.util.ElytraFlyingUtils; + +@Mixin(EntityPlayer.class) +public abstract class EntityPlayerMixin extends EntityLivingBase { + + public EntityPlayerMixin(World worldIn) { + super(worldIn); + } + + @Override + public boolean isElytraFlying() { + return super.isElytraFlying() || ElytraFlyingUtils.isElytraFlying(this); + } +} diff --git a/src/main/resources/mixins.susy.early.json b/src/main/resources/mixins.susy.early.json new file mode 100644 index 000000000..1f23901f7 --- /dev/null +++ b/src/main/resources/mixins.susy.early.json @@ -0,0 +1,10 @@ +{ + "package" : "supersymmetry.mixins.minecraft", + "refmap" : "mixins.susy.refmap.json", + "target" : "@env(DEFAULT)", + "minVersion" : "0.8", + "compatibilityLevel" : "JAVA_8", + "mixins" : [ + "EntityPlayerMixin" + ] +} From dea9fcb5cb4fad8044be05ba7bb725303ef096c9 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Mon, 9 Dec 2024 00:27:46 +0800 Subject: [PATCH 05/19] feat: jet wingpack obj model rendering --- .../supersymmetry/client/ClientProxy.java | 9 + .../renderer/handler/JetWingpackModel.java | 27 + .../renderer/handler/OBJModelRender.java | 188 +++++ .../assets/susy/models/armor/jet_wingpack.mtl | 11 + .../assets/susy/models/armor/jet_wingpack.obj | 761 ++++++++++++++++++ .../susy/textures/armor/jet_wingpack.png | Bin 0 -> 3858 bytes 6 files changed, 996 insertions(+) create mode 100644 src/main/java/supersymmetry/client/renderer/handler/JetWingpackModel.java create mode 100644 src/main/java/supersymmetry/client/renderer/handler/OBJModelRender.java create mode 100644 src/main/resources/assets/susy/models/armor/jet_wingpack.mtl create mode 100644 src/main/resources/assets/susy/models/armor/jet_wingpack.obj create mode 100644 src/main/resources/assets/susy/textures/armor/jet_wingpack.png diff --git a/src/main/java/supersymmetry/client/ClientProxy.java b/src/main/java/supersymmetry/client/ClientProxy.java index a952c6d2a..780c8b74a 100644 --- a/src/main/java/supersymmetry/client/ClientProxy.java +++ b/src/main/java/supersymmetry/client/ClientProxy.java @@ -4,10 +4,13 @@ import gregtech.api.items.metaitem.MetaOreDictItem; import gregtech.api.unification.OreDictUnifier; import gregtech.api.unification.stack.UnificationEntry; +import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -107,4 +110,10 @@ public static void registerModels(@NotNull ModelRegistryEvent event) { SuSyBlocks.registerItemModels(); SuSyMetaBlocks.registerItemModels(); } + + @SubscribeEvent + public static void stitchTexture(TextureStitchEvent.Pre event) { + TextureMap map = event.getMap(); + map.registerSprite(new ResourceLocation(Supersymmetry.MODID, "armor/jet_wingpack")); + } } diff --git a/src/main/java/supersymmetry/client/renderer/handler/JetWingpackModel.java b/src/main/java/supersymmetry/client/renderer/handler/JetWingpackModel.java new file mode 100644 index 000000000..f927060c6 --- /dev/null +++ b/src/main/java/supersymmetry/client/renderer/handler/JetWingpackModel.java @@ -0,0 +1,27 @@ +package supersymmetry.client.renderer.handler; + +import net.minecraft.client.model.ModelBiped; + +import static supersymmetry.api.util.SuSyUtility.susyId; + +public class JetWingpackModel extends ModelBiped { + + public static final JetWingpackModel INSTANCE = new JetWingpackModel(); + private final OBJModelRender objModel; + + public JetWingpackModel() { + this.textureWidth = 128; + this.textureHeight = 128; + + this.bipedHead.cubeList.clear(); + this.bipedHeadwear.cubeList.clear(); + this.bipedBody.cubeList.clear(); + this.bipedRightArm.cubeList.clear(); + this.bipedLeftArm.cubeList.clear(); + this.bipedLeftLeg.cubeList.clear(); + this.bipedRightLeg.cubeList.clear(); + + this.objModel = new OBJModelRender(this, susyId("models/armor/jet_wingpack.obj")); + this.bipedBody.addChild(objModel); + } +} diff --git a/src/main/java/supersymmetry/client/renderer/handler/OBJModelRender.java b/src/main/java/supersymmetry/client/renderer/handler/OBJModelRender.java new file mode 100644 index 000000000..db8efd092 --- /dev/null +++ b/src/main/java/supersymmetry/client/renderer/handler/OBJModelRender.java @@ -0,0 +1,188 @@ +package supersymmetry.client.renderer.handler; + +import codechicken.lib.texture.TextureUtils; +import codechicken.lib.util.TransformUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.Vec3i; +import net.minecraftforge.client.model.obj.OBJLoader; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.opengl.GL11; +import supersymmetry.api.SusyLog; + +import java.util.List; + + +/** + * A wrapped OBJ IBakedModel + * Mostly copied from Draconic Evolution, with minor modifications. + * + * @author brandon3055 + * Link + */ +@SideOnly(Side.CLIENT) +public class OBJModelRender extends ModelRenderer { + + public float scale = 0; + private int displayList; + private boolean compiled = false; + private IBakedModel objModel; + + public OBJModelRender(ModelBase baseModel, ResourceLocation customModel) { + super(baseModel); + + try { + objModel = OBJLoader.INSTANCE.loadModel(customModel).bake(TransformUtils.DEFAULT_TOOL, DefaultVertexFormats.ITEM, TextureUtils::getTexture); + } catch (Exception e) { + SusyLog.logger.error(e); + } + } + + public static void renderQuads(List listQuads) { + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder vertexbuffer = tessellator.getBuffer(); + int i = 0; + vertexbuffer.begin(7, DefaultVertexFormats.ITEM); + for (int j = listQuads.size(); i < j; ++i) { + BakedQuad bakedquad = listQuads.get(i); + + vertexbuffer.addVertexData(bakedquad.getVertexData()); + + vertexbuffer.putColorRGB_F4(1, 1, 1); + + Vec3i vec3i = bakedquad.getFace().getDirectionVec(); + vertexbuffer.putNormal((float) vec3i.getX(), (float) vec3i.getY(), (float) vec3i.getZ()); + + } + tessellator.draw(); + } + + @Override + public void render(float scale) { + if (!this.isHidden && this.showModel) { + if (!this.compiled) { + this.compileDisplayList(scale); + } + + GlStateManager.translate(this.offsetX, this.offsetY, this.offsetZ); + + if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { + if (this.rotationPointX == 0.0F && this.rotationPointY == 0.0F && this.rotationPointZ == 0.0F) { + GlStateManager.callList(this.displayList); + } else { + GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale); + GlStateManager.callList(this.displayList); + GlStateManager.translate(-this.rotationPointX * scale, -this.rotationPointY * scale, -this.rotationPointZ * scale); + } + } else { + GlStateManager.pushMatrix(); + GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale); + if (this.rotateAngleZ != 0.0F) { + GlStateManager.rotate(this.rotateAngleZ * 57.295776F, 0.0F, 0.0F, 1.0F); + } + + if (this.rotateAngleY != 0.0F) { + GlStateManager.rotate(this.rotateAngleY * 57.295776F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + GlStateManager.rotate(this.rotateAngleX * 57.295776F, 1.0F, 0.0F, 0.0F); + } + + GlStateManager.callList(this.displayList); + GlStateManager.popMatrix(); + } + + GlStateManager.translate(-this.offsetX, -this.offsetY, -this.offsetZ); + } + } + + private void compileDisplayList(float scale) { + if (this.scale == 0) { + this.scale = scale; + } + + if (objModel == null) { + compiled = true; + SusyLog.logger.error("Failed to compile OBJ model!"); + return; + } + + scale = this.scale; + this.displayList = GLAllocation.generateDisplayLists(1); + GlStateManager.glNewList(this.displayList, GL11.GL_COMPILE); + + GlStateManager.pushMatrix(); + GlStateManager.scale(scale, scale, scale); + GlStateManager.rotate(180, -1, 0, 1); + + GlStateManager.bindTexture(Minecraft.getMinecraft().getTextureMapBlocks().getGlTextureId()); + renderQuads(objModel.getQuads(null, null, 0)); + + GlStateManager.popMatrix(); + + GlStateManager.glEndList(); + this.compiled = true; + } + + @Override + public void renderWithRotation(float scale) { + if (!this.isHidden && this.showModel) { + if (!this.compiled) { + this.compileDisplayList(scale); + } + + GlStateManager.pushMatrix(); + GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale); + if (this.rotateAngleY != 0.0F) { + GlStateManager.rotate(this.rotateAngleY * 57.295776F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + GlStateManager.rotate(this.rotateAngleX * 57.295776F, 1.0F, 0.0F, 0.0F); + } + + if (this.rotateAngleZ != 0.0F) { + GlStateManager.rotate(this.rotateAngleZ * 57.295776F, 0.0F, 0.0F, 1.0F); + } + + GlStateManager.callList(this.displayList); + GlStateManager.popMatrix(); + } + } + + @Override + public void postRender(float scale) { + if (!this.isHidden && this.showModel) { + + if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { + if (this.rotationPointX != 0.0F || this.rotationPointY != 0.0F || this.rotationPointZ != 0.0F) { + GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale); + } + } else { + GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale); + if (this.rotateAngleZ != 0.0F) { + GlStateManager.rotate(this.rotateAngleZ * 57.295776F, 0.0F, 0.0F, 1.0F); + } + + if (this.rotateAngleY != 0.0F) { + GlStateManager.rotate(this.rotateAngleY * 57.295776F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + GlStateManager.rotate(this.rotateAngleX * 57.295776F, 1.0F, 0.0F, 0.0F); + } + } + } + } +} diff --git a/src/main/resources/assets/susy/models/armor/jet_wingpack.mtl b/src/main/resources/assets/susy/models/armor/jet_wingpack.mtl new file mode 100644 index 000000000..60186c958 --- /dev/null +++ b/src/main/resources/assets/susy/models/armor/jet_wingpack.mtl @@ -0,0 +1,11 @@ +# Made with Blockbench & Blender + +newmtl JetWingpack +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.500000 +illum 1 +map_Kd susy:armor/jet_wingpack +map_d susy:armor/jet_wingpack diff --git a/src/main/resources/assets/susy/models/armor/jet_wingpack.obj b/src/main/resources/assets/susy/models/armor/jet_wingpack.obj new file mode 100644 index 000000000..d72bedd9b --- /dev/null +++ b/src/main/resources/assets/susy/models/armor/jet_wingpack.obj @@ -0,0 +1,761 @@ +# Made with Blockbench & Blender + +mtllib jet_wingpack.mtl +o cuboid +v -3.651691 -9.716561 -12.500000 +v -1.651691 -9.716561 -12.500000 +v -3.651691 -15.716561 -12.500001 +v -1.651692 -15.716561 -12.500001 +v -3.651692 -9.716561 -11.500000 +v -1.651692 -9.716561 -11.500000 +v -3.651693 -15.716561 -11.500001 +v -1.651693 -15.716561 -11.500001 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vt 0.921875 0.593750 +vt 0.921875 0.687500 +vt 0.953125 0.687500 +vt 0.953125 0.593750 +vt 0.937500 0.734375 +vt 0.937500 0.703125 +vt 0.921875 0.703125 +vt 0.921875 0.734375 +vt 0.921875 0.578125 +vt 0.937500 0.578125 +vt 0.937500 0.484375 +vt 0.921875 0.484375 +s 0 +usemtl JetWingpack +f 3/1/1 1/2/1 2/3/1 4/4/1 +f 6/2/2 5/3/2 7/4/2 8/1/2 +f 2/5/3 1/6/3 5/7/3 6/8/3 +f 7/8/4 3/5/4 4/6/4 8/7/4 +f 5/9/5 1/10/5 3/11/5 7/12/5 +f 4/12/6 2/9/6 6/10/6 8/11/6 +o cuboid.001 +v -2.651691 -8.716561 -15.500000 +v 0.348309 -8.716561 -15.500000 +v -2.651693 -16.716560 -15.500001 +v 0.348308 -16.716560 -15.500000 +v -2.651691 -8.716561 -12.500000 +v 0.348309 -8.716561 -12.500000 +v -2.651692 -16.716560 -12.500001 +v 0.348308 -16.716560 -12.500000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vt 0.859375 0.203125 +vt 0.859375 0.328125 +vt 0.906250 0.328125 +vt 0.906250 0.203125 +vt 0.906250 0.375000 +vt 0.859375 0.375000 +vt 0.906250 0.187500 +vt 0.859375 0.187500 +vt 0.859375 0.140625 +vt 0.906250 0.140625 +s 0 +usemtl JetWingpack +f 11/13/7 9/14/7 10/15/7 12/16/7 +f 14/15/8 13/14/8 15/13/8 16/16/8 +f 10/17/9 9/15/9 13/14/9 14/18/9 +f 15/19/10 11/20/10 12/21/10 16/22/10 +f 13/15/11 9/14/11 11/13/11 15/16/11 +f 12/13/12 10/14/12 14/15/12 16/16/12 +o cuboid.002 +v -2.651692 -8.716561 -11.500000 +v 0.348308 -8.716561 -11.500000 +v -2.651693 -16.716560 -11.500001 +v 0.348307 -16.716560 -11.500000 +v -2.651692 -8.716561 -8.500000 +v 0.348308 -8.716561 -8.500000 +v -2.651693 -16.716560 -8.500001 +v 0.348307 -16.716560 -8.500000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vt 0.859375 0.203125 +vt 0.859375 0.328125 +vt 0.906250 0.328125 +vt 0.906250 0.203125 +vt 0.906250 0.375000 +vt 0.859375 0.375000 +vt 0.906250 0.187500 +vt 0.859375 0.187500 +vt 0.859375 0.140625 +vt 0.906250 0.140625 +s 0 +usemtl JetWingpack +f 19/23/13 17/24/13 18/25/13 20/26/13 +f 22/25/14 21/24/14 23/23/14 24/26/14 +f 18/27/15 17/25/15 21/24/15 22/28/15 +f 23/29/16 19/30/16 20/31/16 24/32/16 +f 21/25/17 17/24/17 19/23/17 23/26/17 +f 20/23/18 18/24/18 22/25/18 24/26/18 +o cuboid.003 +v -4.651692 -12.716561 -20.999998 +v -4.151692 -11.716561 -21.000002 +v -3.651692 -12.716561 -20.999998 +v -4.151692 0.283438 -4.000000 +v -5.651693 -1.716562 -4.000000 +v -2.651692 -1.716562 -4.000000 +v -4.651692 -15.716561 -20.999998 +v -3.651692 -15.716561 -20.999998 +v -4.651693 -15.716561 -4.000000 +v -3.651693 -15.716561 -4.000000 +vn -0.0000 -0.0000 -1.0000 +vn 0.8463 0.4232 -0.3236 +vn -0.7367 0.5525 -0.3900 +vn -0.7366 0.5525 -0.3900 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.9975 -0.0712 -0.0000 +vn 0.9974 -0.0713 -0.0126 +vn 0.9974 -0.0712 -0.0126 +vt 0.281250 0.703125 +vt 0.273438 0.718750 +vt 0.265625 0.703125 +vt 0.441125 0.059093 +vt 0.125000 0.079062 +vt 0.134010 0.093750 +vt 0.459145 0.093750 +vt 0.878625 0.855968 +vt 0.896645 0.890625 +vt 0.571510 0.890625 +vt 0.562500 0.875937 +vt 0.109375 0.406250 +vt 0.085938 0.437500 +vt 0.062500 0.406250 +vt 0.265625 0.656250 +vt 0.281250 0.656250 +vt 0.078125 0.187500 +vt 0.093750 0.187500 +vt 0.703125 0.750000 +vt 0.968750 0.750000 +vt 0.968750 0.765625 +vt 0.703125 0.765625 +vt 0.281250 0.546875 +vt 0.546875 0.546875 +vt 0.546875 0.765625 +vt 0.281250 0.593073 +vt 0.272710 0.500120 +vt 0.006909 0.672433 +vt 0.007106 0.453125 +vt 0.272710 0.453364 +s 0 +usemtl JetWingpack +f 25/33/19 26/34/19 27/35/19 +f 30/36/20 27/37/20 26/38/20 28/39/20 +f 29/40/21 28/41/21 26/42/22 25/43/21 +f 30/44/23 28/45/23 29/46/23 +f 25/33/19 27/35/19 32/47/19 31/48/19 +f 33/49/23 34/50/23 30/44/23 +f 29/46/23 33/49/23 30/44/23 +f 32/51/24 34/52/24 33/53/24 31/54/24 +f 31/55/25 33/56/25 29/57/25 25/58/25 +f 27/59/26 30/60/27 34/61/26 32/62/27 +o cuboid.004 +v -8.151692 -16.216560 -21.000000 +v -8.151692 -16.216560 -22.000000 +v -3.651690 -11.216561 -21.000002 +v -2.151692 -12.716561 -20.999998 +v -2.151692 -12.716561 -21.999998 +v -3.651692 -11.216561 -22.000002 +v -3.651692 -16.216560 -21.999998 +v -3.651692 -16.216560 -20.999998 +v -2.151692 -14.716561 -20.999998 +v -2.151692 -14.716561 -21.999998 +v -8.151692 -15.216560 -21.000000 +v -8.151692 -15.216560 -22.000000 +v -4.651692 -11.216561 -21.000002 +v -4.651692 -11.216561 -22.000002 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.7526 0.6585 -0.0000 +vn 0.7071 0.7071 -0.0000 +vn 0.7071 -0.7071 -0.0000 +vt 0.640625 0.078125 +vt 0.640625 0.156250 +vt 0.625000 0.156250 +vt 0.625000 0.078125 +vt 0.625000 0.578125 +vt 0.695312 0.578125 +vt 0.718750 0.601562 +vt 0.718750 0.632812 +vt 0.625000 0.539062 +vt 0.625000 0.507812 +vt 0.648438 0.484375 +vt 0.648438 0.562500 +vt 0.718750 0.484375 +vt 0.062500 0.921875 +vt 0.062500 0.890625 +vt 0.078125 0.890625 +vt 0.078125 0.921875 +vt 0.093750 0.921875 +vt 0.093750 0.906250 +vt 0.109375 0.906250 +vt 0.109375 0.921875 +vt 0.695312 0.656250 +vt 0.679688 0.656250 +vt 0.625000 0.593750 +vt 0.718750 0.500000 +vt 0.664062 0.562500 +vt 0.015625 0.843750 +vt 0.015625 0.859375 +vt 0.000000 0.859375 +vt 0.000000 0.843750 +vt 0.656250 0.156250 +vt 0.656250 0.078125 +vt 0.671875 0.078125 +vt 0.671875 0.156250 +vt 0.171875 0.968750 +vt 0.187500 0.968750 +vt 0.187500 1.000000 +vt 0.171875 1.000000 +vt 0.109375 0.687500 +vt 0.109375 0.718750 +vt 0.093750 0.718750 +vt 0.093750 0.687500 +s 0 +usemtl JetWingpack +f 42/63/28 35/64/28 36/65/28 41/66/28 +f 35/67/29 42/68/29 43/69/29 38/70/29 +f 39/71/30 44/72/30 41/73/30 40/74/30 +f 41/73/30 36/75/30 40/74/30 +f 38/76/31 43/77/31 44/78/31 39/79/31 +f 46/80/32 36/81/32 35/82/32 45/83/32 +f 38/70/29 37/84/29 47/85/29 45/86/29 +f 45/86/29 35/67/29 38/70/29 +f 36/75/30 46/87/30 48/88/30 40/74/30 +f 47/89/33 37/90/33 40/91/33 48/92/33 +f 48/93/34 46/94/34 45/95/34 47/96/34 +f 38/97/35 39/98/35 40/99/35 37/100/35 +f 41/101/36 44/102/36 43/103/36 42/104/36 +o cuboid.005 +v -2.651695 -8.716561 15.500000 +v 0.348305 -8.716561 15.500000 +v -2.651696 -16.716560 15.499999 +v 0.348304 -16.716560 15.500000 +v -2.651694 -8.716561 12.500000 +v 0.348306 -8.716561 12.500000 +v -2.651695 -16.716560 12.499999 +v 0.348305 -16.716560 12.500000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vt 0.906250 0.328125 +vt 0.859375 0.328125 +vt 0.859375 0.203125 +vt 0.906250 0.203125 +vt 0.906250 0.375000 +vt 0.859375 0.375000 +vt 0.859375 0.140625 +vt 0.859375 0.187500 +vt 0.906250 0.187500 +vt 0.906250 0.140625 +s 0 +usemtl JetWingpack +f 50/105/37 49/106/37 51/107/37 52/108/37 +f 55/107/38 53/106/38 54/105/38 56/108/38 +f 53/106/39 49/105/39 50/109/39 54/110/39 +f 52/111/40 51/112/40 55/113/40 56/114/40 +f 51/107/41 49/106/41 53/105/41 55/108/41 +f 54/105/42 50/106/42 52/107/42 56/108/42 +o cuboid.006 +v -3.651694 -9.716561 12.500000 +v -1.651694 -9.716561 12.500000 +v -3.651695 -15.716561 12.499999 +v -1.651695 -15.716561 12.499999 +v -3.651694 -9.716561 11.500000 +v -1.651694 -9.716561 11.500000 +v -3.651695 -15.716561 11.499999 +v -1.651695 -15.716561 11.499999 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vt 0.953125 0.687500 +vt 0.921875 0.687500 +vt 0.921875 0.593750 +vt 0.953125 0.593750 +vt 0.921875 0.703125 +vt 0.937500 0.703125 +vt 0.937500 0.734375 +vt 0.921875 0.734375 +vt 0.937500 0.484375 +vt 0.937500 0.578125 +vt 0.921875 0.578125 +vt 0.921875 0.484375 +s 0 +usemtl JetWingpack +f 58/115/43 57/116/43 59/117/43 60/118/43 +f 63/118/44 61/115/44 62/116/44 64/117/44 +f 61/119/45 57/120/45 58/121/45 62/122/45 +f 60/120/46 59/121/46 63/122/46 64/119/46 +f 59/123/47 57/124/47 61/125/47 63/126/47 +f 62/124/48 58/125/48 60/126/48 64/123/48 +o cuboid.007 +v -2.651694 -8.716561 11.500000 +v 0.348306 -8.716561 11.500000 +v -2.651695 -16.716560 11.499999 +v 0.348305 -16.716560 11.500000 +v -2.651694 -8.716561 8.500000 +v 0.348306 -8.716561 8.500000 +v -2.651695 -16.716560 8.499999 +v 0.348305 -16.716560 8.500000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vt 0.906250 0.328125 +vt 0.859375 0.328125 +vt 0.859375 0.203125 +vt 0.906250 0.203125 +vt 0.906250 0.375000 +vt 0.859375 0.375000 +vt 0.859375 0.140625 +vt 0.859375 0.187500 +vt 0.906250 0.187500 +vt 0.906250 0.140625 +s 0 +usemtl JetWingpack +f 66/127/49 65/128/49 67/129/49 68/130/49 +f 71/129/50 69/128/50 70/127/50 72/130/50 +f 69/128/51 65/127/51 66/131/51 70/132/51 +f 68/133/52 67/134/52 71/135/52 72/136/52 +f 67/129/53 65/128/53 69/127/53 71/130/53 +f 70/127/54 66/128/54 68/129/54 72/130/54 +o cuboid.008 +v -8.151695 -16.216560 21.000002 +v -8.151695 -16.216560 22.000002 +v -3.651695 -11.216561 20.999998 +v -2.151695 -12.716561 21.000002 +v -2.151695 -12.716561 22.000002 +v -3.651695 -11.216561 21.999998 +v -3.651697 -16.216560 22.000002 +v -3.651696 -16.216560 21.000002 +v -2.151696 -14.716561 21.000002 +v -2.151697 -14.716561 22.000002 +v -8.151695 -15.216560 21.000002 +v -8.151695 -15.216560 22.000002 +v -4.651695 -11.216561 20.999998 +v -4.651695 -11.216561 21.999998 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.0000 1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.7526 0.6585 -0.0000 +vn 0.7071 0.7071 -0.0000 +vn 0.7071 -0.7071 -0.0000 +vt 0.703125 0.156250 +vt 0.687500 0.156250 +vt 0.687500 0.078125 +vt 0.703125 0.078125 +vt 0.625000 0.414062 +vt 0.648438 0.390625 +vt 0.718750 0.390625 +vt 0.625000 0.445312 +vt 0.695312 0.296875 +vt 0.718750 0.320312 +vt 0.718750 0.351562 +vt 0.695312 0.375000 +vt 0.625000 0.296875 +vt 0.187500 0.609375 +vt 0.203125 0.609375 +vt 0.203125 0.640625 +vt 0.187500 0.640625 +vt 0.203125 0.984375 +vt 0.218750 0.984375 +vt 0.218750 1.000000 +vt 0.203125 1.000000 +vt 0.664062 0.468750 +vt 0.648438 0.468750 +vt 0.718750 0.406250 +vt 0.679688 0.375000 +vt 0.625000 0.312500 +vt 0.078125 0.718750 +vt 0.062500 0.718750 +vt 0.062500 0.703125 +vt 0.078125 0.703125 +vt 0.718750 0.078125 +vt 0.734375 0.078125 +vt 0.734375 0.156250 +vt 0.718750 0.156250 +vt 0.390625 1.000000 +vt 0.390625 0.968750 +vt 0.406250 0.968750 +vt 0.406250 1.000000 +vt 0.453125 0.765625 +vt 0.437500 0.765625 +vt 0.437500 0.734375 +vt 0.453125 0.734375 +s 0 +usemtl JetWingpack +f 74/137/55 73/138/55 80/139/55 79/140/55 +f 81/141/56 80/142/56 73/143/56 76/144/56 +f 79/145/57 82/146/57 77/147/57 78/148/57 +f 74/149/57 79/145/57 78/148/57 +f 82/150/58 81/151/58 76/152/58 77/153/58 +f 73/154/59 74/155/59 84/156/59 83/157/59 +f 85/158/56 75/159/56 76/144/56 83/160/56 +f 73/143/56 83/160/56 76/144/56 +f 86/161/57 84/162/57 74/149/57 78/148/57 +f 78/163/60 75/164/60 85/165/60 86/166/60 +f 83/167/61 84/168/61 86/169/61 85/170/61 +f 78/171/62 77/172/62 76/173/62 75/174/62 +f 81/175/63 82/176/63 79/177/63 80/178/63 +o cuboid.009 +v -6.151694 -11.716561 3.999999 +v -6.151693 0.283438 4.000000 +v -2.151694 -11.716561 4.000000 +v -2.151693 0.283438 4.000000 +v -6.151693 -11.716561 -4.000000 +v -6.151692 0.283438 -4.000000 +v -2.151693 -11.716561 -4.000000 +v -2.151692 0.283438 -4.000000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vt 0.125000 0.437500 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.187500 0.437500 +vt 0.203125 0.250000 +vt 0.265625 0.250000 +vt 0.265625 0.437500 +vt 0.203125 0.437500 +vt 0.296875 0.343750 +vt 0.421875 0.343750 +vt 0.421875 0.531250 +vt 0.296875 0.531250 +vt 0.437500 0.531250 +vt 0.437500 0.343750 +vt 0.562500 0.343750 +vt 0.562500 0.531250 +vt 0.125000 0.937500 +vt 0.125000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.937500 +vt 0.125000 0.656250 +vt 0.250000 0.656250 +vt 0.250000 0.718750 +vt 0.125000 0.718750 +s 0 +usemtl JetWingpack +f 88/179/64 87/180/64 89/181/64 90/182/64 +f 93/183/65 91/184/65 92/185/65 94/186/65 +f 91/187/66 87/188/66 88/189/66 92/190/66 +f 90/191/67 89/192/67 93/193/67 94/194/67 +f 89/195/68 87/196/68 91/197/68 93/198/68 +f 92/199/69 88/200/69 90/201/69 94/202/69 +o cuboid.010 +v -2.260000 -6.000000 4.260000 +v -2.260000 0.260000 4.260000 +v 2.260000 -6.000000 4.260001 +v 2.259999 0.260000 4.260000 +v -2.260000 -6.000000 -4.260000 +v -2.260000 0.260000 -4.260000 +v 2.260000 -6.000000 -4.260000 +v 2.260001 0.260000 -4.260000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vt 0.296875 0.765625 +vt 0.296875 0.671875 +vt 0.359375 0.671875 +vt 0.359375 0.765625 +vt 0.281250 0.234375 +vt 0.343750 0.234375 +vt 0.343750 0.328125 +vt 0.281250 0.328125 +vt 0.484375 0.906250 +vt 0.609375 0.906250 +vt 0.609375 1.000000 +vt 0.484375 1.000000 +vt 0.562500 0.765625 +vt 0.562500 0.671875 +vt 0.687500 0.671875 +vt 0.687500 0.765625 +vt 0.703125 0.781250 +vt 0.703125 0.843750 +vt 0.578125 0.843750 +vt 0.578125 0.781250 +vt 0.625000 0.937500 +vt 0.750000 0.937500 +vt 0.750000 1.000000 +vt 0.625000 1.000000 +s 0 +usemtl JetWingpack +f 96/203/70 95/204/70 97/205/70 98/206/70 +f 101/207/71 99/208/71 100/209/71 102/210/71 +f 99/211/72 95/212/72 96/213/72 100/214/72 +f 98/215/73 97/216/73 101/217/73 102/218/73 +f 97/219/74 95/220/74 99/221/74 101/222/74 +f 100/223/75 96/224/75 98/225/75 102/226/75 +o cuboid.011 +v -3.596138 -16.716560 -3.333334 +v -4.707249 -16.716560 -3.333334 +v -3.151693 -11.716561 -4.000000 +v -5.151693 -11.716561 -4.000000 +v -4.707249 -16.716560 -0.666667 +v -3.596138 -16.716560 -0.666667 +v -5.151693 -11.716561 -0.000001 +v -3.151693 -11.716561 -0.000000 +v -5.485027 -16.716560 -2.555556 +v -5.485027 -16.716560 -1.444445 +v -6.151693 -11.716561 -3.000001 +v -6.151693 -11.716561 -1.000001 +v -2.818360 -16.716560 -1.444445 +v -2.818360 -16.716560 -2.555556 +v -2.151693 -11.716561 -1.000000 +v -2.151693 -11.716561 -3.000000 +vn -0.0000 -0.1322 -0.9912 +vn -0.0000 -0.1322 0.9912 +vn -0.9912 -0.1322 -0.0000 +vn 0.9912 -0.1322 -0.0000 +vn -0.6985 -0.1552 0.6985 +vn -0.6985 -0.1552 -0.6985 +vn 0.6985 -0.1552 -0.6985 +vn 0.6985 -0.1552 0.6985 +vn -0.0000 -1.0000 -0.0000 +vt 0.748225 0.406250 +vt 0.734375 0.312688 +vt 0.765625 0.310394 +vt 0.765625 0.404975 +vt 0.748225 0.281250 +vt 0.734375 0.187688 +vt 0.765625 0.185394 +vt 0.765625 0.279975 +vt 0.607600 0.281250 +vt 0.593750 0.187688 +vt 0.625000 0.185394 +vt 0.625000 0.279975 +vt 0.748225 0.531250 +vt 0.734375 0.437688 +vt 0.765625 0.435394 +vt 0.765625 0.529975 +vt 0.800892 0.515625 +vt 0.783706 0.515625 +vt 0.781250 0.421875 +vt 0.803347 0.421875 +vt 0.321653 0.125000 +vt 0.343750 0.125000 +vt 0.341294 0.218750 +vt 0.324108 0.218750 +vt 0.781250 0.531250 +vt 0.803347 0.531250 +vt 0.800891 0.625000 +vt 0.783705 0.625000 +vt 0.810045 0.734375 +vt 0.792859 0.734375 +vt 0.790403 0.640625 +vt 0.812500 0.640625 +vt 0.014756 0.921875 +vt 0.002605 0.909723 +vt 0.002605 0.892361 +vt 0.014756 0.880209 +vt 0.032119 0.880209 +vt 0.044270 0.892361 +vt 0.044270 0.909723 +vt 0.032119 0.921875 +vt 0.375000 0.328125 +vt 0.359375 0.312500 +vt 0.359375 0.281250 +vt 0.375000 0.265625 +vt 0.406250 0.265625 +vt 0.421875 0.281250 +vt 0.421875 0.312500 +vt 0.406250 0.328125 +s 0 +usemtl JetWingpack +f 104/227/76 106/228/76 105/229/76 103/230/76 +f 108/231/77 110/232/77 109/233/77 107/234/77 +f 112/235/78 114/236/78 113/237/78 111/238/78 +f 116/239/79 118/240/79 117/241/79 115/242/79 +f 112/243/80 107/244/80 109/245/80 114/246/80 +f 113/247/81 106/248/81 104/249/81 111/250/81 +f 105/251/82 118/252/82 116/253/82 103/254/82 +f 108/255/83 115/256/83 117/257/83 110/258/83 +f 115/259/84 108/260/84 107/261/84 112/262/84 +f 112/262/84 111/263/84 104/264/84 103/265/84 +f 103/265/84 116/266/84 115/259/84 112/262/84 +f 117/267/84 110/268/84 109/269/84 114/270/84 +f 114/270/84 113/271/84 106/272/84 105/273/84 +f 105/273/84 118/274/84 117/267/84 114/270/84 +o cuboid.012 +v -3.596138 -16.716560 0.666666 +v -4.707249 -16.716560 0.666666 +v -3.151693 -11.716561 -0.000000 +v -5.151693 -11.716561 -0.000001 +v -4.707249 -16.716560 3.333333 +v -3.596138 -16.716560 3.333333 +v -5.151694 -11.716561 3.999999 +v -3.151694 -11.716561 4.000000 +v -5.485027 -16.716560 1.444444 +v -5.485027 -16.716560 2.555555 +v -6.151693 -11.716561 0.999999 +v -6.151694 -11.716561 2.999999 +v -2.818361 -16.716560 2.555555 +v -2.818361 -16.716560 1.444444 +v -2.151694 -11.716561 3.000000 +v -2.151694 -11.716561 1.000000 +vn -0.0000 -0.1322 -0.9912 +vn -0.0000 -0.1322 0.9912 +vn -0.9912 -0.1322 -0.0000 +vn 0.9912 -0.1322 -0.0000 +vn -0.6985 -0.1552 0.6985 +vn -0.6985 -0.1552 -0.6985 +vn 0.6985 -0.1552 -0.6985 +vn 0.6985 -0.1552 0.6985 +vn -0.0000 -1.0000 -0.0000 +vt 0.420100 0.250000 +vt 0.406250 0.156438 +vt 0.437500 0.154144 +vt 0.437500 0.248725 +vt 0.466975 0.250000 +vt 0.453125 0.156438 +vt 0.484375 0.154144 +vt 0.484375 0.248725 +vt 0.654475 0.281250 +vt 0.640625 0.187688 +vt 0.671875 0.185394 +vt 0.671875 0.279975 +vt 0.373225 0.250000 +vt 0.359375 0.156438 +vt 0.390625 0.154144 +vt 0.390625 0.248725 +vt 0.019642 0.171875 +vt 0.002456 0.171875 +vt 0.000000 0.078125 +vt 0.022097 0.078125 +vt 0.790403 0.203125 +vt 0.812500 0.203125 +vt 0.810044 0.296875 +vt 0.792858 0.296875 +vt 0.781250 0.093750 +vt 0.803347 0.093750 +vt 0.800891 0.187500 +vt 0.783705 0.187500 +vt 0.810045 0.406250 +vt 0.792859 0.406250 +vt 0.790403 0.312500 +vt 0.812500 0.312500 +vt 0.233506 0.640625 +vt 0.221355 0.628473 +vt 0.221355 0.611111 +vt 0.233506 0.598959 +vt 0.250869 0.598959 +vt 0.263020 0.611111 +vt 0.263020 0.628473 +vt 0.250869 0.640625 +vt 0.453125 0.328125 +vt 0.437500 0.312500 +vt 0.437500 0.281250 +vt 0.453125 0.265625 +vt 0.484375 0.265625 +vt 0.500000 0.281250 +vt 0.500000 0.312500 +vt 0.484375 0.328125 +s 0 +usemtl JetWingpack +f 120/275/85 122/276/85 121/277/85 119/278/85 +f 124/279/86 126/280/86 125/281/86 123/282/86 +f 128/283/87 130/284/87 129/285/87 127/286/87 +f 132/287/88 134/288/88 133/289/88 131/290/88 +f 128/291/89 123/292/89 125/293/89 130/294/89 +f 129/295/90 122/296/90 120/297/90 127/298/90 +f 121/299/91 134/300/91 132/301/91 119/302/91 +f 124/303/92 131/304/92 133/305/92 126/306/92 +f 131/307/93 124/308/93 123/309/93 128/310/93 +f 128/310/93 127/311/93 120/312/93 119/313/93 +f 119/313/93 132/314/93 131/307/93 128/310/93 +f 133/315/93 126/316/93 125/317/93 130/318/93 +f 130/318/93 129/319/93 122/320/93 121/321/93 +f 121/321/93 134/322/93 133/315/93 130/318/93 +o cuboid.013 +v -4.651695 -12.716561 21.000002 +v -4.151695 -11.716561 20.999998 +v -3.651695 -12.716561 21.000002 +v -4.151693 0.283438 3.999999 +v -5.651693 -1.716562 4.000000 +v -2.651693 -1.716562 4.000000 +v -4.651697 -15.716561 21.000002 +v -3.651696 -15.716561 21.000002 +v -4.651694 -15.716561 3.999999 +v -3.651694 -15.716561 4.000000 +vn -0.0000 -0.0000 1.0000 +vn 0.8463 0.4232 0.3236 +vn -0.7366 0.5525 0.3900 +vn -0.7367 0.5525 0.3900 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.9975 -0.0712 -0.0000 +vn 0.9974 -0.0713 0.0126 +vn 0.9974 -0.0712 0.0126 +vt 0.148438 1.000000 +vt 0.140625 0.984375 +vt 0.156250 0.984375 +vt 0.609375 0.331116 +vt 0.598094 0.322105 +vt 0.578125 0.638230 +vt 0.609375 0.656250 +vt 0.023438 0.437500 +vt 0.000000 0.406250 +vt 0.046875 0.406250 +vt 0.156250 0.937500 +vt 0.140625 0.937500 +vt 0.015625 0.187500 +vt 0.031250 0.187500 +vt 0.625000 0.921875 +vt 0.625000 0.906250 +vt 0.890625 0.906250 +vt 0.890625 0.921875 +vt 0.296875 1.000000 +vt 0.296875 0.781250 +vt 0.562500 0.781250 +vt 0.562500 0.827448 +vt 0.274144 0.734375 +vt 0.274341 0.953683 +vt 0.008540 0.781370 +vt 0.008540 0.734614 +s 0 +usemtl JetWingpack +f 136/323/94 135/324/94 137/325/94 +f 136/326/95 137/327/95 140/328/95 138/329/95 +f 136/326/96 138/329/97 139/328/97 135/327/97 +f 138/330/98 140/331/98 139/332/98 +f 142/333/94 137/325/94 135/324/94 141/334/94 +f 144/335/98 143/336/98 140/331/98 +f 143/336/98 139/332/98 140/331/98 +f 143/337/99 144/338/99 142/339/99 141/340/99 +f 139/341/100 143/342/100 141/343/100 135/344/100 +f 144/345/101 140/346/102 137/347/101 142/348/102 diff --git a/src/main/resources/assets/susy/textures/armor/jet_wingpack.png b/src/main/resources/assets/susy/textures/armor/jet_wingpack.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca06410bf562f208a8855305ef1a1c3cd34d759 GIT binary patch literal 3858 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 z Date: Mon, 9 Dec 2024 00:27:54 +0800 Subject: [PATCH 06/19] feat: jet wingpack --- .../common/item/SuSyMetaItems.java | 6 +- .../common/item/armor/JetWingpack.java | 325 ++++++++++++++++++ .../common/item/armor/SuSyMetaArmor.java | 12 + .../models/item/metaitems/jet_wingpack.json | 6 + .../textures/items/metaitems/jet_wingpack.png | Bin 0 -> 1898 bytes .../resources/assets/susy/lang/en_us.lang | 6 + 6 files changed, 354 insertions(+), 1 deletion(-) create mode 100644 src/main/java/supersymmetry/common/item/armor/JetWingpack.java create mode 100644 src/main/java/supersymmetry/common/item/armor/SuSyMetaArmor.java create mode 100644 src/main/resources/assets/gregtech/models/item/metaitems/jet_wingpack.json create mode 100644 src/main/resources/assets/gregtech/textures/items/metaitems/jet_wingpack.png diff --git a/src/main/java/supersymmetry/common/item/SuSyMetaItems.java b/src/main/java/supersymmetry/common/item/SuSyMetaItems.java index 7828217ff..8a34c3ba3 100644 --- a/src/main/java/supersymmetry/common/item/SuSyMetaItems.java +++ b/src/main/java/supersymmetry/common/item/SuSyMetaItems.java @@ -1,6 +1,7 @@ package supersymmetry.common.item; import gregtech.api.GTValues; +import gregtech.api.items.armor.ArmorMetaItem; import gregtech.api.items.metaitem.MetaItem.MetaValueItem; import gregtech.api.items.metaitem.MetaOreDictItem; import gregtech.api.items.metaitem.MetaOreDictItem.OreDictValueItem; @@ -10,6 +11,7 @@ import gregtech.common.items.behaviors.TooltipBehavior; import net.minecraft.client.resources.I18n; import supersymmetry.SuSyValues; +import supersymmetry.common.item.armor.SuSyMetaArmor; public class SuSyMetaItems { @@ -20,13 +22,15 @@ public class SuSyMetaItems { public static MetaValueItem PUMP_STEAM; public static MetaValueItem AIR_VENT; public static MetaValueItem TRACK_SEGMENT; + public static ArmorMetaItem.ArmorMetaValueItem JET_WINGPACK; public static void initMetaItems() { metaItem = new StandardMetaItem(); metaItem.setRegistryName("meta_item"); oreDictItem = new MetaOreDictItem((short) 0); oreDictItem.setRegistryName("susy_oredict_item"); - + SuSyMetaArmor armor = new SuSyMetaArmor(); + armor.setRegistryName("susy_armor"); CatalystItems.init(); } diff --git a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java new file mode 100644 index 000000000..f8946ce12 --- /dev/null +++ b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java @@ -0,0 +1,325 @@ +package supersymmetry.common.item.armor; + +import gregtech.api.GTValues; +import gregtech.api.capability.IFilter; +import gregtech.api.capability.impl.GTFluidHandlerItemStack; +import gregtech.api.items.armor.ArmorLogicSuite; +import gregtech.api.items.armor.ArmorMetaItem; +import gregtech.api.items.armor.ArmorUtils; +import gregtech.api.items.metaitem.stats.*; +import gregtech.api.recipes.Recipe; +import gregtech.api.recipes.RecipeMaps; +import gregtech.api.unification.material.Materials; +import gregtech.api.util.GTUtility; +import gregtech.api.util.GradientUtil; +import gregtech.api.util.input.KeyBind; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.resources.I18n; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.*; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; +import net.minecraftforge.fluids.capability.IFluidTankProperties; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import supersymmetry.api.capability.IElytraFlyingProvider; +import supersymmetry.api.capability.SuSyCapabilities; +import supersymmetry.api.util.ElytraFlyingUtils; +import supersymmetry.client.renderer.handler.JetWingpackModel; + +import java.awt.*; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.function.Function; + + +public class JetWingpack extends ArmorLogicSuite implements IItemHUDProvider { + + public static final int TANK_CAPACITY = 32000; + public static final Function COMBUSTION_FUEL_BURN_TIME = fluidStack -> { + Recipe recipe = RecipeMaps.COMBUSTION_GENERATOR_FUELS.findRecipe( + Integer.MAX_VALUE, + Collections.emptyList(), + Collections.singletonList(fluidStack)); + return recipe != null ? recipe.getDuration() : 0; + }; + + @SideOnly(Side.CLIENT) + private ArmorUtils.ModularHUD HUD; + + protected JetWingpack() { + super(1, TANK_CAPACITY, GTValues.EV, EntityEquipmentSlot.CHEST); + if (ArmorUtils.SIDE.isClient()) { + this.HUD = new ArmorUtils.ModularHUD(); + } + } + + @SideOnly(Side.CLIENT) + public void drawHUD(@NotNull ItemStack item) { + IFluidHandlerItem tank = item.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + if (tank != null) { + IFluidTankProperties[] prop = tank.getTankProperties(); + if (prop[0] != null && prop[0].getContents() != null) { + if (prop[0].getContents().amount == 0) { + return; + } + + String formated = String.format("%.1f", (float) prop[0].getContents().amount * 100.0F / (float) prop[0].getCapacity()); + this.HUD.newString(I18n.format("metaarmor.hud.fuel_lvl", formated + "%")); + NBTTagCompound data = item.getTagCompound(); + if (data != null && data.hasKey("engineActive")) { + String status = data.getBoolean("engineActive") ? I18n.format("metaarmor.hud.status.enabled") : I18n.format("metaarmor.hud.status.disabled"); + String result = I18n.format("metaarmor.hud.engine_status", status); + this.HUD.newString(result); + } + } + } + + this.HUD.draw(); + this.HUD.reset(); + } + + @Override + public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) { + NBTTagCompound data = GTUtility.getOrCreateNbtCompound(itemStack); + + byte toggleTimer = 0; + boolean pressed = false; + boolean wingActive = false; + boolean engineActive = false; + + if (data.hasKey("toggleTimer")) toggleTimer = data.getByte("toggleTimer"); + if (data.hasKey("pressed")) pressed = data.getBoolean("pressed"); + if (data.hasKey("wingActive")) wingActive = data.getBoolean("wingActive"); + if (data.hasKey("engineActive")) engineActive = data.getBoolean("engineActive"); + + if (toggleTimer == 0 && KeyBind.ARMOR_MODE_SWITCH.isKeyDown(player)) { + engineActive = !engineActive; + toggleTimer = 5; + if (!world.isRemote) { + if (engineActive) + player.sendStatusMessage(new TextComponentTranslation("metaarmor.jet_wingpack.engine_active"), true); + else + player.sendStatusMessage(new TextComponentTranslation("metaarmor.jet_wingpack.engine_inactive"), true); + } + } + + if (engineActive && player.isElytraFlying() && drainFuel(itemStack, getEnergyPerUse(), true)) { + Vec3d vec3d = player.getLookVec(); + if (KeyBind.VANILLA_SNEAK.isKeyDown(player)) { + player.motionX += vec3d.x * 0.001D - 0.05D * player.motionX; + player.motionY += -0.005D - 0.05D * player.motionY; + player.motionZ += vec3d.z * 0.001D - 0.05D * player.motionZ; + } else { + player.motionX += 0.05D * (2 * vec3d.x - player.motionX); + player.motionY += 0.05D * (2 * vec3d.y - player.motionY); + player.motionZ += 0.05D * (2 * vec3d.z - player.motionZ); + world.spawnParticle(EnumParticleTypes.CLOUD, player.posX, player.posY, player.posZ, 0.0, 0.0, 0.0); + } + drainFuel(itemStack, getEnergyPerUse(), false); + } + + if (!pressed && KeyBind.VANILLA_JUMP.isKeyDown(player)) { + pressed = true; + if (!world.isRemote) { + EntityPlayerMP playerMP = (EntityPlayerMP) player; + if (!wingActive) { + if (ElytraFlyingUtils.canTakeOff(playerMP, engineActive)) { + playerMP.setElytraFlying(); + wingActive = true; + } + } else { + playerMP.clearElytraFlying(); + wingActive = false; + } + } + } + + if (pressed && !KeyBind.VANILLA_JUMP.isKeyDown(player)) pressed = false; + if (toggleTimer > 0) toggleTimer--; + + data.setByte("toggleTimer", toggleTimer); + data.setBoolean("pressed", pressed); + data.setBoolean("wingActive", wingActive); + data.setBoolean("engineActive", engineActive); + + player.inventoryContainer.detectAndSendChanges(); + } + + @Override + public void addToolComponents(ArmorMetaItem.ArmorMetaValueItem mvi) { + mvi.addComponents(new TestElytraFlyingProvider()); + mvi.addComponents(new JetWingpackBehaviour(TANK_CAPACITY)); + } + + @Override + public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, EntityEquipmentSlot armorSlot, + ModelBiped defaultModel) { + return JetWingpackModel.INSTANCE; + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) { + return "susy:textures/armor/jet_wingpack.png"; // actually useless + } + + protected boolean drainFuel(@NotNull ItemStack stack, int amount, boolean simulate) { + NBTTagCompound data = GTUtility.getOrCreateNbtCompound(stack); + short burnTimer = 0; + if (data.hasKey("burnTimer")) burnTimer = data.getShort("burnTimer"); + if (burnTimer > 0) { + if (!simulate) { + data.setShort("burnTimer", (short) (burnTimer - 1)); + } + return true; + } + + IFluidHandlerItem fluidHandler = getFluidHandler(stack); + if (fluidHandler == null) return false; + FluidStack fuelStack = fluidHandler.drain(amount, false); + if (fuelStack == null) return false; + + int burnTime = COMBUSTION_FUEL_BURN_TIME.apply(fuelStack); + if (burnTime <= 0) return false; + + if (!simulate) { + data.setShort("burnTimer", (short) (burnTime)); + fluidHandler.drain(amount, true); + } + return true; + } + + private IFluidHandlerItem getFluidHandler(ItemStack stack) { + return stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + } + + private static class TestElytraFlyingProvider implements IItemComponent, IElytraFlyingProvider, ICapabilityProvider, IItemCapabilityProvider { + + @Override + public boolean isElytraFlying(@NotNull EntityLivingBase entity, @NotNull ItemStack itemStack, boolean shouldStop) { + if (entity instanceof EntityPlayer) { + NBTTagCompound data = GTUtility.getOrCreateNbtCompound(itemStack); + if (shouldStop) { + data.setBoolean("wingActive", false); + } + return data.hasKey("wingActive") && data.getBoolean("wingActive"); + } + return false; + } + + @Override + public boolean hasCapability(@NotNull Capability capability, @Nullable EnumFacing facing) { + return capability == SuSyCapabilities.ELYTRA_FLYING_PROVIDER; + } + + @Nullable + @Override + public T getCapability(@NotNull Capability capability, @Nullable EnumFacing facing) { + return capability == SuSyCapabilities.ELYTRA_FLYING_PROVIDER ? SuSyCapabilities.ELYTRA_FLYING_PROVIDER.cast(this) : null; + } + + @Override + public ICapabilityProvider createProvider(ItemStack itemStack) { + return this; + } + } + + // Yeah, this is a bit bloat... + public class JetWingpackBehaviour implements IItemDurabilityManager, IItemCapabilityProvider, IItemBehaviour, ISubItemHandler { + + private static final IFilter JETPACK_FUEL_FILTER = new IFilter<>() { + + @Override + public boolean test(@NotNull FluidStack fluidStack) { + return RecipeMaps.COMBUSTION_GENERATOR_FUELS.find(Collections.emptyList(), + Collections.singletonList(fluidStack), (Objects::nonNull)) != null; + } + + @Override + public int getPriority() { + return IFilter.whitelistLikePriority(); + } + }; + public final int maxCapacity; + private final Pair durabilityBarColors; + + public JetWingpackBehaviour(int internalCapacity) { + this.maxCapacity = internalCapacity; + this.durabilityBarColors = GradientUtil.getGradient(0xB7AF08, 10); + } + + @Override + public double getDurabilityForDisplay(@NotNull ItemStack itemStack) { + IFluidHandlerItem fluidHandlerItem = itemStack + .getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + if (fluidHandlerItem == null) return 0; + IFluidTankProperties fluidTankProperties = fluidHandlerItem.getTankProperties()[0]; + FluidStack fluidStack = fluidTankProperties.getContents(); + return fluidStack == null ? 0 : (double) fluidStack.amount / (double) fluidTankProperties.getCapacity(); + } + + @Nullable + @Override + public Pair getDurabilityColorsForDisplay(ItemStack itemStack) { + return durabilityBarColors; + } + + @Override + public ICapabilityProvider createProvider(ItemStack itemStack) { + return new GTFluidHandlerItemStack(itemStack, maxCapacity) + .setFilter(JETPACK_FUEL_FILTER); + } + + @Override + public void addInformation(ItemStack itemStack, List lines) { + IItemBehaviour.super.addInformation(itemStack, lines); + NBTTagCompound data = GTUtility.getOrCreateNbtCompound(itemStack); + String status = I18n.format("metaarmor.hud.status.disabled"); + if (data.hasKey("engineActive")) { + if (data.getBoolean("engineActive")) + status = I18n.format("metaarmor.hud.status.enabled"); + } + lines.add(I18n.format("metaarmor.hud.engine_status", status)); + } + + @Override + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + return onRightClick(world, player, hand); + } + + @Override + public String getItemSubType(ItemStack itemStack) { + return ""; + } + + @Override + public void getSubItems(ItemStack itemStack, CreativeTabs creativeTab, NonNullList subItems) { + ItemStack copy = itemStack.copy(); + IFluidHandlerItem fluidHandlerItem = copy + .getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + if (fluidHandlerItem != null) { + fluidHandlerItem.fill(Materials.Diesel.getFluid(TANK_CAPACITY), true); + subItems.add(copy); + } else { + subItems.add(itemStack); + } + } + } +} diff --git a/src/main/java/supersymmetry/common/item/armor/SuSyMetaArmor.java b/src/main/java/supersymmetry/common/item/armor/SuSyMetaArmor.java new file mode 100644 index 000000000..f25bab9cf --- /dev/null +++ b/src/main/java/supersymmetry/common/item/armor/SuSyMetaArmor.java @@ -0,0 +1,12 @@ +package supersymmetry.common.item.armor; + +import gregtech.api.items.armor.ArmorMetaItem; +import supersymmetry.common.item.SuSyMetaItems; + +public class SuSyMetaArmor extends ArmorMetaItem.ArmorMetaValueItem> { + + @Override + public void registerSubItems() { + SuSyMetaItems.JET_WINGPACK = addItem(1, "jet_wingpack").setArmorLogic(new JetWingpack()); + } +} diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/jet_wingpack.json b/src/main/resources/assets/gregtech/models/item/metaitems/jet_wingpack.json new file mode 100644 index 000000000..40fba5d02 --- /dev/null +++ b/src/main/resources/assets/gregtech/models/item/metaitems/jet_wingpack.json @@ -0,0 +1,6 @@ +{ + "parent" : "item/generated", + "textures" : { + "layer0" : "gregtech:items/metaitems/jet_wingpack" + } +} diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/jet_wingpack.png b/src/main/resources/assets/gregtech/textures/items/metaitems/jet_wingpack.png new file mode 100644 index 0000000000000000000000000000000000000000..7cdc8dcb459b1818a1c32c4bff4c31ddd9465376 GIT binary patch literal 1898 zcmbVN4NTN#7%s_Rz`~-N%tb}If*^6dw)fx08*&`(*gQty46woCNBiB;ao5(ia0g>1 zBXh%LCh9^=)MdJnY?+Ju(QHP7684uRJ57d86XKZ0#gK)c1u)AXvaiS8MIHXcroDb` zpZ9s6_vd?WS9R6%IoYeSF$~M8^m=O0eVK7(W}x5v=>>ppS&Fwo!?4GmG_Ex4z@eux zEWKa!*X#AZEgUb0O+b*Fp(z?x5E{camPQr8w?Z9nhCxws5tIFA2wW6gM4in?`;>Cn zB6>SjSle0U=Q~?@Rv=2B!#74bL=c8Lz@y=iq;XLf5$EO5+IUS7cpRd)x`;BvAztsR z#>-_D;;e}wd73uk4%XD{;O$nPe-<~>W-CQID8^3G4$j7MRvJ$n1ahYe0j|cgIpGXF zxri2BS2&7_L?Wh$#U!giieXunqRo`qOd0c9C{QTIL>n>1fdZexDQ#*f?p)w07=mFa=^DZ^DXh{W>$27& z--SB$`8EeAw?1FW$C6sY;gkzauV_bMBoeYDTJv`(kg9>2+@|udq8-UBFrrboauoty zR{gRZN>-{mDH%80O$@%iPLu>WqLtiY06jp5F2bl9$(Tvn>1QmQ8J*@0w3DOhMW{~} z#6ZU#P}Wb=9Ao3G_S>MSX9S>w`+^0Y3&?61pn%0N2trDcf&`vQBUdhmWED9^>MU^; zJ|9;pX*!U2Sm|*QC}xu=3LNS{8w+Si+8h=q$=Iws$qH5nTCu=R2L#4u=9BgwnQt>H zo3s~@y#Q#3!{V@#yj`%6OtTe|ti{fd0t=BnO*@?+<^LsBL|Y4l9-7D4a7IgTUQt8E z>PYN}TDU#23W<2U3pl_V-R&ZHqpVOM60gN2GVov#EYe0=AR@g-xffxY9MB^`g=ImM zt^2kUbvN-EXur4g2P@u^(*NIn4 z-0P-&NB&Klf4t_=;^o_at$JasDBLvOczmYTd4fOOlwDC*wy$XN^>bs(K70G*B_eub zTA}tI3~9aRkDb36-1PG3>|edP6iN19kmi2A+C4n|LFojS-uG?)j;W6K%ho=TO>~d! zZkQN9Q|uZ!;C`+4&xwqW8&5WT(UaNt$L8@>*;-^FZ*1(Htiq;7(D-}de)lJ@79X7| z2ud-3S3W#FJJ(f`K62>u(}N?eW5s)Z`-#8a*pumgli0I!$UF4ZH+$a;SLF|UpMSCD zYOHv4QmX#CdWGA)e5P|?X71BiV0a~D2d8HL-cWP&Li@m}9VHl^w`T1>A^PxJJ?0Ge z&a>a0edNoFmyf@jxzfL7{f~q5Lm!>Xcq6bnr*G3Ug<4maHSL$!<*)KCZ98~H@obIF ipBjSGAKn}qy|!ju?1q+Gk+sYCH>|9v@*Hz->;4Z~){6N6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/susy/lang/en_us.lang b/src/main/resources/assets/susy/lang/en_us.lang index 116aa98ad..462f5a662 100644 --- a/src/main/resources/assets/susy/lang/en_us.lang +++ b/src/main/resources/assets/susy/lang/en_us.lang @@ -824,6 +824,12 @@ gregtech.catalyst_group.standard_catalysts.name=Standard Catalyst gregtech.catalyst_group.cracking_catalyst_beds.name=Cracking Catalyst metaitem.standard_catalyst_bed_cracking.name=Cracking Catalyst Bed +# Armors +metaitem.jet_wingpack.name=Jet Wingpack +metaarmor.hud.engine_status=Engine: %s +metaarmor.jet_wingpack.engine_active=Jet Wingpack: Engine Activated +metaarmor.jet_wingpack.engine_inactive=Jet Wingpack: Engine Deactivated + # Machine Translations susy.ocean_pumper.full=Tanks are Full! susy.ocean_pumper.drainrate=Current Pumping Rate: %s From 022c4e87edefbff4f9478fb01f91d230f9c19aca Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Mon, 9 Dec 2024 10:44:21 +0800 Subject: [PATCH 07/19] feat: use gas turbine recipe map --- src/main/java/supersymmetry/common/item/armor/JetWingpack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java index f8946ce12..1c62f2332 100644 --- a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java +++ b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java @@ -54,7 +54,7 @@ public class JetWingpack extends ArmorLogicSuite implements IItemHUDProvider { public static final int TANK_CAPACITY = 32000; public static final Function COMBUSTION_FUEL_BURN_TIME = fluidStack -> { - Recipe recipe = RecipeMaps.COMBUSTION_GENERATOR_FUELS.findRecipe( + Recipe recipe = RecipeMaps.GAS_TURBINE_FUELS.findRecipe( Integer.MAX_VALUE, Collections.emptyList(), Collections.singletonList(fluidStack)); From eb08eb3c7bcc6ae1d1e8f9e6321ebf7f3fbd14b1 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Mon, 9 Dec 2024 15:29:06 +0800 Subject: [PATCH 08/19] fix: annotate getModel method as client-only --- src/main/java/supersymmetry/common/item/armor/JetWingpack.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java index 1c62f2332..eac88401b 100644 --- a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java +++ b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java @@ -169,6 +169,7 @@ public void addToolComponents(ArmorMetaItem.ArmorMetaValueItem mvi) { mvi.addComponents(new JetWingpackBehaviour(TANK_CAPACITY)); } + @SideOnly(Side.CLIENT) @Override public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, EntityEquipmentSlot armorSlot, ModelBiped defaultModel) { From eaf85fdf763ab19216c40ecd8021d87320494145 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Mon, 9 Dec 2024 20:50:45 +0800 Subject: [PATCH 09/19] fix: use a separate recipemap for it --- .../api/recipes/SuSyRecipeMaps.java | 7 ++++ .../common/item/armor/JetWingpack.java | 40 ++++++++++++------- .../resources/assets/susy/lang/en_us.lang | 1 + 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/main/java/supersymmetry/api/recipes/SuSyRecipeMaps.java b/src/main/java/supersymmetry/api/recipes/SuSyRecipeMaps.java index 1d7dd2f91..65126c386 100644 --- a/src/main/java/supersymmetry/api/recipes/SuSyRecipeMaps.java +++ b/src/main/java/supersymmetry/api/recipes/SuSyRecipeMaps.java @@ -331,6 +331,13 @@ public class SuSyRecipeMaps { .setSlotOverlay(true, false, GuiTextures.FURNACE_OVERLAY_2) .setSound(GTSoundEvents.FURNACE); + + public static final RecipeMap JET_WINGPACK_FUELS = new RecipeMap<>("jet_wingpack_fuels", 0, 0, 1, 0, new NoEnergyRecipeBuilder(), false) + .setSlotOverlay(false, false, GuiTextures.DARK_CANISTER_OVERLAY) + .setProgressBar(GuiTextures.PROGRESS_BAR_GAS_COLLECTOR, ProgressWidget.MoveType.HORIZONTAL) + .setSound(GTSoundEvents.TURBINE) + .allowEmptyOutput(); + public static void init(){ RecipeMaps.SIFTER_RECIPES.setMaxFluidInputs(1); RecipeMaps.SIFTER_RECIPES.setMaxFluidOutputs(1); diff --git a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java index eac88401b..35a406cde 100644 --- a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java +++ b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java @@ -8,8 +8,7 @@ import gregtech.api.items.armor.ArmorUtils; import gregtech.api.items.metaitem.stats.*; import gregtech.api.recipes.Recipe; -import gregtech.api.recipes.RecipeMaps; -import gregtech.api.unification.material.Materials; +import gregtech.api.recipes.ingredients.GTRecipeInput; import gregtech.api.util.GTUtility; import gregtech.api.util.GradientUtil; import gregtech.api.util.input.KeyBind; @@ -29,6 +28,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandlerItem; @@ -40,6 +40,7 @@ import org.jetbrains.annotations.Nullable; import supersymmetry.api.capability.IElytraFlyingProvider; import supersymmetry.api.capability.SuSyCapabilities; +import supersymmetry.api.recipes.SuSyRecipeMaps; import supersymmetry.api.util.ElytraFlyingUtils; import supersymmetry.client.renderer.handler.JetWingpackModel; @@ -47,15 +48,16 @@ import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.function.Function; public class JetWingpack extends ArmorLogicSuite implements IItemHUDProvider { public static final int TANK_CAPACITY = 32000; - public static final Function COMBUSTION_FUEL_BURN_TIME = fluidStack -> { - Recipe recipe = RecipeMaps.GAS_TURBINE_FUELS.findRecipe( - Integer.MAX_VALUE, + public static final Function FUEL_BURN_TIME = fluidStack -> { + Recipe recipe = SuSyRecipeMaps.JET_WINGPACK_FUELS.findRecipe( + GTValues.V[GTValues.MV], Collections.emptyList(), Collections.singletonList(fluidStack)); return recipe != null ? recipe.getDuration() : 0; @@ -197,7 +199,7 @@ protected boolean drainFuel(@NotNull ItemStack stack, int amount, boolean simula FluidStack fuelStack = fluidHandler.drain(amount, false); if (fuelStack == null) return false; - int burnTime = COMBUSTION_FUEL_BURN_TIME.apply(fuelStack); + int burnTime = FUEL_BURN_TIME.apply(fuelStack); if (burnTime <= 0) return false; if (!simulate) { @@ -245,12 +247,11 @@ public ICapabilityProvider createProvider(ItemStack itemStack) { // Yeah, this is a bit bloat... public class JetWingpackBehaviour implements IItemDurabilityManager, IItemCapabilityProvider, IItemBehaviour, ISubItemHandler { - private static final IFilter JETPACK_FUEL_FILTER = new IFilter<>() { + private static final IFilter JET_WINGPACK_FUEL_FILTER = new IFilter<>() { @Override public boolean test(@NotNull FluidStack fluidStack) { - return RecipeMaps.COMBUSTION_GENERATOR_FUELS.find(Collections.emptyList(), - Collections.singletonList(fluidStack), (Objects::nonNull)) != null; + return FUEL_BURN_TIME.apply(fluidStack) > 0; } @Override @@ -285,7 +286,7 @@ public Pair getDurabilityColorsForDisplay(ItemStack itemStack) { @Override public ICapabilityProvider createProvider(ItemStack itemStack) { return new GTFluidHandlerItemStack(itemStack, maxCapacity) - .setFilter(JETPACK_FUEL_FILTER); + .setFilter(JET_WINGPACK_FUEL_FILTER); } @Override @@ -313,11 +314,22 @@ public String getItemSubType(ItemStack itemStack) { @Override public void getSubItems(ItemStack itemStack, CreativeTabs creativeTab, NonNullList subItems) { ItemStack copy = itemStack.copy(); - IFluidHandlerItem fluidHandlerItem = copy - .getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + IFluidHandlerItem fluidHandlerItem = copy.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); if (fluidHandlerItem != null) { - fluidHandlerItem.fill(Materials.Diesel.getFluid(TANK_CAPACITY), true); - subItems.add(copy); + Optional firstRecipe = SuSyRecipeMaps.JET_WINGPACK_FUELS.getRecipeList().stream().findFirst(); + firstRecipe.ifPresent(recipe -> { + Optional inputFluidStack = recipe.getFluidInputs().stream() + .map(GTRecipeInput::getInputFluidStack) + .filter(Objects::nonNull) + .findFirst(); + inputFluidStack.ifPresent(stack -> { + Fluid fluid = stack.getFluid(); + if (fluid != null && stack.amount > 0) { + fluidHandlerItem.fill(new FluidStack(fluid, maxCapacity), true); + subItems.add(copy); + } + }); + }); } else { subItems.add(itemStack); } diff --git a/src/main/resources/assets/susy/lang/en_us.lang b/src/main/resources/assets/susy/lang/en_us.lang index 462f5a662..77e5d6c79 100644 --- a/src/main/resources/assets/susy/lang/en_us.lang +++ b/src/main/resources/assets/susy/lang/en_us.lang @@ -722,6 +722,7 @@ recipemap.large_steam_turbine.name=Large Steam Turbine recipemap.primitive_smelter.name=Primitive Smelting recipemap.large_fluid_pump.name=Large Fluid Pump recipemap.sieve_distillation.name=Fractional Distillation +recipemap.jet_wingpack_fuels.name=Jet Wingpack Fuels gregtech.multiblock.primitive_mud_pump.description=The Primitive Mud Pump is a Steam Era multiblock that collects mud once per second, but only if it is in a river biome, and when the controller is between Y = 64 and Y = 80 (Inclusive). It can use a Pump, ULV, or LV Output Hatch. gregtech.multiblock.ocean_pumper.description=The Ocean Pumper is an electrically powered multiblock that collects a base amount of 8,000 L Seawater per second (at MV), but only if it is in an ocean biome, and when the controller is between Y = 70 and Y = 75 (Inclusive). It needs an output hatch, a maintenance hatch, and an energy input hatch. From a1f6c9d63f61877e78571ce55790123babfcee7a Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Mon, 9 Dec 2024 00:26:57 +0800 Subject: [PATCH 10/19] feat: basic elytra flying api --- .../java/supersymmetry/Supersymmetry.java | 10 +++ .../api/capability/IElytraFlyingProvider.java | 14 ++++ .../api/capability/SuSyCapabilities.java | 18 +++++ .../api/util/ElytraFlyingUtils.java | 70 +++++++++++++++++++ .../supersymmetry/asm/SusyLoadingPlugin.java | 13 +++- .../mixins/minecraft/EntityPlayerMixin.java | 20 ++++++ src/main/resources/mixins.susy.early.json | 10 +++ 7 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 src/main/java/supersymmetry/api/capability/IElytraFlyingProvider.java create mode 100644 src/main/java/supersymmetry/api/capability/SuSyCapabilities.java create mode 100644 src/main/java/supersymmetry/api/util/ElytraFlyingUtils.java create mode 100644 src/main/java/supersymmetry/mixins/minecraft/EntityPlayerMixin.java create mode 100644 src/main/resources/mixins.susy.early.json diff --git a/src/main/java/supersymmetry/Supersymmetry.java b/src/main/java/supersymmetry/Supersymmetry.java index cec990e9e..67b411a02 100644 --- a/src/main/java/supersymmetry/Supersymmetry.java +++ b/src/main/java/supersymmetry/Supersymmetry.java @@ -1,13 +1,17 @@ package supersymmetry; import gregtech.GTInternalTags; +import net.minecraftforge.client.model.obj.OBJLoader; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.FMLConstructionEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLServerStartingEvent; +import net.minecraftforge.fml.relauncher.FMLLaunchHandler; +import net.minecraftforge.fml.relauncher.Side; import org.jetbrains.annotations.NotNull; +import supersymmetry.api.capability.SuSyCapabilities; import supersymmetry.api.sound.SusySounds; import supersymmetry.common.CommonProxy; import supersymmetry.common.SusyMetaEntities; @@ -54,7 +58,13 @@ public void onPreInit(@NotNull FMLPreInitializationEvent event) { SusySounds.registerSounds(); SuSyMetaTileEntities.init(); + SuSyCapabilities.init(); + SusyMetaEntities.init(); + + if (FMLLaunchHandler.side() == Side.CLIENT) { + OBJLoader.INSTANCE.addDomain(MODID); + } } @Mod.EventHandler diff --git a/src/main/java/supersymmetry/api/capability/IElytraFlyingProvider.java b/src/main/java/supersymmetry/api/capability/IElytraFlyingProvider.java new file mode 100644 index 000000000..91d0534ba --- /dev/null +++ b/src/main/java/supersymmetry/api/capability/IElytraFlyingProvider.java @@ -0,0 +1,14 @@ +package supersymmetry.api.capability; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +/** + * Logic from EnderIO: + * ... + */ +public interface IElytraFlyingProvider { + + boolean isElytraFlying(@NotNull EntityLivingBase entity, @NotNull ItemStack itemstack, boolean shouldStop); +} diff --git a/src/main/java/supersymmetry/api/capability/SuSyCapabilities.java b/src/main/java/supersymmetry/api/capability/SuSyCapabilities.java new file mode 100644 index 000000000..30ac79026 --- /dev/null +++ b/src/main/java/supersymmetry/api/capability/SuSyCapabilities.java @@ -0,0 +1,18 @@ +package supersymmetry.api.capability; + +import gregtech.api.capability.SimpleCapabilityManager; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityInject; +import net.minecraftforge.fml.common.Mod; +import supersymmetry.Supersymmetry; + +@Mod.EventBusSubscriber(modid = Supersymmetry.MODID) +public class SuSyCapabilities { + + @CapabilityInject(IElytraFlyingProvider.class) + public static Capability ELYTRA_FLYING_PROVIDER; + + public static void init() { + SimpleCapabilityManager.registerCapabilityWithNoDefault(IElytraFlyingProvider.class); + } +} diff --git a/src/main/java/supersymmetry/api/util/ElytraFlyingUtils.java b/src/main/java/supersymmetry/api/util/ElytraFlyingUtils.java new file mode 100644 index 000000000..93adf3711 --- /dev/null +++ b/src/main/java/supersymmetry/api/util/ElytraFlyingUtils.java @@ -0,0 +1,70 @@ +package supersymmetry.api.util; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; +import org.jetbrains.annotations.NotNull; +import supersymmetry.api.capability.SuSyCapabilities; + +public class ElytraFlyingUtils { + + @SuppressWarnings("DataFlowIssue") + public static boolean isElytraFlying(@NotNull EntityLivingBase entity) { + ItemStack itemstack = entity.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + if (itemstack.hasCapability(SuSyCapabilities.ELYTRA_FLYING_PROVIDER, null)) { + return itemstack.getCapability(SuSyCapabilities.ELYTRA_FLYING_PROVIDER, null).isElytraFlying( + entity, itemstack, + entity.onGround || + entity instanceof EntityPlayer && ((EntityPlayer) entity).capabilities.isFlying || + entity.isRiding() || entity.isInWater() || isInLavaSafe(entity)); + } + return false; + } + + public static boolean canTakeOff(EntityPlayerMP player, boolean ignoreOnGround) { + return (ignoreOnGround || (!player.onGround && player.motionY < 0.0D)) && !player.isElytraFlying() && !player.isInWater() && !isInLavaSafe(player); + } + + // non-chunkloading copy of Entity.isInLava() + private static boolean isInLavaSafe(@NotNull Entity entity) { + return isMaterialInBBSafe(entity.world, + entity.getEntityBoundingBox().expand(-0.1, -0.4, -0.1), + Material.LAVA); + } + + // non-chunkloading copy of World.isMaterialInBB() + private static boolean isMaterialInBBSafe(@NotNull World world, @NotNull AxisAlignedBB bb, + @NotNull Material materialIn) { + int i = MathHelper.floor(bb.minX); + int j = MathHelper.ceil(bb.maxX); + int k = MathHelper.floor(bb.minY); + int l = MathHelper.ceil(bb.maxY); + int i1 = MathHelper.floor(bb.minZ); + int j1 = MathHelper.ceil(bb.maxZ); + BlockPos.PooledMutableBlockPos pos = BlockPos.PooledMutableBlockPos.retain(); + + for (int k1 = i; k1 < j; ++k1) { + for (int l1 = k; l1 < l; ++l1) { + for (int i2 = i1; i2 < j1; ++i2) { + pos.setPos(k1, l1, i2); + if (world.isBlockLoaded(pos, false) && + world.getBlockState(pos).getMaterial() == materialIn) { + pos.release(); + return true; + } + } + } + } + + pos.release(); + return false; + } +} diff --git a/src/main/java/supersymmetry/asm/SusyLoadingPlugin.java b/src/main/java/supersymmetry/asm/SusyLoadingPlugin.java index 6d8d9849a..be641f144 100644 --- a/src/main/java/supersymmetry/asm/SusyLoadingPlugin.java +++ b/src/main/java/supersymmetry/asm/SusyLoadingPlugin.java @@ -7,7 +7,10 @@ import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin.SortingIndex; import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin.TransformerExclusions; import org.jetbrains.annotations.Nullable; +import zone.rong.mixinbooter.IEarlyMixinLoader; +import java.util.Arrays; +import java.util.List; import java.util.Map; // I am sorry for this - htmlcsjs @@ -15,7 +18,7 @@ @MCVersion(ForgeVersion.mcVersion) @TransformerExclusions({"gregtech.asm.", "supersymmetry.asm."}) @SortingIndex(2001) // random number idk -public class SusyLoadingPlugin implements IFMLLoadingPlugin { +public class SusyLoadingPlugin implements IFMLLoadingPlugin, IEarlyMixinLoader { @Override public String[] getASMTransformerClass() { return new String[]{"supersymmetry.asm.SusyTransformer"}; @@ -40,4 +43,12 @@ public void injectData(Map data) { public String getAccessTransformerClass() { return null; } + + @Override + public List getMixinConfigs() { + String[] configs = { + "mixins.susy.early.json" + }; + return Arrays.asList(configs); + } } diff --git a/src/main/java/supersymmetry/mixins/minecraft/EntityPlayerMixin.java b/src/main/java/supersymmetry/mixins/minecraft/EntityPlayerMixin.java new file mode 100644 index 000000000..c278bb0fe --- /dev/null +++ b/src/main/java/supersymmetry/mixins/minecraft/EntityPlayerMixin.java @@ -0,0 +1,20 @@ +package supersymmetry.mixins.minecraft; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import supersymmetry.api.util.ElytraFlyingUtils; + +@Mixin(EntityPlayer.class) +public abstract class EntityPlayerMixin extends EntityLivingBase { + + public EntityPlayerMixin(World worldIn) { + super(worldIn); + } + + @Override + public boolean isElytraFlying() { + return super.isElytraFlying() || ElytraFlyingUtils.isElytraFlying(this); + } +} diff --git a/src/main/resources/mixins.susy.early.json b/src/main/resources/mixins.susy.early.json new file mode 100644 index 000000000..1f23901f7 --- /dev/null +++ b/src/main/resources/mixins.susy.early.json @@ -0,0 +1,10 @@ +{ + "package" : "supersymmetry.mixins.minecraft", + "refmap" : "mixins.susy.refmap.json", + "target" : "@env(DEFAULT)", + "minVersion" : "0.8", + "compatibilityLevel" : "JAVA_8", + "mixins" : [ + "EntityPlayerMixin" + ] +} From ca16d06e72019755fe12c859cefbb693fe85f178 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Mon, 9 Dec 2024 00:27:46 +0800 Subject: [PATCH 11/19] feat: jet wingpack obj model rendering --- .../supersymmetry/client/ClientProxy.java | 9 + .../renderer/handler/JetWingpackModel.java | 27 + .../renderer/handler/OBJModelRender.java | 188 +++++ .../assets/susy/models/armor/jet_wingpack.mtl | 11 + .../assets/susy/models/armor/jet_wingpack.obj | 761 ++++++++++++++++++ .../susy/textures/armor/jet_wingpack.png | Bin 0 -> 3858 bytes 6 files changed, 996 insertions(+) create mode 100644 src/main/java/supersymmetry/client/renderer/handler/JetWingpackModel.java create mode 100644 src/main/java/supersymmetry/client/renderer/handler/OBJModelRender.java create mode 100644 src/main/resources/assets/susy/models/armor/jet_wingpack.mtl create mode 100644 src/main/resources/assets/susy/models/armor/jet_wingpack.obj create mode 100644 src/main/resources/assets/susy/textures/armor/jet_wingpack.png diff --git a/src/main/java/supersymmetry/client/ClientProxy.java b/src/main/java/supersymmetry/client/ClientProxy.java index a952c6d2a..780c8b74a 100644 --- a/src/main/java/supersymmetry/client/ClientProxy.java +++ b/src/main/java/supersymmetry/client/ClientProxy.java @@ -4,10 +4,13 @@ import gregtech.api.items.metaitem.MetaOreDictItem; import gregtech.api.unification.OreDictUnifier; import gregtech.api.unification.stack.UnificationEntry; +import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -107,4 +110,10 @@ public static void registerModels(@NotNull ModelRegistryEvent event) { SuSyBlocks.registerItemModels(); SuSyMetaBlocks.registerItemModels(); } + + @SubscribeEvent + public static void stitchTexture(TextureStitchEvent.Pre event) { + TextureMap map = event.getMap(); + map.registerSprite(new ResourceLocation(Supersymmetry.MODID, "armor/jet_wingpack")); + } } diff --git a/src/main/java/supersymmetry/client/renderer/handler/JetWingpackModel.java b/src/main/java/supersymmetry/client/renderer/handler/JetWingpackModel.java new file mode 100644 index 000000000..f927060c6 --- /dev/null +++ b/src/main/java/supersymmetry/client/renderer/handler/JetWingpackModel.java @@ -0,0 +1,27 @@ +package supersymmetry.client.renderer.handler; + +import net.minecraft.client.model.ModelBiped; + +import static supersymmetry.api.util.SuSyUtility.susyId; + +public class JetWingpackModel extends ModelBiped { + + public static final JetWingpackModel INSTANCE = new JetWingpackModel(); + private final OBJModelRender objModel; + + public JetWingpackModel() { + this.textureWidth = 128; + this.textureHeight = 128; + + this.bipedHead.cubeList.clear(); + this.bipedHeadwear.cubeList.clear(); + this.bipedBody.cubeList.clear(); + this.bipedRightArm.cubeList.clear(); + this.bipedLeftArm.cubeList.clear(); + this.bipedLeftLeg.cubeList.clear(); + this.bipedRightLeg.cubeList.clear(); + + this.objModel = new OBJModelRender(this, susyId("models/armor/jet_wingpack.obj")); + this.bipedBody.addChild(objModel); + } +} diff --git a/src/main/java/supersymmetry/client/renderer/handler/OBJModelRender.java b/src/main/java/supersymmetry/client/renderer/handler/OBJModelRender.java new file mode 100644 index 000000000..db8efd092 --- /dev/null +++ b/src/main/java/supersymmetry/client/renderer/handler/OBJModelRender.java @@ -0,0 +1,188 @@ +package supersymmetry.client.renderer.handler; + +import codechicken.lib.texture.TextureUtils; +import codechicken.lib.util.TransformUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.Vec3i; +import net.minecraftforge.client.model.obj.OBJLoader; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.opengl.GL11; +import supersymmetry.api.SusyLog; + +import java.util.List; + + +/** + * A wrapped OBJ IBakedModel + * Mostly copied from Draconic Evolution, with minor modifications. + * + * @author brandon3055 + * Link + */ +@SideOnly(Side.CLIENT) +public class OBJModelRender extends ModelRenderer { + + public float scale = 0; + private int displayList; + private boolean compiled = false; + private IBakedModel objModel; + + public OBJModelRender(ModelBase baseModel, ResourceLocation customModel) { + super(baseModel); + + try { + objModel = OBJLoader.INSTANCE.loadModel(customModel).bake(TransformUtils.DEFAULT_TOOL, DefaultVertexFormats.ITEM, TextureUtils::getTexture); + } catch (Exception e) { + SusyLog.logger.error(e); + } + } + + public static void renderQuads(List listQuads) { + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder vertexbuffer = tessellator.getBuffer(); + int i = 0; + vertexbuffer.begin(7, DefaultVertexFormats.ITEM); + for (int j = listQuads.size(); i < j; ++i) { + BakedQuad bakedquad = listQuads.get(i); + + vertexbuffer.addVertexData(bakedquad.getVertexData()); + + vertexbuffer.putColorRGB_F4(1, 1, 1); + + Vec3i vec3i = bakedquad.getFace().getDirectionVec(); + vertexbuffer.putNormal((float) vec3i.getX(), (float) vec3i.getY(), (float) vec3i.getZ()); + + } + tessellator.draw(); + } + + @Override + public void render(float scale) { + if (!this.isHidden && this.showModel) { + if (!this.compiled) { + this.compileDisplayList(scale); + } + + GlStateManager.translate(this.offsetX, this.offsetY, this.offsetZ); + + if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { + if (this.rotationPointX == 0.0F && this.rotationPointY == 0.0F && this.rotationPointZ == 0.0F) { + GlStateManager.callList(this.displayList); + } else { + GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale); + GlStateManager.callList(this.displayList); + GlStateManager.translate(-this.rotationPointX * scale, -this.rotationPointY * scale, -this.rotationPointZ * scale); + } + } else { + GlStateManager.pushMatrix(); + GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale); + if (this.rotateAngleZ != 0.0F) { + GlStateManager.rotate(this.rotateAngleZ * 57.295776F, 0.0F, 0.0F, 1.0F); + } + + if (this.rotateAngleY != 0.0F) { + GlStateManager.rotate(this.rotateAngleY * 57.295776F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + GlStateManager.rotate(this.rotateAngleX * 57.295776F, 1.0F, 0.0F, 0.0F); + } + + GlStateManager.callList(this.displayList); + GlStateManager.popMatrix(); + } + + GlStateManager.translate(-this.offsetX, -this.offsetY, -this.offsetZ); + } + } + + private void compileDisplayList(float scale) { + if (this.scale == 0) { + this.scale = scale; + } + + if (objModel == null) { + compiled = true; + SusyLog.logger.error("Failed to compile OBJ model!"); + return; + } + + scale = this.scale; + this.displayList = GLAllocation.generateDisplayLists(1); + GlStateManager.glNewList(this.displayList, GL11.GL_COMPILE); + + GlStateManager.pushMatrix(); + GlStateManager.scale(scale, scale, scale); + GlStateManager.rotate(180, -1, 0, 1); + + GlStateManager.bindTexture(Minecraft.getMinecraft().getTextureMapBlocks().getGlTextureId()); + renderQuads(objModel.getQuads(null, null, 0)); + + GlStateManager.popMatrix(); + + GlStateManager.glEndList(); + this.compiled = true; + } + + @Override + public void renderWithRotation(float scale) { + if (!this.isHidden && this.showModel) { + if (!this.compiled) { + this.compileDisplayList(scale); + } + + GlStateManager.pushMatrix(); + GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale); + if (this.rotateAngleY != 0.0F) { + GlStateManager.rotate(this.rotateAngleY * 57.295776F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + GlStateManager.rotate(this.rotateAngleX * 57.295776F, 1.0F, 0.0F, 0.0F); + } + + if (this.rotateAngleZ != 0.0F) { + GlStateManager.rotate(this.rotateAngleZ * 57.295776F, 0.0F, 0.0F, 1.0F); + } + + GlStateManager.callList(this.displayList); + GlStateManager.popMatrix(); + } + } + + @Override + public void postRender(float scale) { + if (!this.isHidden && this.showModel) { + + if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { + if (this.rotationPointX != 0.0F || this.rotationPointY != 0.0F || this.rotationPointZ != 0.0F) { + GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale); + } + } else { + GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale); + if (this.rotateAngleZ != 0.0F) { + GlStateManager.rotate(this.rotateAngleZ * 57.295776F, 0.0F, 0.0F, 1.0F); + } + + if (this.rotateAngleY != 0.0F) { + GlStateManager.rotate(this.rotateAngleY * 57.295776F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + GlStateManager.rotate(this.rotateAngleX * 57.295776F, 1.0F, 0.0F, 0.0F); + } + } + } + } +} diff --git a/src/main/resources/assets/susy/models/armor/jet_wingpack.mtl b/src/main/resources/assets/susy/models/armor/jet_wingpack.mtl new file mode 100644 index 000000000..60186c958 --- /dev/null +++ b/src/main/resources/assets/susy/models/armor/jet_wingpack.mtl @@ -0,0 +1,11 @@ +# Made with Blockbench & Blender + +newmtl JetWingpack +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.500000 +illum 1 +map_Kd susy:armor/jet_wingpack +map_d susy:armor/jet_wingpack diff --git a/src/main/resources/assets/susy/models/armor/jet_wingpack.obj b/src/main/resources/assets/susy/models/armor/jet_wingpack.obj new file mode 100644 index 000000000..d72bedd9b --- /dev/null +++ b/src/main/resources/assets/susy/models/armor/jet_wingpack.obj @@ -0,0 +1,761 @@ +# Made with Blockbench & Blender + +mtllib jet_wingpack.mtl +o cuboid +v -3.651691 -9.716561 -12.500000 +v -1.651691 -9.716561 -12.500000 +v -3.651691 -15.716561 -12.500001 +v -1.651692 -15.716561 -12.500001 +v -3.651692 -9.716561 -11.500000 +v -1.651692 -9.716561 -11.500000 +v -3.651693 -15.716561 -11.500001 +v -1.651693 -15.716561 -11.500001 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vt 0.921875 0.593750 +vt 0.921875 0.687500 +vt 0.953125 0.687500 +vt 0.953125 0.593750 +vt 0.937500 0.734375 +vt 0.937500 0.703125 +vt 0.921875 0.703125 +vt 0.921875 0.734375 +vt 0.921875 0.578125 +vt 0.937500 0.578125 +vt 0.937500 0.484375 +vt 0.921875 0.484375 +s 0 +usemtl JetWingpack +f 3/1/1 1/2/1 2/3/1 4/4/1 +f 6/2/2 5/3/2 7/4/2 8/1/2 +f 2/5/3 1/6/3 5/7/3 6/8/3 +f 7/8/4 3/5/4 4/6/4 8/7/4 +f 5/9/5 1/10/5 3/11/5 7/12/5 +f 4/12/6 2/9/6 6/10/6 8/11/6 +o cuboid.001 +v -2.651691 -8.716561 -15.500000 +v 0.348309 -8.716561 -15.500000 +v -2.651693 -16.716560 -15.500001 +v 0.348308 -16.716560 -15.500000 +v -2.651691 -8.716561 -12.500000 +v 0.348309 -8.716561 -12.500000 +v -2.651692 -16.716560 -12.500001 +v 0.348308 -16.716560 -12.500000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vt 0.859375 0.203125 +vt 0.859375 0.328125 +vt 0.906250 0.328125 +vt 0.906250 0.203125 +vt 0.906250 0.375000 +vt 0.859375 0.375000 +vt 0.906250 0.187500 +vt 0.859375 0.187500 +vt 0.859375 0.140625 +vt 0.906250 0.140625 +s 0 +usemtl JetWingpack +f 11/13/7 9/14/7 10/15/7 12/16/7 +f 14/15/8 13/14/8 15/13/8 16/16/8 +f 10/17/9 9/15/9 13/14/9 14/18/9 +f 15/19/10 11/20/10 12/21/10 16/22/10 +f 13/15/11 9/14/11 11/13/11 15/16/11 +f 12/13/12 10/14/12 14/15/12 16/16/12 +o cuboid.002 +v -2.651692 -8.716561 -11.500000 +v 0.348308 -8.716561 -11.500000 +v -2.651693 -16.716560 -11.500001 +v 0.348307 -16.716560 -11.500000 +v -2.651692 -8.716561 -8.500000 +v 0.348308 -8.716561 -8.500000 +v -2.651693 -16.716560 -8.500001 +v 0.348307 -16.716560 -8.500000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vt 0.859375 0.203125 +vt 0.859375 0.328125 +vt 0.906250 0.328125 +vt 0.906250 0.203125 +vt 0.906250 0.375000 +vt 0.859375 0.375000 +vt 0.906250 0.187500 +vt 0.859375 0.187500 +vt 0.859375 0.140625 +vt 0.906250 0.140625 +s 0 +usemtl JetWingpack +f 19/23/13 17/24/13 18/25/13 20/26/13 +f 22/25/14 21/24/14 23/23/14 24/26/14 +f 18/27/15 17/25/15 21/24/15 22/28/15 +f 23/29/16 19/30/16 20/31/16 24/32/16 +f 21/25/17 17/24/17 19/23/17 23/26/17 +f 20/23/18 18/24/18 22/25/18 24/26/18 +o cuboid.003 +v -4.651692 -12.716561 -20.999998 +v -4.151692 -11.716561 -21.000002 +v -3.651692 -12.716561 -20.999998 +v -4.151692 0.283438 -4.000000 +v -5.651693 -1.716562 -4.000000 +v -2.651692 -1.716562 -4.000000 +v -4.651692 -15.716561 -20.999998 +v -3.651692 -15.716561 -20.999998 +v -4.651693 -15.716561 -4.000000 +v -3.651693 -15.716561 -4.000000 +vn -0.0000 -0.0000 -1.0000 +vn 0.8463 0.4232 -0.3236 +vn -0.7367 0.5525 -0.3900 +vn -0.7366 0.5525 -0.3900 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.9975 -0.0712 -0.0000 +vn 0.9974 -0.0713 -0.0126 +vn 0.9974 -0.0712 -0.0126 +vt 0.281250 0.703125 +vt 0.273438 0.718750 +vt 0.265625 0.703125 +vt 0.441125 0.059093 +vt 0.125000 0.079062 +vt 0.134010 0.093750 +vt 0.459145 0.093750 +vt 0.878625 0.855968 +vt 0.896645 0.890625 +vt 0.571510 0.890625 +vt 0.562500 0.875937 +vt 0.109375 0.406250 +vt 0.085938 0.437500 +vt 0.062500 0.406250 +vt 0.265625 0.656250 +vt 0.281250 0.656250 +vt 0.078125 0.187500 +vt 0.093750 0.187500 +vt 0.703125 0.750000 +vt 0.968750 0.750000 +vt 0.968750 0.765625 +vt 0.703125 0.765625 +vt 0.281250 0.546875 +vt 0.546875 0.546875 +vt 0.546875 0.765625 +vt 0.281250 0.593073 +vt 0.272710 0.500120 +vt 0.006909 0.672433 +vt 0.007106 0.453125 +vt 0.272710 0.453364 +s 0 +usemtl JetWingpack +f 25/33/19 26/34/19 27/35/19 +f 30/36/20 27/37/20 26/38/20 28/39/20 +f 29/40/21 28/41/21 26/42/22 25/43/21 +f 30/44/23 28/45/23 29/46/23 +f 25/33/19 27/35/19 32/47/19 31/48/19 +f 33/49/23 34/50/23 30/44/23 +f 29/46/23 33/49/23 30/44/23 +f 32/51/24 34/52/24 33/53/24 31/54/24 +f 31/55/25 33/56/25 29/57/25 25/58/25 +f 27/59/26 30/60/27 34/61/26 32/62/27 +o cuboid.004 +v -8.151692 -16.216560 -21.000000 +v -8.151692 -16.216560 -22.000000 +v -3.651690 -11.216561 -21.000002 +v -2.151692 -12.716561 -20.999998 +v -2.151692 -12.716561 -21.999998 +v -3.651692 -11.216561 -22.000002 +v -3.651692 -16.216560 -21.999998 +v -3.651692 -16.216560 -20.999998 +v -2.151692 -14.716561 -20.999998 +v -2.151692 -14.716561 -21.999998 +v -8.151692 -15.216560 -21.000000 +v -8.151692 -15.216560 -22.000000 +v -4.651692 -11.216561 -21.000002 +v -4.651692 -11.216561 -22.000002 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.7526 0.6585 -0.0000 +vn 0.7071 0.7071 -0.0000 +vn 0.7071 -0.7071 -0.0000 +vt 0.640625 0.078125 +vt 0.640625 0.156250 +vt 0.625000 0.156250 +vt 0.625000 0.078125 +vt 0.625000 0.578125 +vt 0.695312 0.578125 +vt 0.718750 0.601562 +vt 0.718750 0.632812 +vt 0.625000 0.539062 +vt 0.625000 0.507812 +vt 0.648438 0.484375 +vt 0.648438 0.562500 +vt 0.718750 0.484375 +vt 0.062500 0.921875 +vt 0.062500 0.890625 +vt 0.078125 0.890625 +vt 0.078125 0.921875 +vt 0.093750 0.921875 +vt 0.093750 0.906250 +vt 0.109375 0.906250 +vt 0.109375 0.921875 +vt 0.695312 0.656250 +vt 0.679688 0.656250 +vt 0.625000 0.593750 +vt 0.718750 0.500000 +vt 0.664062 0.562500 +vt 0.015625 0.843750 +vt 0.015625 0.859375 +vt 0.000000 0.859375 +vt 0.000000 0.843750 +vt 0.656250 0.156250 +vt 0.656250 0.078125 +vt 0.671875 0.078125 +vt 0.671875 0.156250 +vt 0.171875 0.968750 +vt 0.187500 0.968750 +vt 0.187500 1.000000 +vt 0.171875 1.000000 +vt 0.109375 0.687500 +vt 0.109375 0.718750 +vt 0.093750 0.718750 +vt 0.093750 0.687500 +s 0 +usemtl JetWingpack +f 42/63/28 35/64/28 36/65/28 41/66/28 +f 35/67/29 42/68/29 43/69/29 38/70/29 +f 39/71/30 44/72/30 41/73/30 40/74/30 +f 41/73/30 36/75/30 40/74/30 +f 38/76/31 43/77/31 44/78/31 39/79/31 +f 46/80/32 36/81/32 35/82/32 45/83/32 +f 38/70/29 37/84/29 47/85/29 45/86/29 +f 45/86/29 35/67/29 38/70/29 +f 36/75/30 46/87/30 48/88/30 40/74/30 +f 47/89/33 37/90/33 40/91/33 48/92/33 +f 48/93/34 46/94/34 45/95/34 47/96/34 +f 38/97/35 39/98/35 40/99/35 37/100/35 +f 41/101/36 44/102/36 43/103/36 42/104/36 +o cuboid.005 +v -2.651695 -8.716561 15.500000 +v 0.348305 -8.716561 15.500000 +v -2.651696 -16.716560 15.499999 +v 0.348304 -16.716560 15.500000 +v -2.651694 -8.716561 12.500000 +v 0.348306 -8.716561 12.500000 +v -2.651695 -16.716560 12.499999 +v 0.348305 -16.716560 12.500000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vt 0.906250 0.328125 +vt 0.859375 0.328125 +vt 0.859375 0.203125 +vt 0.906250 0.203125 +vt 0.906250 0.375000 +vt 0.859375 0.375000 +vt 0.859375 0.140625 +vt 0.859375 0.187500 +vt 0.906250 0.187500 +vt 0.906250 0.140625 +s 0 +usemtl JetWingpack +f 50/105/37 49/106/37 51/107/37 52/108/37 +f 55/107/38 53/106/38 54/105/38 56/108/38 +f 53/106/39 49/105/39 50/109/39 54/110/39 +f 52/111/40 51/112/40 55/113/40 56/114/40 +f 51/107/41 49/106/41 53/105/41 55/108/41 +f 54/105/42 50/106/42 52/107/42 56/108/42 +o cuboid.006 +v -3.651694 -9.716561 12.500000 +v -1.651694 -9.716561 12.500000 +v -3.651695 -15.716561 12.499999 +v -1.651695 -15.716561 12.499999 +v -3.651694 -9.716561 11.500000 +v -1.651694 -9.716561 11.500000 +v -3.651695 -15.716561 11.499999 +v -1.651695 -15.716561 11.499999 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vt 0.953125 0.687500 +vt 0.921875 0.687500 +vt 0.921875 0.593750 +vt 0.953125 0.593750 +vt 0.921875 0.703125 +vt 0.937500 0.703125 +vt 0.937500 0.734375 +vt 0.921875 0.734375 +vt 0.937500 0.484375 +vt 0.937500 0.578125 +vt 0.921875 0.578125 +vt 0.921875 0.484375 +s 0 +usemtl JetWingpack +f 58/115/43 57/116/43 59/117/43 60/118/43 +f 63/118/44 61/115/44 62/116/44 64/117/44 +f 61/119/45 57/120/45 58/121/45 62/122/45 +f 60/120/46 59/121/46 63/122/46 64/119/46 +f 59/123/47 57/124/47 61/125/47 63/126/47 +f 62/124/48 58/125/48 60/126/48 64/123/48 +o cuboid.007 +v -2.651694 -8.716561 11.500000 +v 0.348306 -8.716561 11.500000 +v -2.651695 -16.716560 11.499999 +v 0.348305 -16.716560 11.500000 +v -2.651694 -8.716561 8.500000 +v 0.348306 -8.716561 8.500000 +v -2.651695 -16.716560 8.499999 +v 0.348305 -16.716560 8.500000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vt 0.906250 0.328125 +vt 0.859375 0.328125 +vt 0.859375 0.203125 +vt 0.906250 0.203125 +vt 0.906250 0.375000 +vt 0.859375 0.375000 +vt 0.859375 0.140625 +vt 0.859375 0.187500 +vt 0.906250 0.187500 +vt 0.906250 0.140625 +s 0 +usemtl JetWingpack +f 66/127/49 65/128/49 67/129/49 68/130/49 +f 71/129/50 69/128/50 70/127/50 72/130/50 +f 69/128/51 65/127/51 66/131/51 70/132/51 +f 68/133/52 67/134/52 71/135/52 72/136/52 +f 67/129/53 65/128/53 69/127/53 71/130/53 +f 70/127/54 66/128/54 68/129/54 72/130/54 +o cuboid.008 +v -8.151695 -16.216560 21.000002 +v -8.151695 -16.216560 22.000002 +v -3.651695 -11.216561 20.999998 +v -2.151695 -12.716561 21.000002 +v -2.151695 -12.716561 22.000002 +v -3.651695 -11.216561 21.999998 +v -3.651697 -16.216560 22.000002 +v -3.651696 -16.216560 21.000002 +v -2.151696 -14.716561 21.000002 +v -2.151697 -14.716561 22.000002 +v -8.151695 -15.216560 21.000002 +v -8.151695 -15.216560 22.000002 +v -4.651695 -11.216561 20.999998 +v -4.651695 -11.216561 21.999998 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.0000 1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.7526 0.6585 -0.0000 +vn 0.7071 0.7071 -0.0000 +vn 0.7071 -0.7071 -0.0000 +vt 0.703125 0.156250 +vt 0.687500 0.156250 +vt 0.687500 0.078125 +vt 0.703125 0.078125 +vt 0.625000 0.414062 +vt 0.648438 0.390625 +vt 0.718750 0.390625 +vt 0.625000 0.445312 +vt 0.695312 0.296875 +vt 0.718750 0.320312 +vt 0.718750 0.351562 +vt 0.695312 0.375000 +vt 0.625000 0.296875 +vt 0.187500 0.609375 +vt 0.203125 0.609375 +vt 0.203125 0.640625 +vt 0.187500 0.640625 +vt 0.203125 0.984375 +vt 0.218750 0.984375 +vt 0.218750 1.000000 +vt 0.203125 1.000000 +vt 0.664062 0.468750 +vt 0.648438 0.468750 +vt 0.718750 0.406250 +vt 0.679688 0.375000 +vt 0.625000 0.312500 +vt 0.078125 0.718750 +vt 0.062500 0.718750 +vt 0.062500 0.703125 +vt 0.078125 0.703125 +vt 0.718750 0.078125 +vt 0.734375 0.078125 +vt 0.734375 0.156250 +vt 0.718750 0.156250 +vt 0.390625 1.000000 +vt 0.390625 0.968750 +vt 0.406250 0.968750 +vt 0.406250 1.000000 +vt 0.453125 0.765625 +vt 0.437500 0.765625 +vt 0.437500 0.734375 +vt 0.453125 0.734375 +s 0 +usemtl JetWingpack +f 74/137/55 73/138/55 80/139/55 79/140/55 +f 81/141/56 80/142/56 73/143/56 76/144/56 +f 79/145/57 82/146/57 77/147/57 78/148/57 +f 74/149/57 79/145/57 78/148/57 +f 82/150/58 81/151/58 76/152/58 77/153/58 +f 73/154/59 74/155/59 84/156/59 83/157/59 +f 85/158/56 75/159/56 76/144/56 83/160/56 +f 73/143/56 83/160/56 76/144/56 +f 86/161/57 84/162/57 74/149/57 78/148/57 +f 78/163/60 75/164/60 85/165/60 86/166/60 +f 83/167/61 84/168/61 86/169/61 85/170/61 +f 78/171/62 77/172/62 76/173/62 75/174/62 +f 81/175/63 82/176/63 79/177/63 80/178/63 +o cuboid.009 +v -6.151694 -11.716561 3.999999 +v -6.151693 0.283438 4.000000 +v -2.151694 -11.716561 4.000000 +v -2.151693 0.283438 4.000000 +v -6.151693 -11.716561 -4.000000 +v -6.151692 0.283438 -4.000000 +v -2.151693 -11.716561 -4.000000 +v -2.151692 0.283438 -4.000000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vt 0.125000 0.437500 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.187500 0.437500 +vt 0.203125 0.250000 +vt 0.265625 0.250000 +vt 0.265625 0.437500 +vt 0.203125 0.437500 +vt 0.296875 0.343750 +vt 0.421875 0.343750 +vt 0.421875 0.531250 +vt 0.296875 0.531250 +vt 0.437500 0.531250 +vt 0.437500 0.343750 +vt 0.562500 0.343750 +vt 0.562500 0.531250 +vt 0.125000 0.937500 +vt 0.125000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.937500 +vt 0.125000 0.656250 +vt 0.250000 0.656250 +vt 0.250000 0.718750 +vt 0.125000 0.718750 +s 0 +usemtl JetWingpack +f 88/179/64 87/180/64 89/181/64 90/182/64 +f 93/183/65 91/184/65 92/185/65 94/186/65 +f 91/187/66 87/188/66 88/189/66 92/190/66 +f 90/191/67 89/192/67 93/193/67 94/194/67 +f 89/195/68 87/196/68 91/197/68 93/198/68 +f 92/199/69 88/200/69 90/201/69 94/202/69 +o cuboid.010 +v -2.260000 -6.000000 4.260000 +v -2.260000 0.260000 4.260000 +v 2.260000 -6.000000 4.260001 +v 2.259999 0.260000 4.260000 +v -2.260000 -6.000000 -4.260000 +v -2.260000 0.260000 -4.260000 +v 2.260000 -6.000000 -4.260000 +v 2.260001 0.260000 -4.260000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vt 0.296875 0.765625 +vt 0.296875 0.671875 +vt 0.359375 0.671875 +vt 0.359375 0.765625 +vt 0.281250 0.234375 +vt 0.343750 0.234375 +vt 0.343750 0.328125 +vt 0.281250 0.328125 +vt 0.484375 0.906250 +vt 0.609375 0.906250 +vt 0.609375 1.000000 +vt 0.484375 1.000000 +vt 0.562500 0.765625 +vt 0.562500 0.671875 +vt 0.687500 0.671875 +vt 0.687500 0.765625 +vt 0.703125 0.781250 +vt 0.703125 0.843750 +vt 0.578125 0.843750 +vt 0.578125 0.781250 +vt 0.625000 0.937500 +vt 0.750000 0.937500 +vt 0.750000 1.000000 +vt 0.625000 1.000000 +s 0 +usemtl JetWingpack +f 96/203/70 95/204/70 97/205/70 98/206/70 +f 101/207/71 99/208/71 100/209/71 102/210/71 +f 99/211/72 95/212/72 96/213/72 100/214/72 +f 98/215/73 97/216/73 101/217/73 102/218/73 +f 97/219/74 95/220/74 99/221/74 101/222/74 +f 100/223/75 96/224/75 98/225/75 102/226/75 +o cuboid.011 +v -3.596138 -16.716560 -3.333334 +v -4.707249 -16.716560 -3.333334 +v -3.151693 -11.716561 -4.000000 +v -5.151693 -11.716561 -4.000000 +v -4.707249 -16.716560 -0.666667 +v -3.596138 -16.716560 -0.666667 +v -5.151693 -11.716561 -0.000001 +v -3.151693 -11.716561 -0.000000 +v -5.485027 -16.716560 -2.555556 +v -5.485027 -16.716560 -1.444445 +v -6.151693 -11.716561 -3.000001 +v -6.151693 -11.716561 -1.000001 +v -2.818360 -16.716560 -1.444445 +v -2.818360 -16.716560 -2.555556 +v -2.151693 -11.716561 -1.000000 +v -2.151693 -11.716561 -3.000000 +vn -0.0000 -0.1322 -0.9912 +vn -0.0000 -0.1322 0.9912 +vn -0.9912 -0.1322 -0.0000 +vn 0.9912 -0.1322 -0.0000 +vn -0.6985 -0.1552 0.6985 +vn -0.6985 -0.1552 -0.6985 +vn 0.6985 -0.1552 -0.6985 +vn 0.6985 -0.1552 0.6985 +vn -0.0000 -1.0000 -0.0000 +vt 0.748225 0.406250 +vt 0.734375 0.312688 +vt 0.765625 0.310394 +vt 0.765625 0.404975 +vt 0.748225 0.281250 +vt 0.734375 0.187688 +vt 0.765625 0.185394 +vt 0.765625 0.279975 +vt 0.607600 0.281250 +vt 0.593750 0.187688 +vt 0.625000 0.185394 +vt 0.625000 0.279975 +vt 0.748225 0.531250 +vt 0.734375 0.437688 +vt 0.765625 0.435394 +vt 0.765625 0.529975 +vt 0.800892 0.515625 +vt 0.783706 0.515625 +vt 0.781250 0.421875 +vt 0.803347 0.421875 +vt 0.321653 0.125000 +vt 0.343750 0.125000 +vt 0.341294 0.218750 +vt 0.324108 0.218750 +vt 0.781250 0.531250 +vt 0.803347 0.531250 +vt 0.800891 0.625000 +vt 0.783705 0.625000 +vt 0.810045 0.734375 +vt 0.792859 0.734375 +vt 0.790403 0.640625 +vt 0.812500 0.640625 +vt 0.014756 0.921875 +vt 0.002605 0.909723 +vt 0.002605 0.892361 +vt 0.014756 0.880209 +vt 0.032119 0.880209 +vt 0.044270 0.892361 +vt 0.044270 0.909723 +vt 0.032119 0.921875 +vt 0.375000 0.328125 +vt 0.359375 0.312500 +vt 0.359375 0.281250 +vt 0.375000 0.265625 +vt 0.406250 0.265625 +vt 0.421875 0.281250 +vt 0.421875 0.312500 +vt 0.406250 0.328125 +s 0 +usemtl JetWingpack +f 104/227/76 106/228/76 105/229/76 103/230/76 +f 108/231/77 110/232/77 109/233/77 107/234/77 +f 112/235/78 114/236/78 113/237/78 111/238/78 +f 116/239/79 118/240/79 117/241/79 115/242/79 +f 112/243/80 107/244/80 109/245/80 114/246/80 +f 113/247/81 106/248/81 104/249/81 111/250/81 +f 105/251/82 118/252/82 116/253/82 103/254/82 +f 108/255/83 115/256/83 117/257/83 110/258/83 +f 115/259/84 108/260/84 107/261/84 112/262/84 +f 112/262/84 111/263/84 104/264/84 103/265/84 +f 103/265/84 116/266/84 115/259/84 112/262/84 +f 117/267/84 110/268/84 109/269/84 114/270/84 +f 114/270/84 113/271/84 106/272/84 105/273/84 +f 105/273/84 118/274/84 117/267/84 114/270/84 +o cuboid.012 +v -3.596138 -16.716560 0.666666 +v -4.707249 -16.716560 0.666666 +v -3.151693 -11.716561 -0.000000 +v -5.151693 -11.716561 -0.000001 +v -4.707249 -16.716560 3.333333 +v -3.596138 -16.716560 3.333333 +v -5.151694 -11.716561 3.999999 +v -3.151694 -11.716561 4.000000 +v -5.485027 -16.716560 1.444444 +v -5.485027 -16.716560 2.555555 +v -6.151693 -11.716561 0.999999 +v -6.151694 -11.716561 2.999999 +v -2.818361 -16.716560 2.555555 +v -2.818361 -16.716560 1.444444 +v -2.151694 -11.716561 3.000000 +v -2.151694 -11.716561 1.000000 +vn -0.0000 -0.1322 -0.9912 +vn -0.0000 -0.1322 0.9912 +vn -0.9912 -0.1322 -0.0000 +vn 0.9912 -0.1322 -0.0000 +vn -0.6985 -0.1552 0.6985 +vn -0.6985 -0.1552 -0.6985 +vn 0.6985 -0.1552 -0.6985 +vn 0.6985 -0.1552 0.6985 +vn -0.0000 -1.0000 -0.0000 +vt 0.420100 0.250000 +vt 0.406250 0.156438 +vt 0.437500 0.154144 +vt 0.437500 0.248725 +vt 0.466975 0.250000 +vt 0.453125 0.156438 +vt 0.484375 0.154144 +vt 0.484375 0.248725 +vt 0.654475 0.281250 +vt 0.640625 0.187688 +vt 0.671875 0.185394 +vt 0.671875 0.279975 +vt 0.373225 0.250000 +vt 0.359375 0.156438 +vt 0.390625 0.154144 +vt 0.390625 0.248725 +vt 0.019642 0.171875 +vt 0.002456 0.171875 +vt 0.000000 0.078125 +vt 0.022097 0.078125 +vt 0.790403 0.203125 +vt 0.812500 0.203125 +vt 0.810044 0.296875 +vt 0.792858 0.296875 +vt 0.781250 0.093750 +vt 0.803347 0.093750 +vt 0.800891 0.187500 +vt 0.783705 0.187500 +vt 0.810045 0.406250 +vt 0.792859 0.406250 +vt 0.790403 0.312500 +vt 0.812500 0.312500 +vt 0.233506 0.640625 +vt 0.221355 0.628473 +vt 0.221355 0.611111 +vt 0.233506 0.598959 +vt 0.250869 0.598959 +vt 0.263020 0.611111 +vt 0.263020 0.628473 +vt 0.250869 0.640625 +vt 0.453125 0.328125 +vt 0.437500 0.312500 +vt 0.437500 0.281250 +vt 0.453125 0.265625 +vt 0.484375 0.265625 +vt 0.500000 0.281250 +vt 0.500000 0.312500 +vt 0.484375 0.328125 +s 0 +usemtl JetWingpack +f 120/275/85 122/276/85 121/277/85 119/278/85 +f 124/279/86 126/280/86 125/281/86 123/282/86 +f 128/283/87 130/284/87 129/285/87 127/286/87 +f 132/287/88 134/288/88 133/289/88 131/290/88 +f 128/291/89 123/292/89 125/293/89 130/294/89 +f 129/295/90 122/296/90 120/297/90 127/298/90 +f 121/299/91 134/300/91 132/301/91 119/302/91 +f 124/303/92 131/304/92 133/305/92 126/306/92 +f 131/307/93 124/308/93 123/309/93 128/310/93 +f 128/310/93 127/311/93 120/312/93 119/313/93 +f 119/313/93 132/314/93 131/307/93 128/310/93 +f 133/315/93 126/316/93 125/317/93 130/318/93 +f 130/318/93 129/319/93 122/320/93 121/321/93 +f 121/321/93 134/322/93 133/315/93 130/318/93 +o cuboid.013 +v -4.651695 -12.716561 21.000002 +v -4.151695 -11.716561 20.999998 +v -3.651695 -12.716561 21.000002 +v -4.151693 0.283438 3.999999 +v -5.651693 -1.716562 4.000000 +v -2.651693 -1.716562 4.000000 +v -4.651697 -15.716561 21.000002 +v -3.651696 -15.716561 21.000002 +v -4.651694 -15.716561 3.999999 +v -3.651694 -15.716561 4.000000 +vn -0.0000 -0.0000 1.0000 +vn 0.8463 0.4232 0.3236 +vn -0.7366 0.5525 0.3900 +vn -0.7367 0.5525 0.3900 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.9975 -0.0712 -0.0000 +vn 0.9974 -0.0713 0.0126 +vn 0.9974 -0.0712 0.0126 +vt 0.148438 1.000000 +vt 0.140625 0.984375 +vt 0.156250 0.984375 +vt 0.609375 0.331116 +vt 0.598094 0.322105 +vt 0.578125 0.638230 +vt 0.609375 0.656250 +vt 0.023438 0.437500 +vt 0.000000 0.406250 +vt 0.046875 0.406250 +vt 0.156250 0.937500 +vt 0.140625 0.937500 +vt 0.015625 0.187500 +vt 0.031250 0.187500 +vt 0.625000 0.921875 +vt 0.625000 0.906250 +vt 0.890625 0.906250 +vt 0.890625 0.921875 +vt 0.296875 1.000000 +vt 0.296875 0.781250 +vt 0.562500 0.781250 +vt 0.562500 0.827448 +vt 0.274144 0.734375 +vt 0.274341 0.953683 +vt 0.008540 0.781370 +vt 0.008540 0.734614 +s 0 +usemtl JetWingpack +f 136/323/94 135/324/94 137/325/94 +f 136/326/95 137/327/95 140/328/95 138/329/95 +f 136/326/96 138/329/97 139/328/97 135/327/97 +f 138/330/98 140/331/98 139/332/98 +f 142/333/94 137/325/94 135/324/94 141/334/94 +f 144/335/98 143/336/98 140/331/98 +f 143/336/98 139/332/98 140/331/98 +f 143/337/99 144/338/99 142/339/99 141/340/99 +f 139/341/100 143/342/100 141/343/100 135/344/100 +f 144/345/101 140/346/102 137/347/101 142/348/102 diff --git a/src/main/resources/assets/susy/textures/armor/jet_wingpack.png b/src/main/resources/assets/susy/textures/armor/jet_wingpack.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca06410bf562f208a8855305ef1a1c3cd34d759 GIT binary patch literal 3858 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 z Date: Mon, 9 Dec 2024 00:27:54 +0800 Subject: [PATCH 12/19] feat: jet wingpack --- .../common/item/SuSyMetaItems.java | 6 +- .../common/item/armor/JetWingpack.java | 325 ++++++++++++++++++ .../common/item/armor/SuSyMetaArmor.java | 12 + .../models/item/metaitems/jet_wingpack.json | 6 + .../textures/items/metaitems/jet_wingpack.png | Bin 0 -> 1898 bytes .../resources/assets/susy/lang/en_us.lang | 6 + 6 files changed, 354 insertions(+), 1 deletion(-) create mode 100644 src/main/java/supersymmetry/common/item/armor/JetWingpack.java create mode 100644 src/main/java/supersymmetry/common/item/armor/SuSyMetaArmor.java create mode 100644 src/main/resources/assets/gregtech/models/item/metaitems/jet_wingpack.json create mode 100644 src/main/resources/assets/gregtech/textures/items/metaitems/jet_wingpack.png diff --git a/src/main/java/supersymmetry/common/item/SuSyMetaItems.java b/src/main/java/supersymmetry/common/item/SuSyMetaItems.java index 7828217ff..8a34c3ba3 100644 --- a/src/main/java/supersymmetry/common/item/SuSyMetaItems.java +++ b/src/main/java/supersymmetry/common/item/SuSyMetaItems.java @@ -1,6 +1,7 @@ package supersymmetry.common.item; import gregtech.api.GTValues; +import gregtech.api.items.armor.ArmorMetaItem; import gregtech.api.items.metaitem.MetaItem.MetaValueItem; import gregtech.api.items.metaitem.MetaOreDictItem; import gregtech.api.items.metaitem.MetaOreDictItem.OreDictValueItem; @@ -10,6 +11,7 @@ import gregtech.common.items.behaviors.TooltipBehavior; import net.minecraft.client.resources.I18n; import supersymmetry.SuSyValues; +import supersymmetry.common.item.armor.SuSyMetaArmor; public class SuSyMetaItems { @@ -20,13 +22,15 @@ public class SuSyMetaItems { public static MetaValueItem PUMP_STEAM; public static MetaValueItem AIR_VENT; public static MetaValueItem TRACK_SEGMENT; + public static ArmorMetaItem.ArmorMetaValueItem JET_WINGPACK; public static void initMetaItems() { metaItem = new StandardMetaItem(); metaItem.setRegistryName("meta_item"); oreDictItem = new MetaOreDictItem((short) 0); oreDictItem.setRegistryName("susy_oredict_item"); - + SuSyMetaArmor armor = new SuSyMetaArmor(); + armor.setRegistryName("susy_armor"); CatalystItems.init(); } diff --git a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java new file mode 100644 index 000000000..f8946ce12 --- /dev/null +++ b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java @@ -0,0 +1,325 @@ +package supersymmetry.common.item.armor; + +import gregtech.api.GTValues; +import gregtech.api.capability.IFilter; +import gregtech.api.capability.impl.GTFluidHandlerItemStack; +import gregtech.api.items.armor.ArmorLogicSuite; +import gregtech.api.items.armor.ArmorMetaItem; +import gregtech.api.items.armor.ArmorUtils; +import gregtech.api.items.metaitem.stats.*; +import gregtech.api.recipes.Recipe; +import gregtech.api.recipes.RecipeMaps; +import gregtech.api.unification.material.Materials; +import gregtech.api.util.GTUtility; +import gregtech.api.util.GradientUtil; +import gregtech.api.util.input.KeyBind; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.resources.I18n; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.*; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; +import net.minecraftforge.fluids.capability.IFluidTankProperties; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import supersymmetry.api.capability.IElytraFlyingProvider; +import supersymmetry.api.capability.SuSyCapabilities; +import supersymmetry.api.util.ElytraFlyingUtils; +import supersymmetry.client.renderer.handler.JetWingpackModel; + +import java.awt.*; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.function.Function; + + +public class JetWingpack extends ArmorLogicSuite implements IItemHUDProvider { + + public static final int TANK_CAPACITY = 32000; + public static final Function COMBUSTION_FUEL_BURN_TIME = fluidStack -> { + Recipe recipe = RecipeMaps.COMBUSTION_GENERATOR_FUELS.findRecipe( + Integer.MAX_VALUE, + Collections.emptyList(), + Collections.singletonList(fluidStack)); + return recipe != null ? recipe.getDuration() : 0; + }; + + @SideOnly(Side.CLIENT) + private ArmorUtils.ModularHUD HUD; + + protected JetWingpack() { + super(1, TANK_CAPACITY, GTValues.EV, EntityEquipmentSlot.CHEST); + if (ArmorUtils.SIDE.isClient()) { + this.HUD = new ArmorUtils.ModularHUD(); + } + } + + @SideOnly(Side.CLIENT) + public void drawHUD(@NotNull ItemStack item) { + IFluidHandlerItem tank = item.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + if (tank != null) { + IFluidTankProperties[] prop = tank.getTankProperties(); + if (prop[0] != null && prop[0].getContents() != null) { + if (prop[0].getContents().amount == 0) { + return; + } + + String formated = String.format("%.1f", (float) prop[0].getContents().amount * 100.0F / (float) prop[0].getCapacity()); + this.HUD.newString(I18n.format("metaarmor.hud.fuel_lvl", formated + "%")); + NBTTagCompound data = item.getTagCompound(); + if (data != null && data.hasKey("engineActive")) { + String status = data.getBoolean("engineActive") ? I18n.format("metaarmor.hud.status.enabled") : I18n.format("metaarmor.hud.status.disabled"); + String result = I18n.format("metaarmor.hud.engine_status", status); + this.HUD.newString(result); + } + } + } + + this.HUD.draw(); + this.HUD.reset(); + } + + @Override + public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) { + NBTTagCompound data = GTUtility.getOrCreateNbtCompound(itemStack); + + byte toggleTimer = 0; + boolean pressed = false; + boolean wingActive = false; + boolean engineActive = false; + + if (data.hasKey("toggleTimer")) toggleTimer = data.getByte("toggleTimer"); + if (data.hasKey("pressed")) pressed = data.getBoolean("pressed"); + if (data.hasKey("wingActive")) wingActive = data.getBoolean("wingActive"); + if (data.hasKey("engineActive")) engineActive = data.getBoolean("engineActive"); + + if (toggleTimer == 0 && KeyBind.ARMOR_MODE_SWITCH.isKeyDown(player)) { + engineActive = !engineActive; + toggleTimer = 5; + if (!world.isRemote) { + if (engineActive) + player.sendStatusMessage(new TextComponentTranslation("metaarmor.jet_wingpack.engine_active"), true); + else + player.sendStatusMessage(new TextComponentTranslation("metaarmor.jet_wingpack.engine_inactive"), true); + } + } + + if (engineActive && player.isElytraFlying() && drainFuel(itemStack, getEnergyPerUse(), true)) { + Vec3d vec3d = player.getLookVec(); + if (KeyBind.VANILLA_SNEAK.isKeyDown(player)) { + player.motionX += vec3d.x * 0.001D - 0.05D * player.motionX; + player.motionY += -0.005D - 0.05D * player.motionY; + player.motionZ += vec3d.z * 0.001D - 0.05D * player.motionZ; + } else { + player.motionX += 0.05D * (2 * vec3d.x - player.motionX); + player.motionY += 0.05D * (2 * vec3d.y - player.motionY); + player.motionZ += 0.05D * (2 * vec3d.z - player.motionZ); + world.spawnParticle(EnumParticleTypes.CLOUD, player.posX, player.posY, player.posZ, 0.0, 0.0, 0.0); + } + drainFuel(itemStack, getEnergyPerUse(), false); + } + + if (!pressed && KeyBind.VANILLA_JUMP.isKeyDown(player)) { + pressed = true; + if (!world.isRemote) { + EntityPlayerMP playerMP = (EntityPlayerMP) player; + if (!wingActive) { + if (ElytraFlyingUtils.canTakeOff(playerMP, engineActive)) { + playerMP.setElytraFlying(); + wingActive = true; + } + } else { + playerMP.clearElytraFlying(); + wingActive = false; + } + } + } + + if (pressed && !KeyBind.VANILLA_JUMP.isKeyDown(player)) pressed = false; + if (toggleTimer > 0) toggleTimer--; + + data.setByte("toggleTimer", toggleTimer); + data.setBoolean("pressed", pressed); + data.setBoolean("wingActive", wingActive); + data.setBoolean("engineActive", engineActive); + + player.inventoryContainer.detectAndSendChanges(); + } + + @Override + public void addToolComponents(ArmorMetaItem.ArmorMetaValueItem mvi) { + mvi.addComponents(new TestElytraFlyingProvider()); + mvi.addComponents(new JetWingpackBehaviour(TANK_CAPACITY)); + } + + @Override + public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, EntityEquipmentSlot armorSlot, + ModelBiped defaultModel) { + return JetWingpackModel.INSTANCE; + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) { + return "susy:textures/armor/jet_wingpack.png"; // actually useless + } + + protected boolean drainFuel(@NotNull ItemStack stack, int amount, boolean simulate) { + NBTTagCompound data = GTUtility.getOrCreateNbtCompound(stack); + short burnTimer = 0; + if (data.hasKey("burnTimer")) burnTimer = data.getShort("burnTimer"); + if (burnTimer > 0) { + if (!simulate) { + data.setShort("burnTimer", (short) (burnTimer - 1)); + } + return true; + } + + IFluidHandlerItem fluidHandler = getFluidHandler(stack); + if (fluidHandler == null) return false; + FluidStack fuelStack = fluidHandler.drain(amount, false); + if (fuelStack == null) return false; + + int burnTime = COMBUSTION_FUEL_BURN_TIME.apply(fuelStack); + if (burnTime <= 0) return false; + + if (!simulate) { + data.setShort("burnTimer", (short) (burnTime)); + fluidHandler.drain(amount, true); + } + return true; + } + + private IFluidHandlerItem getFluidHandler(ItemStack stack) { + return stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + } + + private static class TestElytraFlyingProvider implements IItemComponent, IElytraFlyingProvider, ICapabilityProvider, IItemCapabilityProvider { + + @Override + public boolean isElytraFlying(@NotNull EntityLivingBase entity, @NotNull ItemStack itemStack, boolean shouldStop) { + if (entity instanceof EntityPlayer) { + NBTTagCompound data = GTUtility.getOrCreateNbtCompound(itemStack); + if (shouldStop) { + data.setBoolean("wingActive", false); + } + return data.hasKey("wingActive") && data.getBoolean("wingActive"); + } + return false; + } + + @Override + public boolean hasCapability(@NotNull Capability capability, @Nullable EnumFacing facing) { + return capability == SuSyCapabilities.ELYTRA_FLYING_PROVIDER; + } + + @Nullable + @Override + public T getCapability(@NotNull Capability capability, @Nullable EnumFacing facing) { + return capability == SuSyCapabilities.ELYTRA_FLYING_PROVIDER ? SuSyCapabilities.ELYTRA_FLYING_PROVIDER.cast(this) : null; + } + + @Override + public ICapabilityProvider createProvider(ItemStack itemStack) { + return this; + } + } + + // Yeah, this is a bit bloat... + public class JetWingpackBehaviour implements IItemDurabilityManager, IItemCapabilityProvider, IItemBehaviour, ISubItemHandler { + + private static final IFilter JETPACK_FUEL_FILTER = new IFilter<>() { + + @Override + public boolean test(@NotNull FluidStack fluidStack) { + return RecipeMaps.COMBUSTION_GENERATOR_FUELS.find(Collections.emptyList(), + Collections.singletonList(fluidStack), (Objects::nonNull)) != null; + } + + @Override + public int getPriority() { + return IFilter.whitelistLikePriority(); + } + }; + public final int maxCapacity; + private final Pair durabilityBarColors; + + public JetWingpackBehaviour(int internalCapacity) { + this.maxCapacity = internalCapacity; + this.durabilityBarColors = GradientUtil.getGradient(0xB7AF08, 10); + } + + @Override + public double getDurabilityForDisplay(@NotNull ItemStack itemStack) { + IFluidHandlerItem fluidHandlerItem = itemStack + .getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + if (fluidHandlerItem == null) return 0; + IFluidTankProperties fluidTankProperties = fluidHandlerItem.getTankProperties()[0]; + FluidStack fluidStack = fluidTankProperties.getContents(); + return fluidStack == null ? 0 : (double) fluidStack.amount / (double) fluidTankProperties.getCapacity(); + } + + @Nullable + @Override + public Pair getDurabilityColorsForDisplay(ItemStack itemStack) { + return durabilityBarColors; + } + + @Override + public ICapabilityProvider createProvider(ItemStack itemStack) { + return new GTFluidHandlerItemStack(itemStack, maxCapacity) + .setFilter(JETPACK_FUEL_FILTER); + } + + @Override + public void addInformation(ItemStack itemStack, List lines) { + IItemBehaviour.super.addInformation(itemStack, lines); + NBTTagCompound data = GTUtility.getOrCreateNbtCompound(itemStack); + String status = I18n.format("metaarmor.hud.status.disabled"); + if (data.hasKey("engineActive")) { + if (data.getBoolean("engineActive")) + status = I18n.format("metaarmor.hud.status.enabled"); + } + lines.add(I18n.format("metaarmor.hud.engine_status", status)); + } + + @Override + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + return onRightClick(world, player, hand); + } + + @Override + public String getItemSubType(ItemStack itemStack) { + return ""; + } + + @Override + public void getSubItems(ItemStack itemStack, CreativeTabs creativeTab, NonNullList subItems) { + ItemStack copy = itemStack.copy(); + IFluidHandlerItem fluidHandlerItem = copy + .getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + if (fluidHandlerItem != null) { + fluidHandlerItem.fill(Materials.Diesel.getFluid(TANK_CAPACITY), true); + subItems.add(copy); + } else { + subItems.add(itemStack); + } + } + } +} diff --git a/src/main/java/supersymmetry/common/item/armor/SuSyMetaArmor.java b/src/main/java/supersymmetry/common/item/armor/SuSyMetaArmor.java new file mode 100644 index 000000000..f25bab9cf --- /dev/null +++ b/src/main/java/supersymmetry/common/item/armor/SuSyMetaArmor.java @@ -0,0 +1,12 @@ +package supersymmetry.common.item.armor; + +import gregtech.api.items.armor.ArmorMetaItem; +import supersymmetry.common.item.SuSyMetaItems; + +public class SuSyMetaArmor extends ArmorMetaItem.ArmorMetaValueItem> { + + @Override + public void registerSubItems() { + SuSyMetaItems.JET_WINGPACK = addItem(1, "jet_wingpack").setArmorLogic(new JetWingpack()); + } +} diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/jet_wingpack.json b/src/main/resources/assets/gregtech/models/item/metaitems/jet_wingpack.json new file mode 100644 index 000000000..40fba5d02 --- /dev/null +++ b/src/main/resources/assets/gregtech/models/item/metaitems/jet_wingpack.json @@ -0,0 +1,6 @@ +{ + "parent" : "item/generated", + "textures" : { + "layer0" : "gregtech:items/metaitems/jet_wingpack" + } +} diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/jet_wingpack.png b/src/main/resources/assets/gregtech/textures/items/metaitems/jet_wingpack.png new file mode 100644 index 0000000000000000000000000000000000000000..7cdc8dcb459b1818a1c32c4bff4c31ddd9465376 GIT binary patch literal 1898 zcmbVN4NTN#7%s_Rz`~-N%tb}If*^6dw)fx08*&`(*gQty46woCNBiB;ao5(ia0g>1 zBXh%LCh9^=)MdJnY?+Ju(QHP7684uRJ57d86XKZ0#gK)c1u)AXvaiS8MIHXcroDb` zpZ9s6_vd?WS9R6%IoYeSF$~M8^m=O0eVK7(W}x5v=>>ppS&Fwo!?4GmG_Ex4z@eux zEWKa!*X#AZEgUb0O+b*Fp(z?x5E{camPQr8w?Z9nhCxws5tIFA2wW6gM4in?`;>Cn zB6>SjSle0U=Q~?@Rv=2B!#74bL=c8Lz@y=iq;XLf5$EO5+IUS7cpRd)x`;BvAztsR z#>-_D;;e}wd73uk4%XD{;O$nPe-<~>W-CQID8^3G4$j7MRvJ$n1ahYe0j|cgIpGXF zxri2BS2&7_L?Wh$#U!giieXunqRo`qOd0c9C{QTIL>n>1fdZexDQ#*f?p)w07=mFa=^DZ^DXh{W>$27& z--SB$`8EeAw?1FW$C6sY;gkzauV_bMBoeYDTJv`(kg9>2+@|udq8-UBFrrboauoty zR{gRZN>-{mDH%80O$@%iPLu>WqLtiY06jp5F2bl9$(Tvn>1QmQ8J*@0w3DOhMW{~} z#6ZU#P}Wb=9Ao3G_S>MSX9S>w`+^0Y3&?61pn%0N2trDcf&`vQBUdhmWED9^>MU^; zJ|9;pX*!U2Sm|*QC}xu=3LNS{8w+Si+8h=q$=Iws$qH5nTCu=R2L#4u=9BgwnQt>H zo3s~@y#Q#3!{V@#yj`%6OtTe|ti{fd0t=BnO*@?+<^LsBL|Y4l9-7D4a7IgTUQt8E z>PYN}TDU#23W<2U3pl_V-R&ZHqpVOM60gN2GVov#EYe0=AR@g-xffxY9MB^`g=ImM zt^2kUbvN-EXur4g2P@u^(*NIn4 z-0P-&NB&Klf4t_=;^o_at$JasDBLvOczmYTd4fOOlwDC*wy$XN^>bs(K70G*B_eub zTA}tI3~9aRkDb36-1PG3>|edP6iN19kmi2A+C4n|LFojS-uG?)j;W6K%ho=TO>~d! zZkQN9Q|uZ!;C`+4&xwqW8&5WT(UaNt$L8@>*;-^FZ*1(Htiq;7(D-}de)lJ@79X7| z2ud-3S3W#FJJ(f`K62>u(}N?eW5s)Z`-#8a*pumgli0I!$UF4ZH+$a;SLF|UpMSCD zYOHv4QmX#CdWGA)e5P|?X71BiV0a~D2d8HL-cWP&Li@m}9VHl^w`T1>A^PxJJ?0Ge z&a>a0edNoFmyf@jxzfL7{f~q5Lm!>Xcq6bnr*G3Ug<4maHSL$!<*)KCZ98~H@obIF ipBjSGAKn}qy|!ju?1q+Gk+sYCH>|9v@*Hz->;4Z~){6N6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/susy/lang/en_us.lang b/src/main/resources/assets/susy/lang/en_us.lang index 966b65ad7..ae4bd716d 100644 --- a/src/main/resources/assets/susy/lang/en_us.lang +++ b/src/main/resources/assets/susy/lang/en_us.lang @@ -824,6 +824,12 @@ gregtech.catalyst_group.standard_catalysts.name=Standard Catalyst gregtech.catalyst_group.cracking_catalyst_beds.name=Cracking Catalyst metaitem.standard_catalyst_bed_cracking.name=Cracking Catalyst Bed +# Armors +metaitem.jet_wingpack.name=Jet Wingpack +metaarmor.hud.engine_status=Engine: %s +metaarmor.jet_wingpack.engine_active=Jet Wingpack: Engine Activated +metaarmor.jet_wingpack.engine_inactive=Jet Wingpack: Engine Deactivated + # Machine Translations susy.ocean_pumper.full=Tanks are Full! susy.ocean_pumper.drainrate=Current Pumping Rate: %s From dd4029398aa0668a233053f638924fd8306c5909 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Mon, 9 Dec 2024 10:44:21 +0800 Subject: [PATCH 13/19] feat: use gas turbine recipe map --- src/main/java/supersymmetry/common/item/armor/JetWingpack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java index f8946ce12..1c62f2332 100644 --- a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java +++ b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java @@ -54,7 +54,7 @@ public class JetWingpack extends ArmorLogicSuite implements IItemHUDProvider { public static final int TANK_CAPACITY = 32000; public static final Function COMBUSTION_FUEL_BURN_TIME = fluidStack -> { - Recipe recipe = RecipeMaps.COMBUSTION_GENERATOR_FUELS.findRecipe( + Recipe recipe = RecipeMaps.GAS_TURBINE_FUELS.findRecipe( Integer.MAX_VALUE, Collections.emptyList(), Collections.singletonList(fluidStack)); From daa2d6a02c61f281a3f18ad000186ae71ea07f8a Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Mon, 9 Dec 2024 15:29:06 +0800 Subject: [PATCH 14/19] fix: annotate getModel method as client-only --- src/main/java/supersymmetry/common/item/armor/JetWingpack.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java index 1c62f2332..eac88401b 100644 --- a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java +++ b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java @@ -169,6 +169,7 @@ public void addToolComponents(ArmorMetaItem.ArmorMetaValueItem mvi) { mvi.addComponents(new JetWingpackBehaviour(TANK_CAPACITY)); } + @SideOnly(Side.CLIENT) @Override public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, EntityEquipmentSlot armorSlot, ModelBiped defaultModel) { From 9bda95cf3ae4cf40227b0c48eb00989bd70648d3 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Mon, 9 Dec 2024 20:50:45 +0800 Subject: [PATCH 15/19] fix: use a separate recipemap for it --- .../api/recipes/SuSyRecipeMaps.java | 7 ++++ .../common/item/armor/JetWingpack.java | 40 ++++++++++++------- .../resources/assets/susy/lang/en_us.lang | 1 + 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/main/java/supersymmetry/api/recipes/SuSyRecipeMaps.java b/src/main/java/supersymmetry/api/recipes/SuSyRecipeMaps.java index 1d7dd2f91..65126c386 100644 --- a/src/main/java/supersymmetry/api/recipes/SuSyRecipeMaps.java +++ b/src/main/java/supersymmetry/api/recipes/SuSyRecipeMaps.java @@ -331,6 +331,13 @@ public class SuSyRecipeMaps { .setSlotOverlay(true, false, GuiTextures.FURNACE_OVERLAY_2) .setSound(GTSoundEvents.FURNACE); + + public static final RecipeMap JET_WINGPACK_FUELS = new RecipeMap<>("jet_wingpack_fuels", 0, 0, 1, 0, new NoEnergyRecipeBuilder(), false) + .setSlotOverlay(false, false, GuiTextures.DARK_CANISTER_OVERLAY) + .setProgressBar(GuiTextures.PROGRESS_BAR_GAS_COLLECTOR, ProgressWidget.MoveType.HORIZONTAL) + .setSound(GTSoundEvents.TURBINE) + .allowEmptyOutput(); + public static void init(){ RecipeMaps.SIFTER_RECIPES.setMaxFluidInputs(1); RecipeMaps.SIFTER_RECIPES.setMaxFluidOutputs(1); diff --git a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java index eac88401b..35a406cde 100644 --- a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java +++ b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java @@ -8,8 +8,7 @@ import gregtech.api.items.armor.ArmorUtils; import gregtech.api.items.metaitem.stats.*; import gregtech.api.recipes.Recipe; -import gregtech.api.recipes.RecipeMaps; -import gregtech.api.unification.material.Materials; +import gregtech.api.recipes.ingredients.GTRecipeInput; import gregtech.api.util.GTUtility; import gregtech.api.util.GradientUtil; import gregtech.api.util.input.KeyBind; @@ -29,6 +28,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandlerItem; @@ -40,6 +40,7 @@ import org.jetbrains.annotations.Nullable; import supersymmetry.api.capability.IElytraFlyingProvider; import supersymmetry.api.capability.SuSyCapabilities; +import supersymmetry.api.recipes.SuSyRecipeMaps; import supersymmetry.api.util.ElytraFlyingUtils; import supersymmetry.client.renderer.handler.JetWingpackModel; @@ -47,15 +48,16 @@ import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.function.Function; public class JetWingpack extends ArmorLogicSuite implements IItemHUDProvider { public static final int TANK_CAPACITY = 32000; - public static final Function COMBUSTION_FUEL_BURN_TIME = fluidStack -> { - Recipe recipe = RecipeMaps.GAS_TURBINE_FUELS.findRecipe( - Integer.MAX_VALUE, + public static final Function FUEL_BURN_TIME = fluidStack -> { + Recipe recipe = SuSyRecipeMaps.JET_WINGPACK_FUELS.findRecipe( + GTValues.V[GTValues.MV], Collections.emptyList(), Collections.singletonList(fluidStack)); return recipe != null ? recipe.getDuration() : 0; @@ -197,7 +199,7 @@ protected boolean drainFuel(@NotNull ItemStack stack, int amount, boolean simula FluidStack fuelStack = fluidHandler.drain(amount, false); if (fuelStack == null) return false; - int burnTime = COMBUSTION_FUEL_BURN_TIME.apply(fuelStack); + int burnTime = FUEL_BURN_TIME.apply(fuelStack); if (burnTime <= 0) return false; if (!simulate) { @@ -245,12 +247,11 @@ public ICapabilityProvider createProvider(ItemStack itemStack) { // Yeah, this is a bit bloat... public class JetWingpackBehaviour implements IItemDurabilityManager, IItemCapabilityProvider, IItemBehaviour, ISubItemHandler { - private static final IFilter JETPACK_FUEL_FILTER = new IFilter<>() { + private static final IFilter JET_WINGPACK_FUEL_FILTER = new IFilter<>() { @Override public boolean test(@NotNull FluidStack fluidStack) { - return RecipeMaps.COMBUSTION_GENERATOR_FUELS.find(Collections.emptyList(), - Collections.singletonList(fluidStack), (Objects::nonNull)) != null; + return FUEL_BURN_TIME.apply(fluidStack) > 0; } @Override @@ -285,7 +286,7 @@ public Pair getDurabilityColorsForDisplay(ItemStack itemStack) { @Override public ICapabilityProvider createProvider(ItemStack itemStack) { return new GTFluidHandlerItemStack(itemStack, maxCapacity) - .setFilter(JETPACK_FUEL_FILTER); + .setFilter(JET_WINGPACK_FUEL_FILTER); } @Override @@ -313,11 +314,22 @@ public String getItemSubType(ItemStack itemStack) { @Override public void getSubItems(ItemStack itemStack, CreativeTabs creativeTab, NonNullList subItems) { ItemStack copy = itemStack.copy(); - IFluidHandlerItem fluidHandlerItem = copy - .getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + IFluidHandlerItem fluidHandlerItem = copy.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); if (fluidHandlerItem != null) { - fluidHandlerItem.fill(Materials.Diesel.getFluid(TANK_CAPACITY), true); - subItems.add(copy); + Optional firstRecipe = SuSyRecipeMaps.JET_WINGPACK_FUELS.getRecipeList().stream().findFirst(); + firstRecipe.ifPresent(recipe -> { + Optional inputFluidStack = recipe.getFluidInputs().stream() + .map(GTRecipeInput::getInputFluidStack) + .filter(Objects::nonNull) + .findFirst(); + inputFluidStack.ifPresent(stack -> { + Fluid fluid = stack.getFluid(); + if (fluid != null && stack.amount > 0) { + fluidHandlerItem.fill(new FluidStack(fluid, maxCapacity), true); + subItems.add(copy); + } + }); + }); } else { subItems.add(itemStack); } diff --git a/src/main/resources/assets/susy/lang/en_us.lang b/src/main/resources/assets/susy/lang/en_us.lang index ae4bd716d..8ff8ea49f 100644 --- a/src/main/resources/assets/susy/lang/en_us.lang +++ b/src/main/resources/assets/susy/lang/en_us.lang @@ -722,6 +722,7 @@ recipemap.large_steam_turbine.name=Large Steam Turbine recipemap.primitive_smelter.name=Primitive Smelting recipemap.large_fluid_pump.name=Large Fluid Pump recipemap.sieve_distillation.name=Fractional Distillation +recipemap.jet_wingpack_fuels.name=Jet Wingpack Fuels gregtech.multiblock.primitive_mud_pump.description=The Primitive Mud Pump is a Steam Era multiblock that collects mud once per second, but only if it is in a river biome, and when the controller is between Y = 64 and Y = 80 (Inclusive). It can use a Pump, ULV, or LV Output Hatch. gregtech.multiblock.ocean_pumper.description=The Ocean Pumper is an electrically powered multiblock that collects a base amount of 8,000 L Seawater per second (at MV), but only if it is in an ocean biome, and when the controller is between Y = 70 and Y = 75 (Inclusive). It needs an output hatch, a maintenance hatch, and an energy input hatch. From 144bc83ca7bc62e68e63f3692347fed207da09d0 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Wed, 11 Dec 2024 11:53:58 +0800 Subject: [PATCH 16/19] fix: beru's reviews except for the sound issue --- .../common/item/armor/JetWingpack.java | 53 +++++++++++++------ .../resources/assets/susy/lang/en_us.lang | 1 + 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java index 35a406cde..5065494ce 100644 --- a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java +++ b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java @@ -26,6 +26,7 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; +import net.minecraftforge.common.ISpecialArmor; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.fluids.Fluid; @@ -54,8 +55,17 @@ public class JetWingpack extends ArmorLogicSuite implements IItemHUDProvider { - public static final int TANK_CAPACITY = 32000; - public static final Function FUEL_BURN_TIME = fluidStack -> { + protected static final int TANK_CAPACITY = 32000; + + protected static final int MAX_SPEED = 2; + protected static final double MIN_SPEED = 0.02; + protected static final double THRUST = 0.05D; + protected static final double REVERSE_THRUST = 0.05D; + protected static final double FALLING = 0.005D; + + protected static final ISpecialArmor.ArmorProperties DEFAULT_PROPERTIES = new ISpecialArmor.ArmorProperties(Integer.MIN_VALUE, -2, Integer.MAX_VALUE); + + protected static final Function FUEL_BURN_TIME = fluidStack -> { Recipe recipe = SuSyRecipeMaps.JET_WINGPACK_FUELS.findRecipe( GTValues.V[GTValues.MV], Collections.emptyList(), @@ -124,15 +134,17 @@ public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) { } if (engineActive && player.isElytraFlying() && drainFuel(itemStack, getEnergyPerUse(), true)) { - Vec3d vec3d = player.getLookVec(); + Vec3d lookVec = player.getLookVec(); if (KeyBind.VANILLA_SNEAK.isKeyDown(player)) { - player.motionX += vec3d.x * 0.001D - 0.05D * player.motionX; - player.motionY += -0.005D - 0.05D * player.motionY; - player.motionZ += vec3d.z * 0.001D - 0.05D * player.motionZ; + // handles braking + player.motionX -= REVERSE_THRUST * (player.motionX - MIN_SPEED * lookVec.x); // v(t+1) = v(t) - THRUST * (v(t) - MIN_SPEED) + player.motionY -= REVERSE_THRUST * player.motionY + FALLING; // so that you won't fly upwards when braking + player.motionZ -= REVERSE_THRUST * (player.motionZ - MIN_SPEED * lookVec.z); } else { - player.motionX += 0.05D * (2 * vec3d.x - player.motionX); - player.motionY += 0.05D * (2 * vec3d.y - player.motionY); - player.motionZ += 0.05D * (2 * vec3d.z - player.motionZ); + // handles acceleration + player.motionX += THRUST * (MAX_SPEED * lookVec.x - player.motionX); // v(t+1) = v(t) + THRUST * (MAX_SPEED - v(t)) + player.motionY += THRUST * (MAX_SPEED * lookVec.y - player.motionY); // or dv/dt = THRUST * (MAX_SPEED - v) + player.motionZ += THRUST * (MAX_SPEED * lookVec.z - player.motionZ); world.spawnParticle(EnumParticleTypes.CLOUD, player.posX, player.posY, player.posZ, 0.0, 0.0, 0.0); } drainFuel(itemStack, getEnergyPerUse(), false); @@ -167,7 +179,7 @@ public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) { @Override public void addToolComponents(ArmorMetaItem.ArmorMetaValueItem mvi) { - mvi.addComponents(new TestElytraFlyingProvider()); + mvi.addComponents(new ElytraFlyingProvider()); mvi.addComponents(new JetWingpackBehaviour(TANK_CAPACITY)); } @@ -180,7 +192,19 @@ public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemSta @Override public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) { - return "susy:textures/armor/jet_wingpack.png"; // actually useless + return "susy:textures/armor/jet_wingpack.png"; + } + + @Override + public boolean handleUnblockableDamage(EntityLivingBase entity, @NotNull ItemStack armor, DamageSource source, + double damage, EntityEquipmentSlot equipmentSlot) { + return (source == DamageSource.FLY_INTO_WALL && entity.isElytraFlying()); + } + + @Override + public ISpecialArmor.ArmorProperties getProperties(EntityLivingBase entity, @NotNull ItemStack armor, DamageSource source, double damage, EntityEquipmentSlot slot) { + // triple the amount of kinetic damages :trollface: + return source == DamageSource.FLY_INTO_WALL ? DEFAULT_PROPERTIES : super.getProperties(entity, armor, source, damage, slot); } protected boolean drainFuel(@NotNull ItemStack stack, int amount, boolean simulate) { @@ -213,7 +237,7 @@ private IFluidHandlerItem getFluidHandler(ItemStack stack) { return stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); } - private static class TestElytraFlyingProvider implements IItemComponent, IElytraFlyingProvider, ICapabilityProvider, IItemCapabilityProvider { + private static class ElytraFlyingProvider implements IItemComponent, IElytraFlyingProvider, ICapabilityProvider, IItemCapabilityProvider { @Override public boolean isElytraFlying(@NotNull EntityLivingBase entity, @NotNull ItemStack itemStack, boolean shouldStop) { @@ -244,7 +268,6 @@ public ICapabilityProvider createProvider(ItemStack itemStack) { } } - // Yeah, this is a bit bloat... public class JetWingpackBehaviour implements IItemDurabilityManager, IItemCapabilityProvider, IItemBehaviour, ISubItemHandler { private static final IFilter JET_WINGPACK_FUEL_FILTER = new IFilter<>() { @@ -259,6 +282,7 @@ public int getPriority() { return IFilter.whitelistLikePriority(); } }; + public final int maxCapacity; private final Pair durabilityBarColors; @@ -330,9 +354,8 @@ public void getSubItems(ItemStack itemStack, CreativeTabs creativeTab, NonNullLi } }); }); - } else { - subItems.add(itemStack); } + subItems.add(itemStack); } } } diff --git a/src/main/resources/assets/susy/lang/en_us.lang b/src/main/resources/assets/susy/lang/en_us.lang index 8ff8ea49f..7ba59e461 100644 --- a/src/main/resources/assets/susy/lang/en_us.lang +++ b/src/main/resources/assets/susy/lang/en_us.lang @@ -827,6 +827,7 @@ metaitem.standard_catalyst_bed_cracking.name=Cracking Catalyst Bed # Armors metaitem.jet_wingpack.name=Jet Wingpack +metaitem.jet_wingpack.tooltip=Hold shift to brake when engine activated metaarmor.hud.engine_status=Engine: %s metaarmor.jet_wingpack.engine_active=Jet Wingpack: Engine Activated metaarmor.jet_wingpack.engine_inactive=Jet Wingpack: Engine Deactivated From 290e5db8b56b4728498e7c6ba230534c4a137478 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Sun, 15 Dec 2024 13:12:15 +0800 Subject: [PATCH 17/19] feat: engine sound --- .../supersymmetry/api/sound/SusySounds.java | 2 + .../api/util/ElytraFlyingUtils.java | 3 +- .../client/audio/MovingSoundJetEngine.java | 46 ++++++++++++++++++ .../common/item/armor/JetWingpack.java | 23 +++++++++ src/main/resources/assets/susy/sounds.json | 9 ++++ .../assets/susy/sounds/jet_engine_active.ogg | Bin 0 -> 221852 bytes 6 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 src/main/java/supersymmetry/client/audio/MovingSoundJetEngine.java create mode 100644 src/main/resources/assets/susy/sounds/jet_engine_active.ogg diff --git a/src/main/java/supersymmetry/api/sound/SusySounds.java b/src/main/java/supersymmetry/api/sound/SusySounds.java index f63e9f5be..f8fc14b25 100644 --- a/src/main/java/supersymmetry/api/sound/SusySounds.java +++ b/src/main/java/supersymmetry/api/sound/SusySounds.java @@ -9,10 +9,12 @@ public class SusySounds { public static SoundEvent ROCKET_LOOP; public static SoundEvent DRONE_TAKEOFF; + public static SoundEvent JET_ENGINE_LOOP; public static void registerSounds() { ROCKET_LOOP = registerSound("entity.rocket_loop"); DRONE_TAKEOFF = registerSound("entity.drone_takeoff"); + JET_ENGINE_LOOP = registerSound("item.jet_wingpack_engine_active"); } private static SoundEvent registerSound(String soundNameIn) { diff --git a/src/main/java/supersymmetry/api/util/ElytraFlyingUtils.java b/src/main/java/supersymmetry/api/util/ElytraFlyingUtils.java index 93adf3711..a993be00a 100644 --- a/src/main/java/supersymmetry/api/util/ElytraFlyingUtils.java +++ b/src/main/java/supersymmetry/api/util/ElytraFlyingUtils.java @@ -4,7 +4,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.util.math.AxisAlignedBB; @@ -29,7 +28,7 @@ public static boolean isElytraFlying(@NotNull EntityLivingBase entity) { return false; } - public static boolean canTakeOff(EntityPlayerMP player, boolean ignoreOnGround) { + public static boolean canTakeOff(EntityPlayer player, boolean ignoreOnGround) { return (ignoreOnGround || (!player.onGround && player.motionY < 0.0D)) && !player.isElytraFlying() && !player.isInWater() && !isInLavaSafe(player); } diff --git a/src/main/java/supersymmetry/client/audio/MovingSoundJetEngine.java b/src/main/java/supersymmetry/client/audio/MovingSoundJetEngine.java new file mode 100644 index 000000000..adb0805ad --- /dev/null +++ b/src/main/java/supersymmetry/client/audio/MovingSoundJetEngine.java @@ -0,0 +1,46 @@ +package supersymmetry.client.audio; + +import net.minecraft.client.audio.MovingSound; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.SoundCategory; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import supersymmetry.api.sound.SusySounds; + +@SideOnly(Side.CLIENT) +public class MovingSoundJetEngine extends MovingSound { + + private static final float MAX_VOLUME = 1.0F; + private final EntityPlayer player; + + public MovingSoundJetEngine(EntityPlayer player) { + super(SusySounds.JET_ENGINE_LOOP, SoundCategory.PLAYERS); + this.player = player; + this.repeat = true; + this.repeatDelay = 0; + this.volume = MAX_VOLUME; + } + + public void startPlaying() { + this.volume = MAX_VOLUME; + } + + public void stopPlaying() { + this.volume = 0.0F; + } + + public boolean isPlaying() { + return volume > 0.0F; + } + + @Override + public void update() { + if (this.player.isDead) { + this.donePlaying = true; + } else { + this.xPosF = (float) (player.posX + player.motionX); + this.yPosF = (float) (player.posY + player.motionY); + this.zPosF = (float) (player.posZ + player.motionZ); + } + } +} diff --git a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java index 5065494ce..b5f11ec7d 100644 --- a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java +++ b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java @@ -12,6 +12,7 @@ import gregtech.api.util.GTUtility; import gregtech.api.util.GradientUtil; import gregtech.api.util.input.KeyBind; +import net.minecraft.client.Minecraft; import net.minecraft.client.model.ModelBiped; import net.minecraft.client.resources.I18n; import net.minecraft.creativetab.CreativeTabs; @@ -43,6 +44,7 @@ import supersymmetry.api.capability.SuSyCapabilities; import supersymmetry.api.recipes.SuSyRecipeMaps; import supersymmetry.api.util.ElytraFlyingUtils; +import supersymmetry.client.audio.MovingSoundJetEngine; import supersymmetry.client.renderer.handler.JetWingpackModel; import java.awt.*; @@ -76,6 +78,9 @@ public class JetWingpack extends ArmorLogicSuite implements IItemHUDProvider { @SideOnly(Side.CLIENT) private ArmorUtils.ModularHUD HUD; + @SideOnly(Side.CLIENT) + protected MovingSoundJetEngine jetEngineSound; + protected JetWingpack() { super(1, TANK_CAPACITY, GTValues.EV, EntityEquipmentSlot.CHEST); if (ArmorUtils.SIDE.isClient()) { @@ -133,6 +138,10 @@ public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) { } } + if (world.isRemote) { + handleSounds(player, engineActive); + } + if (engineActive && player.isElytraFlying() && drainFuel(itemStack, getEnergyPerUse(), true)) { Vec3d lookVec = player.getLookVec(); if (KeyBind.VANILLA_SNEAK.isKeyDown(player)) { @@ -177,6 +186,20 @@ public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) { player.inventoryContainer.detectAndSendChanges(); } + // I hate this... + @SideOnly(Side.CLIENT) + public void handleSounds(EntityPlayer player, boolean engineActive) { + if (this.jetEngineSound == null) { + this.jetEngineSound = new MovingSoundJetEngine(player); + Minecraft.getMinecraft().getSoundHandler().playSound(jetEngineSound); + } + if (engineActive && !jetEngineSound.isPlaying()) { + jetEngineSound.startPlaying(); + } else if (!engineActive && jetEngineSound.isPlaying()) { + jetEngineSound.stopPlaying(); + } + } + @Override public void addToolComponents(ArmorMetaItem.ArmorMetaValueItem mvi) { mvi.addComponents(new ElytraFlyingProvider()); diff --git a/src/main/resources/assets/susy/sounds.json b/src/main/resources/assets/susy/sounds.json index b5ece9d47..b0c26f263 100644 --- a/src/main/resources/assets/susy/sounds.json +++ b/src/main/resources/assets/susy/sounds.json @@ -16,5 +16,14 @@ "stream": true } ] + }, + "item.jet_wingpack_engine_active" : { + "category" : "player", + "sounds" : [ + { + "name" : "susy:jet_engine_active", + "stream" : true + } + ] } } diff --git a/src/main/resources/assets/susy/sounds/jet_engine_active.ogg b/src/main/resources/assets/susy/sounds/jet_engine_active.ogg new file mode 100644 index 0000000000000000000000000000000000000000..18c4835254627a4e93d5f840db08b6c7ce310314 GIT binary patch literal 221852 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

-yHECGbqR7VvRAiStOSYg;#4O|K5tR!84f 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 fj Date: Sun, 15 Dec 2024 11:54:07 -0600 Subject: [PATCH 18/19] feat: a little smoothing --- .../client/audio/MovingSoundJetEngine.java | 20 +++++++++++++++++-- .../common/item/armor/JetWingpack.java | 3 +++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/supersymmetry/client/audio/MovingSoundJetEngine.java b/src/main/java/supersymmetry/client/audio/MovingSoundJetEngine.java index adb0805ad..02dc7db01 100644 --- a/src/main/java/supersymmetry/client/audio/MovingSoundJetEngine.java +++ b/src/main/java/supersymmetry/client/audio/MovingSoundJetEngine.java @@ -11,7 +11,9 @@ public class MovingSoundJetEngine extends MovingSound { private static final float MAX_VOLUME = 1.0F; + private boolean isThrottled = false; private final EntityPlayer player; + private float baseVolume = 0.0F; public MovingSoundJetEngine(EntityPlayer player) { super(SusySounds.JET_ENGINE_LOOP, SoundCategory.PLAYERS); @@ -22,11 +24,19 @@ public MovingSoundJetEngine(EntityPlayer player) { } public void startPlaying() { - this.volume = MAX_VOLUME; + this.baseVolume = MAX_VOLUME; } public void stopPlaying() { - this.volume = 0.0F; + this.baseVolume = 0; + } + + public boolean isThrottled() { + return this.isThrottled; + } + + public void setThrottled(boolean isThrottled) { + this.isThrottled = isThrottled; } public boolean isPlaying() { @@ -42,5 +52,11 @@ public void update() { this.yPosF = (float) (player.posY + player.motionY); this.zPosF = (float) (player.posZ + player.motionZ); } + float throttleMultiplier = isThrottled ? 0.2F : 1; + if (volume < baseVolume * throttleMultiplier) { + volume += 0.05F; + } else { + volume -= 0.02F; + } } } diff --git a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java index b5f11ec7d..7d5497cba 100644 --- a/src/main/java/supersymmetry/common/item/armor/JetWingpack.java +++ b/src/main/java/supersymmetry/common/item/armor/JetWingpack.java @@ -198,6 +198,9 @@ public void handleSounds(EntityPlayer player, boolean engineActive) { } else if (!engineActive && jetEngineSound.isPlaying()) { jetEngineSound.stopPlaying(); } + if (jetEngineSound.isThrottled() != KeyBind.VANILLA_SNEAK.isKeyDown(player)) { + jetEngineSound.setThrottled(KeyBind.VANILLA_SNEAK.isKeyDown(player)); + } } @Override From 7ab4924023b744729581fedef4a085d05b2011a3 Mon Sep 17 00:00:00 2001 From: planetme Date: Sun, 15 Dec 2024 14:31:42 -0500 Subject: [PATCH 19/19] add 1 item output to vac chamber --- src/main/java/supersymmetry/api/recipes/SuSyRecipeMaps.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/supersymmetry/api/recipes/SuSyRecipeMaps.java b/src/main/java/supersymmetry/api/recipes/SuSyRecipeMaps.java index 1d7dd2f91..90aa40d5d 100644 --- a/src/main/java/supersymmetry/api/recipes/SuSyRecipeMaps.java +++ b/src/main/java/supersymmetry/api/recipes/SuSyRecipeMaps.java @@ -39,7 +39,7 @@ public class SuSyRecipeMaps { public static final RecipeMap ROASTER_RECIPES = new RecipeMap<>("roaster", 3, 2, 2, 3, new CatalystRecipeBuilder(), false) .setSound(GTSoundEvents.COMBUSTION); - public static final RecipeMap VACUUM_CHAMBER = new RecipeMap<>("vacuum_chamber", 4, 1, 2, 2, new SimpleRecipeBuilder(), false) + public static final RecipeMap VACUUM_CHAMBER = new RecipeMap<>("vacuum_chamber", 4, 2, 2, 2, new SimpleRecipeBuilder(), false) .setProgressBar(GuiTextures.PROGRESS_BAR_COMPRESS, ProgressWidget.MoveType.HORIZONTAL) .setSound(GTSoundEvents.CENTRIFUGE);