Проблема с летающим entity

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.7.10
Я сделал entity по типу лодки из майнкрафта и добавил кнопки space и z, но когда один человек летает и другой нажимает одну из этих кнопок, то у человека который нажал кнопку видно как entity взлетает. Как решить эту проблему?
Вот код для взлета и снижения
Java:
                if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
                    this.motionY = this.motionY + 0.01;
                }
                if (Keyboard.isKeyDown(Keyboard.KEY_Z)) {
                    this.motionY = this.motionY - 0.01;
                }
Вот весь код entity
Java:
package blackcloverSit;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityBoat;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;

import java.util.List;

import org.lwjgl.input.Keyboard;

import blackcloverweapon1.obj_item1.ModItemObj;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class EntitySit extends Entity {

    private boolean isBoatEmpty;
    private int boatPosRotationIncrements;
    private double boatX;
    private double boatY;
    private double boatZ;
    private double boatYaw;
    private double boatPitch;
    private double speedMultiplier;
    public EntitySit(World world) {
        super(world);
        this.height = 0.8F;
        this.setPosition(0.0D, 2.0D, 0.0D);    
    }

    @Override
    public void entityInit() {
        /*У нашего Entity нет своего рендера, если размер не задать по 0F, то
        будет рендриться белый */
        setSize(0.3F, 0.3F);
        /*Не знаю точно зачем это нужно, но я написал.
        Знаю что оно используется для трекера Entity и ещё какого-то пакета*/
        myEntitySize = Entity.EnumEntitySize.SIZE_1;
    }

    @Override
    public void onEntityUpdate() {
        super.onEntityUpdate();
        if (riddenByEntity == null) {
            setDead();    
        }
    }

    @SideOnly(Side.CLIENT)
    @Override
    public float getShadowSize() {
        return 0.0F;//Чтобы не было тени от этого Entity.
    }

    @Override
    public void readEntityFromNBT(NBTTagCompound nbt) {
        // TODO Auto-generated method stub
    }

    @Override
    public void writeEntityToNBT(NBTTagCompound nbt) {
        // TODO Auto-generated method stub
    }
    public void onUpdate()
    {
        super.onUpdate();

        if (this.getTimeSinceHit() > 0)
        {
            this.setTimeSinceHit(this.getTimeSinceHit() - 1);
        }

        if (this.getDamageTaken() > 0.0F)
        {
            this.setDamageTaken(this.getDamageTaken() - 1.0F);
        }

        this.prevPosX = this.posX;
        this.prevPosY = this.posY;
        this.prevPosZ = this.posZ;
        byte b0 = 5;
        double d0 = 0.0D;

        for (int i = 0; i < b0; ++i)
        {
            double d1 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(i + 0) / (double)b0 - 0.125D;
            double d3 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(i + 1) / (double)b0 - 0.125D;
            AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.boundingBox.minX, d1, this.boundingBox.minZ, this.boundingBox.maxX, d3, this.boundingBox.maxZ);

            if (this.worldObj.isAABBInMaterial(axisalignedbb, Material.air))
            {
                d0 += 1.0D / (double)b0;
            }
        }

        double d10 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ);
        double d2;
        double d4;
        int j;

        if (d10 > 0.26249999999999996D)
        {
            d2 = Math.cos((double)this.rotationYaw * Math.PI / 180.0D);
            d4 = Math.sin((double)this.rotationYaw * Math.PI / 180.0D);

            for (j = 0; (double)j < 1.0D + d10 * 60.0D; ++j)
            {
                double d5 = (double)(this.rand.nextFloat() * 2.0F - 1.0F);
                double d6 = (double)(this.rand.nextInt(2) * 2 - 1) * 0.7D;
                double d8;
                double d9;

            }
        }

        double d11;
        double d12;

        if (this.worldObj.isRemote && this.isBoatEmpty)
        {
            if (this.boatPosRotationIncrements > 0)
            {
                d2 = this.posX + (this.boatX - this.posX) / (double)this.boatPosRotationIncrements;
                d4 = this.posY + (this.boatY - this.posY) / (double)this.boatPosRotationIncrements;
                d11 = this.posZ + (this.boatZ - this.posZ) / (double)this.boatPosRotationIncrements;
                d12 = MathHelper.wrapAngleTo180_double(this.boatYaw - (double)this.rotationYaw);
                this.rotationYaw = (float)((double)this.rotationYaw + d12 / (double)this.boatPosRotationIncrements);
                this.rotationPitch = (float)((double)this.rotationPitch + (this.boatPitch - (double)this.rotationPitch) / (double)this.boatPosRotationIncrements);
                --this.boatPosRotationIncrements;
                this.setPosition(d2, d4, d11);
                this.setRotation(this.rotationYaw, this.rotationPitch);
            }
            else
            {
                d2 = this.posX + this.motionX;
                d4 = this.posY + this.motionY;
                d11 = this.posZ + this.motionZ;
                this.setPosition(d2, d4, d11);

                if (this.onGround)
                {
                    this.motionX *= 0.5D;
                    this.motionY *= 0.5D;
                    this.motionZ *= 0.5D;
                }

                this.motionX *= 0.9900000095367432D;
                this.motionY *= 0.949999988079071D;
                this.motionZ *= 0.9900000095367432D;
            }
        }
        else
        {

            if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityLivingBase)
            {
                EntityLivingBase entitylivingbase = (EntityLivingBase)this.riddenByEntity;
                float f = this.riddenByEntity.rotationYaw + -entitylivingbase.moveStrafing * 90.0F;
                this.motionX += -Math.sin((double)(f * (float)Math.PI / 180.0F)) * this.speedMultiplier * (double)entitylivingbase.moveForward * 1.05000000074505806D;
                this.motionZ += Math.cos((double)(f * (float)Math.PI / 180.0F)) * this.speedMultiplier * (double)entitylivingbase.moveForward * 1.05000000074505806D;
                if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
                    this.motionY = this.motionY + 0.01;
                }
                if (Keyboard.isKeyDown(Keyboard.KEY_Z)) {
                    this.motionY = this.motionY - 0.01;
                }
            }
        }
            d2 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ);

            if (d2 > 0.35D)
            {
                d4 = 0.35D / d2;
                this.motionX *= d4;
                this.motionZ *= d4;
                d2 = 0.35D;
            }

            if (d2 > d10 && this.speedMultiplier < 0.35D)
            {
                this.speedMultiplier += (0.35D - this.speedMultiplier) / 35.0D;

                if (this.speedMultiplier > 0.35D)
                {
                    this.speedMultiplier = 0.35D;
                }
            }
            else
            {
                this.speedMultiplier -= (this.speedMultiplier - 0.07D) / 35.0D;

                if (this.speedMultiplier < 0.07D)
                {
                    this.speedMultiplier = 0.07D;
                }
            }

            int l;

            for (l = 0; l < 4; ++l)
            {
                int i1 = MathHelper.floor_double(this.posX + ((double)(l % 2) - 0.5D) * 0.8D);
                j = MathHelper.floor_double(this.posZ + ((double)(l / 2) - 0.5D) * 0.8D);

                for (int j1 = 0; j1 < 2; ++j1)
                {
                    int k = MathHelper.floor_double(this.posY) + j1;
                    Block block = this.worldObj.getBlock(i1, k, j);

                }
            }

            if (this.onGround)
            {
                this.motionX *= 0.5D;
                this.motionY *= 0.5D;
                this.motionZ *= 0.5D;
            }

            this.moveEntity(this.motionX, this.motionY, this.motionZ);

            if (this.isCollidedHorizontally && d10 > 0.2D)
            {
                if (!this.worldObj.isRemote && !this.isDead)
                {
                    this.setDead();

                    for (l = 0; l < 1; ++l)
                    {
                        this.func_145778_a(Items.stick, 1, 0.0F);
                        this.func_145778_a(Items.wheat, 1, 0.0F);
                    }

                }
            }
            else
            {
                this.motionX *= 0.9900000095367432D;
                this.motionY *= 0.949999988079071D;
                this.motionZ *= 0.9900000095367432D;
            }

            this.rotationPitch = 0.0F;
            d4 = (double)this.rotationYaw;
            d11 = this.prevPosX - this.posX;
            d12 = this.prevPosZ - this.posZ;

            if (d11 * d11 + d12 * d12 > 0.001D)
            {
                d4 = (double)((float)(Math.atan2(d12, d11) * 180.0D / Math.PI));
            }

            double d7 = MathHelper.wrapAngleTo180_double(d4 - (double)this.rotationYaw);

            if (d7 > 20.0D)
            {
                d7 = 20.0D;
            }

            if (d7 < -20.0D)
            {
                d7 = -20.0D;
            }

            this.rotationYaw = (float)((double)this.rotationYaw + d7);
            this.setRotation(this.rotationYaw, this.rotationPitch);

            if (!this.worldObj.isRemote)
            {
                List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D));

                if (list != null && !list.isEmpty())
                {
                    for (int k1 = 0; k1 < list.size(); ++k1)
                    {
                        Entity entity = (Entity)list.get(k1);

                        if (entity != this.riddenByEntity && entity.canBePushed() && entity instanceof EntityBoat)
                        {
                            entity.applyEntityCollision(this);
                        }
                    }
                }
                

                if (this.riddenByEntity != null && this.riddenByEntity.isDead)
                {
                    this.riddenByEntity = null;
                }
            }
        }
    

    private void setDamageTaken(float f) {
        // TODO Auto-generated method stub
        
    }

    float getDamageTaken() {
        // TODO Auto-generated method stub
        return 0;
    }

    private void setTimeSinceHit(int i) {
        // TODO Auto-generated method stub
        
    }

    int getTimeSinceHit() {
        // TODO Auto-generated method stub
        return 0;
    }

    public float getForwardDirection() {
        // TODO Auto-generated method stub
        return 0;
    }

}
 
