Files
Pumpkin/Cargo.toml
Purdze 830284c091 feat: Implement nether portal linking (#1372)
* fix: nether portals

* fix: add world border checks and match vanilla portal behavior

* feat: add region-based POI storage for nether portal linking

Implemented Point of Interest system for fast portal lookups:
- region-based NBT storage matching vanilla format
- sections keyed by Y coordinate within per-chunk data
- auto-registration on portal creation/destruction
- used by portal search to avoid scanning all blocks

Note: this POI implementation covers nether portals only.
The full POI system still needs significant work for:
- villager job sites
- beds, bells, beehives
- ticket/occupation system
- auto-scanning chunks for POI blocks
- distance tracker for pathfinding

Vanilla POI reference: net/minecraft/world/poi/

* feat: add entity position preservation and collision avoidance for portals

- preserve entity position relative to portal when teleporting
- add collision avoidance to find safe spawn positions
- add source portal tracking for accurate exit position calculation
- fix clippy pedantic warnings across portal and border code

* feat: add yaw rotation and vehicle teleportation for portals

- rotate entity yaw 90° when portal axis changes between dimensions
- prevent passengers from teleporting independently (wait for vehicle)
- teleport all passengers along with vehicle through portals

* fix: handle nested passengers recursively for portal teleportation

passengers of passengers (e.g., player riding a pig riding a minecart)
are now teleported correctly through portals

* style: apply cargo fmt and allow too_many_lines for portal search

find_safe_location exceeds 100 lines but splitting it would reduce
readability - the portal search algorithm flows naturally as one unit

* feat: use MCA format for POI storage for vanilla compatibility

Change POI storage to vanilla-compatible .mca region format. This allows
proper portal linking when importing existing vanilla worlds, as Pumpkin
can now read portals registered by vanilla.

* fix: remove local cargo config that breaks CI

* fix: correct portal direction calculations and dimension chunk loading

- fix portal direction to match vanilla: z-axis uses south (not north)
- fix perpendicular direction to match vanilla's rotateyc1ockwise()
- fix fallback clearing dimensions to match vanilla (3x2x4 blocks)
- store world reference in chunkmanager, updated on dimension change
- use chunkmanager's world for chunk loading instead of entity.world

this fixes players spawning inside blocks and seeing wrong terrain
(overworld blocks in nether) after portal teleportation.

* fix: portal neighbor update logic and remove_player return value

- fix impossible condition in portal neighbor update (was always false)
- fix remove_player to return the removed player instead of none

* fix: update entity.world to arcswap for dimension teleportation

entity.world was an immutable arc<world> that was never updated after
dimension teleportation. when a player teleported to the nether,
chunkmanager.world was updated but entity.world still pointed to the
overworld. this caused tick_block_collisions() to read blocks from the
wrong dimension, preventing return portal detection.

changed entity.world from arc<world> to arcswap<world> to allow atomic
updates when changing dimensions. added set_world() method and updated
teleport_world() to call it after dimension changes.

* fix: reset chunk batch state on dimension change

when changing dimensions, the chunk batch state was not being reset.
this caused slow chunk loading if the player was in a throttled state
before teleporting, as the server would wait for acknowledgments for
chunks that no longer exist in the new dimension.

now resets batches_sent_since_ack to Initial in change_world() so
chunks can be sent immediately after dimension change.
2026-01-27 20:30:58 +01:00

115 lines
2.5 KiB
TOML

[workspace]
resolver = "3"
members = [
"pumpkin-api-macros",
"pumpkin-config",
"pumpkin-util",
"pumpkin-inventory",
"pumpkin-macros/",
"pumpkin-protocol/",
"pumpkin-world",
"pumpkin/",
"pumpkin-data",
]
[workspace.package]
version = "0.1.0-dev+1.21.11"
edition = "2024"
rust-version = "1.89"
[profile.release]
lto = true
strip = "debuginfo"
codegen-units = 1
[profile.bench]
debug = true
[profile.profiling]
inherits = "release"
debug = true
strip = false
[workspace.dependencies]
log = "0.4"
tokio = { version = "1.49", default-features = false }
syn = { version = "2.0", default-features = false, features=["printing"] }
thiserror = "2.0"
bytes = "1.11"
# Concurrency/Parallelism and Synchronization
futures = { version = "0.3", default-features = false, features = ["executor"] }
rayon = "1.11"
crossbeam = "0.8"
uuid = { version = "1.20", features = ["serde", "v3", "v4"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tempfile = { version = "3.24.0", default-features = false }
proc-macro-error2 = "2"
aes = "0.8"
async-compression = "0.4.37"
base64 = "0.22.1"
bitflags = "2.10.0"
cesu8 = "1.1"
cfb8 = "0.8"
colored = "3.1"
console-subscriber = { version = "0.5.0", default-features = false }
crc-fast = "1.10.0"
criterion = { version = "0.8", default-features = false }
crossbeam-utils = "0.8.21"
crossfire = "2.1.10"
dashmap = "6.1"
ecdsa = "0.16.9"
enum_dispatch = "0.3.13"
env_logger = "0.11.8"
flate2 = "1.1.8"
heck = "0.5"
hmac = "=0.13.0-rc.3"
indexmap = "2.13"
itertools = "0.14.0"
libloading = "0.9"
lru = "0.16.3"
lz4-java-wrc = "0.2.0"
md5 = "0.8"
num-bigint = "0.4"
num-derive = "0.4"
num-traits = "0.2"
num_cpus = "1.17.0"
p384 = "0.13.1"
phf = "0.13.1"
pkcs8 = "=0.11.0-rc.9"
proc-macro2 = "1.0"
pumpkin-config = { path = "pumpkin-config" }
pumpkin-data = { path = "pumpkin-data" }
pumpkin-inventory = { path = "pumpkin-inventory" }
pumpkin-macros = { path = "pumpkin-macros" }
pumpkin-nbt = { path = "pumpkin-nbt" }
pumpkin-protocol = { path = "pumpkin-protocol" }
pumpkin-util = { path = "pumpkin-util" }
pumpkin-world = { path = "pumpkin-world" }
quote = "1.0"
rand = { git = "https://github.com/rust-random/rand"}
rsa = "=0.10.0-rc.13"
rustc-hash = "2.1.1"
rustyline = "17.0.2"
ruzstd = "0.8.2"
serde_json5 = "0.2.1"
sha1 = "=0.11.0-rc.4"
sha2 = "=0.11.0-rc.4"
signature = "2.2.0"
simplelog = "0.12.2"
slotmap = "1.1"
take_mut = "0.2.2"
temp-dir = "0.1.16"
thread_local = "1.1.9"
time = "0.3"
arc-swap = "1.7"
tokio-util = "0.7.18"
toml = "0.9"
ureq = "3.1.4"