[1.12] Créer un four
-
Je pense qu’il suffit de changer la méthode getFullRecipeTime() pour donner la valeur en fonction de la recette en cours. Ensuite, dans le Gui, pour que la barre de chargement fonctionne bien, il faut modifier dans la méthode drawGuiBackgroundLayer(), le calcul de textureWidth en changent le 200f en this.tile.getFullRecipeTime().
-
Il faut que tu renvoie une valeur différente suivant les “ingrédients” que tu as dans ta recette ici :
/** Temps de cuisson de la recette */ public int getFullRecipeTime() { return 200; }Avec une fonction du type : public static int ReactorRecipes.getTimeNeededFor(ItemStack[] ingredients)
-
Merci à vous deux, je vais essayer !
EDIT = Tout marche à merveille
-
Ahah, je vais peut etre essayé finalement, j’ai l’idée de quelques chose qui va pas etre piqué des hannetons
je vous demanderais de l’aide si je n’arrive pas ! -
Bonjour j’ai suivi le tutoriel mais j’ai une petite erreur dans ma classe Container dans la méthode pour mettre à jour ma TileEntity voici l’erreur en question :
sur la ligne ```java
if (this.burnTimeLeft != this.tile.getField(0)) {
icontainerlistener.sendProgressBarUpdate(this, 0,
this.tile.getField(0));
}voici- The method sendProgressBarUpdate(ContainerCustomFurnace, int, int) is undefined for the type
IContainerListener
- The method sendProgressBarUpdate(ContainerCustomFurnace, int, int) is undefined for the type
-
ContainerCustomFurnace hérite bien de Container ?
-
oui l’héritage est bon, je met ma classe Container ci-dessous
package fr.priya.simpleores.gui; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.init.Items; import net.minecraft.inventory.Container; import net.minecraft.inventory.IContainerListener; import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class ContainerCustomFurnace extends Container{ private TileEntityCustomFurnace tile; private int timePassed = 0; private int burnTimeLeft = 0; public ContainerCustomFurnace(TileEntityCustomFurnace tile, InventoryPlayer playerInventory) { int i; for(i = 0; i < 2; i++) { this.addSlotToContainer(new Slot(tile, i, 33 + i*18, 7)); } for(i = 0; i < 2; i++) { this.addSlotToContainer(new SlotSingleItem(tile, i + 2, 42, 40 + i* 18, i == 0 ? Item.getItemFromBlock(Blocks.PLANKS) : Items.WHEAT)); } this.addSlotToContainer(new SlotOutput(tile, 4, 116, 17)); for(i = 0; i < 3; ++i) { for(int j = 0; j < 9; ++j) { this.addSlotToContainer(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); } } for(i = 0; i < 9; ++i) { this.addSlotToContainer(new Slot(playerInventory, i, 8 + i * 18, 142)); } } public boolean canInteractWith(EntityPlayer player) { return tile.isUsableByPlayer(player); } public void addListener(IContainerListener listener) { super.addListener(listener); listener.sendAllWindowProperties(this, this.tile); } @Override public void detectAndSendChanges() { super.detectAndSendChanges(); for(int i = 0; i < this.listeners.size(); ++i) { IContainerListener icontainerlistener = (IContainerListener) this.listeners.get(i); if (this.burnTimeLeft != this.tile.getField(0)) { icontainerlistener.sendProgressBarUpdate(this, 0, this.tile.getField(0)); } if (this.timePassed != this.tile.getField(1)) { icontainerlistener.sendProgressBarUpdate(this, 1, this.tile.getField(1)); } } this.burnTimeLeft = this.tile.getField(0); this.timePassed = this.tile.getField(1); } @SideOnly(Side.CLIENT) public void updateProgressBar(int id, int data) { this.tile.setField(id, data); } public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { return ItemStack.EMPTY; } } -
C’est bizarre parce que la définition est la suivante : IContainerListener#sendProgressBarUpdate(Container containerIn, int varToUpdate, int newValue)
Donc il n’y a pas de raison pour que cela ne fonctionne pas.
Ce tutoriel concerne la 1.11, es-tu bien en 1.11 ?
-
Non elle a changé de nom récemment (1.12 je crois), regardes dans le code l’interface IContainerListener il y aura une fonction avec les mêmes arguments c’est celle là.
-
C’est bien pourquoi je précise que ce tutoriel est pour la 1.11.
-
Je suis bien en 1.11 je vais essayer d’update mes mappings pour voir
EDIT: même avec les derniers mappings ça ne fonctionne pas je l’ai remplacer par la fonction sendWindowProperty et maitenant mon jeu crash lorsque je fait clique droit sur mon block
Voici les logs–-- Minecraft Crash Report ---- // Surprise! Haha. Well, this is awkward. Time: 16/07/17 11:56 Description: Ticking player java.lang.NullPointerException: Ticking player at fr.priya.simpleores.gui.ContainerCustomFurnace.detectAndSendChanges(ContainerCustomFurnace.java:62) at net.minecraft.entity.player.EntityPlayerMP.onUpdate(EntityPlayerMP.java:293) at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2152) at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:879) at net.minecraft.world.World.updateEntity(World.java:2119) at net.minecraft.world.WorldServer.tickPlayers(WorldServer.java:680) at net.minecraft.world.World.updateEntities(World.java:1908) at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:651) at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:795) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:699) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:156) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:548) at java.lang.Thread.run(Unknown Source) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Server thread Stacktrace: at fr.priya.simpleores.gui.ContainerCustomFurnace.detectAndSendChanges(ContainerCustomFurnace.java:62) at net.minecraft.entity.player.EntityPlayerMP.onUpdate(EntityPlayerMP.java:293) at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2152) at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:879) at net.minecraft.world.World.updateEntity(World.java:2119) -- Player being ticked -- Details: Entity Type: null (net.minecraft.entity.player.EntityPlayerMP) Entity ID: 281 Entity Name: Player177 Entity's Exact location: 257,83, 64,00, 224,36 Entity's Block location: World: (257,64,224), Chunk: (at 1,4,0 in 16,14; contains blocks 256,0,224 to 271,255,239), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511) Entity's Momentum: 0,00, -0,08, 0,00 Entity's Passengers: [] Entity's Vehicle: ~~ERROR~~ NullPointerException: null Stacktrace: at net.minecraft.world.WorldServer.tickPlayers(WorldServer.java:680) at net.minecraft.world.World.updateEntities(World.java:1908) at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:651) -- Affected level -- Details: Level name: New World All players: 1 total; [EntityPlayerMP['Player177'/281, l='New World', x=257,83, y=64,00, z=224,36]] Chunk stats: ServerChunkCache: 626 Drop: 0 Level seed: 2481567272931423200 Level generator: ID 00 - default, ver 1\. Features enabled: true Level generator options: Level spawn location: World: (252,64,236), Chunk: (at 12,4,12 in 15,14; contains blocks 240,0,224 to 255,255,239), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511) Level time: 184333 game time, 824 day time Level dimension: 0 Level storage version: 0x04ABD - Anvil Level weather: Rain time: 1 (now: false), thunder time: 1 (now: false) Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: true Stacktrace: at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:795) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:699) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:156) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:548) at java.lang.Thread.run(Unknown Source) – System Details -- Details: Minecraft Version: 1.11 Operating System: Windows 10 (amd64) version 10.0 Java Version: 1.8.0_131, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 657540448 bytes (627 MB) / 1056309248 bytes (1007 MB) up to 1056309248 bytes (1007 MB) JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M IntCache: cache: 1, tcache: 1, allocated: 12, tallocated: 94 FML: MCP 9.35 Powered by Forge 13.19.1.2189 4 mods loaded, 4 mods active States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored UCHIJAAAA mcp{9.19} [Minecraft Coder Pack] (minecraft.jar) UCHIJAAAA FML{8.0.99.99} [Forge Mod Loader] (forgeSrc-1.11-13.19.1.2189.jar) UCHIJAAAA forge{13.19.1.2189} [Minecraft Forge] (forgeSrc-1.11-13.19.1.2189.jar) UCHIJAAAA simpleores{0.1} [Simple ores] (bin) Loaded coremods (and transformers): GL info: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread. Profiler Position: N/A (disabled) Player Count: 1 / 8; [EntityPlayerMP['Player177'/281, l='New World', x=257,83, y=64,00, z=224,36]] Type: Integrated Server (map_client.txt) Is Modded: Definitely; Client brand changed to 'fml,forge' -
Dans le constructeur de ton container tu as oublié
this.tile = tile; -
Merci beaucoup tout fonctionne, juste une dernière petite question comment fait-on pour ajouter des recettes pour notre four ?
J’ai essayé ceci que j’ai mis dans ma classe recettes sans succès ```java
addRecipe(new Item(SimpleoresItems.CORN), new ItemStack(Items.SUGAR), new ItemStack(SimpleoresItems.CORN_SEED)); -
addRecipe(new ItemStack(SimpleoresItems.CORN), new ItemStack(Items.SUGAR), new ItemStack(SimpleoresItems.CORN_SEED));
Tutoriel testé et corrigé. Il fonctionne et peut être déplacé.
-
Bonjour je n’arrive pas a ajouter mes recettes j’ai essayer de les mettres sous les addRecipes dans ma classe Recettes mais cela ne fonctionne pas
package fr.priya.simpleores.gui; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import fr.priya.simpleores.items.SimpleoresItems; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; public class RecipesCustomFurnace { private static HashMap <itemstack[], itemstack="">recipes = new HashMap<itemstack[], itemstack="">(); //ajouter les recettes private static void addRecipe(Item ingredient1, Item ingredient2, Item resultat1) { addRecipe(new ItemStack(ingredient1), new ItemStack(ingredient2), new ItemStack(resultat1)); //j'ai essayer de le mettre ici } private static void addRecipe(ItemStack ingredient1, ItemStack ingredient2, ItemStack resultat1) { recipes.put(new ItemStack[]{ingredient1, ingredient2}, resultat1); //et ici } //comparer les items stacks private static boolean areKeysEqual(ItemStack[] key1, ItemStack[] key2) { if(key1.length != key2.length) return false; for(int i = 0; i < key1.length; i++) { ItemStack s1 = key1*; ItemStack s2 = key2*; if(s1.isEmpty() && !s2.isEmpty()) return false; if(!s1.isEmpty() && s2.isEmpty()) return false; if(s1.getItem() != s2.getItem()) return false; if(s1.getItemDamage() != s2.getItemDamage()) return false; } return true; } //fonction pour trouver la recette public static ItemStack getRecipesResult(ItemStack[] ingredients) { Iterator<entry<itemstack[], itemstack="">> it = recipes.entrySet().iterator(); while(it.hasNext()) { Entry <itemstack[], itemstack="">entry = it.next(); if (areKeysEqual(entry.getKey(), ingredients)) { return entry.getValue(); } } return null; } } ```</itemstack[],></entry<itemstack[],></itemstack[],></itemstack[],> -
Il faut mettre les addRecipe dans un bloc static, regarde ici : https://www.minecraftforgefrance.fr/showthread.php?tid=4386#classerecette
-
Bonjour j’ai bien mis l’addrecipe au bon emplacement pourtant je n’arrive pas à faire fonctionner ma recette in-game (mon projet ne contient aucune erreur repérée par eclipse) je met ma classe recette au cas-où elle pourrait être utile
package fr.priya.simpleores.gui; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; public class RecipesCustomFurnace { //mettre des recettes private static final HashMap <itemstack[], itemstack="">recipes = new HashMap<itemstack[], itemstack="">(); static { addRecipe(Items.APPLE, Items.ARROW, Items.BAKED_POTATO); } private static void addRecipe(Item ingredient1, Item ingredient2, Item resultat1) { addRecipe(new ItemStack(ingredient1), new ItemStack(ingredient2), new ItemStack(resultat1)); } private static void addRecipe(ItemStack ingredient1, ItemStack ingredient2, ItemStack resultat1) { recipes.put(new ItemStack[]{ingredient1, ingredient2}, resultat1); } private static boolean areKeysEqual(ItemStack[] key1, ItemStack[] key2) { if(key1.length != key2.length) return false; for(int i = 0; i < key1.length; i++) { ItemStack s1 = key1*; //j'ai ajouter le sélecteur * pour résoudre une erreur j'ai essayer avec les sélecteurs [i++] et [i–] pour sélectionner l'élément précédent et suivant sans succès ItemStack s2 = key2*; if(s1.isEmpty() && !s2.isEmpty()) return false; if(!s1.isEmpty() && s2.isEmpty()) return false; if(s1.getItem() != s2.getItem()) return false; if(s1.getItemDamage() != s2.getItemDamage()) return false; } return true; } public static ItemStack getRecipeResult(ItemStack[] ingredients) { Iterator<entry<itemstack[], itemstack="">> it = recipes.entrySet().iterator(); while(it.hasNext()) { Entry <itemstack[], itemstack="">entry = it.next(); if(areKeysEqual(entry.getKey(), ingredients)) { return entry.getValue(); } } return null; } } ```</itemstack[],></entry<itemstack[],></itemstack[],></itemstack[],> -
Cette classe ne va pas m’aider, il faudrait plutôt la classe de ton TE (en fait c’est la fonction update qui est m’intéresse, et toutes les fonctions appelées par update)
-
Voici les fonctions appelées a chaque tick de ma classe tile entity
@Override public void tick() { if (!this.world.isRemote) { /* Si le carburant brûle, on réduit réduit le temps restant */ if (this.isBurning()) { this.burningTimeLeft–; } /* * Si la on peut faire cuire la recette et que le four ne cuit pas * alors qu'il peut, alors on le met en route */ if (!this.isBurning() && this.canSmelt() && !this.hasFuelEmpty()) { this.burningTimeLeft = this.getFullBurnTime(); this.decrStackSize(2, 1); this.decrStackSize(3, 1); } /* Si on peut faire cuire la recette et que le feu cuit */ if (this.isBurning() && this.canSmelt()) { this.timePassed++; if (timePassed >= this.getFullRecipeTime()) { timePassed = 0; this.smelt(); } } else { timePassed = 0; } this.markDirty(); } }je met ma classe entière en pièce jointe ci besoin
-
Pourquoi ta fonction s’apelle-t-elle tick ? En 1.12 c’est update qu’elle s’appelle