Skip to content

Compact binary storage for DirtyMarker & AwaitingProtectionModeConfig; fix inventory slot order#10

Merged
TheBjoRedCraft merged 2 commits intofeat/additions-for-kevinfrom
copilot/optimize-config-storage
Mar 12, 2026
Merged

Compact binary storage for DirtyMarker & AwaitingProtectionModeConfig; fix inventory slot order#10
TheBjoRedCraft merged 2 commits intofeat/additions-for-kevinfrom
copilot/optimize-config-storage

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Mar 12, 2026

Sponge Configurate serialises ByteArray as a YAML sequence of integers (one entry per byte), making a single player inventory balloon to thousands of lines. Additionally, filterNotNull() on the inventory array before serialisation stripped empty slots, restoring items to wrong positions after a server restart.

Storage format

DirtyMarker and AwaitingProtectionModeConfig now each hold a single data: String — a Base64-encoded binary blob — instead of multiple typed YAML fields.

Before:

awaitingProtectionModes:
  - playerUuidString: "550e8400-e29b-41d4-a716-446655440000"
    startLocationString: "world,100.5,64.0,200.5,0.0"
    inventoryBytes:
      - 1
      - 0
      - 0
      - 36
      # ... hundreds more integers
dirtyMarkers:
  - locationString: "world,100,64,200,0.0"
    blockDataString: "pale_oak_pressure_plate[powered=false]"

After:

awaitingProtectionModes:
  - data: "AQVXb3JsZAAAAGQAAADI..."   # single Base64 blob
dirtyMarkers:
  - data: "AQV3b3JsZAAAAGQAAADI..."   # single Base64 blob

Both classes expose typed property getters (playerUuid, inventory, startLocation, location, blockData) that decode on demand, and static create(...) factory methods for construction.

Inventory slot order fix

Serialisation now uses Paper's ItemStack.serializeItemsAsBytes(*items) with nulls mapped to ItemStack.empty(), preserving all 41 slot indices. The old filterNotNull() call collapsed the sparse array into a dense one, causing items to land in wrong slots on restoration.

Removed

  • Location.asString() extension
  • List<ItemStack>.serializeItemsToBytes() extension
  • String.toLocation() extension

All three were only used by the old constructors.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • downloads.gradle.org
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -Xmx64m -Xms64m -Dorg.gradle.appname=gradlew -jar /home/REDACTED/work/surf-protect/surf-protect/gradle/wrapper/gradle-wrapper.jar tasks (dns block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -Xmx64m -Xms64m -Dorg.gradle.appname=gradlew -jar /home/REDACTED/work/surf-protect/surf-protect/gradle/wrapper/gradle-wrapper.jar --help (dns block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -Xmx64m -Xms64m -Dorg.gradle.appname=gradlew -jar /home/REDACTED/work/surf-protect/surf-protect/gradle/wrapper/gradle-wrapper.jar build --parallel (dns block)
  • repo.slne.dev
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.xml/javax.xml.namespace=ALL-UNNAMED --add-opens=java.base/java.time=ALL-UNNAMED -XX:MaxMetaspaceSize=384m -XX:&#43;HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 (dns block)

If you need me to access, download, or install something from one of these locations, you can either:


💬 Send tasks to Copilot coding agent from Slack and Teams to turn conversations into code. Copilot posts an update in your thread when it's finished.

…s; fix inventory arrangement

Co-authored-by: TheBjoRedCraft <143264463+TheBjoRedCraft@users.noreply.github.com>
Copilot AI changed the title [WIP] Optimize storage of items and block data in config Compact binary storage for DirtyMarker & AwaitingProtectionModeConfig; fix inventory slot order Mar 12, 2026
@TheBjoRedCraft TheBjoRedCraft marked this pull request as ready for review March 12, 2026 16:38
@TheBjoRedCraft TheBjoRedCraft merged commit fd3bccd into feat/additions-for-kevin Mar 12, 2026
@TheBjoRedCraft TheBjoRedCraft deleted the copilot/optimize-config-storage branch March 12, 2026 16:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants