J'ai créé un bloc (mod), comment le mettre en SMP ?

  • Auteur de la discussion Auteur de la discussion Laugilus
  • Date de début Date de début

Laugilus

Aventurier
17 Mai 2011
4
0
0
Bonsoir,

Grâce au tutoriel présent sur le site, j'ai fait un mod (un bloc). Le bloc remplit une fonction basique : avec ma soeur, il détruit ce qu'il y a devant lui au contact de la redstone. (C'est plus compliqué, mais je passe les détails.)

Le mod fonctionne parfaitement en solo. Seulement, jouant en LAN, je n'ai pas de parti solo, et j'aurais bien aimé que mon bloc puisse fonctionner en multijoueur.

J'ai essayé plusieurs choses, mais toutes ont échoués.
J'ai essayé de mettre mon mod dans minecraf_server.jar, mais le serveur ne fonctionnait alors plus.
J'ai essayé avec ModLoaderMP. Ainsi dans minecraft.jar, j'ai mis : ModLoader, ModLoarderMP, mon mod, et j'ai supprimé META-INF. Dans le serveur, j'ai mis ModLoarderMP Server. Le serveur se lance. En SSP, mon mod fonctionne toujours. Mais en SMP, je ne peux pas me connecter au serveur. J'obtiens ce message : Lost Connection : java.io.IOException : bad packet id 230;

Je suis assez désespéré... Si quelqu'un a une idée pour mettre un bloc créé en SMP. (Le problème se résume juste à ça : j'ai créé un bloc, je voudrais le mettre en multijoueur). Merci d'avance.

Les sources si besoin :

Le fichier qui définie le bloc.Presque identique à BlockDispenser.java, excepté pour une fonction (updateTick).
Code:
// BlockMiner.java
package net.minecraft.src;

import java.util.Random;

public class BlockMiner extends BlockContainer {

	private ItemPickaxe myPickAxe;

	public BlockMiner(int i)
    {
        super(i, Material.rock);
        blockIndexInTexture = 45;
		random = new Random();
    }

    public int tickRate()
    {
        return 4;
    }

    public int idDropped(int i, Random random)
    {
        return blockID;
    }

    public void onBlockAdded(World world, int i, int j, int k)
    {
        super.onBlockAdded(world, i, j, k);
        setMinerDefaultDirection(world, i, j, k);
    }

    private void setMinerDefaultDirection(World world, int i, int j, int k)
    {
        if(world.multiplayerWorld)
        {
            return;
        }
        int l = world.getBlockId(i, j, k - 1);
        int i1 = world.getBlockId(i, j, k + 1);
        int j1 = world.getBlockId(i - 1, j, k);
        int k1 = world.getBlockId(i + 1, j, k);
        byte byte0 = 3;
        if(Block.opaqueCubeLookup[l] && !Block.opaqueCubeLookup[i1])
        {
            byte0 = 3;
        }
        if(Block.opaqueCubeLookup[i1] && !Block.opaqueCubeLookup[l])
        {
            byte0 = 2;
        }
        if(Block.opaqueCubeLookup[j1] && !Block.opaqueCubeLookup[k1])
        {
            byte0 = 5;
        }
        if(Block.opaqueCubeLookup[k1] && !Block.opaqueCubeLookup[j1])
        {
            byte0 = 4;
        }
        world.setBlockMetadataWithNotify(i, j, k, byte0);
    }

    public int getBlockTexture(IBlockAccess iblockaccess, int i, int j, int k, int l)
    {
        if(l == 1)
        {
            return blockIndexInTexture + 17;
        }
        if(l == 0)
        {
            return blockIndexInTexture + 17;
        }
        int i1 = iblockaccess.getBlockMetadata(i, j, k);
        if(l != i1)
        {
            return blockIndexInTexture;
        } else
        {
            return blockIndexInTexture + 1;
        }
    }

    public int getBlockTextureFromSide(int i)
    {
        if(i == 1)
        {
            return blockIndexInTexture + 17;
        }
        if(i == 0)
        {
            return blockIndexInTexture + 17;
        }
        if(i == 3)
        {
            return blockIndexInTexture + 1;
        } else
        {
            return blockIndexInTexture;
        }
    }

