From 9ee8974feaca45381b47700c624eeb274a222300 Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Tue, 26 Apr 2022 00:39:43 -0400 Subject: [PATCH] Begin on plugin API --- .../java/emu/grasscutter/plugin/api/Item.java | 5 + .../grasscutter/plugin/api/PlayerHook.java | 113 ++++++++++++++++++ .../java/emu/grasscutter/plugin/api/README.md | 2 + 3 files changed, 120 insertions(+) create mode 100644 src/main/java/emu/grasscutter/plugin/api/Item.java create mode 100644 src/main/java/emu/grasscutter/plugin/api/PlayerHook.java create mode 100644 src/main/java/emu/grasscutter/plugin/api/README.md diff --git a/src/main/java/emu/grasscutter/plugin/api/Item.java b/src/main/java/emu/grasscutter/plugin/api/Item.java new file mode 100644 index 000000000..91b1a8a5c --- /dev/null +++ b/src/main/java/emu/grasscutter/plugin/api/Item.java @@ -0,0 +1,5 @@ +package emu.grasscutter.plugin.api; + +public enum Item { + /* TODO: Use handbook to generate an Item enum. */ +} diff --git a/src/main/java/emu/grasscutter/plugin/api/PlayerHook.java b/src/main/java/emu/grasscutter/plugin/api/PlayerHook.java new file mode 100644 index 000000000..f4a479acb --- /dev/null +++ b/src/main/java/emu/grasscutter/plugin/api/PlayerHook.java @@ -0,0 +1,113 @@ +package emu.grasscutter.plugin.api; + +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.avatar.GenshinAvatar; +import emu.grasscutter.game.entity.EntityAvatar; +import emu.grasscutter.game.props.EnterReason; +import emu.grasscutter.game.props.FightProperty; +import emu.grasscutter.net.packet.GenshinPacket; +import emu.grasscutter.net.proto.EnterTypeOuterClass.EnterType; +import emu.grasscutter.server.packet.send.PacketAvatarFightPropUpdateNotify; +import emu.grasscutter.server.packet.send.PacketAvatarLifeStateChangeNotify; +import emu.grasscutter.server.packet.send.PacketPlayerEnterSceneNotify; +import emu.grasscutter.utils.Position; + +/** + * Hooks into the {@link GenshinPlayer} class, adding convenient ways to do certain things. + */ +public final class PlayerHook { + private final GenshinPlayer player; + + /** + * Hooks into the player. + * @param player The player to hook into. + */ + public PlayerHook(GenshinPlayer player) { + this.player = player; + } + + /** + * Kicks a player from the server. + */ + public void kick() { + this.player.getSession().close(); + } + + /** + * Sends a player to another scene. + * @param sceneId The scene to send the player to. + */ + public void changeScenes(int sceneId) { + this.player.getWorld().transferPlayerToScene(this.player, sceneId, this.player.getPos()); + } + + /** + * Broadcasts an avatar property notify to all world players. + * @param property The property that was updated. + */ + public void updateFightProperty(FightProperty property) { + this.broadcastPacketToWorld(new PacketAvatarFightPropUpdateNotify(this.getCurrentAvatar(), property)); + } + + /** + * Broadcasts the packet sent to all world players. + * @param packet The packet to send. + */ + public void broadcastPacketToWorld(GenshinPacket packet) { + this.player.getWorld().broadcastPacket(packet); + } + + /** + * Set the currently equipped avatar's health. + * @param health The health to set the avatar to. + */ + public void setHealth(float health) { + this.getCurrentAvatarEntity().setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, health); + this.updateFightProperty(FightProperty.FIGHT_PROP_CUR_HP); + } + + /** + * Revives the specified avatar. + * @param avatar The avatar to revive. + */ + public void reviveAvatar(GenshinAvatar avatar) { + this.broadcastPacketToWorld(new PacketAvatarLifeStateChangeNotify(avatar)); + } + + /** + * Teleports a player to a position. + * This will **not** transfer the player to another scene. + * @param position The position to teleport the player to. + */ + public void teleport(Position position) { + this.player.getPos().set(position); + this.player.sendPacket(new PacketPlayerEnterSceneNotify(this.player, + EnterType.EnterJump, EnterReason.TransPoint, + this.player.getSceneId(), position + )); + } + + /** + * Gets the currently selected avatar's max health. + * @return The max health as a float. + */ + public float getMaxHealth() { + return this.getCurrentAvatarEntity().getFightProperty(FightProperty.FIGHT_PROP_MAX_HP); + } + + /** + * Gets the currently selected avatar in entity form. + * @return The avatar as an {@link EntityAvatar}. + */ + public EntityAvatar getCurrentAvatarEntity() { + return this.player.getTeamManager().getCurrentAvatarEntity(); + } + + /** + * Gets the currently selected avatar. + * @return The avatar as an {@link GenshinAvatar}. + */ + public GenshinAvatar getCurrentAvatar() { + return this.getCurrentAvatarEntity().getAvatar(); + } +} \ No newline at end of file diff --git a/src/main/java/emu/grasscutter/plugin/api/README.md b/src/main/java/emu/grasscutter/plugin/api/README.md new file mode 100644 index 000000000..73a5a75ee --- /dev/null +++ b/src/main/java/emu/grasscutter/plugin/api/README.md @@ -0,0 +1,2 @@ +# Grasscutter Plugin API +**Warning!** As of now, this is a work in progress and isn't completely documented. \ No newline at end of file