content: package emu.grasscutter.game.entity;
  
  import emu.grasscutter.game.player.Player;
  import emu.grasscutter.game.props.PlayerProperty;
  import emu.grasscutter.game.world.Scene;
  import emu.grasscutter.net.proto.AbilitySyncStateInfoOuterClass.AbilitySyncStateInfo;
  import emu.grasscutter.net.proto.AnimatorParameterValueInfoPairOuterClass.AnimatorParameterValueInfoPair;
  import emu.grasscutter.net.proto.ClientGadgetInfoOuterClass;
  import emu.grasscutter.net.proto.EntityAuthorityInfoOuterClass.EntityAuthorityInfo;
  import emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData;
  import emu.grasscutter.net.proto.EntityRendererChangedInfoOuterClass.EntityRendererChangedInfo;
  import emu.grasscutter.net.proto.EvtCreateGadgetNotifyOuterClass.EvtCreateGadgetNotify;
  import emu.grasscutter.net.proto.MotionInfoOuterClass.MotionInfo;
  import emu.grasscutter.net.proto.PropPairOuterClass.PropPair;
  import emu.grasscutter.net.proto.ProtEntityTypeOuterClass.ProtEntityType;
  import emu.grasscutter.net.proto.SceneEntityAiInfoOuterClass.SceneEntityAiInfo;
  import emu.grasscutter.net.proto.SceneEntityInfoOuterClass.SceneEntityInfo;
  import emu.grasscutter.net.proto.SceneGadgetInfoOuterClass.SceneGadgetInfo;
  import emu.grasscutter.net.proto.VectorOuterClass.Vector;
  import emu.grasscutter.utils.Position;
  import emu.grasscutter.utils.ProtoHelper;
  import it.unimi.dsi.fastutil.ints.Int2FloatMap;
  import lombok.Getter;
  
  public class EntityClientGadget extends EntityBaseGadget {
      @Getter private final Player owner;
  
      @Getter(onMethod = @__(@Override))
      private int gadgetId;
  
      @Getter private int campId;
      @Getter private int campType;
      @Getter private int ownerEntityId;
      @Getter private int targetEntityId;
      @Getter private boolean asyncLoad;
  
      @Getter private int originalOwnerEntityId;
  
      public EntityClientGadget(Scene scene, Player player, EvtCreateGadgetNotify notify) {
          super(scene, new Position(notify.getInitPos()), new Position(notify.getInitEulerAngles()));
          this.owner = player;
          this.id = notify.getEntityId();
          this.gadgetId = notify.getConfigId();
          this.campId = notify.getCampId();
          this.campType = notify.getCampType();
          this.ownerEntityId = notify.getPropOwnerEntityId();
          this.targetEntityId = notify.getTargetEntityId();
          this.asyncLoad = notify.getIsAsyncLoad();
  
          GameEntity owner = scene.getEntityById(this.ownerEntityId);
          if (owner instanceof EntityClientGadget ownerGadget) {
              this.originalOwnerEntityId = ownerGadget.getOriginalOwnerEntityId();
          }
          else {
              this.originalOwnerEntityId = this.ownerEntityId;
          }
      }
  
      @Override
      public void onDeath(int killerId) {
          super.onDeath(killerId); // Invoke super class's onDeath() method.
      }
  
      @Override public Int2FloatMap getFightProperties() {return null;}
  
      @Override
      public SceneEntityInfo toProto() {
          EntityAuthorityInfo authority = EntityAuthorityInfo.newBuilder()
                  .setAbilityInfo(AbilitySyncStateInfo.newBuilder())
                  .setRendererChangedInfo(EntityRendererChangedInfo.newBuilder())
                  .setAiInfo(SceneEntityAiInfo.newBuilder().setIsAiOpen(true).setBornPos(Vector.newBuilder()))
                  .setBornPos(Vector.newBuilder())
                  .build();
  
          SceneEntityInfo.Builder entityInfo = SceneEntityInfo.newBuilder()
                  .setEntityId(getId())
                  .setEntityType(ProtEntityType.PROT_ENTITY_TYPE_GADGET)
                  .setMotionInfo(MotionInfo.newBuilder().setPos(getPosition().toProto()).setRot(getRotation().toProto()).setSpeed(Vector.newBuilder()))
                  .addAnimatorParaList(AnimatorParameterValueInfoPair.newBuilder())
                  .setEntityClientData(EntityClientData.newBuilder())
                  .setEntityAuthorityInfo(authority)
                  .setLifeState(1);
  
          PropPair pair = PropPair.newBuilder()
                  .setType(PlayerProperty.PROP_LEVEL.getId())
                  .setPropValue(ProtoHelper.newPropValue(PlayerProperty.PROP_LEVEL, 1))
                  .build();
          entityInfo.addPropList(pair);
  
          ClientGadgetInfoOuterClass.ClientGadgetInfo clientGadget = ClientGadgetInfoOuterClass.ClientGadgetInfo.newBuilder()
                  .setCampId(this.getCampId())
                  .setCampType(this.getCampType())
                  .setOwnerEntityId(this.getOwnerEntityId())
                  .setTargetEntityId(this.getTargetEntityId())
                  .setAsyncLoad(this.isAsyncLoad())
                  .build();
  
          SceneGadgetInfo.Builder gadgetInfo = SceneGadgetInfo.newBuilder()
                  .setGadgetId(this.getGadgetId())
                  .setOwnerEntityId(this.getOwnerEntityId())
                  .setIsEnableInteract(true)
                  .setClientGadget(clientGadget)
                  .setPropOwnerEntityId(this.getOwnerEntityId())
                  .setAuthorityPeerId(this.getOwner().getPeerId());
  
          entityInfo.setGadget(gadgetInfo);
  
          return entityInfo.build();
      }
  }
  