Files
2022-10-26 12:25:11 +08:00

340 lines
11 KiB
C++

#include <stdafx.h>
#ifdef _NA004034_20120102_POINT_WALLET_SYSTEM
#include "PointWalletManager.h"
#include "PacketStruct_PointSystem.h"
#include <PointSystem/PacketStruct_CG_PointSystem.h>
#include <ItemManager.h>
#include <SCItemSlotContainer.h>
#include <CurrencyInfoParser.h>
#include <GameGuild.h>
#include <GameGuildManager.h>
#include <GuildRankInfoParser.h>
#ifdef _NA_006032_20120823_GUILD_COIN_COUNT_OF_DAY_APPLY_SCRIPT_DATA
#include <GuildInfoParser.h>
#endif // _NA_006032_20120823_GUILD_COIN_COUNT_OF_DAY_APPLY_SCRIPT_DATA
PointWalletManager::PointWalletManager()
{
}
PointWalletManager::~PointWalletManager()
{
}
bool PointWalletManager::init( Player* player )
{
player_ = player;
playerinfo_ = player->GetCharInfo();
Initialize();
return true;
}
void PointWalletManager::Initialize()
{
point_wallet_.clear();
}
inline void PointWalletManager::SetPointWallet( DWORD _code, INT _point )
{
PointSystem::CodeNode* code_node = point_wallet_.find(_code);
if (code_node == NULL) {
code_node = point_wallet_.insert(_code);
}
if (code_node) {
code_node->SetValue(_point);
}
}
inline INT PointWalletManager::GetPointWallet( DWORD _code ) const
{
PointSystem::CodeNode* code_node = point_wallet_.find(_code);
return (code_node == NULL ? 0 : code_node->GetValue());
}
INT PointWalletManager::ChangeWalletPoint( DWORD _code, INT _point )
{
//if(!point_wallet_system_->GetWalletPointInfo(_code))
// return 0;
INT player_point = GetPointWallet(_code);
player_point += _point;
SetPointWallet(_code, player_point);
;{
MSG_DG_POINTWALLET_CHANGE_SYN dg_msg(_code, player_point);
player_->SendToGameDBPServer(&dg_msg, sizeof(dg_msg));
MSG_CG_POINTWALLET_CHANGE_CMD cg_msg(_code, player_point);
player_->SendPacket(&cg_msg, sizeof(cg_msg));
};
return player_point;
}
void PointWalletManager::ParseCGPacket( PVOID packet )
{
MSG_CG_POINTWALLET_PACKET* packet2 = \
static_cast<MSG_CG_POINTWALLET_PACKET*>(packet);
if((player_->GetUserKey() != packet2->m_dwKey) || !player_->GetField())
return;
switch(packet2->packet_type)
{
case CG_POINTWALLET_CHANGE_WITH_COUNT_SYN:
{
ProcessPacketUseItem(packet);
} break;
#ifdef _NA004034_20120102_GUILD_POINT_SYSTEM
case CG_POINTWALLET_GUILDCOIN_DONATION_SYN:
{
MSG_CG_POINTWALLET_GUILDCOIN_DONATION_SYN* packet3 = \
static_cast<MSG_CG_POINTWALLET_GUILDCOIN_DONATION_SYN*>(packet2);
GuildPointDonation(packet3->point_);
} break;
#endif //_NA004034_20120102_GUILD_POINT_SYSTEM
default:
break;
}
}
void PointWalletManager::ParseDGPacket( PVOID packet )
{
MSG_DG_CHARINFO_POINTWALLET_SYSTEM* packet2 = \
static_cast<MSG_DG_CHARINFO_POINTWALLET_SYSTEM*>(packet);
switch(packet2->packet_type)
{
case DG_POINTWALLET_SELECT_ACK:
{
MSG_DG_POINTWALLET_SELECT_ACK* select_ack = \
static_cast<MSG_DG_POINTWALLET_SELECT_ACK*>(packet);
Initialize();
for(int i = 0; i < select_ack->count_; ++i)
{
DWORD code = (DWORD)select_ack->pointwallet_data[i].code_;
INT point = (INT)select_ack->pointwallet_data[i].point_;
SetPointWallet(code, point);
}
;{
MSG_CG_POINTWALLET_SELECT_CMD msg;
msg.count_ = select_ack->count_;
memcpy(msg.pointwallet_data, select_ack->pointwallet_data, \
sizeof(select_ack->pointwallet_data[0]) * select_ack->count_);
player_->SendPacket(&msg, msg.GetSize());
};
} break;
#ifdef _NA004034_20120102_GUILD_POINT_SYSTEM
case DG_POINTWALLET_GUILDPOINT_DONATION_ACK:
{
MSG_DG_GUILDPOINT_DONATION_ACK* packet2 = \
static_cast<MSG_DG_GUILDPOINT_DONATION_ACK*>(packet);
#ifdef _NA_006032_20120823_GUILD_COIN_COUNT_OF_DAY_APPLY_SCRIPT_DATA
INT max_donation_count = GuildInfoParser::Instance()->GetGuildInfo().max_guild_coin_donation_;
#else
INT max_donation_count = 5;
#endif // _NA_006032_20120823_GUILD_COIN_COUNT_OF_DAY_APPLY_SCRIPT_DATA
ProcessGuildCoinDonation(
packet2->donation_count_of_day_,
packet2->donation_item_count_,
max_donation_count);
} break;
#endif //_NA004034_20120102_GUILD_POINT_SYSTEM
}
}
void PointWalletManager::ProcessPacketUseItem( PVOID packet )
{
MSG_CG_POINTWALLET_CHANGE_WITH_COUNT_SYN* recv_msg = \
static_cast<MSG_CG_POINTWALLET_CHANGE_WITH_COUNT_SYN*>(packet);
SLOTIDX slot_index = recv_msg->slot_index_;
POSTYPE position = recv_msg->item_position_;
WORD item_count = recv_msg->item_count_;
SCItemSlot rAtSlotOut;
RC::eITEM_RESULT rt = UseItem( slot_index, position, item_count, rAtSlotOut );
MSG_CG_POINTWALLET_CHANGE_WITH_COUNT_ACK msg(rt);
if (rt == RC::RC_ITEM_SUCCESS) {
msg.slot_index_ = rAtSlotOut.GetSlotIdx();
msg.item_position_ = rAtSlotOut.GetPos();
msg.item_count_ = rAtSlotOut.GetNum();
}
player_->SendPacket(&msg, sizeof(msg));
}
RC::eITEM_RESULT
PointWalletManager::UseItem(SLOTIDX slot_index, POSTYPE position, INT count, \
SCItemSlot& OUT rAtSlotOut)
{
ItemManager* const item_manager = player_->GetItemManager();
if(!item_manager->ValidState())
return RC::RC_ITEM_INVALIDSTATE;
if(!item_manager->ValidPos(slot_index, position, TRUE))
return RC::RC_ITEM_INVALIDPOS;
if (slot_index != SI_INVENTORY)
return RC::RC_ITEM_INVALIDPOS;
SCItemSlotContainer* const inventory = item_manager->GetItemSlotContainer(SI_INVENTORY);
SCItemSlot& rAtSlot = (SCItemSlot&)inventory->GetSlot(position);
const BASE_ITEMINFO* const pInfo = rAtSlot.GetItemInfo();
RC::eITEM_RESULT rcResult = player_->CanUseItem(pInfo);
if(rcResult != RC::RC_ITEM_SUCCESS)
return rcResult;
// 아이템 계열에 따른 처리
if (pInfo->m_wType != eITEMTYPE_BILL)
return RC::RC_ITEM_INVALIDSTATE;
if(rAtSlot.GetNum() < count || count < 1)
return RC::RC_ITEM_FAILED;
;{
// BASE_ITEMINFO::m_MaterialCode 에 변환할 포인트코드가 설정되어있다.
// BASE_ITEMINFO::m_wHealHP 에 변환할 포인트량이 설정되어있다.
DWORD wallet_code = (DWORD)pInfo->m_MaterialCode;
INT wallet_point = (INT)pInfo->m_wHealHP;
INT exchange_point = wallet_point * count;
CurrencyInfoParser* const currency_info_parser = CurrencyInfoParser::Instance();
const CurrencyInfoParser::CurrencyInfo* currency_info = \
currency_info_parser->GetCurrencyInfo(wallet_code);
if(!currency_info)
return RC::RC_ITEM_FAILED;
PointWalletManager* const pointwallet_manager = player_->GetPointWalletManager();
INT previous_point = pointwallet_manager->GetPointWallet(wallet_code);
if((INT)currency_info->currency_max_point < previous_point + exchange_point)
return RC::RC_ITEM_FAILED_TO_EXCHANGE_CURRENCY_ITEM_BY_LIMIT;
INT result_point = pointwallet_manager->ChangeWalletPoint(wallet_code, exchange_point);
GAMELOG->LogPointWallet(player_, POINTWALLET_DEPOSIT_BY_USING_ITEMS, \
wallet_code, previous_point, exchange_point, result_point);
GAMELOG->LogItem(ITEM_USE, player_, &rAtSlot, exchange_point, count);
inventory->UpdateSlot(rAtSlot.GetPos(), -count);
;{
rAtSlotOut = rAtSlot;
if(rAtSlot.GetNum() < 1) {
inventory->DeleteSlot(position, NULL);
}
};
};
return RC::RC_ITEM_SUCCESS;
}
#ifdef _NA004034_20120102_GUILD_POINT_SYSTEM
void PointWalletManager::GuildPointDonation( INT donation_item_count )
{
if (donation_item_count < 1)
return;
GUILDGUID guid = player_->GetGuildGuid();
GameGuild* guild = g_GameGuildManager.FindGuild(guid);
if (INVALID_GUILDGUID == guid || guild == NULL)
{
MSG_CG_POINTWALLET_GUILDCOIN_DONATION_ACK msg;
msg.result_code_ = RC::RC_ITEM_GUILDCOIN_NOT_GUILD_MEMBER;
player_->SendPacket(&msg, sizeof(msg));
return;
}
BYTE guild_level = guild->GetGuildGrade();
if (guild_level == GuildRankInfoParser::Instance()->GetGuildMaxGrade())
{
MSG_CG_POINTWALLET_GUILDCOIN_DONATION_ACK msg;
msg.result_code_ = RC::RC_ITEM_GUILDCOIN_EXCEED_MAX_LEVEL;
player_->SendPacket(&msg, sizeof(msg));
return;
}
INT guild_coin = GetPointWallet(CURRENCY_INFO_GUILD_COIN);
if (guild_coin < donation_item_count)
{
// not enough point...
MSG_CG_POINTWALLET_GUILDCOIN_DONATION_ACK msg;
msg.result_code_ = RC::RC_ITEM_GUILDCOIN_NOT_ENOUGH_COIN;
player_->SendPacket(&msg, sizeof(msg));
return;
}
MSG_DG_GUILDPOINT_DONATION_SYN msg;
msg.guild_guid_ = player_->GetGuildGuid();
msg.guild_point_code_ = CURRENCY_INFO_GUILD_COIN;
msg.donation_item_count_ = donation_item_count;
#ifdef _NA_006032_20120823_GUILD_COIN_COUNT_OF_DAY_APPLY_SCRIPT_DATA
msg.max_guild_coin_donation_ = GuildInfoParser::Instance()->GetGuildInfo().max_guild_coin_donation_;
#endif // _NA_006032_20120823_GUILD_COIN_COUNT_OF_DAY_APPLY_SCRIPT_DATA
player_->SendToGameDBPServer(&msg, sizeof(msg));
}
void PointWalletManager::ProcessGuildCoinDonation( \
INT donation_count_of_day, INT donation_item_count, INT max_donation_count)
{
if (donation_count_of_day < 0 /*|| donation_item_count < 0*/)
return;
if (donation_count_of_day + donation_item_count > max_donation_count)
{
MSG_CG_POINTWALLET_GUILDCOIN_DONATION_ACK msg;
msg.result_code_ = RC::RC_ITEM_GUILDCOIN_DONATION_COUNT_OVER;
msg.today_donation_count_ = donation_count_of_day;
player_->SendPacket(&msg, sizeof(msg));
return;
}
if (donation_item_count > GetPointWallet(CURRENCY_INFO_GUILD_COIN))
{
MSG_CG_POINTWALLET_GUILDCOIN_DONATION_ACK msg;
msg.result_code_ = RC::RC_ITEM_GUILDCOIN_NOT_ENOUGH_COIN;
player_->SendPacket(&msg, sizeof(msg));
return;
}
ChangeWalletPoint(CURRENCY_INFO_GUILD_COIN, -donation_item_count); //포인트 차감
{
MSG_CG_POINTWALLET_GUILDCOIN_DONATION_ACK msg;
msg.result_code_ = RC::RC_ITEM_GUILDCOIN_DONATION_SUCCESS;
msg.today_donation_count_ = donation_count_of_day + donation_item_count;
player_->SendPacket(&msg, sizeof(msg));
};
ChangeWalletPoint(CURRENCY_INFO_DONATION_GUILDCOIN, donation_item_count); // 기부포인트 누적
{
MSG_GZ_GUILDPOINT_CHANGE_CMD dg_msg( \
player_->GetGuildGuid(), player_->GetCharGuid(), \
CURRENCY_INFO_DONATION_GUILDCOIN, donation_item_count);
player_->SendToGameDBPServer(&dg_msg, sizeof(dg_msg));
#ifdef _NA_007237_20140519_GAMELOG_DONATION_GUILDCOIN
GAMELOG->LogGuild(ACT_GUILD_DONATION_GUILDCOIN, player_, donation_item_count);
#endif //_NA_007237_20140519_GAMELOG_DONATION_GUILDCOIN
};
}
#endif //_NA004034_20120102_GUILD_POINT_SYSTEM
#endif //_NA004034_20120102_POINT_WALLET_SYSTEM