Skip to content

Commit b8e8cee

Browse files
committed
- Add MEPatternProvider Single Cache.
- MEPatternProvider network bandwidth improvements. - Break block MEPatternProvider will drop item with nbt.
1 parent 73a446e commit b8e8cee

File tree

22 files changed

+724
-91
lines changed

22 files changed

+724
-91
lines changed

src/main/java/github/kasuminova/mmce/client/gui/GuiMEPatternProvider.java

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package github.kasuminova.mmce.client.gui;
22

3+
import appeng.client.gui.widgets.GuiCustomSlot;
4+
import appeng.fluids.client.gui.widgets.GuiFluidTank;
5+
import github.kasuminova.mmce.client.gui.slot.GuiFullCapFluidTank;
6+
import github.kasuminova.mmce.client.gui.widget.Button;
37
import github.kasuminova.mmce.client.gui.widget.Button4State;
48
import github.kasuminova.mmce.client.gui.widget.Button5State;
59
import github.kasuminova.mmce.client.gui.widget.MultiLineLabel;
@@ -12,11 +16,16 @@
1216
import github.kasuminova.mmce.common.tile.MEPatternProvider;
1317
import github.kasuminova.mmce.common.util.InfItemFluidHandler;
1418
import hellfirepvp.modularmachinery.ModularMachinery;
19+
import hellfirepvp.modularmachinery.common.base.Mods;
1520
import net.minecraft.client.renderer.GlStateManager;
1621
import net.minecraft.client.resources.I18n;
1722
import net.minecraft.entity.player.EntityPlayer;
23+
import net.minecraft.item.ItemStack;
1824
import net.minecraft.util.ResourceLocation;
25+
import net.minecraftforge.fluids.FluidStack;
26+
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
1927

28+
import java.io.IOException;
2029
import java.util.ArrayList;
2130
import java.util.Collections;
2231
import java.util.List;
@@ -60,10 +69,16 @@ public GuiMEPatternProvider(final MEPatternProvider owner, final EntityPlayer pl
6069
.setMargin(0)
6170
.setAbsXY(7, 101)
6271
);
72+
this.widgetController.addWidget(
73+
new MultiLineLabel(Collections.singletonList(I18n.format("gui.mepatternprovider.single_inv")))
74+
.setAutoWrap(false)
75+
.setMargin(0)
76+
.setAbsXY(180, 158)
77+
);
6378

6479
// Init StackList...
6580
stackList.setMaxStackPerRow(3);
66-
stackList.setWidthHeight(69, 162);
81+
stackList.setWidthHeight(69, 126);
6782
stackList.setAbsXY(180, 27);
6883

6984
// Init ReturnItems...
@@ -109,24 +124,72 @@ public GuiMEPatternProvider(final MEPatternProvider owner, final EntityPlayer pl
109124
})
110125
.setWidthHeight(16, 16);
111126

127+
// Init Single Inv Tip Button...
128+
Button singleInvTip = new Button();
129+
singleInvTip
130+
.setTextureLocation(GuiMEPatternProvider.GUI_TEXTURE)
131+
.setTextureXY(230, 214)
132+
.setHoveredTextureXY(230 + 11, 214)
133+
.setTooltipFunction((btn) -> {
134+
List<String> tooltips = new ArrayList<>();
135+
tooltips.add(I18n.format("gui.mepatternprovider.single_inv.desc"));
136+
return tooltips;
137+
})
138+
.setWidthHeight(9, 11)
139+
.setAbsXY(240, 157);
140+
112141
// Init Widget Containers...
113-
Row buttons = new Row();
114-
buttons.addWidgets(returnItems.setMarginRight(2), toggleBlockingMode).setAbsXY(215, 7);
142+
Row stackListButtons = new Row();
143+
stackListButtons.addWidgets(returnItems.setMarginRight(2), toggleBlockingMode).setAbsXY(215, 7);
115144

116145
this.widgetController.addWidget(stackList);
117-
this.widgetController.addWidget(buttons);
146+
this.widgetController.addWidget(stackListButtons);
147+
this.widgetController.addWidget(singleInvTip);
118148

119149
// Update state...
120150
updateGUIState();
121151
}
122152

153+
@Override
154+
public void initGui() {
155+
super.initGui();
156+
157+
final GuiFullCapFluidTank guiTank = new GuiFullCapFluidTank(owner.getSubFluidHandler(),
158+
0, 0, 232, 172, 16, 16
159+
);
160+
161+
// AE2 Unofficial Extended Life Check
162+
if (Mods.AE2EL.isPresent()) {
163+
this.guiSlots.add(guiTank);
164+
} else {
165+
// Default AE2
166+
ObfuscationReflectionHelper.setPrivateValue(GuiCustomSlot.class, guiTank, getGuiLeft(), "x");
167+
ObfuscationReflectionHelper.setPrivateValue(GuiCustomSlot.class, guiTank, getGuiTop(), "y");
168+
List<Object> buttonList = (List) this.buttonList;
169+
buttonList.add(guiTank);
170+
}
171+
}
172+
173+
@Override
174+
protected void mouseClicked(int xCoord, int yCoord, int btn) throws IOException {
175+
for (GuiCustomSlot slot : this.guiSlots) {
176+
if (slot instanceof GuiFluidTank) {
177+
if (this.isPointInRegion(slot.xPos(), slot.yPos(), slot.getWidth(), slot.getHeight(), xCoord, yCoord) && slot.canClick(this.mc.player)) {
178+
slot.slotClicked(this.mc.player.inventory.getItemStack(), btn);
179+
return;
180+
}
181+
}
182+
}
183+
super.mouseClicked(xCoord, yCoord, btn);
184+
}
185+
123186
@Override
124187
public void drawBG(final int offsetX, final int offsetY, final int mouseX, final int mouseY) {
125188
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
126189
this.mc.getTextureManager().bindTexture(GUI_TEXTURE);
127190
this.drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);
128191
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
129-
192+
130193
super.drawBG(offsetX, offsetY, mouseX, mouseY);
131194
}
132195

@@ -140,4 +203,8 @@ public void updateGUIState() {
140203
toggleBlockingMode.setClicked(owner.isBlockingMode());
141204
}
142205

206+
public void setStackList(final List<ItemStack> itemStackList, final List<FluidStack> fluidStackList) {
207+
stackList.setStackList(itemStackList, fluidStackList);
208+
}
209+
143210
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package github.kasuminova.mmce.client.gui.slot;
2+
3+
import appeng.api.storage.data.IAEFluidStack;
4+
import appeng.fluids.client.gui.widgets.GuiFluidTank;
5+
import appeng.fluids.util.IAEFluidTank;
6+
import net.minecraft.client.Minecraft;
7+
import net.minecraft.client.renderer.GlStateManager;
8+
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
9+
import net.minecraft.client.renderer.texture.TextureMap;
10+
11+
public class GuiFullCapFluidTank extends GuiFluidTank {
12+
13+
protected final IAEFluidTank tank;
14+
protected final int slot;
15+
16+
protected boolean darkened = false;
17+
18+
public GuiFullCapFluidTank(IAEFluidTank tank, int slot, int id, int x, int y, int w, int h) {
19+
super(tank, slot, id, x, y, w, h);
20+
this.tank = tank;
21+
this.slot = slot;
22+
}
23+
24+
public GuiFullCapFluidTank(IAEFluidTank tank, int slot, int id, int x, int y, int w, int h, boolean darkened) {
25+
this(tank, slot, id, x, y, w, h);
26+
this.darkened = darkened;
27+
}
28+
29+
@Override
30+
public void drawContent(Minecraft mc, int mouseX, int mouseY, float partialTicks) {
31+
final IAEFluidStack fs = this.getFluidStack();
32+
if (fs != null) {
33+
GlStateManager.disableBlend();
34+
GlStateManager.disableLighting();
35+
36+
//drawRect( this.x, this.y, this.x + this.width, this.y + this.height, AEColor.GRAY.blackVariant | 0xFF000000 );
37+
38+
final IAEFluidStack fluid = this.tank.getFluidInSlot(this.slot);
39+
if (fluid != null && fluid.getStackSize() > 0) {
40+
mc.getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
41+
42+
float red = (fluid.getFluid().getColor() >> 16 & 255) / 255.0F;
43+
float green = (fluid.getFluid().getColor() >> 8 & 255) / 255.0F;
44+
float blue = (fluid.getFluid().getColor() & 255) / 255.0F;
45+
if (darkened) {
46+
red = red * 0.4F;
47+
green = green * 0.4F;
48+
blue = blue * 0.4F;
49+
}
50+
GlStateManager.color(red, green, blue);
51+
52+
TextureAtlasSprite sprite = mc.getTextureMapBlocks().getAtlasSprite(fluid.getFluid().getStill().toString());
53+
int scaledHeight = getHeight();
54+
int iconHeightRemainder = scaledHeight % 16;
55+
if (iconHeightRemainder > 0) {
56+
this.drawTexturedModalRect(this.xPos(), this.yPos() + this.getHeight() - iconHeightRemainder, sprite, 16, iconHeightRemainder);
57+
}
58+
59+
for (int i = 0; i < scaledHeight / 16; i++) {
60+
this.drawTexturedModalRect(this.xPos(), this.yPos() + this.getHeight() - iconHeightRemainder - (i + 1) * 16, sprite, 16, 16);
61+
}
62+
}
63+
}
64+
}
65+
66+
}

