ReiZam

vanilla
[1.7.x] Créer une paxel / Item Multi-usage (Pioche,Hache,Pelle)

17 messages dans ce sujet

                                                                                     Bonjour, la commu' IronCraft !

                                                                       PS : Dans le futur je vais update ce post en 1.8

                                             Introduction

                                                                                     Vous voulez créer un item qui peux faire à la fois Pioche,Hache et pelle ?

                                                                                          Ehh bien vous êtes très bien arrivez car ce tutoriel est fais pour sa !

                                              Sommaire

                                                             Coté Client 

                                                                                                           1 ►  Création de l'item dans Item.java

                                                                                                           2 ►  Création de la classe Paxel.java

                                                             Coté Spigot

                                                                                                           1 ►  Création de l'item dans Item.java

                                                                                                           2 ►  Création de la classe Paxel.java

1) Création de l'item dans Item.java (Coté Client)

Bon commençons !

Tous d'abord nous devons répertorié notre futur item dans Item.java et Items.java dans le moment vous devriez faire ceci sans trop de difficulté.

Voilà à quoi sa devrais ressemblé dans Item.java :

        itemRegistry.addObject(ID, "Nom de l'item", new Paxel(Item.ToolMaterial.NIVEAUDEMATERIEL).setCreativeTab(CreativeTabs.tabInventory).setUnlocalizedName("Nom de l'item").setTextureName("Nom de la texture de l'item"));

Logiquement vous devriez avoir une erreur car la classe Paxel n'est pas encore créer donc si vous avez une erreur c'est totalement normal..

Et dans Items.java sa devrais ressemblé à sa : 

    public static final Item NomItem = (Item)Item.itemRegistry.getObject("Nom de l'item");

Voilà si vous avez fais sa pour le reste vous devriez vous en sortir ;)

Passons à la créations de la classe Paxel

2) Création de la classe Paxel.java (Coté Client)

Passons au plus intéressant tous d'abord créer votre classe Paxel et l'extends en ItemTool et pas oubliez pas de générer les constructeurs sa devrais ressemblé à sa :

package fr.reizam.api;

import java.util.Set;

import net.minecraft.item.ItemTool;

public class Paxel extends ItemTool{

	protected Paxel(float p_i45333_1_, ToolMaterial p_i45333_2_, Set p_i45333_3_) {
		super(p_i45333_1_, p_i45333_2_, p_i45333_3_);
		// TODO Auto-generated constructor stub
	}

}

Tous d'abord supprimé le float p_i45333_1 et le Set p_i45333_3 car nous n'avons pas besoin pour ce tutoriel.

Juste après il va falloir répertorié tous les blocks qu'il faudra casser heureusement j'ai déjà tous fais comme sa vous n'aurez pas à vous cassez la tête a tous récrire les blocks du coup 

déclaré ceci haut dessus de mon constructor Paxel: 

    private static final Set BlocksRegistered = Sets.newHashSet(new Block[] {Blocks.cobblestone, Blocks.double_stone_slab, Blocks.stone_slab, Blocks.stone, Blocks.sandstone, Blocks.mossy_cobblestone, Blocks.iron_ore, Blocks.iron_block, Blocks.coal_ore, Blocks.gold_block, Blocks.gold_ore, Blocks.diamond_ore, Blocks.diamond_block, Blocks.ice, Blocks.netherrack, Blocks.lapis_ore, Blocks.lapis_block, Blocks.redstone_ore, Blocks.lit_redstone_ore, Blocks.rail, Blocks.detector_rail, Blocks.golden_rail, Blocks.activator_rail,Blocks.planks, Blocks.bookshelf, Blocks.log, Blocks.log2, Blocks.chest, Blocks.pumpkin, Blocks.lit_pumpkin,Blocks.grass, Blocks.dirt, Blocks.sand, Blocks.gravel, Blocks.snow_layer, Blocks.snow, Blocks.clay, Blocks.farmland, Blocks.soul_sand, Blocks.mycelium});

Vous pouvez si vous voulez rajoutez des blocks dans la HashSet !

