Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions src/main/java/gregtech/api/capability/IMufflerHatch.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
package gregtech.api.capability;

import net.minecraft.item.ItemStack;

import java.util.List;

public interface IMufflerHatch {

void recoverItemsTable(List<ItemStack> recoveryItems);

/**
* @return true if front face is free and contains only air blocks in 1x1 area
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -381,25 +381,6 @@ public boolean checkRecipe(@NotNull Recipe recipe) {
return false;
}

@Override
protected void completeRecipe() {
performMufflerOperations();
super.completeRecipe();
}

protected void performMufflerOperations() {
if (metaTileEntity instanceof MultiblockWithDisplayBase controller) {
// output muffler items
if (controller.hasMufflerMechanics()) {
if (parallelRecipesPerformed > 1) {
controller.outputRecoveryItems(parallelRecipesPerformed);
} else {
controller.outputRecoveryItems();
}
}
}
}

@Override
public long getMaxVoltage() {
IEnergyContainer energyContainer = getEnergyContainer();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -247,30 +247,22 @@ private void readMaintenanceData(IMaintenanceHatch hatch) {
}
}

/**
* Outputs the recovery items into the muffler hatch
*/
public void outputRecoveryItems() {
IMufflerHatch muffler = getAbilities(MultiblockAbility.MUFFLER_HATCH).get(0);
muffler.recoverItemsTable(recoveryItems);
}

public void outputRecoveryItems(int parallel) {
IMufflerHatch muffler = getAbilities(MultiblockAbility.MUFFLER_HATCH).get(0);
for (int i = 0; i < parallel; i++) {
muffler.recoverItemsTable(recoveryItems);
}
}

/**
* @return whether the muffler hatch's front face is free
*/
public boolean isMufflerFaceFree() {
if (hasMufflerMechanics() && getAbilities(MultiblockAbility.MUFFLER_HATCH).size() == 0)
if (!isStructureFormed()) {
return false;
}
if (!hasMufflerMechanics()) {
return false;
}

return isStructureFormed() && hasMufflerMechanics() &&
getAbilities(MultiblockAbility.MUFFLER_HATCH).get(0).isFrontFaceFree();
var mufflers = getAbilities(MultiblockAbility.MUFFLER_HATCH);
if (mufflers.isEmpty()) {
return false;
}
return mufflers.get(0).isFrontFaceFree();
}

@SideOnly(Side.CLIENT)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
package gregtech.common.metatileentities.multi.multiblockpart;

import gregtech.api.GTValues;
import gregtech.api.capability.IMufflerHatch;
import gregtech.api.items.itemhandlers.GTItemStackHandler;
import gregtech.api.metatileentity.ITieredMetaTileEntity;
import gregtech.api.metatileentity.MetaTileEntity;
import gregtech.api.metatileentity.interfaces.IGregTechTileEntity;
import gregtech.api.metatileentity.multiblock.*;
import gregtech.api.mui.GTGuis;
import gregtech.api.util.GTTransferUtils;
import gregtech.api.util.GTUtility;
import gregtech.client.particle.VanillaParticleEffects;
import gregtech.client.renderer.texture.Textures;
Expand All @@ -17,42 +13,25 @@
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.resources.I18n;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

import codechicken.lib.render.CCRenderState;
import codechicken.lib.render.pipeline.IVertexOperation;
import codechicken.lib.vec.Matrix4;
import com.cleanroommc.modularui.api.drawable.IKey;
import com.cleanroommc.modularui.api.widget.IWidget;
import com.cleanroommc.modularui.factory.PosGuiData;
import com.cleanroommc.modularui.screen.ModularPanel;
import com.cleanroommc.modularui.value.sync.PanelSyncManager;
import com.cleanroommc.modularui.value.sync.SyncHandlers;
import com.cleanroommc.modularui.widgets.ItemSlot;
import com.cleanroommc.modularui.widgets.SlotGroupWidget;
import com.cleanroommc.modularui.widgets.layout.Grid;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.List;

public class MetaTileEntityMufflerHatch extends MetaTileEntityMultiblockPart implements
IMultiblockAbilityPart<IMufflerHatch>, ITieredMetaTileEntity, IMufflerHatch {

private final int recoveryChance;
private final GTItemStackHandler inventory;

private boolean frontFaceFree;

public MetaTileEntityMufflerHatch(ResourceLocation metaTileEntityId, int tier) {
super(metaTileEntityId, tier);
this.recoveryChance = (int) Math.ceil((tier - 1.0f) / 8 * 100);
this.inventory = new GTItemStackHandler(this, (int) Math.pow(tier + 1, 2));
this.frontFaceFree = false;
}

@Override
Expand All @@ -63,49 +42,29 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) {
@Override
public void update() {
super.update();

if (!getWorld().isRemote) {
if (getOffsetTimer() % 10 == 0)
this.frontFaceFree = checkFrontFaceFree();
}

if (getWorld().isRemote && getController() instanceof MultiblockWithDisplayBase controller &&
controller.isActive()) {
VanillaParticleEffects.mufflerEffect(this, controller.getMufflerParticle());
}
}

@Override
public void clearMachineInventory(@NotNull List<@NotNull ItemStack> itemBuffer) {
clearInventory(itemBuffer, inventory);
}

public void recoverItemsTable(List<ItemStack> recoveryItems) {
for (ItemStack recoveryItem : recoveryItems) {
if (calculateChance()) {
GTTransferUtils.insertItem(inventory, recoveryItem.copy(), false);
if (getWorld().isRemote) {
if (getController() instanceof MultiblockWithDisplayBase controller && controller.isActive()) {
VanillaParticleEffects.mufflerEffect(this, controller.getMufflerParticle());
}
} else if (getOffsetTimer() % 10 == 0) {
this.frontFaceFree = checkFrontFaceFree();
}
}

private boolean calculateChance() {
return recoveryChance >= 100 || recoveryChance > GTValues.RNG.nextInt(100);
}

/**
* @return true if front face is free and contains only air blocks in 1x1 area
*/
@Override
public boolean isFrontFaceFree() {
return frontFaceFree;
}

private boolean checkFrontFaceFree() {
BlockPos frontPos = getPos().offset(getFrontFacing());
IBlockState blockState = getWorld().getBlockState(frontPos);
MultiblockWithDisplayBase controller = (MultiblockWithDisplayBase) getController();

// break a snow layer if it exists, and if this machine is running
if (controller != null && controller.isActive()) {
if (getController() instanceof MultiblockWithDisplayBase controller && controller.isActive()) {
if (GTUtility.tryBreakSnow(getWorld(), frontPos, blockState, true)) {
return true;
}
Expand All @@ -117,15 +76,15 @@ private boolean checkFrontFaceFree() {
@Override
public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) {
super.renderMetaTileEntity(renderState, translation, pipeline);
if (shouldRenderOverlay())
if (shouldRenderOverlay()) {
Textures.MUFFLER_OVERLAY.renderSided(getFrontFacing(), renderState, translation, pipeline);
}
}

@Override
public void addInformation(ItemStack stack, @Nullable World player, List<String> tooltip, boolean advanced) {
super.addInformation(stack, player, tooltip, advanced);
tooltip.add(I18n.format("gregtech.machine.muffler_hatch.tooltip1"));
tooltip.add(I18n.format("gregtech.muffler.recovery_tooltip", recoveryChance));
tooltip.add(I18n.format("gregtech.universal.enabled"));
tooltip.add(TooltipHelper.BLINKING_RED + I18n.format("gregtech.machine.muffler_hatch.tooltip2"));
}
Expand All @@ -148,50 +107,7 @@ public void registerAbilities(@NotNull AbilityInstances abilityInstances) {
}

@Override
public boolean usesMui2() {
return true;
}

@Override
public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) {
int rowSize = (int) Math.sqrt(this.inventory.getSlots());
int xOffset = rowSize == 10 ? 9 : 0;

guiSyncManager.registerSlotGroup("item_inv", rowSize);

List<List<IWidget>> widgets = new ArrayList<>();
for (int y = 0; y < rowSize; y++) {
widgets.add(new ArrayList<>());
for (int x = 0; x < rowSize; x++) {
int index = y * rowSize + x;
widgets.get(y).add(new ItemSlot().slot(SyncHandlers.itemSlot(this.inventory, index)
.slotGroup("item_inv")
.accessibility(false, true)));
}
}

// TODO: Change the position of the name when it's standardized.
return GTGuis.createPanel(this, 176 + xOffset * 2, 18 + 18 * rowSize + 94)
.child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5))
.child(SlotGroupWidget.playerInventory().left(7).bottom(7))
.child(new Grid()
.top(18).height(rowSize * 18)
.minElementMargin(0, 0)
.minColWidth(18).minRowHeight(18)
.alignX(0.5f)
.matrix(widgets));
}

@Override
public NBTTagCompound writeToNBT(NBTTagCompound data) {
super.writeToNBT(data);
data.setTag("RecoveryInventory", inventory.serializeNBT());
return data;
}

@Override
public void readFromNBT(NBTTagCompound data) {
super.readFromNBT(data);
this.inventory.deserializeNBT(data.getCompoundTag("RecoveryInventory"));
protected boolean openGUIOnRightClick() {
return false;
}
}
2 changes: 0 additions & 2 deletions src/main/resources/assets/gregtech/lang/en_us.lang
Original file line number Diff line number Diff line change
Expand Up @@ -5387,8 +5387,6 @@ gregtech.machine.muffler_hatch.uxv.name=UXV Muffler Hatch
gregtech.machine.muffler_hatch.opv.name=OpV Muffler Hatch
gregtech.machine.muffler_hatch.max.name=MAX Muffler Hatch

gregtech.muffler.recovery_tooltip=§bRecovery Chance: §f%d%%

gregtech.machine.pump_hatch.name=Pump Output Hatch
gregtech.machine.pump_hatch.tooltip=Primitive Fluid Output for Water Pump

Expand Down
Loading