more anvil work, RBMK irradiation channel IO

This commit is contained in:
Bob 2021-07-15 23:22:20 +02:00
parent a2049e5e7b
commit b1382eaac2
12 changed files with 301 additions and 73 deletions

View File

@ -17,7 +17,7 @@ public class RBMKOutgasser extends RBMKBase {
return new TileEntityRBMKOutgasser();
if(hasExtra(meta))
return new TileEntityProxyCombo(false, false, true);
return new TileEntityProxyCombo(true, false, true);
return null;
}

View File

@ -845,7 +845,7 @@ public class GUIHandler implements IGuiHandler {
case ModBlocks.guiID_anvil: {
if(world.getBlock(x, y, z) instanceof NTMAnvil) {
return new ContainerAnvil(player.inventory);
return new ContainerAnvil(player.inventory, ((NTMAnvil)world.getBlock(x, y, z)).tier);
}
return null;
}

View File

@ -82,7 +82,7 @@ public class AnvilRecipes {
constructionRecipes.add(new AnvilConstructionRecipe(
new OreDictStack("plateGold"),
new AnvilOutput(new ItemStack(ModItems.wire_gold, 8))
).setTier(1));
).setTierRange(1, 4));
}
public static List<AnvilSmithingRecipe> getSmithing() {
@ -151,7 +151,8 @@ public class AnvilRecipes {
public static class AnvilConstructionRecipe {
public List<AStack> input = new ArrayList();
public List<AnvilOutput> output = new ArrayList();
int tier = 0;
int tierLower = 0;
int tierUpper = -1;
OverlayType overlay = OverlayType.NONE;
public AnvilConstructionRecipe(AStack input, AnvilOutput output) {
@ -179,12 +180,21 @@ public class AnvilRecipes {
}
public AnvilConstructionRecipe setTier(int tier) {
this.tier = tier;
this.tierLower = tier;
return this;
}
public int getTier() {
return this.tier;
public AnvilConstructionRecipe setTierRange(int lower, int upper) {
this.tierLower = lower;
this.tierUpper = upper;
return this;
}
public boolean isTierValid(int tier) {
if(this.tierUpper == -1)
return tier >= this.tierLower;
return tier >= this.tierLower && tier <= this.tierUpper;
}
public AnvilConstructionRecipe setOverlay(OverlayType overlay) {

View File

@ -18,7 +18,10 @@ public class ContainerAnvil extends Container {
public InventoryBasic input = new InventoryBasic("Input", false, 8);
public IInventory output = new InventoryCraftResult();
public ContainerAnvil(InventoryPlayer inventory) {
public int tier; //because we can't trust these rascals with their packets
public ContainerAnvil(InventoryPlayer inventory, int tier) {
this.tier = tier;
this.addSlotToContainer(new SmithingSlot(input, 0, 17, 27));
this.addSlotToContainer(new SmithingSlot(input, 1, 53, 27));

View File

@ -3,6 +3,7 @@ package com.hbm.inventory.gui;
import java.util.ArrayList;
import java.util.List;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
import com.hbm.inventory.AnvilRecipes;
@ -13,13 +14,11 @@ import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.inventory.RecipesCommon.OreDictStack;
import com.hbm.inventory.container.ContainerAnvil;
import com.hbm.lib.RefStrings;
import com.hbm.packet.AuxButtonPacket;
import com.hbm.packet.PacketDispatcher;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.InventoryPlayer;
@ -34,34 +33,90 @@ public class GUIAnvil extends GuiContainer {
public static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_anvil.png");
private int tier;
private List<AnvilConstructionRecipe> originList = new ArrayList();
private List<AnvilConstructionRecipe> recipes = new ArrayList();
int index;
int size;
int selection;
private GuiTextField search;
public GUIAnvil(InventoryPlayer player, int tier) {
super(new ContainerAnvil(player));
super(new ContainerAnvil(player, tier));
this.tier = tier;
this.xSize = 176;
this.ySize = 222;
this.index = 0;
this.selection = -1;
guiLeft = (this.width - this.xSize) / 2;
guiTop = (this.height - this.ySize) / 2;
for(AnvilConstructionRecipe recipe : AnvilRecipes.getConstruction()) {
if(recipe.getTier() <= this.tier)
this.recipes.add(recipe);
if(recipe.isTierValid(this.tier))
this.originList.add(recipe);
}
this.size = (int)Math.ceil((this.recipes.size() - 10) / 2D);
regenerateRecipes();
guiLeft = (this.width - this.xSize) / 2;
guiTop = (this.height - this.ySize) / 2;
}
@Override
public void initGui() {
super.initGui();
Keyboard.enableRepeatEvents(true);
this.search = new GuiTextField(this.fontRendererObj, guiLeft + 10, guiTop + 111, 84, 12);
this.search.setTextColor(-1);
this.search.setDisabledTextColour(-1);
this.search.setEnableBackgroundDrawing(false);
this.search.setMaxStringLength(25);
}
private void regenerateRecipes() {
this.recipes.clear();
this.recipes.addAll(this.originList);
resetPaging();
}
private void search(String search) {
search = search.toLowerCase();
this.recipes.clear();
if(search.isEmpty()) {
this.recipes.addAll(this.originList);
} else {
for(AnvilConstructionRecipe recipe : this.originList) {
List<String> list = recipeToSearchList(recipe);
for(String s : list) {
if(s.contains(search)) {
this.recipes.add(recipe);
break;
}
}
}
}
resetPaging();
}
private void resetPaging() {
this.index = 0;
this.selection = -1;
this.size = Math.max(0, (int)Math.ceil((this.recipes.size() - 10) / 2D));
}
@Override
protected void mouseClicked(int x, int y, int k) {
super.mouseClicked(x, y, k);
this.search.mouseClicked(x, y, k);
if(guiLeft + 7 <= x && guiLeft + 7 + 9 > x && guiTop + 71 < y && guiTop + 71 + 36 >= y) {
mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
if(this.index > 0)
@ -85,6 +140,12 @@ public class GUIAnvil extends GuiContainer {
return;
}
if(guiLeft + 97 <= x && guiLeft + 97 + 18 > x && guiTop + 107 < y && guiTop + 107 + 18 >= y) {
mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
search(this.search.getText());
return;
}
for(int i = index * 2; i < index * 2 + 10; i++) {
if(i >= this.recipes.size())
@ -106,55 +167,24 @@ public class GUIAnvil extends GuiContainer {
}
}
}
@Override
protected void drawGuiContainerForegroundLayer(int mX, int mY) {
String name = I18n.format("container.anvil", tier);
this.fontRendererObj.drawString(name, 61 - this.fontRendererObj.getStringWidth(name) / 2, 8, 4210752);
this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752);
if(this.selection >= 0) {
int longest = 1;
List<String> list = new ArrayList();
AnvilConstructionRecipe recipe = recipes.get(this.selection);
List<String> list = recipeToList(recipe);
int longest = 0;
list.add(EnumChatFormatting.YELLOW + "Inputs:");
for(AStack stack : recipe.input) {
if(stack instanceof ComparableStack) {
ItemStack input = ((ComparableStack) stack).toStack();
String toAdd = ">" + input.stackSize + "x " + input.getDisplayName();
int len = this.fontRendererObj.getStringWidth(toAdd);
if(len > longest)
longest = len;
list.add(toAdd);
} else if(stack instanceof OreDictStack) {
OreDictStack input = (OreDictStack) stack;
ArrayList<ItemStack> ores = OreDictionary.getOres(input.name);
if(ores.size() > 0) {
ItemStack inStack = ores.get((int) (Math.abs(System.currentTimeMillis() / 1000) % ores.size()));
String toAdd = ">" + input.stacksize + "x " + inStack.getDisplayName();
int len = this.fontRendererObj.getStringWidth(toAdd);
if(len > longest)
longest = len;
list.add(toAdd);
} else {
list.add("I AM ERROR");
}
}
}
list.add("");
list.add(EnumChatFormatting.YELLOW + "Outputs:");
for(AnvilOutput stack : recipe.output) {
String toAdd = ">" + stack.stack.stackSize + "x " + stack.stack.getDisplayName() + (stack.chance != 1F ? (" (" + (stack.chance * 100) + "%)" ) : "");
int len = this.fontRendererObj.getStringWidth(toAdd);
if(len > longest)
longest = len;
list.add(toAdd);
for(String s : list) {
int length = this.fontRendererObj.getStringWidth(s);
if(length > longest)
longest = length;
}
double scale = 0.5D;
@ -173,27 +203,109 @@ public class GUIAnvil extends GuiContainer {
}
}
/**
* Generates the neat structured list for showing ingredients
* @param recipe
* @return
*/
public List<String> recipeToList(AnvilConstructionRecipe recipe) {
List<String> list = new ArrayList();
list.add(EnumChatFormatting.YELLOW + "Inputs:");
for(AStack stack : recipe.input) {
if(stack instanceof ComparableStack) {
ItemStack input = ((ComparableStack) stack).toStack();
list.add(">" + input.stackSize + "x " + input.getDisplayName());
} else if(stack instanceof OreDictStack) {
OreDictStack input = (OreDictStack) stack;
ArrayList<ItemStack> ores = OreDictionary.getOres(input.name);
if(ores.size() > 0) {
ItemStack inStack = ores.get((int) (Math.abs(System.currentTimeMillis() / 1000) % ores.size()));
list.add(">" + input.stacksize + "x " + inStack.getDisplayName());
} else {
list.add("I AM ERROR");
}
}
}
list.add("");
list.add(EnumChatFormatting.YELLOW + "Outputs:");
for(AnvilOutput stack : recipe.output) {
list.add(">" + stack.stack.stackSize + "x " + stack.stack.getDisplayName() + (stack.chance != 1F ? (" (" + (stack.chance * 100) + "%)" ) : ""));
}
return list;
}
/**
* Generates a simple, unstructured list of inputs (and all ore dict variants) and outputs for searching
* @param recipe
* @return
*/
public List<String> recipeToSearchList(AnvilConstructionRecipe recipe) {
List<String> list = new ArrayList();
for(AStack stack : recipe.input) {
if(stack instanceof ComparableStack) {
ItemStack input = ((ComparableStack) stack).toStack();
list.add(input.getDisplayName().toLowerCase());
} else if(stack instanceof OreDictStack) {
OreDictStack input = (OreDictStack) stack;
ArrayList<ItemStack> ores = OreDictionary.getOres(input.name);
if(ores.size() > 0) {
for(ItemStack ore : ores) {
list.add(ore.getDisplayName().toLowerCase());
}
}
}
}
for(AnvilOutput stack : recipe.output) {
list.add(stack.stack.getDisplayName().toLowerCase());
}
return list;
}
int lastSize = 1;
@Override
protected void drawGuiContainerBackgroundLayer(float inter, int mX, int mY) {
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
this.mc.getTextureManager().bindTexture(texture);
this.drawTexturedModalRect(guiLeft, guiTop, 0, 0, this.xSize, this.ySize);
int slide = MathHelper.clamp_int(this.lastSize - 42, 0, 1000);
this.drawTexturedModalRect(guiLeft + 125 + slide, guiTop + 17, 125, 17, 54, 108);
if(guiLeft + 7 <= mX && guiLeft + 7 + 9 > mX && guiTop + 71 < mY && guiTop + 71 + 36 >=mY) {
if(this.search.isFocused()) {
drawTexturedModalRect(guiLeft + 8, guiTop + 108, 168, 222, 88, 16);
}
if(guiLeft + 7 <= mX && guiLeft + 7 + 9 > mX && guiTop + 71 < mY && guiTop + 71 + 36 >= mY) {
drawTexturedModalRect(guiLeft + 7, guiTop + 71, 176, 186, 9, 36);
}
if(guiLeft + 106 <= mX && guiLeft + 106 + 9 > mX && guiTop + 71 < mY && guiTop + 71 + 36 >=mY) {
if(guiLeft + 106 <= mX && guiLeft + 106 + 9 > mX && guiTop + 71 < mY && guiTop + 71 + 36 >= mY) {
drawTexturedModalRect(guiLeft + 106, guiTop + 71, 185, 186, 9, 36);
}
if(guiLeft + 52 <= mX && guiLeft + 52 + 18 > mX && guiTop + 53 < mY && guiTop + 53 + 18 >=mY) {
if(guiLeft + 52 <= mX && guiLeft + 52 + 18 > mX && guiTop + 53 < mY && guiTop + 53 + 18 >= mY) {
drawTexturedModalRect(guiLeft + 52, guiTop + 53, 176, 150, 18, 18);
}
if(guiLeft + 97 <= mX && guiLeft + 97 + 18 > mX && guiTop + 107 < mY && guiTop + 107 + 18 >= mY) {
drawTexturedModalRect(guiLeft + 97, guiTop + 107, 176, 168, 18, 18);
}
for(int i = index * 2; i < index * 2 + 10; i++) {
if(i >= recipes.size())
@ -225,5 +337,22 @@ public class GUIAnvil extends GuiContainer {
if(selection == i)
this.drawTexturedModalRect(guiLeft + 16 + 18 * (ind / 2), guiTop + 71 + 18 * (ind % 2), 0, 222, 18, 18);
}
this.search.drawTextBox();
}
@Override
protected void keyTyped(char c, int key) {
if(!this.search.textboxKeyTyped(c, key)) {
if(key == 28) {
this.search.setFocused(false);
search(this.search.getText());
}
super.keyTyped(c, key);
}
}
}

View File

@ -3488,7 +3488,7 @@ public class ModItems {
.setHeat(2D)
.setMeltingPoint(5211).setUnlocalizedName("rbmk_fuel_heaus").setTextureName(RefStrings.MODID + ":rbmk_fuel_heaus");
rbmk_fuel_po210be = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_po210be)
.setYield(1000000D)
.setYield(25000000D)
.setStats(15, 40)
.setFunction(EnumBurnFunc.SQUARE_ROOT)
.setHeat(0.1D)
@ -3506,7 +3506,7 @@ public class ModItems {
.addRadiation(ItemHazard.rabe * ItemHazard.rod_rbmk).toItem()
.setUnlocalizedName("rbmk_fuel_ra226be").setTextureName(RefStrings.MODID + ":rbmk_fuel_ra226be");
rbmk_fuel_pu238be = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_pu238be)
.setYield(10000000D)
.setYield(50000000D)
.setStats(10, 50)
.setFunction(EnumBurnFunc.SQUARE_ROOT)
.setHeat(0.1D)

View File

@ -0,0 +1,59 @@
package com.hbm.packet;
import com.hbm.inventory.AnvilRecipes;
import com.hbm.inventory.AnvilRecipes.AnvilConstructionRecipe;
import com.hbm.inventory.container.ContainerAnvil;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayer;
public class AnvilCraftPacket implements IMessage {
int recipeIndex;
int mode;
public AnvilCraftPacket() { }
public AnvilCraftPacket(AnvilConstructionRecipe recipe, int mode) {
this.recipeIndex = AnvilRecipes.getConstruction().indexOf(recipe);
this.mode = mode;
}
@Override
public void fromBytes(ByteBuf buf) {
this.recipeIndex = buf.readInt();
this.mode = buf.readInt();
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(this.recipeIndex);
buf.writeInt(this.mode);
}
public static class Handler implements IMessageHandler<AnvilCraftPacket, IMessage> {
@Override
public IMessage onMessage(AnvilCraftPacket m, MessageContext ctx) {
if(m.recipeIndex < 0 || m.recipeIndex >= AnvilRecipes.getConstruction().size()) //recipe is out of range -> bad
return null;
EntityPlayer p = ctx.getServerHandler().playerEntity;
if(!(p.openContainer instanceof ContainerAnvil)) //player isn't even using an anvil -> bad
return null;
ContainerAnvil anvil = (ContainerAnvil)p.openContainer;
AnvilConstructionRecipe recipe = AnvilRecipes.getConstruction().get(m.recipeIndex);
if(!recipe.isTierValid(anvil.tier)) //player is using the wrong type of anvil -> bad
return null;
return null;
}
}
}

View File

@ -99,6 +99,8 @@ public class PacketDispatcher {
wrapper.registerMessage(KeybindPacket.Handler.class, KeybindPacket.class, i++, Side.SERVER);
//Packet to send NBT data from clients to serverside TEs
wrapper.registerMessage(NBTControlPacket.Handler.class, NBTControlPacket.class, i++, Side.SERVER);
//Packet to send for anvil recipes to be crafted
wrapper.registerMessage(AnvilCraftPacket.Handler.class, AnvilCraftPacket.class, i++, Side.SERVER);
}
}

View File

@ -42,11 +42,11 @@ public class RenderFEL extends TileEntitySpecialRenderer {
switch(fel.mode) {
case 0: color = 0x303000; break;
case 1: color = 0x400000; break;
case 1: color = 0xFF1010; break;
case 2: color = Color.HSBtoRGB(fel.getWorldObj().getTotalWorldTime() / 50.0F, 1F, 0.3F) & 16777215; break;
case 3: color = 0x100040; break;
case 4: color = 0x003000; break;
case 5: color = 0x306000; break;
case 3: color = 0x150560; break;
case 4: color = 0x054005; break;
case 5: color = 0x156015; break;
}
int length = 25;

View File

@ -261,4 +261,19 @@ public class TileEntityRBMKOutgasser extends TileEntityRBMKSlottedBase implement
nbt.setDouble("progress", this.progress);
this.gas.writeToNBT(nbt, "gas");
}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemStack) {
return getOutput(itemStack) != null && i == 0;
}
@Override
public boolean canExtractItem(int i, ItemStack itemStack, int j) {
return i == 1;
}
@Override
public int[] getAccessibleSlotsFromSide(int p_94128_1_) {
return new int[] {0, 1};
}
}

View File

@ -2,6 +2,9 @@ package com.hbm.util;
import java.util.List;
import com.hbm.inventory.RecipesCommon.AStack;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
@ -185,4 +188,11 @@ public class InventoryUtil {
return stack1.getTagCompound().equals(stack2.getTagCompound());
}
public static boolean doesPlayerHaveAStacks(EntityPlayer player, List<AStack> stacks) {
//ItemStack[] inventory TODO
return false;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB