Browse Source

Introduce GetLevelForMultiplayer

pull/4727/head
obligaron 4 years ago committed by Anders Jenbo
parent
commit
22a113d3a6
  1. 4
      Source/monster.cpp
  2. 35
      Source/msg.cpp
  3. 1
      Source/msg.h
  4. 4
      Source/sync.cpp

4
Source/monster.cpp

@ -4011,7 +4011,7 @@ void M_StartKill(int i, int pnum)
if (i != pnum) {
NetSendCmdLocParam1(false, CMD_MONSTDEATH, monster.position.tile, i);
} else {
NetSendCmdLocParam1(false, CMD_KILLGOLEM, monster.position.tile, currlevel);
NetSendCmdLoc(MyPlayerId, false, CMD_KILLGOLEM, monster.position.tile);
}
}
@ -4900,7 +4900,7 @@ void SpawnGolem(int i, Point position, Missile &missile)
golem._mdir,
golem._menemy,
golem._mhitpoints,
currlevel);
GetLevelForMultiplayer(player));
}
}

35
Source/msg.cpp

@ -139,7 +139,8 @@ DLevel &GetDeltaLevel(uint8_t level)
/** @brief Gets a delta level. */
DLevel &GetDeltaLevel(const Player &player)
{
return GetDeltaLevel(player.plrlevel);
uint8_t level = GetLevelForMultiplayer(player);
return GetDeltaLevel(level);
}
/**
@ -870,9 +871,10 @@ DWORD OnGetItem(const TCmd *pCmd, int pnum)
} else if (IsGItemValid(message)) {
const Point position { message.x, message.y };
if (DeltaGetItem(message, message.bLevel)) {
if ((currlevel == message.bLevel || message.bPnum == MyPlayerId) && message.bMaster != MyPlayerId) {
bool isOnActiveLevel = GetLevelForMultiplayer(*MyPlayer) == message.bLevel;
if ((isOnActiveLevel || message.bPnum == MyPlayerId) && message.bMaster != MyPlayerId) {
if (message.bPnum == MyPlayerId) {
if (currlevel != message.bLevel) {
if (!isOnActiveLevel) {
int ii = SyncPutItem(*MyPlayer, MyPlayer->position.tile, message.wIndx, message.wCI, message.dwSeed, message.bId, message.bDur, message.bMDur, message.bCh, message.bMCh, message.wValue, message.dwBuff, message.wToHit, message.wMaxDam, message.bMinStr, message.bMinMag, message.bMinDex, message.bAC);
if (ii != -1)
InvGetItem(*MyPlayer, ii);
@ -938,9 +940,10 @@ DWORD OnAutoGetItem(const TCmd *pCmd, int pnum)
} else if (IsGItemValid(message)) {
const Point position { message.x, message.y };
if (DeltaGetItem(message, message.bLevel)) {
if ((currlevel == message.bLevel || message.bPnum == MyPlayerId) && message.bMaster != MyPlayerId) {
uint8_t localLevel = GetLevelForMultiplayer(*MyPlayer);
if ((localLevel == message.bLevel || message.bPnum == MyPlayerId) && message.bMaster != MyPlayerId) {
if (message.bPnum == MyPlayerId) {
if (currlevel != message.bLevel) {
if (localLevel != message.bLevel) {
Player &player = *MyPlayer;
int ii = SyncPutItem(player, player.position.tile, message.wIndx, message.wCI, message.dwSeed, message.bId, message.bDur, message.bMDur, message.bCh, message.bMCh, message.wValue, message.dwBuff, message.wToHit, message.wMaxDam, message.bMinStr, message.bMinMag, message.bMinDex, message.bAC);
if (ii != -1)
@ -1531,12 +1534,12 @@ DWORD OnMonstDeath(const TCmd *pCmd, int pnum)
DWORD OnKillGolem(const TCmd *pCmd, int pnum)
{
const auto &message = *reinterpret_cast<const TCmdLocParam1 *>(pCmd);
const auto &message = *reinterpret_cast<const TCmdLoc *>(pCmd);
const Point position { message.x, message.y };
if (gbBufferMsgs == 1)
SendPacket(pnum, &message, sizeof(message));
else if (pnum != MyPlayerId && InDungeonBounds(position) && message.wParam1 < NUMLEVELS) {
else if (pnum != MyPlayerId && InDungeonBounds(position)) {
Player &player = Players[pnum];
if (player.isOnActiveLevel())
M_SyncStartKill(pnum, position, pnum);
@ -2275,7 +2278,8 @@ void DeltaAddItem(int ii)
if (!gbIsMultiplayer)
return;
DLevel &deltaLevel = GetDeltaLevel(currlevel);
uint8_t localLevel = GetLevelForMultiplayer(*MyPlayer);
DLevel &deltaLevel = GetDeltaLevel(localLevel);
for (const TCmdPItem &item : deltaLevel.item) {
if (item.bCmd != CMD_INVALID
@ -2325,7 +2329,8 @@ void DeltaSaveLevel()
ResetPlayerGFX(Players[i]);
}
MyPlayer->_pLvlVisited[currlevel] = true;
DeltaLeaveSync(currlevel);
uint8_t localLevel = currlevel;
DeltaLeaveSync(localLevel);
}
namespace {
@ -2351,13 +2356,19 @@ Point GetItemPosition(Point position)
} // namespace
uint8_t GetLevelForMultiplayer(const Player &player)
{
return player.plrlevel;
}
void DeltaLoadLevel()
{
if (!gbIsMultiplayer)
return;
deltaload = true;
DLevel &deltaLevel = GetDeltaLevel(currlevel);
uint8_t localLevel = GetLevelForMultiplayer(*MyPlayer);
DLevel &deltaLevel = GetDeltaLevel(localLevel);
if (leveltype != DTYPE_TOWN) {
for (int i = 0; i < ActiveMonsterCount; i++) {
if (deltaLevel.monster[i]._mx == 0xFF)
@ -2399,7 +2410,7 @@ void DeltaLoadLevel()
monster._msquelch = deltaLevel.monster[i]._mactive;
}
}
auto localLevelIt = LocalLevels.find(currlevel);
auto localLevelIt = LocalLevels.find(localLevel);
if (localLevelIt != LocalLevels.end())
memcpy(AutomapView, &localLevelIt->second, sizeof(AutomapView));
else
@ -2710,7 +2721,7 @@ void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, uint8_t mast, uint8_t pnum, uint
cmd.bCmd = bCmd;
cmd.bPnum = pnum;
cmd.bMaster = mast;
cmd.bLevel = currlevel;
cmd.bLevel = GetLevelForMultiplayer(*MyPlayer);
cmd.bCursitem = ii;
cmd.dwTime = 0;
cmd.x = Items[ii].position.x;

1
Source/msg.h

@ -724,6 +724,7 @@ void delta_init();
void delta_kill_monster(int mi, Point position, const Player &player);
void delta_monster_hp(int mi, int hp, const Player &player);
void delta_sync_monster(const TSyncMonster &monsterSync, uint8_t level);
uint8_t GetLevelForMultiplayer(const Player &player);
void DeltaAddItem(int ii);
void DeltaSaveLevel();
void DeltaLoadLevel();

4
Source/sync.cpp

@ -260,7 +260,7 @@ uint32_t sync_all_monsters(byte *pbBuf, uint32_t dwMaxLen)
dwMaxLen -= sizeof(TSyncHeader);
pHdr->bCmd = CMD_SYNCDATA;
pHdr->bLevel = currlevel;
pHdr->bLevel = GetLevelForMultiplayer(*MyPlayer);
pHdr->wLen = 0;
SyncPlrInv(pHdr);
assert(dwMaxLen <= 0xffff);
@ -311,7 +311,7 @@ uint32_t OnSyncData(const TCmd *pCmd, int pnum)
if (!IsTSyncMonsterValidate(monsterSyncs[i]))
continue;
if (currlevel == level) {
if (GetLevelForMultiplayer(*MyPlayer) == level) {
SyncMonster(pnum, monsterSyncs[i]);
}

Loading…
Cancel
Save