trading post

This commit is contained in:
luis
2026-03-15 19:40:29 -03:00
parent cf8d0f8b00
commit 02ac83d4af
7 changed files with 998 additions and 785 deletions
+167 -167
View File
@@ -1,167 +1,167 @@
///*
// * Copyright (C) WowCommunity Project
// *
// * This SourceCode is NOT free a software. Please hold everything Private
// * and read our Terms
// */
//
//#include "PerkProgramData.h"
//#include "PerkProgramMgr.h"
//#include "Containers.h"
//#include "DatabaseEnv.h"
//#include "ObjectMgr.h"
//#include "DB2Stores.h"
//#include <sstream>
//#include "GameTime.h"
//
//PerkProgramDataStoreMgr::PerkProgramDataStoreMgr() {};
//
//PerkProgramDataStoreMgr::~PerkProgramDataStoreMgr() {};
//
//PerkProgramDataStoreMgr* PerkProgramDataStoreMgr::instance()
//{
// static PerkProgramDataStoreMgr instance;
// return &instance;
//}
//
//namespace
//{
// std::unordered_map<uint32, PerkProgramData::PerkVendorItem> _vendorTemplates;
// std::vector<PerkProgramData::ActivityTemplate> m_activeActivity;
//}
//
//void PerkProgramDataStoreMgr::Initialize()
//{
// LoadPerkVendorItem();
// LoadActivities();
//}
//
//void PerkProgramDataStoreMgr::LoadPerkVendorItem()
//{
// TC_LOG_INFO("server.loading", "Loading PerkPrograms Vendor Items Templates ...");
// _vendorTemplates.clear();
//
// if (!sPerksVendorItemStore.GetNumRows())
// {
// TC_LOG_WARN("server.loading", ">> PerksVendorItem store is empty, skipping vendor items");
// return;
// }
//
// for (PerksVendorItemEntry const* itemVendor : sPerksVendorItemStore)
// {
// if (!itemVendor)
// continue;
//
// PerkProgramData::PerkVendorItem vendorItem;
// vendorItem.Id = itemVendor->ID;
// vendorItem.ItemID = itemVendor->ItemID;
// vendorItem.MountSpellID = itemVendor->Unknown010001;
// vendorItem.PetSpellID = itemVendor->Unknown020001;
// vendorItem.TransmogSet = 0;
// vendorItem.ItemModifiedAppearanceID = 0;
// vendorItem.ToyItem = 0;
// vendorItem.Cost = itemVendor->Cost;
// vendorItem.CategoryId = itemVendor->PerksVendorCategoryID;
//
// _vendorTemplates.insert(std::make_pair(itemVendor->ID, vendorItem));
// }
//
// TC_LOG_INFO("server.loading", ">> Loaded {} PerkPrograms Vendor Items Templates", uint32(_vendorTemplates.size()));
//}
//
//std::unordered_map<uint32, PerkProgramData::PerkVendorItem> PerkProgramDataStoreMgr::GetVendorItems()
//{
// return _vendorTemplates;
//}
//
//PerkProgramData::PerkVendorItem const* PerkProgramDataStoreMgr::GetVendorItem(uint32 entry)
//{
// auto itr = _vendorTemplates.find(entry);
// if (itr != _vendorTemplates.end())
// return &itr->second;
//
// return nullptr;
//}
//
//PerkProgramData::PerkVendorItem const* PerkProgramDataStoreMgr::GetRandomVendorItem()
//{
// if (_vendorTemplates.empty())
// return nullptr;
//
// auto it = _vendorTemplates.begin();
// std::advance(it, rand() % _vendorTemplates.size());
// return &it->second;
//}
//
//std::vector<PerkProgramData::ActivityTemplate> PerkProgramDataStoreMgr::GetActivities()
//{
// return m_activeActivity;
//}
//
//uint32 PerkProgramDataStoreMgr::GetActivityCriteriatree(uint32 activityId)
//{
// for (auto const& ac : m_activeActivity)
// {
// if (ac.ActivityID == activityId)
// return ac.CriteriaTree;
// }
// return 0;
//}
//
//uint32 PerkProgramDataStoreMgr::GetActivityCurrencyAmount(uint32 activityId)
//{
// for (auto const& ac : m_activeActivity)
// {
// if (ac.ActivityID == activityId)
// return ac.CurrencyAmount;
// }
// return 0;
//}
//
//void PerkProgramDataStoreMgr::LoadActivities()
//{
// CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PERK_PROGRAM_ACTIVITY);
// PreparedQueryResult result = CharacterDatabase.Query(stmt);
// m_activeActivity.clear();
// if (!result)
// {
// GenerateRandomActivities(false);
// return;
// }
// do
// {
// Field* fields = result->Fetch();
// uint32 activityId = fields[0].GetUInt32();
// PerksActivityEntry const* entry = sPerksActivityStore.LookupEntry(activityId);
// if (!entry)
// continue;
// PerkProgramData::ActivityTemplate ac;
// ac.ActivityID = entry->ID;
// ac.CriteriaTree = entry->CriteriaTreeID;
// ac.CurrencyAmount = entry->ThresholdContributionAmount;
// ac.Priority = entry->Priority;
// m_activeActivity.push_back(ac);
//
// } while (result->NextRow());
//}
//
//void PerkProgramDataStoreMgr::GenerateRandomActivities(bool /*clearOld*/)
//{
// CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PERK_PROGRAM_ACTIVITY);
// CharacterDatabase.Execute(stmt);
// m_activeActivity.clear();
//
// for (PerksActivityEntry const* db : sDB2Manager.GetRandomActivitiesXTag())
// {
// PerkProgramData::ActivityTemplate ac;
// ac.ActivityID = db->ID;
// ac.CriteriaTree = db->CriteriaTreeID;
// ac.CurrencyAmount = db->ThresholdContributionAmount;
// ac.Priority = db->Priority;
// m_activeActivity.push_back(ac);
//
// stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_PERK_PROGRAM_ACTIVITY);
// stmt->setUInt32(0, ac.ActivityID);
// CharacterDatabase.Execute(stmt);
// }
//}
/*
* Copyright (C) WowCommunity Project
*
* This SourceCode is NOT free a software. Please hold everything Private
* and read our Terms
*/
#include "PerkProgramData.h"
#include "PerkProgramMgr.h"
#include "Containers.h"
#include "DatabaseEnv.h"
#include "ObjectMgr.h"
#include "DB2Stores.h"
#include <sstream>
#include "GameTime.h"
PerkProgramDataStoreMgr::PerkProgramDataStoreMgr() {};
PerkProgramDataStoreMgr::~PerkProgramDataStoreMgr() {};
PerkProgramDataStoreMgr* PerkProgramDataStoreMgr::instance()
{
static PerkProgramDataStoreMgr instance;
return &instance;
}
namespace
{
std::unordered_map<uint32, PerkProgramData::PerkVendorItem> _vendorTemplates;
std::vector<PerkProgramData::ActivityTemplate> m_activeActivity;
}
void PerkProgramDataStoreMgr::Initialize()
{
LoadPerkVendorItem();
LoadActivities();
}
void PerkProgramDataStoreMgr::LoadPerkVendorItem()
{
TC_LOG_INFO("server.loading", "Loading PerkPrograms Vendor Items Templates ...");
_vendorTemplates.clear();
if (!sPerksVendorItemStore.GetNumRows())
{
TC_LOG_WARN("server.loading", ">> PerksVendorItem store is empty, skipping vendor items");
return;
}
for (PerksVendorItemEntry const* itemVendor : sPerksVendorItemStore)
{
if (!itemVendor)
continue;
PerkProgramData::PerkVendorItem vendorItem;
vendorItem.Id = itemVendor->ID;
vendorItem.ItemID = itemVendor->ItemID;
vendorItem.MountSpellID = itemVendor->Unknown010001;
vendorItem.PetSpellID = itemVendor->Unknown020001;
vendorItem.TransmogSet = 0;
vendorItem.ItemModifiedAppearanceID = 0;
vendorItem.ToyItem = 0;
vendorItem.Cost = itemVendor->Cost;
vendorItem.CategoryId = itemVendor->PerksVendorCategoryID;
_vendorTemplates.insert(std::make_pair(itemVendor->ID, vendorItem));
}
TC_LOG_INFO("server.loading", ">> Loaded {} PerkPrograms Vendor Items Templates", uint32(_vendorTemplates.size()));
}
std::unordered_map<uint32, PerkProgramData::PerkVendorItem> PerkProgramDataStoreMgr::GetVendorItems()
{
return _vendorTemplates;
}
PerkProgramData::PerkVendorItem const* PerkProgramDataStoreMgr::GetVendorItem(uint32 entry)
{
auto itr = _vendorTemplates.find(entry);
if (itr != _vendorTemplates.end())
return &itr->second;
return nullptr;
}
PerkProgramData::PerkVendorItem const* PerkProgramDataStoreMgr::GetRandomVendorItem()
{
if (_vendorTemplates.empty())
return nullptr;
auto it = _vendorTemplates.begin();
std::advance(it, rand() % _vendorTemplates.size());
return &it->second;
}
std::vector<PerkProgramData::ActivityTemplate> PerkProgramDataStoreMgr::GetActivities()
{
return m_activeActivity;
}
uint32 PerkProgramDataStoreMgr::GetActivityCriteriatree(uint32 activityId)
{
for (auto const& ac : m_activeActivity)
{
if (ac.ActivityID == activityId)
return ac.CriteriaTree;
}
return 0;
}
uint32 PerkProgramDataStoreMgr::GetActivityCurrencyAmount(uint32 activityId)
{
for (auto const& ac : m_activeActivity)
{
if (ac.ActivityID == activityId)
return ac.CurrencyAmount;
}
return 0;
}
void PerkProgramDataStoreMgr::LoadActivities()
{
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PERK_PROGRAM_ACTIVITY);
PreparedQueryResult result = CharacterDatabase.Query(stmt);
m_activeActivity.clear();
if (!result)
{
GenerateRandomActivities(false);
return;
}
do
{
Field* fields = result->Fetch();
uint32 activityId = fields[0].GetUInt32();
PerksActivityEntry const* entry = sPerksActivityStore.LookupEntry(activityId);
if (!entry)
continue;
PerkProgramData::ActivityTemplate ac;
ac.ActivityID = entry->ID;
ac.CriteriaTree = entry->CriteriaTreeID;
ac.CurrencyAmount = entry->ThresholdContributionAmount;
ac.Priority = entry->Priority;
m_activeActivity.push_back(ac);
} while (result->NextRow());
}
void PerkProgramDataStoreMgr::GenerateRandomActivities(bool /*clearOld*/)
{
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PERK_PROGRAM_ACTIVITY);
CharacterDatabase.Execute(stmt);
m_activeActivity.clear();
for (PerksActivityEntry const* db : sDB2Manager.GetRandomActivitiesXTag())
{
PerkProgramData::ActivityTemplate ac;
ac.ActivityID = db->ID;
ac.CriteriaTree = db->CriteriaTreeID;
ac.CurrencyAmount = db->ThresholdContributionAmount;
ac.Priority = db->Priority;
m_activeActivity.push_back(ac);
stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_PERK_PROGRAM_ACTIVITY);
stmt->setUInt32(0, ac.ActivityID);
CharacterDatabase.Execute(stmt);
}
}
+75 -75
View File
@@ -1,75 +1,75 @@
///*
// * Copyright (C) WowCommunity Project
// *
// * This SourceCode is NOT free a software. Please hold everything Private
// * and read our Terms
// */
//
//#ifndef _PERK_PROGRAM_DATA_STORE_H
//#define _PERK_PROGRAM_DATA_STORE_H
//
//#include "PerksProgramPacketsCommon.h"
//#include "PacketUtilities.h"
//#include "DatabaseEnv.h"
//#include <vector>
//#include <unordered_map>
//#include <ctime>
//
//class PerkProgramManager;
//
//namespace PerkProgramData
//{
// struct PerkVendorItem
// {
// uint32 Id;
// uint32 ItemID;
// uint32 MountSpellID;
// uint32 PetSpellID;
// uint32 TransmogSet;
// uint32 ItemModifiedAppearanceID;
// uint32 ToyItem;
// time_t AvailableUntil;
// uint32 Cost;
// uint32 CategoryId;
//
// };
//
// struct ActivityTemplate
// {
// uint32 ActivityID;
// uint32 CriteriaTree;
// uint32 Priority;
// uint32 CurrencyAmount;
// };
//};
//
//class TC_GAME_API PerkProgramDataStoreMgr
//{
// PerkProgramDataStoreMgr();
// ~PerkProgramDataStoreMgr();
//
//public:
// static PerkProgramDataStoreMgr* instance();
//
// void Initialize();
//
// std::unordered_map<uint32, PerkProgramData::PerkVendorItem> GetVendorItems();
// PerkProgramData::PerkVendorItem const* GetVendorItem(uint32 entry);
// PerkProgramData::PerkVendorItem const* GetRandomVendorItem();
//
// std::vector<PerkProgramData::ActivityTemplate> GetActivities();
// uint32 GetActivityCriteriatree(uint32 activityId);
// uint32 GetActivityCurrencyAmount(uint32 activityId);
//
//private:
//
// void LoadPerkVendorItem();
// void LoadActivities();
// void GenerateRandomActivities(bool clearOld);
// time_t m_activityTime;
//
//};
//
//#define sPerkProgramDataStore PerkProgramDataStoreMgr::instance()
//
//#endif
/*
* Copyright (C) WowCommunity Project
*
* This SourceCode is NOT free a software. Please hold everything Private
* and read our Terms
*/
#ifndef _PERK_PROGRAM_DATA_STORE_H
#define _PERK_PROGRAM_DATA_STORE_H
#include "PerksProgramPacketsCommon.h"
#include "PacketUtilities.h"
#include "DatabaseEnv.h"
#include <vector>
#include <unordered_map>
#include <ctime>
class PerkProgramManager;
namespace PerkProgramData
{
struct PerkVendorItem
{
uint32 Id;
uint32 ItemID;
uint32 MountSpellID;
uint32 PetSpellID;
uint32 TransmogSet;
uint32 ItemModifiedAppearanceID;
uint32 ToyItem;
time_t AvailableUntil;
uint32 Cost;
uint32 CategoryId;
};
struct ActivityTemplate
{
uint32 ActivityID;
uint32 CriteriaTree;
uint32 Priority;
uint32 CurrencyAmount;
};
};
class TC_GAME_API PerkProgramDataStoreMgr
{
PerkProgramDataStoreMgr();
~PerkProgramDataStoreMgr();
public:
static PerkProgramDataStoreMgr* instance();
void Initialize();
std::unordered_map<uint32, PerkProgramData::PerkVendorItem> GetVendorItems();
PerkProgramData::PerkVendorItem const* GetVendorItem(uint32 entry);
PerkProgramData::PerkVendorItem const* GetRandomVendorItem();
std::vector<PerkProgramData::ActivityTemplate> GetActivities();
uint32 GetActivityCriteriatree(uint32 activityId);
uint32 GetActivityCurrencyAmount(uint32 activityId);
private:
void LoadPerkVendorItem();
void LoadActivities();
void GenerateRandomActivities(bool clearOld);
time_t m_activityTime;
};
#define sPerkProgramDataStore PerkProgramDataStoreMgr::instance()
#endif
+430 -430
View File
@@ -1,430 +1,430 @@
///*
// * Copyright (C) WowCommunity Project
// *
// * This SourceCode is NOT free a software. Please hold everything Private
// * and read our Terms
// */
//
//#include "Common.h"
//#include "CollectionMgr.h"
//#include "ObjectMgr.h"
//#include "PerkProgramMgr.h"
//#include "WorldSession.h"
//#include "Guild.h"
//#include "GuildMgr.h"
//#include "Player.h"
//#include "Creature.h"
//#include "PerkProgramData.h"
//#include "DatabaseEnv.h"
//#include "ScriptMgr.h"
//#include "AccountMgr.h"
//#include <sstream>
//#include "SpellInfo.h"
//#include "SpellMgr.h"
//#include "Language.h"
//#include "SpellPackets.h"
//#include "Chat.h"
//#include "DB2Stores.h"
//#include "Pet.h"
//#include "Item.h"
//#include "MiscPackets.h"
//#include "Unit.h"
//#include "GameTime.h"
//#include "PerksProgramPackets.h"
//
//using namespace PerkPrograms;
//
//PerkProgramManager::PerkProgramManager(WorldSession* session)
//{
// _session = session;
// if (session->GetPlayer())
// m_player = session->GetPlayer();
//
// m_currencyAmount = 0;
//}
//
//PerkProgramManager::~PerkProgramManager()
//{
//};
//
//void PerkProgramManager::SendVendorItems(Creature* vendor, std::vector<uint32> purchasedItems)
//{
// WorldPackets::PerksProgram::PerksProgramResult perks;
// perks.Type = PerkPrograms::RESULT_AVAILABLE_ITEMS;
//
// uint32 cameraId = 0;
//
// switch (vendor->GetEntry())
// {
// case PerkPrograms::VENDOR_HORDE:
// cameraId = PerkPrograms::CAMERA_HORDE;
// break;
// case PerkPrograms::VENDOR_ALLIANCE:
// cameraId = PerkPrograms::CAMERA_ALLIANCE;
// break;
// default:
// cameraId = 0;
// break;
// }
// perks.Params.VendorItem.VendorGuid = vendor->GetGUID();
//
// if (cameraId != 0)
// {
// std::list<Creature*> list;
// _session->GetPlayer()->GetCreatureListWithEntryInGrid(list, cameraId, 100);
//
// for (auto cr1 : list)
// {
// perks.Params.VendorItem.ModelSceneCameraGuid = cr1->GetGUID();
// break;
// }
// }
//
// for (auto items : sPerkProgramDataStore->GetVendorItems())
// {
// WorldPackets::PerksProgram::PerksVendorItem vendorItem;
// vendorItem.VendorItemID = items.second.Id;
// vendorItem.MountID = items.second.MountSpellID;
// vendorItem.BattlePetSpeciesID = items.second.PetSpellID;
// vendorItem.ItemModifiedAppearanceID = items.second.ItemModifiedAppearanceID;
// vendorItem.ToyID = items.second.ToyItem;
// vendorItem.TransmogSetID = items.second.TransmogSet;
// vendorItem.Price = items.second.Cost;
// vendorItem.CategoryType = items.second.CategoryId;
// vendorItem.Disabled = false;
// vendorItem.AvailableUntil = items.second.AvailableUntil;
// perks.Params.VendorItem.FrozenPerksVendorItems.emplace_back(vendorItem);
//
// }
//
// _session->SendPacket(perks.Write());
//}
//
//bool PerkProgramManager::IsAccountWideItem(uint32 item)
//{
// bool level = false;
// if (auto i = sPerkProgramDataStore->GetVendorItem(item))
// {
// switch (i->CategoryId)
// {
// case PerkPrograms::PERKS_VENDOR_CATEGORY_TOYS:
// case PerkPrograms::PERKS_VENDOR_CATEGORY_MOUNTS:
// case PerkPrograms::PERKS_VENDOR_CATEGORY_TRANSMOG_SETS:
// level = true;
// break;
// default:
// break;
// }
// }
// return level;
//}
//
//bool PerkProgramManager::IsItemAlreadyOwned(PerkProgramData::PerkVendorItem const* vendorItem)
//{
// if (!vendorItem)
// return true;
//
// switch (vendorItem->CategoryId)
// {
// case PerkPrograms::PERKS_VENDOR_CATEGORY_TOYS:
// return m_player->GetSession()->GetCollectionMgr()->HasToy(vendorItem->ToyItem);
// // case PerkPrograms::PERKS_VENDOR_CATEGORY_MOUNTS:
// // return m_player->GetMountCollection()->Has(vendorItem->MountSpellID);
// // case PerkPrograms::PERKS_VENDOR_CATEGORY_TRANSMOG_SETS:
// // return m_player->GetSession()->GetCollectionMgr()->HasTransmogSet(vendorItem->TransmogSet);
// // case PerkPrograms::PERKS_VENDOR_CATEGORY_TRANSMOG:
// // return m_player->GetSession()->GetCollectionMgr()->HasItemAppearance(vendorItem->ItemModifiedAppearanceID);
// // case PerkPrograms::PERKS_VENDOR_CATEGORY_PETS:
// // return m_player->GetBattlePetCollection()->HasPet(vendorItem->PetSpellID);
// default:
// break;
// }
//
// return false;
//}
//
//void PerkProgramManager::GrantItem(PerkProgramData::PerkVendorItem const* vendorItem)
//{
// if (!vendorItem)
// return;
//
// switch (vendorItem->CategoryId)
// {
// case PerkPrograms::PERKS_VENDOR_CATEGORY_TOYS:
// {
// m_player->GetSession()->GetCollectionMgr()->AddToy(vendorItem->ToyItem, false, false);
// break;
// }
// case PerkPrograms::PERKS_VENDOR_CATEGORY_MOUNTS:
// {
// m_player->LearnSpell(vendorItem->MountSpellID, false);
// break;
// }
// case PerkPrograms::PERKS_VENDOR_CATEGORY_TRANSMOG_SETS:
// {
// m_player->GetSession()->GetCollectionMgr()->AddTransmogSet(vendorItem->TransmogSet);
// break;
// }
// case PerkPrograms::PERKS_VENDOR_CATEGORY_TRANSMOG:
// {
// m_player->GetSession()->GetCollectionMgr()->AddItemAppearance(vendorItem->ItemModifiedAppearanceID);
// break;
// }
// case PerkPrograms::PERKS_VENDOR_CATEGORY_PETS:
// {
// // m_player->AddBattlePet(vendorItem->PetSpellID);
// break;
// }
// case PerkPrograms::PERKS_VENDOR_CATEGORY_CONSUMABLES:
// {
// m_player->AddItem(vendorItem->ItemID, 1);
// break;
// }
// default:
// break;
// }
//}
//
//void PerkProgramManager::RemoveGrantedItem(PerkProgramData::PerkVendorItem const* vendorItem)
//{
// if (!vendorItem)
// return;
//
// switch (vendorItem->CategoryId)
// {
// case PerkPrograms::PERKS_VENDOR_CATEGORY_TOYS:
// break;
// case PerkPrograms::PERKS_VENDOR_CATEGORY_MOUNTS:
// m_player->RemoveSpell(vendorItem->MountSpellID, false, true);
// break;
// case PerkPrograms::PERKS_VENDOR_CATEGORY_TRANSMOG_SETS:
// break;
// case PerkPrograms::PERKS_VENDOR_CATEGORY_TRANSMOG:
// break;
// case PerkPrograms::PERKS_VENDOR_CATEGORY_PETS:
// break;
// case PerkPrograms::PERKS_VENDOR_CATEGORY_CONSUMABLES:
// m_player->DestroyItemCount(vendorItem->ItemID, 1, true);
// break;
// default:
// break;
// }
//}
//
//void PerkProgramManager::BuyItem(uint32 itemId, ObjectGuid /*vendor*/)
//{
// auto const* vendorItem = sPerkProgramDataStore->GetVendorItem(itemId);
// if (!vendorItem)
// {
// SendPerksProgramError(1);
// return;
// }
//
// if (m_currencyAmount < vendorItem->Cost)
// {
// SendPerksProgramError(2);
// return;
// }
//
// if (IsItemAlreadyOwned(vendorItem))
// {
// SendPerksProgramError(3);
// return;
// }
//
// m_currencyAmount -= vendorItem->Cost;
// m_player->ModifyCurrency(PERKS_PROGRAM_CURRENCY, -static_cast<int32>(vendorItem->Cost));
//
// GrantItem(vendorItem);
//
// RecordPurchase(itemId, GameTime::GetGameTime());
//
// SendBuyItemResult(itemId);
// SendCurrencyRefresh();
//}
//
//void PerkProgramManager::SendBuyItemResult(int32 itemId)
//{
// WorldPackets::PerksProgram::PerksProgramResult perks;
// perks.Type = PerkPrograms::RESULT_BUY_ITEM;
// perks.Params.BuyItem.VendorItemID = itemId;
//
// WorldPackets::PerksProgram::JamTimePair time;
// time.BuyTime = GameTime::GetGameTime();
// time.VendorItemID = itemId;
// perks.Params.BuyItem.TimePair.emplace_back(time);
//
// _session->SendPacket(perks.Write());
//}
//
//void PerkProgramManager::SendCurrencyRefresh()
//{
// WorldPackets::PerksProgram::PerksProgramResult perks;
// perks.Type = PerkPrograms::RESULT_CURRENCY_REFRESH;
// _session->SendPacket(perks.Write());
//}
//
//void PerkProgramManager::SendPerksProgramError(uint32 errorCode)
//{
// WorldPackets::PerksProgram::PerksProgramResult perks;
// perks.Type = PerkPrograms::RESULT_ERROR;
// _session->SendPacket(perks.Write());
//}
//
//void PerkProgramManager::RecordPurchase(uint32 itemId, time_t purchaseTime)
//{
// m_recentPurchases.push_back(std::make_pair(itemId, purchaseTime));
//}
//
//void PerkProgramManager::RefundItem(int32 itemId)
//{
// auto it = std::find_if(m_recentPurchases.begin(), m_recentPurchases.end(),
// [itemId](std::pair<uint32, time_t> const& p) { return p.first == static_cast<uint32>(itemId); });
//
// if (it == m_recentPurchases.end())
// {
// SendPerksProgramError(4);
// return;
// }
//
// if (GameTime::GetGameTime() - it->second > REFUND_WINDOW_SECONDS)
// {
// SendPerksProgramError(5);
// return;
// }
//
// auto const* vendorItem = sPerkProgramDataStore->GetVendorItem(itemId);
// if (!vendorItem)
// return;
//
// RemoveGrantedItem(vendorItem);
//
// m_currencyAmount += vendorItem->Cost;
// m_player->ModifyCurrency(PERKS_PROGRAM_CURRENCY, static_cast<int32>(vendorItem->Cost));
//
// m_recentPurchases.erase(it);
//
// SendRefundSuccess(itemId);
// SendCurrencyRefresh();
//}
//
//void PerkProgramManager::SendRefundSuccess(int32 itemId)
//{
// WorldPackets::PerksProgram::PerksProgramResult perks;
// perks.Type = PerkPrograms::RESULT_REFUND_SUCCESS;
// perks.Params.BuyItem.VendorItemID = itemId;
// _session->SendPacket(perks.Write());
//}
//
//void PerkProgramManager::CartCheckout(std::vector<uint32> const& vendorItemIDs)
//{
// uint32 totalCost = 0;
//
// for (uint32 itemId : vendorItemIDs)
// {
// auto const* item = sPerkProgramDataStore->GetVendorItem(itemId);
// if (!item)
// {
// SendPerksProgramError(1);
// return;
// }
// totalCost += item->Cost;
// }
//
// if (m_currencyAmount < totalCost)
// {
// SendPerksProgramError(2);
// return;
// }
//
// for (uint32 itemId : vendorItemIDs)
// {
// auto const* item = sPerkProgramDataStore->GetVendorItem(itemId);
// if (!item)
// continue;
//
// if (IsItemAlreadyOwned(item))
// continue;
//
// m_currencyAmount -= item->Cost;
// m_player->ModifyCurrency(PERKS_PROGRAM_CURRENCY, -static_cast<int32>(item->Cost));
//
// GrantItem(item);
// RecordPurchase(itemId, GameTime::GetGameTime());
// }
//
// SendCartCheckoutSuccess();
// SendCurrencyRefresh();
//}
//
//void PerkProgramManager::SendCartCheckoutSuccess()
//{
// WorldPackets::PerksProgram::PerksProgramResult perks;
// perks.Type = PerkPrograms::RESULT_PURCHASE_CART;
// _session->SendPacket(perks.Write());
//}
//
//void PerkProgramManager::SendPerksProgramStatus()
//{
// WorldPackets::PerksProgram::PerksProgramResult perks;
// perks.Type = PerkPrograms::RESULT_CURRENCY_REFRESH;
// _session->SendPacket(perks.Write());
//}
//
//void PerkProgramManager::SendPendingRewards()
//{
//}
//
//void PerkProgramManager::SetFrozenItem(int32 itemId, bool clear)
//{
// if (clear)
// {
// m_frozenItems.clear();
// }
// else
// {
// auto const* item = sPerkProgramDataStore->GetVendorItem(itemId);
// if (item)
// {
// m_frozenItems.clear();
// m_frozenItems.push_back(*item);
// }
// }
//
// WorldPackets::PerksProgram::PerksProgramResult perks;
// perks.Type = PerkPrograms::RESULT_FROZEN_ITEM;
// _session->SendPacket(perks.Write());
//}
//
//void PerkProgramManager::AddTrackedActivity(uint32 activityId)
//{
// if (std::find(m_trackedActivities.begin(), m_trackedActivities.end(), activityId) == m_trackedActivities.end())
// {
// m_trackedActivities.push_back(activityId);
// }
//}
//
//void PerkProgramManager::RemoveTrackedActivity(uint32 activityId)
//{
// auto it = std::find(m_trackedActivities.begin(), m_trackedActivities.end(), activityId);
// if (it != m_trackedActivities.end())
// {
// m_trackedActivities.erase(it);
// }
//}
//
//void PerkProgramManager::SendPerksProgramActivities()
//{
// WorldPackets::PerksProgram::PerksProgramActivityUpdate activity;
//
// activity.TimeUntilStart = GameTime::GetGameTime();
// // activity.TimeUntilEnd = sWorld->GetNextPerksProgramReset();
//
// for (auto ac : sPerkProgramDataStore->GetActivities())
// {
// activity.ActivityIDs.push_back(ac.ActivityID);
//
// }
// _session->SendPacket(activity.Write());
//
//}
/*
* Copyright (C) WowCommunity Project
*
* This SourceCode is NOT free a software. Please hold everything Private
* and read our Terms
*/
#include "Common.h"
#include "CollectionMgr.h"
#include "ObjectMgr.h"
#include "PerkProgramMgr.h"
#include "WorldSession.h"
#include "Guild.h"
#include "GuildMgr.h"
#include "Player.h"
#include "Creature.h"
#include "PerkProgramData.h"
#include "DatabaseEnv.h"
#include "ScriptMgr.h"
#include "AccountMgr.h"
#include <sstream>
#include "SpellInfo.h"
#include "SpellMgr.h"
#include "Language.h"
#include "SpellPackets.h"
#include "Chat.h"
#include "DB2Stores.h"
#include "Pet.h"
#include "Item.h"
#include "MiscPackets.h"
#include "Unit.h"
#include "GameTime.h"
#include "PerksProgramPackets.h"
using namespace PerkPrograms;
PerkProgramManager::PerkProgramManager(WorldSession* session)
{
_session = session;
if (session->GetPlayer())
m_player = session->GetPlayer();
m_currencyAmount = 0;
}
PerkProgramManager::~PerkProgramManager()
{
};
void PerkProgramManager::SendVendorItems(Creature* vendor, std::vector<uint32> purchasedItems)
{
WorldPackets::PerksProgram::PerksProgramResult perks;
perks.Type = PerkPrograms::RESULT_AVAILABLE_ITEMS;
uint32 cameraId = 0;
switch (vendor->GetEntry())
{
case PerkPrograms::VENDOR_HORDE:
cameraId = PerkPrograms::CAMERA_HORDE;
break;
case PerkPrograms::VENDOR_ALLIANCE:
cameraId = PerkPrograms::CAMERA_ALLIANCE;
break;
default:
cameraId = 0;
break;
}
perks.Params.VendorItem.VendorGuid = vendor->GetGUID();
if (cameraId != 0)
{
std::list<Creature*> list;
_session->GetPlayer()->GetCreatureListWithEntryInGrid(list, cameraId, 100);
for (auto cr1 : list)
{
perks.Params.VendorItem.ModelSceneCameraGuid = cr1->GetGUID();
break;
}
}
for (auto items : sPerkProgramDataStore->GetVendorItems())
{
WorldPackets::PerksProgram::PerksVendorItem vendorItem;
vendorItem.VendorItemID = items.second.Id;
vendorItem.MountID = items.second.MountSpellID;
vendorItem.BattlePetSpeciesID = items.second.PetSpellID;
vendorItem.ItemModifiedAppearanceID = items.second.ItemModifiedAppearanceID;
vendorItem.ToyID = items.second.ToyItem;
vendorItem.TransmogSetID = items.second.TransmogSet;
vendorItem.Price = items.second.Cost;
vendorItem.OriginalPrice = items.second.CategoryId;
vendorItem.Disabled = false;
vendorItem.AvailableUntil = items.second.AvailableUntil;
perks.Params.VendorItem.FrozenPerksVendorItems.emplace_back(vendorItem);
}
_session->SendPacket(perks.Write());
}
bool PerkProgramManager::IsAccountWideItem(uint32 item)
{
bool level = false;
if (auto i = sPerkProgramDataStore->GetVendorItem(item))
{
switch (i->CategoryId)
{
case PerkPrograms::PERKS_VENDOR_CATEGORY_TOYS:
case PerkPrograms::PERKS_VENDOR_CATEGORY_MOUNTS:
case PerkPrograms::PERKS_VENDOR_CATEGORY_TRANSMOG_SETS:
level = true;
break;
default:
break;
}
}
return level;
}
bool PerkProgramManager::IsItemAlreadyOwned(PerkProgramData::PerkVendorItem const* vendorItem)
{
if (!vendorItem)
return true;
switch (vendorItem->CategoryId)
{
case PerkPrograms::PERKS_VENDOR_CATEGORY_TOYS:
return m_player->GetSession()->GetCollectionMgr()->HasToy(vendorItem->ToyItem);
// case PerkPrograms::PERKS_VENDOR_CATEGORY_MOUNTS:
// return m_player->GetMountCollection()->Has(vendorItem->MountSpellID);
// case PerkPrograms::PERKS_VENDOR_CATEGORY_TRANSMOG_SETS:
// return m_player->GetSession()->GetCollectionMgr()->HasTransmogSet(vendorItem->TransmogSet);
// case PerkPrograms::PERKS_VENDOR_CATEGORY_TRANSMOG:
// return m_player->GetSession()->GetCollectionMgr()->HasItemAppearance(vendorItem->ItemModifiedAppearanceID);
// case PerkPrograms::PERKS_VENDOR_CATEGORY_PETS:
// return m_player->GetBattlePetCollection()->HasPet(vendorItem->PetSpellID);
default:
break;
}
return false;
}
void PerkProgramManager::GrantItem(PerkProgramData::PerkVendorItem const* vendorItem)
{
if (!vendorItem)
return;
switch (vendorItem->CategoryId)
{
case PerkPrograms::PERKS_VENDOR_CATEGORY_TOYS:
{
m_player->GetSession()->GetCollectionMgr()->AddToy(vendorItem->ToyItem, false, false);
break;
}
case PerkPrograms::PERKS_VENDOR_CATEGORY_MOUNTS:
{
m_player->LearnSpell(vendorItem->MountSpellID, false);
break;
}
case PerkPrograms::PERKS_VENDOR_CATEGORY_TRANSMOG_SETS:
{
m_player->GetSession()->GetCollectionMgr()->AddTransmogSet(vendorItem->TransmogSet);
break;
}
case PerkPrograms::PERKS_VENDOR_CATEGORY_TRANSMOG:
{
m_player->GetSession()->GetCollectionMgr()->AddItemAppearance(vendorItem->ItemModifiedAppearanceID);
break;
}
case PerkPrograms::PERKS_VENDOR_CATEGORY_PETS:
{
// m_player->AddBattlePet(vendorItem->PetSpellID);
break;
}
case PerkPrograms::PERKS_VENDOR_CATEGORY_CONSUMABLES:
{
m_player->AddItem(vendorItem->ItemID, 1);
break;
}
default:
break;
}
}
void PerkProgramManager::RemoveGrantedItem(PerkProgramData::PerkVendorItem const* vendorItem)
{
if (!vendorItem)
return;
switch (vendorItem->CategoryId)
{
case PerkPrograms::PERKS_VENDOR_CATEGORY_TOYS:
break;
case PerkPrograms::PERKS_VENDOR_CATEGORY_MOUNTS:
m_player->RemoveSpell(vendorItem->MountSpellID, false, true);
break;
case PerkPrograms::PERKS_VENDOR_CATEGORY_TRANSMOG_SETS:
break;
case PerkPrograms::PERKS_VENDOR_CATEGORY_TRANSMOG:
break;
case PerkPrograms::PERKS_VENDOR_CATEGORY_PETS:
break;
case PerkPrograms::PERKS_VENDOR_CATEGORY_CONSUMABLES:
m_player->DestroyItemCount(vendorItem->ItemID, 1, true);
break;
default:
break;
}
}
void PerkProgramManager::BuyItem(uint32 itemId, ObjectGuid /*vendor*/)
{
auto const* vendorItem = sPerkProgramDataStore->GetVendorItem(itemId);
if (!vendorItem)
{
SendPerksProgramError(1);
return;
}
if (m_currencyAmount < vendorItem->Cost)
{
SendPerksProgramError(2);
return;
}
if (IsItemAlreadyOwned(vendorItem))
{
SendPerksProgramError(3);
return;
}
m_currencyAmount -= vendorItem->Cost;
m_player->ModifyCurrency(PERKS_PROGRAM_CURRENCY, -static_cast<int32>(vendorItem->Cost));
GrantItem(vendorItem);
RecordPurchase(itemId, GameTime::GetGameTime());
SendBuyItemResult(itemId);
SendCurrencyRefresh();
}
void PerkProgramManager::SendBuyItemResult(int32 itemId)
{
WorldPackets::PerksProgram::PerksProgramResult perks;
perks.Type = PerkPrograms::RESULT_BUY_ITEM;
perks.Params.BuyItem.VendorItemID = itemId;
WorldPackets::PerksProgram::JamTimePair time;
time.BuyTime = GameTime::GetGameTime();
time.VendorItemID = itemId;
perks.Params.BuyItem.TimePair.emplace_back(time);
_session->SendPacket(perks.Write());
}
void PerkProgramManager::SendCurrencyRefresh()
{
WorldPackets::PerksProgram::PerksProgramResult perks;
perks.Type = PerkPrograms::RESULT_CURRENCY_REFRESH;
_session->SendPacket(perks.Write());
}
void PerkProgramManager::SendPerksProgramError(uint32 errorCode)
{
WorldPackets::PerksProgram::PerksProgramResult perks;
perks.Type = PerkPrograms::RESULT_ERROR;
_session->SendPacket(perks.Write());
}
void PerkProgramManager::RecordPurchase(uint32 itemId, time_t purchaseTime)
{
m_recentPurchases.push_back(std::make_pair(itemId, purchaseTime));
}
void PerkProgramManager::RefundItem(int32 itemId)
{
auto it = std::find_if(m_recentPurchases.begin(), m_recentPurchases.end(),
[itemId](std::pair<uint32, time_t> const& p) { return p.first == static_cast<uint32>(itemId); });
if (it == m_recentPurchases.end())
{
SendPerksProgramError(4);
return;
}
if (GameTime::GetGameTime() - it->second > REFUND_WINDOW_SECONDS)
{
SendPerksProgramError(5);
return;
}
auto const* vendorItem = sPerkProgramDataStore->GetVendorItem(itemId);
if (!vendorItem)
return;
RemoveGrantedItem(vendorItem);
m_currencyAmount += vendorItem->Cost;
m_player->ModifyCurrency(PERKS_PROGRAM_CURRENCY, static_cast<int32>(vendorItem->Cost));
m_recentPurchases.erase(it);
SendRefundSuccess(itemId);
SendCurrencyRefresh();
}
void PerkProgramManager::SendRefundSuccess(int32 itemId)
{
WorldPackets::PerksProgram::PerksProgramResult perks;
perks.Type = PerkPrograms::RESULT_REFUND_SUCCESS;
perks.Params.BuyItem.VendorItemID = itemId;
_session->SendPacket(perks.Write());
}
void PerkProgramManager::CartCheckout(std::vector<uint32> const& vendorItemIDs)
{
uint32 totalCost = 0;
for (uint32 itemId : vendorItemIDs)
{
auto const* item = sPerkProgramDataStore->GetVendorItem(itemId);
if (!item)
{
SendPerksProgramError(1);
return;
}
totalCost += item->Cost;
}
if (m_currencyAmount < totalCost)
{
SendPerksProgramError(2);
return;
}
for (uint32 itemId : vendorItemIDs)
{
auto const* item = sPerkProgramDataStore->GetVendorItem(itemId);
if (!item)
continue;
if (IsItemAlreadyOwned(item))
continue;
m_currencyAmount -= item->Cost;
m_player->ModifyCurrency(PERKS_PROGRAM_CURRENCY, -static_cast<int32>(item->Cost));
GrantItem(item);
RecordPurchase(itemId, GameTime::GetGameTime());
}
SendCartCheckoutSuccess();
SendCurrencyRefresh();
}
void PerkProgramManager::SendCartCheckoutSuccess()
{
WorldPackets::PerksProgram::PerksProgramResult perks;
perks.Type = PerkPrograms::RESULT_PURCHASE_CART;
_session->SendPacket(perks.Write());
}
void PerkProgramManager::SendPerksProgramStatus()
{
WorldPackets::PerksProgram::PerksProgramResult perks;
perks.Type = PerkPrograms::RESULT_CURRENCY_REFRESH;
_session->SendPacket(perks.Write());
}
void PerkProgramManager::SendPendingRewards()
{
}
void PerkProgramManager::SetFrozenItem(int32 itemId, bool clear)
{
if (clear)
{
m_frozenItems.clear();
}
else
{
auto const* item = sPerkProgramDataStore->GetVendorItem(itemId);
if (item)
{
m_frozenItems.clear();
m_frozenItems.push_back(*item);
}
}
WorldPackets::PerksProgram::PerksProgramResult perks;
perks.Type = PerkPrograms::RESULT_FROZEN_ITEM;
_session->SendPacket(perks.Write());
}
void PerkProgramManager::AddTrackedActivity(uint32 activityId)
{
if (std::find(m_trackedActivities.begin(), m_trackedActivities.end(), activityId) == m_trackedActivities.end())
{
m_trackedActivities.push_back(activityId);
}
}
void PerkProgramManager::RemoveTrackedActivity(uint32 activityId)
{
auto it = std::find(m_trackedActivities.begin(), m_trackedActivities.end(), activityId);
if (it != m_trackedActivities.end())
{
m_trackedActivities.erase(it);
}
}
void PerkProgramManager::SendPerksProgramActivities()
{
WorldPackets::PerksProgram::PerksProgramActivityUpdate activity;
activity.TimeUntilStart = GameTime::GetGameTime();
// activity.TimeUntilEnd = sWorld->GetNextPerksProgramReset();
for (auto ac : sPerkProgramDataStore->GetActivities())
{
activity.ActivityIDs.push_back(ac.ActivityID);
}
_session->SendPacket(activity.Write());
}
+113 -113
View File
@@ -1,113 +1,113 @@
///*
// * Copyright (C) WowCommunity Project
// *
// * This SourceCode is NOT free a software. Please hold everything Private
// * and read our Terms
// */
//
//#ifndef __TRINITY_PERKPROGRAMMGR_H
//#define __TRINITY_PERKPROGRAMMGR_H
//
//#include "Common.h"
//#include "PerksProgramPacketsCommon.h"
//#include "PerkProgramData.h"
//
//class WorldSession;
//class Player;
//class Creature;
//
//#define PERKS_PROGRAM_CURRENCY 2032
//
//namespace PerkPrograms
//{
// enum PerksVendorCategoryType : uint32
// {
// PERKS_VENDOR_CATEGORY_NONE = 0,
// PERKS_VENDOR_CATEGORY_MOUNTS = 1,
// PERKS_VENDOR_CATEGORY_PETS = 2,
// PERKS_VENDOR_CATEGORY_TOYS = 3,
// PERKS_VENDOR_CATEGORY_TRANSMOG = 4,
// PERKS_VENDOR_CATEGORY_TRANSMOG_SETS = 5,
// PERKS_VENDOR_CATEGORY_CONSUMABLES = 6,
// };
//
// enum ItemCollectionType : uint32
// {
// ITEM_COLLECTION_NONE = 0,
// ITEM_COLLECTION_APPEARANCE = 1,
// ITEM_COLLECTION_MOUNT = 2,
// ITEM_COLLECTION_TOY = 3,
// ITEM_COLLECTION_PET = 4,
// ITEM_COLLECTION_HEIRLOOM = 5,
// ITEM_COLLECTION_ILLUSION = 6,
// ITEM_COLLECTION_ENSEMBLE = 7,
// };
//
// enum NpcVendorAndCameras : uint32
// {
// CAMERA_HORDE = 183978,
// CAMERA_ALLIANCE = 1,
// VENDOR_HORDE = 185473,
// VENDOR_ALLIANCE = 3,
// };
//
// enum ResultType : uint32
// {
// RESULT_NONE = 0,
// RESULT_BUY_ITEM = 2,
// RESULT_AVAILABLE_ITEMS = 5,
// RESULT_PURCHASE_CART = 6,
// RESULT_REFUND_SUCCESS = 7,
// RESULT_ERROR = 10,
// RESULT_CURRENCY_REFRESH = 11,
// RESULT_FROZEN_ITEM = 12,
// RESULT_ACTIVITY_UPDATE = 13,
// };
//
//}
//
//class TC_GAME_API PerkProgramManager
//{
//
//public:
// explicit PerkProgramManager(WorldSession* session);
// ~PerkProgramManager();
//
// void SendVendorItems(Creature* vendor, std::vector<uint32> purchasedItems);
// void BuyItem(uint32 itemId, ObjectGuid vendor);
// bool IsAccountWideItem(uint32 item);
//
// void SetCurrencyAmount(uint32 amount) { m_currencyAmount = amount; }
// uint32 GetCurrencyAmount() { return m_currencyAmount; }
//
// void SendPerksProgramActivities();
// void SendPerksProgramStatus();
// void SendPendingRewards();
// void SetFrozenItem(int32 itemId, bool clear);
// void RefundItem(int32 itemId);
// void CartCheckout(std::vector<uint32> const& itemIds);
// void AddTrackedActivity(uint32 activityId);
// void RemoveTrackedActivity(uint32 activityId);
//
//private:
// void GrantItem(PerkProgramData::PerkVendorItem const* vendorItem);
// void RemoveGrantedItem(PerkProgramData::PerkVendorItem const* vendorItem);
// bool IsItemAlreadyOwned(PerkProgramData::PerkVendorItem const* vendorItem);
// void SendBuyItemResult(int32 itemId);
// void SendRefundSuccess(int32 itemId);
// void SendCartCheckoutSuccess();
// void SendCurrencyRefresh();
// void SendPerksProgramError(uint32 errorCode);
// void RecordPurchase(uint32 itemId, time_t purchaseTime);
//
// WorldSession* _session;
// Player* m_player;
// uint32 m_currencyAmount;
// std::vector<PerkProgramData::PerkVendorItem> m_frozenItems;
// std::vector<std::pair<uint32, time_t>> m_recentPurchases;
// std::vector<uint32> m_trackedActivities;
//
// static constexpr uint32 REFUND_WINDOW_SECONDS = 2 * 60 * 60;
//};
//
//#endif
/*
* Copyright (C) WowCommunity Project
*
* This SourceCode is NOT free a software. Please hold everything Private
* and read our Terms
*/
#ifndef __TRINITY_PERKPROGRAMMGR_H
#define __TRINITY_PERKPROGRAMMGR_H
#include "Common.h"
#include "PerksProgramPacketsCommon.h"
#include "PerkProgramData.h"
class WorldSession;
class Player;
class Creature;
#define PERKS_PROGRAM_CURRENCY 2032
namespace PerkPrograms
{
enum PerksVendorCategoryType : uint32
{
PERKS_VENDOR_CATEGORY_NONE = 0,
PERKS_VENDOR_CATEGORY_MOUNTS = 1,
PERKS_VENDOR_CATEGORY_PETS = 2,
PERKS_VENDOR_CATEGORY_TOYS = 3,
PERKS_VENDOR_CATEGORY_TRANSMOG = 4,
PERKS_VENDOR_CATEGORY_TRANSMOG_SETS = 5,
PERKS_VENDOR_CATEGORY_CONSUMABLES = 6,
};
enum ItemCollectionType : uint32
{
ITEM_COLLECTION_NONE = 0,
ITEM_COLLECTION_APPEARANCE = 1,
ITEM_COLLECTION_MOUNT = 2,
ITEM_COLLECTION_TOY = 3,
ITEM_COLLECTION_PET = 4,
ITEM_COLLECTION_HEIRLOOM = 5,
ITEM_COLLECTION_ILLUSION = 6,
ITEM_COLLECTION_ENSEMBLE = 7,
};
enum NpcVendorAndCameras : uint32
{
CAMERA_HORDE = 183978,
CAMERA_ALLIANCE = 1,
VENDOR_HORDE = 185473,
VENDOR_ALLIANCE = 3,
};
enum ResultType : uint32
{
RESULT_NONE = 0,
RESULT_BUY_ITEM = 2,
RESULT_AVAILABLE_ITEMS = 5,
RESULT_PURCHASE_CART = 6,
RESULT_REFUND_SUCCESS = 7,
RESULT_ERROR = 10,
RESULT_CURRENCY_REFRESH = 11,
RESULT_FROZEN_ITEM = 12,
RESULT_ACTIVITY_UPDATE = 13,
};
}
class TC_GAME_API PerkProgramManager
{
public:
explicit PerkProgramManager(WorldSession* session);
~PerkProgramManager();
void SendVendorItems(Creature* vendor, std::vector<uint32> purchasedItems);
void BuyItem(uint32 itemId, ObjectGuid vendor);
bool IsAccountWideItem(uint32 item);
void SetCurrencyAmount(uint32 amount) { m_currencyAmount = amount; }
uint32 GetCurrencyAmount() { return m_currencyAmount; }
void SendPerksProgramActivities();
void SendPerksProgramStatus();
void SendPendingRewards();
void SetFrozenItem(int32 itemId, bool clear);
void RefundItem(int32 itemId);
void CartCheckout(std::vector<uint32> const& itemIds);
void AddTrackedActivity(uint32 activityId);
void RemoveTrackedActivity(uint32 activityId);
private:
void GrantItem(PerkProgramData::PerkVendorItem const* vendorItem);
void RemoveGrantedItem(PerkProgramData::PerkVendorItem const* vendorItem);
bool IsItemAlreadyOwned(PerkProgramData::PerkVendorItem const* vendorItem);
void SendBuyItemResult(int32 itemId);
void SendRefundSuccess(int32 itemId);
void SendCartCheckoutSuccess();
void SendCurrencyRefresh();
void SendPerksProgramError(uint32 errorCode);
void RecordPurchase(uint32 itemId, time_t purchaseTime);
WorldSession* _session;
Player* m_player;
uint32 m_currencyAmount;
std::vector<PerkProgramData::PerkVendorItem> m_frozenItems;
std::vector<std::pair<uint32, time_t>> m_recentPurchases;
std::vector<uint32> m_trackedActivities;
static constexpr uint32 REFUND_WINDOW_SECONDS = 2 * 60 * 60;
};
#endif
@@ -58,6 +58,7 @@
#include "NPCPackets.h"
#include "PacketUtilities.h"
#include "PartyPackets.h"
#include "PerksProgramPackets.h"
#include "PetPackets.h"
#include "PetitionPackets.h"
#include "QueryPackets.h"
@@ -0,0 +1,97 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
#include "PerksProgramPackets.h"
#include "PacketOperators.h"
namespace WorldPackets::PerksProgram
{
void PerksProgramStatusRequest::Read()
{
_worldPacket >> Vendor;
}
void PerksProgramRequestPurchase::Read()
{
_worldPacket >> VendorItemID;
}
void PerksProgramSetFrozenVendorItem::Read()
{
_worldPacket >> VendorItemID;
}
WorldPacket const* PerksProgramVendorUpdate::Write()
{
_worldPacket << uint32(VendorItems.size());
for (PerksVendorItem const& item : VendorItems)
_worldPacket << item;
_worldPacket << FrozenItem;
_worldPacket.WriteBit(HasFrozenItem);
_worldPacket.FlushBits();
return &_worldPacket;
}
WorldPacket const* PerksProgramResult::Write()
{
_worldPacket.WriteBits(Type, 4);
_worldPacket.WriteBit(UnkLong.has_value());
_worldPacket.FlushBits();
switch (Type)
{
case 2:// ResultTypes::BoughtItem:
_worldPacket << Params.BuyItem.VendorItemID;
_worldPacket << uint32(Params.BuyItem.TimePair.size());
for (auto const& data : Params.BuyItem.TimePair)
{
_worldPacket << data.VendorItemID;
_worldPacket << data.BuyTime;
}
break;
case 4: //ResultTypes::Unk4:
_worldPacket << Params.UnkData.UnkInt1;
_worldPacket << Params.UnkData.UnkInt2;
_worldPacket << Params.UnkData.UnkInt3;
_worldPacket << uint32(Params.UnkData.UnkInts.size());
for (auto&& unkInt : Params.UnkData.UnkInts)
_worldPacket << unkInt;
break;
case 5: //ResultTypes::AvailableItems:
_worldPacket << Params.VendorItem.VendorGuid;
_worldPacket << Params.VendorItem.ModelSceneCameraGuid;
_worldPacket << uint32(Params.VendorItem.FrozenPerksVendorItems.size());
for (auto&& frozenPerksVendorItem : Params.VendorItem.FrozenPerksVendorItems)
_worldPacket << frozenPerksVendorItem;
break;
default:
break;
}
return &_worldPacket;
}
WorldPacket const* PerksProgramActivityUpdate::Write()
{
_worldPacket << uint32(ActivityIDs.size());
_worldPacket << TimeUntilEnd;
_worldPacket << TimeUntilStart;
_worldPacket << unkt;
for (auto&& item : ActivityIDs)
_worldPacket << item;
return &_worldPacket;
}
}
@@ -0,0 +1,115 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
#ifndef TRINITYCORE_PERKS_PROGRAM_PACKETS_H
#define TRINITYCORE_PERKS_PROGRAM_PACKETS_H
#include "Packet.h"
#include "ObjectGuid.h"
#include "Optional.h"
#include "PerksProgramPacketsCommon.h"
namespace WorldPackets::PerksProgram
{
struct JamTimePair
{
JamTimePair() = default;
Timestamp<> BuyTime = 0;
uint32 VendorItemID = 0;
bool UnkBit = false;
};
class PerksProgramStatusRequest final : public ClientPacket
{
public:
explicit PerksProgramStatusRequest(WorldPacket&& packet) : ClientPacket(CMSG_PERKS_PROGRAM_STATUS_REQUEST, std::move(packet)) { }
void Read() override;
ObjectGuid Vendor;
};
class PerksProgramRequestPurchase final : public ClientPacket
{
public:
explicit PerksProgramRequestPurchase(WorldPacket&& packet) : ClientPacket(CMSG_PERKS_PROGRAM_REQUEST_PURCHASE, std::move(packet)) { }
void Read() override;
int32 VendorItemID = 0;
};
class PerksProgramSetFrozenVendorItem final : public ClientPacket
{
public:
explicit PerksProgramSetFrozenVendorItem(WorldPacket&& packet) : ClientPacket(CMSG_PERKS_PROGRAM_SET_FROZEN_VENDOR_ITEM, std::move(packet)) { }
void Read() override;
int32 VendorItemID = 0;
};
class PerksProgramVendorUpdate final : public ServerPacket
{
public:
explicit PerksProgramVendorUpdate() : ServerPacket(SMSG_PERKS_PROGRAM_VENDOR_UPDATE) { }
WorldPacket const* Write() override;
std::vector<PerksVendorItem> VendorItems;
PerksVendorItem FrozenItem;
bool HasFrozenItem = false;
};
class PerksProgramResult final : public ServerPacket
{
public:
PerksProgramResult() : ServerPacket(SMSG_PERKS_PROGRAM_RESULT, 75) {}
WorldPacket const* Write() override;
Optional<uint64> UnkLong;
uint32/*ResultTypes*/ Type = {};
struct ResultParams
{
struct
{
std::vector<uint32> UnkInts;
uint32 UnkInt1 = 0;
uint32 UnkInt2 = 0;
uint32 UnkInt3 = 0;
} UnkData;
struct
{
std::vector<JamTimePair> TimePair;
uint32 VendorItemID = 0;
} BuyItem;
struct
{
std::vector<PerksProgram::PerksVendorItem> FrozenPerksVendorItems;
ObjectGuid VendorGuid;
ObjectGuid ModelSceneCameraGuid;
} VendorItem;
} Params = {};
};
class PerksProgramActivityUpdate final : public ServerPacket
{
public:
PerksProgramActivityUpdate() : ServerPacket(SMSG_PERKS_PROGRAM_ACTIVITY_UPDATE) {}
WorldPacket const* Write() override;
uint32 unkt = 0;
std::vector<uint32> ActivityIDs;
Timestamp<> TimeUntilStart = 0;
Timestamp<> TimeUntilEnd = 0;
};
}
#endif