diff --git a/Source/inv.cpp b/Source/inv.cpp index b00e5961c..26770c7c1 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -867,7 +867,9 @@ void CheckQuestItem(Player &player, Item &questItem) { Player &myPlayer = *MyPlayer; - if (questItem.IDidx == IDI_OPTAMULET && Quests[Q_BLIND]._qactive == QUEST_ACTIVE) { + if (Quests[Q_BLIND]._qactive == QUEST_ACTIVE + && (questItem.IDidx == IDI_OPTAMULET + || (gbIsMultiplayer && Quests[Q_BLIND].IsAvailable() && questItem.position == (SetPiece.position.megaToWorld() + Displacement { 5, 5 })))) { Quests[Q_BLIND]._qactive = QUEST_DONE; NetSendCmdQuest(true, Quests[Q_BLIND]); } @@ -902,7 +904,9 @@ void CheckQuestItem(Player &player, Item &questItem) } } - if (questItem.IDidx == IDI_ARMOFVAL && Quests[Q_BLOOD]._qactive == QUEST_ACTIVE) { + if (Quests[Q_BLOOD]._qactive == QUEST_ACTIVE + && (questItem.IDidx == IDI_ARMOFVAL + || (gbIsMultiplayer && Quests[Q_BLOOD].IsAvailable() && questItem.position == (SetPiece.position.megaToWorld() + Displacement { 9, 3 })))) { Quests[Q_BLOOD]._qactive = QUEST_DONE; NetSendCmdQuest(true, Quests[Q_BLOOD]); myPlayer.Say(HeroSpeech::MayTheSpiritOfArkaineProtectMe, 20); diff --git a/Source/items.cpp b/Source/items.cpp index 00d733abb..706611966 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -3205,14 +3205,19 @@ void SetupItem(Item &item) item._iIdentified = false; } -Item *SpawnUnique(_unique_items uid, Point position, std::optional level /*= std::nullopt*/, bool sendmsg /*= true*/) +Item *SpawnUnique(_unique_items uid, Point position, std::optional level /*= std::nullopt*/, bool sendmsg /*= true*/, bool exactPosition /*= false*/) { if (ActiveItemCount >= MAXITEMS) return nullptr; int ii = AllocateItem(); auto &item = Items[ii]; - GetSuperItemSpace(position, ii); + if (exactPosition && CanPut(position)) { + item.position = position; + dItem[position.x][position.y] = ii + 1; + } else { + GetSuperItemSpace(position, ii); + } int curlv = ItemsGetCurrlevel(); std::underlying_type_t<_item_indexes> idx = 0; diff --git a/Source/items.h b/Source/items.h index 1330645ed..cbfdb4601 100644 --- a/Source/items.h +++ b/Source/items.h @@ -509,7 +509,7 @@ uint8_t PlaceItemInWorld(Item &&item, WorldTilePosition position); Point GetSuperItemLoc(Point position); void GetItemAttrs(Item &item, _item_indexes itemData, int lvl); void SetupItem(Item &item); -Item *SpawnUnique(_unique_items uid, Point position, std::optional level = std::nullopt, bool sendmsg = true); +Item *SpawnUnique(_unique_items uid, Point position, std::optional level = std::nullopt, bool sendmsg = true, bool exactPosition = false); void SpawnItem(Monster &monster, Point position, bool sendmsg, bool spawn = false); void CreateRndItem(Point position, bool onlygood, bool sendmsg, bool delta); void CreateRndUseful(Point position, bool sendmsg); diff --git a/Source/objects.cpp b/Source/objects.cpp index 36d336c55..6ea5708d6 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -2042,7 +2042,7 @@ void OperateBookLever(Object &questBook, bool sendmsg) ObjChangeMap(questBook._oVar1, questBook._oVar2, questBook._oVar3, questBook._oVar4); if (questBook._otype == OBJ_BLINDBOOK) { if (sendmsg) - SpawnUnique(UITEM_OPTAMULET, SetPiece.position.megaToWorld() + Displacement { 5, 5 }); + SpawnUnique(UITEM_OPTAMULET, SetPiece.position.megaToWorld() + Displacement { 5, 5 }, std::nullopt, true, true); auto tren = TransVal; TransVal = 9; DRLG_MRectTrans(WorldTilePosition(questBook._oVar1, questBook._oVar2), WorldTilePosition(questBook._oVar3, questBook._oVar4)); @@ -2329,7 +2329,7 @@ void OperatePedestal(Player &player, Object &pedestal, bool sendmsg) ObjChangeMap(pedestal._oVar1, pedestal._oVar2, pedestal._oVar3, pedestal._oVar4); LoadMapObjects("levels\\l2data\\blood2.dun", SetPiece.position.megaToWorld()); if (sendmsg) - SpawnUnique(UITEM_ARMOFVAL, SetPiece.position.megaToWorld() + Displacement { 9, 3 }); + SpawnUnique(UITEM_ARMOFVAL, SetPiece.position.megaToWorld() + Displacement { 9, 3 }, std::nullopt, true, true); pedestal._oSelFlag = 0; } }