3,005
192
592
@Bogovinka У тебя все кнопки находятся только на клиенте. Движение нужно делать на сервере.
Кроме как через пакеты нету возможности передать что-либо с клиента на сервер.
 
5,018
47
783
Я делал что то похожее. Если хочешь скину код той лодки
 
@Agravaine
В чем ошибка?
1566817119529.png
Вот код
Java:
package knopki;

import blackcloverSit.EntitySit;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.network.FMLNetworkEvent;
import cpw.mods.fml.common.network.internal.FMLProxyPacket;
import cpw.mods.fml.relauncher.Side;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;

public class Packet
{
  public static final String CHANNEL = "BlackClover:Broom";
  
  @SubscribeEvent
  public void onServerPacket(FMLNetworkEvent.ServerCustomPacketEvent event)
  {
    if (event.packet.channel().equals("Quidcraft:Broom")) {
      handle(event.packet, ((NetHandlerPlayServer)event.handler).field_147369_b);
    }
  }
  
  private void handle(FMLProxyPacket packet, EntityPlayer player)
  {
    ByteBuf buf = packet.payload();
    short data = buf.readShort();
    Entity ent = player.ridingEntity;
    if ((ent != null) && ((ent instanceof EntitySit)))
    {
      ((EntitySit)ent).isGoingUp = false;
      ((EntitySit)ent).isGoingDown = false;
      if (data == 1) {
        ((EntitySit)ent).isGoingUp = true;
      } else if (data == 2) {
        ((EntitySit)ent).isGoingDown = true;
      }
    }
  }
  
