diff --git a/Source/monster.cpp b/Source/monster.cpp index 0e3ab430d..7c1cb9ec7 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -1426,6 +1426,7 @@ void MonsterTalk(Monster &monster) if (Quests[Q_LTBANNER]._qactive == QUEST_INIT) Quests[Q_LTBANNER]._qactive = QUEST_ACTIVE; monster.flags |= MFLAG_QUEST_COMPLETE; + NetSendCmdQuest(true, Quests[Q_LTBANNER]); } if (Quests[Q_LTBANNER]._qvar1 < 2) { app_fatal(StrCat("SS Talk = ", monster.talkMsg, ", Flags = ", monster.flags)); @@ -2563,6 +2564,7 @@ void SnotSpilAi(Monster &monster) if (!effect_is_playing(USFX_SNOT3) && monster.goal == MonsterGoal::Talking) { ObjChangeMap(SetPiece.position.x, SetPiece.position.y, SetPiece.position.x + SetPiece.size.width + 1, SetPiece.position.y + SetPiece.size.height + 1); Quests[Q_LTBANNER]._qvar1 = 3; + NetSendCmdQuest(true, Quests[Q_LTBANNER]); RedoPlayerVision(); monster.activeForTicks = UINT8_MAX; monster.talkMsg = TEXT_NONE; @@ -4485,6 +4487,7 @@ void TalktoMonster(Player &player, Monster &monster) Quests[Q_LTBANNER]._qactive = QUEST_DONE; monster.talkMsg = TEXT_BANNER12; monster.goal = MonsterGoal::Inquiring; + NetSendCmdQuest(true, Quests[Q_LTBANNER]); } } if (Quests[Q_VEIL].IsAvailable() && monster.talkMsg >= TEXT_VEIL9) { diff --git a/Source/quests.cpp b/Source/quests.cpp index e07aa4a0c..e003e6ee5 100644 --- a/Source/quests.cpp +++ b/Source/quests.cpp @@ -609,6 +609,7 @@ void ResyncQuests() return; if (Quests[Q_LTBANNER].IsAvailable()) { + Monster *snotSpill = FindUniqueMonster(UniqueMonsterType::SnotSpill); if (Quests[Q_LTBANNER]._qvar1 == 1) { ObjChangeMapResync( SetPiece.position.x + SetPiece.size.width - 2, @@ -629,6 +630,11 @@ void ResyncQuests() TransVal = 9; DRLG_MRectTrans({ SetPiece.position, WorldTileSize(SetPiece.size.width / 2 + 4, SetPiece.size.height / 2) }); TransVal = tren; + if (gbIsMultiplayer && snotSpill != nullptr && snotSpill->talkMsg != TEXT_BANNER12) { + snotSpill->goal = MonsterGoal::Inquiring; + snotSpill->talkMsg = Quests[Q_LTBANNER]._qactive == QUEST_DONE ? TEXT_BANNER12 : TEXT_BANNER11; + snotSpill->flags |= MFLAG_QUEST_COMPLETE; + } } if (Quests[Q_LTBANNER]._qvar1 == 3) { ObjChangeMapResync(SetPiece.position.x, SetPiece.position.y, SetPiece.position.x + SetPiece.size.width + 1, SetPiece.position.y + SetPiece.size.height + 1); @@ -638,6 +644,13 @@ void ResyncQuests() TransVal = 9; DRLG_MRectTrans({ SetPiece.position, WorldTileSize(SetPiece.size.width / 2 + 4, SetPiece.size.height / 2) }); TransVal = tren; + if (gbIsMultiplayer && snotSpill != nullptr) { + snotSpill->goal = MonsterGoal::Normal; + snotSpill->flags |= MFLAG_QUEST_COMPLETE; + snotSpill->talkMsg = TEXT_NONE; + snotSpill->activeForTicks = UINT8_MAX; + RedoPlayerVision(); + } } } if (currlevel == Quests[Q_MUSHROOM]._qlevel) { diff --git a/Source/towners.cpp b/Source/towners.cpp index bbc8a77d9..efa850eb4 100644 --- a/Source/towners.cpp +++ b/Source/towners.cpp @@ -326,6 +326,7 @@ void TalkToBarOwner(Player &player, Towner &barOwner) bannerQuest._qactive = QUEST_ACTIVE; } bannerQuest._qlog = true; + NetSendCmdQuest(true, bannerQuest); InitQTextMsg(TEXT_BANNER2); return; } @@ -333,6 +334,7 @@ void TalkToBarOwner(Player &player, Towner &barOwner) if (bannerQuest._qvar2 == 1 && RemoveInventoryItemById(player, IDI_BANNER)) { bannerQuest._qactive = QUEST_DONE; bannerQuest._qvar1 = 3; + NetSendCmdQuest(true, bannerQuest); SpawnUnique(UITEM_HARCREST, barOwner.position + Direction::SouthWest); InitQTextMsg(TEXT_BANNER3); return;