From bf00051482883dd232bc4837418a2cbd3828f963 Mon Sep 17 00:00:00 2001 From: replaceitem <40722305+replaceitem@users.noreply.github.com> Date: Wed, 16 Feb 2022 00:07:53 +0100 Subject: [PATCH] Added __on_player_message event (#1312) * Added __on_player_sends_message event * Docs for chat message event * Rename to __on_player_message * Editor support * Added event to event_test app * Update docs/scarpet/api/Events.md Co-authored-by: gnembon <41132274+gnembon@users.noreply.github.com> --- docs/scarpet/api/Events.md | 3 +++ docs/scarpet/resources/editors/idea/4.txt | 1 + docs/scarpet/resources/editors/npp/scarpet.xml | 1 + ...rGamePacketListenerImpl_scarpetEventsMixin.java | 14 ++++++++++++++ src/main/java/carpet/script/CarpetEventServer.java | 8 ++++++++ .../resources/assets/carpet/scripts/event_test.sc | 7 +++++++ 6 files changed, 34 insertions(+) diff --git a/docs/scarpet/api/Events.md b/docs/scarpet/api/Events.md index 008c250a..b6b71a3d 100644 --- a/docs/scarpet/api/Events.md +++ b/docs/scarpet/api/Events.md @@ -275,6 +275,9 @@ Triggered when the player has successfully logged in and was placed in the game. ### `__on_player_disconnects(player, reason)` Triggered when a player sends a disconnect package or is forcefully disconnected from the server. +### `__on_player_message(player, message)` +Triggered when a player sends a chat message or runs a command. + ### `__on_statistic(player, category, event, value)` Triggered when a player statistic changes. Doesn't notify on periodic an rhythmic events, i.e. `time_since_death`, `time_since_rest`, and `played_one_minute` since these are triggered every tick. Event diff --git a/docs/scarpet/resources/editors/idea/4.txt b/docs/scarpet/resources/editors/idea/4.txt index 0eb4b964..3bf2504e 100644 --- a/docs/scarpet/resources/editors/idea/4.txt +++ b/docs/scarpet/resources/editors/idea/4.txt @@ -44,5 +44,6 @@ __on_player_dies(player) -> __on_player_respawns(player) -> __on_player_disconnects(player, reason) -> __on_player_connects(player) -> +__on_player_message(player, message) -> __on_explosion(pos, power, source, causer, mode, fire) -> __on_explosion_outcome(pos, power, source, causer, mode, fire, blocks, entities) -> diff --git a/docs/scarpet/resources/editors/npp/scarpet.xml b/docs/scarpet/resources/editors/npp/scarpet.xml index 1d5b0f69..cdba07d4 100644 --- a/docs/scarpet/resources/editors/npp/scarpet.xml +++ b/docs/scarpet/resources/editors/npp/scarpet.xml @@ -147,6 +147,7 @@ __on_player_respawns __on_player_disconnects __on_player_connects + __on_player_message __on_explosion __on_explosion_outcome diff --git a/src/main/java/carpet/mixins/ServerGamePacketListenerImpl_scarpetEventsMixin.java b/src/main/java/carpet/mixins/ServerGamePacketListenerImpl_scarpetEventsMixin.java index fd4d5167..56ae8126 100644 --- a/src/main/java/carpet/mixins/ServerGamePacketListenerImpl_scarpetEventsMixin.java +++ b/src/main/java/carpet/mixins/ServerGamePacketListenerImpl_scarpetEventsMixin.java @@ -1,5 +1,6 @@ package carpet.mixins; +import net.minecraft.server.network.TextFilter; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -24,6 +25,7 @@ import static carpet.script.CarpetEventServer.Event.PLAYER_STOPS_SPRINTING; import static carpet.script.CarpetEventServer.Event.PLAYER_SWAPS_HANDS; import static carpet.script.CarpetEventServer.Event.PLAYER_SWINGS_HAND; import static carpet.script.CarpetEventServer.Event.PLAYER_SWITCHES_SLOT; +import static carpet.script.CarpetEventServer.Event.PLAYER_MESSAGE; import static carpet.script.CarpetEventServer.Event.PLAYER_USES_ITEM; import static carpet.script.CarpetEventServer.Event.PLAYER_WAKES_UP; @@ -42,6 +44,7 @@ import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.BlockHitResult; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(ServerGamePacketListenerImpl.class) @@ -278,4 +281,15 @@ public class ServerGamePacketListenerImpl_scarpetEventsMixin PLAYER_SWINGS_HAND.onHandAction(player, packet.getHand()); } } + + @Inject(method = "handleChat(Lnet/minecraft/server/network/TextFilter$FilteredText;)V", + at = @At(value = "INVOKE", target = "Ljava/lang/String;startsWith(Ljava/lang/String;)Z"), + locals = LocalCapture.CAPTURE_FAILHARD + ) + private void onChatMessage(TextFilter.FilteredText filteredText, CallbackInfo ci, String string) { + if (PLAYER_MESSAGE.isNeeded()) + { + PLAYER_MESSAGE.onPlayerMessage(player,string); + } + } } diff --git a/src/main/java/carpet/script/CarpetEventServer.java b/src/main/java/carpet/script/CarpetEventServer.java index 85302354..8b0dd3c5 100644 --- a/src/main/java/carpet/script/CarpetEventServer.java +++ b/src/main/java/carpet/script/CarpetEventServer.java @@ -856,6 +856,14 @@ public class CarpetEventServer handler.call( () -> Arrays.asList(new EntityValue(player), new StringValue(message)), player::createCommandSourceStack); } }; + + public static final Event PLAYER_MESSAGE = new Event("player_message", 2, false) { + @Override + public void onPlayerMessage(ServerPlayer player, String message) { + handler.call( () -> Arrays.asList(new EntityValue(player), new StringValue(message)), player::createCommandSourceStack); + } + }; + public static final Event STATISTICS = new Event("statistic", 4, false) { private ResourceLocation getStatId(Stat stat) diff --git a/src/main/resources/assets/carpet/scripts/event_test.sc b/src/main/resources/assets/carpet/scripts/event_test.sc index 2d0bfc14..6d59b1f0 100644 --- a/src/main/resources/assets/carpet/scripts/event_test.sc +++ b/src/main/resources/assets/carpet/scripts/event_test.sc @@ -251,6 +251,13 @@ __on_player_disconnects(player, reason) -> print('Player '+player+' disconnects because: '+reason) ); +__on_player_message(player, message) -> +( + print(''); + print('__on_player_message(player, message)'); + print('Player '+player+' sent message: '+message) +); + __on_player_chooses_recipe(player, recipe, full_stack) -> ( print('');