src/main/java/github/kasuminova/mmce/client/gui/widget/impl/patternprovider/PatternProviderIngredientList.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class PatternProviderIngredientList extends IngredientList {
1818
public void initWidget(final WidgetGui gui) {
1919
super.initWidget(gui);
2020
scrollbar.setMargin(5, 1, 1, 1);
21-
scrollbar.setWidthHeight(9, 160);
21+
scrollbar.setWidthHeight(9, 124);
2222
scrollbar.getScroll()
2323
.setMouseDownTextureXY(198, 232)
2424
.setHoveredTextureXY(187, 232)

src/main/java/github/kasuminova/mmce/common/block/appeng/BlockMEPatternProvider.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
import github.kasuminova.mmce.common.tile.MEPatternProvider;
44
import hellfirepvp.modularmachinery.ModularMachinery;
55
import hellfirepvp.modularmachinery.common.CommonProxy;
6+
import hellfirepvp.modularmachinery.common.lib.ItemsMM;
67
import net.minecraft.block.state.IBlockState;
8+
import net.minecraft.entity.EntityLivingBase;
79
import net.minecraft.entity.player.EntityPlayer;
10+
import net.minecraft.item.ItemStack;
11+
import net.minecraft.nbt.NBTTagCompound;
812
import net.minecraft.tileentity.TileEntity;
913
import net.minecraft.util.EnumFacing;
1014
import net.minecraft.util.EnumHand;
@@ -38,4 +42,49 @@ public TileEntity createTileEntity(final World world, final IBlockState state) {
3842
return new MEPatternProvider();
3943
}
4044

45+
@Override
46+
public void dropBlockAsItemWithChance(@Nonnull final World worldIn, @Nonnull final BlockPos pos, @Nonnull final IBlockState state, final float chance, final int fortune) {
47+
}
48+
49+
@Override
50+
public void breakBlock(final World worldIn,
51+
@Nonnull final BlockPos pos,
52+
@Nonnull final IBlockState state)
53+
{
54+
TileEntity te = worldIn.getTileEntity(pos);
55+
56+
if (te == null) {
57+
super.dropBlockAsItemWithChance(worldIn, pos, state, 1.0F, 0);
58+
worldIn.removeTileEntity(pos);
59+
return;
60+
}
61+
if (!(te instanceof final MEPatternProvider provider) || provider.isAllDefault()) {
62+
super.dropBlockAsItemWithChance(worldIn, pos, state, 1.0F, 0);
63+
worldIn.removeTileEntity(pos);
64+
return;
65+
}
66+
67+
ItemStack dropped = new ItemStack(ItemsMM.mePatternProvider);
68+
dropped.setTagInfo("patternProvider", provider.writeProviderNBT(new NBTTagCompound()));
69+
70+
spawnAsEntity(worldIn, pos, dropped);
71+
worldIn.removeTileEntity(pos);
72+
}
73+
74+
@Override
75+
public void onBlockPlacedBy(@Nonnull final World worldIn,
76+
@Nonnull final BlockPos pos,
77+
@Nonnull final IBlockState state,
78+
@Nonnull final EntityLivingBase placer,
79+
@Nonnull final ItemStack stack)
80+
{
81+
super.onBlockPlacedBy(worldIn, pos, state, placer, stack);
82+
83+
TileEntity te = worldIn.getTileEntity(pos);
84+
NBTTagCompound tag = stack.getTagCompound();
85+
if (te instanceof final MEPatternProvider provider && tag != null && tag.hasKey("patternProvider")) {
86+
provider.readProviderNBT(tag.getCompoundTag("patternProvider"));
87+
}
88+
}
89+
4190
}

0 commit comments

Comments
 (0)