Skip to content

26.2 Player Toggle and Persistence

Rifa edited this page Aug 22, 2026 · 1 revision

πŸ”„ 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 Infobox Technical Parameters
Interface Bridge net.instantgratification.magnet.IMagnetPlayer
Mixin Target net.minecraft.world.entity.player.Player (PlayerMixin.java)
Default Client Keybind \ (Backslash) β€” key.ig_magnet.toggle
Key Category key.category.ig_magnet.magnet (Magnet, Let me get that!)
Network Payload MagnetTogglePayload (ig_magnet:toggle)
NBT Codec Storage ValueOutput / ValueInput under tag "ig_magnet_enabled"
Lifecycle Events ServerPlayConnectionEvents.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:

// 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.

πŸ”— Related Wiki Documentation

Clone this wiki locally