    public boolean blockActivated(World world, int i, int j, int k, EntityPlayer entityplayer)
    {
        if(world.multiplayerWorld)
        {
            return true;
        } else
        {
            TileEntityDispenser tileentitydispenser = (TileEntityDispenser)world.getBlockTileEntity(i, j, k);
            entityplayer.displayGUIDispenser(tileentitydispenser);
            return true;
        }
    }

    protected TileEntity getBlockEntity()
    {
        return new TileEntityDispenser();
    }

    private void mineBlock(World world, int i, int j, int k)
    {
        int direction = world.getBlockMetadata(i, j, k);
		TileEntityDispenser tileentitydispenser = (TileEntityDispenser)world.getBlockTileEntity(i, j, k);
		if (direction == 2)
			k -= 1;
		else if (direction == 3)
			k += 1;
		else if (direction == 5)
			i += 1;
		else if (direction == 4)
			i -= 1;
		int block_id = world.getBlockId(i, j, k);
        if (block_id != 0) {
			for (int ii = 0; ii < 9; ii++) {
				ItemStack itemstack = tileentitydispenser.getStackInSlot(ii);
				if (itemstack == null)
					continue;
				Item item = itemstack.getItem();
				if ((item.shiftedIndex == Item.pickaxeWood.shiftedIndex || item.shiftedIndex == Item.pickaxeStone.shiftedIndex ||
				item.shiftedIndex == Item.pickaxeSteel.shiftedIndex || item.shiftedIndex == Item.pickaxeGold.shiftedIndex ||
				item.shiftedIndex == Item.pickaxeDiamond.shiftedIndex) && item.canHarvestBlock(Block.blocksList[block_id])) {
				
					if (itemstack.getItemDamage()+1 < itemstack.getMaxDamage())
						tileentitydispenser.setInventorySlotContents(ii, new ItemStack(item, 1, itemstack.getItemDamage()+1));
					else
						tileentitydispenser.setInventorySlotContents(ii, null);
				
					int block_id_dropped = Block.blocksList[block_id].idDropped(0, new Random());
					world.setBlockWithNotify(i, j, k, 0);
					world.entityJoinedWorld(new EntityItem(world, (float)i+.5f, (float)j+.5f, (float)k+.5f, new ItemStack(block_id, 1, 0)));
					
				}
			}
		}
    }
	
	public void onBlockRemoval(World world, int i, int j, int k)
    {
        TileEntityDispenser tileentitychest = (TileEntityDispenser)world.getBlockTileEntity(i, j, k);
		label0:
        for(int l = 0; l < 9; l++)
        {
            ItemStack itemstack = tileentitychest.getStackInSlot(l);
            if(itemstack == null)
                continue;
            float f = random.nextFloat() * 0.8F + 0.1F;
            float f1 = random.nextFloat() * 0.8F + 0.1F;
            float f2 = random.nextFloat() * 0.8F + 0.1F;
            do
            {
                if(itemstack.stackSize <= 0)
                {
                    continue label0;
                }
                int i1 = random.nextInt(21) + 10;
                if(i1 > itemstack.stackSize)
                {
                    i1 = itemstack.stackSize;
                }
                itemstack.stackSize -= i1;
                EntityItem entityitem = new EntityItem(world, (float)i + f, (float)j + f1, (float)k + f2, new ItemStack(itemstack.itemID, i1, itemstack.getItemDamage()));
                float f3 = 0.05F;
                entityitem.motionX = (float)random.nextGaussian() * f3;
                entityitem.motionY = (float)random.nextGaussian() * f3 + 0.2F;
                entityitem.motionZ = (float)random.nextGaussian() * f3;
                world.entityJoinedWorld(entityitem);
            } while(true);
        }

        super.onBlockRemoval(world, i, j, k);
    }

    public void onNeighborBlockChange(World world, int i, int j, int k, int l)
    {
		if(l > 0 && Block.blocksList[l].canProvidePower() && (world.isBlockIndirectlyGettingPowered(i, j, k) || world.isBlockIndirectlyGettingPowered(i, j + 1, k))) {
			world.scheduleBlockUpdate(i, j, k, blockID, tickRate());
		}
    }

    public void updateTick(World world, int i, int j, int k, Random random)
    {
        if(world.isBlockIndirectlyGettingPowered(i, j, k) || world.isBlockIndirectlyGettingPowered(i, j + 1, k))
        {
            mineBlock(world, i, j, k);
        }
    }

