This commit is contained in:
AkmalFairuz
2025-03-28 17:13:38 +07:00
parent c7ee4e924a
commit 8a9d32f75e
24 changed files with 227 additions and 157 deletions

View File

@@ -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
}