Compare commits

..

15 Commits

19 changed files with 965 additions and 654 deletions
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

+3 -3
View File
@@ -12,7 +12,7 @@ export class PAPI {
pluginsName: string, pluginsName: string,
/** PAPI变量 */ /** PAPI变量 */
PAPIName: string PAPIName: string
): boolean; ): void;
/** 注册一个服务器PAPI变量 */ /** 注册一个服务器PAPI变量 */
static registerServerPlaceholder( static registerServerPlaceholder(
@@ -25,7 +25,7 @@ export class PAPI {
pluginsName: string, pluginsName: string,
/** PAPI变量 */ /** PAPI变量 */
PAPIName: string PAPIName: string
): boolean; ): void;
/** 注册一个静态PAPI变量 */ /** 注册一个静态PAPI变量 */
static registerStaticPlaceholder( static registerStaticPlaceholder(
@@ -37,7 +37,7 @@ export class PAPI {
PAPIName: string, PAPIName: string,
/** 更新时间 */ /** 更新时间 */
UpdateInterval: number UpdateInterval: number
): boolean; ): void;
/** 获取一个服务器变量的值 */ /** 获取一个服务器变量的值 */
static getValue( static getValue(
+3 -3
View File
@@ -59,7 +59,7 @@ class PAPI {
*/ */
static registerPlayerPlaceholder(func, PluginName, PAPIName) { static registerPlayerPlaceholder(func, PluginName, PAPIName) {
ll.export(func, PluginName, func.getName()); ll.export(func, PluginName, func.getName());
return PlaceholderAPI.registerPlayerPlaceholderAPI(PluginName, func.getName(), PAPIName); PlaceholderAPI.registerPlayerPlaceholderAPI(PluginName, func.getName(), PAPIName);
} }
/** /**
@@ -71,7 +71,7 @@ class PAPI {
*/ */
static registerServerPlaceholder(func, PluginName, PAPIName) { static registerServerPlaceholder(func, PluginName, PAPIName) {
ll.export(func, PluginName, func.getName()); ll.export(func, PluginName, func.getName());
return PlaceholderAPI.registerServerPlaceholderAPI(PluginName, func.getName(), PAPIName); PlaceholderAPI.registerServerPlaceholderAPI(PluginName, func.getName(), PAPIName);
} }
/** /**
@@ -84,7 +84,7 @@ class PAPI {
*/ */
static registerStaticPlaceholder(func, PluginName, PAPIName, UpdateInterval = 50) { static registerStaticPlaceholder(func, PluginName, PAPIName, UpdateInterval = 50) {
ll.export(func, PluginName, func.getName()); ll.export(func, PluginName, func.getName());
return PlaceholderAPI.registerStaticPlaceholderAPI(PluginName, func.getName(), PAPIName, UpdateInterval); PlaceholderAPI.registerStaticPlaceholderAPI(PluginName, func.getName(), PAPIName, UpdateInterval);
} }
/** /**
+40 -1
View File
@@ -2,11 +2,50 @@
* @returns {string} * @returns {string}
*/ */
const getPluginName = () => { const getPluginName = () => {
// quickjs
try { try {
throw new Error("getPluginName"); throw new Error("getPluginName");
} catch (error) { } catch (error) {
return error.stack.trim().match(/plugins\\(.*)\\.*\.js:[0-9]+\)$/i)?.[1] || "Unknown"; const /** @type {string} */ line = error.stack.trim().split("\n").pop().trim();
if (line.includes("<anonymous>")) {
return line.slice(
line.indexOf("(") + 1,
line.indexOf("\\")
);
}
if (line.includes("<eval>")) {
return line.slice(
line.indexOf("/", line.indexOf("/") + 1) + 1,
line.indexOf("\\")
);
}
} }
// nodejs
try {
const path = require('path');
const selfFileName = path.basename(__filename);
const pluginDirectory = Object.entries(
require('module')._pathCache
).find(
([key, _]) =>
key.includes(selfFileName)
)[0].split("\u0000")[1];
const directories = pluginDirectory.split("\\");
const pluginName = directories[directories.findIndex(value => value === "plugins") + 1].trim();
if (pluginName) return pluginName;
} catch { }
try {
throw new Error("getPluginName");
} catch (error) {
const /** @type {string} */ line = error.stack.trim().split("\n").pop().trim();
if (line.includes(".js") && /:\d+:\d+$/.test(line)) {
const directories = line.split("\\");
const pluginName = directories[directories.findIndex(value => value === "plugins") + 1].trim();
if (pluginName) return pluginName;
}
}
return "Unknown";
}; };
module.exports = { module.exports = {
+6 -7
View File
@@ -256,7 +256,7 @@ const GMLIB_API = {
blockPlayerWillDestroy: ll.import("GMLIB_API", "blockPlayerWillDestroy"), blockPlayerWillDestroy: ll.import("GMLIB_API", "blockPlayerWillDestroy"),
/** 使玩家攻击实体 @type {function(Entity,Player):boolean} */ /** 使玩家攻击实体 @type {function(Entity,Player):boolean} */
playerAttack: ll.import("GMLIB_API", "playerAttack"), playerAttack: ll.import("GMLIB_API", "playerAttack"),
/** @type {function(Player,Entity):boolean} */ /** @type {function(Player,Entity):void} */
playerPullInEntity: ll.import("GMLIB_API", "playerPullInEntity"), playerPullInEntity: ll.import("GMLIB_API", "playerPullInEntity"),
/** 根据命令空间获取翻译键名 @type {function(string):string} */ /** 根据命令空间获取翻译键名 @type {function(string):string} */
getBlockTranslateKeyFromName: ll.import("GMLIB_API", "getBlockTranslateKeyFromName"), getBlockTranslateKeyFromName: ll.import("GMLIB_API", "getBlockTranslateKeyFromName"),
@@ -2291,14 +2291,14 @@ class GMLIB_BinaryStream {
this.writeUnsignedVarInt(data.id); this.writeUnsignedVarInt(data.id);
this.writeUnsignedVarInt(data.type); this.writeUnsignedVarInt(data.type);
switch (data.type) { switch (data.type) {
case 0: this.writeByte(data.value); break; case 0: this.writeUnsignedChar(data.value); break;
case 1: this.writeSignedShort(data.value); break; case 1: this.writeUnsignedShort(data.value); break;
case 2: this.writeSignedInt(data.value); break; case 2: this.writeVarInt(data.value); break;
case 3: this.writeFloat(data.value); break; case 3: this.writeFloat(data.value); break;
case 4: this.writeString(data.value); break; case 4: this.writeString(data.value); break;
case 5: this.writeCompoundTag(data.value); break; case 5: this.writeCompoundTag(data.value); break;
case 6: this.writeBlockPos(data.value); break; case 6: this.writeBlockPos(data.value); break;
case 7: this.writeSignedInt64(data.value); break; case 7: this.writeVarInt64(data.value); break;
case 8: this.writeVec3(data.value); break; case 8: this.writeVec3(data.value); break;
default: throw new Error("Unknown data type"); default: throw new Error("Unknown data type");
} }
@@ -2739,10 +2739,9 @@ LLSE_Player.prototype.pullInEntity =
/** /**
* *
* @param {Entity} entity 实体对象 * @param {Entity} entity 实体对象
* @returns {boolean}
*/ */
function (entity) { function (entity) {
return GMLIB_API.playerPullInEntity(this, entity); GMLIB_API.playerPullInEntity(this, entity);
}; };
LLSE_Item.prototype.applyEnchant = LLSE_Item.prototype.applyEnchant =
+42
View File
@@ -0,0 +1,42 @@
/** 翻译带PAPI变量文本 */
export function translate(
/** 要翻译的文本 */
value: String,
/** 实体对象 */
actor?: Entity,
/** 目标翻译语言 */
language?: String
): String;
/** 注册PAPI变量 */
export function registerPlaceholder(
/** papi变量 */
placeholder: String,
/** 回调 */
callback: (
/** 实体对象 */ actor: Entity,
/** 参数 */ params: String[],
/** 目标翻译语言 */language: String
) => String | undefined
): void;
/** 注销PAPI变量 */
export function unregisterPlaceholder(
/** papi变量 */
placeholder: String
): Boolean;
/** 根据模组名注销PAPI变量 */
export function unregisterPlaceholderFromModName(
/** 模组名 */
modName: String
): Boolean;
/** 获取一个papi变量的值 */
export function getValue(
/** papi变量名 */
placeholder: String,
actor?: Entity,
params?: Record<String, String>,
language?: string
): Boolean;
+102
View File
@@ -0,0 +1,102 @@
/// <reference path='d:/dts/dts/helperlib/src/index.d.ts'/>
const getPluginName = () => {
// quickjs
try {
throw new Error("getPluginName");
} catch (error) {
const /** @type {string} */ line = error.stack.trim().split("\n").pop().trim();
if (line.includes("<anonymous>")) {
return line.slice(
line.indexOf("(") + 1,
line.indexOf("\\")
);
}
if (line.includes("<eval>")) {
return line.slice(
line.indexOf("/", line.indexOf("/") + 1) + 1,
line.indexOf("\\")
);
}
}
// nodejs
try {
const path = require('path');
const selfFileName = path.basename(__filename);
const pluginDirectory = Object.entries(
require('module')._pathCache
).find(
([key, _]) =>
key.includes(selfFileName)
)[0].split("\u0000")[1];
const directories = pluginDirectory.split("\\");
const pluginName = directories[directories.findIndex(value => value === "plugins") + 1].trim();
if (pluginName) return pluginName;
} catch { }
try {
throw new Error("getPluginName");
} catch (error) {
const /** @type {string} */ line = error.stack.trim().split("\n").pop().trim();
if (line.includes(".js") && /:\d+:\d+$/.test(line)) {
const directories = line.split("\\");
const pluginName = directories[directories.findIndex(value => value === "plugins") + 1].trim();
if (pluginName) return pluginName;
}
}
return "Unknown";
};
Function.prototype.getName =
/**
* 获取函数名字
* @returns {string}
*/
function () {
return this.name || this.toString().match(/function\s*([^(]*)\(/)?.[1] || getStringHashCode(this.toString()).toString(16);
};
/**
* 获取字符串哈希值
* @param {string} str 字符串
* @returns {number}
*/
function getStringHashCode(str) {
let hash = 0, chr;
if (str.length === 0) return hash;
for (let i = 0; i < str.length; i++) {
chr = str.charCodeAt(i);
hash = ((hash << 5) - hash) + chr;
hash |= 0;
}
return hash;
}
module.exports = {
translate(value, actor = undefined, language = "") {
return actor instanceof LLSE_Entity
? ll.imports("PlaceholderAPI", "translateFromActor")(value, actor, language)
: ll.imports("PlaceholderAPI", "translate")(value, language);
},
registerPlaceholder(placeholder, callback) {
const pluginName = getPluginName();
ll.exports((...args) => {
if(!args[0].uniqueId) args[0] = undefined;
return callback(...args) ?? "<std::nullopt>";
}, pluginName, callback.getName());
ll.imports("PlaceholderAPI", "registerPlaceholder")(placeholder, callback.getName(), pluginName);
},
unregisterPlaceholder(placeholder) {
return ll.imports("PlaceholderAPI", "unregisterPlaceholder")(placeholder);
},
unregisterPlaceholderFromModName(placeholder) {
return ll.imports("PlaceholderAPI", "unregisterPlaceholderFromModName")(placeholder);
},
getValue(placeholder, actor = undefined, params = {}, language = "") {
if (actor instanceof LLSE_Player) actor = ll.import("GMLib_ServerAPI", "PlayerToEntity")(actor);
const result = actor instanceof LLSE_Entity
? ll.imports("PlaceholderAPI", "getValueFromActor")(placeholder, actor, params, language)
: ll.imports("PlaceholderAPI", "getValue")(placeholder, params, language);
return result !== "<std::nullopt>" ? result : undefined;
}
};
+4 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "${pluginName}", "name": "${pluginName}",
"entry": "${pluginFile}", "entry": "${pluginFile}",
"version": "0.13.6", "version": "1.0.0",
"author": "GroupMountain", "author": "GroupMountain",
"type": "native", "type": "native",
"passive": true, "passive": true,
@@ -11,6 +11,9 @@
}, },
{ {
"name": "LegacyRemoteCall" "name": "LegacyRemoteCall"
},
{
"name": "iListenAttentively"
} }
] ]
} }
+15 -10
View File
@@ -1,20 +1,19 @@
#include "Global.h" #include "Global.h"
using namespace ll::hash_utils;
class LegacyScriptBinaryStreamManager { class LegacyScriptBinaryStreamManager {
private: private:
int64 mNextBinaryStreamId = 0; int64 mNextBinaryStreamId = 0;
std::unordered_map<uint64, std::shared_ptr<GMLIB_BinaryStream>> mBinaryStream; std::unordered_map<uint64, std::shared_ptr<GMBinaryStream>> mBinaryStream;
public: public:
uint getNextId() { return mNextBinaryStreamId++; } uint getNextId() { return mNextBinaryStreamId++; }
void cretateBinaryStream(uint id) { mBinaryStream[id] = std::make_shared<GMLIB_BinaryStream>(); } void cretateBinaryStream(uint id) { mBinaryStream[id] = std::make_shared<GMBinaryStream>(); }
uint64 copyBinaryStream(uint id) { uint64 copyBinaryStream(uint id) {
auto nextId = getNextId(); auto nextId = getNextId();
cretateBinaryStream(nextId); cretateBinaryStream(nextId);
if(auto bs = getBinaryStream(nextId); bs !=nullptr){ if (auto bs = getBinaryStream(nextId); bs != nullptr) {
getBinaryStream(nextId)->mBuffer = getBinaryStream(id)->mBuffer; getBinaryStream(nextId)->mBuffer = getBinaryStream(id)->mBuffer;
} }
return nextId; return nextId;
@@ -22,7 +21,7 @@ public:
void removeBinaryStream(uint64 id) { mBinaryStream.erase(id); } void removeBinaryStream(uint64 id) { mBinaryStream.erase(id); }
std::shared_ptr<GMLIB_BinaryStream> getBinaryStream(uint64 id) { std::shared_ptr<GMBinaryStream> getBinaryStream(uint64 id) {
return mBinaryStream.contains(id) ? mBinaryStream.at(id) : nullptr; return mBinaryStream.contains(id) ? mBinaryStream.at(id) : nullptr;
} }
@@ -47,7 +46,7 @@ template <typename T, typename R, typename A, typename... AS>
struct Info<R (T::*)(A, AS...)> { struct Info<R (T::*)(A, AS...)> {
using ArgT = A; using ArgT = A;
}; };
#define EXPORTAPI2(T) EXPORTAPI(#T, Info<decltype(&GMLIB_BinaryStream::T)>::ArgT, bs->T(value)) #define EXPORTAPI2(T) EXPORTAPI(#T, Info<decltype(&BinaryStream::T)>::ArgT, bs->T(value))
void Export_BinaryStream_API() { void Export_BinaryStream_API() {
RemoteCall::exportAs("GMLIB_BinaryStream_API", "create", []() -> uint64 { RemoteCall::exportAs("GMLIB_BinaryStream_API", "create", []() -> uint64 {
@@ -60,17 +59,23 @@ void Export_BinaryStream_API() {
}); });
RemoteCall::exportAs("GMLIB_BinaryStream_API", "reset", [](uint64 id) -> void { RemoteCall::exportAs("GMLIB_BinaryStream_API", "reset", [](uint64 id) -> void {
if (BinaryStreamManager.getBinaryStream(id) == nullptr) BinaryStreamManager.cretateBinaryStream(id); if (BinaryStreamManager.getBinaryStream(id) == nullptr) BinaryStreamManager.cretateBinaryStream(id);
else BinaryStreamManager.getBinaryStream(id)->reset(); else {
auto bs = BinaryStreamManager.getBinaryStream(id);
bs->mBuffer.clear();
bs->mReadPointer = 0;
bs->mHasOverflowed = false;
}
}); });
RemoteCall::exportAs("GMLIB_BinaryStream_API", "sendTo", [](uint64 id, Player* player) -> void { RemoteCall::exportAs("GMLIB_BinaryStream_API", "sendTo", [](uint64 id, Player* player) -> void {
if (auto bs = BinaryStreamManager.getBinaryStream(id); bs != nullptr) bs->sendTo(*player); if (auto bs = BinaryStreamManager.getBinaryStream(id); bs != nullptr)
bs->sendTo(static_cast<GMPlayer&>(*player));
}); });
RemoteCall::exportAs("GMLIB_BinaryStream_API", "destroy", [](uint64 id) -> void { RemoteCall::exportAs("GMLIB_BinaryStream_API", "destroy", [](uint64 id) -> void {
BinaryStreamManager.removeBinaryStream(id); BinaryStreamManager.removeBinaryStream(id);
}); });
EXPORTAPI("writePacketHeader", int, bs->writePacketHeader((MinecraftPacketIds)value)); EXPORTAPI("writePacketHeader", int, bs->writePacketHeader((MinecraftPacketIds)value));
EXPORTAPI("writeUuid", std::string const&, bs->writeUuid(mce::UUID::fromString(value))); EXPORTAPI("writeUuid", std::string const&, bs->writeUuid(mce::UUID::fromString(value)));
EXPORTAPI("writeItem", ItemStack*, bs->writeType(NetworkItemStackDescriptor(*value))); EXPORTAPI("writeItem", ItemStack*, bs->writeNetworkItemStackDescriptor(NetworkItemStackDescriptor(*value)));
EXPORTAPI("writeString", std::string const&, bs->writeString(value)); EXPORTAPI("writeString", std::string const&, bs->writeString(value));
EXPORTAPI("writeCompoundTag", CompoundTag*, bs->writeCompoundTag(*value)); EXPORTAPI("writeCompoundTag", CompoundTag*, bs->writeCompoundTag(*value));
EXPORTAPI2(writeBool); EXPORTAPI2(writeBool);
+302 -249
View File
File diff suppressed because it is too large Load Diff
+10 -2
View File
@@ -9,6 +9,7 @@ LegacyRemoteCallApi& LegacyRemoteCallApi::getInstance() {
} }
bool LegacyRemoteCallApi::load() { bool LegacyRemoteCallApi::load() {
(void)CustomRecipeRegistry::getInstance();
Export_Legacy_GMLib_ModAPI(); Export_Legacy_GMLib_ModAPI();
Export_Legacy_GMLib_ServerAPI(); Export_Legacy_GMLib_ServerAPI();
Export_Compatibility_API(); Export_Compatibility_API();
@@ -20,8 +21,8 @@ bool LegacyRemoteCallApi::load() {
logger->info("GMLIB-LegacyRemoteCallApi Loaded!"); logger->info("GMLIB-LegacyRemoteCallApi Loaded!");
logger->info( logger->info(
"Loaded Version: {} with {}", "Loaded Version: {} with {}",
fmt::format(fg(fmt::color::pink), "GMLIB-" + GMLIB::Version::getLibVersionString()), fmt::format(fg(fmt::color::pink), "GMLIB-" GMLIB_FILE_VERSION_STRING),
fmt::format(fg(fmt::color::light_green), "GMLIB-LegacyRemoteCallApi-" + LIB_VERSION.asString()) fmt::format(fg(fmt::color::light_green), "GMLIB-LegacyRemoteCallApi-" + LIB_VERSION.to_string())
); );
logger->info("Author: GroupMountain"); logger->info("Author: GroupMountain");
logger->info("Repository: https://github.com/GroupMountain/GMLIB-LegacyRemoteCallApi"); logger->info("Repository: https://github.com/GroupMountain/GMLIB-LegacyRemoteCallApi");
@@ -35,3 +36,10 @@ bool LegacyRemoteCallApi::disable() { return true; }
} // namespace gmlib } // namespace gmlib
LL_REGISTER_MOD(gmlib::LegacyRemoteCallApi, gmlib::LegacyRemoteCallApi::getInstance()); LL_REGISTER_MOD(gmlib::LegacyRemoteCallApi, gmlib::LegacyRemoteCallApi::getInstance());
ll::thread::ThreadPoolExecutor const& getThreadPoolExecutor() {
return gmlib::LegacyRemoteCallApi::getInstance().getThreadPoolExecutor();
}
ll::io::Logger& getLogger() { return gmlib::LegacyRemoteCallApi::getInstance().getSelf().getLogger(); }
+6 -2
View File
@@ -1,6 +1,7 @@
#pragma once #pragma once
#include <ll/api/mod/NativeMod.h> #include <ll/api/mod/NativeMod.h>
#include <ll/api/mod/RegisterHelper.h> #include <ll/api/mod/RegisterHelper.h>
#include <ll/api/thread/ThreadPoolExecutor.h>
namespace gmlib { namespace gmlib {
@@ -9,7 +10,7 @@ class LegacyRemoteCallApi {
public: public:
static LegacyRemoteCallApi& getInstance(); static LegacyRemoteCallApi& getInstance();
LegacyRemoteCallApi() : mSelf(*ll::mod::NativeMod::current()) {} LegacyRemoteCallApi() : mSelf(*ll::mod::NativeMod::current()), mThreadPoolExecutor(getSelf().getName()) {}
[[nodiscard]] ll::mod::NativeMod& getSelf() const { return mSelf; } [[nodiscard]] ll::mod::NativeMod& getSelf() const { return mSelf; }
@@ -26,8 +27,11 @@ public:
// /// @return True if the plugin is unloaded successfully. // /// @return True if the plugin is unloaded successfully.
// bool unload(); // bool unload();
ll::thread::ThreadPoolExecutor& getThreadPoolExecutor() { return mThreadPoolExecutor; }
private: private:
ll::mod::NativeMod& mSelf; ll::mod::NativeMod& mSelf;
ll::thread::ThreadPoolExecutor mThreadPoolExecutor;
}; };
} // namespace gmlib } // namespace gmlib
+128 -160
View File
@@ -1,6 +1,4 @@
#include "Global.h" #include "Global.h"
#include "ll/api/service/Bedrock.h"
#include "ll/api/utils/ErrorUtils.h"
using namespace ll::hash_utils; using namespace ll::hash_utils;
class EventManager { class EventManager {
@@ -28,7 +26,6 @@ public:
bool removeListener(ullong id) { bool removeListener(ullong id) {
if (ll::event::EventBus::getInstance().removeListener(mEventIds[id])) { if (ll::event::EventBus::getInstance().removeListener(mEventIds[id])) {
ll::mod::NativeMod::current()->getLogger().warn("Removed listener with id {}", id);
mEventIds[id] = nullptr; mEventIds[id] = nullptr;
return true; return true;
} }
@@ -86,274 +83,245 @@ void Export_Event_API() {
} }
case doHash("gmlib::ClientLoginAfterEvent"): { case doHash("gmlib::ClientLoginAfterEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::PacketEvent::ClientLoginAfterEvent, ila::mc::ClientLoginAfterEvent,
(std::string const& realName, (std::string const& realName,
std::string const& uuid, std::string const& uuid,
std::string const& serverXuid, std::string const& serverXuid,
std::string const& clientXuid), std::string const& clientXuid),
(event.getRealName(), (event.realName(), event.uuid().asString(), event.serverAuthXuid(), event.clientAuthXuid()),
event.getUuid().asString(),
event.getServerAuthXuid(),
event.getClientAuthXuid()),
if (result) event.disConnectClient(); if (result) event.disConnectClient();
); );
} }
case doHash("gmlib::WeatherUpdateBeforeEvent"): { case doHash("gmlib::WeatherUpdateBeforeEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::LevelEvent::WeatherUpdateBeforeEvent, ila::mc::WeatherUpdateBeforeEvent,
(float rainLevel, int rainTime, float lightningLevel, int lightningTime, bool isCancelled), (float rainLevel, int rainTime, float lightningLevel, int lightningTime, bool isCancelled),
(event.getRainLevel(), (event.rainLevel(),
event.getRainingLastTick(), event.rainTime(),
event.getLightningLevel(), event.lightningLevel(),
event.getLightningLastTick(), event.lightningTime(),
event.isCancelled()), event.isCancelled()),
event.setCancelled(result); event.setCancelled(result);
); );
} }
case doHash("gmlib::WeatherUpdateAfterEvent"): { case doHash("gmlib::WeatherUpdateAfterEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::LevelEvent::WeatherUpdateAfterEvent, ila::mc::WeatherUpdateAfterEvent,
(float rainLevel, int rainTime, float lightningLevel, int lightningTime), (float rainLevel, int rainTime, float lightningLevel, int lightningTime),
(event.getRainLevel(), (event.rainLevel(), event.rainTime(), event.lightningLevel(), event.lightningTime()),
event.getRainingLastTick(),
event.getLightningLevel(),
event.getLightningLastTick()),
, ,
); );
} }
case doHash("gmlib::MobPickupItemBeforeEvent"): { case doHash("gmlib::MobPickupItemBeforeEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(ila::mc::ActorPickupItemBeforeEvent,
GMLIB::Event::EntityEvent::MobPickupItemBeforeEvent, (Actor * mob, Actor * item, bool isCancelled),
(Actor * mob, Actor * item, bool isCancelled), (&event.self(), (Actor*)&event.itemActor(), event.isCancelled()),
(&event.self(), (Actor*)&event.getItemActor(), event.isCancelled()), event.setCancelled(result););
event.setCancelled(result);
);
} }
case doHash("gmlib::MobPickupItemAfterEvent"): { case doHash("gmlib::MobPickupItemAfterEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::EntityEvent::MobPickupItemAfterEvent, ila::mc::ActorPickupItemAfterEvent,
(Actor * mob, Actor * item), (Actor * mob, Actor * item),
(&event.self(), (Actor*)&event.getItemActor()), (&event.self(), (Actor*)&event.itemActor()),
, ,
); );
} }
case doHash("gmlib::ItemActorSpawnBeforeEvent"): { case doHash("gmlib::ItemActorSpawnBeforeEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::EntityEvent::ItemActorSpawnBeforeEvent, ila::mc::SpawnItemActorBeforeEvent,
(ItemStack * item, std::pair<Vec3, int> position, int64 spawnerUniqueId, bool isCancelled), (ItemStack * item, std::pair<Vec3, int> position, int64 spawnerUniqueId, bool isCancelled),
(&event.getItem(), (&event.item(),
{event.getPosition(), event.getBlockSource().getDimensionId().id}, {event.pos(), event.blockSource().getDimensionId().id},
event.getSpawner().has_value() ? event.getSpawner()->getOrCreateUniqueID().rawID : -1, event.spawner() ? event.spawner()->getOrCreateUniqueID().rawID : -1,
event.isCancelled()), event.isCancelled()),
event.setCancelled(result); event.setCancelled(result);
); );
} }
case doHash("gmlib::ItemActorSpawnAfterEvent"): { case doHash("gmlib::ItemActorSpawnAfterEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::EntityEvent::ItemActorSpawnAfterEvent, ila::mc::SpawnItemActorAfterEvent,
(Actor * item, std::pair<Vec3, int> position, int64 spawnerUniqueId), (Actor * item, std::pair<Vec3, int> position, int64 spawnerUniqueId),
(&event.self(), (&event.itemActor(),
{event.getPosition(), event.getBlockSource().getDimensionId().id}, {event.pos(), event.blockSource().getDimensionId().id},
event.getSpawner().has_value() ? event.getSpawner()->getOrCreateUniqueID().rawID : -1), event.spawner() ? event.spawner()->getOrCreateUniqueID().rawID : -1),
, ,
); );
} }
case doHash("gmlib::ActorChangeDimensionBeforeEvent"): { case doHash("gmlib::ActorChangeDimensionBeforeEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(ila::mc::ActorChangeDimensionBeforeEvent,
GMLIB::Event::EntityEvent::ActorChangeDimensionBeforeEvent, (Actor * entity, int toDimId, bool isCancelled),
(Actor * entity, int toDimId, bool isCancelled), (&event.self(), event.toDimensionId(), event.isCancelled()),
(&event.self(), event.getToDimensionId(), event.isCancelled()), event.setCancelled(result););
event.setCancelled(result);
);
} }
case doHash("gmlib::ActorChangeDimensionAfterEvent"): { case doHash("gmlib::ActorChangeDimensionAfterEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::EntityEvent::ActorChangeDimensionAfterEvent, ila::mc::ActorChangeDimensionAfterEvent,
(Actor * entity, int fromDimId, int toDimId), (Actor * entity, int fromDimId, int toDimId),
(&event.self(), event.getFromDimensionId(), event.getToDimensionId()), (&event.self(), event.fromDimensionId(), event.toDimensionId()),
, ,
); );
} }
case doHash("gmlib::PlayerStartSleepBeforeEvent"): { case doHash("gmlib::PlayerStartSleepBeforeEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::PlayerEvent::PlayerStartSleepBeforeEvent, ila::mc::PlayerStartSleepBeforeEvent,
(Player * entity, BlockPos pos, bool isCancelled), (Player * entity, BlockPos pos, bool isCancelled),
(&event.self(), event.getPosition(), event.isCancelled()), (&event.self(), event.pos(), event.isCancelled()),
event.setCancelled(result); event.setCancelled(result);
); );
} }
case doHash("gmlib::PlayerStartSleepAfterEvent"): { case doHash("gmlib::PlayerStartSleepAfterEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::PlayerEvent::PlayerStartSleepAfterEvent, ila::mc::PlayerStartSleepAfterEvent,
(Player * entity, BlockPos pos, int result), (Player * entity, BlockPos pos, int result),
(&event.self(), event.getPosition(), (int)event.getResult()), (&event.self(), event.pos(), (int)event.result()),
, ,
); );
} }
case doHash("gmlib::PlayerStopSleepBeforeEvent"): { case doHash("gmlib::PlayerStopSleepBeforeEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::PlayerEvent::PlayerStopSleepBeforeEvent, ila::mc::PlayerStopSleepBeforeEvent,
(Player * entity, bool forcefulWakeUp, bool updateLevelList, bool isCancelled), (Player * entity, bool forcefulWakeUp, bool updateLevelList, bool isCancelled),
(&event.self(), event.isForcefulWakeUp(), event.isUpdateLevelList(), event.isCancelled()), (&event.self(), event.forcefulWakeUp(), event.updateLevelList(), false),
event.setCancelled(result);
); );
} }
case doHash("gmlib::PlayerStopSleepAfterEvent"): { case doHash("gmlib::PlayerStopSleepAfterEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::PlayerEvent::PlayerStopSleepAfterEvent, ila::mc::PlayerStopSleepAfterEvent,
(Player * entity, bool forcefulWakeUp, bool updateLevelList, bool), (Player * entity, bool forcefulWakeUp, bool updateLevelList, bool),
(&event.self(), event.isForcefulWakeUp(), event.isUpdateLevelList(), false), (&event.self(), event.forcefulWakeUp(), event.updateLevelList(), false),
, ,
); );
} }
case doHash("gmlib::DeathMessageAfterEvent"): { case doHash("gmlib::DeathMessageAfterEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::EntityEvent::DeathMessageAfterEvent, ila::mc::DeathMessageAfterEvent,
(std::string const& message, std::vector<std::string>, Actor* dead), (std::string const& message, std::vector<std::string>, Actor* dead),
(event.getDeathMessage().first, event.getDeathMessage().second, &event.self()), (event.result().first, event.result().second, &event.self()),
, ,
); );
} }
case doHash("gmlib::MobHurtAfterEvent"): { case doHash("gmlib::MobHurtAfterEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::EntityEvent::MobHurtAfterEvent, ila::mc::MobHealthChangeAfterEvent,
(Actor * mob, Actor * source, float damage, int cause), (Actor * mob, Actor * source, float damage, int cause),
(&event.self(), source, -event.getDamage(), (int)damageSource.getCause()), (&event.self(), source, event.oldValue() - event.newValue(), (int)damageSource->mCause),
, ,
auto& damageSource = event.getSource(); if (event.newValue() > event.oldValue()) return;
auto& damageSource = event.buff().mSource;
Actor* source = nullptr; Actor* source = nullptr;
if (damageSource.isEntitySource()) { if (damageSource->isEntitySource()) {
auto uniqueId = damageSource.getDamagingEntityUniqueID(); auto uniqueId = damageSource->getDamagingEntityUniqueID();
source = ll::service::getLevel()->fetchEntity(uniqueId, false); source = ll::service::getLevel()->fetchEntity(uniqueId, false);
if (source->getOwner()) source = source->getOwner(); if (source->getOwner()) source = source->getOwner();
} }
); );
} }
case doHash("gmlib::EndermanTakeBlockBeforeEvent"): { case doHash("gmlib::EndermanTakeBlockBeforeEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(ila::mc::EndermanTakeBlockBeforeEvent,
GMLIB::Event::EntityEvent::EndermanTakeBlockBeforeEvent, (Actor * mob, bool isCancelled),
(Actor * mob, bool isCancelled), (&event.self(), event.isCancelled()),
(&event.self(), event.isCancelled()), event.setCancelled(result););
event.setCancelled(result);
);
} }
case doHash("gmlib::DragonRespawnBeforeEvent"): { case doHash("gmlib::DragonRespawnBeforeEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(ila::mc::DragonRespawnBeforeEvent,
GMLIB::Event::EntityEvent::DragonRespawnBeforeEvent, (bool isCancelled),
(bool isCancelled), (event.isCancelled()),
(event.isCancelled()), event.setCancelled(result););
event.setCancelled(result);
);
} }
case doHash("gmlib::DragonRespawnAfterEvent"): { case doHash("gmlib::DragonRespawnAfterEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(ila::mc::DragonRespawnAfterEvent, (Actor * mob), (&event.self()), );
GMLIB::Event::EntityEvent::DragonRespawnAfterEvent,
(Actor * mob),
(event.getEnderDragon()),
);
} }
case doHash("gmlib::ProjectileCreateBeforeEvent"): { case doHash("gmlib::ProjectileCreateBeforeEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(ila::mc::ProjectileCreateBeforeEvent,
GMLIB::Event::EntityEvent::ProjectileCreateBeforeEvent, (Actor * mob, int64 uniqueId, bool isCancelled),
(Actor * mob, int64 uniqueId, bool isCancelled), (&event.self(), event.self().getOwnerId().rawID, event.isCancelled()),
(&event.self(), event.setCancelled(result););
event.getShooter() ? event.getShooter()->getOrCreateUniqueID().rawID : -1,
event.isCancelled()),
event.setCancelled(result);
);
} }
case doHash("gmlib::ProjectileCreateAfterEvent"): { case doHash("gmlib::ProjectileCreateAfterEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::EntityEvent::ProjectileCreateAfterEvent, ila::mc::ProjectileCreateAfterEvent,
(Actor * mob, int64 uniqueId), (Actor * mob, int64 uniqueId),
(&event.self(), event.getShooter() ? event.getShooter()->getOrCreateUniqueID().rawID : -1), (&event.self(), event.self().getOwnerId().rawID),
); );
} }
case doHash("gmlib::SpawnWanderingTraderBeforeEvent"): { case doHash("gmlib::SpawnWanderingTraderBeforeEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(ila::mc::SpawnWanderingTraderBeforeEvent,
GMLIB::Event::EntityEvent::SpawnWanderingTraderBeforeEvent, (std::pair<BlockPos, int> pos, bool isCancelled),
(std::pair<BlockPos, int> pos, bool isCancelled), ({event.pos(), event.blockSource().getDimensionId()}, event.isCancelled()),
({event.getPos(), event.getRegion().getDimensionId()}, event.isCancelled()), event.setCancelled(result););
event.setCancelled(result);
);
} }
case doHash("gmlib::SpawnWanderingTraderAfterEvent"): { case doHash("gmlib::SpawnWanderingTraderAfterEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::EntityEvent::SpawnWanderingTraderAfterEvent, ila::mc::SpawnWanderingTraderAfterEvent,
(std::pair<BlockPos, int> pos), (std::pair<BlockPos, int> pos),
({event.getPos(), event.getRegion().getDimensionId()}), ({event.pos(), event.blockSource().getDimensionId()}),
); );
} }
case doHash("gmlib::HandleRequestActionBeforeEvent"): { case doHash("gmlib::HandleRequestActionBeforeEvent"): {
// clang-format off // clang-format off
REGISTER_EVENT_LISTEN(
ila::mc::PlayerRequestItemActionBeforeEvent,
(
Player * player,
std::string const& actionType,
int count,
std::string const& sourceContainerNetId,
int sourceSlot,
std::string const& destinationContainerNetId,
int destinationSlot,
bool isCancelled
),
(
(Player*)&event.self(),
magic_enum::enum_name(event.actionType()).data(),
event.amount(),
magic_enum::enum_name(event.src().mFullContainerName.mName).data(),
(int)event.src().mSlot,
magic_enum::enum_name(event.dst().mFullContainerName.mName).data(),
(int)event.dst().mSlot,
event.isCancelled()
),
event.setCancelled(result);,
);
// clang-format on
}
case doHash("gmlib::HandleRequestActionAfterEvent"): {
// clang-format off
REGISTER_EVENT_LISTEN(
ila::mc::PlayerRequestItemActionAfterEvent,
(
Player * player,
std::string const& actionType,
int count,
std::string const& sourceContainerNetId,
int sourceSlot,
std::string const& destinationContainerNetId,
int destinationSlot
),
(
(Player*)&event.self(),
magic_enum::enum_name(event.actionType()).data(),
event.amount(),
magic_enum::enum_name(event.src().mFullContainerName.mName).data(),
(int)event.src().mSlot,
magic_enum::enum_name(event.dst().mFullContainerName.mName).data(),
(int)event.dst().mSlot
),
,
);
// clang-format on
}
case doHash("gmlib::ContainerClosePacketSendAfterEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::PlayerEvent::HandleRequestActionBeforeEvent, ila::mc::PlayerCloseContainerAfterEvent,
( (Player * player, int containerId, bool serverInitiatedClose, bool),
Player * player, (&event.self(), (int)event.containerId(), event.serverInitiatedClose(), false),
std::string const& actionType,
int count,
std::string const& sourceContainerNetId,
int sourceSlot,
std::string const& destinationContainerNetId,
int destinationSlot,
bool isCancelled
),
(
&event.self(),
magic_enum::enum_name(requestAction.mActionType).data(),
(int)requestAction.mAmount,
magic_enum::enum_name(requestAction.mSrc->mFullContainerName.mName).data(),
(int)requestAction.mSrc->mSlot,
magic_enum::enum_name(requestAction.mDst->mFullContainerName.mName).data(),
(int)requestAction.mDst->mSlot,
event.isCancelled()
),
event.setCancelled(result);,
auto& requestAction = (ItemStackRequestActionTransferBase&)event.getRequestAction();
);
// clang-format on
}
case doHash("gmlib::HandleRequestActionAfterEvent"): {
// clang-format off
REGISTER_EVENT_LISTEN(
GMLIB::Event::PlayerEvent::HandleRequestActionAfterEvent,
(
Player * player,
std::string const& actionType,
int count,
std::string const& sourceContainerNetId,
int sourceSlot,
std::string const& destinationContainerNetId,
int destinationSlot
),
(
&event.self(),
magic_enum::enum_name(requestAction.mActionType).data(),
(int)requestAction.mAmount,
magic_enum::enum_name(requestAction.mSrc->mFullContainerName.mName).data(),
(int)requestAction.mSrc->mSlot,
magic_enum::enum_name(requestAction.mDst->mFullContainerName.mName).data(),
(int)requestAction.mDst->mSlot
),
, ,
auto& requestAction = (ItemStackRequestActionTransferBase&)event.getRequestAction();
); );
// clang-format on }
} }
case doHash("gmlib::ContainerClosePacketSendAfterEvent"): { return -1;
REGISTER_EVENT_LISTEN(
GMLIB::Event::PacketEvent::ContainerClosePacketSendAfterEvent,
(Player * player, int containerId, bool serverInitiatedClose, bool),
(ll::service::getServerNetworkHandler()
->_getServerPlayer(event.getNetworkIdentifier(), event.getPacket().mClientSubId),
(int)event.getPacket().mContainerId,
event.getPacket().mServerInitiatedClose,
false),
,
);
}
}
return -1;
} }
); );
} }
+25 -13
View File
@@ -1,20 +1,32 @@
#pragma once #pragma once
#include <include_all.h> // clang-format off
#define GMLIB_GLOBAL_USING
#include <gmlib/GlobalUsing.h>
#include <gmlib/include_all.h>
#include <ila/include_all.h>
#include <RemoteCallAPI.h> #include <RemoteCallAPI.h>
using namespace gmlib::mod;
// clang-format on
#define PLUGIN_NAME fmt::format(fg(fmt::color::light_green), "GMLIB-LRCA") #define PLUGIN_NAME fmt::format(fg(fmt::color::light_green), "GMLIB-LRCA")
#define LIB_VERSION_MAJOR 0 #define LIB_VERSION_MAJOR 1
#define LIB_VERSION_MINOR 13 #define LIB_VERSION_MINOR 0
#define LIB_VERSION_PATCH 6 #define LIB_VERSION_PATCH 0
#define LIB_VERSION_PRERELEASE std::nullopt
#define LIB_VERSION GMLIB::Version(LIB_VERSION_MAJOR, LIB_VERSION_MINOR, LIB_VERSION_PATCH) #ifdef LIB_VERSION_PRERELEASE
#define LIB_VERSION ll::data::Version(LIB_VERSION_MAJOR, LIB_VERSION_MINOR, LIB_VERSION_PATCH, LIB_VERSION_PRERELEASE)
#else
#define LIB_VERSION ll::data::Version(LIB_VERSION_MAJOR, LIB_VERSION_MINOR, LIB_VERSION_PATCH)
#endif
extern void Export_Legacy_GMLib_ModAPI(); extern void Export_Legacy_GMLib_ModAPI();
extern void Export_Legacy_GMLib_ServerAPI(); extern void Export_Legacy_GMLib_ServerAPI();
extern void Export_Compatibility_API(); extern void Export_Compatibility_API();
extern void ExportPAPI(); extern void ExportPAPI();
extern void Export_Event_API(); extern void Export_Event_API();
extern void Export_BinaryStream_API(); extern void Export_BinaryStream_API();
// extern void Export_Form_API(); extern ll::thread::ThreadPoolExecutor const& getThreadPoolExecutor();
extern ll::io::Logger& getLogger();
// extern void Export_Form_API();
+61 -73
View File
@@ -2,9 +2,9 @@
std::unordered_set<std::string> HardCodedKeys = {"AlwaysUnlocked", "PlayerHasManyItems", "PlayerInWater", "None"}; std::unordered_set<std::string> HardCodedKeys = {"AlwaysUnlocked", "PlayerHasManyItems", "PlayerInWater", "None"};
std::variant<std::string, std::vector<RecipeIngredient>> makeRecipeUnlockingKey(std::string const& key) { ICustomRecipe::UnlockingRequirement makeRecipeUnlockingKey(std::string const& key) {
if (HardCodedKeys.count(key)) return key; if (HardCodedKeys.count(key)) return {{ICustomRecipe::Ingredient{key}}};
return std::vector<RecipeIngredient>({RecipeIngredient(key, 0, 1)}); return ICustomRecipe::UnlockingRequirement({ICustomRecipe::Ingredient(key, 1, 0)});
} }
void Export_Legacy_GMLib_ModAPI() { void Export_Legacy_GMLib_ModAPI() {
@@ -17,17 +17,13 @@ void Export_Legacy_GMLib_ModAPI() {
std::string const& result, std::string const& result,
int count, int count,
std::string const& unlock) -> void { std::string const& unlock) -> void {
if (!GMLIB_Level::getInstance().has_value()) return; if (!GMLevel::getInstance().has_value()) return;
std::vector<RecipeIngredient> types; std::vector<ICustomRecipe::Ingredient> types;
for (auto ing : ingredients) { for (auto& ing : ingredients) {
types.emplace_back(ing, 0, 1); types.emplace_back(ICustomRecipe::Ingredient{ing, 1});
} }
GMLIB::Mod::JsonRecipe::registerShapelessCraftingTableRecipe( CustomRecipeRegistry::getInstance()
recipe_id, .registerShapelessRecipe(recipe_id, types, ItemInstance(result, count), makeRecipeUnlockingKey(unlock));
types,
RecipeIngredient(result, 0, count),
makeRecipeUnlockingKey(unlock)
);
} }
); );
RemoteCall::exportAs( RemoteCall::exportAs(
@@ -39,18 +35,20 @@ void Export_Legacy_GMLib_ModAPI() {
std::string const& result, std::string const& result,
int count, int count,
std::string const& unlock) -> void { std::string const& unlock) -> void {
if (!GMLIB_Level::getInstance().has_value()) return; if (!GMLevel::getInstance().has_value()) return;
std::vector<RecipeIngredient> types; ICustomShapedRecipe::ShapedIngredients types;
for (auto ing : ingredients) { char index = 'a';
types.push_back(RecipeIngredient(ing, 0, 1)); for (auto& ing : ingredients) {
types.add(std::string{index++}, ICustomRecipe::Ingredient{ing, 1});
} }
GMLIB::Mod::JsonRecipe::registerShapedCraftingTableRecipe( CustomRecipeRegistry::getInstance().registerShapedRecipe(
recipe_id, recipe_id,
shape, shape,
types, types,
RecipeIngredient(result, 0, count), ItemInstance(result, count),
makeRecipeUnlockingKey(unlock) makeRecipeUnlockingKey(unlock)
); );
} }
); );
RemoteCall::exportAs( RemoteCall::exportAs(
@@ -60,13 +58,9 @@ void Export_Legacy_GMLib_ModAPI() {
std::string const& input, std::string const& input,
std::string const& output, std::string const& output,
std::vector<std::string> tags) -> void { std::vector<std::string> tags) -> void {
if (!GMLIB_Level::getInstance().has_value()) return; if (!GMLevel::getInstance().has_value()) return;
GMLIB::Mod::JsonRecipe::registerFurnaceRecipe( CustomRecipeRegistry::getInstance()
recipe_id, .registerFurnaceRecipe(ICustomRecipe::Ingredient{input}, ItemInstance{output}, tags);
RecipeIngredient(input, 0, 1),
RecipeIngredient(output, 0, 1),
tags
);
} }
); );
RemoteCall::exportAs( RemoteCall::exportAs(
@@ -74,8 +68,12 @@ void Export_Legacy_GMLib_ModAPI() {
"registerBrewingMixRecipe", "registerBrewingMixRecipe",
[](std::string const& recipe_id, std::string const& input, std::string const& output, std::string const& reagent [](std::string const& recipe_id, std::string const& input, std::string const& output, std::string const& reagent
) -> void { ) -> void {
if (!GMLIB_Level::getInstance().has_value()) return; if (!GMLevel::getInstance().has_value()) return;
GMLIB::Mod::JsonRecipe::registerBrewingMixRecipe(recipe_id, input, output, RecipeIngredient(reagent, 0, 1)); CustomRecipeRegistry::getInstance().registerBrewingRecipe(
ICustomRecipe::Ingredient{input},
ICustomRecipe::Ingredient{reagent},
ICustomRecipe::Ingredient{output}
);
} }
); );
RemoteCall::exportAs( RemoteCall::exportAs(
@@ -83,12 +81,11 @@ void Export_Legacy_GMLib_ModAPI() {
"registerBrewingContainerRecipe", "registerBrewingContainerRecipe",
[](std::string const& recipe_id, std::string const& input, std::string const& output, std::string const& reagent [](std::string const& recipe_id, std::string const& input, std::string const& output, std::string const& reagent
) -> void { ) -> void {
if (!GMLIB_Level::getInstance().has_value()) return; if (!GMLevel::getInstance().has_value()) return;
GMLIB::Mod::JsonRecipe::registerBrewingContainerRecipe( CustomRecipeRegistry::getInstance().registerBrewingRecipe(
recipe_id, ICustomRecipe::Ingredient{input},
RecipeIngredient(input, 0, 1), ICustomRecipe::Ingredient{reagent},
RecipeIngredient(output, 0, 1), ICustomRecipe::Ingredient{output}
RecipeIngredient(reagent, 0, 1)
); );
} }
); );
@@ -100,13 +97,13 @@ void Export_Legacy_GMLib_ModAPI() {
std::string const& base, std::string const& base,
std::string const& addition, std::string const& addition,
std::string const& result) -> void { std::string const& result) -> void {
if (!GMLIB_Level::getInstance().has_value()) return; if (!GMLevel::getInstance().has_value()) return;
GMLIB::Mod::JsonRecipe::registerSmithingTransformRecipe( CustomRecipeRegistry::getInstance().registerSmithingTransformRecipe(
recipe_id, recipe_id,
smithing_template, ICustomRecipe::Ingredient{smithing_template},
base, ICustomRecipe::Ingredient{base},
addition, ICustomRecipe::Ingredient{addition},
result ItemInstance{result}
); );
} }
); );
@@ -117,8 +114,13 @@ void Export_Legacy_GMLib_ModAPI() {
std::string const& smithing_template, std::string const& smithing_template,
std::string const& base, std::string const& base,
std::string const& addition) -> void { std::string const& addition) -> void {
if (!GMLIB_Level::getInstance().has_value()) return; if (!GMLevel::getInstance().has_value()) return;
GMLIB::Mod::JsonRecipe::registerSmithingTrimRecipe(recipe_id, smithing_template, base, addition); CustomRecipeRegistry::getInstance().registerSmithingTrimRecipe(
recipe_id,
ICustomRecipe::Ingredient{smithing_template},
ICustomRecipe::Ingredient{base},
ICustomRecipe::Ingredient{addition}
);
} }
); );
RemoteCall::exportAs( RemoteCall::exportAs(
@@ -130,49 +132,35 @@ void Export_Legacy_GMLib_ModAPI() {
std::string const& output, std::string const& output,
int output_data, int output_data,
int output_count) -> void { int output_count) -> void {
if (!GMLIB_Level::getInstance().has_value()) return; if (!GMLevel::getInstance().has_value()) return;
GMLIB::Mod::JsonRecipe::registerStoneCutterRecipe( CustomRecipeRegistry::getInstance().registerStoneCutterRecipe(
recipe_id, recipe_id,
RecipeIngredient(input, 0, 1), ICustomRecipe::Ingredient{input, 1, input_data},
RecipeIngredient(output, 0, 1) {output, output_count, output_data}
); );
} }
); );
// 错误方块清理 // 错误方块清理
RemoteCall::exportAs("GMLib_ModAPI", "setUnknownBlockCleaner", []() -> void { RemoteCall::exportAs("GMLib_ModAPI", "setUnknownBlockCleaner", []() -> void {
GMLIB::Mod::VanillaFix::setAutoCleanUnknownBlockEnabled(); getLogger().error("setUnknownBlockCleaner is not implemented");
}); });
// 实验性 // 实验性
RemoteCall::exportAs("GMLib_ModAPI", "registerExperimentsRequire", [](int experiment_id) -> void { RemoteCall::exportAs("GMLib_ModAPI", "registerExperimentsRequire", [](int experiment_id) -> void {
auto list = GMLIB_Level::getAllExperiments(); GMLevel::getInstance().and_then([&](GMLevel& level) {
std::unordered_set<AllExperiments> set(list.begin(), list.end()); level.setExperimentEnabled((AllExperiments)experiment_id);
if (set.contains((AllExperiments)experiment_id)) { return true;
GMLIB_Level::addExperimentsRequire((AllExperiments)experiment_id); });
} else {
ll::io::LoggerRegistry::getInstance().getOrCreate("Server")->error("Experiment ID '{}' does not exist!", experiment_id);
}
}); });
RemoteCall::exportAs("GMLib_ModAPI", "setExperimentEnabled", [](int experiment_id, bool value) -> void { RemoteCall::exportAs("GMLib_ModAPI", "setExperimentEnabled", [](int experiment_id, bool value) -> void {
if (GMLIB_Level::getInstance()) { GMLevel::getInstance().and_then([&](GMLevel& level) {
auto list = GMLIB_Level::getAllExperiments(); level.setExperimentEnabled((AllExperiments)experiment_id, value);
std::unordered_set<AllExperiments> set(list.begin(), list.end()); return true;
if (set.contains((AllExperiments)experiment_id)) { });
GMLIB_Level::getInstance()->setExperimentEnabled(((AllExperiments)experiment_id), value);
} else ll::io::LoggerRegistry::getInstance().getOrCreate("Server")->error("Experiment ID '{}' does not exist!", experiment_id);
}
}); });
RemoteCall::exportAs("GMLib_ModAPI", "getExperimentEnabled", [](int experiment_id) -> bool { RemoteCall::exportAs("GMLib_ModAPI", "getExperimentEnabled", [](int experiment_id) -> bool {
if (GMLIB_Level::getInstance()) { return GMLevel::getInstance()
auto list = GMLIB_Level::getAllExperiments(); .transform([&](GMLevel& level) { return level.getExperimentEnabled((AllExperiments)experiment_id); })
std::unordered_set<AllExperiments> set(list.begin(), list.end()); .value_or(false);
if (set.contains((AllExperiments)experiment_id)) {
return GMLIB_Level::getInstance()->getExperimentEnabled(((AllExperiments)experiment_id));
}
ll::io::LoggerRegistry::getInstance().getOrCreate("Server")->error("Experiment ID '{}' does not exist!", experiment_id);
}
return false;
});
RemoteCall::exportAs("GMLib_ModAPI", "setFixI18nEnabled", []() -> void {
GMLIB::Mod::VanillaFix::setFixI18nEnabled();
}); });
RemoteCall::exportAs("GMLib_ModAPI", "setFixI18nEnabled", []() -> void {});
} }
+29 -24
View File
@@ -2,57 +2,62 @@
void Export_Legacy_GMLib_ServerAPI() { void Export_Legacy_GMLib_ServerAPI() {
RemoteCall::exportAs("GMLib_ServerAPI", "setEducationFeatureEnabled", []() -> void { RemoteCall::exportAs("GMLib_ServerAPI", "setEducationFeatureEnabled", []() -> void {
GMLIB_Level::tryEnableEducationEdition(); getLogger().error("GMLib_ServerAPI::setEducationFeatureEnabled is not implemented");
}); });
RemoteCall::exportAs("GMLib_ServerAPI", "registerAbilityCommand", []() -> void { RemoteCall::exportAs("GMLib_ServerAPI", "registerAbilityCommand", []() -> void {
GMLIB_Level::tryRegisterAbilityCommand(); getLogger().error("GMLib_ServerAPI::registerAbilityCommand is not implemented");
}); });
RemoteCall::exportAs("GMLib_ServerAPI", "setEnableAchievement", []() -> void { RemoteCall::exportAs("GMLib_ServerAPI", "setEnableAchievement", []() -> void {
GMLIB_Level::setForceAchievementsEnabled(); getLogger().error("GMLib_ServerAPI::setEnableAchievement is not implemented");
});
RemoteCall::exportAs("GMLib_ServerAPI", "setForceTrustSkins", []() -> void {
getLogger().error("GMLib_ServerAPI::setForceTrustSkins is not implemented");
}); });
RemoteCall::exportAs("GMLib_ServerAPI", "setForceTrustSkins", []() -> void { GMLIB_Level::trustAllSkins(); });
RemoteCall::exportAs("GMLib_ServerAPI", "enableCoResourcePack", []() -> void { RemoteCall::exportAs("GMLib_ServerAPI", "enableCoResourcePack", []() -> void {
GMLIB_Level::requireServerResourcePackAndAllowClientResourcePack(); getLogger().error("GMLib_ServerAPI::enableCoResourcePack is not implemented");
}); });
RemoteCall::exportAs("GMLib_ServerAPI", "getLevelName", []() -> std::string { RemoteCall::exportAs("GMLib_ServerAPI", "getLevelName", []() -> std::string {
return GMLIB_Level::getInstance() return GMLevel::getInstance().transform(
.transform([](GMLIB_Level& level) -> std::string { return level.getLevelName(); }) [](GMLevel& level) -> std::string { return level.getLevelName(); }
.value_or(""); ).value_or("");
}); });
RemoteCall::exportAs("GMLib_ServerAPI", "setLevelName", [](std::string const& name) -> void { RemoteCall::exportAs("GMLib_ServerAPI", "setLevelName", [](std::string const& name) -> void {
if (auto level = GMLIB_Level::getInstance()) { if (auto level = GMLevel::getInstance()) {
level->setLevelName(name); level->setLevelName(name);
} }
}); });
RemoteCall::exportAs("GMLib_ServerAPI", "getLevelSeed", []() -> std::string { RemoteCall::exportAs("GMLib_ServerAPI", "getLevelSeed", []() -> std::string {
return GMLIB_Level::getInstance() return GMLevel::getInstance()
.transform([](GMLIB_Level& level) -> std::string { return std::to_string(level.getSeed()); }) .transform([](GMLevel& level) -> std::string { return std::to_string(level.getSeed()); })
.value_or(""); .value_or("");
}); });
RemoteCall::exportAs("GMLib_ServerAPI", "setFakeSeed", [](int64_t seed) -> void { RemoteCall::exportAs("GMLib_ServerAPI", "setFakeSeed", [](int64_t seed) -> void {
return GMLIB_Level::setFakeSeed(seed); getLogger().error("GMLib_ServerAPI::setFakeSeed is not implemented");
}); });
RemoteCall::exportAs( RemoteCall::exportAs(
"GMLib_ServerAPI", "GMLib_ServerAPI",
"spawnEntity", "spawnEntity",
[](std::pair<Vec3, int> pos, std::string const& name) -> Actor* { [](std::pair<Vec3, int> pos, std::string const& name) -> Actor* {
return GMLIB_Spawner::spawnEntity(pos.first, pos.second, name).as_ptr(); return GMSpawner::spawnEntity(pos.first, pos.second, name).as_ptr();
} }
); );
RemoteCall::exportAs( RemoteCall::exportAs(
"GMLib_ServerAPI", "GMLib_ServerAPI",
"shootProjectile", "shootProjectile",
[](Actor* owner, std::string const& name, float speed, float offset) -> Actor* { [](Actor* owner, std::string const& name, float speed, float offset) -> Actor* {
auto ac = (GMLIB_Actor*)owner; auto actor = GMSpawner::spawnEntity(owner->getPosition(), owner->getDimensionId(), name);
return ac->shootProjectile(name, speed, offset).as_ptr(); if (!actor) return nullptr;
((GMActor*)owner)->setProjectile((GMActor&)*actor, speed, offset);
return actor.as_ptr();
} }
); );
RemoteCall::exportAs( RemoteCall::exportAs(
"GMLib_ServerAPI", "GMLib_ServerAPI",
"throwEntity", "throwEntity",
[](Actor* owner, Actor* actor, float speed, float offset) -> bool { [](Actor* owner, Actor* actor, float speed, float offset) -> bool {
auto ac = (GMLIB_Actor*)owner; auto ac = (GMActor*)owner;
return ac->throwEntity(*actor, speed, offset); ac->setProjectile((GMActor&)*actor, speed, offset);
return true;
} }
); );
RemoteCall::exportAs("GMLib_ServerAPI", "PlayerToEntity", [](Player* player) -> Actor* { return (Actor*)player; }); RemoteCall::exportAs("GMLib_ServerAPI", "PlayerToEntity", [](Player* player) -> Actor* { return (Actor*)player; });
@@ -60,18 +65,18 @@ void Export_Legacy_GMLib_ServerAPI() {
"GMLib_ServerAPI", "GMLib_ServerAPI",
"addFakeList", "addFakeList",
[](const std::string& name, const std::string& xuid) -> bool { [](const std::string& name, const std::string& xuid) -> bool {
return GMLIB::Server::FakeList::addFakeList(name, xuid, ActorUniqueID(-1)); PlayerListAPI::push_back(name, xuid);
return true;
} }
); );
RemoteCall::exportAs("GMLib_ServerAPI", "removeFakeList", [](const std::string& nameOrXuid) -> bool { RemoteCall::exportAs("GMLib_ServerAPI", "removeFakeList", [](const std::string& nameOrXuid) -> bool {
return GMLIB::Server::FakeList::removeFakeList(nameOrXuid); PlayerListAPI::resetListName(nameOrXuid);
}); return true;
RemoteCall::exportAs("GMLib_ServerAPI", "removeAllFakeList", []() -> void {
return GMLIB::Server::FakeList::removeAllFakeLists();
}); });
RemoteCall::exportAs("GMLib_ServerAPI", "removeAllFakeList", []() -> void { PlayerListAPI::clear(); });
RemoteCall::exportAs("GMLib_ServerAPI", "getMaxPlayers", []() -> int { RemoteCall::exportAs("GMLib_ServerAPI", "getMaxPlayers", []() -> int {
return GMLIB_Level::getInstance().transform( return GMLevel::getInstance().transform(
[](GMLIB_Level& level) -> int { return level.getMaxPlayerCount(); } [](GMLevel& level) -> int { return level.getMaxPlayerCount(); }
).value_or(0); ).value_or(0);
}); });
} }
+143 -79
View File
@@ -2,122 +2,178 @@
#include <regex> #include <regex>
namespace PAPIRemoteCall { namespace PAPIRemoteCall {
std::string GetValue(std::string const& from) { return PlaceholderAPI::getValue(from, std::nullopt).value_or(""); }
std::string removeBrackets(std::string a1) {
a1.erase(a1.find_last_not_of("%") + 1);
return a1;
}
bool isParameters(std::string const& str) {
std::regex reg("[<]([^<>]+)[>]");
return std::regex_search(removeBrackets(str), reg);
}
std::string GetValue(std::string const& from) { return GMLIB::Server::PlaceholderAPI::getValue(from); }
std::string GetValueWithPlayer(std::string const& key, Player* player) { std::string GetValueWithPlayer(std::string const& key, Player* player) {
return GMLIB::Server::PlaceholderAPI::getValue(key, player); return PlaceholderAPI::getValue(key, (GMActor*)player).value_or("");
} }
bool registerPlayerPlaceholder( void registerPlayerPlaceholder(
std::string const& PluginName, std::string const& PluginName,
std::string const& FuncName, std::string const& FuncName,
std::string const& PAPIName std::string const& PAPIName
) { ) {
if (RemoteCall::hasFunc(PluginName, FuncName)) { if (!RemoteCall::hasFunc(PluginName, FuncName)) return;
GMLIB::Server::PlaceholderAPI::unregisterPlaceholder(PAPIName); auto func = [=]() -> void {
if (isParameters(PAPIName)) { PlaceholderAPI::unregisterPlaceholder(PAPIName);
auto Call = RemoteCall::importAs<std::string(Player * pl, std::unordered_map<std::string, std::string>)>( std::weak_ptr mod = ll::mod::ModManagerRegistry::getInstance().getMod(PluginName);
PluginName, if (mod.expired()) return;
FuncName PlaceholderAPI::registerPlaceholder(
); PAPIName,
GMLIB::Server::PlaceholderAPI::registerPlayerPlaceholder( [Call = RemoteCall::importAs<std::string(Player * pl, std::unordered_map<std::string, std::string>)>(
PAPIName, PluginName,
[Call](Player* sp, std::unordered_map<std::string, std::string> map) { return Call(sp, map); }, FuncName
PluginName )](optional_ref<GMActor> actor, std::unordered_map<std::string, std::string> const& params, auto&&...
); ) -> std::optional<std::string> {
} else { if (actor.has_value() && ((Actor*)actor.as_ptr())->isPlayer()) {
auto Call = RemoteCall::importAs<std::string(Player * pl)>(PluginName, FuncName); return Call((Player*)actor.as_ptr(), params);
GMLIB::Server::PlaceholderAPI::registerPlayerPlaceholder( }
PAPIName, return std::nullopt;
[Call](Player* sp) { return Call(sp); }, },
PluginName mod
); );
} };
return true; if (ll::mod::ModManagerRegistry::getInstance().hasMod(PluginName)) {
func();
} else {
getThreadPoolExecutor().execute(func);
} }
return false;
} }
bool registerServerPlaceholder( void registerServerPlaceholder(
std::string const& PluginName, std::string const& PluginName,
std::string const& FuncName, std::string const& FuncName,
std::string const& PAPIName std::string const& PAPIName
) { ) {
if (RemoteCall::hasFunc(PluginName, FuncName)) { if (!RemoteCall::hasFunc(PluginName, FuncName)) return;
GMLIB::Server::PlaceholderAPI::unregisterPlaceholder(PAPIName); auto func = [=]() -> void {
if (isParameters(PAPIName)) { PlaceholderAPI::unregisterPlaceholder(PAPIName);
auto Call = std::weak_ptr mod = ll::mod::ModManagerRegistry::getInstance().getMod(PluginName);
RemoteCall::importAs<std::string(std::unordered_map<std::string, std::string>)>(PluginName, FuncName); if (mod.expired()) return;
GMLIB::Server::PlaceholderAPI::registerServerPlaceholder( PlaceholderAPI::registerPlaceholder(
PAPIName, PAPIName,
[Call](std::unordered_map<std::string, std::string> map) { return Call(map); }, [Call = RemoteCall::importAs<std::string(std::unordered_map<std::string, std::string>)>(
PluginName PluginName,
); FuncName
} else { )](auto, std::unordered_map<std::string, std::string> const& params, auto&&...
auto Call = RemoteCall::importAs<std::string()>(PluginName, FuncName); ) -> std::optional<std::string> { return Call(params); },
GMLIB::Server::PlaceholderAPI::registerServerPlaceholder(PAPIName, [Call]() { return Call(); }, PluginName); mod
} );
return true; };
if (ll::mod::ModManagerRegistry::getInstance().hasMod(PluginName)) {
func();
} else {
getThreadPoolExecutor().execute(func);
} }
return false;
} }
bool registerStaticPlaceholder( void registerStaticPlaceholder(
std::string const& PluginName, std::string const& PluginName,
std::string const& FuncName, std::string const& FuncName,
std::string const& PAPIName, std::string const& PAPIName,
int num int num
) { ) {
if (RemoteCall::hasFunc(PluginName, FuncName)) { if (!RemoteCall::hasFunc(PluginName, FuncName)) return;
GMLIB::Server::PlaceholderAPI::unregisterPlaceholder(PAPIName); auto func = [=]() -> void {
if (isParameters(PAPIName)) { PlaceholderAPI::unregisterPlaceholder(PAPIName);
auto Call = RemoteCall::importAs<std::string()>(PluginName, FuncName); std::weak_ptr mod = ll::mod::ModManagerRegistry::getInstance().getMod(PluginName);
if (num == -1) { if (mod.expired()) return;
GMLIB::Server::PlaceholderAPI::registerStaticPlaceholder( PlaceholderAPI::registerPlaceholder(
PAPIName, PAPIName,
[Call] { return Call(); }, [Call = RemoteCall::importAs<std::string()>(PluginName, FuncName)](auto&&...
PluginName ) -> std::optional<std::string> { return Call(); },
); mod
} else { );
GMLIB::Server::PlaceholderAPI::registerStaticPlaceholder( };
PAPIName, if (ll::mod::ModManagerRegistry::getInstance().hasMod(PluginName)) {
num, func();
[Call] { return Call(); }, } else {
PluginName getThreadPoolExecutor().execute(func);
);
}
}
return true;
} }
return false;
} }
std::string translateStringWithPlayer(std::string const& str, Player* pl) { std::string translateStringWithPlayer(std::string const& str, Player* pl) {
return GMLIB::Server::PlaceholderAPI::translateString(str, pl); return PlaceholderAPI::translate(str, (GMActor*)pl);
} }
std::string translateString(std::string const& str) { return GMLIB::Server::PlaceholderAPI::translateString(str); } std::string translateString(std::string const& str) { return PlaceholderAPI::translate(str, std::nullopt); }
bool unRegisterPlaceholder(std::string const& str) { return GMLIB::Server::PlaceholderAPI::unregisterPlaceholder(str); } bool unRegisterPlaceholder(std::string const& str) { return PlaceholderAPI::unregisterPlaceholder(str); }
std::vector<std::string> getAllPAPI() { return GMLIB::Server::PlaceholderAPI::getAllPAPI(); } std::vector<std::string> getAllPAPI() {
std::vector<std::string> result;
for (auto& papi : PlaceholderAPI::getAllPlaceholderData()) {
result.push_back(papi.first);
}
return result;
}
} // namespace PAPIRemoteCall } // namespace PAPIRemoteCall
namespace NewPapiRemoteCall {
std::string translate(std::string const& value, std::string const& language) {
return PlaceholderAPI::translate(value, std::nullopt, language);
}
std::string translateFromActor(std::string const& value, Actor* actor, std::string const& language) {
return PlaceholderAPI::translate(value, (GMActor*)actor, language);
}
void registerPlaceholder(std::string const& placeholder, std::string const& funcName, std::string const& pluginName) {
if (!RemoteCall::hasFunc(pluginName, funcName)) return;
auto func = [=]() -> void {
if (std::weak_ptr mod = ll::mod::ModManagerRegistry::getInstance().getMod(pluginName); !mod.expired()) {
PlaceholderAPI::unregisterPlaceholder(placeholder);
PlaceholderAPI::registerPlaceholder(
placeholder,
[Call = RemoteCall::importAs<
std::string(Actor*, std::unordered_map<std::string, std::string>, std::string)>(
pluginName,
funcName
)](optional_ref<GMActor> actor,
std::unordered_map<std::string, std::string> const& params,
std::string const& language) -> std::optional<std::string> {
auto result = Call((Actor*)actor.as_ptr(), params, language);
return result == "<std::nullopt>" ? std::nullopt : std::optional(result);
},
mod
);
}
};
if (ll::mod::ModManagerRegistry::getInstance().hasMod(pluginName)) {
func();
} else {
getThreadPoolExecutor().execute(func);
}
}
bool unregisterPlaceholder(std::string const& placeholder) {
return PlaceholderAPI::unregisterPlaceholder(placeholder);
}
bool unregisterPlaceholderFromModName(std::string const& pluginName) {
std::weak_ptr plugin = ll::mod::ModManagerRegistry::getInstance().getMod(pluginName);
if (plugin.expired()) return false;
return PlaceholderAPI::unregisterPlaceholder(plugin);
}
std::string getValue(
std::string const& placeholder,
std::unordered_map<std::string, std::string> params,
std::string const& language
) {
return PlaceholderAPI::getValue(placeholder, std::nullopt, params, language).value_or("<std::nullopt>");
}
std::string getValueFromActor(
std::string const& placeholder,
Actor* actor,
std::unordered_map<std::string, std::string> params,
std::string const& language
) {
return PlaceholderAPI::getValue(placeholder, (GMActor*)actor, params, language).value_or("<std::nullopt>");
}
} // namespace NewPapiRemoteCall
#define EXPORTAPI(T) \ #define EXPORTAPI(T) \
RemoteCall::exportAs("BEPlaceholderAPI", ll::utils::string_utils::replaceAll(#T, "PAPIRemoteCall::", ""), T); RemoteCall::exportAs("BEPlaceholderAPI", ll::utils::string_utils::replaceAll(#T, "PAPIRemoteCall::", ""), T);
#define EXPORTAPI2(T) RemoteCall::exportAs("PlaceholderAPI", #T, NewPapiRemoteCall::T);
void ExportPAPI() { void ExportPAPI() {
EXPORTAPI(PAPIRemoteCall::registerPlayerPlaceholder); EXPORTAPI(PAPIRemoteCall::registerPlayerPlaceholder);
EXPORTAPI(PAPIRemoteCall::registerServerPlaceholder); EXPORTAPI(PAPIRemoteCall::registerServerPlaceholder);
@@ -128,4 +184,12 @@ void ExportPAPI() {
EXPORTAPI(PAPIRemoteCall::translateStringWithPlayer); EXPORTAPI(PAPIRemoteCall::translateStringWithPlayer);
EXPORTAPI(PAPIRemoteCall::unRegisterPlaceholder); EXPORTAPI(PAPIRemoteCall::unRegisterPlaceholder);
EXPORTAPI(PAPIRemoteCall::getAllPAPI); EXPORTAPI(PAPIRemoteCall::getAllPAPI);
EXPORTAPI2(translate);
EXPORTAPI2(translateFromActor);
EXPORTAPI2(registerPlaceholder);
EXPORTAPI2(unregisterPlaceholder);
EXPORTAPI2(unregisterPlaceholderFromModName);
EXPORTAPI2(getValue);
EXPORTAPI2(getValueFromActor);
} }
+35 -18
View File
@@ -1,29 +1,46 @@
{ {
"format_version": 2, "format_version": 3,
"format_uuid": "289f771f-2c9a-4d73-9f3f-8492495a924d",
"tooth": "github.com/GroupMountain/GMLIB-LegacyRemoteCallApi", "tooth": "github.com/GroupMountain/GMLIB-LegacyRemoteCallApi",
"version": "0.13.6", "version": "1.0.0",
"info": { "info": {
"name": "GMLIB-LegacyRemoteCallApi", "name": "GMLIB-LegacyRemoteCallApi",
"description": "Legacy RemoteCall API for GMLIB", "description": "Legacy RemoteCall API for GMLIB",
"source": "github.com/GroupMountain/GMLIB-LegacyRemoteCallApi",
"author": "GroupMountain",
"tags": [ "tags": [
"levilamina", "platform:levilamina",
"type:mod",
"gmlib", "gmlib",
"lse", "lse",
"library" "library"
] ],
"avatar_url": "https://raw.githubusercontent.com/GroupMountain/GMLIB-LegacyRemoteCallApi/refs/heads/main/icon.jpg"
}, },
"asset_url": "https://github.com/GroupMountain/GMLIB-LegacyRemoteCallApi/releases/download/v0.13.6/GMLIB-LegacyRemoteCallApi-windows-x64.zip", "variants": [
"dependencies": { {
"github.com/GroupMountain/GMLIB": ">=0.13.9" "platform": "win-x64",
}, "dependencies": {
"files": { "github.com/LiteLDev/LeviLamina": ">=1.1.1",
"place": [ "github.com/GroupMountain/GMLIB-Release": ">=1.0.0",
{ "github.com/MiracleForest/iListenAttentively-Release": ">=0.4.1"
"src": "GMLIB-LegacyRemoteCallApi/*", },
"dest": "plugins/GMLIB-LegacyRemoteCallApi" "assets": [
} {
] "type": "zip",
} "urls": [
"https://github.com/GroupMountain/GMLIB-LegacyRemoteCallApi/releases/download/v$(version)/GMLIB-LegacyRemoteCallApi-windows-x64.zip"
],
"placements": [
{
"type": "dir",
"src": "GMLIB-LegacyRemoteCallApi",
"dest": "plugins/GMLIB-LegacyRemoteCallApi/"
}
]
}
],
"remove_files": [
"plugins/GMLIB-LegacyRemoteCallApi"
]
}
]
} }
+11 -9
View File
@@ -2,27 +2,28 @@ add_rules("mode.debug", "mode.release")
add_repositories("liteldev-repo https://github.com/LiteLDev/xmake-repo.git") add_repositories("liteldev-repo https://github.com/LiteLDev/xmake-repo.git")
add_repositories("groupmountain-repo https://github.com/GroupMountain/xmake-repo.git") add_repositories("groupmountain-repo https://github.com/GroupMountain/xmake-repo.git")
add_repositories("miracleforest-repo https://github.com/MiracleForest/xmake-repo.git")
if not has_config("vs_runtime") then if not has_config("vs_runtime") then
set_runtimes("MD") set_runtimes("MD")
end end
add_requires("levilamina 1.0.0-rc.3", {configs = {target_type = "server"}}) add_requires("levilamina", {configs = {target_type = "server"}})
add_requires("legacyremotecall 0.9.0-rc.1") add_requires("legacyremotecall")
add_requires("gmlib 0.13.10") add_requires("levibuildscript")
add_requires("levibuildscript 0.3.0") add_requires("ilistenattentively")
add_requires("gmlib")
target("GMLIB-LegacyRemoteCallApi") target("GMLIB-LegacyRemoteCallApi")
add_cxflags( add_cxflags(
"/EHa", "/EHa",
"/utf-8" "/utf-8",
"/bigobj"
) )
add_defines( add_defines(
"NOMINMAX", "NOMINMAX",
"UNICODE", "UNICODE",
"_HAS_CXX17", "_HAS_CXX23=1"
"_HAS_CXX20",
"_HAS_CXX23"
) )
add_files( add_files(
"src/**.cpp" "src/**.cpp"
@@ -33,6 +34,7 @@ target("GMLIB-LegacyRemoteCallApi")
add_packages( add_packages(
"levilamina", "levilamina",
"legacyremotecall", "legacyremotecall",
"ilistenattentively",
"gmlib" "gmlib"
) )
add_rules("@levibuildscript/linkrule") add_rules("@levibuildscript/linkrule")