Browse Source

In multiplayer randomly drop unique quest reward or magic item of same type

pull/6168/head
obligaron 3 years ago committed by Anders Jenbo
parent
commit
571e770e68
  1. 21
      Source/items.cpp
  2. 2
      Source/items.h
  3. 10
      Source/towners.cpp

21
Source/items.cpp

@ -3205,7 +3205,7 @@ void SetupItem(Item &item)
item._iIdentified = false;
}
Item *SpawnUnique(_unique_items uid, Point position, bool sendmsg /*= true*/)
Item *SpawnUnique(_unique_items uid, Point position, std::optional<int> level /*= std::nullopt*/, bool sendmsg /*= true*/)
{
if (ActiveItemCount >= MAXITEMS)
return nullptr;
@ -3219,9 +3219,20 @@ Item *SpawnUnique(_unique_items uid, Point position, bool sendmsg /*= true*/)
while (AllItemsList[idx].iItemId != UniqueItems[uid].UIItemId)
idx++;
GetItemAttrs(item, static_cast<_item_indexes>(idx), curlv);
GetUniqueItem(*MyPlayer, item, uid);
SetupItem(item);
if (gbIsMultiplayer) {
if (level)
curlv = *level;
const ItemData &uniqueItemData = AllItemsList[idx];
_item_indexes idx = GetItemIndexForDroppableItem(false, [&uniqueItemData](const ItemData &item) {
return item.itype == uniqueItemData.itype || (uniqueItemData.itype == ItemType::Amulet && item.itype == ItemType::Ring);
});
SetupAllItems(*MyPlayer, item, idx, AdvanceRndSeed(), curlv * 2, 15, true, false, false);
}
if (!gbIsMultiplayer || item._iMagical == ITEM_QUALITY_UNIQUE) {
GetItemAttrs(item, static_cast<_item_indexes>(idx), curlv);
GetUniqueItem(*MyPlayer, item, uid);
SetupItem(item);
}
if (sendmsg)
NetSendCmdPItem(false, CMD_SPAWNITEM, item.position, item);
@ -3238,7 +3249,7 @@ void SpawnItem(Monster &monster, Point position, bool sendmsg, bool spawn /*= fa
bool dropBrain = Quests[Q_MUSHROOM]._qactive == QUEST_ACTIVE && Quests[Q_MUSHROOM]._qvar1 == QS_MUSHGIVEN;
if (dropsSpecialTreasure && !UseMultiplayerQuests()) {
Item *uniqueItem = SpawnUnique(static_cast<_unique_items>(monster.data().treasure & T_MASK), position, false);
Item *uniqueItem = SpawnUnique(static_cast<_unique_items>(monster.data().treasure & T_MASK), position, std::nullopt, false);
if (uniqueItem != nullptr && sendmsg)
NetSendCmdPItem(false, CMD_DROPITEM, uniqueItem->position, *uniqueItem);
return;

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

10
Source/towners.cpp

@ -344,7 +344,7 @@ void TalkToBarOwner(Player &player, Towner &barOwner)
bannerQuest._qactive = QUEST_DONE;
bannerQuest._qvar1 = 3;
NetSendCmdQuest(true, bannerQuest);
SpawnUnique(UITEM_HARCREST, barOwner.position + Direction::SouthWest);
SpawnUnique(UITEM_HARCREST, barOwner.position + Direction::SouthWest, bannerQuest._qlevel);
InitQTextMsg(TEXT_BANNER3);
return;
}
@ -392,7 +392,7 @@ void TalkToBlackSmith(Player &player, Towner &blackSmith)
if (Quests[Q_ROCK]._qvar2 == 1 && RemoveInventoryItemById(player, IDI_ROCK)) {
Quests[Q_ROCK]._qactive = QUEST_DONE;
NetSendCmdQuest(true, Quests[Q_ROCK]);
SpawnUnique(UITEM_INFRARING, blackSmith.position + Direction::SouthWest);
SpawnUnique(UITEM_INFRARING, blackSmith.position + Direction::SouthWest, Quests[Q_ROCK]._qlevel);
InitQTextMsg(TEXT_INFRA7);
return;
}
@ -413,7 +413,7 @@ void TalkToBlackSmith(Player &player, Towner &blackSmith)
if (Quests[Q_ANVIL]._qvar2 == 1 && RemoveInventoryItemById(player, IDI_ANVIL)) {
Quests[Q_ANVIL]._qactive = QUEST_DONE;
NetSendCmdQuest(true, Quests[Q_ANVIL]);
SpawnUnique(UITEM_GRISWOLD, blackSmith.position + Direction::SouthWest);
SpawnUnique(UITEM_GRISWOLD, blackSmith.position + Direction::SouthWest, Quests[Q_ANVIL]._qlevel);
InitQTextMsg(TEXT_ANVIL7);
return;
}
@ -511,7 +511,7 @@ void TalkToHealer(Player &player, Towner &healer)
if (poisonWater._qactive == QUEST_DONE && poisonWater._qvar1 != 2) {
poisonWater._qvar1 = 2;
InitQTextMsg(TEXT_POISON5);
SpawnUnique(UITEM_TRING, healer.position + Direction::SouthWest);
SpawnUnique(UITEM_TRING, healer.position + Direction::SouthWest, poisonWater._qlevel);
NetSendCmdQuest(true, poisonWater);
return;
}
@ -670,7 +670,7 @@ void TalkToCowFarmer(Player &player, Towner &cowFarmer)
auto &quest = Quests[Q_JERSEY];
if (RemoveInventoryItemById(player, IDI_BROWNSUIT)) {
SpawnUnique(UITEM_BOVINE, cowFarmer.position + Direction::SouthEast);
SpawnUnique(UITEM_BOVINE, cowFarmer.position + Direction::SouthEast, quest._qlevel);
InitQTextMsg(TEXT_JERSEY8);
quest._qactive = QUEST_DONE;
UpdateCowFarmerAnimAfterQuestComplete();

Loading…
Cancel
Save