Merge pull request #516 from EmosewaMC/isPlayer-changes

Live accurate item loot sources
This commit is contained in:
David Markowitz 2022-04-24 18:56:49 -07:00 committed by GitHub
commit 58d2cee984
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 120 additions and 109 deletions

View File

@ -493,7 +493,7 @@ enum eLootSourceType : int32_t {
LOOT_SOURCE_CLAIMCODE, LOOT_SOURCE_CLAIMCODE,
LOOT_SOURCE_CONSUMPTION, LOOT_SOURCE_CONSUMPTION,
LOOT_SOURCE_CRAFTING, LOOT_SOURCE_CRAFTING,
LOOT_SOURCE_LEVELREWARD, LOOT_SOURCE_LEVEL_REWARD,
LOOT_SOURCE_RELOCATE LOOT_SOURCE_RELOCATE
}; };

View File

@ -534,7 +534,7 @@ void Character::OnZoneLoad()
*/ */
if (HasPermission(PermissionMap::Old)) { if (HasPermission(PermissionMap::Old)) {
if (GetCoins() > 1000000) { if (GetCoins() > 1000000) {
SetCoins(1000000, LOOT_SOURCE_NONE); SetCoins(1000000, eLootSourceType::LOOT_SOURCE_NONE);
} }
} }

View File

@ -1637,7 +1637,7 @@ void Entity::PickupItem(const LWOOBJID& objectID) {
} }
} }
else { else {
inv->AddItem(p.second.lot, p.second.count, INVALID, {}, LWOOBJID_EMPTY, true, false, LWOOBJID_EMPTY, INVALID, 1); inv->AddItem(p.second.lot, p.second.count, eLootSourceType::LOOT_SOURCE_PICKUP, eInventoryType::INVALID, {}, LWOOBJID_EMPTY, true, false, LWOOBJID_EMPTY, eInventoryType::INVALID, 1);
} }
} }
} }

View File

