Faire une entité montable : le packet



  • Salut
    L'année dernière, j'ai créer un renne. Cette année, j'ai voulu faire en sorte qu'on puisse monter dessus et bouger avec (un peu comme un cheval (j'aurai aussi voulu qu'il puisse voler si on pointe la souris en l'air, mais je verrais ça plus tard)).
    J'ai pris longtemps, mais j'ai réussi.

    Seul problème : quand on bouge, il revient à sa position d'origine quelques secondes plus tard. Si j'ai bien compris, c'est parce que le server "ne sait pas" qu'il bouge, et qu'il faut utiliser un packet. J'ai donc suivi le tuto pour ajouter des packets, mais je ne sais pas comment les exploiter pour mon cas (récupérer la position du renne ?).

    Voilà mes classes :
    Dans la classe principale :

    public static SimpleNetworkWrapper network;
    

    Dans la classe principale (dans la fonction pré init) :

    network = NetworkRegistry.INSTANCE.newSimpleChannel(MODID);
    network.registerMessage(NetworkMessageHandler.class, NetworkMessage.class, 0, Side.SERVER);
    

    NetworkMessageHandler :

    package This_is_Christmas;
    
    import cpw.mods.fml.common.network.simpleimpl.IMessage;
    import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
    import cpw.mods.fml.common.network.simpleimpl.MessageContext;
    
    public class NetworkMessageHandler implements IMessageHandler<networkmessage, imessage="">{
    
    @Override
    public IMessage onMessage(NetworkMessage message, MessageContext ctx)
    {
    System.out.println(message.ReindeerRiding);
    // What packet will doing ?
    
    return null;
    }
    
    }
    
    

    NetworkMessage :

    package This_is_Christmas;
    
    import cpw.mods.fml.common.network.ByteBufUtils;
    import cpw.mods.fml.common.network.simpleimpl.IMessage;
    import io.netty.buffer.ByteBuf;
    
    public class NetworkMessage implements IMessage{
    
    public String ReindeerRiding;
    
    public NetworkMessage()
    {
    
       }
    
    public NetworkMessage(String string)
    {
    ReindeerRiding = string;
       }
    
    @Override
    public void fromBytes(ByteBuf buf)
    {
    ReindeerRiding = ByteBufUtils.readUTF8String(buf);
    }
    
    @Override
    public void toBytes(ByteBuf buf)
    {
    ByteBufUtils.writeUTF8String(buf, ReindeerRiding);
    }
    
    }
    
    

    De plus, j'ai mis ```java
    This_is_Christmas.This_is_Christmas.network.sendToServer(new NetworkMessage(networkmessage.ReindeerRiding));

    
    Voilà, si vous savez comment faire, …
    
    Merci d'avance</networkmessage,>


  • Regarde la classe du cheval car normalement ça se fait automatiquement



  • Salut
    J'ai cherché dans la classe du cheval et je n'ai rien trouvé. J'ai aussi regarder dans la classe du cochon, rien non plus.
    J'ai encore recherché sur Internet et j'ai trouvé : apparamment, je n'utilisais pas le bon code. Voilà celui que j'ai trouvé qui marche :

    public void moveEntityWithHeading(float p_70612_1_, float p_70612_2_)
    {
       if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityLivingBase)
       {
           this.prevRotationYaw = this.rotationYaw = this.riddenByEntity.rotationYaw;
           this.rotationPitch = this.riddenByEntity.rotationPitch * 0.5F;
           this.setRotation(this.rotationYaw, this.rotationPitch);
           this.rotationYawHead = this.renderYawOffset = this.rotationYaw;
           p_70612_1_ = ((EntityLivingBase)this.riddenByEntity).moveStrafing * 0.5F;
           p_70612_2_ = ((EntityLivingBase)this.riddenByEntity).moveForward;
    
           if (p_70612_2_ <= 0.0F)
           {
               p_70612_2_ *= 0.25F;
           }
    
           this.stepHeight = 1.0F;
           this.jumpMovementFactor = this.getAIMoveSpeed() * 0.1F;
    
           if (!this.worldObj.isRemote)
           {
               this.setAIMoveSpeed((float)this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue());
               super.moveEntityWithHeading(p_70612_1_, p_70612_2_);
           }
    
           this.prevLimbSwingAmount = this.limbSwingAmount;
           double d1 = this.posX - this.prevPosX;
           double d0 = this.posZ - this.prevPosZ;
           float f4 = MathHelper.sqrt_double(d1 * d1 + d0 * d0) * 4.0F;
    
           if (f4 > 1.0F)
           {
               f4 = 1.0F;
           }
    
           this.limbSwingAmount += (f4 - this.limbSwingAmount) * 0.4F;
           this.limbSwing += this.limbSwingAmount;
       }
       else
       {
           this.stepHeight = 0.5F;
           this.jumpMovementFactor = 0.02F;
           super.moveEntityWithHeading(p_70612_1_, p_70612_2_);
       }
    }
    

    Maintenant, quand je bouge avec le renne, il est "synchro" et ne rollback plus.

    Merci 😉