Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,4 @@ cmake-**
/projects/Utilities/Tests/input
/projects/Utilities/Viewer
/projects/Utilities/Tests/output
/profiler
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ LCE formats will be handled by [libLCE](https://github.com/DexrnZacAttack/libLCE
- [X] World Engine
- [X] Chunked Level
- [X] Chunk Sections
- [ ] Palettes (for memory usage)
- [X] Palettes (for memory usage)
- [ ] Lighting calculation (maybe?)
- [ ] Biomes
- [ ] POI/Structure system
Expand Down Expand Up @@ -51,8 +51,9 @@ LCE formats will be handled by [libLCE](https://github.com/DexrnZacAttack/libLCE
- [ ] PE/Bedrock

# Credits
- [BinaryIO](https://github.com/DexrnZacAttack/libBIO)
- [BinaryIO](https://codeberg.org/Dexrn/libBIO)
- [libNBT++ 2](https://github.com/PrismLauncher/libnbtplusplus)
- [danilwhale](https://codeberg.org/danilwhale)

# Disclaimer
This project is not an official Microsoft, Minecraft, nor Mojang Studios product.
This project is not an official Microsoft, Minecraft, nor Mojang Studios product.
2 changes: 1 addition & 1 deletion gdb/PrettyPrinters.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ def __init__(self, val):
self.val = val
def to_string(self):
try:
return str(gdb.parse_and_eval(f"((lodestone::common::string::StringSerializable*){int(self.val.address)})->toString()")) # jank?
return str(gdb.parse_and_eval(f"if ((lodestone::common::string::StringSerializable*){int(self.val.address)}) ((lodestone::common::string::StringSerializable*){int(self.val.address)})->toString()")) # jank?
except Exception as ex:
print("tostring", ex)
return None
Expand Down
1 change: 1 addition & 0 deletions projects/Converters/Minecraft/Common/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ set(FILES
include/Lodestone.Minecraft.Common/world/MinecraftWorld.h
include/Lodestone.Minecraft.Common/region/RegionChunkIndice.h
include/Lodestone.Minecraft.Common/region/RegionCompression.h
include/Lodestone.Minecraft.Common/player/Abilities.h
)

add_library(Lodestone.Minecraft.Common OBJECT ${FILES})
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// Created by DexrnZacAttack on 11/27/25 using zPc-i2.
//
#ifndef LODESTONE_GAMEMODE_H
#define LODESTONE_GAMEMODE_H
#include "Lodestone.Common/registry/Identifier.h"

namespace lodestone::minecraft::common::player {
struct Abilities {
bool canFly;
bool invulnerable;
bool canInstabuild;
};
}

#endif // LODESTONE_GAMEMODE_H
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
#include <Lodestone.Level/container/ItemContainer.h>
#include <Lodestone.Level/entity/Player.h>

#include "Lodestone.Minecraft.Common/player/Abilities.h"

namespace lodestone::minecraft::common::player {
class MinecraftPlayer : public level::entity::Player {
public:
Expand Down Expand Up @@ -54,7 +56,10 @@ namespace lodestone::minecraft::common::player {

const lodestone::common::registry::Identifier *getType() const override;

std::shared_ptr<level::properties::AbstractProperty>
const Abilities &getAbilities() const;

void setAbilities(const Abilities &abilities);
std::shared_ptr<level::properties::AbstractProperty>
getProperty(const std::string &name) override;

private:
Expand Down Expand Up @@ -102,6 +107,9 @@ namespace lodestone::minecraft::common::player {
*/
float mFallDistance;

/** The player's abilities */
Abilities mAbilities;

/** The player's inventory
*
* @prop inventory
Expand Down
33 changes: 20 additions & 13 deletions projects/Converters/Minecraft/Common/src/player/MinecraftPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,23 +93,30 @@ namespace lodestone::minecraft::common::player {
return &identifiers::MINECRAFT_COMMON;
}

const Abilities &MinecraftPlayer::getAbilities() const {
return mAbilities;
}

void MinecraftPlayer::setAbilities(const Abilities &abilities) {
mAbilities = abilities;
}

std::shared_ptr<level::properties::AbstractProperty>
MinecraftPlayer::getProperty(const std::string &name) {
switch (lodestone::common::util::Math::fnv1a64(name.data(),
name.length())) {
ADD_PROPERTY("name", mName, std::string &);
ADD_PROPERTY("spawnPos", mSpawnPos, level::types::Vec3i &);
ADD_PROPERTY("deathTime", mDeathTime, short &);
ADD_PROPERTY("hurtTime", mHurtTime, short &);
ADD_PROPERTY("attackTime", mAttackTime, short &);
ADD_PROPERTY("fireTime", mFireTime, short &);
ADD_PROPERTY("breathingTime", mBreathingTime, short &);
ADD_PROPERTY("dimension", mDimension,
lodestone::common::registry::Identifier &);
ADD_PROPERTY("fallDistance", mFallDistance, float &);
ADD_PROPERTY("inventory", mInventory,
level::container::ItemContainer &);
ADD_PROPERTY("armor", mArmor, level::container::ItemContainer &);
ADD_FIELD_PROPERTY("name", mName);
ADD_FIELD_PROPERTY("spawnPos", mSpawnPos);
ADD_FIELD_PROPERTY("deathTime", mDeathTime);
ADD_FIELD_PROPERTY("hurtTime", mHurtTime);
ADD_FIELD_PROPERTY("attackTime", mAttackTime);
ADD_FIELD_PROPERTY("fireTime", mFireTime);
ADD_FIELD_PROPERTY("breathingTime", mBreathingTime);
ADD_FIELD_PROPERTY("dimension", mDimension);
ADD_FIELD_PROPERTY("fallDistance", mFallDistance);
ADD_FIELD_PROPERTY("inventory", mInventory);
ADD_FIELD_PROPERTY("armor", mArmor);
ADD_FIELD_PROPERTY("abilities", mAbilities);
default:
return Player::getProperty(name);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ namespace lodestone::minecraft::common::world {
MinecraftWorld::getProperty(const std::string &name) {
switch (lodestone::common::util::Math::fnv1a64(name.data(),
name.length())) {
ADD_PROPERTY("seed", mSeed, int64_t &);
ADD_PROPERTY("lastPlayed", mLastPlayed, int64_t &);
ADD_PROPERTY("time", mTime, int64_t &);
ADD_FIELD_PROPERTY("seed", mSeed);
ADD_FIELD_PROPERTY("lastPlayed", mLastPlayed);
ADD_FIELD_PROPERTY("time", mTime);
default:
return World::getProperty(name);
}
Expand Down
8 changes: 7 additions & 1 deletion projects/Converters/Minecraft/Java/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,12 @@ set(FILES
src/anvil/jungle/region/JungleAnvilRegion.cpp
include/Lodestone.Minecraft.Java/anvil/jungle/region/JungleAnvilRegionIo.h
src/anvil/jungle/region/JungleAnvilRegionIo.cpp
src/anvil/jungle/world/JungleAnvilWorld.cpp
include/Lodestone.Minecraft.Java/anvil/jungle/world/JungleAnvilWorld.h
src/anvil/jungle/world/JungleAnvilWorldIo.cpp
include/Lodestone.Minecraft.Java/anvil/jungle/world/JungleAnvilWorldIo.h
include/Lodestone.Minecraft.Java/GeneratorTypes.h
src/GeneratorTypes.cpp
)

add_library(Lodestone.Minecraft.Java SHARED ${FILES})
Expand All @@ -66,7 +72,7 @@ target_link_libraries(Lodestone.Minecraft.Java PRIVATE Lodestone.Level Lodestone
target_link_libraries(Lodestone.Minecraft.Java PUBLIC Lodestone.Core Lodestone.Minecraft.Common)

option(USE_OPENMP "Use OpenMP" ON)
if (USE_OPENMP STREQUAL ON AND OpenMP_CXX_FOUND AND OpenMP_C_FOUND)
if (USE_OPENMP STREQUAL ON AND OpenMP_CXX_FOUND AND OpenMP_C_FOUND AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "Using OpenMP")
target_link_libraries(Lodestone.Minecraft.Java PRIVATE OpenMP::OpenMP_CXX)
target_compile_definitions(Lodestone.Minecraft.Java PRIVATE USE_OPENMP)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//
// Created by DexrnZacAttack on 11/9/25 using zPc-i2.
//
#ifndef LODESTONE_GENERATORTYPES_H
#define LODESTONE_GENERATORTYPES_H
#include <Lodestone.Common/registry/Identifier.h>

namespace lodestone::minecraft::java {
struct GeneratorTypes {
static constexpr lodestone::common::registry::Identifier DEFAULT = {
"minecraft", "default"};
static constexpr lodestone::common::registry::Identifier FLAT = {
"minecraft", "flat"};
static constexpr lodestone::common::registry::Identifier LARGE_BIOMES =
{"minecraft", "large_biomes"};

static const lodestone::common::registry::Identifier &
generatorIdToIdentifier(const std::string &id);
static std::string identifierToGeneratorId(
const lodestone::common::registry::Identifier &id, int version);
};
} // namespace lodestone::minecraft::java

#endif
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

namespace lodestone::minecraft::java::alpha::world {

class AlphaWorldIo final : public conversion::world::DirectoryWorldIO {
class AlphaWorldIo : public conversion::world::DirectoryWorldIO {
public:
const lodestone::conversion::level::LevelIO *
getLevelIO(int version) const override;
Expand All @@ -22,6 +22,15 @@ namespace lodestone::minecraft::java::alpha::world {
lodestone::level::world::World *w, int version,
const conversion::world::options::AbstractWorldWriteOptions
&options) const override;

const lodestone::conversion::chunk::ChunkIO *
getChunkIO(int version) const override;

const lodestone::conversion::region::RegionIO *
getRegionIO(int version) const override;

const lodestone::conversion::player::PlayerIO *
getPlayerIO(int version) const override;
};

} // namespace lodestone::minecraft::java::alpha::world
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//
// Created by Zero on 11/26/25.
//

#ifndef LODESTONE_JUNGLEANVILWORLD_H
#define LODESTONE_JUNGLEANVILWORLD_H
#include "Lodestone.Minecraft.Java/mcregion/world/McRegionWorld.h"

#include <Lodestone.Conversion/world/WorldIO.h>

namespace lodestone::minecraft::java::anvil::jungle::world {
class JungleAnvilWorld : public mcregion::world::McRegionWorld {
public:
explicit JungleAnvilWorld(const std::string &name);
};
} // namespace lodestone::minecraft::java::anvil::jungle::world

#endif // LODESTONE_JUNGLEANVILWORLD_H
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//
// Created by Zero on 11/26/25.
//

#ifndef LODESTONE_JUNGLEANVILWORLDIO_H
#define LODESTONE_JUNGLEANVILWORLDIO_H
#include <Lodestone.Conversion/world/DirectoryWorldIo.h>
#include <Lodestone.Conversion/world/WorldIO.h>

#include <filesystem>

namespace lodestone::minecraft::java::anvil::jungle::world {

class JungleAnvilWorldIo : public conversion::world::DirectoryWorldIO {
public:
const conversion::level::LevelIO *
getLevelIO(int version) const override;

std::unique_ptr<level::world::World>
read(const std::filesystem::path &path, int version,
const conversion::world::options::AbstractWorldReadOptions
&options) const override;

void write(const std::filesystem::path &path, level::world::World *w,
int version,
const conversion::world::options::AbstractWorldWriteOptions
&options) const override;

const conversion::chunk::ChunkIO *
getChunkIO(int version) const override;

const conversion::region::RegionIO *
getRegionIO(int version) const override;

const conversion::player::PlayerIO *
getPlayerIO(int version) const override;
};

} // namespace lodestone::minecraft::java::anvil::jungle::world

#endif // LODESTONE_JUNGLEANVILWORLDIO_H
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,15 @@ namespace lodestone::minecraft::java::classic::minev2 {
std::ostream &out,
const conversion::world::options::AbstractWorldWriteOptions
&options) const override;

const lodestone::conversion::chunk::ChunkIO *
getChunkIO(int version) const override;

const lodestone::conversion::region::RegionIO *
getRegionIO(int version) const override;

const lodestone::conversion::player::PlayerIO *
getPlayerIO(int version) const override;
};
} // namespace lodestone::minecraft::java::classic::minev2

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ namespace lodestone::minecraft::java::mcregion::region {
// into a Region. The coords are enough information to correctly write
// the chunks
void write(lodestone::level::Level *c, int version,
const lodestone::level::types::Vec2i &coords,
const lodestone::level::types::Vec2i &regionCoords,
std::ostream &out) const override;

const conversion::chunk::ChunkIO *
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,15 @@ namespace lodestone::minecraft::java::mcregion::world {
lodestone::level::world::World *w, int version,
const conversion::world::options::AbstractWorldWriteOptions
&options) const override;

const lodestone::conversion::chunk::ChunkIO *
getChunkIO(int version) const override;

const lodestone::conversion::region::RegionIO *
getRegionIO(int version) const override;

const lodestone::conversion::player::PlayerIO *
getPlayerIO(int version) const override;
};
} // namespace lodestone::minecraft::java::mcregion::world

Expand Down
37 changes: 37 additions & 0 deletions projects/Converters/Minecraft/Java/src/GeneratorTypes.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
//
// Created by Zero on 11/26/25.
//
#include "Lodestone.Minecraft.Java/GeneratorTypes.h"

#include <Lodestone.Common/util/Math.h>

namespace lodestone::minecraft::java {

const lodestone::common::registry::Identifier &
GeneratorTypes::generatorIdToIdentifier(const std::string &id) {
switch (
lodestone::common::util::Math::fnv1a64(id.data(), id.length())) {
default:
case "default"_hash:
return GeneratorTypes::DEFAULT;
case "flat"_hash:
return GeneratorTypes::FLAT;
case "largeBiomes"_hash:
return GeneratorTypes::LARGE_BIOMES;
}
}

std::string GeneratorTypes::identifierToGeneratorId(
const lodestone::common::registry::Identifier &id, int version) {
switch (lodestone::common::util::Math::fnv1a64(id)) {
default:
case lodestone::common::util::Math::fnv1a64(GeneratorTypes::DEFAULT):
return "default";
case lodestone::common::util::Math::fnv1a64(GeneratorTypes::FLAT):
return "flat";
case lodestone::common::util::Math::fnv1a64(
GeneratorTypes::LARGE_BIOMES):
return "largeBiomes";
}
}
} // namespace lodestone::minecraft::java
5 changes: 5 additions & 0 deletions projects/Converters/Minecraft/Java/src/LodestoneJava.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "Lodestone.Minecraft.Java/alpha/world/AlphaWorldIo.h"
#include "Lodestone.Minecraft.Java/anvil/jungle/chunk/JungleAnvilChunkIo.h"
#include "Lodestone.Minecraft.Java/anvil/jungle/region/JungleAnvilRegionIo.h"
#include "Lodestone.Minecraft.Java/anvil/jungle/world/JungleAnvilWorldIo.h"
#include "Lodestone.Minecraft.Java/classic/minev2/MineV2WorldIo.h"
#include "Lodestone.Minecraft.Java/mcregion/chunk/McRegionChunkIo.h"
#include "Lodestone.Minecraft.Java/mcregion/player/McRegionPlayerIo.h"
Expand Down Expand Up @@ -103,6 +104,10 @@ namespace lodestone::minecraft::java {
.registerRegionIO(
identifiers::ANVIL_JUNGLE,
std::make_unique<anvil::jungle::region::JungleAnvilRegionIO>());

conversion::world::WorldIORegistry::getInstance().registerWorldIO(
identifiers::ANVIL_JUNGLE,
std::make_unique<anvil::jungle::world::JungleAnvilWorldIo>());
}

LodestoneJava *LodestoneJava::getInstance() {
Expand Down
Loading