Browse Source

Fix Delta Items

pull/8341/head
Eric Robinson 4 months ago
parent
commit
e2af641c03
  1. 14
      Source/msg.cpp

14
Source/msg.cpp

@ -233,8 +233,10 @@ struct DSpawnedMonster {
int16_t golemSpellLevel; int16_t golemSpellLevel;
}; };
constexpr int MaxDeltaItems = MAXITEMS * 2;
struct DLevel { struct DLevel {
TCmdPItem item[MAXITEMS]; TCmdPItem item[MaxDeltaItems];
ankerl::unordered_dense::map<WorldTilePosition, DObjectStr> object; ankerl::unordered_dense::map<WorldTilePosition, DObjectStr> object;
ankerl::unordered_dense::map<size_t, DSpawnedMonster> spawnedMonsters; ankerl::unordered_dense::map<size_t, DSpawnedMonster> spawnedMonsters;
DMonsterStr monster[MaxMonsters]; DMonsterStr monster[MaxMonsters];
@ -531,7 +533,7 @@ int WaitForTurns()
std::byte *DeltaExportItem(std::byte *dst, const TCmdPItem *src) std::byte *DeltaExportItem(std::byte *dst, const TCmdPItem *src)
{ {
for (int i = 0; i < MAXITEMS; i++, src++) { for (int i = 0; i < MaxDeltaItems; i++, src++) {
if (src->bCmd == CMD_INVALID) { if (src->bCmd == CMD_INVALID) {
*dst++ = std::byte { 0xFF }; *dst++ = std::byte { 0xFF };
} else { } else {
@ -546,7 +548,7 @@ std::byte *DeltaExportItem(std::byte *dst, const TCmdPItem *src)
const std::byte *DeltaImportItem(const std::byte *src, const std::byte *end, TCmdPItem *dst) const std::byte *DeltaImportItem(const std::byte *src, const std::byte *end, TCmdPItem *dst)
{ {
size_t size = 0; size_t size = 0;
for (int i = 0; i < MAXITEMS; i++, dst++) { for (int i = 0; i < MaxDeltaItems; i++, dst++) {
if (&src[size] >= end) if (&src[size] >= end)
return nullptr; return nullptr;
if (src[size] == std::byte { 0xFF }) { if (src[size] == std::byte { 0xFF }) {
@ -1252,7 +1254,7 @@ size_t OnGotoGetItem(const TCmdLocParam1 &message, Player &player)
{ {
const Point position { message.x, message.y }; const Point position { message.x, message.y };
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && InDungeonBounds(position) && Swap16LE(message.wParam1) < MAXITEMS + 1) { if (gbBufferMsgs != 1 && player.isOnActiveLevel() && InDungeonBounds(position) && Swap16LE(message.wParam1) < MaxDeltaItems + 1) {
MakePlrPath(player, position, false); MakePlrPath(player, position, false);
player.destAction = ACTION_PICKUPITEM; player.destAction = ACTION_PICKUPITEM;
player.destParam1 = Swap16LE(message.wParam1); player.destParam1 = Swap16LE(message.wParam1);
@ -1267,7 +1269,7 @@ bool IsGItemValid(const TCmdGItem &message)
return false; return false;
if (message.bPnum >= Players.size()) if (message.bPnum >= Players.size())
return false; return false;
if (message.bCursitem >= MAXITEMS + 1) if (message.bCursitem >= MaxDeltaItems + 1)
return false; return false;
if (!IsValidLevelForMultiplayer(message.bLevel)) if (!IsValidLevelForMultiplayer(message.bLevel))
return false; return false;
@ -1504,7 +1506,7 @@ size_t OnGotoAutoGetItem(const TCmdLocParam1 &message, Player &player)
const Point position { message.x, message.y }; const Point position { message.x, message.y };
const uint16_t itemIdx = Swap16LE(message.wParam1); const uint16_t itemIdx = Swap16LE(message.wParam1);
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && InDungeonBounds(position) && itemIdx < MAXITEMS + 1) { if (gbBufferMsgs != 1 && player.isOnActiveLevel() && InDungeonBounds(position) && itemIdx < MaxDeltaItems + 1) {
MakePlrPath(player, position, false); MakePlrPath(player, position, false);
player.destAction = ACTION_PICKUPAITEM; player.destAction = ACTION_PICKUPAITEM;
player.destParam1 = itemIdx; player.destParam1 = itemIdx;

Loading…
Cancel
Save