diff --git a/src/main/java/pers/towdium/tudicraft/Tudicraft.java b/src/main/java/pers/towdium/tudicraft/Tudicraft.java index 4b434c0..2be42d9 100644 --- a/src/main/java/pers/towdium/tudicraft/Tudicraft.java +++ b/src/main/java/pers/towdium/tudicraft/Tudicraft.java @@ -15,10 +15,12 @@ import net.minecraftforge.fml.relauncher.Side; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import pers.towdium.tudicraft.event.GuiEventHandler; +import pers.towdium.tudicraft.event.PlayerEventHandler; import pers.towdium.tudicraft.gui.GuiHandler; import pers.towdium.tudicraft.item.ItemCalculator; import pers.towdium.tudicraft.network.IProxy; import pers.towdium.tudicraft.network.packages.PackageCalculatorUpdate; +import pers.towdium.tudicraft.network.packages.PackageRecipeUpdate; import pers.towdium.tudicraft.network.packages.PackageSlotUpdate; /** @@ -48,8 +50,8 @@ public class Tudicraft { GameRegistry.registerItem(itemCalculator,itemCalculator.getUnlocalizedName().substring(5)); networkWrapper = NetworkRegistry.INSTANCE.newSimpleChannel(Reference.MODID); networkWrapper.registerMessage(PackageSlotUpdate.class, PackageSlotUpdate.class, 0, Side.SERVER); - networkWrapper.registerMessage(PackageCalculatorUpdate.class, PackageCalculatorUpdate.class, 0, Side.SERVER); - + networkWrapper.registerMessage(PackageCalculatorUpdate.class, PackageCalculatorUpdate.class, 1, Side.SERVER); + networkWrapper.registerMessage(PackageRecipeUpdate.class, PackageRecipeUpdate.class, 2, Side.SERVER); } @Mod.EventHandler @@ -58,8 +60,9 @@ public class Tudicraft { Minecraft.getMinecraft().getRenderItem().getItemModelMesher(). register(itemCalculator, 0, new ModelResourceLocation(Reference.MODID + ":" + itemCalculator.getUnlocalizedName().substring(5), "inventory")); } - NetworkRegistry.INSTANCE.registerGuiHandler(Tudicraft.instance, new GuiHandler()); - MinecraftForge.EVENT_BUS.register(new GuiEventHandler()); + proxy.init(); + + } diff --git a/src/main/java/pers/towdium/tudicraft/core/Calculator.java b/src/main/java/pers/towdium/tudicraft/core/Calculator.java index 71dbaea..9999008 100644 --- a/src/main/java/pers/towdium/tudicraft/core/Calculator.java +++ b/src/main/java/pers/towdium/tudicraft/core/Calculator.java @@ -28,7 +28,7 @@ public class Calculator { this.catalystBuffer = catalystBuffer; this.itemRecord = itemRecord; this.operateRecords = operateRecords; - for (Recipe recipe : Tudicraft.proxy.getPlayerHandler().getAllRecipeOf(new ItemStack(itemRecord.item, itemRecord.meta))){ + for (Recipe recipe : Tudicraft.proxy.getPlayerHandler().getAllRecipeOf(new ItemStack(itemRecord.item, itemRecord.meta), null)){ if(checkRecipeValid(recipe)){ long count = getOperateCount(recipe, exceedMode); this.currentOperate = new OperateRecord(recipe, count); diff --git a/src/main/java/pers/towdium/tudicraft/core/Recipe.java b/src/main/java/pers/towdium/tudicraft/core/Recipe.java index f5849a4..0a2a634 100644 --- a/src/main/java/pers/towdium/tudicraft/core/Recipe.java +++ b/src/main/java/pers/towdium/tudicraft/core/Recipe.java @@ -1,6 +1,9 @@ package pers.towdium.tudicraft.core; +import io.netty.buffer.ByteBuf; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.common.network.ByteBufUtils; /** * @author Towdium @@ -113,4 +116,97 @@ public class Recipe { } return true; } + + public static class ByteBufUtl{ + public static Recipe fromByte(ByteBuf buf){ + short a = buf.readShort(); + if(a == 0){ + return null; + } + short b = buf.readShort(); + ItemStack[] output = new ItemStack[4]; + ItemStack[] input = new ItemStack[12]; + for(int i=0; i getAllRecipeOf(ItemStack itemStack); + ImmutableList getAllRecipeOf(ItemStack itemStack, UUID uuid); - int getRecipeIndexOf(ItemStack itemStack); + int getRecipeIndexOf(ItemStack itemStack, UUID uuid); - ImmutableList getAllRecipeIndexOf(ItemStack itemStack); + ImmutableList getAllRecipeIndexOf(ItemStack itemStack, UUID uuid); - void addRecipe(Recipe recipe); + void addRecipe(Recipe recipe, UUID uuid); - void removeRecipe(int index); + void removeRecipe(int index, UUID uuid); - void setRecipe(Recipe recipe, int index); + void setRecipe(Recipe recipe, int index, UUID uuid); - Recipe getRecipe(int index); + Recipe getRecipe(int index, UUID uuid); void syncItemCalculator(ItemStack itemIn, String string); + + void handleLogin(net.minecraftforge.event.entity.player.PlayerEvent.LoadFromFile event); + + void handleSave(net.minecraftforge.event.entity.player.PlayerEvent.SaveToFile event); } diff --git a/src/main/java/pers/towdium/tudicraft/network/IProxy.java b/src/main/java/pers/towdium/tudicraft/network/IProxy.java index fa2838d..e1f08c9 100644 --- a/src/main/java/pers/towdium/tudicraft/network/IProxy.java +++ b/src/main/java/pers/towdium/tudicraft/network/IProxy.java @@ -11,5 +11,7 @@ import pers.towdium.tudicraft.core.Recipe; public interface IProxy { IPlayerHandler getPlayerHandler(); + void init(); + } diff --git a/src/main/java/pers/towdium/tudicraft/network/PlayerHandlerClient.java b/src/main/java/pers/towdium/tudicraft/network/PlayerHandlerClient.java index 31c5cfc..aa0ad40 100644 --- a/src/main/java/pers/towdium/tudicraft/network/PlayerHandlerClient.java +++ b/src/main/java/pers/towdium/tudicraft/network/PlayerHandlerClient.java @@ -4,23 +4,33 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.play.server.S42PacketCombatEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; import pers.towdium.tudicraft.Tudicraft; import pers.towdium.tudicraft.core.ItemStackWrapper; import pers.towdium.tudicraft.core.Recipe; import pers.towdium.tudicraft.gui.calculator.ContainerCalculator; import pers.towdium.tudicraft.network.packages.PackageCalculatorUpdate; +import pers.towdium.tudicraft.network.packages.PackageRecipeUpdate; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; +import java.util.UUID; /** * @author Towdium */ public class PlayerHandlerClient implements IPlayerHandler { - List recipes = new ArrayList<>(); + List recipes; @Override - public void addRecipe(Recipe recipe) { + public void addRecipe(Recipe recipe, UUID uuid) { for (Recipe oneRecipe : recipes){ if(oneRecipe.equals(recipe)){ return; @@ -32,7 +42,7 @@ public class PlayerHandlerClient implements IPlayerHandler { } @Override - public boolean getHasRecipeOf(ItemStack itemStack) { + public boolean getHasRecipeOf(ItemStack itemStack, UUID uuid) { for (Recipe recipe : recipes){ if(recipe.getHasOutput(itemStack)){ return true; @@ -42,8 +52,8 @@ public class PlayerHandlerClient implements IPlayerHandler { } @Override - public Recipe getRecipeOf(ItemStack itemStack) { - int i = getRecipeIndexOf(itemStack); + public Recipe getRecipeOf(ItemStack itemStack, UUID uuid) { + int i = getRecipeIndexOf(itemStack, null); if(i == -1){ return null; }else { @@ -52,16 +62,16 @@ public class PlayerHandlerClient implements IPlayerHandler { } @Override - public ImmutableList getAllRecipeOf(ItemStack itemStack) { + public ImmutableList getAllRecipeOf(ItemStack itemStack, UUID uuid) { ImmutableList.Builder recipeBuilder = new ImmutableList.Builder<>(); - for(Integer index : getAllRecipeIndexOf(itemStack)){ + for(Integer index : getAllRecipeIndexOf(itemStack, null)){ recipeBuilder.add(recipes.get(index)); } return recipeBuilder.build(); } @Override - public int getRecipeIndexOf(ItemStack itemStack) { + public int getRecipeIndexOf(ItemStack itemStack, UUID uuid) { int[] result = new int[]{-1, -1, -1, -1}; for(int[] record : getAllUnsortedRecipeIndexOf(itemStack)){ result[record[1]] = record[0]; @@ -75,7 +85,7 @@ public class PlayerHandlerClient implements IPlayerHandler { } @Override - public ImmutableList getAllRecipeIndexOf(ItemStack itemStack) { + public ImmutableList getAllRecipeIndexOf(ItemStack itemStack, UUID uuid) { ImmutableList.Builder> builder1 = new ImmutableList.Builder<>(); for(int i=0; i<4; i++){ builder1.add(new ImmutableList.Builder()); @@ -92,17 +102,17 @@ public class PlayerHandlerClient implements IPlayerHandler { } @Override - public void removeRecipe(int index) { + public void removeRecipe(int index, UUID uuid) { recipes.remove(index); } @Override - public void setRecipe(Recipe recipe, int index) { + public void setRecipe(Recipe recipe, int index, UUID uuid) { recipes.set(index, recipe); } @Override - public Recipe getRecipe(int index) { + public Recipe getRecipe(int index, UUID uuid) { return recipes.get(index); } @@ -114,6 +124,30 @@ public class PlayerHandlerClient implements IPlayerHandler { Tudicraft.networkWrapper.sendToServer(new PackageCalculatorUpdate(itemStack)); } + @Override + public void handleLogin(PlayerEvent.LoadFromFile event) { + try { + FileInputStream stream = new FileInputStream(event.getPlayerFile("jeca")); + NBTTagCompound tagCompound = CompressedStreamTools.readCompressed(stream); + readFromNBT(tagCompound); + } catch (Exception e) { + recipes = new ArrayList<>(); + } + } + + @Override + public void handleSave(PlayerEvent.SaveToFile event) { + try{ + File file = event.getPlayerFile("jeca"); + NBTTagCompound compound = new NBTTagCompound(); + writeToNBT(compound); + FileOutputStream fileoutputstream = new FileOutputStream(file); + CompressedStreamTools.writeCompressed(compound, fileoutputstream); + }catch (Exception e){ + Tudicraft.log.warn("Fail to save records for"+event.entityPlayer.getDisplayName()); + } + } + ImmutableList getAllUnsortedRecipeIndexOf(ItemStack itemStack){ ImmutableList.Builder builder = new ImmutableList.Builder<>(); int size = recipes.size(); @@ -127,4 +161,20 @@ public class PlayerHandlerClient implements IPlayerHandler { return builder.build(); } + public void readFromNBT(NBTTagCompound tagCompound){ + int amount = tagCompound.getInteger("amount"); + List recipes = new ArrayList<>(amount); + for(int i=0; i players = new HashMap<>(); + + + - } @Override - public boolean getHasRecipeOf(ItemStack itemStack) { + public boolean getHasRecipeOf(ItemStack itemStack, UUID uuid) { return false; } @Override - public Recipe getRecipeOf(ItemStack itemStack) { + public Recipe getRecipeOf(ItemStack itemStack, UUID uuid) { return null; } @Override - public ImmutableList getAllRecipeOf(ItemStack itemStack) { + public ImmutableList getAllRecipeOf(ItemStack itemStack, UUID uuid) { return null; } @Override - public int getRecipeIndexOf(ItemStack itemStack) { + public int getRecipeIndexOf(ItemStack itemStack, UUID uuid) { return 0; } @Override - public ImmutableList getAllRecipeIndexOf(ItemStack itemStack) { + public ImmutableList getAllRecipeIndexOf(ItemStack itemStack, UUID uuid) { return null; } @Override - public void removeRecipe(int index) { - + public void addRecipe(Recipe recipe, UUID uuid) { + players.get(uuid).addRecipe(recipe, null); } @Override - public void setRecipe(Recipe recipe, int index) { - + public void removeRecipe(int index, UUID uuid) { + players.get(uuid).removeRecipe(index, null); } @Override - public Recipe getRecipe(int index) { + public void setRecipe(Recipe recipe, int index, UUID uuid) { + players.get(uuid).setRecipe(recipe, index, null); + } + + @Override + public Recipe getRecipe(int index, UUID uuid) { return null; } @@ -57,4 +69,18 @@ public class PlayerHandlerServer implements IPlayerHandler { public void syncItemCalculator(ItemStack itemIn, String string) { } + + @Override + public void handleLogin(PlayerEvent.LoadFromFile event) { + + } + + @Override + public void handleSave(PlayerEvent.SaveToFile event) { + + } + + public void addPlayer(UUID uuid){ + players.put(uuid , new PlayerHandlerClient()); + } } diff --git a/src/main/java/pers/towdium/tudicraft/network/ProxyClient.java b/src/main/java/pers/towdium/tudicraft/network/ProxyClient.java index ebe44a5..a527f43 100644 --- a/src/main/java/pers/towdium/tudicraft/network/ProxyClient.java +++ b/src/main/java/pers/towdium/tudicraft/network/ProxyClient.java @@ -1,5 +1,12 @@ package pers.towdium.tudicraft.network; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.network.NetworkRegistry; +import pers.towdium.tudicraft.Tudicraft; +import pers.towdium.tudicraft.event.GuiEventHandler; +import pers.towdium.tudicraft.event.PlayerEventHandler; +import pers.towdium.tudicraft.gui.GuiHandler; + /** * @author Towdium */ @@ -10,4 +17,12 @@ public class ProxyClient implements IProxy { public IPlayerHandler getPlayerHandler() { return playerHandler; } + + @Override + public void init() { + NetworkRegistry.INSTANCE.registerGuiHandler(Tudicraft.instance, new GuiHandler()); + MinecraftForge.EVENT_BUS.register(new GuiEventHandler()); + MinecraftForge.EVENT_BUS.register(new PlayerEventHandler()); + } + } diff --git a/src/main/java/pers/towdium/tudicraft/network/ProxyServer.java b/src/main/java/pers/towdium/tudicraft/network/ProxyServer.java index 3f80dcf..c7ff5c1 100644 --- a/src/main/java/pers/towdium/tudicraft/network/ProxyServer.java +++ b/src/main/java/pers/towdium/tudicraft/network/ProxyServer.java @@ -1,13 +1,22 @@ package pers.towdium.tudicraft.network; +import net.minecraftforge.common.MinecraftForge; +import pers.towdium.tudicraft.event.PlayerEventHandler; + /** * @author Towdium */ public class ProxyServer implements IProxy{ - PlayerHandlerServer playerHandler = new PlayerHandlerServer(); + public static PlayerHandlerServer playerHandler = new PlayerHandlerServer(); @Override public IPlayerHandler getPlayerHandler() { return playerHandler; } + + @Override + public void init() { + MinecraftForge.EVENT_BUS.register(new PlayerEventHandler()); + } + } diff --git a/src/main/java/pers/towdium/tudicraft/network/packages/PackageRecipeUpdate.java b/src/main/java/pers/towdium/tudicraft/network/packages/PackageRecipeUpdate.java index 5dbdbaf..3dcf993 100644 --- a/src/main/java/pers/towdium/tudicraft/network/packages/PackageRecipeUpdate.java +++ b/src/main/java/pers/towdium/tudicraft/network/packages/PackageRecipeUpdate.java @@ -4,37 +4,55 @@ import io.netty.buffer.ByteBuf; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import net.minecraftforge.fml.relauncher.Side; +import pers.towdium.tudicraft.Tudicraft; import pers.towdium.tudicraft.core.Recipe; +import pers.towdium.tudicraft.network.IPlayerHandler; +import pers.towdium.tudicraft.network.PlayerHandlerServer; +import pers.towdium.tudicraft.network.ProxyClient; +import pers.towdium.tudicraft.network.ProxyServer; + +import java.util.UUID; /** * @author Towdium */ public class PackageRecipeUpdate implements IMessage, IMessageHandler { Recipe recipe; + int index; public PackageRecipeUpdate(){} - - public PackageRecipeUpdate(Recipe recipe){ + public PackageRecipeUpdate(Recipe recipe, int index){ this.recipe = recipe; + this.index = index; } @Override public void toBytes(ByteBuf buffer) { - + buffer.writeInt(index); + Recipe.ByteBufUtl.toByte(buffer, recipe); } @Override public void fromBytes(ByteBuf buffer) { - + index = buffer.readInt(); + recipe = Recipe.ByteBufUtl.fromByte(buffer); } - - - @Override public IMessage onMessage(PackageRecipeUpdate message, MessageContext context) { - + IPlayerHandler playerHandler = Tudicraft.proxy.getPlayerHandler(); + if(playerHandler instanceof PlayerHandlerServer){ + UUID uuid = context.getServerHandler().playerEntity.getUniqueID(); + if(message.index == -1){ + playerHandler.addRecipe(message.recipe, uuid); + }else if (message.recipe != null){ + playerHandler.setRecipe(message.recipe, message.index, uuid); + }else { + playerHandler.removeRecipe(index, uuid); + } + } return null; } diff --git a/src/main/java/pers/towdium/tudicraft/plugin/JEIPlugin.java b/src/main/java/pers/towdium/tudicraft/plugin/JEIPlugin.java index e1efa42..a7e960a 100644 --- a/src/main/java/pers/towdium/tudicraft/plugin/JEIPlugin.java +++ b/src/main/java/pers/towdium/tudicraft/plugin/JEIPlugin.java @@ -16,7 +16,6 @@ import javax.swing.plaf.TableUI; public class JEIPlugin implements IModPlugin{ public static IJeiRuntime runtime; - @Override public void onJeiHelpersAvailable(IJeiHelpers jeiHelpers) {