Commit Graph

2499 Commits

Author SHA1 Message Date
dorocha
5f127823ae feat(plugin-api): expose ItemStack, uuid, event and command arg types (#2526)
The item-stack, uuid, and event WIT modules are generated but were never
re-exported from the plugin API, so plugin authors could not name ItemStack
(needed to build GUI icons, /give, skulls) or construct a uuid. This adds them
to the public re-exports, plus EventHandler/FromIntoEvent and the command
Arg/ArgumentType/StringType helpers.

Revives the change from #2325 (closed unmerged).
2026-07-26 11:44:54 +02:00
Maxime Chaffraix
8a2075779b fix(worldgen): give the stronghold room chest a block entity (#2543)
The chest in the stronghold square room was placed as a bare block state,
so no chest block entity was ever created for it. Opening a chest and
resolving a double chest both go through `get_block_entity`, so the chest
could neither be opened nor paired with a chest placed next to it.

Use the existing `add_chest` helper, which writes the block state and the
matching block entity with a loot table, as the nether fortress corridors
already do. Vanilla `StrongholdPieces$RoomCrossing` uses
`chests/stronghold_crossing` at the same position.
2026-07-26 11:39:46 +02:00
necko
ce4f3cc1f1 docs: fix broken chunk loading image link in README (#2547)
Signed-off-by: necko <128916594+Necko1@users.noreply.github.com>
2026-07-26 11:39:10 +02:00
Alexander Medvedev
ac89bff1ca fix: from_legacy_string 2026-07-26 10:25:13 +02:00
Alexander Medvedev
faf8c50d80 chore(mappings): add 1.7 & 1.8 2026-07-25 16:48:20 +02:00
Alexander Medvedev
40d7ed052f feat: add more mappings 2026-07-25 12:38:52 +02:00
Alexander Medvedev
25ba4c6e40 feat: added some Love 💞 2026-07-25 12:08:59 +02:00
Alexander Medvedev
cba7578e28 feat: add Leash 2026-07-25 10:51:55 +02:00
BouncingElf10
0dfaf5d213 feat(block): Added more dispenser behaviors (#2495)
* feat(block): added DispenseContext and drop_item abstractions for dispenser behavior

* feat(block): added specific arrow dispenser behavior

* feat(block): added specific spawn dispenser behavior

* docs(block): added some comments to quickly spot missing dispenser behaviors

* fix: addressed PR review feedback
2026-07-25 09:36:10 +02:00
vyPal
56de61783a fix: use networking.java.online_mode for online mode detection (#2404) 2026-07-25 09:31:39 +02:00
TheDarkSword
2d7cf40761 feat: persist item components that were only set at runtime (#2426)
* feat: persist runtime-set item components

They serialized to nothing before; give the remaining ones a read/write so
their data survives a save/load. Predicate-based ones keep raw NBT for now.

* refactor: remove Cow where unnecessary

Copied it over from ItemModelImpl, but it makes no sense for base_color,
note_block_sound and tooltip_style: they're only ever built at runtime, so a
plain String is enough.
2026-07-25 09:29:46 +02:00
Maxime Chaffraix
64e9d97d7f fix(auth): don't require signatureRequired in texture profiles (#2499)
Third-party auth servers (drasl, Blessing Skin, littleskin.cn) don't send the
signatureRequired field in the hasJoined texture property, so parsing the
profile failed and the player was kicked. The field is unused, so default it
when missing.

fixes #301
2026-07-25 09:28:05 +02:00
Afalinx
0d443944a7 fix(redstone): use vanilla pressure plate detection bounds (#2439)
Replace full-block entity queries with vanilla's centered 14x4x14 pressure plate detection box. Share the bounds between normal and weighted pressure plates and cover the geometry with unit tests.
2026-07-24 19:22:19 +02:00
Redstone
6263b894ff fix(move_control): remove movement input reset while navigator owns movement (#2442) 2026-07-24 18:29:51 +02:00
Jamie Little
7552eff6b2 feat: data-driven mob spawn equipment system with vanilla-accurate gear (#2454)
Implements the full vanilla Minecraft 26.2 mob equipment system, giving
mobs weapons, armor, enchantments, and loot-pickup flags at spawn.

Added:

- Data-driven EQUIPMENT_REGISTRY mapping 13 mob types (zombie, husk,
  zombie_villager, drowned, zombified_piglin, skeleton, stray, bogged,
  wither_skeleton, piglin, pillager, vindicator) to their weapon and
  armor configurations, all verified against decompiled vanilla sources.

- Exact vanilla RegionalDifficulty formula from DifficultyInstance.java:
  computes effective_difficulty and special_multiplier from base
  difficulty, game time, chunk inhabited time, and moon phase. When
  special_multiplier is 0.0 (fresh Normal/Easy worlds), equipment,
  enchantments, and loot-pickup flags are suppressed, matching vanilla.

- Vanilla-accurate armor selection: random base tier (0-2) with up to 3
  upgrade attempts at 10.87% each, partial armor break chance (10% on
  Hard, 25% otherwise). Higher difficulty produces fewer pieces.

- Weighted enchantment selection with exclusive-set conflict resolution
  and cost-based level determination. Curated flat pools per equipment
  category (melee/trident/bow/crossbow/fishing_rod/head/chest/legs/feet).

- Per-slot equipment drop chances (0.085 default) with looting bonus
  (+lootingLevel * 0.01 per vanilla EnchantmentHelper).

- Exact vanilla drop durability formula from Mob.dropCustomDeathLoot:
  damage = maxDamage - random(1 + random(max(maxDamage-3, 1))).

- CAN_PICK_UP_LOOT mob flag (bit 3, value 8) set probabilistically at
  55% * special_multiplier.

- Guard against empty equipment packets in send_equipment_changes to
  prevent client decode crashes.

- Chunk inhabited_time tracking in world tick for difficulty scaling.

Integration: equip_mob_on_spawn is called from the blanket
EntityBase::init_data_tracker impl, so every mob type automatically
participates. New mobs are added by inserting a MobEquipmentDef into
the EQUIPMENT_REGISTRY with their weapon/armor config.

cargo check: passes / cargo clippy (pedantic): 0 warnings / cargo fmt: clean
2026-07-24 18:20:49 +02:00
MythicSorcerer
d529a6676a fix(egg): initialize git submodules during install (#2456)
* Fix egg: initialize git submodules during install

The Pumpkin repo uses pumpkin-plugin-wit as a git submodule, but the
install script only does 'git clone --depth 1' without --recurse-submodules.
Add 'git submodule update --init --recursive --depth 1' after checkout
so the WIT files required by bindgen!/wit_bindgen::generate are available.

* Potential fix for pull request finding
2026-07-24 18:16:57 +02:00
Megalith
f676bdd222 fix(protocol): remap particle IDs for older clients (#2451)
* feat(protocol): generate particle ID remap tables

Generate version-specific particle registry mappings from the existing ViaBackwards data for every supported Java protocol version.\n\nExpose the generated remapper through pumpkin-data and enable it for pumpkin-protocol so packet serializers can translate current registry IDs for older clients.

* fix(protocol): remap explosion particles for older clients

Translate the explosion particle registry ID for each client's negotiated Java version before serializing the explode packet.\n\nWithout this remap, 1.21.11 interpreted the 26.2 explosion-emitter ID as falling dust, consumed the following bytes as particle data, and disconnected with a decoder exception. Add packet-level coverage for both 1.21.11 and 26.2 encodings.

* fix(protocol): remap particle IDs for older clients

Level-particle packets and particle entity metadata still encoded raw 26.2 registry IDs, causing older clients to decode the wrong particle schema and disconnect. Route every active outbound particle path through the version remapper, preserve metadata payloads, and cover 1.21.11 and 26.2 encodings with regression tests.
2026-07-24 18:14:18 +02:00
Jamie Little
3ff3eeaf74 perf(world): bulk-build generated chunk palettes (#2492) 2026-07-24 17:02:29 +02:00
dongzh1
b04471e800 fix(command): gate tab-complete suggestions on command permissions (#2312)
`CommandDispatcher::find_suggestions` resolved the command tree and walked
its paths to produce server-side tab-complete suggestions without ever
checking the command's permission, unlike `dispatch`, which gates on
`self.permissions.get(key)` followed by `src.has_permission`.

Many legacy commands (e.g. pardon, deop, whitelist) register their
permission only in `self.permissions` and have no in-tree `Require` node.
Their argument consumers therefore leaked privileged data -- banned, op,
and whitelisted player names -- to unprivileged players through
tab-complete, even though those players could not execute the command.

Add the same permission gate used by `dispatch` after the command key is
resolved and before the tree is traversed: look up `self.permissions` for
the key and return an empty suggestion list if the permission is absent or
if the sender lacks it. This keeps suggestion visibility consistent with
execution authorization.
2026-07-24 16:36:39 +02:00
Alexander Medvedev
a956857209 readme: make vid loop 2026-07-24 12:40:59 +02:00
Alexander Medvedev
3103e97e18 ci: remove macos-15-intel 2026-07-24 12:31:57 +02:00
Alexander Medvedev
afbe839dea fix: https://github.com/Pumpkin-MC/Pumpkin/issues/2424 2026-07-20 11:42:20 +02:00
kedor
f4815f5c78 feat(wit): add enum packet support to wit (#2303)
* implementing the seen advancement packet and handling it

* adding the code generation of enum packet for wit

* typos fix and updating some packet

* adding wit

* ignore private enum

* ignore private enum

* fix packet mapping

* fix duplicate

* update wit

* remove time change
2026-07-20 10:58:28 +02:00
Mcxiaocaibug
5bc4e1bd67 fix(block): melt snow layers under high block light (#2419)
* fix(block): melt snow layers under high block light

Snow layers never melted because the block had no random_tick handler.
Mirror vanilla SnowLayerBlock.randomTick: on a random tick, remove the
layer when the block light level at its position exceeds 11 (e.g. from
a nearby torch).

Fixes #2179

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* style: apply rustfmt
2026-07-20 10:17:40 +02:00
Alexander Medvedev
e0117ab559 perf: ditch serde because its slower
i rather trade performance and compile time over convenience
2026-07-19 18:07:37 +02:00
Alexander Medvedev
712bb96d3e feat: Initial advancement triggers 2026-07-17 16:10:43 +02:00
Alexander Medvedev
55219f870f fix: https://github.com/Pumpkin-MC/Pumpkin/issues/2233 2026-07-16 19:56:53 +02:00
Alexander Medvedev
21e7f1418a feat: show credits on exiting end 2026-07-15 20:50:13 +02:00
Alexander Medvedev
c7be511fbc chore: some more chunk gen work 2026-07-15 19:02:31 +02:00
Alexander Medvedev
37bed1c8b5 feat(command): add fillbiome command 2026-07-14 19:19:03 +02:00
Alexander Medvedev
06fa1db1d7 feat(command): add loot command 2026-07-14 18:45:02 +02:00
Alexander Medvedev
bb5ae5ab3c feat(command): add recipe command 2026-07-14 18:28:26 +02:00
Alexander Medvedev
5692c65941 feat(command): add ride command 2026-07-14 15:04:02 +02:00
Alexander Medvedev
e3f4bf23b0 feat(command): add forceload command 2026-07-14 14:58:17 +02:00
Alexander Medvedev
df159a5425 feat(command): add execute command 2026-07-14 14:55:07 +02:00
Alexander Medvedev
75d1bc5a88 feat(command): add dialog command 2026-07-14 14:08:57 +02:00
Alexander Medvedev
a877d16aeb feat(command): add teammsg command 2026-07-14 13:12:57 +02:00
Alexander Medvedev
5e01d67579 feat(command): add team command 2026-07-14 12:36:47 +02:00
Alexander Medvedev
02c8c84789 feat(command): add spectate command 2026-07-14 11:15:18 +02:00
Alexander Medvedev
92835d5523 feat(command): add item command 2026-07-14 09:21:20 +02:00
Alexander Medvedev
edd9ed88e7 fix: ci 2026-07-13 19:23:30 +02:00
Alexander Medvedev
486f8d2cfe feat(command): add attributes 2026-07-13 18:43:45 +02:00
Alexander Medvedev
ce05798fac feat(command): add clone 2026-07-13 18:17:42 +02:00
Alexander Medvedev
dab8474e71 feat(command): add scoreboard/trigger command 2026-07-13 18:09:03 +02:00
yhypno
6219d36c64 fix(item): consume armor stand on placement (#2392) 2026-07-13 17:43:53 +02:00
Mcxiaocaibug
f0374c30d4 feat(pumpkin): add /tag command with entity scoreboard tags (#2395)
Implements the vanilla /tag command (tracked in #15) along with the
entity-side storage it needs:

- Adds a scoreboard_tags: Mutex<HashSet<String>> field to Entity, with
  add_scoreboard_tag / remove_scoreboard_tag helpers that enforce the
  vanilla 1024-tag cap and report whether they changed anything.
- Serializes tags to/from the entity's "Tags" NBT list, matching the
  vanilla format so tags round-trip through world saves.
- /tag <targets> add|remove <name> and /tag <targets> list, with the
  existing commands.tag.* translation keys and single/multiple wording.
2026-07-13 17:43:23 +02:00
Mcxiaocaibug
1f38ba8054 feat(pumpkin): add /save-all, /save-off and /save-on commands (#2394)
Implements the three vanilla save-control commands (tracked in #15):

- /save-all saves all online players' data and advancements, then
  requests a chunk save from every world's chunk scheduler. It works
  even while autosaving is disabled, matching Vanilla.
- /save-off disables periodic autosaving via a new save_enabled flag
  on Level; running it again fails with commands.save.alreadyOff.
- /save-on re-enables autosaving; running it again fails with
  commands.save.alreadyOn.
2026-07-13 17:40:23 +02:00
Mcxiaocaibug
4929c590ab feat(pumpkin): add /random command (#2396)
Implements the vanilla /random command (tracked in #15):

- /random value <range> draws a value and shows it to the source only.
- /random roll <range> draws a value and announces it to every player.
- Range validation matches Vanilla: spans of 0 fail with
  commands.random.error.range_too_small, spans of i32::MAX - 1 or wider
  (including open-ended ranges) fail with range_too_large.

Random sequences (/random reset and the [sequence] argument) are not
part of this change since named sequence storage does not exist yet.
2026-07-13 17:38:43 +02:00
Mcxiaocaibug
650c614db9 feat(pumpkin): add /spreadplayers command (#2397)
Implements the vanilla /spreadplayers command (tracked in #15):

- Places targets at random surface locations within maxRange of a
  center column, spread at least spreadDistance apart, using Vanilla's
  iterative force-based relaxation followed by a surface-grounding pass.
- Rejects unsafe locations (liquid surfaces) and retries, matching
  Vanilla's refusal to place entities on water.
- On failure reports commands.spreadplayers.failed.{entities,teams} with
  the Vanilla suggested maximum spread; on success reports
  commands.spreadplayers.success.* with the average pairwise distance.

respectTeams currently collapses all (teamless) targets onto a single
pile, since teams are not implemented yet; this matches Vanilla's
handling of teamless entities under respectTeams=true.
2026-07-13 17:32:51 +02:00
Alexander Medvedev
ea7ee250fe fix: clippy 2026-07-13 13:14:00 +02:00