|
|
|
@@ -26,6 +26,7 @@
|
|
|
|
|
#include "TeamManager.h"
|
|
|
|
|
#include "ChatPackets.h"
|
|
|
|
|
#include "GameConfig.h"
|
|
|
|
|
#include "RocketLaunchLupComponent.h"
|
|
|
|
|
|
|
|
|
|
#include <sstream>
|
|
|
|
|
#include <future>
|
|
|
|
@@ -411,7 +412,7 @@ void GameMessages::SendGMLevelBroadcast(const LWOOBJID& objectID, uint8_t level)
|
|
|
|
|
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
|
|
|
|
|
CMSGHEADER
|
|
|
|
|
|
|
|
|
@@ -421,9 +422,8 @@ void GameMessages::SendAddItemToInventoryClientSync(Entity* entity, const System
|
|
|
|
|
bitStream.Write(item->GetInfo().isBOE);
|
|
|
|
|
bitStream.Write(item->GetInfo().isBOP);
|
|
|
|
|
|
|
|
|
|
bitStream.Write0(); // Loot source
|
|
|
|
|
//if (invType != LOOTTYPE_NONE) bitStream.Write(invType);
|
|
|
|
|
|
|
|
|
|
bitStream.Write(lootSourceType != eLootSourceType::LOOT_SOURCE_NONE); // Loot source
|
|
|
|
|
if (lootSourceType != eLootSourceType::LOOT_SOURCE_NONE) bitStream.Write(lootSourceType);
|
|
|
|
|
LWONameValue extraInfo;
|
|
|
|
|
|
|
|
|
|
auto config = item->GetConfig();
|
|
|
|
@@ -451,8 +451,8 @@ void GameMessages::SendAddItemToInventoryClientSync(Entity* entity, const System
|
|
|
|
|
auto* inventory = item->GetInventory();
|
|
|
|
|
const auto inventoryType = inventory->GetType();
|
|
|
|
|
|
|
|
|
|
bitStream.Write(inventoryType != INVENTORY_DEFAULT);
|
|
|
|
|
if (inventoryType != INVENTORY_DEFAULT) bitStream.Write(inventoryType);
|
|
|
|
|
bitStream.Write(inventoryType != eInventoryType::ITEMS);
|
|
|
|
|
if (inventoryType != eInventoryType::ITEMS) bitStream.Write(inventoryType);
|
|
|
|
|
|
|
|
|
|
bitStream.Write(itemCount != 1);
|
|
|
|
|
if (itemCount != 1) bitStream.Write(itemCount);
|
|
|
|
@@ -558,7 +558,7 @@ void GameMessages::SendNotifyMissionTask(Entity* entity, const SystemAddress& sy
|
|
|
|
|
SEND_PACKET
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameMessages::SendModifyLEGOScore(Entity* entity, const SystemAddress& sysAddr, int64_t score, int sourceType) {
|
|
|
|
|
void GameMessages::SendModifyLEGOScore(Entity* entity, const SystemAddress& sysAddr, int64_t score, eLootSourceType sourceType) {
|
|
|
|
|
CBITSTREAM
|
|
|
|
|
CMSGHEADER
|
|
|
|
|
|
|
|
|
@@ -566,9 +566,8 @@ void GameMessages::SendModifyLEGOScore(Entity* entity, const SystemAddress& sysA
|
|
|
|
|
bitStream.Write((uint16_t)GAME_MSG_MODIFY_LEGO_SCORE);
|
|
|
|
|
bitStream.Write(score);
|
|
|
|
|
|
|
|
|
|
//Stuff stolen from the old codebase, no idea why this works. The proper implementation didn't for some reason.
|
|
|
|
|
bitStream.Write((int32_t)129);
|
|
|
|
|
bitStream.Write((unsigned char)0);
|
|
|
|
|
bitStream.Write(sourceType != eLootSourceType::LOOT_SOURCE_NONE);
|
|
|
|
|
if (sourceType != eLootSourceType::LOOT_SOURCE_NONE) bitStream.Write(sourceType);
|
|
|
|
|
|
|
|
|
|
SEND_PACKET
|
|
|
|
|
}
|
|
|
|
@@ -1254,8 +1253,7 @@ void GameMessages::SendVendorOpenWindow(Entity* entity, const SystemAddress& sys
|
|
|
|
|
SEND_PACKET
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ah yes, impl code in a send function, beautiful!
|
|
|
|
|
void GameMessages::SendVendorStatusUpdate(Entity* entity, const SystemAddress& sysAddr) {
|
|
|
|
|
void GameMessages::SendVendorStatusUpdate(Entity* entity, const SystemAddress& sysAddr, bool bUpdateOnly) {
|
|
|
|
|
CBITSTREAM
|
|
|
|
|
CMSGHEADER
|
|
|
|
|
|
|
|
|
@@ -1267,7 +1265,7 @@ void GameMessages::SendVendorStatusUpdate(Entity* entity, const SystemAddress& s
|
|
|
|
|
bitStream.Write(entity->GetObjectID());
|
|
|
|
|
bitStream.Write(GAME_MSG::GAME_MSG_VENDOR_STATUS_UPDATE);
|
|
|
|
|
|
|
|
|
|
bitStream.Write(false);
|
|
|
|
|
bitStream.Write(bUpdateOnly);
|
|
|
|
|
bitStream.Write(static_cast<uint32_t>(vendorItems.size()));
|
|
|
|
|
|
|
|
|
|
for (std::pair<LOT, int> item : vendorItems) {
|
|
|
|
@@ -1275,6 +1273,7 @@ void GameMessages::SendVendorStatusUpdate(Entity* entity, const SystemAddress& s
|
|
|
|
|
bitStream.Write(static_cast<int>(item.second));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST
|
|
|
|
|
SEND_PACKET
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -1517,6 +1516,18 @@ void GameMessages::SendRequestActivityEnter(LWOOBJID objectId, const SystemAddre
|
|
|
|
|
SEND_PACKET
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameMessages::NotifyLevelRewards(LWOOBJID objectID, const SystemAddress& sysAddr, int level, bool sending_rewards) {
|
|
|
|
|
CBITSTREAM
|
|
|
|
|
CMSGHEADER
|
|
|
|
|
|
|
|
|
|
bitStream.Write(objectID);
|
|
|
|
|
bitStream.Write((uint16_t)GAME_MSG::GAME_MSG_NOTIFY_LEVEL_REWARDS);
|
|
|
|
|
|
|
|
|
|
bitStream.Write(level);
|
|
|
|
|
bitStream.Write(sending_rewards);
|
|
|
|
|
|
|
|
|
|
SEND_PACKET
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameMessages::SendSetShootingGalleryParams(LWOOBJID objectId, const SystemAddress& sysAddr,
|
|
|
|
|
float cameraFOV,
|
|
|
|
@@ -2716,10 +2727,15 @@ void GameMessages::HandleEnterProperty(RakNet::BitStream* inStream, Entity* enti
|
|
|
|
|
auto* player = Player::GetPlayer(sysAddr);
|
|
|
|
|
|
|
|
|
|
auto* entranceComponent = entity->GetComponent<PropertyEntranceComponent>();
|
|
|
|
|
if (entranceComponent != nullptr) {
|
|
|
|
|
entranceComponent->OnEnterProperty(player, index, returnToZone, sysAddr);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (entranceComponent == nullptr) return;
|
|
|
|
|
|
|
|
|
|
entranceComponent->OnEnterProperty(player, index, returnToZone, sysAddr);
|
|
|
|
|
auto rocketLaunchLupComponent = entity->GetComponent<RocketLaunchLupComponent>();
|
|
|
|
|
if (rocketLaunchLupComponent != nullptr) {
|
|
|
|
|
rocketLaunchLupComponent->OnSelectWorld(player, index);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameMessages::HandleSetConsumableItem(RakNet::BitStream* inStream, Entity* entity, const SystemAddress& sysAddr)
|
|
|
|
@@ -3227,12 +3243,12 @@ void GameMessages::HandleClientTradeRequest(RakNet::BitStream* inStream, Entity*
|
|
|
|
|
|
|
|
|
|
void GameMessages::HandleClientTradeCancel(RakNet::BitStream* inStream, Entity* entity, const SystemAddress& sysAddr)
|
|
|
|
|
{
|
|
|
|
|
Game::logger->Log("GameMessages", "Trade canceled from (%llu)\n", entity->GetObjectID());
|
|
|
|
|
|
|
|
|
|
auto* trade = TradingManager::Instance()->GetPlayerTrade(entity->GetObjectID());
|
|
|
|
|
|
|
|
|
|
if (trade == nullptr) return;
|
|
|
|
|
|
|
|
|
|
Game::logger->Log("GameMessages", "Trade canceled from (%llu)\n", entity->GetObjectID());
|
|
|
|
|
|
|
|
|
|
TradingManager::Instance()->CancelTrade(trade->GetTradeId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -3665,7 +3681,7 @@ void GameMessages::HandlePetTamingTryBuild(RakNet::BitStream* inStream, Entity*
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
petComponent->TryBuild(bricks, clientFailed);
|
|
|
|
|
petComponent->TryBuild(bricks.size(), clientFailed);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameMessages::HandleNotifyTamingBuildSuccess(RakNet::BitStream* inStream, Entity* entity, const SystemAddress& sysAddr)
|
|
|
|
@@ -4126,6 +4142,41 @@ void GameMessages::HandleRacingPlayerInfoResetFinished(RakNet::BitStream* inStre
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameMessages::SendUpdateReputation(const LWOOBJID objectId, const int64_t reputation, const SystemAddress& sysAddr) {
|
|
|
|
|
CBITSTREAM;
|
|
|
|
|
CMSGHEADER;
|
|
|
|
|
|
|
|
|
|
bitStream.Write(objectId);
|
|
|
|
|
bitStream.Write(GAME_MSG::GAME_MSG_UPDATE_REPUTATION);
|
|
|
|
|
|
|
|
|
|
bitStream.Write(reputation);
|
|
|
|
|
|
|
|
|
|
SEND_PACKET;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameMessages::HandleUpdatePropertyPerformanceCost(RakNet::BitStream* inStream, Entity* entity, const SystemAddress& sysAddr) {
|
|
|
|
|
float performanceCost = 0.0f;
|
|
|
|
|
|
|
|
|
|
if (inStream->ReadBit()) inStream->Read(performanceCost);
|
|
|
|
|
|
|
|
|
|
if (performanceCost == 0.0f) return;
|
|
|
|
|
|
|
|
|
|
auto zone = dZoneManager::Instance()->GetZone();
|
|
|
|
|
const auto& worldId = zone->GetZoneID();
|
|
|
|
|
const auto cloneId = worldId.GetCloneID();
|
|
|
|
|
const auto zoneId = worldId.GetMapID();
|
|
|
|
|
|
|
|
|
|
auto updatePerformanceCostQuery = Database::CreatePreppedStmt("UPDATE properties SET performance_cost = ? WHERE clone_id = ? AND zone_id = ?");
|
|
|
|
|
|
|
|
|
|
updatePerformanceCostQuery->setDouble(1, performanceCost);
|
|
|
|
|
updatePerformanceCostQuery->setInt(2, cloneId);
|
|
|
|
|
updatePerformanceCostQuery->setInt(3, zoneId);
|
|
|
|
|
|
|
|
|
|
updatePerformanceCostQuery->executeUpdate();
|
|
|
|
|
|
|
|
|
|
delete updatePerformanceCostQuery;
|
|
|
|
|
updatePerformanceCostQuery = nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameMessages::HandleVehicleNotifyHitImaginationServer(RakNet::BitStream* inStream, Entity* entity, const SystemAddress& sysAddr)
|
|
|
|
|
{
|
|
|
|
@@ -4654,7 +4705,7 @@ void GameMessages::HandleBuyFromVendor(RakNet::BitStream* inStream, Entity* enti
|
|
|
|
|
|
|
|
|
|
inv->RemoveItem(tokenId, altCurrencyCost);
|
|
|
|
|
|
|
|
|
|
inv->AddItem(item, count);
|
|
|
|
|
inv->AddItem(item, count, eLootSourceType::LOOT_SOURCE_VENDOR);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@@ -4679,8 +4730,8 @@ void GameMessages::HandleBuyFromVendor(RakNet::BitStream* inStream, Entity* enti
|
|
|
|
|
inv->RemoveItem(itemComp.currencyLOT, altCurrencyCost);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
character->SetCoins(character->GetCoins() - (coinCost), LOOT_SOURCE_VENDOR);
|
|
|
|
|
inv->AddItem(item, count);
|
|
|
|
|
character->SetCoins(character->GetCoins() - (coinCost), eLootSourceType::LOOT_SOURCE_VENDOR);
|
|
|
|
|
inv->AddItem(item, count, eLootSourceType::LOOT_SOURCE_VENDOR);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GameMessages::SendVendorTransactionResult(entity, sysAddr);
|
|
|
|
@@ -4723,12 +4774,12 @@ void GameMessages::HandleSellToVendor(RakNet::BitStream* inStream, Entity* entit
|
|
|
|
|
if (Inventory::IsValidItem(itemComp.currencyLOT))
|
|
|
|
|
{
|
|
|
|
|
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->MoveItemToInventory(item, VENDOR_BUYBACK, count, true, false, true);
|
|
|
|
|
character->SetCoins(std::floor(character->GetCoins() + ((itemComp.baseValue * sellScalar)*count)), LOOT_SOURCE_VENDOR);
|
|
|
|
|
inv->MoveItemToInventory(item, eInventoryType::VENDOR_BUYBACK, count, true, false, true);
|
|
|
|
|
character->SetCoins(std::floor(character->GetCoins() + ((itemComp.baseValue * sellScalar)*count)), eLootSourceType::LOOT_SOURCE_VENDOR);
|
|
|
|
|
//EntityManager::Instance()->SerializeEntity(player); // so inventory updates
|
|
|
|
|
GameMessages::SendVendorTransactionResult(entity, sysAddr);
|
|
|
|
|
}
|
|
|
|
@@ -4790,7 +4841,7 @@ void GameMessages::HandleBuybackFromVendor(RakNet::BitStream* inStream, Entity*
|
|
|
|
|
|
|
|
|
|
//inv->RemoveItem(count, -1, iObjID);
|
|
|
|
|
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
|
|
|
|
|
GameMessages::SendVendorTransactionResult(entity, sysAddr);
|
|
|
|
|
}
|
|
|
|
@@ -4981,17 +5032,6 @@ void GameMessages::HandleRequestUse(RakNet::BitStream* inStream, Entity* entity,
|
|
|
|
|
|
|
|
|
|
missionComponent->Progress(MissionTaskType::MISSION_TASK_TYPE_MISSION_INTERACTION, interactedObject->GetLOT(), interactedObject->GetObjectID());
|
|
|
|
|
missionComponent->Progress(MissionTaskType::MISSION_TASK_TYPE_NON_MISSION_INTERACTION, interactedObject->GetLOT(), interactedObject->GetObjectID());
|
|
|
|
|
|
|
|
|
|
//Do mail stuff:
|
|
|
|
|
if (interactedObject->GetLOT() == 3964) {
|
|
|
|
|
AMFStringValue* value = new AMFStringValue();
|
|
|
|
|
value->SetStringValue("Mail");
|
|
|
|
|
|
|
|
|
|
AMFArrayValue args;
|
|
|
|
|
args.InsertValue("state", value);
|
|
|
|
|
GameMessages::SendUIMessageServerToSingleClient(entity, sysAddr, "pushGameState", &args);
|
|
|
|
|
delete value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameMessages::HandlePlayEmote(RakNet::BitStream* inStream, Entity* entity) {
|
|
|
|
@@ -5068,7 +5108,7 @@ void GameMessages::HandleModularBuildConvertModel(RakNet::BitStream* inStream, E
|
|
|
|
|
|
|
|
|
|
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) {
|
|
|
|
@@ -5234,7 +5274,7 @@ void GameMessages::HandlePickupCurrency(RakNet::BitStream* inStream, Entity* ent
|
|
|
|
|
|
|
|
|
|
auto* ch = entity->GetCharacter();
|
|
|
|
|
if (entity->CanPickupCoins(currency)) {
|
|
|
|
|
ch->SetCoins(ch->GetCoins() + currency, LOOT_SOURCE_PICKUP);
|
|
|
|
|
ch->SetCoins(ch->GetCoins() + currency, eLootSourceType::LOOT_SOURCE_PICKUP);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -5289,21 +5329,11 @@ void GameMessages::HandleEquipItem(RakNet::BitStream* inStream, Entity* entity)
|
|
|
|
|
|
|
|
|
|
Item* item = inv->FindItemById(objectID);
|
|
|
|
|
if (!item) return;
|
|
|
|
|
/*if (item->GetLot() == 6416) { // if it's a rocket
|
|
|
|
|
std::vector<Entity*> rocketPads = EntityManager::Instance()->GetEntitiesByComponent(COMPONENT_TYPE_ROCKET_LAUNCH);
|
|
|
|
|
for (Entity* rocketPad : rocketPads) {
|
|
|
|
|
RocketLaunchpadControlComponent* rocketComp = static_cast<RocketLaunchpadControlComponent*>(rocketPad->GetComponent(COMPONENT_TYPE_ROCKET_LAUNCH));
|
|
|
|
|
if (rocketComp) {
|
|
|
|
|
rocketComp->RocketEquip(entity, objectID);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else*/ {
|
|
|
|
|
|
|
|
|
|
item->Equip();
|
|
|
|
|
|
|
|
|
|
EntityManager::Instance()->SerializeEntity(entity);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameMessages::HandleUnequipItem(RakNet::BitStream* inStream, Entity* entity) {
|
|
|
|
|
bool immediate;
|
|
|
|
@@ -5398,6 +5428,8 @@ void GameMessages::HandleRemoveItemFromInventory(RakNet::BitStream* inStream, En
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
iStackCount = std::min<uint32_t>(item->GetCount(), iStackCount);
|
|
|
|
|
|
|
|
|
|
if (bConfirmed) {
|
|
|
|
|
for (auto i = 0; i < iStackCount; ++i) {
|
|
|
|
|
if (eInvType == eInventoryType::MODELS)
|
|
|
|
@@ -5447,8 +5479,8 @@ void GameMessages::HandleMoveItemInInventory(RakNet::BitStream* inStream, Entity
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameMessages::HandleMoveItemBetweenInventoryTypes(RakNet::BitStream* inStream, Entity* entity, const SystemAddress& sysAddr) {
|
|
|
|
|
int inventoryTypeA;
|
|
|
|
|
int inventoryTypeB;
|
|
|
|
|
eInventoryType inventoryTypeA;
|
|
|
|
|
eInventoryType inventoryTypeB;
|
|
|
|
|
LWOOBJID objectID;
|
|
|
|
|
bool showFlyingLoot = true;
|
|
|
|
|
bool stackCountIsDefault = false;
|
|
|
|
@@ -5465,7 +5497,7 @@ void GameMessages::HandleMoveItemBetweenInventoryTypes(RakNet::BitStream* inStre
|
|
|
|
|
inStream->Read(templateIDIsDefault);
|
|
|
|
|
if (templateIDIsDefault) inStream->Read(templateID);
|
|
|
|
|
|
|
|
|
|
InventoryComponent* inv = static_cast<InventoryComponent*>(entity->GetComponent(COMPONENT_TYPE_INVENTORY));
|
|
|
|
|
auto inv = entity->GetComponent<InventoryComponent>();
|
|
|
|
|
if (!inv) return;
|
|
|
|
|
|
|
|
|
|
auto* item = inv->FindItemById(objectID);
|
|
|
|
@@ -5486,7 +5518,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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -5553,11 +5585,11 @@ void GameMessages::HandleModularBuildFinish(RakNet::BitStream* inStream, Entity*
|
|
|
|
|
|
|
|
|
|
if (count == 3)
|
|
|
|
|
{
|
|
|
|
|
inv->AddItem(6416, 1, MODELS, config);
|
|
|
|
|
inv->AddItem(6416, 1, eLootSourceType::LOOT_SOURCE_QUICKBUILD, eInventoryType::MODELS, config);
|
|
|
|
|
}
|
|
|
|
|
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>();
|
|
|
|
@@ -5587,7 +5619,7 @@ void GameMessages::HandleModularBuildFinish(RakNet::BitStream* inStream, Entity*
|
|
|
|
|
|
|
|
|
|
for (auto* item : items)
|
|
|
|
|
{
|
|
|
|
|
inv->MoveItemToInventory(item, MODELS, item->GetCount(), false);
|
|
|
|
|
inv->MoveItemToInventory(item, eInventoryType::MODELS, item->GetCount(), false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -5702,7 +5734,7 @@ void GameMessages::HandleDoneArrangingWithItem(RakNet::BitStream* inStream, Enti
|
|
|
|
|
|
|
|
|
|
for (auto* item : items)
|
|
|
|
|
{
|
|
|
|
|
inv->MoveItemToInventory(item, MODELS, item->GetCount(), false, false);
|
|
|
|
|
inv->MoveItemToInventory(item, eInventoryType::MODELS, item->GetCount(), false, false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -5728,7 +5760,7 @@ void GameMessages::HandleModularBuildMoveAndEquip(RakNet::BitStream* inStream, E
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inv->MoveItemToInventory(item, MODELS, 1, false, true);
|
|
|
|
|
inv->MoveItemToInventory(item, eInventoryType::MODELS, 1, false, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameMessages::HandlePickupItem(RakNet::BitStream* inStream, Entity* entity) {
|
|
|
|
@@ -5890,6 +5922,7 @@ void GameMessages::HandleReportBug(RakNet::BitStream* inStream, Entity* entity)
|
|
|
|
|
std::string nOtherPlayerID;
|
|
|
|
|
std::string selection;
|
|
|
|
|
uint32_t messageLength;
|
|
|
|
|
int32_t reporterID = 0;
|
|
|
|
|
|
|
|
|
|
//Reading:
|
|
|
|
|
inStream->Read(messageLength);
|
|
|
|
@@ -5900,6 +5933,9 @@ void GameMessages::HandleReportBug(RakNet::BitStream* inStream, Entity* entity)
|
|
|
|
|
body.push_back(character);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto character = entity->GetCharacter();
|
|
|
|
|
if (character) reporterID = character->GetID();
|
|
|
|
|
|
|
|
|
|
uint32_t clientVersionLength;
|
|
|
|
|
inStream->Read(clientVersionLength);
|
|
|
|
|
for (unsigned int k = 0; k < clientVersionLength; k++) {
|
|
|
|
@@ -5915,6 +5951,9 @@ void GameMessages::HandleReportBug(RakNet::BitStream* inStream, Entity* entity)
|
|
|
|
|
inStream->Read(character);
|
|
|
|
|
nOtherPlayerID.push_back(character);
|
|
|
|
|
}
|
|
|
|
|
// Convert other player id from LWOOBJID to the database id.
|
|
|
|
|
uint32_t otherPlayer = LWOOBJID_EMPTY;
|
|
|
|
|
if (nOtherPlayerID != "") otherPlayer = std::atoi(nOtherPlayerID.c_str());
|
|
|
|
|
|
|
|
|
|
uint32_t selectionLength;
|
|
|
|
|
inStream->Read(selectionLength);
|
|
|
|
@@ -5925,16 +5964,17 @@ void GameMessages::HandleReportBug(RakNet::BitStream* inStream, Entity* entity)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
sql::PreparedStatement* insertBug = Database::CreatePreppedStmt("INSERT INTO `bug_reports`(body, client_version, other_player_id, selection) VALUES (?, ?, ?, ?)");
|
|
|
|
|
sql::PreparedStatement* insertBug = Database::CreatePreppedStmt("INSERT INTO `bug_reports`(body, client_version, other_player_id, selection, reporter_id) VALUES (?, ?, ?, ?, ?)");
|
|
|
|
|
insertBug->setString(1, GeneralUtils::UTF16ToWTF8(body));
|
|
|
|
|
insertBug->setString(2, clientVersion);
|
|
|
|
|
insertBug->setString(3, nOtherPlayerID);
|
|
|
|
|
insertBug->setString(3, std::to_string(otherPlayer));
|
|
|
|
|
insertBug->setString(4, selection);
|
|
|
|
|
insertBug->setInt(5, reporterID);
|
|
|
|
|
insertBug->execute();
|
|
|
|
|
delete insertBug;
|
|
|
|
|
}
|
|
|
|
|
catch (sql::SQLException& e) {
|
|
|
|
|
Game::logger->Log("HandleReportBug", "Couldn't save bug report!\n");
|
|
|
|
|
Game::logger->Log("HandleReportBug", "Couldn't save bug report! (%s)\n", e.what());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|