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).
Le fichier qui enregistre le bloc.
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";
}
}