diff --git a/Source/inv.cpp b/Source/inv.cpp index 795154d20..398599995 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -924,6 +924,7 @@ void CheckQuestItem(Player &player, Item &questItem) if (questItem.IDidx == IDI_ARMOFVAL && Quests[Q_BLOOD]._qactive == QUEST_ACTIVE) { Quests[Q_BLOOD]._qactive = QUEST_DONE; + NetSendCmdQuest(true, Quests[Q_BLOOD]); myPlayer.Say(HeroSpeech::MayTheSpiritOfArkaineProtectMe, 20); } diff --git a/Source/objects.cpp b/Source/objects.cpp index 253bb3c74..cd2cb59e8 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -1992,7 +1992,9 @@ void OperateBookLever(Object &questBook, bool sendmsg) Quests[Q_BLOOD]._qactive = QUEST_ACTIVE; Quests[Q_BLOOD]._qlog = true; Quests[Q_BLOOD]._qvar1 = 1; - SpawnQuestItem(IDI_BLDSTONE, SetPiece.position.megaToWorld() + Displacement { 9, 17 }, 0, 1, true); + NetSendCmdQuest(true, Quests[Q_BLOOD]); + if (sendmsg) + SpawnQuestItem(IDI_BLDSTONE, SetPiece.position.megaToWorld() + Displacement { 9, 17 }, 0, 1, true); } if (questBook._otype == OBJ_STEELTOME && Quests[Q_WARLORD]._qvar1 == 0) { Quests[Q_WARLORD]._qactive = QUEST_ACTIVE; @@ -2241,7 +2243,7 @@ void OperateSarcophagus(Object &sarcophagus, bool sendMsg, bool sendLootMsg) NetSendCmdLoc(MyPlayerId, false, CMD_OPERATEOBJ, sarcophagus.position); } -void OperatePedestal(Player &player, Object &pedestal) +void OperatePedestal(Player &player, Object &pedestal, bool sendmsg) { if (ActiveItemCount >= MAXITEMS) { return; @@ -2256,20 +2258,32 @@ void OperatePedestal(Player &player, Object &pedestal) if (pedestal._oVar6 == 1) { PlaySfxLoc(LS_PUDDLE, pedestal.position); ObjChangeMap(SetPiece.position.x, SetPiece.position.y + 3, SetPiece.position.x + 2, SetPiece.position.y + 7); - SpawnQuestItem(IDI_BLDSTONE, SetPiece.position.megaToWorld() + Displacement { 3, 10 }, 0, 1, true); + if (sendmsg) + SpawnQuestItem(IDI_BLDSTONE, SetPiece.position.megaToWorld() + Displacement { 3, 10 }, 0, 1, true); } if (pedestal._oVar6 == 2) { PlaySfxLoc(LS_PUDDLE, pedestal.position); ObjChangeMap(SetPiece.position.x + 6, SetPiece.position.y + 3, SetPiece.position.x + SetPiece.size.width, SetPiece.position.y + 7); - SpawnQuestItem(IDI_BLDSTONE, SetPiece.position.megaToWorld() + Displacement { 15, 10 }, 0, 1, true); + if (sendmsg) + SpawnQuestItem(IDI_BLDSTONE, SetPiece.position.megaToWorld() + Displacement { 15, 10 }, 0, 1, true); } if (pedestal._oVar6 == 3) { PlaySfxLoc(LS_BLODSTAR, pedestal.position); ObjChangeMap(pedestal._oVar1, pedestal._oVar2, pedestal._oVar3, pedestal._oVar4); LoadMapObjects("levels\\l2data\\blood2.dun", SetPiece.position.megaToWorld()); - SpawnUnique(UITEM_ARMOFVAL, SetPiece.position.megaToWorld() + Displacement { 9, 3 }); + if (sendmsg) + SpawnUnique(UITEM_ARMOFVAL, SetPiece.position.megaToWorld() + Displacement { 9, 3 }); pedestal._oSelFlag = 0; } + + if (sendmsg) { + NetSendCmdLoc(MyPlayerId, false, CMD_OPERATEOBJ, pedestal.position); + if (gbIsMultiplayer) { + // Store added stones to pedestal in qvar2, cause we get only one CMD_OPERATEOBJ from DeltaLoadLevel even if we add multiple stones + Quests[Q_BLOOD]._qvar2++; + NetSendCmdQuest(true, Quests[Q_BLOOD]); + } + } } void OperateShrineMysterious(Player &player) @@ -3548,20 +3562,30 @@ void SyncQSTLever(const Object &qstLever) } } -void SyncPedestal(const Object &pedestal, Point origin, int width) +void SyncPedestal(const Object &pedestal) { if (pedestal._oVar6 == 1) - ObjChangeMapResync(origin.x, origin.y + 3, origin.x + 2, origin.y + 7); + ObjChangeMapResync(SetPiece.position.x, SetPiece.position.y + 3, SetPiece.position.x + 2, SetPiece.position.y + 7); if (pedestal._oVar6 == 2) { - ObjChangeMapResync(origin.x, origin.y + 3, origin.x + 2, origin.y + 7); - ObjChangeMapResync(origin.x + 6, origin.y + 3, origin.x + width, origin.y + 7); + ObjChangeMapResync(SetPiece.position.x, SetPiece.position.y + 3, SetPiece.position.x + 2, SetPiece.position.y + 7); + ObjChangeMapResync(SetPiece.position.x + 6, SetPiece.position.y + 3, SetPiece.position.x + SetPiece.size.width, SetPiece.position.y + 7); } - if (pedestal._oVar6 == 3) { + if (pedestal._oVar6 >= 3) { ObjChangeMapResync(pedestal._oVar1, pedestal._oVar2, pedestal._oVar3, pedestal._oVar4); - LoadMapObjects("levels\\l2data\\blood2.dun", origin.megaToWorld()); + LoadMapObjects("levels\\l2data\\blood2.dun", SetPiece.position.megaToWorld()); } } +void UpdatePedestalState(Object &pedestal) +{ + int addedStones = Quests[Q_BLOOD]._qvar2; + pedestal._oAnimFrame += addedStones; + pedestal._oVar6 += addedStones; + SyncPedestal(pedestal); + if (pedestal._oVar6 >= 3) + pedestal._oSelFlag = 0; +} + void SyncDoor(Object &door) { if (door._oVar4 == DOOR_CLOSED) { @@ -4425,7 +4449,7 @@ void OperateObject(Player &player, Object &object) OperateStoryBook(object); break; case OBJ_PEDESTAL: - OperatePedestal(player, object); + OperatePedestal(player, object, sendmsg); break; case OBJ_WARWEAP: case OBJ_WEAPONRACK: @@ -4488,7 +4512,7 @@ void DeltaSyncOpObject(Object &object) case OBJ_BLINDBOOK: case OBJ_BLOODBOOK: case OBJ_STEELTOME: - UpdateState(object, object._oVar6); + object._oAnimFrame = object._oVar6; break; case OBJ_BOOKCASEL: case OBJ_BOOKCASER: @@ -4520,6 +4544,9 @@ void DeltaSyncOpObject(Object &object) UpdateState(object, object._oAnimFrame + 2); } break; + case OBJ_PEDESTAL: + UpdatePedestalState(object); + break; default: break; } @@ -4603,7 +4630,7 @@ void SyncOpObject(Player &player, int cmd, Object &object) OperateStoryBook(object); break; case OBJ_PEDESTAL: - OperatePedestal(player, object); + OperatePedestal(player, object, sendmsg); break; case OBJ_WARWEAP: case OBJ_WEAPONRACK: @@ -4711,7 +4738,7 @@ void SyncObjectAnim(Object &object) SyncQSTLever(object); break; case OBJ_PEDESTAL: - SyncPedestal(object, SetPiece.position, SetPiece.size.width); + SyncPedestal(object); break; default: break;