diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 65d5e9caf..ac42f5e4e 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -103,6 +103,7 @@ SET(common_headers crash.h crc16.h crc32.h + data_verification.h database.h dbcore.h debug.h diff --git a/common/data_verification.h b/common/data_verification.h index d42f72aac..9da85a579 100644 --- a/common/data_verification.h +++ b/common/data_verification.h @@ -38,6 +38,11 @@ T ClampUpper(const T& value, const T& upper) { return std::min(value, upper); } +template +bool ValueWithin(const T& value, const T& lower, const T& upper) { + return value >= lower && value <= upper; +} + } #endif diff --git a/common/database.h b/common/database.h index c4d3af336..a24198ca4 100644 --- a/common/database.h +++ b/common/database.h @@ -26,12 +26,6 @@ #include "dbcore.h" #include "linked_list.h" #include "eq_packet_structs.h" -/*#include "eq_stream.h" -#include "guilds.h" -#include "misc_functions.h" -#include "mutex.h" -#include "item.h" -#include "extprofile.h"*/ #include #include #include diff --git a/tests/data_verification_test.h b/tests/data_verification_test.h index 1a151c7fa..b9eb210fa 100644 --- a/tests/data_verification_test.h +++ b/tests/data_verification_test.h @@ -29,6 +29,7 @@ public: TEST_ADD(DataVerificationTest::Clamp); TEST_ADD(DataVerificationTest::ClampUpper); TEST_ADD(DataVerificationTest::ClampLower); + TEST_ADD(DataVerificationTest::ValueWithin); } ~DataVerificationTest() { @@ -89,6 +90,19 @@ public: TEST_ASSERT_EQUALS(vi1, 500); TEST_ASSERT_EQUALS(vi2, 750); } + + void ValueWithin() { + float value_f = 500.0f; + int value_i = 500; + + TEST_ASSERT(EQEmu::ValueWithin(value_f, 0.0f, 1000.0f)); + TEST_ASSERT(!EQEmu::ValueWithin(value_f, 0.0f, 400.0f)); + TEST_ASSERT(!EQEmu::ValueWithin(value_f, 600.0f, 900.0f)); + + TEST_ASSERT(EQEmu::ValueWithin(value_i, 0, 1000)); + TEST_ASSERT(!EQEmu::ValueWithin(value_i, 0, 400)); + TEST_ASSERT(!EQEmu::ValueWithin(value_i, 600, 900)); + } }; #endif diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 62e31c075..0061efff4 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -48,6 +48,7 @@ #include "../common/guilds.h" #include "../common/rulesys.h" #include "../common/spdat.h" +#include "../common/data_verification.h" #include "petitions.h" #include "npc_ai.h" #include "../common/skills.h" @@ -10490,7 +10491,13 @@ void Client::Handle_OP_PotionBelt(const EQApplicationPacket *app) DumpPacket(app); return; } + MovePotionToBelt_Struct *mptbs = (MovePotionToBelt_Struct*)app->pBuffer; + if(!EQEmu::ValueWithin(mptbs->SlotNumber, 0U, 3U)) { + LogFile->write(EQEMuLog::Debug, "Client::Handle_OP_PotionBelt mptbs->SlotNumber out of range."); + return; + } + if (mptbs->Action == 0) { const Item_Struct *BaseItem = database.GetItem(mptbs->ItemID); if (BaseItem) { diff --git a/zone/lua_packet.cpp b/zone/lua_packet.cpp index deff0f0f2..e16a85c6d 100644 --- a/zone/lua_packet.cpp +++ b/zone/lua_packet.cpp @@ -301,6 +301,7 @@ luabind::scope lua_register_packet() { .def("ReadFixedLengthString", &Lua_Packet::ReadFixedLengthString); } +//TODO: Reorder these to match emu_oplist.h again luabind::scope lua_register_packet_opcodes() { return luabind::class_("Opcode") .enum_("constants") diff --git a/zone/zonedb.cpp b/zone/zonedb.cpp index 3728e3144..b49837704 100644 --- a/zone/zonedb.cpp +++ b/zone/zonedb.cpp @@ -1178,8 +1178,14 @@ bool ZoneDatabase::LoadCharacterPotions(uint32 character_id, PlayerProfile_Struc } for (auto row = results.begin(); row != results.end(); ++row) { i = atoi(row[0]); /* Potion belt slot number */ - pp->potionbelt.items[i].item_id = atoi(row[1]); - pp->potionbelt.items[i].icon = atoi(row[2]); + uint32 item_id = atoi(row[1]); + const Item_Struct *item = database.GetItem(item_id); + + if(item) { + pp->potionbelt.items[i].item_id = item_id; + pp->potionbelt.items[i].icon = atoi(row[2]); + strncpy(pp->potionbelt.items[i].item_name, item->Name, 64); + } } return true; }