From 3000d81bd32558bb1693f9e804b55b137db17de2 Mon Sep 17 00:00:00 2001 From: MikeIsAStar <99037623+MikeIsAStar@users.noreply.github.com> Date: Tue, 16 Jan 2024 07:45:00 -0500 Subject: [PATCH] [MKW] Ensure that invalid items can not be used nor thrown --- payload/import/mkwItem.hpp | 92 ++++++++++++++++++++++++++++++++++++-- payload/import/mkwNet.hpp | 44 +++++++++++++++--- 2 files changed, 128 insertions(+), 8 deletions(-) diff --git a/payload/import/mkwItem.hpp b/payload/import/mkwItem.hpp index 8c802c1..796734f 100644 --- a/payload/import/mkwItem.hpp +++ b/payload/import/mkwItem.hpp @@ -48,8 +48,14 @@ enum class ItemObject { NoObject = 0x10, }; +enum class UseType { + Use = 0, + Throw = 1, +}; + struct ItemBehaviourEntry { - /* 0x00 */ u8 _00[0x18 - 0x00]; + /* 0x00 */ u8 _00[0x14 - 0x00]; + /* 0x14 */ UseType useType; /* 0x18 */ void (*useFunction)(void* kartItem); }; @@ -59,11 +65,37 @@ extern ItemBehaviourEntry itemBehaviourTable[0x13] AT( RMCXD_PORT(0x809C36A0, 0x809BEE98, 0x809C2700, 0x809B1CE0) ); +static bool CanUseItem(ItemBox item) +{ + if (item == ItemBox::NoItem) { + return false; + } + + u8 itemToUse = static_cast(item); + + return itemBehaviourTable[itemToUse].useType == UseType::Use; +} + +static bool CanThrowItem(ItemBox item) +{ + if (item == ItemBox::NoItem) { + return false; + } + + u8 itemToThrow = static_cast(item); + + return itemBehaviourTable[itemToThrow].useType == UseType::Throw; +} + static bool CanTrailItem(ItemBox item) { - u8 trailedItem = static_cast(item); + if (item == ItemBox::NoItem) { + return false; + } + + u8 itemToTrail = static_cast(item); - return !itemBehaviourTable[trailedItem].useFunction; + return !itemBehaviourTable[itemToTrail].useFunction; } static bool IsHeldItemValidVS(ItemBox item) @@ -161,4 +193,58 @@ static bool IsItemObjectValid(ItemObject itemObject) } } +static ItemBox ItemObjectToItemBox(ItemObject itemObject) +{ + switch (itemObject) { + case ItemObject::GreenShell: { + return ItemBox::GreenShell; + } + case ItemObject::RedShell: { + return ItemBox::RedShell; + } + case ItemObject::Banana: { + return ItemBox::Banana; + } + case ItemObject::Mushroom: { + return ItemBox::Mushroom; + } + case ItemObject::Star: { + return ItemBox::Star; + } + case ItemObject::BlueShell: { + return ItemBox::BlueShell; + } + case ItemObject::Lightning: { + return ItemBox::Lightning; + } + case ItemObject::FakeItemBox: { + return ItemBox::FakeItemBox; + } + case ItemObject::MegaMushroom: { + return ItemBox::MegaMushroom; + } + case ItemObject::Bob_omb: { + return ItemBox::Bob_omb; + } + case ItemObject::Blooper: { + return ItemBox::Blooper; + } + case ItemObject::POWBlock: { + return ItemBox::POWBlock; + } + case ItemObject::GoldenMushroom: { + return ItemBox::GoldenMushroom; + } + case ItemObject::BulletBill: { + return ItemBox::BulletBill; + } + case ItemObject::ThunderCloud: { + return ItemBox::ThunderCloud; + } + default: { + return ItemBox::NoItem; + } + } +} + } // namespace mkw::Item diff --git a/payload/import/mkwNet.hpp b/payload/import/mkwNet.hpp index 56aba6b..d5ef9da 100644 --- a/payload/import/mkwNet.hpp +++ b/payload/import/mkwNet.hpp @@ -228,6 +228,12 @@ class EVENTHandler public: struct Packet { struct EventInfo { + enum class EventType : u8 { + NoEvent = 0, + ItemUsed = 1, + ItemThrown = 2, + }; + bool isItemObjectValid() const { using namespace mkw::Item; @@ -235,12 +241,38 @@ class EVENTHandler return IsItemObjectValid(static_cast(itemObject)); } + bool isValid() const + { + using namespace mkw::Item; + + if (!isItemObjectValid()) { + return false; + } + + ItemObject item = static_cast(itemObject); + + switch (eventType) { + case EventType::NoEvent: { + return item == ItemObject::NoObject; + } + case EventType::ItemUsed: { + return CanUseItem(ItemObjectToItemBox(item)); + } + case EventType::ItemThrown: { + return CanThrowItem(ItemObjectToItemBox(item)); + } + default: { + return true; + } + } + } + u8 getEventDataSize() const { return GetEventDataSize(itemObject, eventType); } - /* 0x00 */ u8 eventType : 3; + /* 0x00 */ EventType eventType : 3; /* 0x00 */ u8 itemObject : 5; }; @@ -251,7 +283,7 @@ class EVENTHandler u32 expectedPacketSize = sizeof(eventInfo); for (size_t n = 0; n < sizeof(eventInfo); n++) { - if (!eventInfo[n].isItemObjectValid()) { + if (!eventInfo[n].isValid()) { return false; } @@ -267,10 +299,12 @@ class EVENTHandler static_assert(sizeof(Packet) == 0xF8); - static u8 GetEventDataSize(u8 itemObject, u8 eventType) + static u8 + GetEventDataSize(u8 itemObject, Packet::EventInfo::EventType eventType) { - LONGCALL u8 GetEventDataSize(u8 itemObject, u8 eventType) - AT(RMCXD_PORT(0x8079D76C, 0x80794760, 0x8079CDD8, 0x8078BB2C)); + LONGCALL u8 GetEventDataSize( + u8 itemObject, Packet::EventInfo::EventType eventType + ) AT(RMCXD_PORT(0x8079D76C, 0x80794760, 0x8079CDD8, 0x8078BB2C)); return GetEventDataSize(itemObject, eventType); }