Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions pumpkin-plugin-api/src/events/player/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ pub mod player_chat;
pub mod player_command_send;
pub mod player_custom_payload;
pub mod player_gamemode_change;
pub mod player_interact_unknown_entity;
pub mod player_join;
pub mod player_leave;
pub mod player_login;
Expand All @@ -25,6 +26,7 @@ pub use player_chat::*;
pub use player_command_send::*;
pub use player_custom_payload::*;
pub use player_gamemode_change::*;
pub use player_interact_unknown_entity::*;
pub use player_join::*;
pub use player_leave::*;
pub use player_login::*;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
use crate::wit::pumpkin::plugin::event::{Event, EventType, PlayerInteractUnknownEntityEventData};

use super::super::FromIntoEvent;

/// An event that occurs when a player interacts with an entity ID that the server cannot resolve.
///
/// The associated [`PlayerInteractUnknownEntityEventData`] contains the player, the unknown
/// entity ID, and the attempted interaction action. This event is cancellable.
pub struct PlayerInteractUnknownEntityEvent;

impl FromIntoEvent for PlayerInteractUnknownEntityEvent {
const EVENT_TYPE: EventType = EventType::PlayerInteractUnknownEntityEvent;
type Data = PlayerInteractUnknownEntityEventData;

fn data_from_event(event: Event) -> Self::Data {
match event {
Event::PlayerInteractUnknownEntityEvent(data) => data,
_ => panic!("unexpected event"),
}
}

fn data_into_event(data: Self::Data) -> Event {
Event::PlayerInteractUnknownEntityEvent(data)
}
}
15 changes: 15 additions & 0 deletions pumpkin-plugin-wit/v0.1.0/event.wit
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,19 @@ interface event {
cancelled: bool
}

enum entity-interaction-action {
interact,
attack,
interact-at,
}

record player-interact-unknown-entity-event-data {
player: player,
entity-id: s32,
action: entity-interaction-action,
cancelled: bool
}