    public void onBlockPlacedBy(World world, int i, int j, int k, EntityLiving entityliving)
    {
        int l = MathHelper.floor_double((double)((entityliving.rotationYaw * 4F) / 360F) + 0.5D) & 3;
        if(l == 0)
        {
            world.setBlockMetadataWithNotify(i, j, k, 2);
        }
        if(l == 1)
        {
            world.setBlockMetadataWithNotify(i, j, k, 5);
        }
        if(l == 2)
        {
            world.setBlockMetadataWithNotify(i, j, k, 3);
        }
        if(l == 3)
        {
            world.setBlockMetadataWithNotify(i, j, k, 4);
        }
    }
	
	private Random random;

}

Le fichier qui enregistre le bloc.
Code:
// mod_CobbleFactory.java
package net.minecraft.src;
public class mod_CobbleFactory extends BaseMod {

	public mod_CobbleFactory() {
		ModLoader.RegisterBlock(miner);
		ModLoader.AddName(miner, "Miner");
		ModLoader.AddRecipe(new ItemStack(miner, 1), new Object[]
		{"###", "#X#", "#Z#",Character.valueOf('#'), Block.cobblestone, Character.valueOf('X'), Block.lever, Character.valueOf('Z'), Item.redstone});
	}

	public static final Block miner = (new BlockMiner(96)).setHardness(3.5F).setStepSound(Block.soundStoneFootstep).setBlockName("miner");

	public String Version() {
		return "1.5_01";
	}

}
 
C'est impossible de metre des mods ajoutants de le 3D en multi, seuls les mods qui n'affectent pas le serveur (x-ray, better grass...) sont compatible. Désolé.
Cordialement, ThePtitcolas
 
Merci de ta réponse. Je suis au moins fixé^^.

Cependant, j'avoue ne pas être très convaincu :-( . J'ai lu sur des forums anglais, sur des serveurs, qu'il y a des serveurs multi où l'on peut utiliser des avions, et des guns. (Il y a bien ajout de la 3D) (cf, le lien de mon premier message)

De plus mon bloc n'a pas de texture propre, il utilise celle du dispenser.

Alors ?:mobcreeper:

Merci tout de même^^.
 
Si tu utilises le serveur que tu peux téléchargé sur minecraft.net, c'est tout à fait possible, décompile le jar client et le jar serveur, il faut que tu réécrives ton mod dans le serveur, pas juste mettre les class modifiées dans le .jar.
Pour moi ça a fonctionné mais sans utiliser ModLoader, donc il faudrait peut être que tu modifies les class de minecraft.
 
  • J'aime
Reactions: gammagone
Merci de ta réponse.

Je me suis passé de ModLoader, et maintenant ça marche aussi bien en SSP qu'en SMP !

Cependant, un problème minime subsiste : avec ModLoader, j'arrivais à donner un nom à mon bloc, (avec AddName()). Mais sans, je ne vois pas du tout comment faire. Je n'arrive pas à trouver comment Notch a nommé ses propres blocs, donc je n'arrive pas à en faire autant.
Le résultat est que quand j'ouvre l'inventaire et que je passe la souris sur mon bloc, aucun nom n'apparait.

Bref, ce n'est pas gênant, c'est juste un détail.

Merci encore.

Si quelqu'un sait comment faire pour le nom, je suis preneur.
 
Pour le nom sans ModLoader il faut éditer en_US.lang avec le bloc-note, ce fichier est situé dans le dossier lang (temp/micraft/lang pour aller le modifier à partir du dossier MCP et avoir les noms dans la version test, sinon c'est directement minecraft.jar/lang)

Regarde un peu comment sont nommés les blocks/items, isls ont à la fin si je me rappelle bien, n'oublie pas de mettre les deux lignes (tu comprendras :))
 
Tu peux mieux éxpliquer ton mod?
Je suis intéréssé :)
 
Hello !

Je pense que pour le côté client il faille faire comme expliqué dans les tutoriels, pour la parti Serveur je pense qu'il faille faire presque pareil, la différence je pense ce situe dans le faite d'utiliser le minecraft_server.jar qu'on trouve sur le site officiel et de refaire les mêmes manipulations que pour la parti client, a tester.

Cordialement,
plop.