EntityGadget.java 6.44 KB
Newer Older
Melledy's avatar
Melledy committed
1
2
package emu.grasscutter.game.entity;

Akka's avatar
Akka committed
3
import emu.grasscutter.Grasscutter;
4
5
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.def.GadgetData;
6
import emu.grasscutter.game.entity.gadget.GadgetChest;
Melledy's avatar
Melledy committed
7
8
9
10
import emu.grasscutter.game.entity.gadget.GadgetContent;
import emu.grasscutter.game.entity.gadget.GadgetGatherPoint;
import emu.grasscutter.game.entity.gadget.GadgetRewardStatue;
import emu.grasscutter.game.entity.gadget.GadgetWorktop;
Akka's avatar
Akka committed
11
import emu.grasscutter.game.player.Player;
12
13
import emu.grasscutter.game.props.EntityIdType;
import emu.grasscutter.game.props.EntityType;
Melledy's avatar
Melledy committed
14
import emu.grasscutter.game.props.FightProperty;
15
import emu.grasscutter.game.props.PlayerProperty;
Melledy's avatar
Melledy committed
16
import emu.grasscutter.game.world.Scene;
17
18
import emu.grasscutter.net.proto.AbilitySyncStateInfoOuterClass.AbilitySyncStateInfo;
import emu.grasscutter.net.proto.AnimatorParameterValueInfoPairOuterClass.AnimatorParameterValueInfoPair;
Akka's avatar
Akka committed
19
import emu.grasscutter.net.proto.BossChestInfoOuterClass;
20
21
22
23
24
25
26
27
28
29
30
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.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.WorktopInfoOuterClass.WorktopInfo;
31
import emu.grasscutter.scripts.constants.EventType;
Akka's avatar
Akka committed
32
import emu.grasscutter.scripts.data.SceneGadget;
33
import emu.grasscutter.scripts.data.ScriptArgs;
34
import emu.grasscutter.server.packet.send.PacketGadgetStateNotify;
35
36
37
38
39
import emu.grasscutter.utils.Position;
import emu.grasscutter.utils.ProtoHelper;
import it.unimi.dsi.fastutil.ints.Int2FloatOpenHashMap;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import it.unimi.dsi.fastutil.ints.IntSet;
Akka's avatar
Akka committed
40
41
42
43
import lombok.ToString;

import java.util.Arrays;
import java.util.Random;
Melledy's avatar
Melledy committed
44

Akka's avatar
Akka committed
45
@ToString(callSuper = true)
46
47
48
49
50
51
52
public class EntityGadget extends EntityBaseGadget {
	private final GadgetData data;
	private final Position pos;
	private final Position rot;
	private int gadgetId;
	
	private int state;
Melledy's avatar
Melledy committed
53
54
	private int pointType;
	private GadgetContent content;
Akka's avatar
Akka committed
55
	private SceneGadget metaGadget;
Melledy's avatar
Melledy committed
56

57
	public EntityGadget(Scene scene, int gadgetId, Position pos) {
58
		super(scene);
59
60
61
62
63
		this.data = GameData.getGadgetDataMap().get(gadgetId);
		this.id = getScene().getWorld().getNextEntityId(EntityIdType.GADGET);
		this.gadgetId = gadgetId;
		this.pos = pos.clone();
		this.rot = new Position();
Melledy's avatar
Melledy committed
64
65
	}
	
Melledy's avatar
Melledy committed
66
67
68
69
70
	public EntityGadget(Scene scene, int gadgetId, Position pos, GadgetContent content) {
		this(scene, gadgetId, pos);
		this.content = content;
	}
	
71
72
73
74
75
76
77
78
79
80
81
82
83
	public GadgetData getGadgetData() {
		return data;
	}

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

	@Override
	public Position getRotation() {
		return this.rot;
	}
Melledy's avatar
Melledy committed
84
	
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
	public int getGadgetId() {
		return gadgetId;
	}

	public void setGadgetId(int gadgetId) {
		this.gadgetId = gadgetId;
	}

	public int getState() {
		return state;
	}

	public void setState(int state) {
		this.state = state;
	}
100
101
102
103
	
	public void updateState(int state){
		this.setState(state);
		this.getScene().broadcastPacket(new PacketGadgetStateNotify(this, state));
Akka's avatar
Akka committed
104
		getScene().getScriptManager().callEvent(EventType.EVENT_GADGET_STATE_CHANGE, new ScriptArgs(state, this.getConfigId()));
105
	}
106

Melledy's avatar
Melledy committed
107
108
	public int getPointType() {
		return pointType;
109
	}
Melledy's avatar
Melledy committed
110
111
112
113
114
115
116
117
118
119
120
121

	public void setPointType(int pointType) {
		this.pointType = pointType;
	}

	public GadgetContent getContent() {
		return content;
	}

	@Deprecated // Dont use!
	public void setContent(GadgetContent content) {
		this.content = this.content == null ? content : this.content;
122
	}
Akka's avatar
Akka committed
123
124
125
126
127
128
129
130
131

	public SceneGadget getMetaGadget() {
		return metaGadget;
	}

	public void setMetaGadget(SceneGadget metaGadget) {
		this.metaGadget = metaGadget;
	}

Melledy's avatar
Melledy committed
132
133
134
	// TODO refactor
	public void buildContent() {
		if (getContent() != null || getGadgetData() == null || getGadgetData().getType() == null) {
135
136
			return;
		}
Melledy's avatar
Melledy committed
137
138
139
140
141
142
		
		EntityType type = getGadgetData().getType();
		GadgetContent content = switch (type) {
			case GatherPoint -> new GadgetGatherPoint(this);
			case Worktop -> new GadgetWorktop(this);
			case RewardStatue -> new GadgetRewardStatue(this);
143
			case Chest -> new GadgetChest(this);
Melledy's avatar
Melledy committed
144
145
146
147
			default -> null;
		};
		
		this.content = content;
148
149
150
151
152
153
	}

	@Override
	public Int2FloatOpenHashMap getFightProperties() {
		return null;
	}
154
155
156
157
158
159
	
	@Override
	public void onCreate() {
		// Lua event
		getScene().getScriptManager().callEvent(EventType.EVENT_GADGET_CREATE, new ScriptArgs(this.getConfigId()));
	}
160

Melledy's avatar
Melledy committed
161
162
163
164
	@Override
	public void onDeath(int killerId) {
		
	}
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
	
	@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_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);
		
		SceneGadgetInfo.Builder gadgetInfo = SceneGadgetInfo.newBuilder()
				.setGadgetId(this.getGadgetId())
				.setGroupId(this.getGroupId())
				.setConfigId(this.getConfigId())
				.setGadgetState(this.getState())
				.setIsEnableInteract(true)
				.setAuthorityPeerId(this.getScene().getWorld().getHostPeerId());
		
Melledy's avatar
Melledy committed
198
199
		if (this.getContent() != null) {
			this.getContent().onBuildProto(gadgetInfo);
200
201
202
203
204
205
		}

		entityInfo.setGadget(gadgetInfo);
		
		return entityInfo.build();
	}
Melledy's avatar
Melledy committed
206
}