Skip to content

🔄 Player Toggle, Persistence & Lifecycle (MC 26.2)

📌 Repository Source Disclaimer: The documentation in this Wiki reflects the current source code state in the repository, which may include recent unreleased commits or developmental features ahead of public release builds on CurseForge and Modrinth.

Feature InfoboxTechnical Parameters
Interface Bridgenet.instantgratification.magnet.IMagnetPlayer
Mixin Targetnet.minecraft.world.entity.player.Player (PlayerMixin.java)
Default Client Keybind\ (Backslash) — key.ig_magnet.toggle
Key Categorykey.category.ig_magnet.magnet (Magnet, Let me get that!)
Network PayloadMagnetTogglePayload (ig_magnet:toggle)
NBT Codec StorageValueOutput / ValueInput under tag "ig_magnet_enabled"
Lifecycle EventsServerPlayConnectionEvents.JOIN, ServerPlayerEvents.COPY_FROM, ServerPlayerEvents.AFTER_RESPAWN

📖 State Architecture Overview

In multiplayer servers and modpacks, individual players often have different preferences—builders may wish to pause item attraction while decorating, while miners want maximum vacuum power.

Magnet, Let me get that! implements an individualized, per-player toggle state that is 100% persistent across world reloads, deaths, respawns, and dimension teleportation.

                                [CLIENT ACTION]
                     Player Presses Toggle Keybind ('\')
                                      |
                                      v
                         [LOCAL STATE UPDATED]
                     client.player -> isEnabled = !isEnabled
                     Actionbar Overlay: "Item Magnet: Enabled/Disabled"
                                      |
                                      v
                         [C2S PACKET TRANSMISSION]
                     ClientPlayNetworking.send(MagnetTogglePayload)
                                      |
                                      v
                               [SERVER RECEIVER]
                     context.server().execute(() -> {
                         ((IMagnetPlayer) player).ig_magnet$setMagnetEnabled(val);
                     })
                                      |
         +----------------------------+----------------------------+
         |                                                         |
         v                                                         v
 [NBT DATA PERSISTED]                                  [LIFECYCLE HOOKS WIRED]
 ValueOutput.putBoolean("ig_magnet_enabled")           - JOIN: S2C Sync
 ValueInput.getBooleanOr("ig_magnet_enabled", true)    - COPY_FROM: Retain on Death
                                                       - AFTER_RESPAWN: Fresh Entity S2C Sync

⌨️ Client Keybinding & Actionbar Overlay

  • Default Key: GLFW_KEY_BACKSLASH (\), avoiding keyboard conflicts with common map mods and inventory utilities.
  • Dynamic Key Type Helper: Uses ig_magnet$getKeyboardType() to safely resolve InputConstants.Type.KEYBOARD with graceful fallback to KEYSYM across varying Fabric Loader snapshots.
  • Instant Visual Feedback: Toggling triggers a localized actionbar toast:
    • chat.ig_magnet.enabled: "Item Magnet: Enabled"
    • chat.ig_magnet.disabled: "Item Magnet: Disabled"

💾 NBT Storage & Minecraft 26.2 Codec Serialization

Player toggle settings are saved directly to the player's .dat world save file using Minecraft 26.2's ValueOutput and ValueInput data pipelines:

java
// Saving to Player NBT
@Inject(method = "addAdditionalSaveData", at = @At("TAIL"))
private void ig_magnet$addAdditionalSaveData(ValueOutput output, CallbackInfo ci) {
    output.putBoolean("ig_magnet_enabled", this.ig_magnet$enabled);
}

// Loading from Player NBT
@Inject(method = "readAdditionalSaveData", at = @At("TAIL"))
private void ig_magnet$readAdditionalSaveData(ValueInput input, CallbackInfo ci) {
    this.ig_magnet$enabled = input.getBooleanOr("ig_magnet_enabled", true);
}

🧬 Fabric Lifecycle Events & Death/Respawn Flow

When a player dies in Minecraft, the game creates a brand-new ServerPlayer entity upon respawn. The mod guarantees zero state loss:

  1. ServerPlayerEvents.COPY_FROM: Copies the boolean toggle from oldPlayer to newPlayer immediately upon entity cloning.
  2. ServerPlayerEvents.AFTER_RESPAWN: Automatically transmits an S2C MagnetTogglePayload to the client once the new player entity connects, keeping the client HUD in sync.
  3. ServerPlayConnectionEvents.JOIN: Syncs the player's saved NBT state to the client upon joining a dedicated server or LAN world.

Official documentation & web portal for Dasik Igaijinn mods.