Compare commits

...

39 Commits

27 changed files with 1866 additions and 1375 deletions
+3 -1
View File
@@ -11,12 +11,14 @@ jobs:
uses: actions/checkout@v2 uses: actions/checkout@v2
- uses: xmake-io/github-action-setup-xmake@v1 - uses: xmake-io/github-action-setup-xmake@v1
with:
xmake-version: 3.0.0
- run: | - run: |
xmake repo -u xmake repo -u
- run: | - run: |
xmake f -a x64 -m release -p windows -v -y xmake f -a x64 -m release -p windows -y
- run: | - run: |
xmake -w -y xmake -w -y
+3 -1
View File
@@ -11,12 +11,14 @@ jobs:
uses: actions/checkout@v2 uses: actions/checkout@v2
- uses: xmake-io/github-action-setup-xmake@v1 - uses: xmake-io/github-action-setup-xmake@v1
with:
xmake-version: 3.0.0
- run: | - run: |
xmake repo -u xmake repo -u
- run: | - run: |
xmake f -a x64 -m release -p windows -v -y xmake f -a x64 -m release -p windows -y
- run: | - run: |
xmake -w -y xmake -w -y
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(
+15 -40
View File
@@ -1,47 +1,22 @@
const PlaceholderAPI = { const PlaceholderAPI = {
/** 获取一个服务器变量的值 @type {function(string):string} */ /** 获取一个服务器变量的值 @type {function(string):string} */
getValueAPI: ll.import("BEPlaceholderAPI", "GetValue"), getValueAPI: ll.imports("BEPlaceholderAPI", "GetValue"),
/** 获取一个玩家变量的值 @type {function(string,Player):string} */ /** 获取一个玩家变量的值 @type {function(string,Player):string} */
getValueByPlayerAPI: ll.import("BEPlaceholderAPI", "GetValueWithPlayer"), getValueByPlayerAPI: ll.imports("BEPlaceholderAPI", "GetValueWithPlayer"),
/** 注册一个玩家变量 @type {function(string,string,string):boolean} */ /** 注册一个玩家变量 @type {function(string,string,string):boolean} */
registerPlayerPlaceholderAPI: ll.import("BEPlaceholderAPI", "registerPlayerPlaceholder"), registerPlayerPlaceholderAPI: ll.imports("BEPlaceholderAPI", "registerPlayerPlaceholder"),
/** 注册一个服务器变量 @type {function(string,string,string):boolean} */ /** 注册一个服务器变量 @type {function(string,string,string):boolean} */
registerServerPlaceholderAPI: ll.import("BEPlaceholderAPI", "registerServerPlaceholder"), registerServerPlaceholderAPI: ll.imports("BEPlaceholderAPI", "registerServerPlaceholder"),
/** 注册一个静态变量 @type {function(string,string,string,number):boolean} */ /** 注册一个静态变量 @type {function(string,string,string,number):boolean} */
registerStaticPlaceholderAPI: ll.import("BEPlaceholderAPI", "registerStaticPlaceholder"), registerStaticPlaceholderAPI: ll.imports("BEPlaceholderAPI", "registerStaticPlaceholder"),
/** 翻译包含PAPI服务器变量的字符串 @type {function(string):string} */ /** 翻译包含PAPI服务器变量的字符串 @type {function(string):string} */
translateStringAPI: ll.import("BEPlaceholderAPI", "translateString"), translateStringAPI: ll.imports("BEPlaceholderAPI", "translateString"),
/** 翻译包含PAPI玩家变量的字符串 @type {function(string,Player):string} */ /** 翻译包含PAPI玩家变量的字符串 @type {function(string,Player):string} */
translateStringWithPlayerAPI: ll.import("BEPlaceholderAPI", "translateStringWithPlayer"), translateStringWithPlayerAPI: ll.imports("BEPlaceholderAPI", "translateStringWithPlayer"),
/** 注销PAPI变量 @type {function(string):boolean} */ /** 注销PAPI变量 @type {function(string):boolean} */
unRegisterPlaceholderAPI: ll.import("BEPlaceholderAPI", "unRegisterPlaceholder"), unRegisterPlaceholderAPI: ll.imports("BEPlaceholderAPI", "unRegisterPlaceholder"),
/** 获取所有已注册的PAPI变量 @type {function():Array.<string>} */ /** 获取所有已注册的PAPI变量 @type {function():Array.<string>} */
getAllPAPI: ll.import("BEPlaceholderAPI", "getAllPAPI") getAllPAPI: ll.imports("BEPlaceholderAPI", "getAllPAPI")
}
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;
} }
/** PAPI变量类 */ /** PAPI变量类 */
@@ -58,8 +33,8 @@ class PAPI {
* @returns {boolean} 是否注册成功 * @returns {boolean} 是否注册成功
*/ */
static registerPlayerPlaceholder(func, PluginName, PAPIName) { static registerPlayerPlaceholder(func, PluginName, PAPIName) {
ll.export(func, PluginName, func.getName()); ll.export(func, PluginName, `Placeholder_${PAPIName}`);
return PlaceholderAPI.registerPlayerPlaceholderAPI(PluginName, func.getName(), PAPIName); PlaceholderAPI.registerPlayerPlaceholderAPI(PluginName, `Placeholder_${PAPIName}`, PAPIName);
} }
/** /**
@@ -70,8 +45,8 @@ class PAPI {
* @returns {boolean} 是否注册成功 * @returns {boolean} 是否注册成功
*/ */
static registerServerPlaceholder(func, PluginName, PAPIName) { static registerServerPlaceholder(func, PluginName, PAPIName) {
ll.export(func, PluginName, func.getName()); ll.export(func, PluginName, `Placeholder_${PAPIName}`);
return PlaceholderAPI.registerServerPlaceholderAPI(PluginName, func.getName(), PAPIName); PlaceholderAPI.registerServerPlaceholderAPI(PluginName, `Placeholder_${PAPIName}`, PAPIName);
} }
/** /**
@@ -83,8 +58,8 @@ class PAPI {
* @returns {boolean} 是否注册成功 * @returns {boolean} 是否注册成功
*/ */
static registerStaticPlaceholder(func, PluginName, PAPIName, UpdateInterval = 50) { static registerStaticPlaceholder(func, PluginName, PAPIName, UpdateInterval = 50) {
ll.export(func, PluginName, func.getName()); ll.export(func, PluginName, `Placeholder_${PAPIName}`);
return PlaceholderAPI.registerStaticPlaceholderAPI(PluginName, func.getName(), PAPIName, UpdateInterval); PlaceholderAPI.registerStaticPlaceholderAPI(PluginName, `Placeholder_${PAPIName}`, PAPIName, UpdateInterval);
} }
/** /**
+50 -8
View File
@@ -1,12 +1,54 @@
/**
* @returns {string}
*/
const getPluginName = () => { const getPluginName = () => {
try { if (getPluginName.PluginNameCache) return getPluginName.PluginNameCache;
throw new Error("getPluginName");
} catch (error) { return getPluginName.PluginNameCache = (() => {
return error.stack.trim().match(/plugins\\(.*)\\.*\.js:[0-9]+\)$/i)?.[1] || "Unknown"; if (ll.getCurrentPluginInfo) return ll.getCurrentPluginInfo().name;
}
const error = new Error("getPluginName");
switch (ll.scriptEngineVersion) {
case "QuickJS": {
if (!error.stack) break;
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("\\")
);
}
break;
}
case "V8 12.4.254.21-node.21": {
try {
const selfFileName = require('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 { }
if (!error.stack) break;
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;
}
break;
}
default: break;
}
return "Unknown";
})();
}; };
module.exports = { module.exports = {
+24 -24
View File
@@ -1,4 +1,4 @@
// // const getNextCallbackId = ll.import("GMLIB_FormAPI", "getNextFormCallbackId"); // // const getNextCallbackId = ll.imports("GMLIB_FormAPI", "getNextFormCallbackId");
// class ServerSettingForm { // class ServerSettingForm {
// constructor() { // constructor() {
@@ -6,35 +6,35 @@
// } // }
// static getDefaultPriority() { // static getDefaultPriority() {
// return ll.import("GMLIB_ServerSettingForm", "getDefaultPriority")(); // return ll.imports("GMLIB_ServerSettingForm", "getDefaultPriority")();
// } // }
// static hasTitle() { // static hasTitle() {
// return ll.import("GMLIB_ServerSettingForm", "hasTitle")(); // return ll.imports("GMLIB_ServerSettingForm", "hasTitle")();
// } // }
// static getTitle() { // static getTitle() {
// return ll.import("GMLIB_ServerSettingForm", "getTitle")(); // return ll.imports("GMLIB_ServerSettingForm", "getTitle")();
// } // }
// static setTitle(title, forceModify = false) { // static setTitle(title, forceModify = false) {
// return ll.import("GMLIB_ServerSettingForm", "setTitle")(title, forceModify); // return ll.imports("GMLIB_ServerSettingForm", "setTitle")(title, forceModify);
// } // }
// static hasIcon() { // static hasIcon() {
// return ll.import("GMLIB_ServerSettingForm", "hasIcon")(); // return ll.imports("GMLIB_ServerSettingForm", "hasIcon")();
// } // }
// static getIconData() { // static getIconData() {
// return hasIcon() ? ll.import("GMLIB_ServerSettingForm", "getIconData")() : null; // return hasIcon() ? ll.imports("GMLIB_ServerSettingForm", "getIconData")() : null;
// } // }
// static getIconType() { // static getIconType() {
// return ll.import("GMLIB_ServerSettingForm", "getIconType")(); // return ll.imports("GMLIB_ServerSettingForm", "getIconType")();
// } // }
// static setIcon(data, type = 0, forceModify = false) { // static setIcon(data, type = 0, forceModify = false) {
// return ll.import("GMLIB_ServerSettingForm", "setIcon")(data, type, forceModify); // return ll.imports("GMLIB_ServerSettingForm", "setIcon")(data, type, forceModify);
// } // }
// static addLabel( // static addLabel(
@@ -44,7 +44,7 @@
// ) { // ) {
// let detectorId = getNextCallbackId(); // let detectorId = getNextCallbackId();
// ll.export(playerDetector, "GMLIB_FORM_CALLBACK", detectorId); // ll.export(playerDetector, "GMLIB_FORM_CALLBACK", detectorId);
// return ll.import("GMLIB_ServerSettingForm", "addLabel")(text, detectorId, priority); // return ll.imports("GMLIB_ServerSettingForm", "addLabel")(text, detectorId, priority);
// } // }
@@ -60,7 +60,7 @@
// ll.export(callback, "GMLIB_FORM_CALLBACK", callbackId); // ll.export(callback, "GMLIB_FORM_CALLBACK", callbackId);
// let detectorId = getNextCallbackId(); // let detectorId = getNextCallbackId();
// ll.export(playerDetector, "GMLIB_FORM_CALLBACK", detectorId); // ll.export(playerDetector, "GMLIB_FORM_CALLBACK", detectorId);
// return ll.import("GMLIB_ServerSettingForm", "addInput")(text, placeholder, defaultVal, callbackId, detectorId, priority); // return ll.imports("GMLIB_ServerSettingForm", "addInput")(text, placeholder, defaultVal, callbackId, detectorId, priority);
// } // }
// static addToggle( // static addToggle(
@@ -74,7 +74,7 @@
// ll.export(callback, "GMLIB_FORM_CALLBACK", callbackId); // ll.export(callback, "GMLIB_FORM_CALLBACK", callbackId);
// let detectorId = getNextCallbackId(); // let detectorId = getNextCallbackId();
// ll.export(playerDetector, "GMLIB_FORM_CALLBACK", detectorId); // ll.export(playerDetector, "GMLIB_FORM_CALLBACK", detectorId);
// return ll.import("GMLIB_ServerSettingForm", "addToggle")(text, defaultVal, callbackId, detectorId, priority); // return ll.imports("GMLIB_ServerSettingForm", "addToggle")(text, defaultVal, callbackId, detectorId, priority);
// } // }
// static addDropdown( // static addDropdown(
@@ -89,7 +89,7 @@
// ll.export(callback, "GMLIB_FORM_CALLBACK", callbackId); // ll.export(callback, "GMLIB_FORM_CALLBACK", callbackId);
// let detectorId = getNextCallbackId(); // let detectorId = getNextCallbackId();
// ll.export(playerDetector, "GMLIB_FORM_CALLBACK", detectorId); // ll.export(playerDetector, "GMLIB_FORM_CALLBACK", detectorId);
// return ll.import("GMLIB_ServerSettingForm", "addDropdown")(text, options, defaultVal, callbackId, detectorId, priority); // return ll.imports("GMLIB_ServerSettingForm", "addDropdown")(text, options, defaultVal, callbackId, detectorId, priority);
// } // }
// static addSlider( // static addSlider(
@@ -106,7 +106,7 @@
// ll.export(callback, "GMLIB_FORM_CALLBACK", callbackId); // ll.export(callback, "GMLIB_FORM_CALLBACK", callbackId);
// let detectorId = getNextCallbackId(); // let detectorId = getNextCallbackId();
// ll.export(playerDetector, "GMLIB_FORM_CALLBACK", detectorId); // ll.export(playerDetector, "GMLIB_FORM_CALLBACK", detectorId);
// return ll.import("GMLIB_ServerSettingForm", "addSlider")(text, min, max, step, defaultVal, callbackId, detectorId, priority); // return ll.imports("GMLIB_ServerSettingForm", "addSlider")(text, min, max, step, defaultVal, callbackId, detectorId, priority);
// } // }
// static addStepSlider( // static addStepSlider(
@@ -121,57 +121,57 @@
// ll.export(callback, "GMLIB_FORM_CALLBACK", callbackId); // ll.export(callback, "GMLIB_FORM_CALLBACK", callbackId);
// let detectorId = getNextCallbackId(); // let detectorId = getNextCallbackId();
// ll.export(playerDetector, "GMLIB_FORM_CALLBACK", detectorId); // ll.export(playerDetector, "GMLIB_FORM_CALLBACK", detectorId);
// return ll.import("GMLIB_ServerSettingForm", "addStepSlider")(text, steps, defaultVal, callbackId, detectorId, priority); // return ll.imports("GMLIB_ServerSettingForm", "addStepSlider")(text, steps, defaultVal, callbackId, detectorId, priority);
// } // }
// static removeElement(id) { // static removeElement(id) {
// return ll.import("GMLIB_ServerSettingForm", "removeElement")(id); // return ll.imports("GMLIB_ServerSettingForm", "removeElement")(id);
// } // }
// } // }
// class NpcDialogueForm { // class NpcDialogueForm {
// constructor(npcName, sceneName, dialogue) { // constructor(npcName, sceneName, dialogue) {
// this.mFormId = ll.import("GMLIB_NpcDialogueForm", "createForm")(npcName, sceneName, dialogue); // this.mFormId = ll.imports("GMLIB_NpcDialogueForm", "createForm")(npcName, sceneName, dialogue);
// } // }
// addButton(button) { // addButton(button) {
// return ll.import("GMLIB_NpcDialogueForm", "addButton")(this.mFormId, button); // return ll.imports("GMLIB_NpcDialogueForm", "addButton")(this.mFormId, button);
// } // }
// sendTo(pl, callback = (pl, index, type) => { }, free = true) { // sendTo(pl, callback = (pl, index, type) => { }, free = true) {
// let callbackId = getNextCallbackId(); // let callbackId = getNextCallbackId();
// ll.export(callback, "GMLIB_FORM_CALLBACK", callbackId); // ll.export(callback, "GMLIB_FORM_CALLBACK", callbackId);
// ll.import("GMLIB_NpcDialogueForm", "sendTo")(this.mFormId, pl, callbackId); // ll.imports("GMLIB_NpcDialogueForm", "sendTo")(this.mFormId, pl, callbackId);
// if (free) { // if (free) {
// this.destroy(); // this.destroy();
// } // }
// } // }
// destroy() { // destroy() {
// ll.import("GMLIB_NpcDialogueForm", "destroyForm")(this.mFormId); // ll.imports("GMLIB_NpcDialogueForm", "destroyForm")(this.mFormId);
// } // }
// } // }
// class ChestForm { // class ChestForm {
// constructor(npcName, sceneName, dialogue) { // constructor(npcName, sceneName, dialogue) {
// this.mFormId = ll.import("GMLIB_NpcDialogueForm", "createForm")(npcName, sceneName, dialogue); // this.mFormId = ll.imports("GMLIB_NpcDialogueForm", "createForm")(npcName, sceneName, dialogue);
// } // }
// addButton(button) { // addButton(button) {
// return ll.import("GMLIB_NpcDialogueForm", "addButton")(this.mFormId, button); // return ll.imports("GMLIB_NpcDialogueForm", "addButton")(this.mFormId, button);
// } // }
// sendTo(pl, free = true) { // sendTo(pl, free = true) {
// //let callbackId = getNextCallbackId(); // //let callbackId = getNextCallbackId();
// //ll.export(callback, "GMLIB_FORM_CALLBACK", callbackId); // //ll.export(callback, "GMLIB_FORM_CALLBACK", callbackId);
// //ll.import("GMLIB_NpcDialogueForm", "sendTo")(this.mFormId, pl, callbackId); // //ll.imports("GMLIB_NpcDialogueForm", "sendTo")(this.mFormId, pl, callbackId);
// //if (free) { // //if (free) {
// // this.destroy(); // // this.destroy();
// //} // //}
// } // }
// destroy() { // destroy() {
// //ll.import("GMLIB_NpcDialogueForm", "destroyForm")(this.mFormId); // //ll.imports("GMLIB_NpcDialogueForm", "destroyForm")(this.mFormId);
// } // }
// } // }
+196 -164
View File
@@ -183,19 +183,34 @@ export class Minecraft {
pos: IntPos pos: IntPos
): void; ): void;
/** 启用教育版内容 */ /**
* @deprecated 已删
* 启用教育版内容
*/
static setEducationFeatureEnabled(): void; static setEducationFeatureEnabled(): void;
/** 注册Ability命令 */ /**
* @deprecated 已删
* 注册Ability命令
*/
static registerAbilityCommand(): void; static registerAbilityCommand(): void;
/** 启用Xbox成就 */ /**
* @deprecated 已删
* 启用Xbox成就
*/
static setEnableAchievement(): void; static setEnableAchievement(): void;
/** 信任所有玩家皮肤 */ /**
* @deprecated 已删
* 信任所有玩家皮肤
*/
static setForceTrustSkins(): void; static setForceTrustSkins(): void;
/** 启用资源包双端共存 */ /**
* @deprecated 已删
* 启用资源包双端共存
*/
static enableCoResourcePack(): void; static enableCoResourcePack(): void;
/** 获取存档名称 */ /** 获取存档名称 */
@@ -206,13 +221,19 @@ export class Minecraft {
name: string name: string
): boolean; ): boolean;
/** 设置假种子 */ /**
* @deprecated 已删
* 设置假种子
*/
static setFakeSeed( static setFakeSeed(
/** 要设置的假种子 */ /** 要设置的假种子 */
seed: number | undefined seed: number | undefined
): void; ): void;
/** 启用错误方块清理 */ /**
* @deprecated 已删
* 启用错误方块清理
*/
static setUnknownBlockCleaner(): void; static setUnknownBlockCleaner(): void;
/** 强制生成实体 */ /** 强制生成实体 */
@@ -309,7 +330,10 @@ export class Minecraft {
/** 移除所有虚假列表玩家 */ /** 移除所有虚假列表玩家 */
static removeAllFakeLists(): boolean; static removeAllFakeLists(): boolean;
/** 启用I18n修复 */ /**
* @deprecated 已删
* 启用I18n修复
*/
static setFixI18nEnabled(): void; static setFixI18nEnabled(): void;
/** 保存NBT至文件 */ /** 保存NBT至文件 */
@@ -359,7 +383,7 @@ export class Minecraft {
): string; ): string;
/** 通过附魔ID获取附魔命名空间ID */ /** 通过附魔ID获取附魔命名空间ID */
static getMaxPlayers( static getEnchantTypeNameFromId(
/** 附魔ID */ /** 附魔ID */
id: number id: number
): string | null; ): string | null;
@@ -367,6 +391,14 @@ export class Minecraft {
/** 获取最大玩家数 */ /** 获取最大玩家数 */
static getMaxPlayers(): number; static getMaxPlayers(): number;
/** 设置最大玩家数 */
static setMaxPlayers(
/** 最大玩家数 */
count: number,
/** 是否忽略原版限制 */
ignoreVanillaLimit?: boolean
): void;
/** 玩家是否拥有NBT */ /** 玩家是否拥有NBT */
static hasPlayerNbt( static hasPlayerNbt(
/** 玩家的uuid */ /** 玩家的uuid */
@@ -1349,161 +1381,158 @@ export class GMLIB_BinaryStream {
export enum ActorType { export enum ActorType {
Undefined = 1, Undefined = 1,
TypeMask = 0b11111111, TypeMask = 255,
None = 0, Mob = 256,
Mob = 1 << 8, PathfinderMob = 768,
PathfinderMob = 1 << 9 | Mob, Monster = 2816,
UnknownType = 1 << 10, Animal = 4864,
Monster = 1 << 11 | PathfinderMob, TamableAnimal = 21248,
Animal = 1 << 12 | PathfinderMob, Ambient = 33024,
WaterAnimal = 1 << 13 | PathfinderMob, UndeadMob = 68352,
TamableAnimal = 1 << 14 | Animal, ZombieMonster = 199424,
Ambient = 1 << 15 | Mob, Arthropod = 264960,
UndeadMob = 1 << 16 | Monster, Minecart = 524288,
ZombieMonster = 1 << 17 | UndeadMob, SkeletonMonster = 1116928,
Arthropod = 1 << 18 | Monster, EquineAnimal = 2118400,
Minecart = 1 << 19, Projectile = 4194304,
SkeletonMonster = 1 << 20 | UndeadMob, AbstractArrow = 8388608,
EquineAnimal = 1 << 21 | TamableAnimal, WaterAnimal = 8960,
Projectile = 1 << 22, VillagerBase = 16777984,
AbstractArrow = 1 << 23, Chicken = 4874,
VillagerBase = 1 << 24 | PathfinderMob, Cow = 4875,
Pig = 4876,
Chicken = 10 | Animal, Sheep = 4877,
Cow = 11 | Animal, Wolf = 21262,
Pig = 12 | Animal, Villager = 16777999,
Sheep = 13 | Animal, MushroomCow = 4880,
Wolf = 14 | TamableAnimal, Squid = 8977,
Villager = 15 | VillagerBase, Rabbit = 4882,
MushroomCow = 16 | Animal, Bat = 33043,
Squid = 17 | WaterAnimal, IronGolem = 788,
Rabbit = 18 | Animal, SnowGolem = 789,
Bat = 19 | Ambient, Ocelot = 21270,
IronGolem = 20 | PathfinderMob, Horse = 2118423,
SnowGolem = 21 | PathfinderMob, PolarBear = 4892,
Ocelot = 22 | TamableAnimal, Llama = 4893,
Horse = 23 | EquineAnimal, Parrot = 21278,
Donkey = 24 | EquineAnimal, Dolphin = 8991,
Mule = 25 | EquineAnimal, Donkey = 2118424,
SkeletonHorse = 26 | EquineAnimal | UndeadMob, Mule = 2118425,
ZombieHorse = 27 | EquineAnimal | UndeadMob, SkeletonHorse = 2186010,
PolarBear = 28 | Animal, ZombieHorse = 2186011,
Llama = 29 | Animal, Zombie = 199456,
Parrot = 30 | TamableAnimal, Creeper = 2849,
Dolphin = 31 | WaterAnimal, Skeleton = 1116962,
Zombie = 32 | ZombieMonster, Spider = 264995,
Creeper = 33 | Monster, PigZombie = 68388,
Skeleton = 34 | SkeletonMonster, Slime = 2853,
Spider = 35 | Arthropod, EnderMan = 2854,
PigZombie = 36 | UndeadMob, Silverfish = 264999,
Slime = 37 | Monster, CaveSpider = 265000,
EnderMan = 38 | Monster, Ghast = 2857,
Silverfish = 39 | Arthropod, LavaSlime = 2858,
CaveSpider = 40 | Arthropod, Blaze = 2859,
Ghast = 41 | Monster, ZombieVillager = 199468,
LavaSlime = 42 | Monster, Witch = 2861,
Blaze = 43 | Monster, Stray = 1116974,
ZombieVillager = 44 | ZombieMonster, Husk = 199471,
Witch = 45 | Monster, WitherSkeleton = 1116976,
Stray = 46 | SkeletonMonster, Guardian = 2865,
Husk = 47 | ZombieMonster, ElderGuardian = 2866,
WitherSkeleton = 48 | SkeletonMonster, Npc = 307,
Guardian = 49 | Monster, WitherBoss = 68404,
ElderGuardian = 50 | Monster, Dragon = 2869,
Npc = 51 | Mob, Shulker = 2870,
WitherBoss = 52 | UndeadMob, Endermite = 265015,
Dragon = 53 | Monster, Agent = 312,
Shulker = 54 | Monster, Vindicator = 2873,
Endermite = 55 | Arthropod, Phantom = 68410,
Agent = 56 | Mob, IllagerBeast = 2875,
Vindicator = 57 | Monster, ArmorStand = 317,
Phantom = 58 | UndeadMob, TripodCamera = 318,
IllagerBeast = 59 | Monster, Player = 319,
UNUSED60 = 60, ItemEntity = 64,
ArmorStand = 61 | Mob, PrimedTnt = 65,
TripodCamera = 62 | Mob, FallingBlock = 66,
Player = 63 | Mob, MovingBlock = 67,
ItemEntity = 64 | None, ExperiencePotion = 4194372,
PrimedTnt = 65 | None, Experience = 69,
FallingBlock = 66 | None, EyeOfEnder = 70,
MovingBlock = 67 | None, EnderCrystal = 71,
ExperiencePotion = 68 | Projectile, FireworksRocket = 72,
Experience = 69 | None, Trident = 12582985,
EyeOfEnder = 70 | None, Turtle = 4938,
EnderCrystal = 71 | None, Cat = 21323,
FireworksRocket = 72 | None, ShulkerBullet = 4194380,
Trident = 73 | Projectile | AbstractArrow, FishingHook = 77,
Turtle = 74 | Animal, Chalkboard = 78,
Cat = 75 | TamableAnimal, DragonFireball = 4194383,
ShulkerBullet = 76 | Projectile, Arrow = 12582992,
FishingHook = 77 | None, Snowball = 4194385,
Chalkboard = 78 | None, ThrownEgg = 4194386,
DragonFireball = 79 | Projectile, Painting = 83,
Arrow = 80 | Projectile | AbstractArrow, LargeFireball = 4194389,
Snowball = 81 | Projectile, ThrownPotion = 4194390,
ThrownEgg = 82 | Projectile, Enderpearl = 4194391,
Painting = 83 | None, LeashKnot = 88,
MinecartRideable = 84 | Minecart, WitherSkull = 4194393,
LargeFireball = 85 | Projectile, BoatRideable = 90,
ThrownPotion = 86 | Projectile, WitherSkullDangerous = 4194395,
Enderpearl = 87 | Projectile, LightningBolt = 93,
LeashKnot = 88 | None, SmallFireball = 4194398,
WitherSkull = 89 | Projectile, AreaEffectCloud = 95,
BoatRideable = 90 | None, LingeringPotion = 4194405,
WitherSkullDangerous = 91 | Projectile, LlamaSpit = 4194406,
UNUSED92 = 92, EvocationFang = 4194407,
LightningBolt = 93 | None, EvocationIllager = 2920,
SmallFireball = 94 | Projectile, Vex = 2921,
AreaEffectCloud = 95 | None, MinecartRideable = 524372,
MinecartHopper = 96 | Minecart, MinecartHopper = 524384,
MinecartTNT = 97 | Minecart, MinecartTNT = 524385,
MinecartChest = 98 | Minecart, MinecartChest = 524386,
MinecartFurnace = 99 | Minecart, MinecartFurnace = 524387,
MinecartCommandBlock = 100 | Minecart, MinecartCommandBlock = 524388,
LingeringPotion = 101 | Projectile, IceBomb = 4194410,
LlamaSpit = 102 | Projectile, Balloon = 107,
EvocationFang = 103 | Projectile, Pufferfish = 9068,
EvocationIllager = 104 | Monster, Salmon = 9069,
Vex = 105 | Monster, Drowned = 199534,
IceBomb = 106 | Projectile, Tropicalfish = 9071,
Balloon = 107 | None, Fish = 9072,
Pufferfish = 108 | WaterAnimal, Panda = 4977,
Salmon = 109 | WaterAnimal, Pillager = 2930,
Drowned = 110 | ZombieMonster, VillagerV2 = 16778099,
Tropicalfish = 111 | WaterAnimal, ZombieVillagerV2 = 199540,
Fish = 112 | WaterAnimal, Shield = 117,
Panda = 113 | Animal, WanderingTrader = 886,
Pillager = 114 | Monster, Lectern = 119,
VillagerV2 = 115 | VillagerBase, ElderGuardianGhost = 2936,
ZombieVillagerV2 = 116 | ZombieMonster, Fox = 4985,
Shield = 117 | None, Bee = 378,
WanderingTrader = 118 | PathfinderMob, Piglin = 379,
Lectern = 119 | None, Hoglin = 4988,
ElderGuardianGhost = 120 | Monster, Strider = 4989,
Fox = 121 | Animal, Zoglin = 68478,
Bee = 122 | Mob, PiglinBrute = 383,
Piglin = 123 | Mob, Goat = 4992,
Hoglin = 124 | Animal, GlowSquid = 9089,
Strider = 125 | Animal, Axolotl = 4994,
Zoglin = 126 | UndeadMob, Warden = 2947,
PiglinBrute = 127 | Mob, Frog = 4996,
Goat = 128 | Animal, Tadpole = 9093,
GlowSquid = 129 | WaterAnimal, Allay = 390,
Axolotl = 130 | Animal, ChestBoatRideable = 218,
Warden = 131 | Monster, TraderLlama = 5021,
Frog = 132 | Animal, Camel = 5002,
Tadpole = 133 | WaterAnimal, Sniffer = 5003,
Allay = 134 | Mob, Breeze = 2956,
ChestBoatRideable = 136 | BoatRideable, BreezeWindChargeProjectile = 4194445,
TraderLlama = 137 | Llama, Armadillo = 5006,
Camel = 138 | Animal, WindChargeProjectile = 4194447,
Sniffer = 139 | Animal, Bogged = 1117072,
Breeze = 140 | Monster, OminousItemSpawner = 145,
BreezeWindChargeProjectile = 141 | Projectile, Creaking = 2962,
Armadillo = 142 | Animal, HappyGhast = 5011,
WindChargeProjectile = 143 | Projectile,
Bogged = 144 | SkeletonMonster,
OminousItemSpawner = 145
} }
interface Player { interface Player {
@@ -1556,6 +1585,9 @@ interface Player {
slot: number slot: number
): Item; ): Item;
/** (GMLIB & Glacie)获取客户端版本协议*/
getNetworkProtocolVersion(): number
/** (GMLIB)发送更新更新物品数据包 */ /** (GMLIB)发送更新更新物品数据包 */
sendInventorySlotPacket( sendInventorySlotPacket(
/** 容器ID */ /** 容器ID */
+398 -379
View File
File diff suppressed because it is too large Load Diff
+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;
+83
View File
@@ -0,0 +1,83 @@
/// <reference path='d:/dts/dts/helperlib/src/index.d.ts'/>
const getPluginName = () => {
if (getPluginName.PluginNameCache) return getPluginName.PluginNameCache;
return getPluginName.PluginNameCache = (() => {
if (ll.getCurrentPluginInfo) return ll.getCurrentPluginInfo().name;
const error = new Error("getPluginName");
switch (ll.scriptEngineVersion) {
case "QuickJS": {
if (!error.stack) break;
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("\\")
);
}
break;
}
case "V8 12.4.254.21-node.21": {
try {
const selfFileName = require('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 { }
if (!error.stack) break;
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;
}
break;
}
default: break;
}
return "Unknown";
})();
};
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, `Placeholder_${placeholder}`);
ll.imports("PlaceholderAPI", "registerPlaceholder")(placeholder, `Placeholder_${placeholder}`, 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.imports("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;
}
};
+9 -3
View File
@@ -1,7 +1,7 @@
{ {
"name": "${pluginName}", "name": "${modName}",
"entry": "${pluginFile}", "entry": "${modFile}",
"version": "0.13.6", "version": "${modVersion}",
"author": "GroupMountain", "author": "GroupMountain",
"type": "native", "type": "native",
"passive": true, "passive": true,
@@ -11,6 +11,12 @@
}, },
{ {
"name": "LegacyRemoteCall" "name": "LegacyRemoteCall"
},
{
"name": "iListenAttentively"
},
{
"name": "ModAPI"
} }
] ]
} }
-121
View File
@@ -1,121 +0,0 @@
function beautify_json(value, indent)
import("core.base.json")
local json_text = ""
local stack = {}
local function escape_str(s)
return string.gsub(s, '[%c\\"]', function(c)
local replacements = {['\b'] = '\\b', ['\f'] = '\\f', ['\n'] = '\\n', ['\r'] = '\\r', ['\t'] = '\\t', ['"'] = '\\"', ['\\'] = '\\\\'}
return replacements[c] or string.format('\\u%04x', c:byte())
end)
end
local function is_null(v)
return v == json.null
end
local function is_empty_table(t)
if type(t) ~= 'table' then return false end
for _ in pairs(t) do
return false
end
return true
end
local function is_array(t)
return type(t) == 'table' and json.is_marked_as_array(t) or #t > 0
end
local function serialize(val, level)
local spaces = string.rep(" ", level * indent)
if type(val) == "table" and not stack[val] then
if is_empty_table(val) then
json_text = json_text .. (is_array(val) and "[]" or "{}")
return
end
stack[val] = true
local isArray = is_array(val)
json_text = json_text .. (isArray and "[\n" or "{\n")
local keys = isArray and {} or {}
for k in pairs(val) do
table.insert(keys, k)
end
if not isArray then
table.sort(keys)
end
for _, k in ipairs(keys) do
local v = val[k]
json_text = json_text .. spaces .. (isArray and "" or '"' .. escape_str(tostring(k)) .. '": ')
serialize(v, level + 1)
json_text = json_text .. ",\n"
end
json_text = string.sub(json_text, 1, -3) .. "\n" .. string.rep(" ", (level - 1) * indent) .. (isArray and "]" or "}")
stack[val] = nil
elseif type(val) == "string" then
json_text = json_text .. '"' .. escape_str(val) .. '"'
elseif type(val) == "number" then
if val % 1 == 0 then
json_text = json_text .. tostring(math.floor(val))
else
json_text = json_text .. tostring(val)
end
elseif type(val) == "boolean" then
json_text = json_text .. tostring(val)
elseif is_null(val) then
json_text = json_text .. "null"
else
error("Invalid value type: " .. type(val))
end
end
serialize(value, 1)
return json_text
end
function string_formatter(str, variables)
return str:gsub("%${(.-)}", function(var)
return variables[var] or "${" .. var .. "}"
end)
end
function pack_plugin(target,plugin_define)
import("lib.detect.find_file")
local manifest_path = find_file("manifest.json", os.projectdir())
if manifest_path then
local manifest = io.readfile(manifest_path)
local bindir = path.join(os.projectdir(), "bin/DLL")
local pdbdir = path.join(os.projectdir(), "bin/PDB")
local outputdir = path.join(bindir, plugin_define.pluginName)
local targetfile = path.join(outputdir, plugin_define.pluginFile)
local pdbfile = path.join(pdbdir, path.basename(plugin_define.pluginFile) .. ".pdb")
local libfile = path.join(os.projectdir(), "lib")
local manifestfile = path.join(outputdir, "manifest.json")
local oritargetfile = target:targetfile()
local oripdbfile = path.join(path.directory(oritargetfile), path.basename(oritargetfile) .. ".pdb")
os.mkdir(outputdir)
os.cp(oritargetfile, targetfile)
if os.isfile(oripdbfile) then
os.cp(oripdbfile, pdbfile)
end
os.cp(libfile, outputdir)
formattedmanifest = string_formatter(manifest, plugin_define)
io.writefile(manifestfile,formattedmanifest)
cprint("${bright green}[Plugin Packer]: ${reset}plugin already generated to " .. outputdir)
else
cprint("${bright yellow}warn: ${reset}not found manifest.json in root dir!")
end
end
return {
pack_plugin = pack_plugin,
beautify_json = beautify_json,
string_formatter = string_formatter
}
+16 -11
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,19 +59,26 @@ 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));
EXPORTAPI("writeUnsignedChar", uchar, bs->writeUnsignedChar(value));
EXPORTAPI2(writeBool); EXPORTAPI2(writeBool);
EXPORTAPI2(writeByte); EXPORTAPI2(writeByte);
EXPORTAPI2(writeDouble); EXPORTAPI2(writeDouble);
@@ -81,7 +87,6 @@ void Export_BinaryStream_API() {
EXPORTAPI2(writeSignedInt); EXPORTAPI2(writeSignedInt);
EXPORTAPI2(writeSignedInt64); EXPORTAPI2(writeSignedInt64);
EXPORTAPI2(writeSignedShort); EXPORTAPI2(writeSignedShort);
EXPORTAPI2(writeUnsignedChar);
EXPORTAPI2(writeUnsignedInt); EXPORTAPI2(writeUnsignedInt);
EXPORTAPI2(writeUnsignedInt64); EXPORTAPI2(writeUnsignedInt64);
EXPORTAPI2(writeUnsignedShort); EXPORTAPI2(writeUnsignedShort);
+359 -255
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
+99 -136
View File
@@ -83,208 +83,177 @@ 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(ila::mc::PlayerStartSleepBeforeEvent,
GMLIB::Event::PlayerEvent::PlayerStartSleepBeforeEvent, (Player * entity, BlockPos pos, bool isCancelled),
(Player * entity, BlockPos pos, bool isCancelled), (&event.self(), event.pos(), event.isCancelled()),
(&event.self(), event.getPosition(), 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::MobTakeBlockBeforeEvent,
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); , if (!event.self().isType(ActorType::EnderMan)) return;);
);
} }
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"): {
REGISTER_EVENT_LISTEN(
GMLIB::Event::EntityEvent::SpawnWanderingTraderAfterEvent,
(std::pair<BlockPos, int> pos),
({event.getPos(), event.getRegion().getDimensionId()}),
);
} }
case doHash("gmlib::HandleRequestActionBeforeEvent"): { case doHash("gmlib::HandleRequestActionBeforeEvent"): {
// clang-format off // clang-format off
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::PlayerEvent::HandleRequestActionBeforeEvent, ila::mc::PlayerRequestItemActionBeforeEvent,
( (
Player * player, Player * player,
std::string const& actionType, std::string const& actionType,
@@ -297,55 +266,49 @@ void Export_Event_API() {
), ),
( (
(Player*)&event.self(), (Player*)&event.self(),
magic_enum::enum_name(requestAction.mActionType).data(), magic_enum::enum_name(event.actionType()).data(),
(int)requestAction.mAmount, event.amount(),
magic_enum::enum_name(requestAction.mSrc->mFullContainerName.mName).data(), magic_enum::enum_name(event.src().mFullContainerName.mName).data(),
(int)requestAction.mSrc->mSlot, (int)event.src().mSlot,
magic_enum::enum_name(requestAction.mDst->mFullContainerName.mName).data(), magic_enum::enum_name(event.dst().mFullContainerName.mName).data(),
(int)requestAction.mDst->mSlot, (int)event.dst().mSlot,
event.isCancelled() event.isCancelled()
), ),
event.setCancelled(result);, event.setCancelled(result);,
auto& requestAction = (ItemStackRequestActionTransferBase&)event.getRequestAction();
); );
// clang-format on // clang-format on
} }
case doHash("gmlib::HandleRequestActionAfterEvent"): { case doHash("gmlib::HandleRequestActionAfterEvent"): {
// clang-format off // clang-format off
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::PlayerEvent::HandleRequestActionAfterEvent, ila::mc::PlayerRequestItemActionAfterEvent,
( (
Player * player, Player * player,
std::string const& actionType, std::string const& actionType,
int count, int count,
std::string const& sourceContainerNetId, std::string const& sourceContainerNetId,
int sourceSlot, int sourceSlot,
std::string const& destinationContainerNetId, std::string const& destinationContainerNetId,
int destinationSlot int destinationSlot
), ),
( (
(Player*)&event.self(), (Player*)&event.self(),
magic_enum::enum_name(requestAction.mActionType).data(), magic_enum::enum_name(event.actionType()).data(),
(int)requestAction.mAmount, event.amount(),
magic_enum::enum_name(requestAction.mSrc->mFullContainerName.mName).data(), magic_enum::enum_name(event.src().mFullContainerName.mName).data(),
(int)requestAction.mSrc->mSlot, (int)event.src().mSlot,
magic_enum::enum_name(requestAction.mDst->mFullContainerName.mName).data(), magic_enum::enum_name(event.dst().mFullContainerName.mName).data(),
(int)requestAction.mDst->mSlot (int)event.dst().mSlot
), ),
, ,
auto& requestAction = (ItemStackRequestActionTransferBase&)event.getRequestAction(); );
);
// clang-format on // clang-format on
} }
case doHash("gmlib::ContainerClosePacketSendAfterEvent"): { case doHash("gmlib::ContainerClosePacketSendAfterEvent"): {
REGISTER_EVENT_LISTEN( REGISTER_EVENT_LISTEN(
GMLIB::Event::PacketEvent::ContainerClosePacketSendAfterEvent, ila::mc::PlayerCloseContainerAfterEvent,
(Player * player, int containerId, bool serverInitiatedClose, bool), (Player * player, int containerId, bool serverInitiatedClose, bool),
(event.getServerNetworkHandler() (&event.self(), (int)event.containerId(), event.serverInitiatedClose(), false),
._getServerPlayer(event.getNetworkIdentifier(), event.getPacket().mClientSubId),
(int)event.getPacket().mContainerId,
event.getPacket().mServerInitiatedClose,
false),
, ,
); );
} }
+39 -13
View File
@@ -1,20 +1,46 @@
#pragma once #pragma once
#include <include_all.h> // clang-format off
#pragma warning(push)
#pragma warning(disable : 4996)
#pragma include_alias("mc/world/item/HumanoidArmorItem.h", "modapi/item/types/mc/HumanoidArmorItem.h")
#pragma include_alias("mc/world/level/block/states/BuiltInBlockStateVariant.h", "mc/BuiltInBlockStateVariant.h")
#pragma include_alias("mc/world/events/EventCoordinatorPimpl.h", "mc/EventCoordinatorPimpl.h")
#pragma include_alias("mc/world/events/PlayerNotificationEvent.h", "mc/PlayerNotificationEvent.h")
#include <gmlib/include_ll.h>
#include <gmlib/include_lib.h>
#include <gmlib/include_mc.h>
#include <ila/include_all.h>
#include <modapi/addons/AddonsLoader.h>
#include <modapi/recipe/CustomRecipeRegistry.h>
#include <modapi/item/CustomItemRegistry.h>
#include <RemoteCallAPI.h> #include <RemoteCallAPI.h>
using namespace gmlib;
using namespace gmlib::ui;
using namespace gmlib::i18n;
using namespace gmlib::memory;
using namespace modapi;
#pragma warning(pop)
// 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 6
#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();
+62 -75
View File
@@ -1,10 +1,10 @@
#include "Global.h" #include "Global.h"
std::unordered_set<std::string> HardCodedKeys = {"AlwaysUnlocked", "PlayerHasManyItems", "PlayerInWater", "None"}; ICustomRecipe::UnlockingRequirement makeRecipeUnlockingKey(std::string const& key) {
if (auto context = magic_enum::enum_cast<RecipeUnlockingContext>(key)) {
std::variant<std::string, std::vector<RecipeIngredient>> makeRecipeUnlockingKey(std::string const& key) { return ICustomRecipe::UnlockingRequirement(*context);
if (HardCodedKeys.count(key)) return key; }
return std::vector<RecipeIngredient>({RecipeIngredient(key, 0, 1)}); return ICustomRecipe::UnlockingRequirement({ICustomRecipe::Ingredient(key)});
} }
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,16 +35,17 @@ 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(1, index++), ICustomRecipe::Ingredient{ing});
} }
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)
); );
} }
@@ -60,13 +57,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 +67,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 +80,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 +96,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 +113,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 +131,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 {});
} }
+34 -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,23 @@ 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::erase(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);
}); });
RemoteCall::exportAs("GMLib_ServerAPI", "setMaxPlayers", [&](int count, bool ignoreVanillaLimit) {
if (auto level = GMLevel::getInstance(); level) {
level->setMaxPlayerCount(count, ignoreVanillaLimit);
}
});
} }
+174 -78
View File
@@ -2,122 +2,210 @@
#include <regex> #include <regex>
namespace PAPIRemoteCall { namespace PAPIRemoteCall {
std::string GetValue(std::string const& from) {
std::string removeBrackets(std::string a1) { return PlaceholderAPI::getInstance().getValue(from, std::nullopt).value_or("");
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::getInstance().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::getInstance().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::getInstance().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<Actor> actor, ll::SmallStringMap<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); std::unordered_map<std::string, std::string> paramMap;
GMLIB::Server::PlaceholderAPI::registerPlayerPlaceholder( for (auto& [key, val] : params) {
PAPIName, paramMap[key] = val;
[Call](Player* sp) { return Call(sp); }, }
PluginName return Call((Player*)actor.as_ptr(), paramMap);
); }
} return std::nullopt;
return true; },
false,
mod
);
};
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::getInstance().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::getInstance().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, ll::SmallStringMap<std::string> const& params, auto&&...) -> std::optional<std::string> {
auto Call = RemoteCall::importAs<std::string()>(PluginName, FuncName); std::unordered_map<std::string, std::string> paramMap;
GMLIB::Server::PlaceholderAPI::registerServerPlaceholder(PAPIName, [Call]() { return Call(); }, PluginName); for (auto& [key, val] : params) {
} paramMap[key] = val;
return true; }
return Call(paramMap);
},
false,
mod
);
};
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::getInstance().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::getInstance().registerPlaceholder(
PAPIName, PAPIName,
[Call] { return Call(); }, [Call = RemoteCall::importAs<std::string()>(PluginName, FuncName)](auto&&...
PluginName ) -> std::optional<std::string> { return Call(); },
); false,
} else { mod
GMLIB::Server::PlaceholderAPI::registerStaticPlaceholder( );
PAPIName, };
num, if (ll::mod::ModManagerRegistry::getInstance().hasMod(PluginName)) {
[Call] { return Call(); }, func();
PluginName } else {
); 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::getInstance().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::getInstance().translate(str, std::nullopt);
}
bool unRegisterPlaceholder(std::string const& str) { return GMLIB::Server::PlaceholderAPI::unregisterPlaceholder(str); } bool unRegisterPlaceholder(std::string const& str) { return PlaceholderAPI::getInstance().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::getInstance().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::getInstance().translate(value, std::nullopt, language);
}
std::string translateFromActor(std::string const& value, Actor* actor, std::string const& language) {
return PlaceholderAPI::getInstance().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::getInstance().unregisterPlaceholder(placeholder);
PlaceholderAPI::getInstance().registerPlaceholder(
placeholder,
[Call = RemoteCall::importAs<
std::string(Actor*, std::unordered_map<std::string, std::string>, std::string)>(
pluginName,
funcName
)](optional_ref<Actor> actor, ll::SmallStringMap<std::string> const& params, std::string const& language
) -> std::optional<std::string> {
std::unordered_map<std::string, std::string> paramMap;
for (auto& [key, val] : params) {
paramMap[key] = val;
}
auto result = Call((Actor*)actor.as_ptr(), paramMap, language);
return result == "<std::nullopt>" ? std::nullopt : std::optional(result);
},
false,
mod
);
}
};
if (ll::mod::ModManagerRegistry::getInstance().hasMod(pluginName)) {
func();
} else {
getThreadPoolExecutor().execute(func);
}
}
bool unregisterPlaceholder(std::string const& placeholder) {
return PlaceholderAPI::getInstance().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::getInstance().unregisterPlaceholder(plugin);
}
std::string getValue(
std::string const& placeholder,
std::unordered_map<std::string, std::string> params,
std::string const& language
) {
ll::SmallStringMap<std::string> paramMap;
for (auto& [key, val] : params) {
paramMap[key] = val;
}
return PlaceholderAPI::getInstance()
.getValue(placeholder, std::nullopt, paramMap, 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
) {
ll::SmallStringMap<std::string> paramMap;
for (auto& [key, val] : params) {
paramMap[key] = val;
}
return PlaceholderAPI::getInstance()
.getValue(placeholder, (GMActor*)actor, paramMap, 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 +216,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);
} }
+14
View File
@@ -0,0 +1,14 @@
#pragma once
#include "mc/_HeaderOutputPredefine.h"
#include "mc/world/level/block/states/BlockStateVariant.h"
template <typename T0>
class BuiltInBlockStateVariant : public ::BlockStateVariant<T0> {
public:
// virtual functions
// NOLINTBEGIN
// vIndex: 0
virtual ~BuiltInBlockStateVariant() /*override*/ = default;
// NOLINTEND
};
+31
View File
@@ -0,0 +1,31 @@
#pragma once
#include "mc/_HeaderOutputPredefine.h"
#include "mc/deps/core/utility/EnableNonOwnerReferences.h"
#include "mc/world/events/EventResult.h"
template <class T0>
class EventCoordinatorPimpl : Bedrock::EnableNonOwnerReferences {
public:
using EventFuncPtr = std::function<EventResult(T0&)>;
std::vector<T0*> mListeners;
std::vector<EventFuncPtr> mEventsToProcess;
std::vector<T0*> mPendingRegistrations;
bool mHasPendingRegistrations;
std::thread::id mThreadId;
bool mThreadIdInitialized;
uint mThreadCheckIndex;
// // ServerInstanceEventListener
// virtual ~EventCoordinatorPimpl();
// // ServerInstanceEventListener
// MCAPI bool registerListener(gsl::not_null<T0*>);
// // ScriptingEventListener
// MCAPI void processEvent(EventFuncPtr);
// // ActorEventListener
// MCAPI void unregisterListener(gsl::not_null<T0*>);
};
+139
View File
@@ -0,0 +1,139 @@
#pragma once
#include "mc/_HeaderOutputPredefine.h"
#include "mc/world/events/PlayerAddEvent.h"
#include "mc/world/events/PlayerAddExpEvent.h"
#include "mc/world/events/PlayerAddLevelEvent.h"
#include "mc/world/events/PlayerArmorExchangeEvent.h"
#include "mc/world/events/PlayerDamageEvent.h"
#include "mc/world/events/PlayerDestroyBlockEvent.h"
#include "mc/world/events/PlayerDimensionChangeAfterEvent.h"
#include "mc/world/events/PlayerDimensionChangeBeforeEvent.h"
#include "mc/world/events/PlayerDisconnectEvent.h"
#include "mc/world/events/PlayerDropItemEvent.h"
#include "mc/world/events/PlayerEatFoodEvent.h"
#include "mc/world/events/PlayerEmoteEvent.h"
#include "mc/world/events/PlayerFormCloseEvent.h"
#include "mc/world/events/PlayerFormResponseEvent.h"
#include "mc/world/events/PlayerGameModeChangeEvent.h"
#include "mc/world/events/PlayerGetExperienceOrbEvent.h"
#include "mc/world/events/PlayerInitialSpawnEvent.h"
#include "mc/world/events/PlayerInputModeChangeEvent.h"
#include "mc/world/events/PlayerInputPermissionCategoryChangeEvent.h"
#include "mc/world/events/PlayerInteractEvent.h"
#include "mc/world/events/PlayerInteractWithBlockAfterEvent.h"
#include "mc/world/events/PlayerInteractWithBlockBeforeEvent.h"
#include "mc/world/events/PlayerInteractWithEntityAfterEvent.h"
#include "mc/world/events/PlayerInteractWithEntityBeforeEvent.h"
#include "mc/world/events/PlayerOpenContainerEvent.h"
#include "mc/world/events/PlayerRespawnEvent.h"
#include "mc/world/events/PlayerSayCommandEvent.h"
#include "mc/world/events/PlayerScriptInputEvent.h"
#include "mc/world/events/PlayerSelectedItemChangedEvent.h"
#include "mc/world/events/PlayerShootArrowEvent.h"
#include "mc/world/events/PlayerSkinLoadedClientEvent.h"
#include "mc/world/events/PlayerSleepStateChangeEvent.h"
#include "mc/world/events/PlayerStopLoadingEvent.h"
#include "mc/world/events/PlayerSwingStartEvent.h"
#include "mc/world/events/PlayerUpdateInteractionEvent.h"
#include "mc/world/events/PlayerUseNameTagEvent.h"
// auto generated inclusion list
#include "mc/world/events/EventVariantImpl.h"
// auto generated forward declare list
// clang-format off
struct PlayerAddEvent;
struct PlayerAddExpEvent;
struct PlayerAddLevelEvent;
struct PlayerArmorExchangeEvent;
struct PlayerCloseContainerEvent;
struct PlayerDamageEvent;
struct PlayerDestroyBlockEvent;
struct PlayerDimensionChangeAfterEvent;
struct PlayerDimensionChangeBeforeEvent;
struct PlayerDisconnectEvent;
struct PlayerDropItemEvent;
struct PlayerEatFoodEvent;
struct PlayerEmoteEvent;
struct PlayerFormCloseEvent;
struct PlayerFormResponseEvent;
struct PlayerGameModeChangeEvent;
struct PlayerGetExperienceOrbEvent;
struct PlayerHotbarSelectedSlotChangeEvent;
struct PlayerInitialSpawnEvent;
struct PlayerInputModeChangeEvent;
struct PlayerInputPermissionCategoryChangeEvent;
struct PlayerInteractEvent;
struct PlayerInteractWithBlockAfterEvent;
struct PlayerInteractWithBlockBeforeEvent;
struct PlayerInteractWithEntityAfterEvent;
struct PlayerInteractWithEntityBeforeEvent;
struct PlayerInventoryItemChangeEvent;
struct PlayerOpenContainerEvent;
struct PlayerRespawnEvent;
struct PlayerSayCommandEvent;
struct PlayerScriptInputEvent;
struct PlayerSelectedItemChangedEvent;
struct PlayerShootArrowEvent;
struct PlayerSkinLoadedClientEvent;
struct PlayerSleepStateChangeEvent;
struct PlayerStopLoadingEvent;
struct PlayerSwingStartEvent;
struct PlayerUpdateInteractionEvent;
struct PlayerUseNameTagEvent;
// clang-format on
struct PlayerNotificationEvent : public ::EventVariantImpl<
::PlayerSkinLoadedClientEvent const,
::PlayerAddEvent const,
::PlayerAddExpEvent const,
::PlayerAddLevelEvent const,
::PlayerArmorExchangeEvent const,
::PlayerDestroyBlockEvent const,
::PlayerUseNameTagEvent const,
::PlayerDropItemEvent const,
::PlayerEatFoodEvent const,
::PlayerDamageEvent const,
::PlayerDisconnectEvent const,
::PlayerFormCloseEvent const,
::PlayerFormResponseEvent const,
::PlayerInputModeChangeEvent const,
::PlayerInitialSpawnEvent const,
::PlayerOpenContainerEvent const,
::PlayerCloseContainerEvent const,
::PlayerShootArrowEvent const,
::PlayerSwingStartEvent const,
::PlayerRespawnEvent const,
::PlayerSleepStateChangeEvent const,
::PlayerStopLoadingEvent const,
::PlayerUpdateInteractionEvent const,
::PlayerSelectedItemChangedEvent const,
::PlayerDimensionChangeBeforeEvent const,
::PlayerDimensionChangeAfterEvent const,
::PlayerInteractWithEntityAfterEvent const,
::PlayerInteractWithBlockAfterEvent const,
::PlayerEmoteEvent const,
::PlayerScriptInputEvent const,
::PlayerInventoryItemChangeEvent const,
::PlayerHotbarSelectedSlotChangeEvent const,
::PlayerInputPermissionCategoryChangeEvent const,
::PlayerSayCommandEvent const,
::PlayerGetExperienceOrbEvent const,
::PlayerInteractEvent const,
::PlayerInteractWithEntityBeforeEvent const,
::PlayerInteractWithBlockBeforeEvent const,
::PlayerGameModeChangeEvent const> {
public:
// member functions
// NOLINTBEGIN
MCAPI ~PlayerNotificationEvent();
// NOLINTEND
public:
// destructor thunk
// NOLINTBEGIN
MCAPI void $dtor();
// NOLINTEND
};
+36 -18
View File
@@ -1,29 +1,47 @@
{ {
"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.7.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.7.0",
"place": [ "github.com/GroupMountain/GMLIB-Release": ">=1.7.0",
{ "github.com/GroupMountain/ModAPI-Release": ">=0.3.0",
"src": "GMLIB-LegacyRemoteCallApi/*", "github.com/MiracleForest/iListenAttentively-Release": ">=0.10.0"
"dest": "plugins/GMLIB-LegacyRemoteCallApi" },
} "assets": [
] {
} "type": "zip",
"urls": [
"https://{{tooth}}/releases/download/v{{version}}/GMLIB-LegacyRemoteCallApi-windows-x64.zip"
],
"placements": [
{
"type": "dir",
"src": "GMLIB-LegacyRemoteCallApi",
"dest": "plugins/GMLIB-LegacyRemoteCallApi/"
}
]
}
],
"remove_files": [
"plugins/GMLIB-LegacyRemoteCallApi"
]
}
]
} }
+21 -17
View File
@@ -2,24 +2,29 @@ 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", {configs = {target_type = "server"}}) add_requires("levilamina 1.7.1", {configs = {target_type = "server"}})
add_requires("legacyremotecall") add_requires("legacyremotecall")
add_requires("gmlib") add_requires("levibuildscript 0.5.2")
add_requires("levibuildscript") add_requires("ilistenattentively 0.10.0")
add_requires("gmlib 1.7.00")
add_requires("modapi 0.3.0")
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_CXX23=1"
) )
add_files( add_files(
"src/**.cpp" "src/**.cpp"
@@ -30,21 +35,20 @@ target("GMLIB-LegacyRemoteCallApi")
add_packages( add_packages(
"levilamina", "levilamina",
"legacyremotecall", "legacyremotecall",
"gmlib" "ilistenattentively",
"gmlib",
"modapi"
) )
add_rules("@levibuildscript/linkrule") add_rules("@levibuildscript/linkrule")
add_rules("@levibuildscript/modpacker")
set_exceptions("none") set_exceptions("none")
set_kind("shared") set_kind("shared")
set_languages("c++23") set_languages("cxx20")
set_symbols("debug") set_symbols("debug")
after_build(function (target) after_build(function (target)
local plugin_packer = import("scripts.after_build") local target_path = path.join("bin", target:name(), "lib")
if os.exists(target_path) then
local plugin_define = { os.rm(target_path)
pluginName = target:name(), end
pluginFile = path.filename(target:targetfile()), os.cp("lib", target_path)
} end)
plugin_packer.pack_plugin(target,plugin_define)
end)