  public static FMLProxyPacket getPacket(int i, Side side)
  {
    ByteBuf payload = Unpooled.buffer();
    payload.writeShort(i);
    FMLProxyPacket packet = new FMLProxyPacket(payload, "BlackClover:Broom");
    packet.setTarget(side);
    return packet;
  }
}
 
Я делал что то похожее. Если хочешь скину код той лодки
Было бы очень хорошо. Если не сложно, то скинь. Я буду очень благодарен.
 
7,099
324
1,510
Попробуй это. CCL предоставляет довольно простое апи для пакетной системы
 
@hohserg1 вот у меня до пакетов был вот такой взлет
Java:
                if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
                    this.motionY = this.motionY + 0.01;
                }
                if (Keyboard.isKeyDown(Keyboard.KEY_Z)) {
                    this.motionY = this.motionY - 0.01;
                }
Теперь я сделал через бинды и отправил пакет и как теперь сделать чтоб ENTITY что-то делал по нажатию этой кнопки?
 
7,099
324
1,510
Твоя реализация IServerPacketHandler примет пакет о том, что игрок нажал на кнопку и продвинет лодку, в которой он сидит
 
3,005
192
592
Тебе нужно когда кнопка нажата - слать пакет на сервер.
А на сервере получать entity и делать его движение.
 
3,005
192
592
Мне кажется, или челик требует код, потому что даже не знает основ явы? 🙄
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху