删除和修改
删除新增的handleRequestTryAction事件和handleRequestAction事件 有关附魔接口均改采用命名空间 新增id转命名空间接口 修正获取最大玩家数代码
This commit is contained in:
Vendored
-34
@@ -191,38 +191,4 @@ declare class Event {
|
||||
entity: Entity
|
||||
) => void
|
||||
): boolean;
|
||||
|
||||
/** 尝试物品物品请求 */
|
||||
static listen(
|
||||
/** 事件名 */
|
||||
event: "handleRequestTryAction",
|
||||
/** 回调函数 */
|
||||
listener: (
|
||||
/** 请求的玩家对象 */
|
||||
Player: Player,
|
||||
/** 请求的操作 */
|
||||
actionType: number,
|
||||
/** 请求的槽位 */
|
||||
slot: number,
|
||||
/** 容器的ID */
|
||||
containerNetId: number
|
||||
) => boolean | void
|
||||
): boolean;
|
||||
|
||||
/** 处理物品请求后(不可拦截) */
|
||||
static listen(
|
||||
/** 事件名 */
|
||||
event: "handleRequestAction",
|
||||
/** 回调函数 */
|
||||
listener: (
|
||||
/** 请求的玩家对象 */
|
||||
Player: Player,
|
||||
/** 请求的操作 */
|
||||
actionType: number,
|
||||
/** 请求的槽位 */
|
||||
slot: number,
|
||||
/** 容器的ID */
|
||||
containerNetId: number
|
||||
) => void
|
||||
): boolean;
|
||||
}
|
||||
|
||||
Vendored
+15
-9
@@ -352,12 +352,18 @@ declare class Minecraft {
|
||||
|
||||
/** 获取附魔名字和等级 */
|
||||
static getEnchantNameAndLevel(
|
||||
/** 附魔ID */
|
||||
id: number,
|
||||
/** 附魔命名空间 */
|
||||
typeName: string,
|
||||
/** 附魔的等级 */
|
||||
level: number
|
||||
): string;
|
||||
|
||||
/** 通过附魔ID获取附魔命名空间 */
|
||||
static getMaxPlayers(
|
||||
/** 附魔ID */
|
||||
id: number
|
||||
): string | null;
|
||||
|
||||
/** 获取最大玩家数 */
|
||||
static getMaxPlayers(): number;
|
||||
}
|
||||
@@ -1130,12 +1136,12 @@ interface Item {
|
||||
): boolean;
|
||||
|
||||
/** 获取物品可以拥有的附魔 */
|
||||
getLegalEnchants(): number[]
|
||||
getLegalEnchants(): string[]
|
||||
|
||||
/** 添加附魔 */
|
||||
applyEnchant(
|
||||
/** 附魔ID */
|
||||
id: number,
|
||||
/** 附魔的命名空间 */
|
||||
typeName: string,
|
||||
/** 附魔等级 */
|
||||
level: number,
|
||||
/** 允许非原版附魔 */
|
||||
@@ -1147,13 +1153,13 @@ interface Item {
|
||||
|
||||
/** 判断是否拥有附魔 */
|
||||
hasEnchant(
|
||||
/** 附魔ID */
|
||||
id: number
|
||||
/** 附魔的命名空间 */
|
||||
typeName: string
|
||||
): boolean;
|
||||
|
||||
/** 获取附魔等级 */
|
||||
getEnchantLevel(
|
||||
/** 附魔ID */
|
||||
id: number
|
||||
/** 附魔的命名空间 */
|
||||
typeName: string
|
||||
): number;
|
||||
}
|
||||
+33
-21
@@ -264,22 +264,24 @@ const GMLIB_API = {
|
||||
getBlockLightEmission: ll.import("GMLIB_API", "getBlockLightEmission"),
|
||||
/** 获取游戏规则列表 @type {function():Array.<{Name:string,Value:string,Type:"Bool"|"Float"|"Int"}>} */
|
||||
getGameRules: ll.import("GMLIB_API", "getGameRules"),
|
||||
/** 获取物品可以拥有的附魔 @type {function(Item):Array.<number>} */
|
||||
/** 获取物品可以拥有的附魔 @type {function(Item):Array.<string>} */
|
||||
getLegalEnchants: ll.import("GMLIB_API", "getLegalEnchants"),
|
||||
/** 给物品添加附魔 @type {function(Item,number,number,boolean):boolean} */
|
||||
/** 给物品添加附魔 @type {function(Item,string,number,boolean):boolean} */
|
||||
applyEnchant: ll.import("GMLIB_API", "applyEnchant"),
|
||||
/** 删除物品所有附魔 @type {function(Item):void} */
|
||||
removeEnchants: ll.import("GMLIB_API", "removeEnchants"),
|
||||
/** 判断物品是否拥有附魔 @type {function(Item,number):boolean} */
|
||||
/** 判断物品是否拥有附魔 @type {function(Item,string):boolean} */
|
||||
hasEnchant: ll.import("GMLIB_API", "hasEnchant"),
|
||||
/** 获取附魔等级 @type {function(Item,number):number} */
|
||||
/** 获取附魔等级 @type {function(Item,string):number} */
|
||||
getEnchantLevel: ll.import("GMLIB_API", "getEnchantLevel"),
|
||||
/** 获取附魔名字 @type {function(number,number):number} */
|
||||
/** 获取附魔名字 @type {function(string,number):number} */
|
||||
getEnchantNameAndLevel: ll.import("GMLIB_API", "getEnchantNameAndLevel"),
|
||||
/** 通过ID获取附魔命名空间 @type {function(number):string} */
|
||||
getEnchantTypeNameFromId: ll.import("GMLIB_API", "getEnchantTypeNameFromId"),
|
||||
/** 获取最大玩家数 @type {function():number} */
|
||||
getMaxPlayers:ll.import("GMLIB_ServerAPI","getMaxPlayers"),
|
||||
getMaxPlayers: ll.import("GMLib_ServerAPI", "getMaxPlayers"),
|
||||
/** 丢出玩家背包内物品 @type {function(Player,Item,boolean):boolean} */
|
||||
dropPlayerItem:ll.import("GMLIB_API","dropPlayerItem")
|
||||
dropPlayerItem: ll.import("GMLIB_API", "dropPlayerItem")
|
||||
}
|
||||
|
||||
/** 静态悬浮字类列表 @type {Map<number,StaticFloatingText>} */
|
||||
@@ -935,19 +937,29 @@ class Minecraft {
|
||||
|
||||
/**
|
||||
* 获取附魔名字和等级
|
||||
* @param {number} id 附魔ID
|
||||
* @param {string} typeName 附魔的命名空间
|
||||
* @param {number} level 附魔等级
|
||||
* @returns {string} 文本
|
||||
*/
|
||||
static getEnchantNameAndLevel(id, level) {
|
||||
return GMLIB_API.getEnchantNameAndLevel(id, level);
|
||||
static getEnchantNameAndLevel(typeName, level) {
|
||||
return GMLIB_API.getEnchantNameAndLevel(typeName, level);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过附魔ID获取附魔命名空间
|
||||
* @param {number} id 附魔ID
|
||||
* @returns {string?} 附魔的命名空间
|
||||
*/
|
||||
static getEnchantTypeNameFromId(id) {
|
||||
const result = GMLIB_API.getEnchantTypeNameFromId(id);
|
||||
return result === "" ? null : result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取最大玩家数量
|
||||
* @returns {number} 最大玩家数量
|
||||
*/
|
||||
static getMaxPlayers(){
|
||||
static getMaxPlayers() {
|
||||
return GMLIB_API.getMaxPlayers();
|
||||
}
|
||||
}
|
||||
@@ -2111,7 +2123,7 @@ LLSE_Player.prototype.pullInEntity =
|
||||
LLSE_Item.prototype.getLegalEnchants =
|
||||
/**
|
||||
* 获取物品可以拥有的合法附魔
|
||||
* @returns {Array.<number>} 附魔ID列表
|
||||
* @returns {Array.<string>} 附魔ID列表
|
||||
*/
|
||||
function () {
|
||||
return GMLIB_API.getLegalEnchants(this);
|
||||
@@ -2120,13 +2132,13 @@ LLSE_Item.prototype.getLegalEnchants =
|
||||
LLSE_Item.prototype.applyEnchant =
|
||||
/**
|
||||
* 添加附魔
|
||||
* @param {number} id 附魔ID
|
||||
* @param {string} typeName 附魔的命名空间
|
||||
* @param {number} level 等级
|
||||
* @param {boolean} allowNonVanilla 允许非原版附魔
|
||||
* @returns {boolean} 是否附魔成功
|
||||
*/
|
||||
function (id, level, allowNonVanilla = true) {
|
||||
return GMLIB_API.applyEnchant(this, id, level, allowNonVanilla);
|
||||
function (typeName, level, allowNonVanilla = true) {
|
||||
return GMLIB_API.applyEnchant(this, typeName, level, allowNonVanilla);
|
||||
}
|
||||
|
||||
LLSE_Item.prototype.removeEnchants =
|
||||
@@ -2140,21 +2152,21 @@ LLSE_Item.prototype.removeEnchants =
|
||||
LLSE_Item.prototype.hasEnchant =
|
||||
/**
|
||||
* 判断是否拥有附魔
|
||||
* @param {number} id 附魔ID
|
||||
* @param {number} typeName 附魔的命名空间
|
||||
* @returns {boolean} 是否拥有附魔
|
||||
*/
|
||||
function (id) {
|
||||
return GMLIB_API.hasEnchant(this, id);
|
||||
function (typeName) {
|
||||
return GMLIB_API.hasEnchant(this, typeName);
|
||||
}
|
||||
|
||||
LLSE_Item.prototype.getEnchantLevel =
|
||||
/**
|
||||
* 获取附魔等级
|
||||
* @param {number} id 附魔ID
|
||||
* @param {number} typeName 附魔ID
|
||||
* @returns {number} 附魔等级
|
||||
*/
|
||||
function (id) {
|
||||
return GMLIB_API.getEnchantLevel(this, id);
|
||||
function (typeName) {
|
||||
return GMLIB_API.getEnchantLevel(this, typeName);
|
||||
}
|
||||
|
||||
LLSE_Player.prototype.dropItem =
|
||||
|
||||
+35
-11
@@ -1,4 +1,5 @@
|
||||
#include "Global.h"
|
||||
#include "mc/deps/core/string/HashedString.h"
|
||||
#include <regex>
|
||||
|
||||
bool isInteger(const std::string& str) {
|
||||
@@ -721,28 +722,51 @@ void Export_Compatibility_API() {
|
||||
return result;
|
||||
}
|
||||
);
|
||||
RemoteCall::exportAs("GMLIB_API", "getLegalEnchants", [](ItemStack const* item) -> std::vector<int> {
|
||||
return EnchantUtils::getLegalEnchants(item->getItem());
|
||||
RemoteCall::exportAs("GMLIB_API", "getLegalEnchants", [](ItemStack const* item) -> std::vector<std::string> {
|
||||
std::vector<int> enchants = EnchantUtils::getLegalEnchants(item->getItem());
|
||||
std::vector<std::string> result;
|
||||
for (auto& enchant : enchants) {
|
||||
result.push_back(Enchant::getEnchant((Enchant::Type)enchant)->getStringId());
|
||||
}
|
||||
return result;
|
||||
});
|
||||
RemoteCall::exportAs("GMLIB_API", "getEnchantTypeNameFromId", [](int id) -> std::string {
|
||||
if (auto enchant = Enchant::getEnchant((Enchant::Type)id)) {
|
||||
return enchant->getStringId();
|
||||
}
|
||||
return "";
|
||||
});
|
||||
RemoteCall::exportAs(
|
||||
"GMLIB_API",
|
||||
"applyEnchant",
|
||||
[](ItemStack const* item, int id, int level, bool allowNonVanilla) -> bool {
|
||||
return EnchantUtils::applyEnchant((ItemStackBase&)*item, (Enchant::Type)id, level, allowNonVanilla);
|
||||
[](ItemStack const* item, std::string const& typeName, int level, bool allowNonVanilla) -> bool {
|
||||
return EnchantUtils::applyEnchant(
|
||||
(ItemStackBase&)*item,
|
||||
Enchant::getEnchantTypeFromName(HashedString(typeName)),
|
||||
level,
|
||||
allowNonVanilla
|
||||
);
|
||||
}
|
||||
);
|
||||
RemoteCall::exportAs("GMLIB_API", "removeEnchants", [](ItemStack const* item) -> void {
|
||||
EnchantUtils::removeEnchants((ItemStack&)*item);
|
||||
});
|
||||
RemoteCall::exportAs("GMLIB_API", "hasEnchant", [](ItemStack const* item, int id) -> bool {
|
||||
return EnchantUtils::hasEnchant((Enchant::Type)id, (ItemStackBase&)*item);
|
||||
RemoteCall::exportAs("GMLIB_API", "hasEnchant", [](ItemStack const* item, std::string const& typeName) -> bool {
|
||||
return EnchantUtils::hasEnchant(Enchant::getEnchantTypeFromName(HashedString(typeName)), (ItemStackBase&)*item);
|
||||
});
|
||||
RemoteCall::exportAs("GMLIB_API", "getEnchantLevel", [](ItemStack const* item, int id) -> int {
|
||||
return EnchantUtils::getEnchantLevel((Enchant::Type)id, (ItemStackBase&)*item);
|
||||
});
|
||||
RemoteCall::exportAs("GMLIB_API", "getEnchantNameAndLevel", [](int id, int level) -> std::string {
|
||||
return EnchantUtils::getEnchantNameAndLevel((Enchant::Type)id, level);
|
||||
RemoteCall::exportAs("GMLIB_API", "getEnchantLevel", [](ItemStack const* item, std::string const& typeName) -> int {
|
||||
return EnchantUtils::getEnchantLevel(
|
||||
Enchant::getEnchantTypeFromName(HashedString(typeName)),
|
||||
(ItemStackBase&)*item
|
||||
);
|
||||
});
|
||||
RemoteCall::exportAs(
|
||||
"GMLIB_API",
|
||||
"getEnchantNameAndLevel",
|
||||
[](std::string const& typeName, int level) -> std::string {
|
||||
return EnchantUtils::getEnchantNameAndLevel(Enchant::getEnchantTypeFromName(HashedString(typeName)), level);
|
||||
}
|
||||
);
|
||||
RemoteCall::exportAs(
|
||||
"GMLIB_API",
|
||||
"dropPlayerItem",
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
#include "HandleRequestAction.h"
|
||||
#include "Global.h"
|
||||
|
||||
|
||||
HandleRequestActionBeforeEvent::HandleRequestActionBeforeEvent(
|
||||
Player* player,
|
||||
ItemStackRequestAction& requestAction
|
||||
)
|
||||
: mPlayer(player),
|
||||
mRequestAction(requestAction) {}
|
||||
|
||||
Player* HandleRequestActionBeforeEvent::self() const { return mPlayer; }
|
||||
|
||||
ItemStackRequestAction& HandleRequestActionBeforeEvent::getRequestAction() const { return mRequestAction; }
|
||||
|
||||
HandleRequestActionAfterEvent::HandleRequestActionAfterEvent(
|
||||
Player* player,
|
||||
ItemStackRequestAction& requestAction
|
||||
)
|
||||
: mPlayer(player),
|
||||
mRequestAction(requestAction) {}
|
||||
|
||||
Player* HandleRequestActionAfterEvent::self() const { return mPlayer; }
|
||||
|
||||
ItemStackRequestAction& HandleRequestActionAfterEvent::getRequestAction() const { return mRequestAction; }
|
||||
|
||||
|
||||
LL_AUTO_TYPE_INSTANCE_HOOK(
|
||||
HandleRequestActionHook,
|
||||
HookPriority::Normal,
|
||||
ItemStackRequestActionHandler,
|
||||
"?handleRequestAction@ItemStackRequestActionHandler@@QEAA?AW4ItemStackNetResult@@AEBVItemStackRequestAction@@@Z",
|
||||
void,
|
||||
ItemStackRequestAction& requestAction
|
||||
) {
|
||||
auto beforeEvent = HandleRequestActionBeforeEvent(((Player*)(*(__int64*)this)), requestAction);
|
||||
ll::event::EventBus::getInstance().publish(beforeEvent);
|
||||
if (beforeEvent.isCancelled()) return;
|
||||
ll::event::EventBus::getInstance().publish(HandleRequestActionAfterEvent(((Player*)(*(__int64*)this)), requestAction));
|
||||
return origin(requestAction);
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
#include "Global.h"
|
||||
#include "ll/api/event/Cancellable.h"
|
||||
|
||||
class HandleRequestActionBeforeEvent final : public ll::event::Cancellable<ll::event::Event> {
|
||||
private:
|
||||
Player* mPlayer{};
|
||||
ItemStackRequestAction& mRequestAction;
|
||||
|
||||
public:
|
||||
HandleRequestActionBeforeEvent(Player* player, ItemStackRequestAction& requestAction);
|
||||
|
||||
Player* self() const;
|
||||
|
||||
ItemStackRequestAction& getRequestAction() const;
|
||||
};
|
||||
|
||||
class HandleRequestActionAfterEvent final : public ll::event::Event {
|
||||
private:
|
||||
Player* mPlayer;
|
||||
ItemStackRequestAction& mRequestAction;
|
||||
|
||||
public:
|
||||
HandleRequestActionAfterEvent(Player* player, ItemStackRequestAction& requestAction);
|
||||
|
||||
Player* self() const;
|
||||
|
||||
ItemStackRequestAction& getRequestAction() const;
|
||||
};
|
||||
@@ -1,5 +1,4 @@
|
||||
#include "Global.h"
|
||||
#include "Event/HandleRequestAction/HandleRequestAction.h"
|
||||
using namespace ll::hash_utils;
|
||||
|
||||
void Export_Event_API() {
|
||||
@@ -248,46 +247,6 @@ void Export_Event_API() {
|
||||
);
|
||||
return true;
|
||||
}
|
||||
case doHash("handleRequestTryAction"): {
|
||||
auto Call =
|
||||
RemoteCall::importAs<bool(Player * player, int requestAction, int slot, int containerNetId)>(
|
||||
eventName,
|
||||
eventId
|
||||
);
|
||||
eventBus->emplaceListener<HandleRequestActionBeforeEvent>([Call](HandleRequestActionBeforeEvent& ev) {
|
||||
bool result = true;
|
||||
try {
|
||||
result = Call(
|
||||
ev.self(),
|
||||
(int)ev.getRequestAction().getActionType(),
|
||||
(int)ev.getRequestAction().getSrc().mSlot,
|
||||
(int)ev.getRequestAction().getSrc().mOpenContainerNetId
|
||||
);
|
||||
} catch (...) {}
|
||||
if (!result) {
|
||||
ev.cancel();
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
case doHash("handleRequestAction"): {
|
||||
auto Call =
|
||||
RemoteCall::importAs<bool(Player * player, int requestAction, int slot, int containerNetId)>(
|
||||
eventName,
|
||||
eventId
|
||||
);
|
||||
eventBus->emplaceListener<HandleRequestActionAfterEvent>([Call](HandleRequestActionAfterEvent& ev) {
|
||||
try {
|
||||
Call(
|
||||
ev.self(),
|
||||
(int)ev.getRequestAction().getActionType(),
|
||||
(int)ev.getRequestAction().getSrc().mSlot,
|
||||
(int)ev.getRequestAction().getSrc().mOpenContainerNetId
|
||||
);
|
||||
} catch (...) {}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
#include "GMLIB/Server/FakeListAPI.h"
|
||||
#include "GMLIB/Server/LevelAPI.h"
|
||||
#include "Global.h"
|
||||
#include "mc/world/ActorUniqueID.h"
|
||||
#include <variant>
|
||||
|
||||
void Export_Legacy_GMLib_ServerAPI() {
|
||||
RemoteCall::exportAs("GMLib_ServerAPI", "setEducationFeatureEnabled", []() -> void {
|
||||
@@ -76,6 +72,9 @@ void Export_Legacy_GMLib_ServerAPI() {
|
||||
return FakeList::removeAllFakeLists();
|
||||
});
|
||||
RemoteCall::exportAs("GMLib_ServerAPI", "getMaxPlayers", []() -> int {
|
||||
return ll::memory::dAccess<int>(ll::service::getServerNetworkHandler().as_ptr(), 200);
|
||||
if (auto level = GMLIB_Level::getInstance()) {
|
||||
return level->getMaxPlayerCount();
|
||||
}
|
||||
return {};
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user