From cf055169d1c598b35ba00df08bf6a0d58bc07ea7 Mon Sep 17 00:00:00 2001 From: twoone3 <3197653242@qq.com> Date: Tue, 5 Jul 2022 23:01:25 +0800 Subject: [PATCH] =?UTF-8?q?2.0.1=E6=9B=B4=E6=96=B0=20-=20=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5LLMoney=20-=20=E4=BF=AE=E5=A4=8D=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E6=9C=AA=E6=8B=A6=E6=88=AA=E7=9A=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API/PlayerAPI.cpp | 3 +- Example/mc.pyi | 117 +++++++++++++++++++++++++++++----------------- Example/pshop.py | 67 +++++++++----------------- Init.cpp | 6 ++- ModuleDef.cpp | 50 ++++++++++++-------- updateSDK.cmd | 2 +- 6 files changed, 133 insertions(+), 112 deletions(-) diff --git a/API/PlayerAPI.cpp b/API/PlayerAPI.cpp index 34c117d..0ff666d 100644 --- a/API/PlayerAPI.cpp +++ b/API/PlayerAPI.cpp @@ -415,7 +415,7 @@ bool PlayerClass::sendCustomForm(const string& str, const py::function& cb) { [p, cb](const string& arg) { if (LL::isServerStopping()) return; - if (arg == "null\n") + if (arg == "null") return; PY_TRY; py::gil_scoped_acquire gil_; @@ -860,3 +860,4 @@ bool PlayerClass::removeItem(int inventory_id, int count) { thiz->sendInventory(true); return true; } + diff --git a/Example/mc.pyi b/Example/mc.pyi index 4a32375..e0db05e 100644 --- a/Example/mc.pyi +++ b/Example/mc.pyi @@ -159,7 +159,7 @@ class Block: dim: int tile_data: int - def setNbt(nbt): + def setNbt(self, nbt): pass def getNbt(self) -> "NBT": @@ -220,7 +220,7 @@ class Item: count: int aux: int - def __init__(): + def __init__(self): pass def set(self): @@ -241,7 +241,7 @@ class Item: def setLore(self): pass - def setNbt(self): + def setNbt(self, nbt): pass def getNbt(self): @@ -260,35 +260,45 @@ class Command: def setAlias(self): pass - def mandatory( + def mandatory2( self, name, - type: str, + type: ParameterType, description: str = "", identifier: str = "", - option=CommandParameterOption.None_, + option=CommandParameterOption.None_ ): pass def mandatory( self, name, - type: str, + type: ParameterType, description: str = "", - option=CommandParameterOption.None_, + option=CommandParameterOption.None_ ): pass - # "name"_a, "type"_a, "description"_a = "", "option"_a = None) - def optional(self): + def optional2( + self, + name, + type: ParameterType, + description: str = "", + identifier: str = "", + option=CommandParameterOption.None_ + ): pass - # "name"_a, "type"_a, "description"_a = "", "identifier"_a = "", "option"_a = None) - def optional(self): + def optional( + self, + name, + type: ParameterType, + description: str = "", + option=CommandParameterOption.None_ + ): pass - # "name"_a, "type"_a, "description"_a = "", "option"_a = None) - def setSoftEnum(self): + def setSoftEnum(self, name, enums): pass def addSoftEnumValues(self): @@ -303,16 +313,10 @@ class Command: def getSoftEnumNames(self): pass - def overload(self): + def overload(self, value=None): pass - def overload(self): - pass - - def overload(self): - pass - - def setCallback(self): + def setCallback(self, callback): pass def setup(self): @@ -340,10 +344,7 @@ class CommandOutput: empty: bool success_count: int - def success(self): - pass - - def success(self): + def success(self, msg=None): pass def error(self): @@ -413,20 +414,17 @@ class NBT: pass @staticmethod - def fromSNBT() -> "NBT": + def fromSNBT(snbt) -> "NBT": pass @staticmethod def fromBinary() -> "NBT": pass - def __getitem__(self): + def __getitem__(self, key): pass - def __getitem__(self): - pass - - def __setitem__(self): + def __setitem__(self, key, value): pass def asByte(self): @@ -450,10 +448,10 @@ class NBT: def toBinary(self): pass - def toJson(self): + def toJson(self, indent=4): pass - def toSNBT(self): + def toSNBT(self, indent=4, format=SnbtFormat.PartialNewLine): pass def append(self): @@ -465,28 +463,28 @@ class Logger: def __init__(self, title: str) -> None: pass - def debug(self): + def debug(self, msg: str): pass - def info(self): + def info(self, msg: str): pass - def warn(self): + def warn(self, msg: str): pass - def error(self): + def error(self, msg: str): pass - def fatal(self): + def fatal(self, msg: str): pass - def setTitle(self): + def setTitle(self, title: str): pass - def setFile(self): + def setFile(self, file: str): pass - def setPlayer(self): + def setPlayer(self, player): pass @@ -749,6 +747,9 @@ class Player: def simulateStopSneaking(self): pass + def removeItem(self, slot, num): + pass + class Entity: name: str @@ -882,7 +883,7 @@ def runCommandEx(): pass -def setListener(): +def setListener(event, callback): pass @@ -982,7 +983,7 @@ def getScoreObjective(): pass -def newScoreObjective(): +def newScoreObjective(name, display): pass @@ -996,3 +997,31 @@ def getAllScoreObjectives(): def setMaxPlayers(): pass + + +def getMoney(xuid): + pass + + +def setMoney(xuid, num): + pass + + +def addMoney(xuid, num): + pass + + +def reduceMoney(xuid, num): + pass + + +def transMoney(xuid1, xuid2, num, notes): + pass + + +def getMoneyHistt(xuid, time): + pass + + +def clearMoneyHistist(time): + pass diff --git a/Example/pshop.py b/Example/pshop.py index b4ab0ee..6de87a9 100644 --- a/Example/pshop.py +++ b/Example/pshop.py @@ -56,10 +56,9 @@ def UpdateConfig(path, config): return None -def CreateSellShop(goods_name, typename, scoreboard, price, nbt, bool_needtag): +def CreateSellShop(goods_name, typename, price, nbt, bool_needtag): global pshop pshop["selldata"][goods_name] = {} - pshop["selldata"][goods_name]["scoreboard"] = scoreboard pshop["selldata"][goods_name]["price"] = price pshop["selldata"][goods_name]["typename"] = typename pshop["selldata"][goods_name]["nbt"] = nbt @@ -87,14 +86,13 @@ def RemoveSellShop(goods_name): return True -def CreateBuyShop(goods_name, typename, scoreboard, price, nbt): +def CreateBuyShop(goods_name, typename, price, nbt): global pshop try: - nbt["Count1"] = 1 + nbt["Count"] = 1 except: pass pshop["buydata"][goods_name] = {} - pshop["buydata"][goods_name]["scoreboard"] = scoreboard pshop["buydata"][goods_name]["price"] = price pshop["buydata"][goods_name]["typename"] = typename pshop["buydata"][goods_name]["nbt"] = nbt @@ -122,19 +120,16 @@ def RemoveBuyShop(goods_name): # 经济部分 -def GetMoney(player, scoreboard): - return player.getScore(scoreboard) +def GetMoney(player): + return getMoney(player.xuid) -def AddMoney(player, num, scoreboard): - player.addScore(scoreboard, num) +def AddMoney(player, num): + return addMoney(player.xuid, num) -def ReduceMoney(player, num, scoreboard): - if GetMoney(player, scoreboard) < num: - return False - player.reduceScore(scoreboard, num) - return True +def ReduceMoney(player, num): + return reduceMoney(player.xuid, num) def GetPlayerInventoryItems(player, itemname, needtag, ench): @@ -197,14 +192,13 @@ def PshopBuy3(player, selected): return shop = GetBuyShop(player.getExtraData("gn")) price = shop["price"] - scoreboard = shop["scoreboard"] money = int(price * num) nbt = NBT.fromSNBT(shop["nbt"]) buynum = nbt["Count"].asByte() if num * buynum > 1500 or num > 30: player.sendText("§e[shop]§c购买失败, 物品过多!") return - if ReduceMoney(player, money, scoreboard): + if ReduceMoney(player, money): # shop['nbt']['Count1']=int(num*buynum) for i in range(num): item = Item() @@ -253,8 +247,7 @@ def PshopSell3(player, selected): if RemovePlayerInventoryItems(player, itemname, num, needtag, nbt): price = shop["price"] money = int(price * num) - scoreboard = shop["scoreboard"] - AddMoney(player, money, scoreboard) + AddMoney(player, money) player.sendText("§e[shop]§a回收成功, 获得金币: " + str(money)) else: player.sendText("§e[shop]§c物品不足") @@ -344,7 +337,6 @@ def DeleteShopType(player, selected): elif selected == 2: cf = CustomForm("添加手持物品") cf.addInput("输入商品名称") - cf.addInput("使用的计分板名称(默认money)") cf.addInput("输入单价") cf.addDropdown("选择商品类型", pshop["typename"]) @@ -355,20 +347,17 @@ def AddBuy(player, selected): if goods_name == "": player.sendText("§e[shop]§c请输入商品名称") return - scoreboard = selected[1] - if scoreboard == "": - scoreboard = "money" - typename = pshop["typename"][selected[3]] + typename = pshop["typename"][selected[2]] if typename == "无": player.sendText("§e[shop]§c请先创建商品类型") return - if selected[2].isdigit(): - price = int(selected[2]) + if selected[1].isdigit(): + price = int(selected[1]) if price < 0: player.sendText("§e[shop]§c价格不能为负数") return nbt = player.getHand().getNbt().toSNBT(0, SnbtFormat.Minimize) - CreateBuyShop(goods_name, typename, scoreboard, price, nbt) + CreateBuyShop(goods_name, typename, price, nbt) player.sendText("§e[shop]§a添加成功") else: player.sendText("§e[shop]§c请输入正确的价格") @@ -393,7 +382,6 @@ def RemoveBuy(player, selected): elif selected == 4: cf = CustomForm("添加手持物品") cf.addInput("输入商品名称") - cf.addInput("使用的计分板名称(默认money)") cf.addInput("输入单价") cf.addToggle("是否需要nbt一致", False) cf.addDropdown("选择商品类型", pshop["typename"]) @@ -405,15 +393,12 @@ def AddSell(player, selected): if goods_name == "": player.sendText("§e[shop]§c请输入商品名称") return - scoreboard = selected[1] - if scoreboard == "": - scoreboard = "money" - typename = pshop["typename"][selected[4]] + typename = pshop["typename"][selected[3]] if typename == "无": player.sendText("§e[shop]§c请先创建商品类型") return - if selected[2].isdigit(): - price = int(selected[2]) + if selected[1].isdigit(): + price = int(selected[1]) if price < 0: player.sendText("§e[shop]§c价格不能为负数") return @@ -421,10 +406,9 @@ def AddSell(player, selected): CreateSellShop( goods_name, typename, - scoreboard, price, nbt, - selected[3], + selected[2], ) player.sendText("§e[shop]§a添加成功") else: @@ -450,14 +434,15 @@ def PshopInit(): global pshop MakeDirs(home) - if not os.path.exists(home + "pshop.json"): - UpdateConfig("pshop.json", pshop) - logger.info("创建配置文件:pshop.json") pshop["selldata"] = {} pshop["buydata"] = {} pshop["listsell"] = [] pshop["listbuy"] = [] pshop["typename"] = [] + + if not os.path.exists(home + "pshop.json"): + UpdateConfig("pshop.json", pshop) + logger.info("创建配置文件:pshop.json") pshop = ReadConfig("pshop.json") def PshopCallback(origin, results): @@ -501,11 +486,5 @@ def PshopCallback(origin, results): c.setCallback(PshopCallback) c.setup() - def onJoin(e): - newScoreObjective("money", "money") - e["Player"].addScore("money", 0) # 添加计分板 - - setListener("onJoin", onJoin) - PshopInit() diff --git a/Init.cpp b/Init.cpp index 2e1e681..8a7b1ae 100644 --- a/Init.cpp +++ b/Init.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -6,11 +7,12 @@ using namespace std; constexpr unsigned PYR_VERSION_MAJOR = 2; constexpr unsigned PYR_VERSION_MINOR = 0; -constexpr unsigned PYR_VERSION_MICRO = 0; -constexpr const char* PYR_VERSION = "v2.0.0"; +constexpr unsigned PYR_VERSION_MICRO = 1; +constexpr const char* PYR_VERSION = "v2.0.1"; void entry() { PY_TRY; + EconomySystem::init(); //如果目录不存在创建目录 if (!filesystem::exists(PLUGIN_PATH)) filesystem::create_directory(PLUGIN_PATH); diff --git a/ModuleDef.cpp b/ModuleDef.cpp index 08e1ed5..c2eef5c 100644 --- a/ModuleDef.cpp +++ b/ModuleDef.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -15,12 +16,12 @@ // clang-format off -#define DEF_ENUM(name, type) { auto entries = magic_enum::enum_entries(); auto e = py::enum_(m, name); for (auto& [val, n] : entries) { e.value(n.data(), val); } } +#define DEF_ENUM(name, type) { auto entries = magic_enum::enum_entries(); auto e = py::enum_(mc_module, name); for (auto& [val, n] : entries) { e.value(n.data(), val); } } #define DEF_ENUM_SIMPLE(type) DEF_ENUM(#type, type) // clang-format on -PYBIND11_EMBEDDED_MODULE(mc, m) { +PYBIND11_EMBEDDED_MODULE(mc, mc_module) { using py::literals::operator""_a; PY_TRY; #pragma region Enums @@ -38,7 +39,7 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { #pragma endregion #pragma region Classes - py::class_(m, "Vec2") + py::class_(mc_module, "Vec2") .def(py::init()) .def_property( @@ -47,7 +48,7 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { "y", [](const Vec2& pos) { return pos.y; }, [](Vec2& pos, float val) { pos.y = val; }) .def("__repr__", &Vec2::toString); - py::class_(m, "Vec3") + py::class_(mc_module, "Vec3") .def(py::init()) .def_property( @@ -58,7 +59,7 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { "z", [](const Vec3& pos) { return pos.z; }, [](Vec3& pos, float val) { pos.z = val; }) .def("__repr__", &Vec3::toString); - py::class_(m, "BlockPos") + py::class_(mc_module, "BlockPos") .def(py::init()) .def_property( @@ -69,7 +70,7 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { "z", [](const BlockPos& pos) { return pos.z; }, [](BlockPos& pos, int val) { pos.z = val; }) .def("__repr__", &BlockPos::toString); - py::class_(m, "Block") + py::class_(mc_module, "Block") .def_property("name", &BlockClass::getName, nullptr) .def_property("type", &BlockClass::getType, nullptr) .def_property("id", &BlockClass::getId, nullptr) @@ -85,7 +86,7 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { .def("getBlockEntity", &BlockClass::getBlockEntity) .def("removeBlockEntity", &BlockClass::removeBlockEntity); - py::class_(m, "Container") + py::class_(mc_module, "Container") .def_property("size", &ContainerClass::getSize, nullptr) .def_property("type", &ContainerClass::getType, nullptr) @@ -99,7 +100,7 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { .def("removeAllItems", &ContainerClass::removeAllItems) .def("isEmpty", &ContainerClass::isEmpty); - py::class_(m, "Item") + py::class_(mc_module, "Item") .def(py::init()) .def_property("name", &ItemClass::getName, nullptr) @@ -117,7 +118,7 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { .def("setNbt", &ItemClass::setNbt) .def("getNbt", &ItemClass::getNbt); - py::class_(m, "Command") + py::class_(mc_module, "Command") .def(py::init()) .def_property("name", &CommandClass::getName, nullptr) @@ -142,7 +143,7 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { .def("setCallback", &CommandClass::setCallback) .def("setup", &CommandClass::setup); - py::class_(m, "CommandOrigin") + py::class_(mc_module, "CommandOrigin") .def_property("type", &CommandOriginClass::getOriginType, nullptr) .def_property("type_name", &CommandOriginClass::getOriginTypeName, nullptr) .def_property("name", &CommandOriginClass::getOriginName, nullptr) @@ -155,7 +156,7 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { .def("getNbt", &CommandOriginClass::getNbt) .def("toString", &CommandOriginClass::toString); - py::class_(m, "CommandOutput") + py::class_(mc_module, "CommandOutput") .def_property("empty", &CommandOutputClass::empty, nullptr) .def_property("success_count", &CommandOutputClass::getSuccessCount, nullptr) @@ -165,11 +166,11 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { .def("addMessage", &CommandOutputClass::addMessage) .def("toString", &CommandOutputClass::toString); - py::class_(m, "CommandResult") + py::class_(mc_module, "CommandResult") .def("__repr__", [](const DynamicCommand::Result& thiz) { return py::str(convertResult(thiz)); }) .def("toObject", [](const DynamicCommand::Result& thiz) { return convertResult(thiz); }); - py::class_(m, "NBT") + py::class_(mc_module, "NBT") .def_property("type", &NbtClass::getType, nullptr) .def_static("newByte", &NbtClass::newByte) .def_static("newShort", &NbtClass::newShort) @@ -200,7 +201,7 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { .def("toSNBT", &NbtClass::toSNBT, "indent"_a = 4, "format"_a = SnbtFormat::PartialNewLine) .def("append", &NbtClass::append); - py::class_(m, "Logger") + py::class_(mc_module, "Logger") .def(py::init(), "title"_a) .def("debug", &LoggerClass::debug) .def("info", &LoggerClass::info) @@ -212,7 +213,7 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { .def("setFile", &LoggerClass::setFile) .def("setPlayer", &LoggerClass::setPlayer); - py::class_(m, "Player") + py::class_(mc_module, "Player") .def_property("name", &PlayerClass::getName, nullptr) .def_property("pos", &PlayerClass::getPos, nullptr) .def_property("blockpos", &PlayerClass::getBlockPos, nullptr) @@ -340,7 +341,7 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { .def("removeItem",&PlayerClass::removeItem); - py::class_(m, "Entity") + py::class_(mc_module, "Entity") .def_property("name", &EntityClass::getName, nullptr) .def_property("type", &EntityClass::getType, nullptr) .def_property("id", &EntityClass::getId, nullptr) @@ -377,7 +378,7 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { .def("getEntityFromViewVector", &EntityClass::getEntityFromViewVector) .def("getBlockFromViewVector", &EntityClass::getBlockFromViewVector); - py::class_(m, "BlockEntity") + py::class_(mc_module, "BlockEntity") .def_property("pos", &BlockEntityClass::getPos, nullptr) .def_property("type", &BlockEntityClass::getType, nullptr) @@ -385,7 +386,7 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { .def("getNbt", &BlockEntityClass::getNbt) .def("getBlock", &BlockEntityClass::getBlock); - py::class_(m, "Objective") + py::class_(mc_module, "Objective") .def_property("name", &ObjectiveClass::getName, nullptr) .def_property("display_name", &ObjectiveClass::getDisplayName, nullptr) @@ -395,9 +396,10 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { .def("reduceScore", &ObjectiveClass::reduceScore) .def("deleteScore", &ObjectiveClass::deleteScore) .def("getScore", &ObjectiveClass::getScore); + #pragma endregion #pragma region Functions - m + mc_module .def("getBbsVersion", &LL::getBdsVersion) .def("getServerProtocolVersion", &LL::getServerProtocolVersion) .def("runCommand", &Level::runcmd) @@ -433,7 +435,15 @@ PYBIND11_EMBEDDED_MODULE(mc, m) { .def("removeScoreObjective", &mc::removeScoreObjective) .def("getAllScoreObjectives", &mc::getAllScoreObjectives) - .def("setMaxPlayers", &mc::setMaxNumPlayers); + .def("setMaxPlayers", &mc::setMaxNumPlayers) + + .def("getMoney", &EconomySystem::getMoney) + .def("setMoney", &EconomySystem::setMoney) + .def("addMoney", &EconomySystem::addMoney) + .def("reduceMoney", &EconomySystem::reduceMoney) + .def("transMoney", &EconomySystem::transMoney) + .def("getMoneyHist", &EconomySystem::getMoneyHist) + .def("clearMoneyHist", &EconomySystem::clearMoneyHist); #pragma endregion PY_CATCH; } \ No newline at end of file diff --git a/updateSDK.cmd b/updateSDK.cmd index cb31a97..9c305dd 100644 --- a/updateSDK.cmd +++ b/updateSDK.cmd @@ -4,5 +4,5 @@ rmdir SDK /S /Q rmdir ".git/modules" /S /Q git submodule add --depth=1 https://github.com/LiteLDev/LiteLoaderSDK SDK cd SDK\Tools -LibraryBuilder.exe -o ..\Lib "C:\Users\31976\Desktop\BDS" +LibraryBuilder.exe -o ..\Lib "..\..\..\BDS" pause \ No newline at end of file