EntityVehicle.java 5.55 KB
Newer Older
1
2
3
4
package emu.grasscutter.game.entity;

import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.EntityIdType;
AnimeGitB's avatar
AnimeGitB committed
5
import emu.grasscutter.game.props.FightProperty;
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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.FightPropPairOuterClass.*;
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.*;
22
import emu.grasscutter.net.proto.VehicleMemberOuterClass.*;
23
24
25
26
27
import emu.grasscutter.utils.Position;
import emu.grasscutter.utils.ProtoHelper;

import it.unimi.dsi.fastutil.ints.Int2FloatMap;
import it.unimi.dsi.fastutil.ints.Int2FloatOpenHashMap;
AnimeGitB's avatar
AnimeGitB committed
28
29
import lombok.Getter;
import lombok.Setter;
30

31
32
33
import java.util.List;
import java.util.ArrayList;

Melledy's avatar
Melledy committed
34
public class EntityVehicle extends EntityBaseGadget {
35

AnimeGitB's avatar
AnimeGitB committed
36
37
    @Getter private final Player owner;
    private final Int2FloatMap fightProp;
github-actions's avatar
github-actions committed
38
39
40
41

    private final Position pos;
    private final Position rot;

AnimeGitB's avatar
AnimeGitB committed
42
43
    @Getter private final int pointId;
    @Getter private final int gadgetId;
github-actions's avatar
github-actions committed
44

AnimeGitB's avatar
AnimeGitB committed
45
46
    @Getter @Setter private float curStamina;
    @Getter private List<VehicleMember> vehicleMembers;
github-actions's avatar
github-actions committed
47
48
49
50
51
52
53
54
55
56
57
58
59

    public EntityVehicle(Scene scene, Player player, int gadgetId, int pointId, Position pos, Position rot) {
        super(scene);
        this.owner = player;
        this.id = getScene().getWorld().getNextEntityId(EntityIdType.GADGET);
        this.fightProp = new Int2FloatOpenHashMap();
        this.pos = new Position(pos);
        this.rot = new Position(rot);
        this.gadgetId = gadgetId;
        this.pointId = pointId;
        this.curStamina = 240;
        this.vehicleMembers = new ArrayList<VehicleMember>();

AnimeGitB's avatar
AnimeGitB committed
60
61
62
63
64
65
66
67
68
69
70
71
        switch (gadgetId) {
            case 45001001,45001002 -> {  // TODO: Not hardcode this. Waverider (skiff)
                this.addFightProperty(FightProperty.FIGHT_PROP_BASE_HP, 10000);
                this.addFightProperty(FightProperty.FIGHT_PROP_BASE_ATTACK, 100);
                this.addFightProperty(FightProperty.FIGHT_PROP_CUR_ATTACK, 100);
                this.addFightProperty(FightProperty.FIGHT_PROP_CUR_HP, 10000);
                this.addFightProperty(FightProperty.FIGHT_PROP_CUR_DEFENSE, 0);
                this.addFightProperty(FightProperty.FIGHT_PROP_CUR_SPEED, 0);
                this.addFightProperty(FightProperty.FIGHT_PROP_CHARGE_EFFICIENCY, 0);
                this.addFightProperty(FightProperty.FIGHT_PROP_MAX_HP, 10000);
            }
        }
github-actions's avatar
github-actions committed
72
73
74
    }

    @Override
AnimeGitB's avatar
AnimeGitB committed
75
    public Int2FloatMap getFightProperties() {
github-actions's avatar
github-actions committed
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
        return fightProp;
    }

    @Override
    public Position getPosition() { return this.pos; }

    @Override
    public Position getRotation() {
        return this.rot;
    }

    @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();

        for (Int2FloatMap.Entry entry : getFightProperties().int2FloatEntrySet()) {
            if (entry.getIntKey() == 0) {
                continue;
            }
            FightPropPair fightProp = FightPropPair.newBuilder().setPropType(entry.getIntKey()).setPropValue(entry.getFloatValue()).build();
            entityInfo.addFightPropList(fightProp);
        }

        entityInfo.addPropList(pair);

        return entityInfo.build();
    }
134
}