Salut à toi ! Cher lecteur (le masculin l'emporte ^^)
Tu cherche comment faire un MOD Minecraft ? Hé bien tu tombe à pique !
Voici ce dont tu dois déjà avoir besoin :
Des connaissance de programmation en Java (tu veux apprendre ? Cherche sur le site du zéro)
Un minecraft SAIN, c-à-d sans mods sauf ModLoader (déjà installer dessus)
De la patience...
Une bouteille de vin quand tu aura fini ton premier mod
Les choses que tu va devoir avoir :
Minecraft Coder Pack (MCP)
Java Developement Kit (JDK)
Téléchargement & installation :
1. La JDK :
Télécharge et installe ceci : JDK
Si tu a Windows 64 bits prend la version corespondante, sinon, prend l'autre (1 chance / 2 )
Bien maintenant on va configurer Windows pour que l'ont ne soit pas obliger de lui rappeler tout le chemin de Java :
(Tout est sur les photos)
Attention : clique droit (et non pas gauche) sur "Ordinateur"
Le chemin est généralement C:\Program Files\Java\jdkversion_installée\bin
Ou encore C:\Program Files (x86)\Java\jdkversion_installée\bin
Voilà ! Maintenant, c'est au tour d'MCP :
2. MCP :
Télécharge la version corespondante à votre version Minecraft de MCP ici : MCP
Extraie le contenu de l'archive dans C:\MCP & allez dans C:\MPC\jars. Ouvrez aussi %appdata%\.minecraft à côté.
Copie / Colle les dossier comme ci-dessous :
En rouge, ce qui tu dois copier, en vert ce que tu peux copier (ici le pack de texture, si vous êtes accro. Il servira juste a tester)
Enfin, retourne dans C:\MCP et double-cliquez sur decompile.bat. Le logiciel s'occupera de décompiler Minecraft. Il te dira très certainement "Warning : 2 of 2 HUNKS failed bla.." où un truc du genre, ignorons...
Voilà voilà !!!
Pour l'instant j'arrête le tuto, je continuerai quand j'aurai le temps... si t'est surdoué (où pas xD) en Java et que les sources t'intéressent (et je te comprend) tu peux les trouvés dans C:\MCP\sources\minecraft\net\minecraft\src
@+ !
>> Suite
Dernière modification par nicotbb (01/06/2011 10:11:10)
Hors ligne
Ah et j'ai oublier ! On ne rigole pas sur l'indice de performance Windows de ma bécanne c'est claire ?
xD hahahahahah
Hors ligne
Pas mal du tout ! :) moi qui suis un geek en codage je vais me faire un petit MOD :)
Merci !
Hors ligne
Seigneur des Pumpkins
élevons nous mes frères, notre glorieuse Confrérie règnera sur tout Fr-Mc.net mouhahahahahaha
Qu'une chose a dire : GG
Je vais essayer ca quand j'aurai le temps...
Hors ligne
Ex-Seigneur Pumpkins!
Re-salut à tous (et à toutes) !
Je vous annonce officiellement la suite de mon tuto...
Mais avant... je voudrais remercier les auteurs des commentaires juste avant ce message ! Il m'ont donné encore plus envie de continuer mon tuto... donc grand merci à vous...
Maintenant the 2ème partie.... La programmation... A l'attaque !
Je vais commencer par décrire ce que l'on va faire : un item "ressort" qui va servir à faire un bloc "saut" (classique, je sait). Et devine qu'est-ce qui va ce passer quand un joueur passe dessus ! BANGZAIIIIIIII il va être propulsé très haut !
Donc je pense que vous l'avez remarqué, toutes les classes Java principales d'un mod utilisant ModLoader commence par mod_Xxxxx. Donc on va suivre (c'est comme sa xD) et on va, dans les sources (c-à-d C:\MCP\sources\minecraft\net\minecraft\src), ajouter un fichier mod_Jump, ou, si tu préfére, mod_Saut comme tu veux et on oubli pas le .java (et c'est moi qui dit sa ?). Ouvre se fichier avec ton éditeur de texte préféré (Notepad (bèèè), Notepad++ (classsssse)) et on va y tapé :
package net.minecraft.src;
//Nous sommes dans les sources de Minecraft
//Et nous déclarons notre classe (qui, soit dit en passant, ne l'a pas encore)
public class mod_Jump extends BaseMod {
public mod_Jump() {
ModLoader.SetInGameHook(this, true, false); //J'explique plus tard...
addRecipes(); //On ajoute les recettes
}
private void addRecipes() {
//Pour l'instant aucune recette...
}
public String Version() {
//Ici j'ai l'habitude de mettre la version de Minecraft, mais (à vérifier) tu peu mettre la version de ton mod.
return "1.6.5";
}
}
Sa... c'est LA BASE (attention y a pas de ExtendedMod, je parle du fichier pas de la classe) !
La seul chose que j'ai à expliquer, c'est :
ModLoader.SetInGameHook(this, true, false);
Cette fonction est très difficile à expliquer... sa permet d'exécuter le mod soit à chaque ticks du jeu, soit à chaque mise à jour d'image (FPS) du jeu (troisième paramètre). Ici, j'ai choisi de l'exécuter à chaque nouvelle image (false). Cette fonction est compliquée à expliquer, même moi j'ai du mal. Le premier paramètre est la classe du Mod, ici this, donc ce mod; le 2ème est si la fonction est activée, le troisième le mode de fonctionnement. (si quelqu'un a une meilleure explication je suis preneur !)
Bref la suite : un nouvel Item !
Alors tu va créer un fichier ItemRessort.java. Ici j'ai fait comme tout moddeur, j'ai suivi la norme ItemXxxx. Si j'ai mis Item en bleu, c'est parce-que sa n'est pas obligatoire ! Sache que t'est libre de ne pas le mettre, c'est une histoire de "retrouvation", comme sa on peut pas se perdre devant l'immense liste de fichier sources de Minecraft.
Enfin, on l'ouvre et on note :
package net.minecraft.src;
//On est toujours dans les sources de Minecraft
//On déclare notre nano-classe de l'Item...
public class ItemRessort extends Item {
public ItemRessort(int id) {
super(id); //On initialise la classe Item dans ItemRessort avec comme paramètre l'ID de l'item...
}
}
Heumm... ici tout est commenté alors pas besoin d'explications !
Par contre, sa sert à rien d'essayer le jeu, l'Item ne sera pas ajouté "comme par magie" ! Donc on va s'en occuper : Modification de mod_Jump.java
[...]
public class mod_Jump extends BaseMod {
public static Item Ressort
public mod_Jump() {
ModLoader.SetInGameHook(this, true, false); //J'explique plus tard...
Ressort = (new ItemRessort(113)).setIconCoord(0, 0);
addRecipes(); //On ajoute les recettes
}
private void addRecipes() {
ModLoader.AddRecipe(new ItemStack(Ressort, 1), new Object[] {"C", Character.valueOf('C'), Block.cobblestone});
}
[...]
Explications :
public static Item Ressort
On créer notre Item ressort
Ressort = (new ItemRessort(113)).setIconCoord(0, 0);
On initialise le ressort en lui donnant un ID (113) et on lui attribut un icône positionné X=0 Y=0 dans l'image items.png du dossier gui de l'archive minecraft.jar.
ModLoader.AddRecipe(new ItemStack(Ressort, 1), new Object[] {"C", Character.valueOf('C'), Block.cobblestone});
Ici on demande à ModLoader de créer la recette pour fabriquer notre ressort. La recette est simple, il suffit place un bloc de cobble n'importe où ! Voici une recette plus complexe : (je ne garde que les donées dans l'Array (entre crochet)) :
"#XD", "DX#", "D#X", Character.valueOf('#'), Block.cobblestone, Character.valueOf('X'), Block.dirt, Character.valueOf('D'), Item.ingotIron
Et voici la recette sous forme de text plus organisé :
#XD
DX#
D#X
où # = Cobble
X = Terre
D = Lingot de fer
En bref les trois première chaines de caractères sont les 3 lignes de la table de crafting où chaque caractère représente un objet. Il suffit ensuite de donné le code du caractère puis l'objet correspondant à la suite.
Et maintenant T E S T :
Reviens dans C:\MCP et lance recompile.bat. Si ici tous se passe sans erreur, sa commence bien.
Ensuite lance startclient.bat (où test_client.bat ou un truc comme sa, dépend des versions).
Si tu vois ceci sa continue bien :
Si après tu vois le menu, fais un nouveau monde, et craft l'objet. Normalement là tout c'est bien passé et ton mod marche ! Il n'est pas encore terminé, mais il MARCHE !!!!
Voilà c'est fini pour aujourd'hui la prochaine fois je dirai comment changer de nom & comment mettre un icône situé dans un autre fichier et enfin comment faire un bloc. Sa va aller vite vu que je n'ai pas school de mercredi inclus à lundi non inclus.
Love you ascension !
@+ !
>> Suite
Dernière modification par nicotbb (01/06/2011 10:11:54)
Hors ligne
Tu fais de mieux en mieux en tutoriel !
Hors ligne
Seigneur des Pumpkins
élevons nous mes frères, notre glorieuse Confrérie règnera sur tout Fr-Mc.net mouhahahahahaha
Fiou... Pas mal mais c'étais dur a finir de tout lire xD
Très bon Tuto quand même pour les débutants qui n'y connaissent rien (hein Dark xD)
Bref sa peux être utie ;)
Hors ligne
Citation :
"Le monde est plein de mystères. Cependant même les phénomènes les plus troublants sont insignifiants s'il n'y a pas un humain pour les voir, un humain pour constater, un humain pour se sentir concerné. L'être vivant de ce monde est l'être vivant le plus énigmatique."
Et beh, moi qui n'y connait (presque) rien en codage Java (14 ans, c'est normal vous me direz^^) j'ai absolument rien tout compris...
ca marche a merveille
merci beaucoup pour ce tuto et a bientot pour un autre mod^^.
Hors ligne
Ex-Seigneur Pumpkins!
pour ton indice windows osef (car c'est indice est pourris, ton dd est vide ta un bon truc, il es plein tu chute (je suis a 5.9 car mon dd est vieux, sinon c'est 7.7 et plus))
Hors ligne
Simpa le tuto merci !
Hors ligne
Toute grandes personnes doit être dépassé par une autre personne plus envieuse, c'est une loi fondamentale de la vie.
Re,
Tout d'abord je voulais m'excuser pour le retard (la suite devait sortir hier vers 19h ), et ensuite je remercie encore pour les commentaires sa me fait super plaisir (c'est le première fois que j'écris un tuto, je ne savais pas si je devais préciser plus) !
Je te l'avais promis voici la suite de mon tuto (loin d'être terminé au passage il y aura encore la GUI, etc...) bref ! Dans cette partie je vais te parler du changement de l'icône d'un item etc... donc c'est parti !
1. Changer de nom un item
Au départ, un item n'a pas de nom par défaut. On va donc lui en donner un :
tout d'abord on va ajouter la propriété Item.setItemName(String name) à notre Ressort dans la fonction principale de mod_Jump
[...]
public mod_Jump() {
ModLoader.SetInGameHook(this, true, false);
Ressort = (new ItemRessort(113)).setIconCoord(0, 0).setItemName("ressort");
[...]
REMARQUE : ceci ne changera pas le nom qui sera afficher quand on passe la souris dessus, sa lui donne juste un ID sous forme de texte. Alors, tu va me dire oui mais nous ce qu'ont veux c'est justement sa ! Oui mais, t'est obligé de le mettre ^^ sinon après, c'est le reste qui est faux ! Donc on va tout de suite s'en occupé et on va ajouter à la suite :
[...]
public mod_Jump() {
ModLoader.SetInGameHook(this, true, false);
Ressort = (new ItemRessort(113)).setIconCoord(0, 0).setItemName("ressort");
//Haaaaaaaaaa voilà ce qu'il te faut :
ModLoader.AddName(Ressort, "Ressort");
[...]
EDIT : le nom donné précédemment (par setItemName) ne doit pas forcément être le même que le second (AddName).
2. Mise en place d'un icône personnalisé :
Alors tout d'abord on va créer une image de taille (en px) 16x16 qu'ont va créer avec TheGimp (logiciel d'édition d'image gratuit, pour ceux qui ne connaissent pas) avec un fond transparent :
Alors je c'est c'est touuuuut petit. Minecraft s'occupe ensuite de le zoomer an pixelisant, donc on va faire de-même. On fait soit contrôle + molette ou Affichage > Zoom > XXX%. Et devine ce qu'on va dessiner ? Un ressort (je pense que tu t'en doutai xD !). On va prendre l'outil crayon et mettre "Échelle" au minimum histoire d'avoir un crayon d'un pixel. Voici mon ressort ! Je sais, c'est moche :
Ensuite on l'enregistre (Fichier > Enregistrer sous (je préfère préciser)) et, si ce n'est pas fait déroulez "parcourir d'autre dossiers" et allez dans C:\MCP (ici je me suis trompé je suis déjà aller trop loin ) :
REMARQUE : lors d'un test il faudra la placer dans C:\MCP\bin\minecraft, mais, on n'en est pas encore à la xD
Passons au codage :
1èrement on va remplacer "setIconCoord" par "setIconIndex", qui, en faite, au lieu de donner 2 paramètres, il n'en donne qu'un : le numéro correspondant ! Exemple : tu peux remplacer setIconCoord(0, 0) par setIconIndex(0) et setIconCoord(1, 0) par setIconIndex(1) et encore setIconCoord(0, 1) par setIconIndex(16) voilà !
Ensuite on va appeller une fonction de ModLoader qui va remplace une image vide dans gui/items.png par notre image (que pour une instance du jeu) et va finir par retourner l'id de cet espace vide :
[...]
public mod_Jump() {
ModLoader.SetInGameHook(this, true, false); //J'explique plus tard...
Ressort = (new ItemRessort(113)).setIconIndex(ModLoader.addOverride("/gui/items.png", "/ressort.png")).setItemName("ressort");
ModLoader.AddName(Ressort, "Ressort");
[...]
Vous l'avez remarquer, c'est la fonction ModLoader.addOverride qui cherche une place libre dans /gui/items.png (/ est la racine de l'archive JAR) et la remplace par ressort.png. Voilà ! Le tour est joué !
T E S T
Alors maintenant qu'ont a terminé de coder notre Item, let's testing !
D'abord n'oublie pas de place ressort.png dans C:\MCP\bin\minecraft. Ensuite lance startclient.bat.
Si tu vois ceci :
C'est que :
Tu l'a pas bien placé
T'a oublier de mettre / devant ressort.png (dans le code)
Le nom que t'a indiqué dans le code n'est pas le même que le nom du fichier
Apèrs si tout est bon... ben...; tout est bon xD :
Voilà alors comme je m'y suis pris un peu tard, je vous promet une autre partie aujourd'hui.
@+ !
Dernière modification par nicotbb (01/06/2011 10:00:59)
Hors ligne
Re tout le monde !
Alors désolé pour le temps d'attente; je croyait que pendant mon énooooooorme Week-End j'allais avoir du temps libre, mais au contraire ! (en plus j'ai un serveur à gérer avec philemon789)
Bref, trêve de blablaterie c'est parti !
1. Ajouter un bloc
Donc maintenant nous allons voir comment faire un nouveau bloc. Je continue donc avec l'exemple de mon MOD Jump. Voiciiiiiii... le JumpBlock ! On reviens donc dans C:\MCP\src\minecraft\net\minecraft\src (vous vous souvenez encore ? ) et on va créer un fichier dont le nom suit la règle d'organisation BlockNomDuBloc.java (comme dit dans une précédente partie, c'est optionnel, c'est juste une question d'organisation). Pour mon exemple, je vais créer un fichier BlockJump.java
On ouvre donc notre fichier et on y tape le code minimal (n'oublier pas de remplacé Jump par le nom de votre bloc) :
package net.minecraft.src;
import java.util.Random;
public class BlockJump extends Block {
public BlockJump(int id) {
super(id, Material.wood);
//La on recréer la classe parente, ici j'ai mis du bois comme matériaux, mais vous pouvez utilisez rock (pierre, que l'ont peut
//récolter qu'avec une pioche) ou encore sand (sable) et la votre bloc sera soumis à l'attraction terrestre. Ou même comme de
//la terre, dans ce cas la Material.ground
}
public int idDropped(int i, Random random) {
return Block.dirt.blockID;
//Ici on retourne l'ID du bloc qui apparait une fois le bloc cassé. Pour l'instant, j'ai mis l'ID de la terre.
}
}
Ici tout est expliqué dans la code, je passe donc à la suite...... modification de mod_Jump.java :
[...]
//Modification ici (creation du bloc)
public static Block JumpBlock;
public mod_Jump() {
ModLoader.SetInGameHook(this, true, false);
Ressort = (new ItemRessort(113)).setIconIndex(ModLoader.addOverride("/gui/items.png", "/ressort.png")).setItemName("ressort");
ModLoader.AddName(Ressort, "Ressort");
//Modifications ici (intialisation du bloc) :
JumpBlock = (new BlockJump(114)).setHardness(2.0F).setResistance(2F).setStepSound(Block.soundStoneFootstep);
//On demande a ModLoader d'ajouter notre bloc dans la liste des blocs Minecraft
ModLoader.RegisterBlock(JumpBlock);
addRecipes();
}
private void addRecipes() {
ModLoader.AddRecipe(new ItemStack(Ressort, 1), new Object[] {"C", "C", "C", Character.valueOf('C'), Block.cobblestone});
//Et modification la ! (ajout de la recette du bloc)
ModLoader.AddRecipe(new ItemStack(JumpBlock, 1), new Object[] {"R", "P", Character.valueOf('R'), Ressort, Character.valueOf('P'), Block.planks});
}
[...]
Alors soit vous connaissez déjà la fonction, soit elle est expliquée dans le code, sauf pour l'initialisation :
JumpBlock = (new BlockJump(114))... ici on initialise le bloc et on lui attribue l'ID 114.
...setHardness(2.0F).setResistance(2F)... ici on lui attribue sa résistance lors d'une explosion, et la difficulté pour le détruire.
...setStepSound(Block.soundStoneFootstep); ici on lui attribue un son lorsque l'on marche dessus. Voici une liste des différents sons :
soundPowderFootstep
soundWoodFootstep
soundGravelFootstep
soundGrassFootstep
soundStoneFootstep
soundMetalFootstep
soundGlassFootstep
soundClothFootstep
soundSandFootstep
P.S. : Si tu veux dropper ton bloc quand il est casser, tu peux soit supprimer la fonction idDropped, soit supprimer Block.dirt pour ne garder que blockID. Si tu veux mettre plusieurs drop, rajoute la fonction "public int quantityDropped(Random random)" et tu lui fait retourner le nombre de drop !
Maintenant tu peux tester, mais tu aura la texture de la pierre, or, bèèèèèèèèèèè ! C'est pas boooooo !
2. Personnalisation du bloc
a. Changement du nom
Premier truc, ajouter .setBlockName("jump_block") avant le point-virgule de la ligne d'initialisation du block dans mod_Jump.java. Deuxième truc, ajouter ModLoader.AddName(JumpBlock, "Jump Block"); après ModLoader.RegisterBlock.
b. Changement de la texture
Alors là c'est un peu plus complexe.... ajoutons déjà ceci dans notre BlockJump.java :
public int getBlockTextureFromSide(int i) {
return 43;
}
Si on test sa donne sa :
(un bloc avec le haut d'un établi partout)
Dans la fonction getBlockTextureFromSide(int i), le i donné en paramètre est le numéro du côté. Or, un cube a six côtés (naannnn ? ha bon ?) et comme on commence à zéro, si on veux faire une texture différente pour chaque côtés on va faire 6 if, le premier vérifie si i == 0 et le dernier si i == 5 :
public int getBlockTextureFromSide(int i) {
if(i == 0) {
return 43;
}
if(i == 1) {
return 44;
}
if(i == 2) {
return 45;
}
if(i == 3) {
return 46;
}
if(i == 4) {
return 47;
}
if(i == 5) {
return 48;
}
return 0; //Et faut rajouter un return a la fin sinon Monsieur n'est pas content (le compilateur)
}
Et sa nous donne un super spécimen de Four-éponge-dispenser-workbench en feu (j'ai choisi les textures par hasard, sauf le 43) qui nous permet de constater que : (je parle une fois qu'ont à placer le bloc et qu'ont ne bouge plus)
0 = en-dessous
1 = au-dessus
2 = derrière
3 = devant
4 = à gauche
5 = à droite
Alors en attendant moi je vais mettre la texture du Note Block par tout et le haut d'un workbench au-dessus.
c. Mettre en place une texture personnalisée
Alors comme pour l'item, il vous faut une image PNG de 16x16px transparente (pour chaque côtés différents) que vous enregistrerez dans C:\MCP\bin\minecraft.
On va donc modifier toujours et encore notre BlockJump.java et y ajouter avant la fonction principale "public BlockJump" :
private int side01Id; //Cote 0 et 1 (j'avais pas d'idee)
private int side2345Id; //Cote 2, 3, 4 et 5 (la non plus)
Et après dans la fonction BlockJump :
public BlockJump(int id) {
super(id, Material.wood);
side01Id = ModLoader.addOverride("/terrain.png", "/side01.png"); //N'oublie pas de remplacer side01.png par ton fichier
side2345Id = ModLoader.addOverride("/terrain.png", "/side2345.png"); //Pareil pour side2345.png
}
Et enfin dans la fonction getBlockTextureFromSide :
public int getBlockTextureFromSide(int i) {
if(i == 0 || i == 1) {
return side01Id;
}
return side2345Id;
}
ATTENTION : ne pas retourner ModLoader.addOverride... : sinon modloader "overridera" a chaque nouvelles image du jeu (pas mal par secondes) et le jeu crashera !
Voici mes textures que j'ai nommés : "Bling-Bling-Cube" !
Enfin, je termine avec un petit truc que j'avais oublié, qui marche avec les items, c'est la variable maxStackSize que l'ont défini dans "public ItemRessort(..." qui permet de définir la taille maximale d'un stack de votre item.
Voilà ! Bref à présent fini la déco ! La prochaine partie parleras des actions comme les cliques droits sur un cube, quand quelqu'un marche dessus, quand on le place, quand on le supprime et quand on clique droit à quelque part avec un item etc... puis, plus tard, on parleras de la GUI !
@++ !
Hors ligne
Oo GG j'adore!
Hors ligne
Ex-Seigneur Pumpkins!
Merci j'aime beaucoup.
Oo c'est vraiment bien fait et bien expliqué surtout pour ceux qui n'y connaissent pas grand chose dans le sujet !
MERCI !!! et continue comme sa !
Hors ligne
Que la illumine ta penser.
Re à tous & merci pour le comments
Voici une vidéo de ce que sa va donner à la fin ! (Bien-sûr je ferais en sorte d'expliquer d'autres fonction de sorte à ce que vous ayez d'autre choix que Un bloc jump, un bloc jump, ou un bloc jump xD ) :
Hors ligne
J'espère que tu vas continuer. C'est super !
Personnellement j'aimerais faire des mod pour rajouter des objets de déco mais je n'arrive pas a trouver comment on fait pour avoir une texture de style arbuste ...
Bonne continuation, j'attends la suite avec impatience ! :)
Hors ligne
Merci pour ton tuto ,s'est un des meilleur que j'ai trouver et des mieux expliquer!
Comment (dans la class du bloc) récupérer les bloc au alentour , en poser de nouveau et récupérer une impulsion redstone?
Hors ligne
Re les gens ! Alors comme d'hab je suis en retard, je sais ^^, et merci pour les comments.
Alors je me permet d'abord de répondre à une question :
Comment (dans la class du bloc) récupérer les bloc au alentour , en poser de nouveau et récupérer une impulsion redstone?
Pas si vite, j'y viens :) !
Bref c'est parti (le petit mot habituel xD) !
Alors j'avais dit "fini avec la déco" mais j'ai menti ! En effet, The Capt'aine Cookies me l'a rappelé avec les mots suivants :
...avoir une texture de style arbuste
C'est comment faire un bloc.... plus petit qu'un bloc ^^ (en tout cas c'est ce que j'ai compris ^^). Hélas pour toi je ne suis pas un pro dans le domaine "déco" et j'ai un peu de mal MAIS cependant je peu te donner un début :
1èrement il faut que ton bloc ne soit pas un bloc rendu normalement. Pour cela tu va créer une fonction renderAsNormalBlock() dans la classe de ton bloc et tu va la faire retourner "false" comme ceci : (fichier BlockTonBloc.java)
[...]
public boolean renderAsNormalBlock() {
return false;
}
[...]
2èmement tu va lui attribuer sa taille avec la fonction setBlockBounds qui prend 6 paramètres (et la je suis pas sûr de ce que je dis) : la position x, y, et z en float de la position du premier point et la position x, y et z du second point. En photo (photo que je me suis d'ailleurs permis de piquer) :
En gros pour une classe tout simple tu obtiendra ceci :
package net.minecraft.src;
import java.util.Random;
public class BlockMini extends Block {
public BlockMini(int id) {
super(id, Material.wood);
setBlockBounds(1.0F, 0.1F, 0.5F, 0.5F, 1.0F, 0.1F); //Sa, sa ressemble a une manette pour ouvrir une porte ! Si, si !
}
public boolean renderAsNormalBlock() {
return false;
}
}
Et si tu place ton bloc à quelque part tu te rendra compte qu'il fait office d'Xray ! On voit à travers le sol et dès que y a une "cave" on la voie ! (Mais sa marche que en solo ^^, bref c'est l'une des choses que je ne maîtrise pas bien. Fait un tour dans les fichiers tel que BlockButton (L'arbuste est un peu complexe je ne te le conseille pas), la torche etc... )
Et maintenant la suite : Les Événements !
Alors je ne vais pas passer 3 heures sur tous, je vais donc vous donner les prototypes de chaque fonctions appelées lors d'un évènement :
La plus part du temps la fonction vous livre 4 paramètres : le "world" (le niveau), i : la position x de votre bloc (horizontale), j : la position y (verticale) de votre bloc et k : la position z de votre bloc (profondeur). Vous avez juste à ajouter la fonction dans votre BlockMonBloc.java.
public void onEntityWalking(World world, int l, int j, int k, Entity entity)
Cette fonction est appelée quand une entité marche dessus (joueur, mobs...). Elle vous donne un autre paramètre : c'est l'entité qui marche dessus.
public void onBlockDestroyedByPlayer(World world, int i, int j, int k, int l)
est appelée quand le joueur détruit le bloc (heu... le l je ne sais pas vraiment à quoi il correspond)
public void onNeighborBlockChange(World world, int i, int j, int k, int l)
est appelée quand le bloc voisin change (là non plus, mais il me semble que c'est l'ID du bloc voisin après qu'il est été changé)
public void onBlockAdded(World world, int i, int j, int k)
est appelée quand le bloc a été ajouté (pas forcément par le joueur)
public void onBlockRemoval(World world, int i, int j, int k)
est appelée quand le bloc a été supprimé (idem)
public boolean canPlaceBlockOnSide(World world, int i, int j, int k, int l)
est appelée quand le jeu veux savoir si le bloc peut être posé sur une certaine face. Doit retourné true si oui, sinon false. l est le numéro du côté (va voir dans la partie précédente où je parle des numéros de côté pour les textures, c'est pareil)
public boolean canPlaceBlockAt(World world, int i, int j, int k)
est appelée quand le jeu veux savoir si le bloc peut être placé à un endroit précis.
public boolean blockActivated(World world, int i, int j, int k, EntityPlayer entityplayer)
est appelé quand le bloc à été activé (quand on a fait un clique doit dessus). Il donne un autre paramètre : le joueur qui l'a activé. Retourne false par défaut, je ne sais pas à quoi sa correspond.
public void onBlockPlaced(World world, int i, int j, int k, int l)
comme onBlockAdded mais on est sûr qu'il a été placer par le joueur
public void onBlockClicked(World world, int i, int j, int k, EntityPlayer entityplayer)
est appelée quand le bloc à été cliquer. Comme blockActivated, il nous donne le joueur.
public void onEntityCollidedWithBlock(World world, int i, int j, int k, Entity entity)
est appelée quand une entité frotte le bloc
public boolean isIndirectlyPoweringTo(World world, int i, int j, int k, int l)
est appelée quand le jeu veux savoir si le bloc donne de l'électricité (redstone) à un bloc. ATTENTION : vous devez ajouter une fonction "public boolean canProvidePower()" qui retourne true dans votre code si vous voulez utiliser cette fonction.
public void onBlockPlacedBy(World world, int i, int j, int k, EntityLiving entityliving)
est appelée quand le bloc est placé par une entité
Et c'est tout ! Enfin, même pas ! Il me reste 2 petits évènements à te présenter :
public void updateTick(World world, int i, int j, int k, Random random)
qui est appelé lorsque le jeu fait un tic, en gros dès qu'une nouvelle trame est généré. Elle nous donne une variable random qui correspond à un chiffre donné au pseudo-hasard. Là, c'est pas moi qu'il faut demandé, c'est TOI qui doit avoir les connaissances en Java.
public void randomDisplayTick(World world, int i, int j, int k, Random random)
celle-ci est appelé au hasard. Elle sert souvent à faire naître des particules tel que la fumée, ou des flammes. (on verra sa plus tard)
Tu peu aussi ajouter setTickOnLoad(true) dans la fonction principale de ton bloc pour que dès que le bloc est initialisé, la fonction updateTick est appelée. Tu peu aussi changé la vitesse du tic. Pour cela ajoute une fonction "public int tickRate()" qui retourne le temps d'intervalle (en millisecondes) entre chaques tics. Par défaut c'est 10.
Alors je poste déjà sa et je rédige la suite. @+ !
Dernière modification par nicotbb (15/06/2011 09:59:53)
Hors ligne
Maintenant quelques conditions à mettre dans un 'if'... (tous des booléen)
... que l'on peu savoir avec le niveau (World) :
isAirBlock(int i, int j, int k)
permet de savoir si le bloc positionné x, y, et z (i, j, et k) est de l'air
blockExists(int i, int j, int k)
permet de savoir si le bloc positionné x, y, et z existe.
isDaytime()
permet de savoir si il fait jour
entityJoinedWorld(Entity entity)
permet de savoir si une entité est née dans le niveau
isBlockIndirectlyGettingPowered(int i, int j, int k)
permet de savoir si le bloc positionné x, y et z est alimenté (redstone).
canBlockBeRainedOn(int i, int j, int k)
permet de savoir si il peut y avoir de la pluie sur le bloc positionné x, y et z.
... que l'on peu savoir avec une entité :
isInWater()
permet de savoir si l'entité est dans l'eau
isInsideOfMaterial(Material material)
permet de savoir si l'entité est "coincée" dans un certain matériel précisé en paramètre.
isEntityAlive()
permet de savoir si l'entité est vivante
isEntityInsideOpaqueBlock()
permet de savoir si l'entité est "coincée" dans un bloc opaque.
isBurning()
permet de savoir si l'entité est en feu.
isRiding()
permet de savoir si l'entité est en train de monter une autre entité (comme le joueur peu monté sur un cochon).
isSneaking()
permet de savoir si l'entité est en mode "sneak" (je pense que vous savez ce que c'est ^^)
Et je continu mon tuto avec les actions que l'on peu effectuer au entités :
setEntityDead()
pour tuer l'entité
setSize(float f, float f1)
pour lui donner une taille
etRotation(float f, float f1)
pour lui donner sa rotation
setPosition(double d, double d1, double d2)
pour la changer de position
kill()
ben heu.... je pense que vous savez ce que sa va faire
moveEntity(double d, double d1, double d2)
pour la faire bouger
moveFlying(float f, float f1, float f2)
pour la faire voler
setPositionAndRotation(double d, double d1, double d2, float f, float f1)
pour lui attribuer sa rotation et sa position
addVelocity(double d, double d1, double d2)
pour lui ajouter de la vélocité (d = x, d1 = y, d2 = z)
setBeenAttacked()
pour lui dire qu'elle est attaquée
dropItem(int i, int j)
pour lui faire lâcher un item (i = id de l'item, j le nombre)
Alors comme sa faisais longtemps que je n'avais pas pris mon exemple de mod Jump. On va donc faire en sorte que si le bloc est alimenté en redstone, si une entité passe dessus elle se fait caaaataaapuuuuultééééé ! Niark Niark ! Pour cela rien de plus simple, il suffit d'ajouter dans BlockJump.java :
public void onEntityWalking(World world, int i, int j, int k, Entity entity) {
if(world.isBlockIndirectlyGettingPowered(i, j, k)) {
entity.addVelocity(0, 2.0F, 0); //On ne touche que a la valeur y (vertical)
}
}
Et maintenant je vais vous présenter la fonction spawnParticle d'un niveau (World). En voici le prototype :
public void spawnParticle(String type, double x, double y, double z, double r, double v, double b)
le premier paramètre permet de préciser quel type de particule on veux, les 3 suivant sa position, et les 3 autres sa couleur.
Pour le type :
flame, une flamme
smoke, de la fumée
reddust, de la fumée de redstone
J'ai donc fait comme sa dans mon code BlockJump.java :
public void randomDisplayTick(World world, int i, int j, int k, Random random) {
if(world.isBlockIndirectlyGettingPowered(i, j, k)) {
world.spawnParticle("reddust", i + 0.5F, j + 1.1F, k + 0.5F, 0.0D, 0.0D, 0.0D);
}
}
Sa va donc faire apparaître une particule un peu au-dessus du bloc, et au milieu en largeur et en hauteur.
Voili voilou. La prochaine fois on verra les MetaData d'un bloc, puis plus tard les entités, puis encore plus tard la GUI.
Hors ligne
Nickel c'est bien sa que je voulais, j'ai enfin trouvé notamment en copiant le code du bloc "cob" (toile d'araignée).
Par rapport à ce que tu propose, et pour éviter l'effet x-ray il suffit de rajouter le code suivant :
[...]
public boolean isOpaqueCube()
{
return false;
}
[...]
Et pour que la texture de l'objet soit comme une pousse d'arbre (2 faces) il faut ajouter le code suivant :
[...]
public int getRenderType()
{
return 1;
}
}
[...]
Hors ligne
encore merci et vivement la suite!!!
ou trouve tu toute ces commande?
tu n'a pas une commande qui renvoie les coordonner du bloc qui fait l'action et l'id d'un bloc en fonction de c'est coordonner?
edit: plus simplement une commande pour déplacer un cube?
Dernière modification par Nibor (16/06/2011 12:31:52)
Hors ligne
Re tout le monde,
en attendant la suite de mon tuto, je voulais vous montrer une vidéo de ce que je suis entrain de faire. (Au passage : je répondrai à ta question après Nibor, et merci à Cap'tain Cookies) :
Voili Voilou !!! @+ !
Hors ligne
Merci pour ce tuto mais j'ai un problème en suivant ton deuxième message. Je fais ce qu'il faut mais pourtant lorsque je lance recompile.dat ça me met le message d'erreur suivant :
src\minecraft\net\minecraft\src\mod_Jump.java:7: expected
public static Item Ressort
^
Que dois-je faire ? J'ai essayé plusieurs choses mais je ne parviens pas à régler ce problème.
Merci d'avance.
Hors ligne