Et n'oubliez pas dans le super de mettre le nom de variable du Set pour qu'il soit bien répertorié aussi non sa ne marchera pas comme ceci :   

super(p_i45333_1_, p_i45333_2_, BlocksRegistered);

Mais ce n'est pas tous ! 

Car oui dans chaque pelle,pioche et hache il y a toujours des blocks spéciale qui vont cassé un peu moins/plus rapide donc pour ce faire il faudra rajouter 2 méthodes (func_150897_b et func_150893_a)

Pour ce faire j'ai déjà fait les méthodes pour vous mais je vais quand même vous expliqué !

Tous d'abord insérée ces deux methods :

 public boolean func_150897_b(Block p_150897_1_)
	 {
	        return p_150897_1_ == Blocks.snow_layer ? true : p_150897_1_ == Blocks.snow && p_150897_1_ == Blocks.obsidian ? this.toolMaterial.getHarvestLevel() == 3 : (p_150897_1_ != Blocks.diamond_block && p_150897_1_ != Blocks.diamond_ore ? (p_150897_1_ != Blocks.emerald_ore && p_150897_1_ != Blocks.emerald_block ? (p_150897_1_ != Blocks.gold_block && p_150897_1_ != Blocks.gold_ore ? (p_150897_1_ != Blocks.iron_block && p_150897_1_ != Blocks.iron_ore ? (p_150897_1_ != Blocks.lapis_block && p_150897_1_ != Blocks.lapis_ore ? (p_150897_1_ != Blocks.redstone_ore && p_150897_1_ != Blocks.lit_redstone_ore ? (p_150897_1_.getMaterial() == Material.rock ? true : (p_150897_1_.getMaterial() == Material.iron ? true : p_150897_1_.getMaterial() == Material.anvil)) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2);
	 }

	 public float func_150893_a(ItemStack p_150893_1_, Block p_150893_2_)
	 {
	        return p_150893_2_.getMaterial() != Material.wood && p_150893_2_.getMaterial() != Material.plants && p_150893_2_.getMaterial() != Material.vine && p_150893_2_.getMaterial() != Material.iron && p_150893_2_.getMaterial() != Material.anvil && p_150893_2_.getMaterial() != Material.rock ? super.func_150893_a(p_150893_1_, p_150893_2_) : this.efficiencyOnProperMaterial;
	 }
	 

La question est pourquoi la méthodes func_150897_b est là ?

Car tous simplement nous allons comme exemple l'obsidian qui lui nécessite une pioche en diamant pour le récupérer justement comme vous pouvez voir cet méthode retourne un boolean (Vrai ou faux) donc ce qui veux dire en gros trés gros Si pioche en diamant alors drop l'item au sol.

Et la méthodes func_150893_a ?

Cet methodes retourne juste le niveau d’efficacité pour certain Item/Block. 

Donc voilà n'oubliez pas dans le super de précisez le float au début comme ceci : 

protected Paxel(ToolMaterial p_i45333_2_) {
		super(3.0F, p_i45333_2_, BlocksRegistered);
	}

Et voilà dans votre class Paxel vous devriez avoir maintenant : 

package fr.reizam.api;

import java.util.Set;

import com.google.common.collect.Sets;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemTool;

public class Paxel extends ItemTool{
	
    private static final Set BlocksRegistered = Sets.newHashSet(new Block[] {Blocks.cobblestone, Blocks.double_stone_slab, Blocks.stone_slab, Blocks.stone, Blocks.sandstone, Blocks.mossy_cobblestone, Blocks.iron_ore, Blocks.iron_block, Blocks.coal_ore, Blocks.gold_block, Blocks.gold_ore, Blocks.diamond_ore, Blocks.diamond_block, Blocks.ice, Blocks.netherrack, Blocks.lapis_ore, Blocks.lapis_block, Blocks.redstone_ore, Blocks.lit_redstone_ore, Blocks.rail, Blocks.detector_rail, Blocks.golden_rail, Blocks.activator_rail,Blocks.planks, Blocks.bookshelf, Blocks.log, Blocks.log2, Blocks.chest, Blocks.pumpkin, Blocks.lit_pumpkin,Blocks.grass, Blocks.dirt, Blocks.sand, Blocks.gravel, Blocks.snow_layer, Blocks.snow, Blocks.clay, Blocks.farmland, Blocks.soul_sand, Blocks.mycelium});

	protected Paxel(ToolMaterial p_i45333_2_) {
		super(3.0F, p_i45333_2_, BlocksRegistered);
	}
	
	 public boolean func_150897_b(Block p_150897_1_)
	 {
	        return p_150897_1_ == Blocks.snow_layer ? true : p_150897_1_ == Blocks.snow && p_150897_1_ == Blocks.obsidian ? this.toolMaterial.getHarvestLevel() == 3 : (p_150897_1_ != Blocks.diamond_block && p_150897_1_ != Blocks.diamond_ore ? (p_150897_1_ != Blocks.emerald_ore && p_150897_1_ != Blocks.emerald_block ? (p_150897_1_ != Blocks.gold_block && p_150897_1_ != Blocks.gold_ore ? (p_150897_1_ != Blocks.iron_block && p_150897_1_ != Blocks.iron_ore ? (p_150897_1_ != Blocks.lapis_block && p_150897_1_ != Blocks.lapis_ore ? (p_150897_1_ != Blocks.redstone_ore && p_150897_1_ != Blocks.lit_redstone_ore ? (p_150897_1_.getMaterial() == Material.rock ? true : (p_150897_1_.getMaterial() == Material.iron ? true : p_150897_1_.getMaterial() == Material.anvil)) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2);
	 }

	 public float func_150893_a(ItemStack p_150893_1_, Block p_150893_2_)
	 {
	        return p_150893_2_.getMaterial() != Material.wood && p_150893_2_.getMaterial() != Material.plants && p_150893_2_.getMaterial() != Material.vine && p_150893_2_.getMaterial() != Material.iron && p_150893_2_.getMaterial() != Material.anvil && p_150893_2_.getMaterial() != Material.rock ? super.func_150893_a(p_150893_1_, p_150893_2_) : this.efficiencyOnProperMaterial;
	 }
	 
}

Vous devriez plus avoir d'erreur dans votre classe Item.java et l'item devrez marché n'oubliez de mettre une texture pour faire plus jolie et mettre son nom dans le dossier lang en_US.lang.

Passons au Spigot !

1) Création de l'item dans Item.java (Coté Spigot)

Pour la partie spigot je vais moins expliqué car c'est exactement le même principe que le client sauf que les noms des méthodes change...

Tous d'abord comme dans notre client nous devons répertorié notre futur item dans Item.java et Items.java.

Voilà à quoi sa devrais ressemblé dans Item.java :

        REGISTRY.a(ID, "Nom de l'item", new Paxel(Item.ToolMaterial.NIVEAUDEMATERIAL).c("Nom de l'item").f("Nom de l'item"));

Logiquement vous devriez avoir une erreur car la classe Paxel n'est pas encore créer donc si vous avez une erreur c'est totalement normal..

Et dans Items.java sa devrais ressemblé à sa : 

  public static final Item NomItem = (Item)Item.REGISTRY.get("Nom de l'item");

Voilà si vous avez fais sa pour le reste vous devriez vous en sortir ;)

Passons à la créations de la classe Paxel

2) Création de la classe Paxel.java (Coté Spigot)

Vu que je vous ai déjà tous expliqué dans la partie Client je vais direct vous donnez le code à mettre sans trop d'explication!

Comme je vous ai dit précédemment il y a une méthode qui retourne vrai ou faux si il doit droppé l'item si il a  une pioche quelconque et une autres méthodes qui change l’efficacité pour certain Blocks.

Voilà donc ce qui y'a a mettre dans la classe Paxel dans le spigot : 

package net.minecraft.server;

import java.util.Set;

import com.google.common.collect.Sets;

public class Paxel extends ItemTool{
	
	private static final Set c = Sets.newHashSet(new Block[] { Blocks.COBBLESTONE, Blocks.DOUBLE_STEP, Blocks.STEP, 
			Blocks.STONE, Blocks.SANDSTONE, Blocks.MOSSY_COBBLESTONE, Blocks.IRON_ORE, Blocks.IRON_BLOCK, Blocks.COAL_ORE,
			Blocks.GOLD_BLOCK, Blocks.GOLD_ORE, Blocks.DIAMOND_ORE, Blocks.DIAMOND_BLOCK, Blocks.ICE, Blocks.NETHERRACK,
			Blocks.LAPIS_ORE, Blocks.LAPIS_BLOCK, Blocks.REDSTONE_ORE, Blocks.GLOWING_REDSTONE_ORE, Blocks.RAILS, Blocks.DETECTOR_RAIL,
			Blocks.GOLDEN_RAIL, Blocks.ACTIVATOR_RAIL, Blocks.WOOD, Blocks.BOOKSHELF, Blocks.LOG, Blocks.LOG2, Blocks.CHEST, Blocks.PUMPKIN,
			Blocks.JACK_O_LANTERN, Blocks.GRASS, Blocks.DIRT, Blocks.SAND, Blocks.GRAVEL, Blocks.SNOW, Blocks.SNOW_BLOCK, Blocks.CLAY, Blocks.SOIL, Blocks.SOUL_SAND, Blocks.MYCEL});

	protected Paxel(EnumToolMaterial arg1) {
		super(3.0F, arg1, c);
	}
	
	 public boolean canDestroySpecialBlock(Block paramBlock)
	 {
	   if (paramBlock == Blocks.OBSIDIAN) {
	      return this.b.d() == 3;
	    }
	    if ((paramBlock == Blocks.DIAMOND_BLOCK) || (paramBlock == Blocks.DIAMOND_ORE)) {
	      return this.b.d() >= 2;
	    }
	    if ((paramBlock == Blocks.EMERALD_ORE) || (paramBlock == Blocks.EMERALD_BLOCK)) {
	      return this.b.d() >= 2;
	    }
	    if ((paramBlock == Blocks.GOLD_BLOCK) || (paramBlock == Blocks.GOLD_ORE)) {
	      return this.b.d() >= 2;
	    }
	    if ((paramBlock == Blocks.IRON_BLOCK) || (paramBlock == Blocks.IRON_ORE)) {
	      return this.b.d() >= 1;
	    }
	    if ((paramBlock == Blocks.LAPIS_BLOCK) || (paramBlock == Blocks.LAPIS_ORE)) {
	      return this.b.d() >= 1;
	    }
	    if ((paramBlock == Blocks.REDSTONE_ORE) || (paramBlock == Blocks.GLOWING_REDSTONE_ORE)) {
	      return this.b.d() >= 2;
	    }
	    if (paramBlock.getMaterial() == Material.STONE) {
	      return true;
	    }
	    if (paramBlock.getMaterial() == Material.ORE) {
	      return true;
	    }
	    if (paramBlock.getMaterial() == Material.HEAVY) {
	      return true;
	    }
	    if (paramBlock == Blocks.SNOW) {
		      return true;
		    }
		    if (paramBlock == Blocks.SNOW_BLOCK) {
		      return true;
		    }
	    return false;
	  }
	  
	  public float getDestroySpeed(ItemStack paramItemStack, Block paramBlock)
	  {
	    if ((paramBlock.getMaterial() == Material.ORE) || (paramBlock.getMaterial() == Material.HEAVY) || (paramBlock.getMaterial() == Material.STONE || paramBlock.getMaterial() == Material.WOOD) || (paramBlock.getMaterial() == Material.PLANT) || (paramBlock.getMaterial() == Material.REPLACEABLE_PLANT)) {
	      return this.a;
	    }
	    return super.getDestroySpeed(paramItemStack, paramBlock);
	  }
}

Et voilà nous avons maintenant l'item du coté spigot et client vous avez désormais votre PAXEL ! 

N'oubliez pas que le but n'est pas de recopier bêtement les codes le but est tous simplement de quand même comprendre pourquoi c'est fait comme sa !

Merci d'avoir lu mon post !

a+

 

 

Modifié par ReiZam
2

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut, bonne idée de tuto mais si j'étais toi, j'éviterai de le faire en 1.7.10. Ou alors j'expliquerai également comment le faire en 1.8 et +....
La 1.7x commence sérieusement à dater ^^'

Autre chose, cet item s'appelle un/une paxel =)

0

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 1 minute, Plaigon a dit :

Salut, bonne idée de tuto mais si j'étais toi, j'éviterai de le faire en 1.7.10. Ou alors j'expliquerai également comment le faire en 1.8 et +....
La 1.7x commence sérieusement à dater ^^'

Autre chose, cet item s'appelle un/une paxel =)

Okey pas de problème ^^

il y a 54 minutes, Plaigon a dit :

Salut, bonne idée de tuto mais si j'étais toi, j'éviterai de le faire en 1.7.10. Ou alors j'expliquerai également comment le faire en 1.8 et +....
La 1.7x commence sérieusement à dater ^^'

Autre chose, cet item s'appelle un/une paxel =)

Une fois fini il va être moov quand dans "Astuces"

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon tutoriel, tu as bien tout détaillé !
Cordialement

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Désoler du up mais j'ai suivi a la lettre ton tutoriel pour la Paxel et lorsque je lance le client depuis eclipse tout fonctionne bien mais une fois compiler et lancer depuis mon launcher minecraft ne veut pas se lancer et donne cette erreur : 

 

Citation

Exception in thread "main" java.lang.IllegalAccessError: tried to access method net.minecraft.item.ItemPaxel.<init>(Ladc;)V from class adb
    at adb.l(Item.java:316)
    at kl.b(SourceFile:358)
    at bao.<init>(Minecraft.java:354)
    at net.minecraft.client.main.Main.main(SourceFile:129)

 

Une idée de l'origine du problème ?

0

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 2 heures, GhostyManiakk a dit :

Tu as un OBFID, dans ta class

nop mais j'ai trouver en fait il y a une erreur dans le tuto 

 

Le 28/09/2016 à 15:22, ReiZam a dit :

protected Paxel(ToolMaterial p_i45333_2_) { super(3.0F, p_i45333_2_, BlocksRegistered); }

il faut mettre sa:

 

public PAXEL(ToolMaterial p_i45333_2_) 
{ 
super(3.0F, p_i45333_2_, BlocksRegistered); 
}

 

0

Partager ce message


Lien à poster
Partager sur d’autres sites

En faite c'est exactement pareil ^^'..

-1

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 8 minutes, Shey a dit :

En faite c'est exactement pareil ^^'..

Pas du tout, car une fois obfusqué, si c'est en protected et récupérer dans une autre class, la lecture du code est impossible d'où l'erreur qui intervient 

Il faut donc passer en mode public ta fonction 

1

Partager ce message


Lien à poster
Partager sur d’autres sites

Excuse moi, j'ai pas vu le protected.

-1

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 14/03/2017 à 21:10, DarkWitch_ a dit :

public PAXEL(ToolMaterial p_i45333_2_)

Par contre en Java on écrit pas en majuscule comme ça, par convention dans les constructeurs il y a seulement la première lettre qui a une majuscule.

1

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut, j'ai une question au sujet du Paxel, comment pourrais-je modifier l’efficacité de l'item ? Le rendre plus rapide lors de son utilisation tout simplement.

Cordialement,

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu créer "Paxel" dans ToolsMaterial : 

Item.ToolMaterial.NIVEAUDEMATERIAL


Puis tu le met ici.

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié)

S'il ne souhaite modifier que la vitesse d'efficacité, mais garder les autres propriétés d'un ToolMaterial déjà existant (harvest level, durabilité, dégât ou enchantabilité), alors inutile d'en créer un nouveau, il pourrait se satisfaire d'une réécriture de la méthode ItemTool#getStrVsBlock

Modifié par Plaigon
1

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut ! J'ai un problème avec ce Paxel, j'ai donc crée mon Item dans Items et Item
J'ai crée ma classe Paxel que j'ai bien importé, et voici le léger bug que j'ai quand j'ouvre mon inventaire en gamemode :

 

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant