KStarbound/src/main/kotlin/ru/dbotthepony/kstarbound/defs/InteractAction.kt

48 lines
1.7 KiB
Kotlin

package ru.dbotthepony.kstarbound.defs
import com.google.gson.JsonElement
import com.google.gson.JsonNull
import ru.dbotthepony.kstarbound.json.builder.IStringSerializable
import ru.dbotthepony.kstarbound.json.readJsonElement
import ru.dbotthepony.kstarbound.json.writeJsonElement
import java.io.DataInputStream
import java.io.DataOutputStream
data class InteractAction(val type: Type = Type.NONE, val entityID: Int = 0, val data: JsonElement = JsonNull.INSTANCE) {
// int32_t
enum class Type(override val jsonName: String) : IStringSerializable {
NONE("None"),
OPEN_CONTAINER("OpenContainer"),
SIT_DOWN("SitDown"),
OPEN_CRAFTING_INTERFACE("OpenCraftingInterface"),
OPEN_SONGBOOK_INTERFACE("OpenSongbookInterface"),
OPEN_NPC_CRAFTING_INTERFACE("OpenNpcCraftingInterface"),
OPEN_MERCHANT_INTERFACE("OpenMerchantInterface"),
OPEN_AI_INTERFACE("OpenAiInterface"),
OPEN_TELEPORT_DIALOG("OpenTeleportDialog"),
SHOW_POPUP("ShowPopup"),
SCRIPT_PANE("ScriptPane"),
MESSAGE("Message");
}
constructor(type: String, entityID: Int = 0, data: JsonElement = JsonNull.INSTANCE) : this(
Type.entries.firstOrNull { it.jsonName == type } ?: throw NoSuchElementException("No such interaction action $type!"), entityID, data
)
constructor(stream: DataInputStream, isLegacy: Boolean) : this(
if (isLegacy) Type.entries[stream.readInt()] else Type.entries[stream.readUnsignedByte()],
stream.readInt(),
stream.readJsonElement()
)
fun write(stream: DataOutputStream, isLegacy: Boolean) {
if (isLegacy) stream.writeInt(type.ordinal) else stream.writeByte(type.ordinal)
stream.writeInt(entityID)
stream.writeJsonElement(data)
}
companion object {
val NONE = InteractAction()
}
}