Refactor
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package mapping
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"github.com/sandertv/gophertunnel/minecraft/nbt"
|
||||
"sync"
|
||||
@@ -19,6 +20,15 @@ type Item interface {
|
||||
RegisterEntryRID(string, int32, uint8, map[string]any)
|
||||
Air() int32
|
||||
ItemVersion() uint16
|
||||
ItemEntries() []ItemEntry
|
||||
}
|
||||
|
||||
type ItemEntry struct {
|
||||
Name string
|
||||
RuntimeID int16
|
||||
ComponentBased bool
|
||||
Version uint8
|
||||
Data map[string]any
|
||||
}
|
||||
|
||||
type DefaultItemMapping struct {
|
||||
@@ -31,62 +41,66 @@ type DefaultItemMapping struct {
|
||||
itemRuntimeIDToVersion map[int32]uint8
|
||||
// itemRuntimeIDToData holds a map to translate item runtime IDs to data.
|
||||
itemRuntimeIDToData map[int32]map[string]any
|
||||
airRID int32
|
||||
itemVersion uint16
|
||||
// itemEntries holds a map to translate item string IDs to runtime IDs.
|
||||
itemEntries []ItemEntry
|
||||
airRID int32
|
||||
itemVersion uint16
|
||||
}
|
||||
|
||||
func NewItemMapping(itemRuntimeIDData []byte, requiredItemList []byte, itemVersion uint16, direct bool) *DefaultItemMapping {
|
||||
func NewItemMapping(requiredItemList []byte, itemVersion uint16) *DefaultItemMapping {
|
||||
itemRuntimeIDsToNames := make(map[int32]string)
|
||||
itemNamesToRuntimeIDs := make(map[string]int32)
|
||||
itemRuntimeIDToVersion := make(map[int32]uint8)
|
||||
itemRuntimeIDToData := make(map[int32]map[string]any)
|
||||
itemEntries := make([]ItemEntry, 0, 1600)
|
||||
var airRID *int32
|
||||
|
||||
if direct {
|
||||
var items map[string]int32
|
||||
if err := nbt.Unmarshal(itemRuntimeIDData, &items); err != nil {
|
||||
panic(err)
|
||||
var m map[string]struct {
|
||||
RuntimeID int16 `json:"runtime_id"`
|
||||
ComponentBased bool `json:"component_based"`
|
||||
Version *uint8 `json:"version"`
|
||||
Data string `json:"component_nbt,omitempty"`
|
||||
}
|
||||
if err := json.Unmarshal(requiredItemList, &m); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
for name, data := range m {
|
||||
rid := int32(data.RuntimeID)
|
||||
if name == "minecraft:air" {
|
||||
airRID = &rid
|
||||
}
|
||||
for name, rid := range items {
|
||||
if name == "minecraft:air" {
|
||||
airRID = &rid
|
||||
}
|
||||
|
||||
itemNamesToRuntimeIDs[name] = rid
|
||||
itemRuntimeIDsToNames[rid] = name
|
||||
entry := ItemEntry{
|
||||
Name: name,
|
||||
RuntimeID: data.RuntimeID,
|
||||
ComponentBased: data.ComponentBased,
|
||||
}
|
||||
} else {
|
||||
var m map[string]struct {
|
||||
RuntimeID int16 `json:"runtime_id"`
|
||||
ComponentBased bool `json:"component_based"`
|
||||
Version *uint8 `json:"version"`
|
||||
Data map[string]any `json:"data,omitempty"`
|
||||
itemNamesToRuntimeIDs[name] = rid
|
||||
itemRuntimeIDsToNames[rid] = name
|
||||
if data.Version != nil {
|
||||
itemRuntimeIDToVersion[rid] = *data.Version
|
||||
entry.Version = *data.Version
|
||||
}
|
||||
if err := json.Unmarshal(requiredItemList, &m); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
for name, data := range m {
|
||||
rid := int32(data.RuntimeID)
|
||||
if name == "minecraft:air" {
|
||||
airRID = &rid
|
||||
if data.Data != "" {
|
||||
var nbtData map[string]any
|
||||
nbtBytes, err := base64.StdEncoding.DecodeString(data.Data)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
itemNamesToRuntimeIDs[name] = rid
|
||||
itemRuntimeIDsToNames[rid] = name
|
||||
if data.Version != nil {
|
||||
itemRuntimeIDToVersion[rid] = *data.Version
|
||||
}
|
||||
if data.Data != nil {
|
||||
itemRuntimeIDToData[rid] = data.Data
|
||||
if err := nbt.Unmarshal(nbtBytes, &nbtData); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
itemRuntimeIDToData[rid] = nbtData
|
||||
entry.Data = nbtData
|
||||
}
|
||||
itemEntries = append(itemEntries, entry)
|
||||
}
|
||||
|
||||
if airRID == nil {
|
||||
panic("couldn't find air")
|
||||
}
|
||||
|
||||
return &DefaultItemMapping{itemRuntimeIDsToNames: itemRuntimeIDsToNames, itemNamesToRuntimeIDs: itemNamesToRuntimeIDs, itemRuntimeIDToVersion: itemRuntimeIDToVersion, airRID: *airRID, itemVersion: itemVersion, itemRuntimeIDToData: itemRuntimeIDToData}
|
||||
return &DefaultItemMapping{itemRuntimeIDsToNames: itemRuntimeIDsToNames, itemNamesToRuntimeIDs: itemNamesToRuntimeIDs, itemRuntimeIDToVersion: itemRuntimeIDToVersion, airRID: *airRID, itemVersion: itemVersion, itemRuntimeIDToData: itemRuntimeIDToData, itemEntries: itemEntries}
|
||||
}
|
||||
|
||||
func (m *DefaultItemMapping) ItemRuntimeIDToName(runtimeID int32) (name string, found bool) {
|
||||
@@ -153,3 +167,11 @@ func (m *DefaultItemMapping) ItemVersion() uint16 {
|
||||
m.mu.Lock()
|
||||
return m.itemVersion
|
||||
}
|
||||
|
||||
func (m *DefaultItemMapping) ItemEntries() []ItemEntry {
|
||||
defer m.mu.Unlock()
|
||||
m.mu.Lock()
|
||||
entries := make([]ItemEntry, len(m.itemEntries))
|
||||
copy(entries, m.itemEntries)
|
||||
return entries
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user