Add EntityCreationEvent

This commit is contained in:
KingRainbow44
2023-05-20 21:08:35 -04:00
parent 1515d62aa6
commit 43ab558735
8 changed files with 111 additions and 26 deletions

View File

@@ -8,6 +8,7 @@ import emu.grasscutter.game.entity.EntityAvatar;
import emu.grasscutter.game.inventory.GameItem; import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.game.player.BasePlayerManager; import emu.grasscutter.game.player.BasePlayerManager;
import emu.grasscutter.game.player.Player; import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.event.entity.EntityCreationEvent;
import emu.grasscutter.server.packet.send.PacketAvatarChangeCostumeNotify; import emu.grasscutter.server.packet.send.PacketAvatarChangeCostumeNotify;
import emu.grasscutter.server.packet.send.PacketAvatarFlycloakChangeNotify; import emu.grasscutter.server.packet.send.PacketAvatarFlycloakChangeNotify;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
@@ -115,7 +116,8 @@ public class AvatarStorage extends BasePlayerManager implements Iterable<Avatar>
// Update entity // Update entity
EntityAvatar entity = avatar.getAsEntity(); EntityAvatar entity = avatar.getAsEntity();
if (entity == null) { if (entity == null) {
entity = new EntityAvatar(avatar); entity = EntityCreationEvent.call(EntityAvatar.class,
new Class<?>[] {Avatar.class}, new Object[] {avatar});
getPlayer().sendPacket(new PacketAvatarChangeCostumeNotify(entity)); getPlayer().sendPacket(new PacketAvatarChangeCostumeNotify(entity));
} else { } else {
getPlayer().getScene().broadcastPacket(new PacketAvatarChangeCostumeNotify(entity)); getPlayer().getScene().broadcastPacket(new PacketAvatarChangeCostumeNotify(entity));

View File

@@ -1,8 +1,5 @@
package emu.grasscutter.game.player; package emu.grasscutter.game.player;
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
import static emu.grasscutter.scripts.constants.EventType.EVENT_UNLOCK_TRANS_POINT;
import emu.grasscutter.data.GameData; import emu.grasscutter.data.GameData;
import emu.grasscutter.data.binout.ScenePointEntry; import emu.grasscutter.data.binout.ScenePointEntry;
import emu.grasscutter.data.excels.OpenStateData; import emu.grasscutter.data.excels.OpenStateData;
@@ -15,9 +12,13 @@ import emu.grasscutter.game.quest.enums.QuestState;
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode; import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
import emu.grasscutter.scripts.data.ScriptArgs; import emu.grasscutter.scripts.data.ScriptArgs;
import emu.grasscutter.server.packet.send.*; import emu.grasscutter.server.packet.send.*;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
import static emu.grasscutter.scripts.constants.EventType.EVENT_UNLOCK_TRANS_POINT;
// @Entity // @Entity
public final class PlayerProgressManager extends BasePlayerDataManager { public final class PlayerProgressManager extends BasePlayerDataManager {
/****************************************************************************************************************** /******************************************************************************************************************
@@ -81,6 +82,8 @@ public final class PlayerProgressManager extends BasePlayerDataManager {
// Auto-unlock the first statue and map area. // Auto-unlock the first statue and map area.
this.player.getUnlockedScenePoints(3).add(7); this.player.getUnlockedScenePoints(3).add(7);
this.player.getUnlockedSceneAreas(3).add(1); this.player.getUnlockedSceneAreas(3).add(1);
// Allow the player to visit all areas.
this.setOpenState(47, 1, true);
} }
} }

View File

@@ -1,7 +1,5 @@
package emu.grasscutter.game.player; package emu.grasscutter.game.player;
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
import dev.morphia.annotations.Entity; import dev.morphia.annotations.Entity;
import dev.morphia.annotations.Transient; import dev.morphia.annotations.Transient;
import emu.grasscutter.GameConstants; import emu.grasscutter.GameConstants;
@@ -25,6 +23,7 @@ import emu.grasscutter.net.proto.PlayerDieTypeOuterClass.PlayerDieType;
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode; import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
import emu.grasscutter.net.proto.TrialAvatarGrantRecordOuterClass.TrialAvatarGrantRecord.GrantReason; import emu.grasscutter.net.proto.TrialAvatarGrantRecordOuterClass.TrialAvatarGrantRecord.GrantReason;
import emu.grasscutter.net.proto.VisionTypeOuterClass; import emu.grasscutter.net.proto.VisionTypeOuterClass;
import emu.grasscutter.server.event.entity.EntityCreationEvent;
import emu.grasscutter.server.event.player.PlayerTeamDeathEvent; import emu.grasscutter.server.event.player.PlayerTeamDeathEvent;
import emu.grasscutter.server.packet.send.*; import emu.grasscutter.server.packet.send.*;
import emu.grasscutter.utils.Utils; import emu.grasscutter.utils.Utils;
@@ -32,12 +31,15 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import it.unimi.dsi.fastutil.ints.IntSet; import it.unimi.dsi.fastutil.ints.IntSet;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import java.util.*;
import java.util.stream.Stream;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.val; import lombok.val;
import java.util.*;
import java.util.stream.Stream;
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
@Entity @Entity
public final class TeamManager extends BasePlayerDataManager { public final class TeamManager extends BasePlayerDataManager {
@Transient private final List<EntityAvatar> avatars; @Transient private final List<EntityAvatar> avatars;
@@ -353,9 +355,11 @@ public final class TeamManager extends BasePlayerDataManager {
prevSelectedAvatarIndex = i; prevSelectedAvatarIndex = i;
} }
} else { } else {
entity = var player = this.getPlayer();
new EntityAvatar( entity = EntityCreationEvent.call(EntityAvatar.class,
this.getPlayer().getScene(), this.getPlayer().getAvatars().getAvatarById(avatarId)); new Class<?>[] {Scene.class, Avatar.class}, new Object[] {
player.getScene(), player.getAvatars().getAvatarById(avatarId)
});
} }
this.getActiveTeam().add(entity); this.getActiveTeam().add(entity);
@@ -494,7 +498,10 @@ public final class TeamManager extends BasePlayerDataManager {
this.getActiveTeam().removeIf(x -> x.getAvatar().getAvatarId() == trialAvatar.getAvatarId()); this.getActiveTeam().removeIf(x -> x.getAvatar().getAvatarId() == trialAvatar.getAvatarId());
this.getCurrentTeamInfo().getAvatars().removeIf(x -> x == trialAvatar.getAvatarId()); this.getCurrentTeamInfo().getAvatars().removeIf(x -> x == trialAvatar.getAvatarId());
// Add the avatar to the teams. // Add the avatar to the teams.
this.getActiveTeam().add(new EntityAvatar(this.getPlayer().getScene(), trialAvatar)); this.getActiveTeam().add(EntityCreationEvent.call(EntityAvatar.class,
new Class<?>[] {Scene.class, Avatar.class}, new Object[] {
player.getScene(), trialAvatar
}));
this.getCurrentTeamInfo().addAvatar(trialAvatar); this.getCurrentTeamInfo().addAvatar(trialAvatar);
this.getTrialAvatars().put(trialAvatar.getAvatarId(), trialAvatar); this.getTrialAvatars().put(trialAvatar.getAvatarId(), trialAvatar);
} }
@@ -581,7 +588,10 @@ public final class TeamManager extends BasePlayerDataManager {
.forEach( .forEach(
avatarId -> avatarId ->
this.getActiveTeam() this.getActiveTeam()
.add(new EntityAvatar(scene, player.getAvatars().getAvatarById(avatarId)))); .add(EntityCreationEvent.call(EntityAvatar.class,
new Class<?>[] {Scene.class, Avatar.class}, new Object[] {
scene, player.getAvatars().getAvatarById(avatarId)
})));
} else { } else {
// Restores all avatars from the player's avatar storage. // Restores all avatars from the player's avatar storage.
// If the avatar is already in the team, it will not be added. // If the avatar is already in the team, it will not be added.
@@ -597,7 +607,10 @@ public final class TeamManager extends BasePlayerDataManager {
var avatarData = player.getAvatars().getAvatarById(avatar); var avatarData = player.getAvatars().getAvatarById(avatar);
if (avatarData == null) continue; if (avatarData == null) continue;
this.getActiveTeam().add(index, new EntityAvatar(scene, avatarData)); this.getActiveTeam().add(index, EntityCreationEvent.call(EntityAvatar.class,
new Class<?>[] {Scene.class, Avatar.class}, new Object[] {
scene, avatarData
}));
} }
} }
@@ -963,7 +976,9 @@ public final class TeamManager extends BasePlayerDataManager {
var avatar = avatars.getAvatarById(id); var avatar = avatars.getAvatarById(id);
if (avatar == null) continue; if (avatar == null) continue;
specifiedAvatarList.add(new EntityAvatar(scene, avatar)); specifiedAvatarList.add(EntityCreationEvent.call(EntityAvatar.class,
new Class<?>[] {Scene.class, Avatar.class},
new Object[] {scene, avatar}));
} }
} }

View File

@@ -24,12 +24,13 @@ import emu.grasscutter.server.packet.send.PacketFinishedParentQuestUpdateNotify;
import emu.grasscutter.server.packet.send.PacketQuestProgressUpdateNotify; import emu.grasscutter.server.packet.send.PacketQuestProgressUpdateNotify;
import emu.grasscutter.server.packet.send.PacketQuestUpdateQuestVarNotify; import emu.grasscutter.server.packet.send.PacketQuestUpdateQuestVarNotify;
import emu.grasscutter.utils.ConversionUtils; import emu.grasscutter.utils.ConversionUtils;
import java.util.*;
import java.util.stream.Collectors;
import lombok.Getter; import lombok.Getter;
import lombok.val; import lombok.val;
import org.bson.types.ObjectId; import org.bson.types.ObjectId;
import java.util.*;
import java.util.stream.Collectors;
@Entity(value = "quests", useDiscriminator = false) @Entity(value = "quests", useDiscriminator = false)
public class GameMainQuest { public class GameMainQuest {
@Id private ObjectId id; @Id private ObjectId id;

View File

@@ -5,12 +5,15 @@ import com.google.gson.annotations.SerializedName;
import dev.morphia.annotations.Entity; import dev.morphia.annotations.Entity;
import emu.grasscutter.net.proto.VectorOuterClass.Vector; import emu.grasscutter.net.proto.VectorOuterClass.Vector;
import emu.grasscutter.utils.Utils; import emu.grasscutter.utils.Utils;
import java.io.Serializable;
import java.util.List;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
@Entity @Entity
@Accessors(chain = true)
public class Position implements Serializable { public class Position implements Serializable {
private static final long serialVersionUID = -2001232313615923575L; private static final long serialVersionUID = -2001232313615923575L;
@@ -104,6 +107,13 @@ public class Position implements Serializable {
return this; return this;
} }
public Position multiply(float value) {
this.x *= value;
this.y *= value;
this.z *= value;
return this;
}
public Position add(Position add) { public Position add(Position add) {
this.x += add.getX(); this.x += add.getX();
this.y += add.getY(); this.y += add.getY();

View File

@@ -36,18 +36,20 @@ import emu.grasscutter.scripts.constants.EventType;
import emu.grasscutter.scripts.data.SceneBlock; import emu.grasscutter.scripts.data.SceneBlock;
import emu.grasscutter.scripts.data.SceneGroup; import emu.grasscutter.scripts.data.SceneGroup;
import emu.grasscutter.scripts.data.ScriptArgs; import emu.grasscutter.scripts.data.ScriptArgs;
import emu.grasscutter.server.event.entity.EntityCreationEvent;
import emu.grasscutter.server.event.player.PlayerTeleportEvent; import emu.grasscutter.server.event.player.PlayerTeleportEvent;
import emu.grasscutter.server.packet.send.*; import emu.grasscutter.server.packet.send.*;
import emu.grasscutter.utils.objects.KahnsSort; import emu.grasscutter.utils.objects.KahnsSort;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import lombok.Getter;
import lombok.Setter;
import lombok.val;
import javax.annotation.Nullable;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.annotation.Nullable;
import lombok.Getter;
import lombok.Setter;
import lombok.val;
public final class Scene { public final class Scene {
@Getter private final World world; @Getter private final World world;
@@ -246,7 +248,11 @@ public final class Scene {
} }
if (avatar == null) continue; if (avatar == null) continue;
} }
player.getTeamManager().getActiveTeam().add(new EntityAvatar(player.getScene(), avatar)); player.getTeamManager().getActiveTeam().add(
EntityCreationEvent.call(EntityAvatar.class,
new Class<?>[] {Scene.class, Avatar.class},
new Object[] {player.getScene(), avatar})
);
} }
// Limit character index in case its out of bounds // Limit character index in case its out of bounds

View File

@@ -0,0 +1,48 @@
package emu.grasscutter.server.event.entity;
import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.server.event.Event;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import javax.annotation.Nullable;
/** Invoked when an entity is created. */
@AllArgsConstructor
public final class EntityCreationEvent extends Event {
/**
* Helper method to call EntityCreationEvent.
* Returns the result of the event call.
*
* @param type The type of entity to create.
* @return The result of the event call.
* @param <T> The type of entity to create.
*/
public static <T extends GameEntity> T call(
Class<T> type, Class<?>[] argTypes, Object[] args
) {
var event = new EntityCreationEvent(type, argTypes, args);
event.call(); return type.cast(event.getEntity());
}
@Getter @Setter private Class<? extends GameEntity> entityType;
@Getter @Setter private Class<?>[] constructorArgTypes;
@Getter @Setter private Object[] constructorArgs;
/**
* Creates a new entity.
* Returns null if the entity could not be created.
*
* @return The created entity.
*/
@Nullable
public GameEntity getEntity() {
try {
return this.entityType.getConstructor(this.constructorArgTypes)
.newInstance(this.constructorArgs);
} catch (ReflectiveOperationException ignored) {
return null;
}
}
}

View File

@@ -7,8 +7,8 @@ import emu.grasscutter.server.event.Event;
public abstract class EntityEvent extends Event { public abstract class EntityEvent extends Event {
protected final GameEntity entity; protected final GameEntity entity;
public EntityEvent(GameEntity player) { public EntityEvent(GameEntity entity) {
this.entity = player; this.entity = entity;
} }
public GameEntity getEntity() { public GameEntity getEntity() {