Browse Source

Spawn Optic Amulet and Arkaine's Valor always at the same tile (#6167)

* Spawn Optic Amulet and Arkaine's Valor always at the same tile

* Multiplayer: To complete Halls of Blind and Arkaine's Valor also check drop position, because quest rewards items can be randomized
pull/6169/head
obligaron 3 years ago committed by GitHub
parent
commit
c8f1804d04
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 8
      Source/inv.cpp
  2. 9
      Source/items.cpp
  3. 2
      Source/items.h
  4. 4
      Source/objects.cpp

8
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);

9
Source/items.cpp

@ -3205,14 +3205,19 @@ void SetupItem(Item &item)
item._iIdentified = false;
}
Item *SpawnUnique(_unique_items uid, Point position, std::optional<int> level /*= std::nullopt*/, bool sendmsg /*= true*/)
Item *SpawnUnique(_unique_items uid, Point position, std::optional<int> 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;

2
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<int> level = std::nullopt, bool sendmsg = true);
Item *SpawnUnique(_unique_items uid, Point position, std::optional<int> 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);

4
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;
}
}

Loading…
Cancel
Save