From f82f7108d7f5729f7e1402666d0700ba82e3142b Mon Sep 17 00:00:00 2001 From: Qiuzhizhe <42761326+quizhizhe@users.noreply.github.com> Date: Thu, 27 Oct 2022 15:04:16 +0800 Subject: [PATCH] Fix Some EventAPI --- LiteLoader/Header/EventAPI.h | 2 +- LiteLoader/Kernel/EventAPI.cpp | 365 +++++++++++++++--------------- LiteLoader/Kernel/MC/LevelAPI.cpp | 1 + 3 files changed, 185 insertions(+), 183 deletions(-) diff --git a/LiteLoader/Header/EventAPI.h b/LiteLoader/Header/EventAPI.h index 9a3dd57..d9819c1 100644 --- a/LiteLoader/Header/EventAPI.h +++ b/LiteLoader/Header/EventAPI.h @@ -382,7 +382,7 @@ public: BlockInstance mPreviousBlockInstance; BlockInstance mNewBlockInstance; }; - +// TODO 没找到合适点位 class BlockExplodedEvent : public EventTemplate { public: BlockInstance mBlockInstance; diff --git a/LiteLoader/Kernel/EventAPI.cpp b/LiteLoader/Kernel/EventAPI.cpp index 110ac59..f9b607b 100644 --- a/LiteLoader/Kernel/EventAPI.cpp +++ b/LiteLoader/Kernel/EventAPI.cpp @@ -324,7 +324,6 @@ TClasslessInstanceHook(void, "?sendLoginMessageLocal@ServerNetworkHandler@@QEAAX /////////////////// PlayerJoin /////////////////// TInstanceHook(bool, "?onReady_ClientGeneration@ServerNetworkHandler@@QEAAXAEAVPlayer@@AEBVNetworkIdentifier@@@Z", ServerNetworkHandler,Player* player,NetworkIdentifier *net) { - //std::cout<<"PlayerJoin"<mToDimensionId == sp->getDimensionId()) return original(this, sp, std::move(request)); +// printf("PlayerChangeDimension Player:%s, DimensionID:%s\n",sp->getNameTag().c_str(),request->mToDimensionId); IF_LISTENED(PlayerChangeDimEvent) { PlayerChangeDimEvent ev{}; ev.mPlayer = sp; @@ -431,6 +430,7 @@ TInstanceHook(void, "?jumpFromGround@Player@@UEAAXXZ", Player) { //不清楚这个符合能不能正常触发 TClasslessInstanceHook(void, "?onActorSneakChanged@ScriptServerActorEventListener@@UEAA?AW4EventResult@@AEAVActor@@_N@Z", Actor* ac, bool isSneaking) { +// printf("PlayerSneak Player:%s, IsSneaking:%s\n",ac->getNameTag().c_str(),isSneaking); IF_LISTENED(PlayerSneakEvent) { PlayerSneakEvent ev{}; ev.mPlayer = (Player*)ac; @@ -572,17 +572,18 @@ TInstanceHook(void, "?onEffectRemoved@ServerPlayer@@MEAAXAEAVMobEffectInstance@@ /////////////////// PlayerStartDestroyBlock /////////////////// // 没有这个符号 -// TClasslessInstanceHook(void, "?sendBlockDestructionStarted@BlockEventCoordinator@@QEAAXAEAVPlayer@@AEBVBlockPos@@@Z", -// Player* pl, BlockPos* bp) { -// IF_LISTENED(PlayerStartDestroyBlockEvent) { -// PlayerStartDestroyBlockEvent ev{}; -// ev.mPlayer = pl; -// ev.mBlockInstance = Level::getBlockInstance(bp, Level::getBlockSource(pl)); -// ev.call(); -// } -// IF_LISTENED_END(PlayerStartDestroyBlockEvent) -// return original(this, pl, bp); -// } +// 更换点位 + TClasslessInstanceHook(void, "?startDestroyBlock@GameMode@@UEAA_NAEBVBlockPos@@EAEA_N@Z", + Player* pl, BlockPos* bp, unsigned __int8 face, bool *hasDestroyedBlock) { + IF_LISTENED(PlayerStartDestroyBlockEvent) { + PlayerStartDestroyBlockEvent ev{}; + ev.mPlayer = pl; + ev.mBlockInstance = Level::getBlockInstance(bp, Level::getBlockSource(pl)); + ev.call(); + } + IF_LISTENED_END(PlayerStartDestroyBlockEvent) + return original(this, pl, bp,face,hasDestroyedBlock); + } /////////////////// PlayerPlaceBlock /////////////////// #include @@ -998,31 +999,30 @@ TInstanceHook(void, "?setSprinting@Mob@@UEAAX_N@Z", #include #include /////////////////// PlayerSetArmor /////////////////// -// TInstanceHook(void, "?setArmor@Player@@UEAAXW4ArmorSlot@@AEBVItemStack@@@Z", -// Player, unsigned slot, ItemStack* it) { -// original(this, slot, it); -// IF_LISTENED(PlayerSetArmorEvent) { -// if (this->isPlayer()) { -// PlayerSetArmorEvent ev{}; -// ev.mPlayer = this; -// ev.mSlot = slot; -// ev.mArmorItem = it; -// if (!ev.call()) { -// auto& uid = getUniqueID(); -// auto& plinv = getSupplies(); -// plinv.add(*it, 1); -// getArmorContainer().setItem(slot, ItemStack::EMPTY_ITEM); -// Schedule::delay([uid] { -// auto sp = Global->getPlayer(uid); -// if (sp) -// sp->refreshInventory(); -// }, -// 1); -// } -// } -// } -// IF_LISTENED_END(PlayerSetArmorEvent) -// } + TInstanceHook(void, "?setArmor@Player@@UEAAXW4ArmorSlot@@AEBVItemStack@@@Z", + Player, unsigned slot, ItemStack* it) { + original(this, slot, it); + IF_LISTENED(PlayerSetArmorEvent) { + if (this->isPlayer()) { + PlayerSetArmorEvent ev{}; + ev.mPlayer = this; + ev.mSlot = slot; + ev.mArmorItem = it; + if (!ev.call()) { + auto& uid = getUniqueID(); + this->add(*it); + getArmorContainer().setItem(slot, ItemStack::EMPTY_ITEM); + Schedule::delay([uid] { + auto sp = Global->getPlayer(uid); + if (sp) + sp->refreshInventory(); + }, + 1); + } + } + } + IF_LISTENED_END(PlayerSetArmorEvent) + } /////////////////// PlayerUseRespawnAnchor /////////////////// TInstanceHook(bool, "?trySetSpawn@RespawnAnchorBlock@@CA_NAEAVPlayer@@AEBVBlockPos@@AEAVBlockSource@@AEAVLevel@@@Z", @@ -1051,64 +1051,64 @@ TInstanceHook(bool, "?canOpenContainerScreen@Player@@UEAA_NXZ", Player) { } /////////////////// PlayerCmdEvent & ConsoleCmd /////////////////// -// TClasslessInstanceHook(MCRESULT*, "?executeCommand@MinecraftCommands@@QEBA?AUMCRESULT@@V?$shared_ptr@VCommandContext@@@std@@_N@Z", -// MCRESULT* rtn, std::shared_ptr context, bool print) { -// Player* sp; -// string cmd; + TClasslessInstanceHook(MCRESULT*, "?executeCommand@MinecraftCommands@@QEBA?AUMCRESULT@@V?$shared_ptr@VCommandContext@@@std@@_N@Z", + MCRESULT* rtn, std::shared_ptr context, bool print) { + Player* sp; + string cmd; -// try { -// sp = context->getOrigin().getPlayer(); -// cmd = context->getCmd(); -// if (!cmd.empty() && cmd.at(0) == '/') { -// cmd = cmd.substr(1, cmd.size() - 1); -// } + try { + sp = context->getOrigin().getPlayer(); + cmd = context->getCmd(); + if (!cmd.empty() && cmd.at(0) == '/') { + cmd = cmd.substr(1, cmd.size() - 1); + } -// if (!Util::isValidUTF8(cmd)) { -// logger.error("Detected invalid utf-8 character, command will not be executed"); -// return rtn; -// } -// } catch (...) { -// return rtn; -// } + if (!Util::isValidUTF8(cmd)) { + logger.error("Detected invalid utf-8 character, command will not be executed"); + return rtn; + } + } catch (...) { + return rtn; + } -// if (LL::isDebugMode() && LL::globalConfig.tickThreadId != std::this_thread::get_id()) { -// logger.warn("The thread executing the command \"{}\" is not the \"MC_SERVER\" thread", cmd); -// } -// if (sp) { -// // PlayerCmd -// IF_LISTENED(PlayerCmdEvent) { -// PlayerCmdEvent ev{}; -// ev.mCommand = cmd; -// ev.mPlayer = sp; -// ev.mResult = rtn; + if (LL::isDebugMode() && LL::globalConfig.tickThreadId != std::this_thread::get_id()) { + logger.warn("The thread executing the command \"{}\" is not the \"MC_SERVER\" thread", cmd); + } + if (sp) { + // PlayerCmd + IF_LISTENED(PlayerCmdEvent) { + PlayerCmdEvent ev{}; + ev.mCommand = cmd; + ev.mPlayer = sp; + ev.mResult = rtn; -// if (!ev.call()) -// return rtn; + if (!ev.call()) + return rtn; -// if (ev.mCommand.empty() || ev.mCommand.at(0) != '/') -// context->getCmd() = "/" + ev.mCommand; -// else -// context->getCmd() = ev.mCommand; -// } -// IF_LISTENED_END(PlayerCmdEvent) -// } else { -// // ConsoleCmd -// IF_LISTENED(ConsoleCmdEvent) { -// ConsoleCmdEvent ev{}; -// ev.mCommand = cmd; + if (ev.mCommand.empty() || ev.mCommand.at(0) != '/') + context->getCmd() = "/" + ev.mCommand; + else + context->getCmd() = ev.mCommand; + } + IF_LISTENED_END(PlayerCmdEvent) + } else { + // ConsoleCmd + IF_LISTENED(ConsoleCmdEvent) { + ConsoleCmdEvent ev{}; + ev.mCommand = cmd; -// if (!ev.call()) -// return rtn; + if (!ev.call()) + return rtn; -// if (ev.mCommand.empty() || ev.mCommand.at(0) != '/') -// context->getCmd() = "/" + ev.mCommand; -// else -// context->getCmd() = ev.mCommand; -// } -// IF_LISTENED_END(ConsoleCmdEvent) -// } -// return original(this, rtn, context, print); -// } + if (ev.mCommand.empty() || ev.mCommand.at(0) != '/') + context->getCmd() = "/" + ev.mCommand; + else + context->getCmd() = ev.mCommand; + } + IF_LISTENED_END(ConsoleCmdEvent) + } + return original(this, rtn, context, print); + } /////////////////// PlayerExperienceAddEvent /////////////////// TInstanceHook(void, "?addExperience@Player@@UEAAXH@Z", Player, int exp) { @@ -1129,8 +1129,8 @@ TInstanceHook(void, "?handle@ItemUseOnActorInventoryTransaction@@UEBA?AW4Invento IF_LISTENED(PlayerInteractEntityEvent) { PlayerInteractEntityEvent ev{}; ev.mPlayer = sp; - ev.mTargetId = dAccess(this); - ev.mInteractiveMode = static_cast(dAccess(this)); + ev.mTargetId = dAccess(this);//正确 + ev.mInteractiveMode = static_cast(dAccess(this));//看起来应该正确 if (!ev.call()) return; } @@ -1140,25 +1140,25 @@ TInstanceHook(void, "?handle@ItemUseOnActorInventoryTransaction@@UEBA?AW4Invento } /////////////////// CmdBlockExecute /////////////////// -// TInstanceHook(bool, "?_performCommand@BaseCommandBlock@@AEAA_NAEAVBlockSource@@AEBVCommandOrigin@@AEA_N@Z", -// BaseCommandBlock, BlockSource* a2, CommandOrigin* a3, bool* a4) { -// IF_LISTENED(CmdBlockExecuteEvent) { -// CmdBlockExecuteEvent ev{}; -// ev.mCommand = this->getCommand(); -// if ((OriginType)a3->getOriginType() == OriginType::MinecartBlock) { -// ev.mIsMinecart = true; -// ev.mMinecart = a3->getEntity(); -// } else { -// ev.mIsMinecart = false; -// ev.mBlockInstance = Level::getBlockInstance(a3->getBlockPosition(), a2); -// } + TInstanceHook(bool, "?_performCommand@BaseCommandBlock@@AEAA_NAEAVBlockSource@@AEBVCommandOrigin@@AEA_N@Z", + BaseCommandBlock, BlockSource* a2, CommandOrigin* a3, bool* a4) { + IF_LISTENED(CmdBlockExecuteEvent) { + CmdBlockExecuteEvent ev{}; + ev.mCommand = this->getCommand(); + if ((OriginType)a3->getOriginType() == OriginType::MinecartBlock) { + ev.mIsMinecart = true; + ev.mMinecart = a3->getEntity(); + } else { + ev.mIsMinecart = false; + ev.mBlockInstance = Level::getBlockInstance(a3->getBlockPosition(), a2); + } -// if (!ev.call()) -// return false; -// } -// IF_LISTENED_END(CmdBlockExecuteEvent) -// return original(this, a2, a3, a4); -// } + if (!ev.call()) + return false; + } + IF_LISTENED_END(CmdBlockExecuteEvent) + return original(this, a2, a3, a4); + } /////////////////// BlockInteracted /////////////////// TClasslessInstanceHook(unsigned short, @@ -1177,19 +1177,20 @@ TClasslessInstanceHook(unsigned short, /////////////////// BlockChanged /////////////////// // 没有这个符号 -// TInstanceHook(void, "?_blockChanged@BlockSource@@IEAAXAEBVBlockPos@@IAEBVBlock@@1HPEBUActorBlockSyncMessage@@PEAVActor@@@Z", -// BlockSource, BlockPos* bp, int a3, Block* afterBlock, Block* beforeBlock, int a6, void* a7, Actor* ac) { -// IF_LISTENED(BlockChangedEvent) { -// int dimId = this->getDimensionId(); -// BlockChangedEvent ev{}; -// ev.mPreviousBlockInstance = BlockInstance::createBlockInstance(beforeBlock, *bp, dimId); -// ev.mNewBlockInstance = BlockInstance::createBlockInstance(afterBlock, *bp, dimId); -// if (!ev.call()) -// return; -// } -// IF_LISTENED_END(BlockChangedEvent) -// return original(this, bp, a3, afterBlock, beforeBlock, a6, a7, ac); -// } +// 更换点位 + TInstanceHook(void, "?onBlockChanged@Dimension@@UEAAXAEAVBlockSource@@AEBVBlockPos@@IAEBVBlock@@2HPEBUActorBlockSyncMessage@@@Z", + Dimension, BlockSource *bs, BlockPos* bp, int a4, Block* afterBlock, Block* beforeBlock, int a7, void* a8) { + IF_LISTENED(BlockChangedEvent) { + int dimId = this->getDimensionId(); + BlockChangedEvent ev{}; + ev.mPreviousBlockInstance = BlockInstance::createBlockInstance(beforeBlock, *bp, dimId); + ev.mNewBlockInstance = BlockInstance::createBlockInstance(afterBlock, *bp, dimId); + if (!ev.call()) + return; + } + IF_LISTENED_END(BlockChangedEvent) + return original(this, bs, bp, a4, afterBlock, beforeBlock, a7, a8); + } /////////////////// BlockExploded /////////////////// // 没有这个符号 @@ -1354,7 +1355,7 @@ TClasslessInstanceHook(void, "?onRedstoneUpdate@ComparatorBlock@@UEBAXAEAVBlockS // 没有这个符号 TClasslessInstanceHook(bool, "?_pullInItems@Hopper@@IEAA_NAEAVBlockSource@@AEAVContainer@@AEBVVec3@@@Z", BlockSource* bs, void* container, Vec3* pos) { - bool isMinecart = dAccess(this, 5); // IDA Hopper::Hopper + bool isMinecart = dAccess(this, 5); // IDA Hopper::Hopper 未知正确 IF_LISTENED(HopperSearchItemEvent) { HopperSearchItemEvent ev{}; @@ -1587,24 +1588,24 @@ TInstanceHook(bool, "?useItemOn@GameMode@@UEAA_NAEAVItemStack@@AEBVBlockPos@@EAE /////////////////// MobHurt /////////////////// -// TInstanceHook(bool, "?_hurt@Mob@@MEAA_NAEBVActorDamageSource@@M_N1@Z", -// Mob, ActorDamageSource& src, float damage, bool unk1_1, bool unk2_0) { -// IF_LISTENED(MobHurtEvent) { -// if (this) { -// MobHurtEvent ev{}; -// ev.mMob = this; -// ev.mDamageSource = &src; -// ev.mDamage = damage; -// if (!ev.call()) -// return false; - -// damage = ev.mDamage; -// } -// } -// IF_LISTENED_END(MobHurtEvent) -// return original(this, src, damage, unk1_1, unk2_0); -// } + TInstanceHook(bool, "?_hurt@Mob@@MEAA_NAEBVActorDamageSource@@H_N1@Z", + Mob, ActorDamageSource& src, float damage, bool unk1_1, bool unk2_0) { + IF_LISTENED(MobHurtEvent) { + if (this) { + MobHurtEvent ev{}; + ev.mMob = this; + ev.mDamageSource = &src; + ev.mDamage = damage; + if (!ev.call()) + return false; + damage = ev.mDamage; + } + } + IF_LISTENED_END(MobHurtEvent) + return original(this, src, damage, unk1_1, unk2_0); + } +// 没有这个符号 // TInstanceHook(float, "?getDamageAfterResistanceEffect@Mob@@UEBAMAEBVActorDamageSource@@M@Z", Mob, ActorDamageSource* src, float damage) { // if (src->getCause() == ActorDamageCause::ActorDamageCause_Magic) { // IF_LISTENED(MobHurtEvent) { @@ -1625,16 +1626,16 @@ TInstanceHook(bool, "?useItemOn@GameMode@@UEAA_NAEAVItemStack@@AEBVBlockPos@@EAE //////////////// PlayerUseItem & PlayerEat //////////////// // #include -// TInstanceHook(bool, "?baseUseItem@GameMode@@QEAA_NAEAVItemStack@@@Z", GameMode, ItemStack& it) { -// auto pl = this->getPlayer(); -// IF_LISTENED(PlayerUseItemEvent) { -// PlayerUseItemEvent ev{}; -// ev.mPlayer = pl; -// ev.mItemStack = ⁢ -// if (!ev.call()) -// return false; -// } -// IF_LISTENED_END(PlayerUseItemEvent) + TInstanceHook(bool, "?baseUseItem@GameMode@@QEAA_NAEAVItemStack@@@Z", GameMode, ItemStack& it) { + auto pl = this->getPlayer(); + IF_LISTENED(PlayerUseItemEvent) { + PlayerUseItemEvent ev{}; + ev.mPlayer = pl; + ev.mItemStack = ⁢ + if (!ev.call()) + return false; + } + IF_LISTENED_END(PlayerUseItemEvent) // IF_LISTENED(PlayerEatEvent) { // if (it.getItem()->isFood() && (pl->isHungry() || pl->forceAllowEating())) { // PlayerEatEvent ev{}; @@ -1647,37 +1648,37 @@ TInstanceHook(bool, "?useItemOn@GameMode@@UEAA_NAEAVItemStack@@AEBVBlockPos@@EAE // } // } // IF_LISTENED_END(PlayerEatEvent) -// return original(this, it); -// } + return original(this, it); + } -// THook(ItemStack*, "?use@BucketItem@@UEBAAEAVItemStack@@AEAV2@AEAVPlayer@@@Z", Item* _this, ItemStack* a1, Player* a2) { -// if (_this->getFullItemName() == "minecraft:milk_bucket") { -// IF_LISTENED(PlayerEatEvent) { -// PlayerEatEvent ev{}; -// ev.mPlayer = a2; -// ev.mFoodItem = a1; -// if (!ev.call()) { -// return a1; -// } -// } -// IF_LISTENED_END(PlayerEatEvent) -// } -// return original(_this, a1, a2); -// } + THook(ItemStack*, "?use@BucketItem@@UEBAAEAVItemStack@@AEAV2@AEAVPlayer@@@Z", Item* _this, ItemStack* a1, Player* a2) { + if (_this->getFullItemName() == "minecraft:milk_bucket") { + IF_LISTENED(PlayerEatEvent) { + PlayerEatEvent ev{}; + ev.mPlayer = a2; + ev.mFoodItem = a1; + if (!ev.call()) { + return a1; + } + } + IF_LISTENED_END(PlayerEatEvent) + } + return original(_this, a1, a2); + } -// THook(ItemStack*, "?use@PotionItem@@UEBAAEAVItemStack@@AEAV2@AEAVPlayer@@@Z", void* _this, ItemStack* a1, Player* a2) { -// IF_LISTENED(PlayerEatEvent) { -// PlayerEatEvent ev{}; -// ev.mPlayer = a2; -// ev.mFoodItem = a1; -// if (!ev.call()) { -// return a1; -// } -// } -// IF_LISTENED_END(PlayerEatEvent) -// return original(_this, a1, a2); -// } + THook(ItemStack*, "?use@PotionItem@@UEBAAEAVItemStack@@AEAV2@AEAVPlayer@@@Z", void* _this, ItemStack* a1, Player* a2) { + IF_LISTENED(PlayerEatEvent) { + PlayerEatEvent ev{}; + ev.mPlayer = a2; + ev.mFoodItem = a1; + if (!ev.call()) { + return a1; + } + } + IF_LISTENED_END(PlayerEatEvent) + return original(_this, a1, a2); + } /////////////////// MobDie /////////////////// TInstanceHook(bool, "?die@Mob@@UEAAXAEBVActorDamageSource@@@Z", Mob, ActorDamageSource* ads) { @@ -2140,11 +2141,11 @@ TClasslessInstanceHook(void, "?handle@?$PacketHandlerDispatcherInstance@VModalFo ServerPlayer* sp = handler->getServerPlayer(*id, 0); if (sp) { string data; - auto formId = dAccess(packet, 48); + auto formId = dAccess(packet, 48);//未验证 - if (!dAccess(packet, 81)) { - if (dAccess(packet, 72)) { - auto json = dAccess(packet, 56); + if (!dAccess(packet, 81)) {//未验证 + if (dAccess(packet, 72)) {//未验证 + auto json = dAccess(packet, 56);//未验证 data = json.toStyledString(); } } diff --git a/LiteLoader/Kernel/MC/LevelAPI.cpp b/LiteLoader/Kernel/MC/LevelAPI.cpp index 342e890..b0417a8 100644 --- a/LiteLoader/Kernel/MC/LevelAPI.cpp +++ b/LiteLoader/Kernel/MC/LevelAPI.cpp @@ -294,6 +294,7 @@ Player* Level::getPlayer(const string& info) { Player* Level::getPlayer(ActorUniqueID id) { // 裂开,这个符号也没有 + //根据伪代码重新写实现 Actor* actor = Level::fetchEntity(id,0); if(actor && actor->hasCategory((ActorCategory)1)) return (Player*)actor;