diff --git a/docs/scarpet/api/Events.md b/docs/scarpet/api/Events.md index 3a3f491e57..83771e8646 100644 --- a/docs/scarpet/api/Events.md +++ b/docs/scarpet/api/Events.md @@ -316,7 +316,10 @@ Triggered when the player has successfully logged in and was placed in the game. 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. +Triggered when a player sends a chat message. + +### `__on_player_command(player, command)` +Triggered when a player runs a command. Command value is returned without the / in front. This event can be cancelled by returning `'cancel'`, which prevents the message from being sent. diff --git a/docs/scarpet/resources/editors/idea/4.txt b/docs/scarpet/resources/editors/idea/4.txt index d17f121d44..29bcdb390f 100644 --- a/docs/scarpet/resources/editors/idea/4.txt +++ b/docs/scarpet/resources/editors/idea/4.txt @@ -46,5 +46,6 @@ __on_player_respawns(player) -> __on_player_disconnects(player, reason) -> __on_player_connects(player) -> __on_player_message(player, message) -> +__on_player_command(player, command) -> __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 7ff2ef02cd..8d84d458b7 100644 --- a/docs/scarpet/resources/editors/npp/scarpet.xml +++ b/docs/scarpet/resources/editors/npp/scarpet.xml @@ -149,6 +149,7 @@ __on_player_disconnects(player, reason) -> __on_player_connects(player) -> __on_player_message(player, message) -> + __on_player_command(player, command) -> __on_explosion(pos, power, source, causer, mode, fire) -> __on_explosion_outcome(pos, power, source, causer, mode, fire, blocks, entities) -> diff --git a/src/main/java/carpet/mixins/ServerGamePacketListenerImpl_scarpetEventsMixin.java b/src/main/java/carpet/mixins/ServerGamePacketListenerImpl_scarpetEventsMixin.java index 579891814a..b70a1f8c1c 100644 --- a/src/main/java/carpet/mixins/ServerGamePacketListenerImpl_scarpetEventsMixin.java +++ b/src/main/java/carpet/mixins/ServerGamePacketListenerImpl_scarpetEventsMixin.java @@ -1,6 +1,6 @@ package carpet.mixins; -import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ServerboundChatCommandPacket; import net.minecraft.network.protocol.game.ServerboundChatPacket; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -27,6 +27,7 @@ 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_COMMAND; import static carpet.script.CarpetEventServer.Event.PLAYER_USES_ITEM; import static carpet.script.CarpetEventServer.Event.PLAYER_WAKES_UP; @@ -302,4 +303,14 @@ private void onChatMessage(ServerboundChatPacket serverboundChatPacket, Callback if(PLAYER_MESSAGE.onPlayerMessage(player, serverboundChatPacket.message())) ci.cancel(); } } + + @Inject(method = "handleChatCommand(Lnet/minecraft/network/protocol/game/ServerboundChatCommandPacket;)V", + at = @At(value = "HEAD") + ) + private void onChatCommandMessage(ServerboundChatCommandPacket serverboundChatCommandPacket, CallbackInfo ci) { + if (PLAYER_COMMAND.isNeeded()) + { + PLAYER_COMMAND.onPlayerMessage(player, serverboundChatCommandPacket.command()); + } + } } diff --git a/src/main/java/carpet/script/CarpetEventServer.java b/src/main/java/carpet/script/CarpetEventServer.java index 1842cdd8f0..88460509b4 100644 --- a/src/main/java/carpet/script/CarpetEventServer.java +++ b/src/main/java/carpet/script/CarpetEventServer.java @@ -921,6 +921,13 @@ public boolean onPlayerMessage(ServerPlayer player, String message) { } }; + public static final Event PLAYER_COMMAND = new Event("player_command", 2, false) { + @Override + public boolean onPlayerMessage(ServerPlayer player, String message) { + return 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 ff47320e3e..3e57c792b0 100644 --- a/src/main/resources/assets/carpet/scripts/event_test.sc +++ b/src/main/resources/assets/carpet/scripts/event_test.sc @@ -272,6 +272,13 @@ __on_player_message(player, message) -> print('Player '+player+' sent message: '+message) ); +__on_player_command(player, command) -> +( + print(''); + print('__on_player_command(player, command)'); + print('Player '+player+' sent command: '+command) +); + __on_player_chooses_recipe(player, recipe, full_stack) -> ( print('');