When plugins are disabled via smashed pumpkin, they receive a
.deactivated suffix. The server was not recognizing this convention
and logged errors for each disabled plugin on startup. Skip files
with the .deactivated extension in load_plugins() so disabled
plugins are silently ignored.
* initial commit
# Conflicts:
# Cargo.toml
# Conflicts:
# Cargo.toml
* implemented more `DataResult` methods
* finished data result struct
* fixed clippy errors
* implemented `map_like` and more `dynamic_ops` methods
* finished most other `DynamicOps` methods
* Fixed doc in get_bytes
* added encoder and decoder files
* fixed some stuff and added primitive codecs
* added some primitive codecs (has errors for now)
* changed the "stream" ops methods
* reworked types of the coders and codecs, added list codecs
* added JSON ops
* fixed list codecs, added some doc test examples in `JsonOps`
* added lazy codecs
* added map encoders, decoders and struct builders
* actually added mapdecoder
* added encoder and decoder transformations
* fixed encoder and decoder transformations and added transformation functions and range codecs
* added field encoders and decoders and separated range codecs
* added field encoders and decoders and separated range codecs
* added BaseMapCodec and SimpleMapCodec
* added struct codecs and moved tests
* added `NbtOps`, unsigned number codec types, range codec tests, a struct test, detailed `Codec` documentation
* added optional field map codecs, the validator function and reworked struct builder functions
* added unbounded map and struct codec tests and reworked validated codecs
* did some visibility refactoring
* fixed some stuff and renamed unsigned number codecs
* fixed formatting
* fixed docs to reflect changes on renaming unsigned number codecs
* fixed validated test
* fixed doctest
* moved base_map_codec and fixed docs about codecs
* fixed some mistakes in the code
* fixed some more mistakes in the code and converted some `DataResult::error` calls to `DataResult::partial_error`
* fixed formatting
* fixed some incorrect docs
* removed `OnceLock`s in `MapCodec`s so they can be used more easily
* fixed transformer codec descriptions, added more `NbtOps` tests and fixed some `NbtOps` list methods
* fixed doctest
* added a method to allow creating a field using a `MapCodec` reference
* bifurcated `MapCodecCodec`s as well
* removed imports only for documentation and replaced them with intra-doc links
* added additional docs to `optional_field_with_default` and `lenient_optional_field_with_default` Codec methods for additional details on encoding
* renamed crate to `pumpkin-codecs` so that data fixing can be placed somewhere else not frequently used
* fixed invalid nbt tag for test
* reverted wrapping the tags for heterogeneous elements
* fixed a few more issues
* initial commit
# Conflicts:
# Cargo.toml
* added `NbtOps`, unsigned number codec types, range codec tests, a struct test, detailed `Codec` documentation
* renamed crate to `pumpkin-codecs` so that data fixing can be placed somewhere else not frequently used
* added either codecs and either map codecs
* added a test and extra either methods
* added extra assertion
* removed this crate's `either` module in favor of the `either` crate
* fixed rebase
* fixed Cargo.lock
* removed old folder
* removed `DataResult` change
* feat(wasm-api): port i18n module for plugin and host use
* feat(wasm-api): expand player WIT API
* feat(wit): make player APIs fallible and propagate errors
* feat(wit): add player info, inventory, and status queries
* feat(wit): add player permission and display name APIs
* initial commit
# Conflicts:
# Cargo.toml
* implemented more `DataResult` methods
* finished data result struct
* fixed clippy errors
* implemented `map_like` and more `dynamic_ops` methods
* finished most other `DynamicOps` methods
* Fixed doc in get_bytes
* added encoder and decoder files
* fixed some stuff and added primitive codecs
* added some primitive codecs (has errors for now)
* changed the "stream" ops methods
* reworked types of the coders and codecs, added list codecs
* added JSON ops
* fixed list codecs, added some doc test examples in `JsonOps`
* added lazy codecs
* added map encoders, decoders and struct builders
* actually added mapdecoder
* added encoder and decoder transformations
* fixed encoder and decoder transformations and added transformation functions and range codecs
* added field encoders and decoders and separated range codecs
* added field encoders and decoders and separated range codecs
* added BaseMapCodec and SimpleMapCodec
* added struct codecs and moved tests
* added `NbtOps`, unsigned number codec types, range codec tests, a struct test, detailed `Codec` documentation
* added optional field map codecs, the validator function and reworked struct builder functions
* added unbounded map and struct codec tests and reworked validated codecs
* did some visibility refactoring
* fixed some stuff and renamed unsigned number codecs
* fixed formatting
* fixed docs to reflect changes on renaming unsigned number codecs
* fixed validated test
* fixed doctest
* moved base_map_codec and fixed docs about codecs
* fixed some mistakes in the code
* fixed some more mistakes in the code and converted some `DataResult::error` calls to `DataResult::partial_error`
* fixed formatting
* fixed some incorrect docs
* removed `OnceLock`s in `MapCodec`s so they can be used more easily
* fixed transformer codec descriptions, added more `NbtOps` tests and fixed some `NbtOps` list methods
* fixed doctest
* added a fourth specific `NbtOps` test for byte buffers (`ByteArray`s in NBT)
* fixed grammar mistake
* log messages for discarded keys in `create_map`
* use the `tracing` crate for logging
* added a method to allow creating a field using a `MapCodec` reference
* bifurcated `MapCodecCodec`s as well
* removed imports only for documentation and replaced them with intra-doc links
* added additional docs to `optional_field_with_default` and `lenient_optional_field_with_default` Codec methods for additional details on encoding
* renamed crate to `pumpkin-codecs` so that data fixing can be placed somewhere else not frequently used
* fixed some more errors and reworked `nbt_ops`'s `ListCollector` to be like 1.21.11, also allows &str in `DataResult`'s creation methods
* fixed invalid nbt tag for test
* reverted wrapping the tags for heterogeneous elements
* renamed function parameter in `DataResult::apply_2`
* removed unnecessary comment
* fixed a few more issues
* fixed formatting
* fixed another mistake for `DataResult::add_message`
* renamed `DataResult` factory methods to be more idiomatic and removed unnecessary `dyn` method
* removed unnecessary `clone()`
* updated Cargo.lock
* Added BellBlock and BellBlockEntity
Plays sound, works with redstone (update_neighbours) and placement is
correct. Animation still missing (emit for game event/block update
packet not sent?)
* Added raiders_hear_bell function
Currently only returns dummy value
* Fix clippy errors
* cargo fmt
* Added placement validation and more
- Added placement validation
- removed reverse_horizontal_facing (now using .opposite())
- now removing block entity on block break
* Add Block Entity to mod.rs
* cargo fmt
* Small improvements
* fix cargo fmt
---------
Signed-off-by: Jonas <158217095+R40fendt@users.noreply.github.com>
* perf(network): migrate world broadcasts to O(V) chunk-based subscriptions
* Introduced `broadcast_to_chunk` and `broadcast_to_chunk_except` in `World` to utilize Chebyshev distance math for O(V) packet routing.
* Migrated block updates, block entity data, and synced block events to strictly broadcast to players with the target chunk loaded.
* Optimized entity network overhead by chunk-filtering movement, rotation, metadata, spawning, and equipment packets.
* Refactored sound events to use volume-aware, chunk-filtered loops instead of global server iterations.
* Ensured all edge cases, including passenger mounting/dismounting, player bed animations, and teleportation, utilize localized broadcasts.
* perf(network): optimize chunk broadcasts and fix bedrock exclusions
- Extracted Chebyshev distance math into `is_within_view_distance` helper
- Added `#[inline]` and `#[must_use]` attributes to the distance helper
- Fixed Bedrock packet echo bug by standardizing exclusions to use `entity_uuid` instead of `gameprofile.id`
- Removed dead metadata serialization code in `send_meta_data`
- Standardized sound attenuation math across audio events
- Cleaned up leftover developer TODO comments
* fix(world): leftover dev comment + leftover unmigrated bedrock exclusion
* skip random tick
* skip tick out of loop and better randomness
* min y
* formating
* properly ticking block and fluid check
* clippy
* fix malformed NBT and i64 overflow
* formating
---------
Co-authored-by: chocodev11 <chocodev11@users.noreply.github.com>
* initial commit
* added more functions
* ported /help command to new dispatcher
* /? shows similar usage to /help instead of `-> help`
* fixed /help bugs
* change min limit in `read_boxed_slice` to 0 so that empty command (`/`) doesn't cause an error
* fixed clippy errors
* formatted
* added convenience for fetching world and server from context
* fixed `min` mistakes to `max` instead
* changed node to now store a list of predicates as its requirement (permission included)
* added easier way to register aliases
* prevent unauthorized usage of command when aliased
* added `TextComponent::empty()` to create empty text only for the purpose of adding children to it
* added more documentation
* make argument more obvious
* fixed some issues (not done yet)
* added more clarification in comments & docs
* fixed fn docs
* fixed order of arguments in translated error
---------
Signed-off-by: Alexander Medvedev <lilalexmed@proton.me>
Co-authored-by: Alexander Medvedev <lilalexmed@proton.me>
* feat(wasm-api): port world core events
# Conflicts:
# pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1_0/context.rs
* fix(wasm-api): satisfy clippy for world event batch
* style(wasm-api): format world event registration
* feat: add mob ai throttling
* chore: formating
* fix: prevent entity leak and server timeout during death animation
* fix: vanilla parity + optimize entity position and rotation updates to reduce unnecessary broadcasts
* chore: formatting
* feat: broadcast EntityStatus when equipment breaks
Pumpkin did not play any sound or show break particles when a tool or
piece of armour reached zero durability. Vanilla sends a per-slot
EntityStatus packet (47-52, 65, 68) that every nearby client uses to
play the break sound and spawn break particles textured with the item
that just broke.
Changes
-------
player.rs – new damage_item_in_slot(slot, amount) method:
- Generalises the old damage_held_item to cover all EquipmentSlots:
MainHand, OffHand, Head, Chest, Legs, Feet.
- Resolves the correct PlayerInventory slot index per slot (36-39 for
armour, 40 for off-hand) consistent with build_equipment_slots().
- Sends the EntityStatus break packet BEFORE clearing the slot so
clients can use the item texture for break particles.
- Bypasses sync_hand_slot (which only broadcast for hand slots) and
instead calls enqueue_slot_set_packet + send_equipment_changes
directly, ensuring armour equipment changes also propagate.
- damage_held_item is kept as a thin convenience wrapper.
apply_mending_from_xp – DRY refactor:
- Replaces three separate candidate-gathering blocks (main hand, off
hand, armour loop) with a single unified slot_pairs list iterated
once. Behaviour is identical.
living.rs – damage_armor_items:
- When a player takes hit damage, armour durability is reduced through
LivingEntity::damage_armor_items, a separate code path from the
player item-damage methods. This path now also broadcasts the
EntityStatus break packet when an armour piece's durability hits zero.
entity/mod.rs – shared helper:
- Add equipment_break_status(slot) -> EntityStatus as a #[must_use]
pub const fn. Eliminates the duplicated slot→status match that would
otherwise exist in both call sites (player.rs and living.rs).
Tests (16 new)
--------------
- entity::tests::equipment_break_status_maps_all_slots – asserts every
EquipmentSlot variant (including Body and Saddle) maps to its
expected EntityStatus break variant.
- item::tests (15 tests) – first unit tests for ItemStack durability
logic, covering damage_item_with_context (zero/negative amount,
non-damageable item, unbreakable item, accumulation, stack break at
max damage, over-damage) and repair_item (zero/negative amount,
undamaged item, partial repair, cap at current damage, full repair
clears the Damage component patch entry) and set_damage (negative
value clamps to zero).
* refactor: use table-driven cases in damage_increases_damage_value test
* chore: make clippy happy
* refactor: the rest of damage and repair tests to use table-driven cases
* feat: broadcast EntityStatus when equipment breaks
- Implement strict packet ordering (EntityStatus before slot sync)
- Add break broadcast in play.rs use_on_block for all tools
- Generalize damage_item_in_slot to support all equipped slots
- Trim PR comments to 1-2 professional lines
- Convert equipment_break_status test to table-driven format
- Ensure vanilla parity per decompiled 1.21.11 EntityEvent mappings
* feat(item): durability overhaul — DamageResult, armor/weapon parity, elytra fix
pumpkin-world
- Add DamageResult enum (Untouched/Damaged/Broken) replacing bool return on
damage_item_with_context and damage_item
- Elytra clamped at max_damage-1; never deleted from inventory
- Stacked item break correctly returns Broken regardless of remaining count
- Add is_axe/is_pickaxe/is_shovel/is_hoe tag-based predicates to ItemStack
- 21 new unit tests covering all cases (elytra, stacks, Unbreaking, categories)
pumpkin
- Armor damage type filter: bypasses_armor_durability() driven by the
vanilla minecraft:bypasses_armor data tag (1.21.11); id-based u8 lookup
- Elytra worn in armor slot skipped from hit damage
- Thorns: extra +2 durability cost + 1-4 magic retaliation damage
- Weapon 2-durability cost: axes/pickaxes/shovels/hoes in combat
- Fix armor slot Unbreaking formula (is_armor_slot() gate)
- Fix stacked-item break broadcast (Broken not is_empty())
- Extract combat_weapon_durability_cost as sync fn; reuse existing lock
- 5 forward-compatible TODO one-liners for shield/trident/crossbow/fishing rod/brush
* fix(item): resolve vanilla parity issues in durability and combat tracking
- Move armor durability calculation to pre-absorption damage
- Fix Thorns damage range to uniform float [1.0, 5.0) and correct execution order
- Attribute Thorns damage to victim for correct combat tracking
- Refactor `damage_item` to auto-infer armor via `#minecraft:enchantable/armor`
- Decouple Elytra clamping from generic item damage loop into dedicated methods
- Add TODOs for DAMAGE_RESISTANT, post-attack effects, and data-driven bypasses
Also reformatted long comments to be concise and techincal
* chore: trigger CI rerun
* fix: shears no longer take durability damage when attacking mobs (refactor + codegen to standardize)
Replace hardcoded item-category checks in combat_weapon_durability_cost
with a data-driven lookup of the minecraft:weapon component.
- Add item_damage_per_attack field to WeaponImpl with DataComponentImpl
- Wire WeaponComponent deserialization into pumpkin-codegen item builder
- Regenerate item data so weapon durability values come from items.json
- Items without the Weapon component (e.g. shears) return 0 cost
* chore: retrigger CI
* refactor: Remove Thorns retaliation and trigger mechanics
- Remove Thorns enchantment trigger check and probability
- Remove Thorns extra +2 durability cost on armor
- Remove Thorns retaliation damage to attacker (1-5 magic damage)
- Remove Thorns combat attribution via damage_with_context
- Remove related imports and TODO comments
- Keep source parameter for future compatibility
* fix: glaring issues
- Fix WeaponImpl::read_data to actually read item_damage_per_attack from NBT
instead of hardcoding 1; custom weapons now load correctly
- Remove unused _source parameter from damage_armor_items signature
- Move is_axe/is_pickaxe/is_shovel/is_hoe behind #[cfg(test)] since they're
test-only helpers, keeping public API clean
* fix: elytra unbreaking and Pre-absorption Armor Test
Also a comment for clarity
* refactor: remove elytra scope creep: damage handling and related tests
* adjustment: tighten unbreaking test, update comments to be correct
* fix: clamp negative NBT, widen Unbreaking test, document elytra and shield-disable TODOs
* refactor: armor bypass logic: use bitmask, hoist lookups, optimize durability loop
* feat: Remove hardcoded Elytra armor check; use EquippableImpl::damage_on_hurt for data-driven durability logic.
* fix: add bitmask compile-time assert, clarify NBT clamping, document damage_on_hurt logic, rename slot_result, add #[must_use] to damage_item, and fix all unused result warnings.
* fix: clarify stacked item break edge, strengthen bitmask asserts, document NBT error handling, add TODOs for tool break handling and loop short-circuit, remove dead code and trident stub, note TOCTOU, and document test determinism. All tests passing.
* fix: Various
CRITICAL ITEMS:
* bypasses_armor_durability correctness: Verified by existing test suite
(validates all 19 bypass types return true, 12 physical types return false).
* TOCTOU race in attack(): Enhanced documentation with 3 specific mitigation
options and justification for single-player safety.
* must_use suppressions: Removed #[must_use] from damage_item; added TODO to
restore once all DamageResult::Broken handlers implement proper semantics.
SIGNIFICANT ITEMS:
* DamageResult::Broken semantics: Updated doc comment to clarify that breaking
always broadcasts correctly—whether consuming a single item or decrementing
a stack. Callers need not split the enum.
* Stacked item multi-break behavior: Verified matches vanilla (one break per
call, never chains). Updated comment to document this as correct behavior,
not a regression.
* should_apply_durability_damage_with visibility: Made private to prevent
incorrect unbreaking formula usage outside durability context.
* Elytra exemption caching optimization: Added PERF comment noting O(1)
component lookup is already efficient (max 4/hit). Deferred to dedicated
caching architecture pass.
MINOR ITEMS:
* Unbreaking test windows: Tightened from (500–1500) to (865–1135) for ±5σ
confidence—catches actual formula regressions while remaining statistically
sound. Updated both tool and armor tests.
* WeaponImpl NBT error handling: Documented conservative fallback behavior
(clamp negatives, default missing keys). Added TODO for tracing::warn! at
higher-level call site.
* default_item_damage naming: Renamed return_1u32 for consistency and clarity
in weapon damage context.
* WeaponImpl Hash collision prevention: Added struct-level NOTE reminding
developers to update get_hash() if fields are added. Deferred until
multi-field scenario (currently impossible with one field).
* fix: Resolve duplicate `return_1f32` and restore `#[must_use]` on `damage_item`
- Removed duplicate `return_1f32` function in `pumpkin-codegen/src/item.rs` to fix a compile blocker.
- Restored `#[must_use]` attribute on `damage_item` in `pumpkin-world/src/item/mod.rs` to enforce proper handling of `DamageResult`.