diff --git a/lib/GMLIB_API-JS.js b/lib/GMLIB_API-JS.js index dd2bad4..4abe833 100644 --- a/lib/GMLIB_API-JS.js +++ b/lib/GMLIB_API-JS.js @@ -123,7 +123,11 @@ const GMLIB_API = { itemCanDestroyInCreative: ll.import("GMLIB_API", "itemCanDestroyInCreative"), itemCanDestroySpecial: ll.import("GMLIB_API", "itemCanDestroySpecial"), blockCanDropWithAnyTool: ll.import("GMLIB_API", "blockCanDropWithAnyTool"), - blockIsAlwaysDestroyable: ll.import("GMLIB_API", "blockIsAlwaysDestroyable") + blockIsAlwaysDestroyable: ll.import("GMLIB_API", "blockIsAlwaysDestroyable"), + blockPlayerWillDestroy: ll.import("GMLIB_API", "blockPlayerWillDestroy"), + playerAttack: ll.import("GMLIB_API", "playerAttack"), + playerPullInEntity: ll.import("GMLIB_API", "playerPullInEntity"), + getBlockTranslateKeyFromName: ll.import("GMLIB_API", "getBlockTranslateKeyFromName") } const mStaticFloatingTextMap = new Map(); @@ -431,6 +435,10 @@ class Minecraft { static readNbtFromFile(path, isBinary = true) { return GMLIB_API.readNbtFromFile(path, isBinary); } + + static getBlockTranslateKeyFromName(name) { + return GMLIB_API.getBlockTranslateKeyFromName(name); + } } class Recipes { @@ -990,6 +998,18 @@ LLSE_Block.prototype.isAlwaysDestroyable = function () { return GMLIB_API.blockIsAlwaysDestroyable(this); } +LLSE_Block.prototype.playerWillDestroy = function (player) { + return GMLIB_API.blockPlayerWillDestroy(this, player, this.pos); +} + +LLSE_Player.prototype.attack = function (entity) { + return GMLIB_API.playerAttack(this, entity); +} + +LLSE_Player.prototype.pullInEntity = function (entity) { + return GMLIB_API.playerPullInEntity(this, entity); +} + module.exports = { StaticFloatingText, DynamicFloatingText, diff --git a/src/CompatibilityApi.cpp b/src/CompatibilityApi.cpp index 4a3e18d..a8dc808 100644 --- a/src/CompatibilityApi.cpp +++ b/src/CompatibilityApi.cpp @@ -659,4 +659,23 @@ void Export_Compatibility_API() { RemoteCall::exportAs("GMLIB_API", "blockIsAlwaysDestroyable", [](Block const* block) -> bool { return block->getMaterial().isAlwaysDestroyable(); }); + RemoteCall::exportAs( + "GMLIB_API", + "blockPlayerWillDestroy", + [](Block const* block, Player* player, std::pair pos) -> bool { + return block->playerWillDestroy(*player, pos.first); + } + ); + RemoteCall::exportAs("GMLIB_API", "playerAttack", [](Player* player, Actor* entity) -> bool { + return player->attack(*entity, ActorDamageCause::EntityAttack); + }); + RemoteCall::exportAs("GMLIB_API", "playerPullInEntity", [](Player* player, Actor* entity) -> bool { + return player->pullInEntity(*entity); + }); + RemoteCall::exportAs("GMLIB_API", "getBlockTranslateKeyFromName", [](std::string const& blockName) -> std::string { + if (auto block = Block::tryGetFromRegistry(blockName)) { + return block->buildDescriptionId(); + } + return blockName; + }); } \ No newline at end of file