content: package emu.grasscutter.game.entity;
  
  import emu.grasscutter.data.GameData;
  import emu.grasscutter.data.binout.ConfigGadget;
  import emu.grasscutter.data.excels.GadgetData;
  import emu.grasscutter.game.player.Player;
  import emu.grasscutter.game.props.EntityIdType;
  import emu.grasscutter.game.props.FightProperty;
  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.EntityAuthorityInfoOuterClass.EntityAuthorityInfo;
  import emu.grasscutter.net.proto.EntityRendererChangedInfoOuterClass.EntityRendererChangedInfo;
  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.net.proto.VehicleInfoOuterClass.VehicleInfo;
  import emu.grasscutter.net.proto.VehicleMemberOuterClass.VehicleMember;
  import emu.grasscutter.utils.Position;
  import emu.grasscutter.utils.ProtoHelper;
  import it.unimi.dsi.fastutil.ints.Int2FloatMap;
  import it.unimi.dsi.fastutil.ints.Int2FloatOpenHashMap;
  import lombok.Getter;
  import lombok.Setter;
  
  import javax.annotation.Nullable;
  import java.util.ArrayList;
  import java.util.List;
  
  public class EntityVehicle extends EntityBaseGadget {
  
      @Getter private final Player owner;
      @Getter(onMethod = @__(@Override))
      private final Int2FloatMap fightProperties;
  
      @Getter private final int pointId;
      @Getter private final int gadgetId;
  
      @Getter @Setter private float curStamina;
      @Getter private List<VehicleMember> vehicleMembers;
      @Nullable @Getter private ConfigGadget configGadget;
  
      public EntityVehicle(Scene scene, Player player, int gadgetId, int pointId, Position pos, Position rot) {
          super(scene, pos, rot);
          this.owner = player;
          this.id = getScene().getWorld().getNextEntityId(EntityIdType.GADGET);
          this.fightProperties = new Int2FloatOpenHashMap();
          this.gadgetId = gadgetId;
          this.pointId = pointId;
          this.curStamina = 240; // might be in configGadget.GCALKECLLLP.JBAKBEFIMBN.ANBMPHPOALP
          this.vehicleMembers = new ArrayList<>();
          GadgetData data = GameData.getGadgetDataMap().get(gadgetId);
          if (data != null && data.getJsonName() != null) {
              this.configGadget = GameData.getGadgetConfigData().get(data.getJsonName());
          }
  
          fillFightProps(configGadget);
      }
  
      @Override
      protected void fillFightProps(ConfigGadget configGadget) {
          super.fillFightProps(configGadget);
          this.addFightProperty(FightProperty.FIGHT_PROP_CUR_SPEED, 0);
          this.addFightProperty(FightProperty.FIGHT_PROP_CHARGE_EFFICIENCY, 0);
      }
  
      @Override
      public SceneEntityInfo toProto() {
  
          VehicleInfo vehicle = VehicleInfo.newBuilder()
                  .setOwnerUid(this.owner.getUid())
                  .setCurStamina(getCurStamina())
                  .build();
  
          EntityAuthorityInfo authority = EntityAuthorityInfo.newBuilder()
                  .setAbilityInfo(AbilitySyncStateInfo.newBuilder())
                  .setRendererChangedInfo(EntityRendererChangedInfo.newBuilder())
                  .setAiInfo(SceneEntityAiInfo.newBuilder().setIsAiOpen(true).setBornPos(getPosition().toProto()))
                  .setBornPos(getPosition().toProto())
                  .build();
  
          SceneGadgetInfo.Builder gadgetInfo = SceneGadgetInfo.newBuilder()
                  .setGadgetId(this.getGadgetId())
                  .setAuthorityPeerId(this.getOwner().getPeerId())
                  .setIsEnableInteract(true)
                  .setVehicleInfo(vehicle);
  
          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())
                  .setGadget(gadgetInfo)
                  .setEntityAuthorityInfo(authority)
                  .setLifeState(1);
  
          PropPair pair = PropPair.newBuilder()
                  .setType(PlayerProperty.PROP_LEVEL.getId())
                  .setPropValue(ProtoHelper.newPropValue(PlayerProperty.PROP_LEVEL, 47))
                  .build();
  
          this.addAllFightPropsToEntityInfo(entityInfo);
          entityInfo.addPropList(pair);
  
          return entityInfo.build();
      }
  }
  