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

287 lines
8.5 KiB
C++

#include "stdafx.h"
#include "CharacterInfoExManager.h"
#include "ItemManager.h"
CharacterInfoExManager::CharacterInfoExManager()
{
}
CharacterInfoExManager::~CharacterInfoExManager()
{
}
void CharacterInfoExManager::Init( Player* _player )
{
player_ = _player;
previous_daily_quest_reset_time = 0;
}
ToggleItemInfos& CharacterInfoExManager::GetToggleItemInfos()
{
return toggle_item_infos_;
}
nsSlot::TOGGLE_ITEMS* CharacterInfoExManager::GetToggleItemInfo( const ToggleItemType toggle_item_type )
{
if((toggle_item_type >= kToggleItemMax) || (toggle_item_type < 0))
return NULL;
return &toggle_item_infos_.toggle_item_info_[toggle_item_type];
}
const BattleGroundRecordInfos& CharacterInfoExManager::GetBattleGroundRecordInfos() const
{
return battle_ground_record_infos_;
}
void CharacterInfoExManager::SetBattleGroundRecordInfos(const BattleGroundRecordInfos& battle_ground_record_infos)
{
memcpy(&battle_ground_record_infos_,
&battle_ground_record_infos,
sizeof(battle_ground_record_infos));
}
BattleGroundRecord* CharacterInfoExManager::GetBattleGroundRecord(const int index)
{
ASSERT((index < BattleGroundRecordInfos::kRecordMaxCount) && (index >= 0));
return &(battle_ground_record_infos_.battle_ground_record[index]);
}
void CharacterInfoExManager::OnEnterField()
{
#ifdef _NA_006372_20130108_BADGE_ITEM
TurnOnOffToggleItems(true); // turn on badge items...
nsSlot::TOGGLE_ITEMS* toggle_item_info = GetToggleItemInfo(kToggleItem_PCBang);
if (toggle_item_info != NULL && toggle_item_info->is_equiped_) {
player_->GetItemManager()->UpdateItemAttributes(true, false);
}
#endif //_NA_006372_20130108_BADGE_ITEM
}
void CharacterInfoExManager::OnLeaveField()
{
#ifdef _NA_006372_20130108_BADGE_ITEM
//backup
ToggleItemInfos toggle_item_info;
ToggleItemInfos& toggle_item_info_container = GetToggleItemInfos();
memcpy(&toggle_item_info, &toggle_item_info_container, sizeof(toggle_item_info));
TurnOnOffToggleItems(false); // turn off badge items...
//restore
memcpy(&toggle_item_info_container, &toggle_item_info, sizeof(toggle_item_info));
#endif //_NA_006372_20130108_BADGE_ITEM
}
// 전체를
// 켤때는 피씨방 켜고 뱃지 켜고
// 끌때는 뱃지 끄고, 피씨방 끄고...
ToggleItemType turn_priority[] = {
kToggleItemMax, // guard data
kToggleItem_PCBang,
kToggleItem_Badge,
kToggleItemMax, // guard data
};
const int size_of_turn_priority = sizeof(turn_priority) / sizeof(turn_priority[0]);
const ToggleItemType* front = &turn_priority[0];
const ToggleItemType* back = &turn_priority[size_of_turn_priority-1];
struct TOGGLE_ITEM_PRIORITY
{
const ToggleItemType* begin_;
const ToggleItemType* end_;
bool direction_;
const ToggleItemType* begin() const { return begin_; }
const ToggleItemType* end() const { return end_; };
const ToggleItemType* next(const ToggleItemType* it) {
return (direction_) ? ++it : --it;
};
TOGGLE_ITEM_PRIORITY(bool direction)
{
direction_ = direction;
if (direction == true) {
begin_ = front+1, end_ = back;
} else {
begin_ = back-1, end_ = front;
}
}
};
void CharacterInfoExManager::TurnOnOffToggleItems(bool turn_on)
{
TOGGLE_ITEM_PRIORITY toggle_item(turn_on);
#ifdef _NA_006372_20130108_BADGE_ITEM
// activate turned on items
for (const ToggleItemType* it = toggle_item.begin(); it != toggle_item.end(); it = toggle_item.next(it))
{
nsSlot::TOGGLE_ITEMS* toggle_item_info = GetToggleItemInfo(*it);
if (toggle_item_info == NULL)
continue;
#ifdef _NA_006413_20130201_PREMIUMSERVICE_ITEM
if (toggle_item_info->toggle_item_type_ == kToggleItem_PCBang) {
if (!player_->GetPCRoomSts() && player_->GetReservedValue()) {
toggle_item_info->clear();
continue;
}
}
#endif //_NA_006413_20130201_PREMIUMSERVICE_ITEM
if (toggle_item_info->is_equiped_)
{
POSTYPE item_pos = toggle_item_info->item_pos_;
nsSlot::ItemFunctionToggle& toggle_item_handler = nsSlot::ItemFunctionToggle( \
player_->GetItemManager(), toggle_item_info->toggle_item_type_);
if (toggle_item_handler.Equip(item_pos, turn_on) == false) {
toggle_item_info->clear();
}
}
}
#endif //_NA_006372_20130108_BADGE_ITEM
}
//!~ _NA_000000_20130521_DAILY_QUEST_RESET_ITEM
CTime CharacterInfoExManager::GetDailyQuestResetUseTime()
{
return previous_daily_quest_reset_time;
}
void CharacterInfoExManager::SetDailyQuestResetUseTime( CTime daily_quest_reset_time )
{
previous_daily_quest_reset_time = daily_quest_reset_time;
}
#ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH
void CharacterInfoExManager::SetGoldRushRecordInfos(const GoldRushRecordInfos& goldrush_record_infos)
{
memcpy(&goldrush_record_infos_, &goldrush_record_infos,
sizeof(goldrush_record_infos));
}
GoldRushRecord* CharacterInfoExManager::GetGoldRushRecord( const int index )
{
ASSERT((index < GoldRushRecordInfos::kRecordMaxCount) && (index >= 0));
if (index > GoldRushRecordInfos::kRecordMaxCount || index < 0) {
return NULL;
}
return &(goldrush_record_infos_.goldrush_record[index]);
}
#endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH
//~! _NA_000000_20130521_DAILY_QUEST_RESET_ITEM
#ifdef _NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM
void CharacterInfoExManager::SetAttendanceInfos( const AttendanceInfo& attendance_infos )
{
attendance_manager.SetAttendanceInfos(attendance_infos);
}
#endif // _NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM
#ifdef _NA_008089_20150225_BUG_EXPIRE_UNEQUIP_BADGE
void CharacterInfoExManager::TurnOnOffToggleItems( const eITEMTYPE item_type, bool turn_on )
{
nsSlot::TOGGLE_ITEMS* toggle_item_info = NULL;
switch (item_type)
{
case eITEMTYPE_PCBANG:
toggle_item_info = GetToggleItemInfo(kToggleItem_PCBang);
break;
case eITEMTYPE_RENDER_EFFECT_ITEM:
toggle_item_info = GetToggleItemInfo(kToggleItem_Badge);
break;
}
if (toggle_item_info == NULL)
return;
if (toggle_item_info->toggle_item_type_ == kToggleItem_PCBang) {
if (!player_->GetPCRoomSts() && player_->GetReservedValue()) {
toggle_item_info->clear();
return;
}
}
//PC뱃지를 장착/해제할땐
//일반 뱃지를 다시 껐다가 껴줘야 한다
POSTYPE badge_item_pos = 0;
if (item_type == eITEMTYPE_PCBANG) {
badge_item_pos = UnEquipBadge();
}
if (toggle_item_info->is_equiped_)
{
POSTYPE item_pos = toggle_item_info->item_pos_;
nsSlot::ItemFunctionToggle& toggle_item_handler = nsSlot::ItemFunctionToggle( \
player_->GetItemManager(), toggle_item_info->toggle_item_type_);
if (toggle_item_handler.Equip(item_pos, turn_on) == false) {
toggle_item_info->clear();
}
}
if (item_type == eITEMTYPE_PCBANG && badge_item_pos != 0) {
EquipBadge(badge_item_pos);
}
}
const POSTYPE CharacterInfoExManager::UnEquipBadge()
{
POSTYPE badge_item_pos;
nsSlot::TOGGLE_ITEMS* const badge_info = \
player_->GetExtraInfoManager().GetToggleItemInfo(kToggleItem_Badge);
if (badge_info == NULL) {
return 0;
}
if (badge_info->is_equiped_ == false) {
return 0;
}
badge_item_pos = badge_info->item_pos_;
nsSlot::ItemFunctionToggle& badge_toggle_item_handler = \
nsSlot::ItemFunctionToggle(player_->GetItemManager(), kToggleItem_Badge);
if (badge_toggle_item_handler.Equip(badge_item_pos, false) == false)
{
badge_info->clear();
return 0;
}
return badge_item_pos;
}
VOID CharacterInfoExManager::EquipBadge(POSTYPE item_pos)
{
if (item_pos == 0) {
return;
}
nsSlot::ItemFunctionToggle& badge_toggle_item_handler = \
nsSlot::ItemFunctionToggle(player_->GetItemManager(), kToggleItem_Badge);
if (badge_toggle_item_handler.Equip(item_pos, true) == false) {
nsSlot::TOGGLE_ITEMS* const badge_info = \
player_->GetExtraInfoManager().GetToggleItemInfo(kToggleItem_Badge);
if (badge_info != NULL && badge_info->is_equiped_ == false) {
badge_info->clear();
}
}
}
#endif //_NA_008089_20150225_BUG_EXPIRE_UNEQUIP_BADGE
#ifdef _NA_008404_20150712_MINIGAME_SYSTEM
void CharacterInfoExManager::SetMiniGameBingoInfos( MiniGameBingoInfos& minigame_bingo_infos )
{
minigame_manager.SetMiniGameBingoInfos(minigame_bingo_infos);
}
#endif // _NA_008404_20150712_MINIGAME_SYSTEM