Skip to content

oriumgames/crocon

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

crocon

A library for converting Minecraft data types—including blocks, items, and entities—across different game editions and versions.

This Go library is a high-level interface to a native shared library located in the native/ directory. The shared library is a GraalVM Ahead-of-Time (AOT) compiled artifact of a Java project that wraps the Chunker API to expose its conversion capabilities over a C ABI.

Requirements

For Users

  • A C compiler (like gcc or clang) for CGo.
  • The pre-compiled libcrocon shared library (.so, .dll, or .dylib) available in your library path.

For Building from Source

  • All of the above.
  • A GraalVM JDK (Java 17+) with the native-image component installed.
  • The Gradle build tool.

Installation

go get github.com/oriumgames/crocon

Quick Start

Here is a simple example of how to initialize the converter and use it to convert a block.

package main

import (
	"errors"
	"fmt"
	"log"

	"github.com/oriumgames/crocon"
)

func main() {
	// 1. Initialize the converter. This creates the GraalVM isolate.
	converter, err := crocon.NewConverter()
	if err != nil {
		log.Fatalf("Failed to initialize converter: %v", err)
	}
	// 2. IMPORTANT: Defer the Close() call to release all resources.
	defer converter.Close()

	log.Println("Converter initialized successfully.")

	// --- Successful Conversion ---
	req := crocon.BlockRequest{
		ConversionRequest: crocon.ConversionRequest{
			FromVersion: "1.20.4",
			ToVersion:   "1.20.80",
			FromEdition: crocon.JavaEdition,
			ToEdition:   crocon.BedrockEdition,
		},
		Block: crocon.Block{
			ID:     "minecraft:mossy_stone_bricks",
			States: make(map[string]interface{}),
		},
	}

	result, err := converter.ConvertBlock(req)
	if err != nil {
		log.Fatalf("Conversion failed unexpectedly: %v", err)
	}

	fmt.Printf("Successfully converted '%s' -> '%s'\n", req.Block.ID, result.ID)
	fmt.Printf("Resulting states: %v\n", result.States)

	// --- Failed Conversion & Error Handling ---
	failedReq := crocon.BlockRequest{
		ConversionRequest: crocon.ConversionRequest{
			FromVersion: "1.21.10",
			ToVersion:   "1.21.120",
			FromEdition: crocon.JavaEdition,
			ToEdition:   crocon.BedrockEdition,
		},
		Block: crocon.Block{ ID: "minecraft:invalid_block" },
	}

	_, err = converter.ConvertBlock(failedReq)
	if err != nil {
		var convErr *crocon.ConversionError
		// Use errors.As to inspect the custom error type
		if errors.As(err, &convErr) {
			fmt.Println("\nCaught an expected conversion error:")
			fmt.Printf("  Message: %s\n", convErr.Message)
			// You can also inspect convErr.StackTrace for deep debugging
		}
	}
}

Building the Native Library

The native shared library (libcrocon.so) is compiled from the Java source code located in the native/ directory. If you make changes to the Java code or need to compile for a different architecture, you can rebuild it using Gradle.

Prerequisites: Ensure you have a GraalVM JDK configured on your system PATH.

cd native/

./gradlew build

cd build/libs

native-image   @../../native-image-args.txt  -cp crocon-1.0.jar

This will generate a compiled shared library. You must then move this library to a location where your Go application can find it (e.g., /usr/local/lib or alongside your Go executable).

The Go wrapper is configured via CGo flags to look for the library in the project root by default.

Error Handling

The library returns a custom error type, crocon.ConversionError, when the underlying Java engine fails a conversion. This error type contains the Java exception message and a full stack trace for debugging. You can inspect it using errors.As, as shown in the Quick Start example.

License

This project is licensed under the MIT License.

About

cross edition/version data converter

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published