record block-redstone-event-data {
target-world: %world,
state-id: u16,
Expand Down Expand Up @@ -221,6 +234,7 @@ interface event {
player-custom-payload-event,
player-fish-event,
player-egg-throw-event,
player-interact-unknown-entity-event,
block-redstone-event,
block-break-event,
block-burn-event,
Expand Down Expand Up @@ -249,6 +263,7 @@ interface event {
player-custom-payload-event(player-custom-payload-event-data),
player-fish-event(player-fish-event-data),
player-egg-throw-event(player-egg-throw-event-data),
player-interact-unknown-entity-event(player-interact-unknown-entity-event-data),
block-redstone-event(block-redstone-event-data),
block-break-event(block-break-event-data),
block-burn-event(block-burn-event-data),
Expand Down
15 changes: 11 additions & 4 deletions pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1_0/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,11 @@ async fn register_player_event(
player_change_world::PlayerChangeWorldEvent, player_chat::PlayerChatEvent,
player_command_send::PlayerCommandSendEvent,
player_custom_payload::PlayerCustomPayloadEvent,
player_gamemode_change::PlayerGamemodeChangeEvent, player_join::PlayerJoinEvent,
player_leave::PlayerLeaveEvent, player_login::PlayerLoginEvent,
player_move::PlayerMoveEvent, player_permission_check::PlayerPermissionCheckEvent,
player_teleport::PlayerTeleportEvent,
player_gamemode_change::PlayerGamemodeChangeEvent,
player_interact_unknown_entity_event::PlayerInteractUnknownEntityEvent,
player_join::PlayerJoinEvent, player_leave::PlayerLeaveEvent,
player_login::PlayerLoginEvent, player_move::PlayerMoveEvent,
player_permission_check::PlayerPermissionCheckEvent, player_teleport::PlayerTeleportEvent,
};

match event_type {
Expand Down Expand Up @@ -121,6 +122,12 @@ async fn register_player_event(
register_typed_event::<PlayerEggThrowEvent>(resource, handler, priority, blocking)
.await;
}
EventType::PlayerInteractUnknownEntityEvent => {
register_typed_event::<PlayerInteractUnknownEntityEvent>(
resource, handler, priority, blocking,
)
.await;
}
_ => unreachable!("non-player event should not be routed to register_player_event"),
}
}
Expand Down
21 changes: 21 additions & 0 deletions pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1_0/events/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use std::sync::Arc;

use pumpkin_data::{Block, entity::EntityType};
use pumpkin_protocol::java::server::play::ActionType;
use pumpkin_util::{
GameMode, Hand,
math::{position::BlockPos, vector3::Vector3},
Expand Down Expand Up @@ -98,6 +99,26 @@ pub(super) const fn from_wasm_hand(hand: pumpkin::plugin::common::Hand) -> Hand
}
}

pub(super) const fn to_wasm_entity_interaction_action(
action: &ActionType,
) -> pumpkin::plugin::event::EntityInteractionAction {
match action {
ActionType::Interact => pumpkin::plugin::event::EntityInteractionAction::Interact,
ActionType::Attack => pumpkin::plugin::event::EntityInteractionAction::Attack,
ActionType::InteractAt => pumpkin::plugin::event::EntityInteractionAction::InteractAt,
}
}

pub(super) const fn from_wasm_entity_interaction_action(
action: pumpkin::plugin::event::EntityInteractionAction,
) -> ActionType {
match action {
pumpkin::plugin::event::EntityInteractionAction::Interact => ActionType::Interact,
pumpkin::plugin::event::EntityInteractionAction::Attack => ActionType::Attack,
pumpkin::plugin::event::EntityInteractionAction::InteractAt => ActionType::InteractAt,
}
}

pub(super) const fn to_wasm_game_mode(game_mode: GameMode) -> pumpkin::plugin::common::GameMode {
match game_mode {
GameMode::Survival => pumpkin::plugin::common::GameMode::Survival,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,18 @@ use crate::plugin::{
wit::v0_1_0::{
events::{
ToFromV0_1_0WasmEvent, consume_player, consume_text_component, consume_world,
from_wasm_entity_type, from_wasm_game_mode, from_wasm_hand, from_wasm_position,
from_wasm_entity_interaction_action, from_wasm_entity_type, from_wasm_game_mode,
from_wasm_hand, from_wasm_position, to_wasm_entity_interaction_action,
to_wasm_entity_type, to_wasm_game_mode, to_wasm_hand, to_wasm_position,
},
pumpkin::plugin::event::{
Event, PlayerChangeWorldEventData, PlayerChangedMainHandEventData,
PlayerChatEventData, PlayerCommandSendEventData, PlayerCustomPayloadEventData,
PlayerEggThrowEventData, PlayerExpChangeEventData, PlayerFishEventData,
PlayerFishState as WasmPlayerFishState, PlayerGamemodeChangeEventData,
PlayerItemHeldEventData, PlayerJoinEventData, PlayerLeaveEventData,
PlayerLoginEventData, PlayerMoveEventData, PlayerPermissionCheckEventData,
PlayerTeleportEventData,
PlayerInteractUnknownEntityEventData, PlayerItemHeldEventData, PlayerJoinEventData,
PlayerLeaveEventData, PlayerLoginEventData, PlayerMoveEventData,
PlayerPermissionCheckEventData, PlayerTeleportEventData,
},
},
},
Expand All @@ -29,6 +30,7 @@ use crate::plugin::{
player_command_send::PlayerCommandSendEvent,
player_custom_payload::PlayerCustomPayloadEvent,
player_gamemode_change::PlayerGamemodeChangeEvent,
player_interact_unknown_entity_event::PlayerInteractUnknownEntityEvent,
player_join::PlayerJoinEvent,
player_leave::PlayerLeaveEvent,
player_login::PlayerLoginEvent,
Expand Down Expand Up @@ -523,3 +525,30 @@ impl ToFromV0_1_0WasmEvent for PlayerEggThrowEvent {
}
}
}

impl ToFromV0_1_0WasmEvent for PlayerInteractUnknownEntityEvent {
fn to_v0_1_0_wasm_event(&self, state: &mut PluginHostState) -> Event {
let player = state
.add_player(self.player.clone())
.expect("failed to add player resource");

Event::PlayerInteractUnknownEntityEvent(PlayerInteractUnknownEntityEventData {
player,
entity_id: self.entity_id,
action: to_wasm_entity_interaction_action(&self.action),
cancelled: self.cancelled,
})
}

fn from_v0_1_0_wasm_event(event: Event, state: &mut PluginHostState) -> Self {
match event {
Event::PlayerInteractUnknownEntityEvent(data) => Self {
player: consume_player(state, &data.player),
entity_id: data.entity_id,
action: from_wasm_entity_interaction_action(data.action),
cancelled: data.cancelled,
},
_ => panic!("unexpected event type"),
}
}
}