[1.7.10]再ログインした場合にEntityの向きが保存されない(自己解決済)

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.285886)

[1.7.10]再ログインした場合にEntityの向きが保存されない(自己解決済)

投稿記事by zyando123 » 2016年10月17日(月) 21:20

forge-1.7.10-10.13.4.1558-1.7.10で開発をしています。

新しくEntityを追加したのですが、再ログインした場合にEntityの向き(rotationYawとrotationPitch)が保存されません。
色々と調べてみるとサーバー側の情報は保存されているのですが、クライアント側の情報がサーバー側と同期されていない(Renderに反映されていない)様でした。

追記:NetHandlerPlayClient#handleEntityVelocity(S12PacketEntityVelocity)でEntity#setVelocity(double, double, double)を実行してクライアントと向きを同期しているようなのですが、motionから向きを計算しているので動いていないと向きが更新されないようです。

Entity
コード: 全て選択
public abstract class EntityMagicCircle extends Entity
{
   public Entity shootingEntity;
   
   public int livingTimeCount = 0;
   public int livingLimit = 1000;
   private boolean rotationChanged;
   
   public EntityMagicCircle(World world)
   {
       super(world);
       this.setSize(4F, 4F);
       this.yOffset = -0.0F;
   }

   public EntityMagicCircle(World world, Entity entity)
   {
        this(world);

        this.setSize(4F, 4F);
        this.yOffset = 0.0F;
        this.shootingEntity = entity;
       
        this.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch);
       
        this.motionX = ((double) (-MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * MathHelper
                  .cos(this.rotationPitch / 180.0F * (float) Math.PI)));
      this.motionZ = ((double) (MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * MathHelper
                  .cos(this.rotationPitch / 180.0F * (float) Math.PI)));
      this.motionY = ((double) (-MathHelper.sin(this.rotationPitch / 180.0F * (float) Math.PI)));
      
      this.posX += this.motionX * 2;
      this.posY += this.motionY * 2 - 0.3;
      this.posZ += this.motionZ * 2;
      
      this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, 0.00F);
    }

   @Override
   protected void entityInit()
   {
      this.dataWatcher.addObject(15, Byte.valueOf((byte)0));
      this.dataWatcher.addObject(16, Byte.valueOf((byte)0));
      this.dataWatcher.addObject(17, Byte.valueOf((byte)0));
      this.dataWatcher.addObject(18, Byte.valueOf((byte)0));
      this.dataWatcher.addObject(20, Byte.valueOf((byte)0));
      this.dataWatcher.addObject(19, Byte.valueOf((byte)0));
   }

   @Override
   protected void readEntityFromNBT(NBTTagCompound nbt)
   {
      this.livingTimeCount = nbt.getInteger("livingTimeCount");
      this.setType(nbt.getInteger("type"));
      this.setRGB(nbt.getByteArray("rgb"));
   }
   
   @Override
   protected void writeEntityToNBT(NBTTagCompound nbt)
   {
      nbt.setInteger("livingTimeCount", this.livingTimeCount);
      nbt.setByteArray("rgb", new byte[]{this.getRed(), this.getGreen(), this.getBlue()});
   }

   @Override
   @SideOnly(Side.CLIENT)
   public void setPositionAndRotation2(double par1, double par3, double par5, float par7, float par8, int par9)
   {
      this.setPosition(par1, par3, par5);
      this.setRotation(par7, par8);
   }

   @Override
   @SideOnly(Side.CLIENT)
   public void setVelocity(double par1, double par3, double par5)
   {
      this.motionX = par1;
      this.motionY = par3;
      this.motionZ = par5;
   }
   
   public void setThrowableHeading(double par1, double par3, double par5, float par7)
    {
      float f2 = MathHelper.sqrt_double(par1 * par1 + par3 * par3 + par5 * par5);
      par1 /= f2;
      par3 /= f2;
      par5 /= f2;
      par1 *= par7;
      par3 *= par7;
      par5 *= par7;
      this.motionX = par1;
      this.motionY = par3;
      this.motionZ = par5;
    }
   
   @SideOnly(Side.CLIENT)
   @Override
    public boolean canRenderOnFire() {return false;}
   public void setLevel(int level){}

    @Override
   public boolean shouldRenderInPass(int pass)
   {
      return pass == 1;
   }
   
   /**
    * テクスチャの種類を更新する
    */
   public void setType(int type)
    {
        this.dataWatcher.updateObject(19, Byte.valueOf((byte)type));
    }
   
    public int getType()
    {
        return this.dataWatcher.getWatchableObjectByte(19);
    }
   
   private void setRGB(byte[] argb)
   {
      if(argb.length != 3)
         return;
      
      this.dataWatcher.updateObject(16, Byte.valueOf(argb[1]));
      this.dataWatcher.updateObject(17, Byte.valueOf(argb[2]));
      this.dataWatcher.updateObject(18, Byte.valueOf(argb[3]));
   }
   
   /**
    * 弾の色を0~255で指定する
    */
   public void setRGB(int red, int green, int blue)
   {
      this.dataWatcher.updateObject(16, Byte.valueOf((byte) (red - 128)));
      this.dataWatcher.updateObject(17, Byte.valueOf((byte) (green - 128)));
      this.dataWatcher.updateObject(18, Byte.valueOf((byte) (blue - 128)));
   }
   
   /**
    * 弾の色を16進数で指定する
    * @param argb 24bitの16進数
    */
   public void setRGB(int rgb)
   {
      this.setRGB(MKRenderHelper.red(rgb), MKRenderHelper.green(rgb), MKRenderHelper.blue(rgb));
   }
   
   /**
    * 弾の色をColorで指定する
    */
   public void setRGB(Color color)
   {
      this.setRGB(color.getRed(), color.getGreen(), color.getBlue());
   }
   
   public byte getRed()
   {
      return this.dataWatcher.getWatchableObjectByte(16);
   }
   
   public byte getGreen()
   {
      return this.dataWatcher.getWatchableObjectByte(17);
   }
   
   public byte getBlue()
   {
      return this.dataWatcher.getWatchableObjectByte(18);
   }
   
   private void angleUpdate()
   {
      S12PacketEntityVelocity packet = new S12PacketEntityVelocity(this);
   }
   
   @Override
   public void onUpdate()
   {
      super.onUpdate();
      
      this.posX += this.motionX;
      this.posY += this.motionY;
      this.posZ += this.motionZ;
      
      this.setPosition(this.posX, this.posY, this.posZ);
   }
}
最後に編集したユーザー zyando123 [ 2016年11月28日(月) 22:36 ], 累計 3 回
ろくな事を呟かないTwitterアカウント→@zyando79
アバター
zyando123
ID:93d451bf
石掘り
 
記事: 92
登録日時: 2016年8月29日(月) 13:28

  • (PostNo.288515)

Re: [1.7.10]再ログインした場合にEntityの向きが保存されない

投稿記事by zyando123 » 2016年11月23日(水) 21:17

自己解決しました。原因は単純なことで、動いていないのにmotionから向きを同期させようとしていたことでした。
EntityRegistry#registerModEntity(Class<? extends Entity>, String, int, Object, int, int, boolean)の第7引数をfalseにして速度情報のパケットを送らないようにすることで解決しました。
ろくな事を呟かないTwitterアカウント→@zyando79
アバター
zyando123
ID:93d451bf
石掘り
 
記事: 92
登録日時: 2016年8月29日(月) 13:28


Return to 質問:開発・制作関連

x