@ -151,8 +151,8 @@ void Trade::Complete()
if (inventoryA == nullptr || inventoryB == nullptr || characterA == nullptr || characterB == nullptr || missionsA == nullptr || missionsB == nullptr) return; if (inventoryA == nullptr || inventoryB == nullptr || characterA == nullptr || characterB == nullptr || missionsA == nullptr || missionsB == nullptr) return;
characterA->SetCoins(characterA->GetCoins() - m_CoinsA + m_CoinsB, LOOT_SOURCE_TRADE); characterA->SetCoins(characterA->GetCoins() - m_CoinsA + m_CoinsB, eLootSourceType::LOOT_SOURCE_TRADE);
characterB->SetCoins(characterB->GetCoins() - m_CoinsB + m_CoinsA, LOOT_SOURCE_TRADE); characterB->SetCoins(characterB->GetCoins() - m_CoinsB + m_CoinsA, eLootSourceType::LOOT_SOURCE_TRADE);
for (const auto& tradeItem : m_ItemsA) for (const auto& tradeItem : m_ItemsA)
{ {
@ -170,12 +170,12 @@ void Trade::Complete()
for (const auto& tradeItem : m_ItemsA) for (const auto& tradeItem : m_ItemsA)
{ {
inventoryB->AddItem(tradeItem.itemLot, tradeItem.itemCount); inventoryB->AddItem(tradeItem.itemLot, tradeItem.itemCount, eLootSourceType::LOOT_SOURCE_TRADE);
} }
for (const auto& tradeItem : m_ItemsB) for (const auto& tradeItem : m_ItemsB)
{ {
inventoryA->AddItem(tradeItem.itemLot, tradeItem.itemCount); inventoryA->AddItem(tradeItem.itemLot, tradeItem.itemCount, eLootSourceType::LOOT_SOURCE_TRADE);
} }
TradingManager::Instance()->CancelTrade(m_TradeId); TradingManager::Instance()->CancelTrade(m_TradeId);

View File

@ -217,11 +217,11 @@ void CharacterComponent::HandleLevelUp()
switch (reward->rewardType) switch (reward->rewardType)
{ {
case 0: case 0:
inventoryComponent->AddItem(reward->value, reward->count); inventoryComponent->AddItem(reward->value, reward->count, eLootSourceType::LOOT_SOURCE_LEVEL_REWARD);
break; break;
case 4: case 4:
{ {
auto* items = inventoryComponent->GetInventory(ITEMS); auto* items = inventoryComponent->GetInventory(eInventoryType::ITEMS);
items->SetSize(items->GetSize() + reward->value); items->SetSize(items->GetSize() + reward->value);
} }
break; break;

View File

@ -819,7 +819,7 @@ void DestroyableComponent::Smash(const LWOOBJID source, const eKillType killType
coinsTotal -= coinsToLoose; coinsTotal -= coinsToLoose;
LootGenerator::Instance().DropLoot(m_Parent, m_Parent, -1, coinsToLoose, coinsToLoose); LootGenerator::Instance().DropLoot(m_Parent, m_Parent, -1, coinsToLoose, coinsToLoose);
character->SetCoins(coinsTotal, LOOT_SOURCE_PICKUP); character->SetCoins(coinsTotal, eLootSourceType::LOOT_SOURCE_PICKUP);
} }
} }

View File

@ -88,7 +88,9 @@ Inventory* InventoryComponent::GetInventory(const eInventoryType type)
case eInventoryType::VAULT_ITEMS: case eInventoryType::VAULT_ITEMS:
size = 40u; size = 40u;
break; break;
case eInventoryType::VENDOR_BUYBACK:
size = 27u;
break;
default: default:
break; break;
} }
@ -139,6 +141,7 @@ const EquipmentMap& InventoryComponent::GetEquippedItems() const
void InventoryComponent::AddItem( void InventoryComponent::AddItem(
const LOT lot, const LOT lot,
const uint32_t count, const uint32_t count,
eLootSourceType lootSourceType,
eInventoryType inventoryType, eInventoryType inventoryType,
const std::vector<LDFBaseData*>& config, const std::vector<LDFBaseData*>& config,
const LWOOBJID parent, const LWOOBJID parent,
@ -178,7 +181,7 @@ void InventoryComponent::AddItem(
if (!config.empty() || bound) if (!config.empty() || bound)
{ {
const auto slot = inventory->FindEmptySlot(); const auto slot = preferredSlot != -1 && inventory->IsSlotEmpty(preferredSlot) ? preferredSlot : inventory->FindEmptySlot();
if (slot == -1) if (slot == -1)
{ {
@ -186,8 +189,7 @@ void InventoryComponent::AddItem(
return; return;
} }
auto* item = new Item(lot, inventory, slot, count, config, parent, showFlyingLoot, isModMoveAndEquip, subKey, bound, lootSourceType);
auto* item = new Item(lot, inventory, slot, count, config, parent, showFlyingLoot, isModMoveAndEquip, subKey, bound);
if (missions != nullptr && !IsTransferInventory(inventoryType)) if (missions != nullptr && !IsTransferInventory(inventoryType))
{ {
@ -205,7 +207,7 @@ void InventoryComponent::AddItem(
auto stack = static_cast<uint32_t>(info.stackSize); auto stack = static_cast<uint32_t>(info.stackSize);
if (inventoryType == BRICKS) if (inventoryType == eInventoryType::BRICKS)
{ {
stack = 999; stack = 999;
} }
@ -222,7 +224,7 @@ void InventoryComponent::AddItem(
left -= delta; left -= delta;
existing->SetCount(existing->GetCount() + delta, false, true, showFlyingLoot); existing->SetCount(existing->GetCount() + delta, false, true, showFlyingLoot, lootSourceType);
if (isModMoveAndEquip) if (isModMoveAndEquip)
{ {
@ -282,8 +284,7 @@ void InventoryComponent::AddItem(
continue; continue;
} }
auto* item = new Item(lot, inventory, slot, size, {}, parent, showFlyingLoot, isModMoveAndEquip, subKey, false, lootSourceType);
auto* item = new Item(lot, inventory, slot, size, {}, parent, showFlyingLoot, isModMoveAndEquip, subKey);
isModMoveAndEquip = false; isModMoveAndEquip = false;
} }
@ -367,7 +368,7 @@ void InventoryComponent::MoveItemToInventory(Item* item, const eInventoryType in
left -= delta; left -= delta;
AddItem(lot, delta, inventory, {}, LWOOBJID_EMPTY, showFlyingLot, isModMoveAndEquip, LWOOBJID_EMPTY, origin->GetType(), 0, false, preferredSlot); AddItem(lot, delta, eLootSourceType::LOOT_SOURCE_NONE, inventory, {}, LWOOBJID_EMPTY, showFlyingLot, isModMoveAndEquip, LWOOBJID_EMPTY, origin->GetType(), 0, false, preferredSlot);
item->SetCount(item->GetCount() - delta, false, false); item->SetCount(item->GetCount() - delta, false, false);
@ -385,7 +386,7 @@ void InventoryComponent::MoveItemToInventory(Item* item, const eInventoryType in
const auto delta = std::min<uint32_t>(item->GetCount(), count); const auto delta = std::min<uint32_t>(item->GetCount(), count);
AddItem(lot, delta, inventory, config, LWOOBJID_EMPTY, showFlyingLot, isModMoveAndEquip, LWOOBJID_EMPTY, origin->GetType(), 0, item->GetBound(), preferredSlot); AddItem(lot, delta, eLootSourceType::LOOT_SOURCE_NONE, inventory, config, LWOOBJID_EMPTY, showFlyingLot, isModMoveAndEquip, LWOOBJID_EMPTY, origin->GetType(), 0, item->GetBound(), preferredSlot);
item->SetCount(item->GetCount() - delta, false, false); item->SetCount(item->GetCount() - delta, false, false);
} }

View File

@ -87,10 +87,12 @@ public:
* @param sourceType the source of the item, used to determine if the item is dropped or mailed if the inventory is full * @param sourceType the source of the item, used to determine if the item is dropped or mailed if the inventory is full
* @param bound whether this item is bound * @param bound whether this item is bound
* @param preferredSlot the preferred slot to store this item * @param preferredSlot the preferred slot to store this item
* @param lootSourceType The source of the loot. Defaults to none.
*/ */
void AddItem( void AddItem(
LOT lot, LOT lot,
uint32_t count, uint32_t count,
eLootSourceType lootSourceType = eLootSourceType::LOOT_SOURCE_NONE,
eInventoryType inventoryType = INVALID, eInventoryType inventoryType = INVALID,
const std::vector<LDFBaseData*>& config = {}, const std::vector<LDFBaseData*>& config = {},
LWOOBJID parent = LWOOBJID_EMPTY, LWOOBJID parent = LWOOBJID_EMPTY,

View File

@ -615,7 +615,7 @@ void PetComponent::NotifyTamingBuildSuccess(NiPoint3 position)
GameMessages::SendRegisterPetDBID(m_Tamer, petSubKey, tamer->GetSystemAddress()); GameMessages::SendRegisterPetDBID(m_Tamer, petSubKey, tamer->GetSystemAddress());
inventoryComponent->AddItem(m_Parent->GetLOT(), 1, MODELS, {}, LWOOBJID_EMPTY, true, false, petSubKey); inventoryComponent->AddItem(m_Parent->GetLOT(), 1, eLootSourceType::LOOT_SOURCE_ACTIVITY, eInventoryType::MODELS, {}, LWOOBJID_EMPTY, true, false, petSubKey);
auto* item = inventoryComponent->FindItemBySubKey(petSubKey, MODELS); auto* item = inventoryComponent->FindItemBySubKey(petSubKey, MODELS);
if (item == nullptr) if (item == nullptr)

View File

@ -491,7 +491,7 @@ void PropertyManagementComponent::DeleteModel(const LWOOBJID id, const int delet
settings.push_back(propertyObjectID); settings.push_back(propertyObjectID);
settings.push_back(modelType); settings.push_back(modelType);
inventoryComponent->AddItem(6662, 1, HIDDEN, settings, LWOOBJID_EMPTY, false, false, spawnerId, INVALID, 13, false, -1); inventoryComponent->AddItem(6662, 1, eLootSourceType::LOOT_SOURCE_DELETION, eInventoryType::HIDDEN, settings, LWOOBJID_EMPTY, false, false, spawnerId);
auto* item = inventoryComponent->FindItemBySubKey(spawnerId); auto* item = inventoryComponent->FindItemBySubKey(spawnerId);
if (item == nullptr) { if (item == nullptr) {
@ -526,7 +526,7 @@ void PropertyManagementComponent::DeleteModel(const LWOOBJID id, const int delet
return; return;
} }
inventoryComponent->AddItem(model->GetLOT(), 1, INVALID, {}, LWOOBJID_EMPTY, false); inventoryComponent->AddItem(model->GetLOT(), 1, eLootSourceType::LOOT_SOURCE_DELETION, INVALID, {}, LWOOBJID_EMPTY, false);
auto* item = inventoryComponent->FindItemByLot(model->GetLOT()); auto* item = inventoryComponent->FindItemByLot(model->GetLOT());

View File

@ -411,7 +411,7 @@ void GameMessages::SendGMLevelBroadcast(const LWOOBJID& objectID, uint8_t level)
SEND_PACKET_BROADCAST SEND_PACKET_BROADCAST
} }
void GameMessages::SendAddItemToInventoryClientSync(Entity* entity, const SystemAddress& sysAddr, Item* item, const LWOOBJID& objectID, bool showFlyingLoot, int itemCount, LWOOBJID subKey) { void GameMessages::SendAddItemToInventoryClientSync(Entity* entity, const SystemAddress& sysAddr, Item* item, const LWOOBJID& objectID, bool showFlyingLoot, int itemCount, LWOOBJID subKey, eLootSourceType lootSourceType) {
CBITSTREAM CBITSTREAM
CMSGHEADER CMSGHEADER
@ -421,9 +421,8 @@ void GameMessages::SendAddItemToInventoryClientSync(Entity* entity, const System
bitStream.Write(item->GetInfo().isBOE); bitStream.Write(item->GetInfo().isBOE);
bitStream.Write(item->GetInfo().isBOP); bitStream.Write(item->GetInfo().isBOP);
bitStream.Write0(); // Loot source bitStream.Write(lootSourceType != eLootSourceType::LOOT_SOURCE_NONE); // Loot source
//if (invType != LOOTTYPE_NONE) bitStream.Write(invType); if (lootSourceType != eLootSourceType::LOOT_SOURCE_NONE) bitStream.Write(lootSourceType);
LWONameValue extraInfo; LWONameValue extraInfo;
auto config = item->GetConfig(); auto config = item->GetConfig();
@ -451,8 +450,8 @@ void GameMessages::SendAddItemToInventoryClientSync(Entity* entity, const System
auto* inventory = item->GetInventory(); auto* inventory = item->GetInventory();
const auto inventoryType = inventory->GetType(); const auto inventoryType = inventory->GetType();
bitStream.Write(inventoryType != INVENTORY_DEFAULT); bitStream.Write(inventoryType != eInventoryType::ITEMS);
if (inventoryType != INVENTORY_DEFAULT) bitStream.Write(inventoryType); if (inventoryType != eInventoryType::ITEMS) bitStream.Write(inventoryType);
bitStream.Write(itemCount != 1); bitStream.Write(itemCount != 1);
if (itemCount != 1) bitStream.Write(itemCount); if (itemCount != 1) bitStream.Write(itemCount);
@ -566,8 +565,8 @@ void GameMessages::SendModifyLEGOScore(Entity* entity, const SystemAddress& sysA
bitStream.Write((uint16_t)GAME_MSG_MODIFY_LEGO_SCORE); bitStream.Write((uint16_t)GAME_MSG_MODIFY_LEGO_SCORE);
bitStream.Write(score); bitStream.Write(score);
bitStream.Write(sourceType != LOOT_SOURCE_NONE); bitStream.Write(sourceType != eLootSourceType::LOOT_SOURCE_NONE);
if (sourceType != LOOT_SOURCE_NONE) bitStream.Write(sourceType); if (sourceType != eLootSourceType::LOOT_SOURCE_NONE) bitStream.Write(sourceType);
SEND_PACKET SEND_PACKET
} }
@ -4700,7 +4699,7 @@ void GameMessages::HandleBuyFromVendor(RakNet::BitStream* inStream, Entity* enti
inv->RemoveItem(tokenId, altCurrencyCost); inv->RemoveItem(tokenId, altCurrencyCost);
inv->AddItem(item, count); inv->AddItem(item, count, eLootSourceType::LOOT_SOURCE_VENDOR);
} }
else else
{ {
@ -4725,8 +4724,8 @@ void GameMessages::HandleBuyFromVendor(RakNet::BitStream* inStream, Entity* enti
inv->RemoveItem(itemComp.currencyLOT, altCurrencyCost); inv->RemoveItem(itemComp.currencyLOT, altCurrencyCost);
} }
character->SetCoins(character->GetCoins() - (coinCost), LOOT_SOURCE_VENDOR); character->SetCoins(character->GetCoins() - (coinCost), eLootSourceType::LOOT_SOURCE_VENDOR);
inv->AddItem(item, count); inv->AddItem(item, count, eLootSourceType::LOOT_SOURCE_VENDOR);
} }
GameMessages::SendVendorTransactionResult(entity, sysAddr); GameMessages::SendVendorTransactionResult(entity, sysAddr);
@ -4769,12 +4768,12 @@ void GameMessages::HandleSellToVendor(RakNet::BitStream* inStream, Entity* entit
if (Inventory::IsValidItem(itemComp.currencyLOT)) if (Inventory::IsValidItem(itemComp.currencyLOT))
{ {
const auto altCurrency = (itemComp.altCurrencyCost * sellScalar) * count; const auto altCurrency = (itemComp.altCurrencyCost * sellScalar) * count;
inv->AddItem(itemComp.currencyLOT, std::floor(altCurrency)); // Return alt currencies like faction tokens. inv->AddItem(itemComp.currencyLOT, std::floor(altCurrency), eLootSourceType::LOOT_SOURCE_VENDOR); // Return alt currencies like faction tokens.
} }
//inv->RemoveItem(count, -1, iObjID); //inv->RemoveItem(count, -1, iObjID);
inv->MoveItemToInventory(item, VENDOR_BUYBACK, count, true, false, true); inv->MoveItemToInventory(item, eInventoryType::VENDOR_BUYBACK, count, true, false, true);
character->SetCoins(std::floor(character->GetCoins() + ((itemComp.baseValue * sellScalar)*count)), LOOT_SOURCE_VENDOR); character->SetCoins(std::floor(character->GetCoins() + ((itemComp.baseValue * sellScalar)*count)), eLootSourceType::LOOT_SOURCE_VENDOR);
//EntityManager::Instance()->SerializeEntity(player); // so inventory updates //EntityManager::Instance()->SerializeEntity(player); // so inventory updates
GameMessages::SendVendorTransactionResult(entity, sysAddr); GameMessages::SendVendorTransactionResult(entity, sysAddr);
} }
@ -4836,7 +4835,7 @@ void GameMessages::HandleBuybackFromVendor(RakNet::BitStream* inStream, Entity*
//inv->RemoveItem(count, -1, iObjID); //inv->RemoveItem(count, -1, iObjID);
inv->MoveItemToInventory(item, Inventory::FindInventoryTypeForLot(item->GetLot()), count, true, false); inv->MoveItemToInventory(item, Inventory::FindInventoryTypeForLot(item->GetLot()), count, true, false);
character->SetCoins(character->GetCoins() - cost, LOOT_SOURCE_VENDOR); character->SetCoins(character->GetCoins() - cost, eLootSourceType::LOOT_SOURCE_VENDOR);
//EntityManager::Instance()->SerializeEntity(player); // so inventory updates //EntityManager::Instance()->SerializeEntity(player); // so inventory updates
GameMessages::SendVendorTransactionResult(entity, sysAddr); GameMessages::SendVendorTransactionResult(entity, sysAddr);
} }
@ -5103,7 +5102,7 @@ void GameMessages::HandleModularBuildConvertModel(RakNet::BitStream* inStream, E
item->Disassemble(TEMP_MODELS); item->Disassemble(TEMP_MODELS);
item->SetCount(item->GetCount() - 1, false, false); item->SetCount(item->GetCount() - 1, false, false, true, eLootSourceType::LOOT_SOURCE_QUICKBUILD);
} }
void GameMessages::HandleSetFlag(RakNet::BitStream* inStream, Entity* entity) { void GameMessages::HandleSetFlag(RakNet::BitStream* inStream, Entity* entity) {
@ -5269,7 +5268,7 @@ void GameMessages::HandlePickupCurrency(RakNet::BitStream* inStream, Entity* ent
auto* ch = entity->GetCharacter(); auto* ch = entity->GetCharacter();
if (entity->CanPickupCoins(currency)) { if (entity->CanPickupCoins(currency)) {
ch->SetCoins(ch->GetCoins() + currency, LOOT_SOURCE_PICKUP); ch->SetCoins(ch->GetCoins() + currency, eLootSourceType::LOOT_SOURCE_PICKUP);
} }
} }
@ -5484,8 +5483,8 @@ void GameMessages::HandleMoveItemInInventory(RakNet::BitStream* inStream, Entity
} }
void GameMessages::HandleMoveItemBetweenInventoryTypes(RakNet::BitStream* inStream, Entity* entity, const SystemAddress& sysAddr) { void GameMessages::HandleMoveItemBetweenInventoryTypes(RakNet::BitStream* inStream, Entity* entity, const SystemAddress& sysAddr) {
int inventoryTypeA; eInventoryType inventoryTypeA;
int inventoryTypeB; eInventoryType inventoryTypeB;
LWOOBJID objectID; LWOOBJID objectID;
bool showFlyingLoot = true; bool showFlyingLoot = true;
bool stackCountIsDefault = false; bool stackCountIsDefault = false;
@ -5502,7 +5501,7 @@ void GameMessages::HandleMoveItemBetweenInventoryTypes(RakNet::BitStream* inStre
inStream->Read(templateIDIsDefault); inStream->Read(templateIDIsDefault);
if (templateIDIsDefault) inStream->Read(templateID); if (templateIDIsDefault) inStream->Read(templateID);
InventoryComponent* inv = static_cast<InventoryComponent*>(entity->GetComponent(COMPONENT_TYPE_INVENTORY)); auto inv = entity->GetComponent<InventoryComponent>();
if (!inv) return; if (!inv) return;
auto* item = inv->FindItemById(objectID); auto* item = inv->FindItemById(objectID);
@ -5523,7 +5522,7 @@ void GameMessages::HandleMoveItemBetweenInventoryTypes(RakNet::BitStream* inStre
} }
} }
inv->MoveItemToInventory(item, static_cast<eInventoryType>(inventoryTypeB), stackCount, showFlyingLoot, false); inv->MoveItemToInventory(item, inventoryTypeB, stackCount, showFlyingLoot);
EntityManager::Instance()->SerializeEntity(entity); EntityManager::Instance()->SerializeEntity(entity);
} }
@ -5590,11 +5589,11 @@ void GameMessages::HandleModularBuildFinish(RakNet::BitStream* inStream, Entity*
if (count == 3) if (count == 3)
{ {
inv->AddItem(6416, 1, MODELS, config); inv->AddItem(6416, 1, eLootSourceType::LOOT_SOURCE_QUICKBUILD, eInventoryType::MODELS, config);
} }
else if (count == 7) else if (count == 7)
{ {
inv->AddItem(8092, 1, MODELS, config); inv->AddItem(8092, 1, eLootSourceType::LOOT_SOURCE_QUICKBUILD, eInventoryType::MODELS, config);
} }
auto* missionComponent = character->GetComponent<MissionComponent>(); auto* missionComponent = character->GetComponent<MissionComponent>();
@ -5624,7 +5623,7 @@ void GameMessages::HandleModularBuildFinish(RakNet::BitStream* inStream, Entity*
for (auto* item : items) for (auto* item : items)
{ {
inv->MoveItemToInventory(item, MODELS, item->GetCount(), false); inv->MoveItemToInventory(item, eInventoryType::MODELS, item->GetCount(), false);
} }
} }
@ -5739,7 +5738,7 @@ void GameMessages::HandleDoneArrangingWithItem(RakNet::BitStream* inStream, Enti
for (auto* item : items) for (auto* item : items)
{ {
inv->MoveItemToInventory(item, MODELS, item->GetCount(), false, false); inv->MoveItemToInventory(item, eInventoryType::MODELS, item->GetCount(), false, false);
} }
} }
@ -5765,7 +5764,7 @@ void GameMessages::HandleModularBuildMoveAndEquip(RakNet::BitStream* inStream, E
return; return;
} }
inv->MoveItemToInventory(item, MODELS, 1, false, true); inv->MoveItemToInventory(item, eInventoryType::MODELS, 1, false, true);
} }
void GameMessages::HandlePickupItem(RakNet::BitStream* inStream, Entity* entity) { void GameMessages::HandlePickupItem(RakNet::BitStream* inStream, Entity* entity) {

View File

@ -61,7 +61,7 @@ namespace GameMessages {
void SendGMLevelBroadcast(const LWOOBJID& objectID, uint8_t level); void SendGMLevelBroadcast(const LWOOBJID& objectID, uint8_t level);
void SendChatModeUpdate(const LWOOBJID& objectID, uint8_t level); void SendChatModeUpdate(const LWOOBJID& objectID, uint8_t level);
void SendAddItemToInventoryClientSync(Entity* entity, const SystemAddress& sysAddr, Item* item, const LWOOBJID& objectID, bool showFlyingLoot, int itemCount, LWOOBJID subKey = LWOOBJID_EMPTY); void SendAddItemToInventoryClientSync(Entity* entity, const SystemAddress& sysAddr, Item* item, const LWOOBJID& objectID, bool showFlyingLoot, int itemCount, LWOOBJID subKey = LWOOBJID_EMPTY, eLootSourceType lootSourceType = eLootSourceType::LOOT_SOURCE_NONE);
void SendNotifyClientFlagChange(const LWOOBJID& objectID, int iFlagID, bool bFlag, const SystemAddress& sysAddr); void SendNotifyClientFlagChange(const LWOOBJID& objectID, int iFlagID, bool bFlag, const SystemAddress& sysAddr);
void SendChangeObjectWorldState(const LWOOBJID& objectID, int state, const SystemAddress& sysAddr); void SendChangeObjectWorldState(const LWOOBJID& objectID, int state, const SystemAddress& sysAddr);

View File

@ -90,17 +90,17 @@ int32_t Inventory::FindEmptySlot()
{ {
if (free <= 6) // Up from 1 if (free <= 6) // Up from 1
{ {
if (type != ITEMS && type != VAULT_ITEMS) if (type != ITEMS && type != VAULT_ITEMS && type != eInventoryType::VAULT_MODELS)
{ {
uint32_t newSize = size; uint32_t newSize = size;
if (type == MODELS || type == VAULT_MODELS) if (type == MODELS)
{ {
newSize = 240; newSize = 240;
} }
else else if (type == eInventoryType::VENDOR_BUYBACK)
{ {
newSize += 20; newSize += 9u;
} }
if (newSize > GetSize()) if (newSize > GetSize())

View File

@ -14,7 +14,7 @@
class Inventory; class Inventory;
Item::Item(const LWOOBJID id, const LOT lot, Inventory* inventory, const uint32_t slot, const uint32_t count, const bool bound, const std::vector<LDFBaseData*>& config, const LWOOBJID parent, LWOOBJID subKey) Item::Item(const LWOOBJID id, const LOT lot, Inventory* inventory, const uint32_t slot, const uint32_t count, const bool bound, const std::vector<LDFBaseData*>& config, const LWOOBJID parent, LWOOBJID subKey, eLootSourceType lootSourceType)
{ {
if (!Inventory::IsValidItem(lot)) if (!Inventory::IsValidItem(lot))
{ {
@ -46,7 +46,8 @@ Item::Item(
bool showFlyingLoot, bool showFlyingLoot,
bool isModMoveAndEquip, bool isModMoveAndEquip,
LWOOBJID subKey, LWOOBJID subKey,
bool bound) bool bound,
eLootSourceType lootSourceType)
{ {
if (!Inventory::IsValidItem(lot)) if (!Inventory::IsValidItem(lot))
{ {
@ -80,8 +81,7 @@ Item::Item(
inventory->AddManagedItem(this); inventory->AddManagedItem(this);
auto* entity = inventory->GetComponent()->GetParent(); auto* entity = inventory->GetComponent()->GetParent();
GameMessages::SendAddItemToInventoryClientSync(entity, entity->GetSystemAddress(), this, id, showFlyingLoot, static_cast<int>(this->count), subKey, lootSourceType);
GameMessages::SendAddItemToInventoryClientSync(entity, entity->GetSystemAddress(), this, id, showFlyingLoot, static_cast<int>(this->count), subKey);
if (isModMoveAndEquip) if (isModMoveAndEquip)
{ {
@ -148,7 +148,7 @@ PreconditionExpression* Item::GetPreconditionExpression() const
return preconditions; return preconditions;
} }
void Item::SetCount(const uint32_t value, const bool silent, const bool disassemble, const bool showFlyingLoot) void Item::SetCount(const uint32_t value, const bool silent, const bool disassemble, const bool showFlyingLoot, eLootSourceType lootSourceType)
{ {
if (value == count) if (value == count)
{ {
@ -176,7 +176,7 @@ void Item::SetCount(const uint32_t value, const bool silent, const bool disassem
if (value > count) if (value > count)
{ {
GameMessages::SendAddItemToInventoryClientSync(entity, entity->GetSystemAddress(), this, id, showFlyingLoot, delta); GameMessages::SendAddItemToInventoryClientSync(entity, entity->GetSystemAddress(), this, id, showFlyingLoot, delta, LWOOBJID_EMPTY, lootSourceType);
} }
else else
{ {
@ -340,7 +340,7 @@ bool Item::UseNonEquip()
return false; return false;
} }
LootGenerator::Instance().GiveLoot(inventory->GetComponent()->GetParent(), result); LootGenerator::Instance().GiveLoot(inventory->GetComponent()->GetParent(), result, eLootSourceType::LOOT_SOURCE_CONSUMPTION);
} }
inventory->GetComponent()->RemoveItem(lot, 1); inventory->GetComponent()->RemoveItem(lot, 1);
@ -374,7 +374,7 @@ void Item::Disassemble(const eInventoryType inventoryType)
for (const auto mod : modArray) for (const auto mod : modArray)
{ {
inventory->GetComponent()->AddItem(mod, 1, inventoryType); inventory->GetComponent()->AddItem(mod, 1, eLootSourceType::LOOT_SOURCE_DELETION, inventoryType);
} }
} }
} }
@ -472,7 +472,7 @@ void Item::DisassembleModel()
continue; continue;
} }
GetInventory()->GetComponent()->AddItem(brickID[0].NDObjectID, 1); GetInventory()->GetComponent()->AddItem(brickID[0].NDObjectID, 1, eLootSourceType::LOOT_SOURCE_DELETION);
} }
} }

View File

@ -36,7 +36,8 @@ public:
bool bound, bool bound,
const std::vector<LDFBaseData*>& config, const std::vector<LDFBaseData*>& config,
LWOOBJID parent, LWOOBJID parent,
LWOOBJID subKey LWOOBJID subKey,
eLootSourceType lootSourceType = eLootSourceType::LOOT_SOURCE_NONE
); );
/** /**
@ -62,7 +63,8 @@ public:
bool showFlyingLoot = true, bool showFlyingLoot = true,
bool isModMoveAndEquip = false, bool isModMoveAndEquip = false,
LWOOBJID subKey = LWOOBJID_EMPTY, LWOOBJID subKey = LWOOBJID_EMPTY,
bool bound = false bool bound = false,
eLootSourceType lootSourceType = eLootSourceType::LOOT_SOURCE_NONE
); );
~Item(); ~Item();
@ -86,7 +88,7 @@ public:
* @param disassemble if items were removed, this returns all the sub parts of the item individually if it had assembly part lots * @param disassemble if items were removed, this returns all the sub parts of the item individually if it had assembly part lots
* @param showFlyingLoot shows flying loot to the client, if not silent * @param showFlyingLoot shows flying loot to the client, if not silent
*/ */
void SetCount(uint32_t value, bool silent = false, bool disassemble = true, bool showFlyingLoot = true); void SetCount(uint32_t value, bool silent = false, bool disassemble = true, bool showFlyingLoot = true, eLootSourceType lootSourceType = eLootSourceType::LOOT_SOURCE_NONE);
/** /**
* Returns the number of items this item represents (e.g. for stacks) * Returns the number of items this item represents (e.g. for stacks)

View File

@ -430,7 +430,7 @@ void Mission::YieldRewards() {
int32_t coinsToSend = 0; int32_t coinsToSend = 0;
if (info->LegoScore > 0) { if (info->LegoScore > 0) {
eLootSourceType lootSource = info->isMission ? LOOT_SOURCE_MISSION : LOOT_SOURCE_ACHIEVEMENT; eLootSourceType lootSource = info->isMission ? eLootSourceType::LOOT_SOURCE_MISSION : eLootSourceType::LOOT_SOURCE_ACHIEVEMENT;
if(characterComponent->GetLevel() >= dZoneManager::Instance()->GetMaxLevel()) { if(characterComponent->GetLevel() >= dZoneManager::Instance()->GetMaxLevel()) {
// Since the character is at the level cap we reward them with coins instead of UScore. // Since the character is at the level cap we reward them with coins instead of UScore.
coinsToSend += info->LegoScore * dZoneManager::Instance()->GetLevelCapCurrencyConversion(); coinsToSend += info->LegoScore * dZoneManager::Instance()->GetLevelCapCurrencyConversion();
@ -463,11 +463,11 @@ void Mission::YieldRewards() {
count = 0; count = 0;
} }
inventoryComponent->AddItem(pair.first, count); inventoryComponent->AddItem(pair.first, count, IsMission() ? eLootSourceType::LOOT_SOURCE_MISSION : eLootSourceType::LOOT_SOURCE_ACHIEVEMENT);
} }
if (info->reward_currency_repeatable > 0 || coinsToSend > 0) { if (info->reward_currency_repeatable > 0 || coinsToSend > 0) {
eLootSourceType lootSource = info->isMission ? LOOT_SOURCE_MISSION : LOOT_SOURCE_ACHIEVEMENT; eLootSourceType lootSource = info->isMission ? eLootSourceType::LOOT_SOURCE_MISSION : eLootSourceType::LOOT_SOURCE_ACHIEVEMENT;
character->SetCoins(character->GetCoins() + info->reward_currency_repeatable + coinsToSend, lootSource); character->SetCoins(character->GetCoins() + info->reward_currency_repeatable + coinsToSend, lootSource);
} }
@ -496,11 +496,11 @@ void Mission::YieldRewards() {
count = 0; count = 0;
} }
inventoryComponent->AddItem(pair.first, count); inventoryComponent->AddItem(pair.first, count, IsMission() ? eLootSourceType::LOOT_SOURCE_MISSION : eLootSourceType::LOOT_SOURCE_ACHIEVEMENT);
} }
if (info->reward_currency > 0 || coinsToSend > 0) { if (info->reward_currency > 0 || coinsToSend > 0) {
eLootSourceType lootSource = info->isMission ? LOOT_SOURCE_MISSION : LOOT_SOURCE_ACHIEVEMENT; eLootSourceType lootSource = info->isMission ? eLootSourceType::LOOT_SOURCE_MISSION : eLootSourceType::LOOT_SOURCE_ACHIEVEMENT;
character->SetCoins(character->GetCoins() + info->reward_currency + coinsToSend, lootSource); character->SetCoins(character->GetCoins() + info->reward_currency + coinsToSend, lootSource);
} }

View File

@ -268,15 +268,15 @@ std::unordered_map<LOT, int32_t> LootGenerator::RollLootMatrix(uint32_t matrixIn
return drops; return drops;
} }
void LootGenerator::GiveLoot(Entity* player, uint32_t matrixIndex) { void LootGenerator::GiveLoot(Entity* player, uint32_t matrixIndex, eLootSourceType lootSourceType) {
player = player->GetOwner(); // If the owner is overwritten, we collect that here player = player->GetOwner(); // If the owner is overwritten, we collect that here
std::unordered_map<LOT, int32_t> result = RollLootMatrix(player, matrixIndex); std::unordered_map<LOT, int32_t> result = RollLootMatrix(player, matrixIndex);
GiveLoot(player, result); GiveLoot(player, result, lootSourceType);
} }
void LootGenerator::GiveLoot(Entity* player, std::unordered_map<LOT, int32_t>& result) { void LootGenerator::GiveLoot(Entity* player, std::unordered_map<LOT, int32_t>& result, eLootSourceType lootSourceType) {
player = player->GetOwner(); // if the owner is overwritten, we collect that here player = player->GetOwner(); // if the owner is overwritten, we collect that here
auto* inventoryComponent = player->GetComponent<InventoryComponent>(); auto* inventoryComponent = player->GetComponent<InventoryComponent>();
@ -285,7 +285,7 @@ void LootGenerator::GiveLoot(Entity* player, std::unordered_map<LOT, int32_t>& r
return; return;
for (const auto& pair : result) { for (const auto& pair : result) {
inventoryComponent->AddItem(pair.first, pair.second); inventoryComponent->AddItem(pair.first, pair.second, lootSourceType);
} }
} }
@ -314,13 +314,13 @@ void LootGenerator::GiveActivityLoot(Entity* player, Entity* source, uint32_t ac
maxCoins = currencyTable[0].maxvalue; maxCoins = currencyTable[0].maxvalue;
} }
GiveLoot(player, selectedReward->LootMatrixIndex); GiveLoot(player, selectedReward->LootMatrixIndex, eLootSourceType::LOOT_SOURCE_ACTIVITY);
uint32_t coins = (int)(minCoins + GeneralUtils::GenerateRandomNumber<float>(0, 1) * (maxCoins - minCoins)); uint32_t coins = (int)(minCoins + GeneralUtils::GenerateRandomNumber<float>(0, 1) * (maxCoins - minCoins));
auto* character = player->GetCharacter(); auto* character = player->GetCharacter();
character->SetCoins(character->GetCoins() + coins, LOOT_SOURCE_ACTIVITY); character->SetCoins(character->GetCoins() + coins, eLootSourceType::LOOT_SOURCE_ACTIVITY);
} }
void LootGenerator::DropLoot(Entity* player, Entity* killedObject, uint32_t matrixIndex, uint32_t minCoins, uint32_t maxCoins) { void LootGenerator::DropLoot(Entity* player, Entity* killedObject, uint32_t matrixIndex, uint32_t minCoins, uint32_t maxCoins) {

View File

@ -47,8 +47,8 @@ class LootGenerator : public Singleton<LootGenerator> {
std::unordered_map<LOT, int32_t> RollLootMatrix(Entity* player, uint32_t matrixIndex); std::unordered_map<LOT, int32_t> RollLootMatrix(Entity* player, uint32_t matrixIndex);
std::unordered_map<LOT, int32_t> RollLootMatrix(uint32_t matrixIndex); std::unordered_map<LOT, int32_t> RollLootMatrix(uint32_t matrixIndex);
void GiveLoot(Entity* player, uint32_t matrixIndex); void GiveLoot(Entity* player, uint32_t matrixIndex, eLootSourceType lootSourceType = eLootSourceType::LOOT_SOURCE_NONE);
void GiveLoot(Entity* player, std::unordered_map<LOT, int32_t>& result); void GiveLoot(Entity* player, std::unordered_map<LOT, int32_t>& result, eLootSourceType lootSourceType = eLootSourceType::LOOT_SOURCE_NONE);
void GiveActivityLoot(Entity* player, Entity* source, uint32_t activityID, int32_t rating = 0); void GiveActivityLoot(Entity* player, Entity* source, uint32_t activityID, int32_t rating = 0);
void DropLoot(Entity* player, Entity* killedObject, uint32_t matrixIndex, uint32_t minCoins, uint32_t maxCoins); void DropLoot(Entity* player, Entity* killedObject, uint32_t matrixIndex, uint32_t minCoins, uint32_t maxCoins);
void DropLoot(Entity* player, Entity* killedObject, std::unordered_map<LOT, int32_t>& result, uint32_t minCoins, uint32_t maxCoins); void DropLoot(Entity* player, Entity* killedObject, std::unordered_map<LOT, int32_t>& result, uint32_t minCoins, uint32_t maxCoins);

View File

@ -262,7 +262,7 @@ void Mail::HandleSendMail(RakNet::BitStream* packet, const SystemAddress& sysAdd
} }
Mail::SendSendResponse(sysAddr, Mail::MailSendResponse::Success); Mail::SendSendResponse(sysAddr, Mail::MailSendResponse::Success);
entity->GetCharacter()->SetCoins(entity->GetCharacter()->GetCoins() - mailCost, LOOT_SOURCE_MAIL); entity->GetCharacter()->SetCoins(entity->GetCharacter()->GetCoins() - mailCost, eLootSourceType::LOOT_SOURCE_MAIL);
Game::logger->Log("Mail", "Seeing if we need to remove item with ID/count/LOT: %i %i %i\n", itemID, attachmentCount, itemLOT); Game::logger->Log("Mail", "Seeing if we need to remove item with ID/count/LOT: %i %i %i\n", itemID, attachmentCount, itemLOT);
@ -363,7 +363,7 @@ void Mail::HandleAttachmentCollect(RakNet::BitStream* packet, const SystemAddres
auto inv = static_cast<InventoryComponent*>(player->GetComponent(COMPONENT_TYPE_INVENTORY)); auto inv = static_cast<InventoryComponent*>(player->GetComponent(COMPONENT_TYPE_INVENTORY));
if (!inv) return; if (!inv) return;
inv->AddItem(attachmentLOT, attachmentCount); inv->AddItem(attachmentLOT, attachmentCount, eLootSourceType::LOOT_SOURCE_MAIL);
Mail::SendAttachmentRemoveConfirm(sysAddr, mailID); Mail::SendAttachmentRemoveConfirm(sysAddr, mailID);

View File

@ -794,7 +794,7 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit
InventoryComponent * inventory = static_cast<InventoryComponent*>(entity->GetComponent(COMPONENT_TYPE_INVENTORY)); InventoryComponent * inventory = static_cast<InventoryComponent*>(entity->GetComponent(COMPONENT_TYPE_INVENTORY));
inventory->AddItem(itemLOT, 1); inventory->AddItem(itemLOT, 1, eLootSourceType::LOOT_SOURCE_MODERATION);
} else if(args.size() == 2) { } else if(args.size() == 2) {
uint32_t itemLOT; uint32_t itemLOT;
@ -814,7 +814,7 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit
InventoryComponent* inventory = static_cast<InventoryComponent*>(entity->GetComponent(COMPONENT_TYPE_INVENTORY)); InventoryComponent* inventory = static_cast<InventoryComponent*>(entity->GetComponent(COMPONENT_TYPE_INVENTORY));
inventory->AddItem(itemLOT, count); inventory->AddItem(itemLOT, count, eLootSourceType::LOOT_SOURCE_MODERATION);
} }
else { else {
ChatPackets::SendSystemMessage(sysAddr, u"Correct usage: /gmadditem <lot>"); ChatPackets::SendSystemMessage(sysAddr, u"Correct usage: /gmadditem <lot>");
@ -1293,7 +1293,7 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit
CharacterComponent* character = entity->GetComponent<CharacterComponent>(); CharacterComponent* character = entity->GetComponent<CharacterComponent>();
if (character) character->SetUScore(character->GetUScore() + uscore); if (character) character->SetUScore(character->GetUScore() + uscore);
// LOOT_SOURCE_MODERATION should work but it doesn't. Relog to see uscore changes // LOOT_SOURCE_MODERATION should work but it doesn't. Relog to see uscore changes
GameMessages::SendModifyLEGOScore(entity, entity->GetSystemAddress(), uscore, LOOT_SOURCE_MODERATION); GameMessages::SendModifyLEGOScore(entity, entity->GetSystemAddress(), uscore, eLootSourceType::LOOT_SOURCE_MODERATION);
} }
if (chatCommand == "pos" && entity->GetGMLevel() >= GAME_MASTER_LEVEL_DEVELOPER) { if (chatCommand == "pos" && entity->GetGMLevel() >= GAME_MASTER_LEVEL_DEVELOPER) {
@ -1337,7 +1337,7 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit
} }
auto* ch = entity->GetCharacter(); auto* ch = entity->GetCharacter();
ch->SetCoins(ch->GetCoins() + money, LOOT_SOURCE_MODERATION); ch->SetCoins(ch->GetCoins() + money, eLootSourceType::LOOT_SOURCE_MODERATION);
} }
if ((chatCommand == "setcurrency") && args.size() == 1 && entity->GetGMLevel() >= GAME_MASTER_LEVEL_DEVELOPER) { if ((chatCommand == "setcurrency") && args.size() == 1 && entity->GetGMLevel() >= GAME_MASTER_LEVEL_DEVELOPER) {
@ -1350,7 +1350,7 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit
} }
auto* ch = entity->GetCharacter(); auto* ch = entity->GetCharacter();
ch->SetCoins(money, LOOT_SOURCE_MODERATION); ch->SetCoins(money, eLootSourceType::LOOT_SOURCE_MODERATION);
} }
// Allow for this on even while not a GM, as it sometimes toggles incorrrectly. // Allow for this on even while not a GM, as it sometimes toggles incorrrectly.
@ -1626,7 +1626,7 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit
std::vector<LDFBaseData*> data {}; std::vector<LDFBaseData*> data {};
data.push_back(new LDFData<int32_t>(u"reforgedLOT", reforgedItem)); data.push_back(new LDFData<int32_t>(u"reforgedLOT", reforgedItem));
inventoryComponent->AddItem(baseItem, 1, INVALID, data); inventoryComponent->AddItem(baseItem, 1, eLootSourceType::LOOT_SOURCE_MODERATION, eInventoryType::INVALID, data);
} }
if (chatCommand == "crash" && entity->GetGMLevel() >= GAME_MASTER_LEVEL_OPERATOR) if (chatCommand == "crash" && entity->GetGMLevel() >= GAME_MASTER_LEVEL_OPERATOR)

View File

@ -32,7 +32,7 @@ void AmDropshipComputer::OnUse(Entity* self, Entity* user)
return; return;
} }
inventoryComponent->AddItem(12323, 1); inventoryComponent->AddItem(12323, 1, eLootSourceType::LOOT_SOURCE_NONE);
} }
void AmDropshipComputer::OnDie(Entity* self, Entity* killer) void AmDropshipComputer::OnDie(Entity* self, Entity* killer)

View File

@ -11,7 +11,7 @@ void NPCAddRemoveItem::OnMissionDialogueOK(Entity *self, Entity *target, int mis
for (const auto& itemSetting : missionSetting.second) { for (const auto& itemSetting : missionSetting.second) {
for (const auto& lot : itemSetting.items) { for (const auto& lot : itemSetting.items) {
if (itemSetting.add && (missionState == MissionState::MISSION_STATE_AVAILABLE || missionState == MissionState::MISSION_STATE_COMPLETE_AVAILABLE)) { if (itemSetting.add && (missionState == MissionState::MISSION_STATE_AVAILABLE || missionState == MissionState::MISSION_STATE_COMPLETE_AVAILABLE)) {
inventory->AddItem(lot, 1); inventory->AddItem(lot, 1, eLootSourceType::LOOT_SOURCE_NONE);
} else if (itemSetting.remove && (missionState == MissionState::MISSION_STATE_READY_TO_COMPLETE || missionState == MissionState::MISSION_STATE_COMPLETE_READY_TO_COMPLETE)) { } else if (itemSetting.remove && (missionState == MissionState::MISSION_STATE_READY_TO_COMPLETE || missionState == MissionState::MISSION_STATE_COMPLETE_READY_TO_COMPLETE)) {
inventory->RemoveItem(lot, 1); inventory->RemoveItem(lot, 1);
} }

View File

@ -54,6 +54,6 @@ void NjColeNPC::OnMissionDialogueOK(Entity* self, Entity* target, int missionID,
return; return;
} }
inventoryComponent->AddItem(16644, 1); inventoryComponent->AddItem(16644, 1, eLootSourceType::LOOT_SOURCE_NONE);
} }
} }

View File

@ -12,6 +12,6 @@ void NjScrollChestServer::OnUse(Entity *self, Entity *user) {
playerInventory->RemoveItem(keyLOT, 1); playerInventory->RemoveItem(keyLOT, 1);
// Reward the player with the item set // Reward the player with the item set
playerInventory->AddItem(rewardItemLOT, 1); playerInventory->AddItem(rewardItemLOT, 1, eLootSourceType::LOOT_SOURCE_NONE);
} }
} }

View File

@ -23,7 +23,7 @@ void NpcCowboyServer::OnMissionDialogueOK(Entity* self, Entity* target, int miss
{ {
if (inventoryComponent->GetLotCount(14378) == 0) if (inventoryComponent->GetLotCount(14378) == 0)
{ {
inventoryComponent->AddItem(14378, 1); inventoryComponent->AddItem(14378, 1, eLootSourceType::LOOT_SOURCE_NONE);
} }
} }
else if (missionState == MissionState::MISSION_STATE_READY_TO_COMPLETE || missionState == MissionState::MISSION_STATE_COMPLETE_READY_TO_COMPLETE) else if (missionState == MissionState::MISSION_STATE_READY_TO_COMPLETE || missionState == MissionState::MISSION_STATE_COMPLETE_READY_TO_COMPLETE)

View File

@ -9,7 +9,7 @@ void NpcPirateServer::OnMissionDialogueOK(Entity *self, Entity *target, int miss
// Add or remove the lucky shovel based on whether the mission was completed or started // Add or remove the lucky shovel based on whether the mission was completed or started
if ((missionState == MissionState::MISSION_STATE_AVAILABLE || missionState == MissionState::MISSION_STATE_COMPLETE_AVAILABLE) if ((missionState == MissionState::MISSION_STATE_AVAILABLE || missionState == MissionState::MISSION_STATE_COMPLETE_AVAILABLE)
&& luckyShovel == nullptr) { && luckyShovel == nullptr) {
inventory->AddItem(14591, 1); inventory->AddItem(14591, 1, eLootSourceType::LOOT_SOURCE_NONE);
} else if (missionState == MissionState::MISSION_STATE_READY_TO_COMPLETE || missionState == MissionState::MISSION_STATE_COMPLETE_READY_TO_COMPLETE) { } else if (missionState == MissionState::MISSION_STATE_READY_TO_COMPLETE || missionState == MissionState::MISSION_STATE_COMPLETE_READY_TO_COMPLETE) {
inventory->RemoveItem(14591, 1); inventory->RemoveItem(14591, 1);
} }

View File

@ -20,7 +20,7 @@ void NpcWispServer::OnMissionDialogueOK(Entity* self, Entity* target, int missio
// For the daily we add the maelstrom vacuum if the player doesn't have it yet // For the daily we add the maelstrom vacuum if the player doesn't have it yet
if (missionID == 1883 && (missionState == MissionState::MISSION_STATE_AVAILABLE || missionState == MissionState::MISSION_STATE_COMPLETE_AVAILABLE) if (missionID == 1883 && (missionState == MissionState::MISSION_STATE_AVAILABLE || missionState == MissionState::MISSION_STATE_COMPLETE_AVAILABLE)
&& maelstromVacuum == nullptr) { && maelstromVacuum == nullptr) {
inventory->AddItem(maelstromVacuumLot, 1); inventory->AddItem(maelstromVacuumLot, 1, eLootSourceType::LOOT_SOURCE_NONE);
} else if (missionState == MissionState::MISSION_STATE_READY_TO_COMPLETE || missionState == MissionState::MISSION_STATE_COMPLETE_READY_TO_COMPLETE) { } else if (missionState == MissionState::MISSION_STATE_READY_TO_COMPLETE || missionState == MissionState::MISSION_STATE_COMPLETE_READY_TO_COMPLETE) {
inventory->RemoveItem(maelstromVacuumLot, 1); inventory->RemoveItem(maelstromVacuumLot, 1);
} }

View File

@ -195,7 +195,7 @@ void NsConcertInstrument::EquipInstruments(Entity *self, Entity *player) {
// Equip the left hand instrument // Equip the left hand instrument
const auto leftInstrumentLot = instrumentLotLeft.find(GetInstrumentLot(self))->second; const auto leftInstrumentLot = instrumentLotLeft.find(GetInstrumentLot(self))->second;
if (leftInstrumentLot != LOT_NULL) { if (leftInstrumentLot != LOT_NULL) {
inventory->AddItem(leftInstrumentLot, 1, TEMP_ITEMS, {}, LWOOBJID_EMPTY, false); inventory->AddItem(leftInstrumentLot, 1, eLootSourceType::LOOT_SOURCE_ACTIVITY);
auto* leftInstrument = inventory->FindItemByLot(leftInstrumentLot, TEMP_ITEMS); auto* leftInstrument = inventory->FindItemByLot(leftInstrumentLot, TEMP_ITEMS);
leftInstrument->Equip(); leftInstrument->Equip();
} }
@ -203,7 +203,7 @@ void NsConcertInstrument::EquipInstruments(Entity *self, Entity *player) {
// Equip the right hand instrument // Equip the right hand instrument
const auto rightInstrumentLot = instrumentLotRight.find(GetInstrumentLot(self))->second; const auto rightInstrumentLot = instrumentLotRight.find(GetInstrumentLot(self))->second;
if (rightInstrumentLot != LOT_NULL) { if (rightInstrumentLot != LOT_NULL) {
inventory->AddItem(rightInstrumentLot, 1, TEMP_ITEMS, {}, LWOOBJID_EMPTY, false); inventory->AddItem(rightInstrumentLot, 1, eLootSourceType::LOOT_SOURCE_ACTIVITY);
auto* rightInstrument = inventory->FindItemByLot(rightInstrumentLot, TEMP_ITEMS); auto* rightInstrument = inventory->FindItemByLot(rightInstrumentLot, TEMP_ITEMS);
rightInstrument->Equip(); rightInstrument->Equip();
} }

View File

@ -48,23 +48,28 @@ void NsTokenConsoleServer::OnUse(Entity* self, Entity* user)
GameMessages::SendPlayNDAudioEmitter(self, UNASSIGNED_SYSTEM_ADDRESS, useSound); GameMessages::SendPlayNDAudioEmitter(self, UNASSIGNED_SYSTEM_ADDRESS, useSound);
} }
// Player must be in faction to interact with this entity.
LOT tokenLOT = 0;
if (character->GetPlayerFlag(46)) if (character->GetPlayerFlag(46))
{ {
inventoryComponent->AddItem(8321, 5); tokenLOT = 8321;
} }
else if (character->GetPlayerFlag(47)) else if (character->GetPlayerFlag(47))
{ {
inventoryComponent->AddItem(8318, 5); tokenLOT = 8318;
} }
else if (character->GetPlayerFlag(48)) else if (character->GetPlayerFlag(48))
{ {
inventoryComponent->AddItem(8320, 5); tokenLOT = 8320;
} }
else if (character->GetPlayerFlag(49)) else if (character->GetPlayerFlag(49))
{ {
inventoryComponent->AddItem(8319, 5); tokenLOT = 8319;
} }
inventoryComponent->AddItem(tokenLOT, 5, eLootSourceType::LOOT_SOURCE_NONE);
missionComponent->ForceProgressTaskType(863, 1, 1, false); missionComponent->ForceProgressTaskType(863, 1, 1, false);
GameMessages::SendTerminateInteraction(user->GetObjectID(), FROM_INTERACTION, self->GetObjectID()); GameMessages::SendTerminateInteraction(user->GetObjectID(), FROM_INTERACTION, self->GetObjectID());

View File

@ -29,7 +29,7 @@ void NtDukeServer::OnMissionDialogueOK(Entity *self, Entity *target, int mission
auto lotCount = inventoryComponent->GetLotCount(m_SwordLot); auto lotCount = inventoryComponent->GetLotCount(m_SwordLot);
if ((state == MissionState::MISSION_STATE_AVAILABLE || state == MissionState::MISSION_STATE_ACTIVE) && lotCount < 1) { if ((state == MissionState::MISSION_STATE_AVAILABLE || state == MissionState::MISSION_STATE_ACTIVE) && lotCount < 1) {
inventoryComponent->AddItem(m_SwordLot, 1); inventoryComponent->AddItem(m_SwordLot, 1, eLootSourceType::LOOT_SOURCE_NONE);
} else if (state == MissionState::MISSION_STATE_READY_TO_COMPLETE) { } else if (state == MissionState::MISSION_STATE_READY_TO_COMPLETE) {
inventoryComponent->RemoveItem(m_SwordLot, lotCount); inventoryComponent->RemoveItem(m_SwordLot, lotCount);
} }

View File

@ -574,7 +574,7 @@ void SGCannon::StopGame(Entity *self, bool cancel) {
auto* inventory = player->GetComponent<InventoryComponent>(); auto* inventory = player->GetComponent<InventoryComponent>();
if (inventory != nullptr) { if (inventory != nullptr) {
for (const auto rewardLot : self->GetVar<std::vector<LOT>>(RewardsVariable)) { for (const auto rewardLot : self->GetVar<std::vector<LOT>>(RewardsVariable)) {
inventory->AddItem(rewardLot, 1, eInventoryType::MODELS); inventory->AddItem(rewardLot, 1, eLootSourceType::LOOT_SOURCE_ACTIVITY, eInventoryType::MODELS);
} }
} }

View File

@ -21,15 +21,17 @@ void TokenConsoleServer::OnUse(Entity* self, Entity* user) {
//figure out which faction the player belongs to: //figure out which faction the player belongs to:
auto character = user->GetCharacter(); auto character = user->GetCharacter();
if (!character) return; if (!character) return;
// At this point the player has to be in a faction.
LOT tokenLOT = 0;
if (character->GetPlayerFlag(ePlayerFlags::VENTURE_FACTION)) //venture if (character->GetPlayerFlag(ePlayerFlags::VENTURE_FACTION)) //venture
inv->AddItem(8321, tokensToGive); tokenLOT = 8321;
else if (character->GetPlayerFlag(ePlayerFlags::ASSEMBLY_FACTION)) //assembly else if (character->GetPlayerFlag(ePlayerFlags::ASSEMBLY_FACTION)) //assembly
inv->AddItem(8318, tokensToGive); tokenLOT = 8318;
else if (character->GetPlayerFlag(ePlayerFlags::PARADOX_FACTION)) //paradox else if (character->GetPlayerFlag(ePlayerFlags::PARADOX_FACTION)) //paradox
inv->AddItem(8320, tokensToGive); tokenLOT = 8320;
else if (character->GetPlayerFlag(ePlayerFlags::SENTINEL_FACTION)) //sentinel else if (character->GetPlayerFlag(ePlayerFlags::SENTINEL_FACTION)) //sentinel
inv->AddItem(8319, tokensToGive); tokenLOT = 8319;
inv->AddItem(tokenLOT, tokensToGive, eLootSourceType::LOOT_SOURCE_NONE);
} }
GameMessages::SendTerminateInteraction(user->GetObjectID(), eTerminateType::FROM_INTERACTION, self->GetObjectID()); GameMessages::SendTerminateInteraction(user->GetObjectID(), eTerminateType::FROM_INTERACTION, self->GetObjectID());

View File

@ -10,7 +10,7 @@ void VeBricksampleServer::OnUse(Entity *self, Entity *user) {
auto* inventoryComponent = user->GetComponent<InventoryComponent>(); auto* inventoryComponent = user->GetComponent<InventoryComponent>();
if (loot && inventoryComponent != nullptr && inventoryComponent->GetLotCount(loot) == 0) { if (loot && inventoryComponent != nullptr && inventoryComponent->GetLotCount(loot) == 0) {
inventoryComponent->AddItem(loot, 1); inventoryComponent->AddItem(loot, 1, eLootSourceType::LOOT_SOURCE_ACTIVITY);
for (auto* brickEntity : EntityManager::Instance()->GetEntitiesInGroup("Bricks")) { for (auto* brickEntity : EntityManager::Instance()->GetEntitiesInGroup("Bricks")) {
GameMessages::SendNotifyClientObject(brickEntity->GetObjectID(), u"Pickedup"); GameMessages::SendNotifyClientObject(brickEntity->GetObjectID(), u"Pickedup");

View File

@ -8,7 +8,7 @@ void VeMissionConsole::OnUse(Entity *self, Entity *user) {
auto* inventoryComponent = user->GetComponent<InventoryComponent>(); auto* inventoryComponent = user->GetComponent<InventoryComponent>();
if (inventoryComponent != nullptr) { if (inventoryComponent != nullptr) {
inventoryComponent->AddItem(12547, 1); // Add the panel required for pickup inventoryComponent->AddItem(12547, 1, eLootSourceType::LOOT_SOURCE_ACTIVITY); // Add the panel required for pickup
} }
// The flag to set is 101<number> // The flag to set is 101<number>