feat: status effects
This commit is contained in:
parent
ff6acb80b1
commit
ab193d1160
104
v0.1/player.wit
104
v0.1/player.wit
@ -11,6 +11,26 @@ interface player {
|
|||||||
use java-packets.{clientbound-packet as java-packet};
|
use java-packets.{clientbound-packet as java-packet};
|
||||||
use bedrock-packets.{clientbound-packet as bedrock-packet};
|
use bedrock-packets.{clientbound-packet as bedrock-packet};
|
||||||
use uuid.{uuid};
|
use uuid.{uuid};
|
||||||
|
use status-effect.{status-effect-type, status-effect-instance};
|
||||||
|
|
||||||
|
/// Represents per-player weather condition overrides.
|
||||||
|
enum player-weather {
|
||||||
|
clear,
|
||||||
|
downfall,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Types of projectiles that can be launched by a player.
|
||||||
|
enum projectile-type {
|
||||||
|
arrow,
|
||||||
|
snowball,
|
||||||
|
egg,
|
||||||
|
ender-pearl,
|
||||||
|
splash-potion,
|
||||||
|
fireball,
|
||||||
|
small-fireball,
|
||||||
|
trident,
|
||||||
|
wind-charge,
|
||||||
|
}
|
||||||
|
|
||||||
/// Various abilities a player can have.
|
/// Various abilities a player can have.
|
||||||
record player-abilities {
|
record player-abilities {
|
||||||
@ -637,6 +657,50 @@ interface player {
|
|||||||
/// Transfers the player to another server.
|
/// Transfers the player to another server.
|
||||||
transfer: func (host: string, port: u16);
|
transfer: func (host: string, port: u16);
|
||||||
|
|
||||||
|
// Status Effects
|
||||||
|
|
||||||
|
/// Gives a status effect to the player.
|
||||||
|
add-effect: func(effect: status-effect-instance);
|
||||||
|
/// Removes a status effect from the player.
|
||||||
|
remove-effect: func(effect: status-effect-type);
|
||||||
|
/// Clears all active status effects from the player.
|
||||||
|
clear-effects: func();
|
||||||
|
/// Checks if a status effect is currently applied to the player.
|
||||||
|
has-effect: func(effect: status-effect-type) -> bool;
|
||||||
|
/// Returns the status effect instance applied to the player, if any.
|
||||||
|
get-effect: func(effect: status-effect-type) -> option<status-effect-instance>;
|
||||||
|
/// Returns all status effects currently applied to the player.
|
||||||
|
get-active-effects: func() -> list<status-effect-instance>;
|
||||||
|
|
||||||
|
// Health & Damage
|
||||||
|
|
||||||
|
/// Heals the player by a specified amount.
|
||||||
|
heal: func(amount: f32);
|
||||||
|
/// Deals damage to the player by a specified amount.
|
||||||
|
damage: func(amount: f32);
|
||||||
|
/// Kills the player instantly.
|
||||||
|
kill: func();
|
||||||
|
|
||||||
|
// Cooldowns
|
||||||
|
|
||||||
|
/// Starts an item cooldown for a specific item group name.
|
||||||
|
start-cooldown: func(group: string, duration-ticks: s32);
|
||||||
|
/// Returns the cooldown progress (0.0 to 1.0) for a specific item group.
|
||||||
|
get-cooldown: func(group: string) -> f32;
|
||||||
|
/// Checks if a specific item group is currently on cooldown.
|
||||||
|
is-on-cooldown: func(group: string) -> bool;
|
||||||
|
|
||||||
|
// Abilities & Flight
|
||||||
|
|
||||||
|
/// Sets whether the player is allowed to fly.
|
||||||
|
set-allow-flight: func(allowed: bool);
|
||||||
|
/// Sets the player's flying speed.
|
||||||
|
set-fly-speed: func(speed: f32);
|
||||||
|
/// Sets the player's walking speed.
|
||||||
|
set-walk-speed: func(speed: f32);
|
||||||
|
/// Sets whether the player is invulnerable to damage.
|
||||||
|
set-invulnerable: func(invulnerable: bool);
|
||||||
|
|
||||||
// Inventory
|
// Inventory
|
||||||
|
|
||||||
/// Returns the index of the currently selected hotbar slot (0-8).
|
/// Returns the index of the currently selected hotbar slot (0-8).
|
||||||
@ -720,6 +784,46 @@ interface player {
|
|||||||
/// Sets which skin parts are visible.
|
/// Sets which skin parts are visible.
|
||||||
set-skin-parts: func(parts: skin-parts);
|
set-skin-parts: func(parts: skin-parts);
|
||||||
|
|
||||||
|
// Per-Player Environment & Overrides
|
||||||
|
|
||||||
|
/// Overrides the time of day shown to this player.
|
||||||
|
set-player-time: func(time: u64, relative: bool);
|
||||||
|
/// Resets the player's time to sync with the server world time.
|
||||||
|
reset-player-time: func();
|
||||||
|
/// Returns the custom time set for this player, if any.
|
||||||
|
get-player-time: func() -> option<u64>;
|
||||||
|
/// Checks if the custom player time is relative to the world time.
|
||||||
|
is-player-time-relative: func() -> bool;
|
||||||
|
|
||||||
|
/// Overrides the weather condition shown to this player.
|
||||||
|
set-player-weather: func(weather: player-weather);
|
||||||
|
/// Resets the player's weather to match the server world weather.
|
||||||
|
reset-player-weather: func();
|
||||||
|
/// Returns the custom weather set for this player, if any.
|
||||||
|
get-player-weather: func() -> option<player-weather>;
|
||||||
|
|
||||||
|
/// Sets the position where the player's compass points.
|
||||||
|
set-compass-target: func(pos: position);
|
||||||
|
/// Returns the position where the player's compass currently points.
|
||||||
|
get-compass-target: func() -> position;
|
||||||
|
|
||||||
|
/// Sets the player's custom respawn / bed location.
|
||||||
|
set-respawn-location: func(pos: position);
|
||||||
|
/// Returns the player's custom respawn / bed location, if set.
|
||||||
|
get-respawn-location: func() -> option<position>;
|
||||||
|
|
||||||
|
/// Hides another player from this player's view (vanish).
|
||||||
|
hide-player: func(other: player);
|
||||||
|
/// Shows a previously hidden player to this player.
|
||||||
|
show-player: func(other: player);
|
||||||
|
/// Checks if this player can see another specified player.
|
||||||
|
can-see: func(other: player) -> bool;
|
||||||
|
|
||||||
|
/// Raycasts from the player's eyes to find the block being targeted.
|
||||||
|
get-target-block: func(max-distance: u32) -> option<position>;
|
||||||
|
/// Launches a projectile from the player's eyes in their line of sight.
|
||||||
|
launch-projectile: func(%type: projectile-type) -> option<entity>;
|
||||||
|
|
||||||
/// Returns a Java-specific player handle, if the player is connected via Java Edition.
|
/// Returns a Java-specific player handle, if the player is connected via Java Edition.
|
||||||
///
|
///
|
||||||
/// This allows access to Java-exclusive features like sending specific packets
|
/// This allows access to Java-exclusive features like sending specific packets
|
||||||
|
|||||||
@ -8,6 +8,7 @@ world plugin {
|
|||||||
use event.{event};
|
use event.{event};
|
||||||
use server.{server as server-instance};
|
use server.{server as server-instance};
|
||||||
use command.{command-sender, consumed-args, command-error};
|
use command.{command-sender, consumed-args, command-error};
|
||||||
|
use %world.{entity};
|
||||||
|
|
||||||
// --- Host-provided imports ---
|
// --- Host-provided imports ---
|
||||||
|
|
||||||
@ -39,6 +40,8 @@ world plugin {
|
|||||||
import forms;
|
import forms;
|
||||||
/// Provides Java Edition dialogs.
|
/// Provides Java Edition dialogs.
|
||||||
import java-dialogs;
|
import java-dialogs;
|
||||||
|
/// Provides status effect types and instances.
|
||||||
|
import status-effect;
|
||||||
|
|
||||||
// --- Plugin-provided exports ---
|
// --- Plugin-provided exports ---
|
||||||
|
|
||||||
@ -65,4 +68,10 @@ world plugin {
|
|||||||
|
|
||||||
/// Dispatches a scheduled task execution to the plugin.
|
/// Dispatches a scheduled task execution to the plugin.
|
||||||
export handle-task: func(handler-id: u32, server: server-instance);
|
export handle-task: func(handler-id: u32, server: server-instance);
|
||||||
|
|
||||||
|
export handle-ai-goal-can-start: func(goal-id: u32, server: server-instance, entity: entity) -> bool;
|
||||||
|
export handle-ai-goal-should-continue: func(goal-id: u32, server: server-instance, entity: entity) -> bool;
|
||||||
|
export handle-ai-goal-start: func(goal-id: u32, server: server-instance, entity: entity);
|
||||||
|
export handle-ai-goal-tick: func(goal-id: u32, server: server-instance, entity: entity);
|
||||||
|
export handle-ai-goal-stop: func(goal-id: u32, server: server-instance, entity: entity);
|
||||||
}
|
}
|
||||||
|
|||||||
54
v0.1/status-effect.wit
Normal file
54
v0.1/status-effect.wit
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
package pumpkin:plugin@0.1.0;
|
||||||
|
|
||||||
|
interface status-effect {
|
||||||
|
enum status-effect-type {
|
||||||
|
speed,
|
||||||
|
slowness,
|
||||||
|
haste,
|
||||||
|
mining-fatigue,
|
||||||
|
strength,
|
||||||
|
instant-health,
|
||||||
|
instant-damage,
|
||||||
|
jump-boost,
|
||||||
|
nausea,
|
||||||
|
regeneration,
|
||||||
|
resistance,
|
||||||
|
fire-resistance,
|
||||||
|
water-breathing,
|
||||||
|
invisibility,
|
||||||
|
blindness,
|
||||||
|
night-vision,
|
||||||
|
hunger,
|
||||||
|
weakness,
|
||||||
|
poison,
|
||||||
|
wither,
|
||||||
|
health-boost,
|
||||||
|
absorption,
|
||||||
|
saturation,
|
||||||
|
glowing,
|
||||||
|
levitation,
|
||||||
|
luck,
|
||||||
|
unluck,
|
||||||
|
slow-falling,
|
||||||
|
conduit-power,
|
||||||
|
dolphins-grace,
|
||||||
|
bad-omen,
|
||||||
|
hero-of-the-village,
|
||||||
|
darkness,
|
||||||
|
trial-omen,
|
||||||
|
raid-omen,
|
||||||
|
wind-charged,
|
||||||
|
weaving,
|
||||||
|
oozing,
|
||||||
|
infested,
|
||||||
|
}
|
||||||
|
|
||||||
|
record status-effect-instance {
|
||||||
|
effect-type: status-effect-type,
|
||||||
|
duration: u32,
|
||||||
|
amplifier: u8,
|
||||||
|
ambient: bool,
|
||||||
|
show-particles: bool,
|
||||||
|
show-icon: bool,
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -24,6 +24,22 @@ interface %world {
|
|||||||
push-only
|
push-only
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Predefined AI goals that can be added to mob entities.
|
||||||
|
variant builtin-ai-goal {
|
||||||
|
swim,
|
||||||
|
wander-around(f32),
|
||||||
|
melee-attack(f32),
|
||||||
|
look-at-player(f32),
|
||||||
|
look-around,
|
||||||
|
escape-danger(f32),
|
||||||
|
avoid-entity(f32),
|
||||||
|
blaze-attack,
|
||||||
|
creeper-ignite,
|
||||||
|
eat-grass,
|
||||||
|
zombie-attack(f32),
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/// Categories for sounds to control their volume independently.
|
/// Categories for sounds to control their volume independently.
|
||||||
enum sound-category {
|
enum sound-category {
|
||||||
master,
|
master,
|
||||||
@ -230,6 +246,11 @@ interface %world {
|
|||||||
is-fall-flying: func() -> bool;
|
is-fall-flying: func() -> bool;
|
||||||
set-fall-flying: func(fall-flying: bool);
|
set-fall-flying: func(fall-flying: bool);
|
||||||
|
|
||||||
|
is-silent: func() -> bool;
|
||||||
|
set-silent: func(silent: bool);
|
||||||
|
has-gravity: func() -> bool;
|
||||||
|
set-has-gravity: func(gravity: bool);
|
||||||
|
|
||||||
get-width: func() -> f32;
|
get-width: func() -> f32;
|
||||||
get-height: func() -> f32;
|
get-height: func() -> f32;
|
||||||
|
|
||||||
@ -269,6 +290,27 @@ interface %world {
|
|||||||
|
|
||||||
remove: func();
|
remove: func();
|
||||||
|
|
||||||
|
/// Adds a built-in AI goal to this mob entity at the specified priority level.
|
||||||
|
add-ai-goal: func(priority: u8, goal: builtin-ai-goal);
|
||||||
|
|
||||||
|
/// Adds a custom AI goal to this mob entity at the specified priority level.
|
||||||
|
add-custom-ai-goal: func(priority: u8, goal-id: u32);
|
||||||
|
|
||||||
|
/// Removes all AI goals from this mob entity.
|
||||||
|
clear-ai-goals: func();
|
||||||
|
|
||||||
|
/// Sets whether AI execution is disabled for this entity.
|
||||||
|
set-ai-disabled: func(disabled: bool);
|
||||||
|
|
||||||
|
/// Checks if AI execution is disabled for this entity.
|
||||||
|
is-ai-disabled: func() -> bool;
|
||||||
|
|
||||||
|
/// Sets the target entity for this mob.
|
||||||
|
set-target: func(target: option<entity>);
|
||||||
|
|
||||||
|
/// Gets the current target entity of this mob, if any.
|
||||||
|
get-target: func() -> option<entity>;
|
||||||
|
|
||||||
/// Performs a raycast from the entity's eye position in its looking direction.
|
/// Performs a raycast from the entity's eye position in its looking direction.
|
||||||
raycast: func(max-distance: f64, fluid-handling: bool) -> option<raycast-result>;
|
raycast: func(max-distance: f64, fluid-handling: bool) -> option<raycast-result>;
|
||||||
}
|
}
|
||||||
@ -457,6 +499,12 @@ interface %world {
|
|||||||
/// Returns a list of all entities in this world.
|
/// Returns a list of all entities in this world.
|
||||||
get-entities: func() -> list<entity>;
|
get-entities: func() -> list<entity>;
|
||||||
|
|
||||||
|
/// Spawns a lightning bolt at the specified position.
|
||||||
|
strike-lightning: func(pos: position, effect-only: bool);
|
||||||
|
|
||||||
|
/// Performs a raycast from start position to end position to hit blocks.
|
||||||
|
ray-trace-blocks: func(start: position, end: position) -> option<position>;
|
||||||
|
|
||||||
/// Returns the block entity at the specified position, if any.
|
/// Returns the block entity at the specified position, if any.
|
||||||
get-block-entity: func(pos: block-pos) -> option<block-entity-type>;
|
get-block-entity: func(pos: block-pos) -> option<block-entity-type>;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user