Skip to content

[bug] Dedicated Server Crash on Scriptionary & Engraving Use #200

Description

@Kajmany

Mod Version (e.g. Fabric 0.3.4):

  • Scriptor [2.0.1-1.21.1]

What you expect to happen:
Right-clicking an engraving feature should load it into a held Scriptionary when playing on a dedicated server, like it does on single player.

What actually happens:
The server crashes :(

Minimal mod set to reproduce:

  • Fabric Loader: [0.19.2]
  • Fabric API [0.116.11+1.21.1]
  • Fabric Language Kotlin [1.13.10+kotlin.2.3.20]
  • Unfocused [0.3.1-1.21.1]

How I produced:
Spawned a Scriptionary in creative and right-clicked the nearest engraving feature I could find.

Callstack:

Time: 2026-04-16 20:27:05
Description: Exception in server tick loop

java.lang.NoClassDefFoundError: net/minecraft/class_1074
        at knot//com.ssblur.scriptor.data.components.DictionaryData.withWord(DictionaryData.kt:26)
        at knot//com.ssblur.scriptor.data.components.DictionaryData.withWord$default(DictionaryData.kt:24)
        at knot//com.ssblur.scriptor.block.ChalkBlock.method_55765(ChalkBlock.kt:69)
        at knot//net.minecraft.class_4970$class_4971.method_55780(class_4970.java:1169)
        at knot//net.minecraft.class_3225.method_14262(class_3225.java:348)
        at knot//net.minecraft.class_3244.method_12046(class_3244.java:1158)
        at knot//net.minecraft.class_2885.method_12547(class_2885.java:42)
        at knot//net.minecraft.class_2885.method_11054(class_2885.java:10)
        at knot//net.minecraft.class_2600.method_11072(class_2600.java:27)
        at knot//net.minecraft.class_3738.run(class_3738.java:18)
        at knot//net.minecraft.class_1255.method_18859(class_1255.java:162)
        at knot//net.minecraft.class_4093.method_18859(class_4093.java:23)
        at knot//net.minecraft.server.MinecraftServer.method_24306(MinecraftServer.java:864)
        at knot//net.minecraft.server.MinecraftServer.method_18859(MinecraftServer.java:173)
        at knot//net.minecraft.class_1255.method_16075(class_1255.java:136)
        at knot//net.minecraft.server.MinecraftServer.method_20415(MinecraftServer.java:846)
        at knot//net.minecraft.server.MinecraftServer.method_16075(MinecraftServer.java:840)
        at knot//net.minecraft.class_1255.method_18857(class_1255.java:145)
        at knot//net.minecraft.server.MinecraftServer.method_18857(MinecraftServer.java:810)
        at knot//net.minecraft.server.MinecraftServer.method_16208(MinecraftServer.java:815)
        at knot//net.minecraft.server.MinecraftServer.method_29741(MinecraftServer.java:702)
        at knot//net.minecraft.server.MinecraftServer.method_29739(MinecraftServer.java:281)
        at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: net.minecraft.class_1074
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
        at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
        at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.loadClass(KnotClassDelegate.java:239)
        at net.fabricmc.loader.impl.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:119)
        at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
        ... 23 more

Sorry, I couldn't find tools to deobfuscate this after the fact. Next time I'll look for a mod.

Root Cause:
Thanks to the help of my favorite slop inferer, I think this is happening because we're trying to call client.resources.language.I18n from the server when constructing a DictionaryData:

fun withWord(word: String, definition: String? = null, overwrite: Boolean = false): DictionaryData {
return if(overwrite || values.none { it.first() == word })
DictionaryData(values + listOf(listOf(word, definition ?: I18n.get("extra.scriptor.no_entry"))))
else
this
}

Which is then called from the chalk block specific interaction:

if(itemStack matches ScriptorItems.DICTIONARY.get()) {
val data = itemStack[ScriptorDataComponents.DICTIONARY_DATA] ?: DictionaryData(listOf())
itemStack[ScriptorDataComponents.DICTIONARY_DATA] = data.withWord(blockEntity.word)
return ItemInteractionResult.SUCCESS
}

Unfortunately, I don't really know Kotlin or understand the game's code that well, so I'm not in a position to offer you a good fix.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions