Files
Sun1602/Server/GameServer/GameShop/GameShop.Manager.cpp
T
2022-10-26 12:25:11 +08:00

209 lines
5.6 KiB
C++

#include "stdafx.h"
#ifdef _NA_0_20110613_GAME_SHOP_RENEWAL
#include "GameShop.Manager.h"
#include "GameShop.EventHandler.h"
#include "GameShop.EventProcessor.h"
#include "GameShop.User.h"
GameShop::Manager::Manager()
{
ZeroMemory(&connection_info_, sizeof(connection_info_));
}
GameShop::Manager::~Manager()
{
UserHash::iterator iter = user_hash_.begin();
for ( ; iter != user_hash_.end() ; ++iter)
{
GameShop::User* user = iter->second;
delete iter->second;
}
user_hash_.clear();
}
void GameShop::Manager::Initialize(const char* ip_address, WORD port)
{
strncpy(connection_info_.ip_address, ip_address, _countof(connection_info_.ip_address));
connection_info_.ip_address[_countof(connection_info_.ip_address) - 1] = '\0';
connection_info_.port = port;
}
void GameShop::Manager::StartService()
{
shop_system_.Init();
update_timer_.SetTimer(8 * 1000);
}
void GameShop::Manager::Update(uint delta_tick)
{
UpdateConnect(delta_tick);
shop_system_.Update(delta_tick);
}
void GameShop::Manager::NotifyCloseShopToAllUser(RC::eSHOP_RESULT result)
{
UserHash::iterator iter = user_hash_.begin();
for ( ; iter != user_hash_.end() ; ++iter)
{
GameShop::User* user = iter->second;
user->get_event_processor()->CloseShop(result);
delete iter->second;
}
user_hash_.clear();
}
void GameShop::Manager::UpdateConnect(uint delta_tick)
{
if (update_timer_.IsExpired() == false)
return;
if (connection_info_.port == 0)
return;
if (strlen(connection_info_.ip_address) == 0)
return;
GameShop::EventHandler& event_handler = shop_system_.get_event_handler();
if (event_handler.IsConnect() == false)
{
shop_system_.Log("Retry ShopServer Connect[%s:%d]", connection_info_.ip_address, connection_info_.port);
event_handler.Connect(connection_info_.ip_address, connection_info_.port);
}
}
void GameShop::Manager::Request_ScriptVersion(Player* player)
{
GameShop::EventHandler& event_handler = shop_system_.get_event_handler();
if (!event_handler.IsConnect())
{
MSG_CG_SHOP_VERSION_NAK nak_message;
nak_message.error_code_ = RC::RC_SHOP_SERVER_CLOSED;
player->SendPacket(&nak_message, sizeof(nak_message));
return;
}
ShopScriptVersion& version = shop_system_.get_script_version();
if (!version.sales_zone_.IsValid())
{
MSG_CG_SHOP_VERSION_NAK nak_message;
nak_message.error_code_ = RC::RC_SHOP_INVALID_SCRIPT_VERSION;
player->SendPacket(&nak_message, sizeof(nak_message));
return;
}
MSG_CG_SHOP_VERSION_ACK ack_message;
ack_message.sales_version_ = version.sales_zone_;
player->SendPacket(&ack_message, sizeof(ack_message));
}
void GameShop::Manager::Request_ExistGiftNotify(Player* player)
{
// 샵서버가 열려 있는가?
GameShop::EventHandler& event_handler = shop_system_.get_event_handler();
if (!event_handler.IsConnect())
{
MSG_CG_SHOP_EXIST_GIFT_NAK nak_message;
player->SendPacket(&nak_message, sizeof(nak_message));
return;
}
USERGUID user_guid = player->GetUserGuid();
GameShop::User* user = FindShopUser(user_guid);
bool create_user = false;
if (user == NULL)
{
user = CreateShopUser(user_guid);
create_user = true;
}
if (user)
{
user->get_event_processor()->Request_ExistGiftList();
}
else
{
MSG_CG_SHOP_EXIST_GIFT_NAK nak_message;
player->SendPacket(&nak_message, sizeof(nak_message));
}
if (create_user)
{
// 선물의 존재 여부 요청후 샵 유저 삭제.
// 샵 유저가 삭제되어도 샵 유저와 연결되어있는 EventProcessor는 일정 시간(5초)동안 유지된다.
// EventProcessor 가 유지 되는 동안 응답을 받는다.
// EventProcessor는 응답 후 더이상 요청된 사항이 없는 경우 자동 삭제된다.
DeleteShopUser(user_guid);
}
}
void GameShop::Manager::OpenShop(Player* player, ShopScriptVersion& script_version)
{
ShopScriptVersion& version = shop_system_.get_script_version();
if (!version.sales_zone_.IsEqual(script_version.sales_zone_))
{
EventProcessor::SendFail_Open(player, RC::RC_SHOP_DIFFERENT_SCRIPT_VERSION);
return;
}
USERGUID user_guid = player->GetUserGuid();
GameShop::User* user = FindShopUser(user_guid);
if (user == NULL)
{
user = CreateShopUser(user_guid);
}
if (user)
{
user->get_event_processor()->OpenShop();
}
else
{
EventProcessor::SendFail_Open(player, RC::RC_SHOP_CANNOT_USE_SHOP);
}
}
void GameShop::Manager::CloseShop(Player* player)
{
USERGUID user_guid = player->GetUserGuid();
DeleteShopUser(user_guid);
}
GameShop::User* GameShop::Manager::CreateShopUser(USERGUID user_guid)
{
GameShop::EventProcessor* processor = shop_system_.FindEventProcessor(user_guid);
if (processor == NULL)
processor = shop_system_.CreateEventProcessor(user_guid);
GameShop::User* user = new GameShop::User(processor);
user_hash_[user_guid] = user;
return user;
}
GameShop::User* GameShop::Manager::FindShopUser(USERGUID user_guid)
{
UserHash::iterator iter = user_hash_.find(user_guid);
if (iter != user_hash_.end())
return iter->second;
return NULL;
}
void GameShop::Manager::DeleteShopUser(USERGUID user_guid)
{
UserHash::iterator iter = user_hash_.find(user_guid);
if (iter != user_hash_.end())
{
delete iter->second;
user_hash_.erase(iter);
}
}
GameShop::EventProcessor* GameShop::Manager::FindEventProcessor(USERGUID user_guid)
{
return shop_system_.FindEventProcessor(user_guid);
}
#endif // _NA_0_20110613_GAME_SHOP_RENEWAL