Files
Sun1602/Server/GameServer/World/ChaosZoneSystem/GoldRushTeam.cpp
T
git 9cb257e7ae Add GameClients drops and keep current 1602 source work.
CN1602 is the local client. KR is the official tree with unpacked Data, System, and Sound. Packed .wpk files stay off git.
2026-08-30 23:24:31 +03:00

630 lines
19 KiB
C++

#include <stdafx.h>
#ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH
#include "World/ChaosZoneSystem/GoldRushTeam.h"
#include "ChaosZoneSystem/PacketStruct_ChaosZoneSystem.h"
#include "world/ChaosZoneSystem/GoldRush.h"
#include <../ProgramCommon/BattleGroundInfoParser.h>
#include "GameInstanceDungeon.h"
#include "MapInfoParser.h"
#include <StatusManager.h>
#include "MissionManager.h"
#include "MissionRewardManager.h"
#include "TriggerManagerEx.h"
#include "World/ChaosZoneSystem/GoldRushBattleResult.h"
#include <../ProgramCommon/ChaosZoneSystem/GoldRushInfoParser.h>
#include "../../MovingPlanner.h"
void GoldRushTeam::Update()
{
if (team_state_ != eCHAOSTEAM_STATE_MATCHED) {
return;
}
PLAYER_HASH_ITR itr = player_hash_map_.begin();
for (; itr != player_hash_map_.end(); ++itr)
{
Player* const player = itr->second;
if (player == NULL || player->IsDeleted())
continue;
GoldRushPlayerInfo& goldrush_player_info = player->GetGoldRushPlayerInfo();
if (player->IsDead() &&
(goldrush_player_info.GetPlayerState() == kPlayerStateMatch ||
goldrush_player_info.GetPlayerState() == kPlayerStateDeath))
{
if (goldrush_player_info.IsExpiredMoveToSafeZone() == false) {
continue;
}
goldrush_player_info.SetPlayerState(kPlayerStateStandbyResurection);
OnMoveToSafezone(player);
player->OnResurrection(0, 1.f, 1.f);
MSG_CG_GOLDRUSH_STATE_RESURECTION_CMD send_packet;
send_packet.player_object_key = player->GetObjectKey();
send_packet.player_state = kPlayerStateStandbyResurection;
send_packet.resurection_time = goldrush_->GetRemainTicks();
player->SendPacketAround(&send_packet, sizeof(send_packet));
}
else if(player->IsAlive() && goldrush_player_info.GetPlayerState() == kPlayerStateDeath) {
goldrush_player_info.SetPlayerState(kPlayerStateMatch);
}
}
}
//Vote System
bool GoldRushTeam::IsInitialteTime()
{
// time check
if (initialte_vote_timer_.IsExpiredManual(false) == false) {
return false;
}
return true;
}
bool GoldRushTeam::OnInitiateVote( Player* initiate_player, Player* van_payer )
{
if (is_initialte_vote_ == true)
{
return false;
}
voting_timer_.SetTimer(30 * 1000);
;{
MSG_CG_GOLDRUSH_VOTE_STATUS_BRD brd_msg;
_tcsncpy(brd_msg.van_payer_name, van_payer->GetCharName(), MAX_CHARNAME_LENGTH);
brd_msg.yes_count = 1;
brd_msg.no_count = 0;
brd_msg.remain_vote_time = voting_timer_.GetRemainedTime();
initiate_player->SendPacket(&brd_msg, sizeof(brd_msg));
van_payer->SendPacket(&brd_msg, sizeof(brd_msg));
_tcsncpy(van_player_name_, van_payer->GetCharName(), MAX_CHARNAME_LENGTH);
vote_player_hash_map_.insert(PLAYER_HASH::value_type(initiate_player->GetCharGuid(), initiate_player));
vote_player_hash_map_.insert(PLAYER_HASH::value_type(van_payer->GetCharGuid(), van_payer));
};
;{
MSG_CG_GOLDRUSH_INITIATE_VOTE_BRD brd_msg;
_tcsncpy(brd_msg.van_payer_name, van_payer->GetCharName(), MAX_CHARNAME_LENGTH);
PLAYER_HASH::const_iterator const_itr = player_hash_map_.begin();
for (; const_itr != player_hash_map_.end(); ++const_itr)
{
Player* const player = const_itr->second;
if (player == NULL || player->IsDeleted())
continue;
if (player->GetCharGuid() == initiate_player->GetCharGuid() ||
player->GetCharGuid() == van_payer->GetCharGuid())
continue;
player->SendPacket(&brd_msg, sizeof(brd_msg));
}
};
is_initialte_vote_ = true;
return true;
}
void GoldRushTeam::OnVote( CHARGUID char_guid, bool vote_result )
{
Player* player = FindMember(char_guid);
if (player == NULL || player->IsDeleted()) {
return;
}
if (is_initialte_vote_ == false) {
return;
}
if (voting_timer_.IsExpired(false) == true) {
return;
}
if (vote_result == true)
{
vote_player_hash_map_.insert(PLAYER_HASH::value_type(char_guid, player));
if (CheckVoteResult() == true)
{
OnVoteResult(true);
}
else
{
MSG_CG_GOLDRUSH_VOTE_STATUS_BRD brd_msg;
_tcsncpy(brd_msg.van_payer_name, van_player_name_, MAX_CHARNAME_LENGTH);
brd_msg.yes_count = static_cast<BYTE>(vote_player_hash_map_.size() - 1);
brd_msg.no_count = 0;
brd_msg.remain_vote_time = voting_timer_.GetRemainedTime();
PLAYER_HASH::const_iterator const_itr = vote_player_hash_map_.begin();
for (; const_itr != vote_player_hash_map_.end(); ++const_itr)
{
Player* const player = const_itr->second;
if (player == NULL || player->IsDeleted()) {
continue;
}
player->SendPacket(&brd_msg, sizeof(brd_msg));
}
}
}
else
{
OnVoteResult(false);
}
}
bool GoldRushTeam::CheckVoteResult()
{
const int current_memeber_count = player_hash_map_.size();
const int vote_member_count = vote_player_hash_map_.size();
if (current_memeber_count == vote_member_count)
{
return true;
}
return false;
}
void GoldRushTeam::OnVoteResult( bool van_result )
{
if (is_initialte_vote_ == false)
return;
MSG_CG_GOLDRUSH_VOTE_RESULT_BRD brd_msg;
brd_msg.vote_result = van_result;
_tcsncpy(brd_msg.van_payer_name, van_player_name_, MAX_CHARNAME_LENGTH);
if (van_result)
{
OnVanPlayer();
goldrush_->SendPacketToAll(&brd_msg, sizeof(brd_msg));
}
else
{
SendPacketToAll(&brd_msg, sizeof(brd_msg));
}
initialte_vote_timer_.SetTimer(60 * 1000);
is_initialte_vote_ = false;
vote_player_hash_map_.clear();
}
void GoldRushTeam::OnVanPlayer()
{
Player* const van_player = PlayerManager::Instance()->FindPlayerByName(van_player_name_);
if (van_player == NULL) {
return;
}
OnMoveToSafezone(van_player);
goldrush_->GoldRushPenalty(van_player);
MSG_CG_GOLDRUSH_VANP_PLAYER_CMD cmd_msg;
van_player->SendPacket(&cmd_msg, sizeof(cmd_msg));
}
void GoldRushTeam::AddMember( Player* const player )
{
if (player_hash_map_.size() > battle_ground_Info_->team_max)
{
return;
}
const DWORD char_guid = player->GetCharGuid();
;{
Player* const member = FindMember(char_guid);
if (member != NULL) {
player_hash_map_.erase(char_guid);
}
};
player_hash_map_.insert(PLAYER_HASH::value_type(char_guid, player));
int offset = 1;
int index = (battle_ground_Info_->index) - offset;
GoldRushRecord* const record = \
player->GetExtraInfoManager().GetGoldRushRecord(index);
if (record == NULL)
{
// Critical Error!
SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"] : GoldRush Record Error! Check BattlegroundInfo_Index");
}
record->map_code = goldrush_->GetInstanceDungeon()->GetMapCode();
player->GetGoldRushPlayerInfo().Init(record);
player->GetGoldRushPlayerInfo().SetTeamKey(team_key_);
OnMoveToSafezone(player);
//CMD..
MSG_CG_GOLDRUSH_TEAM_INFO_CMD cmd_msg;
cmd_msg.team_key = team_key_;
player->SendPacket(&cmd_msg, sizeof(cmd_msg));
ready_user_keys_.erase(player->GetUserKey());
}
RC::eSTATUS_RESULT GoldRushTeam::OnMoveToSafezone( Player* const player )
{
GameField* const field = player->GetField();
if (field == NULL)
{
return RC::RC_STATUS_FIELD_IS_NULL;
}
const sMAPINFO* const map_info = \
MapInfoParser::Instance()->FindMapInfo(goldrush_->GetInstanceDungeon()->GetMapCode());
if (map_info == NULL)
{
return RC::RC_STATUS_MAPINFO_IS_NULL;
}
DWORD area_id = 0;
if (team_key_ == kRed)
{
area_id = map_info->wStartAreaID;
}
else
{
area_id = map_info->wStartAreaID2;
}
WzVector dest_pos;
if (field->GetAreaRandomStartingVector(area_id, dest_pos) == false)
{
return RC::RC_STATUS_IS_NOT_SAFEZONE;
}
if(field->TeleportObject( player, &dest_pos, TRUE ) == false)
{
return RC::RC_STATUS_TELEPORT_FAIL;
}
return RC::RC_STATUS_SUCCESS;
}
void GoldRushTeam::_OnFinishResult( Player* const player, const eBATTLEGROUND_RESULT result_type )
{
MSG_CG_GOLDRUSH_FINISH_RESULT_BRD brd_msg;
brd_msg.result_type = result_type;
player->SendPacket(&brd_msg, sizeof(brd_msg));
}
void GoldRushTeam::Start()
{
team_state_ = eCHAOSTEAM_STATE_MATCHED;
PLAYER_HASH_ITR itr = player_hash_map_.begin();
for (; itr != player_hash_map_.end(); ++itr)
{
Player* const player = itr->second;
if (player == NULL || player->IsDeleted())
continue;
player->GetGoldRushPlayerInfo().SetPlayerState(kPlayerStateMatch);
MSG_CG_GOLDRUSH_STATE_RESURECTION_CMD cmd_msg;
cmd_msg.player_state = kPlayerStateMatch;
player->SendPacket(&cmd_msg, sizeof(cmd_msg));
}
}
void GoldRushTeam::AllDeathMemberResurrectionAtSafezone()
{
PLAYER_HASH::const_iterator const_itr = player_hash_map_.begin();
for (; const_itr != player_hash_map_.end(); ++const_itr)
{
Player* const player = const_itr->second;
if (player == NULL || player->IsDeleted()) {
continue;
}
BattleGroundPlayerState player_goldrush_state = \
player->GetGoldRushPlayerInfo().GetPlayerState();
if (player_goldrush_state == kPlayerStateDeath ||
player_goldrush_state == kPlayerStateMatch)
{
continue;
}
MSG_CG_GOLDRUSH_STATE_RESURECTION_CMD cmd_msg;
cmd_msg.player_object_key = player->GetObjectKey();
if (player_goldrush_state == kPlayerStateStandbyResurection)
{
ALLOC_STATUS_PAIR steel = \
player->GetStatusManager()->AllocStatus(eCHAR_STATE_IMMUNITY_DAMAGE,
battle_ground_Info_->iron_mode * 1000);
if (steel.second) {
steel.second->SendStatusAddBRD();
}
cmd_msg.player_state = kPlayerStateMatch;
}
else if (player_goldrush_state == kPlayerStateStandbyResurectionRefuse)
{
cmd_msg.player_state = kPlayerStateStandbyResurection;
cmd_msg.resurection_time = goldrush_->GetRemainTicks();
}
else
{
continue;
}
player->GetGoldRushPlayerInfo().SetPlayerState(cmd_msg.player_state);
player->SendPacketAround(&cmd_msg, sizeof(cmd_msg));
}
}
void GoldRushTeam::OnResult( const eBATTLEGROUND_RESULT result_type )
{
PLAYER_HASH::const_iterator const_itr = player_hash_map_.begin();
for (; const_itr != player_hash_map_.end(); ++const_itr)
{
eBATTLEGROUND_RESULT current_result_type = result_type;
Player* const player = const_itr->second;
if (player == NULL || player->IsDeleted()) {
continue;
}
GoldRushBattleResult* const goldrush_result = goldrush_->GetGoldRushBattleResult();
if (goldrush_result == NULL) {
continue;
}
const BattleRecorder::Record* const record = goldrush_result->GetPlayerBattleResult(player);
if (record == NULL) {
continue;
}
//Abusing Check
if ((player->GetTeamKey() == kRed || player->GetTeamKey() == kBlue) &&
record->cumulative_required_gold_point <= battle_ground_Info_->abusing_point)
{
current_result_type = eBG_RESULT_ABUSE;
goldrush_->GoldRushPenalty(player);
}
#ifdef _JP_007387_20140702_GAMELOG_GOLDRUSH_GOLDPOINT
goldrush_result->SendBattleResult_RegisterGameLog(player);
#else
goldrush_result->SendBattleResult(player);
#endif //_JP_007387_20140702_GAMELOG_GOLDRUSH_GOLDPOINT
if (player->GetTeamKey() == kRed || player->GetTeamKey() == kBlue)
{
_OnReward(player, current_result_type);
}
_OnFinishResult(player, current_result_type);
if (player->GetTeamKey() == kObserve){
return;
}
GoldRushPlayerInfo& player_info = player->GetGoldRushPlayerInfo();
switch(current_result_type)
{
case eBG_RESULT_WIN:
{
player_info.IncreaseWinTimes();
GAMELOG->LogChaosZone(ACT_BATTLE_GROUND_WIN, player);
_SetWinFlag(true);
}break;
case eBG_RESULT_DRAW:
{
player_info.IncreaseDrawTimes();
GAMELOG->LogChaosZone(ACT_BATTLE_GROUND_DRAW, player);
}break;
case eBG_RESULT_LOSE:
{
player_info.IncreaseLoseTimes();
GAMELOG->LogChaosZone(ACT_BATTLE_GROUND_LOSE, player);
}break;
case eBG_RESULT_ABUSE:
{
player_info.IncreaseDisTimes();
GAMELOG->LogChaosZone(ACT_BATTLE_GROUND_DIS, player);
}break;
}
if (current_result_type != eBG_RESULT_ABUSE) {
player->GetGoldRushPlayerInfo().IncreasePlayTimes();
}
}
}
WORD GoldRushTeam::DistributeGoldPoint( WORD gold, const CHARGUID bonus_player /* = 0*/ )
{
BYTE member_count = GetMemberCount();
if ( member_count <=0 ) {
return 0;
}
WORD gold_foreach = gold / member_count;
WORD result_distributed_point = 0;
WORD base_kill_point = goldrush_->GetGoldRushInfo()->base_kill_point;
if (gold <= 0 || gold_foreach <= 0) {
return 0;
}
PLAYER_HASH::const_iterator const_itr = player_hash_map_.begin();
for (; const_itr != player_hash_map_.end(); ++const_itr)
{
Player* const player = const_itr->second;
if (player == NULL || player->IsDeleted()) {
continue;
}
const nsAI::TileEvent* tile_event = 0;
if (player->PlanEvent->GetTileEvent(&tile_event) == true &&
(tile_event->Attr & PTA_EXTRA_TILE)) {
continue;
}
if (player->GetCharGuid() == bonus_player) {
result_distributed_point = gold_foreach + base_kill_point;
}
else {
result_distributed_point = gold_foreach;
}
goldrush_->GetGoldRushBattleResult()->DoRecord(static_cast<Character*>(player),
BATTLE_RECORD_GOLDPOINT, static_cast<int>(result_distributed_point));
player->GetGoldRushPlayerInfo().AddGoldPoint(result_distributed_point);
}
return gold_foreach;
}
void GoldRushTeam::ObtainGoldPoint( WORD gold )
{
if (gold == 0) {
return;
}
PLAYER_HASH::const_iterator const_itr = player_hash_map_.begin();
for (; const_itr != player_hash_map_.end(); ++const_itr)
{
Player* const player = const_itr->second;
if (player == NULL || player->IsDeleted())
continue;
goldrush_->GetGoldRushBattleResult()->DoRecord(static_cast<Character*>(player),
BATTLE_RECORD_GOLDPOINT, static_cast<int>(gold));
player->GetGoldRushPlayerInfo().AddGoldPoint(gold);
}
}
const WORD GoldRushTeam::GetTotalTeamGoldPoint()
{
WORD total_goldpoint = 0;
BYTE member_count = GetMemberCount();
PLAYER_HASH::const_iterator const_itr = player_hash_map_.begin();
for (; const_itr != player_hash_map_.end(); ++const_itr)
{
Player* const player = const_itr->second;
if (player == NULL || player->IsDeleted())
continue;
total_goldpoint += player->GetGoldRushPlayerInfo().GetGoldPoint();
}
return total_goldpoint;
}
void GoldRushTeam::GetTeamMemberInfo( OUT GOLDRUSH_TEAM_SCORE_INFO& team_info )
{
BYTE member_count = GetMemberCount();
if (member_count <= 0)
{
team_info.team_member_count = 0;
team_info.team_key = kChaosZoneTeamNone;
team_info.team_gold_point = 0;
return;
}
team_info.team_member_count = member_count;
team_info.team_key = GetTeamKey();
team_info.team_gold_point = GetTotalTeamGoldPoint();
PLAYER_HASH::const_iterator const_itr = player_hash_map_.begin();
for( int i=0; const_itr != player_hash_map_.end(); ++const_itr, ++i)
{
Player* const player = const_itr->second;
if (player == NULL) {
continue;
}
_tcsncpy(team_info.team_player_info[i].character_name, player->GetCharName(), MAX_CHARNAME_LENGTH);
team_info.team_player_info[i].gold_grade = player->GetGoldRushPlayerInfo().GetGoldGrade();
}
}
void GoldRushTeam::_OnReward( Player* const player, const eBATTLEGROUND_RESULT result_type )
{
ZONEKEY zone_key = goldrush_->GetInstanceDungeon()->GetKey();
BOOL reward_result = MissionRewardManager::Instance()->RewardBattlegroundMember(player, zone_key,
battle_ground_Info_->map_code, result_type);
if (reward_result == TRUE)
{
SUNLOG(eFULL_LOG,
"[GoldRushTeam::_OnReward] [ID:%s]:Æô¶¯ÈÎÎñ½±Àø´°¿Ú.",player->GetUserID());
}
/*
FlowControl flow;
FLOWCONTROL_START()
{
MissionManager* const mission_manager = player->GetMissionManager();
mission_manager->CheckEnableWindowOpen();
if (mission_manager->EnableWindowOpen())
{
TriggerManagerEx::Check_RewardWindow(player, true);
return;
}
DWORD reward_index = 0;
switch(result_type)
{
case eBG_RESULT_WIN:
reward_index = battle_ground_Info_->win_reward_code;
break;
case eBG_RESULT_DRAW:
case eBG_RESULT_LOSE:
reward_index = battle_ground_Info_->base_reward_code;
break;
case eBG_RESULT_ABUSE:
reward_index = battle_ground_Info_->penalty_reward_code;
break;
}
if (!reward_index || !(reward_index < (DWORD)MAX_MISSION_NUM))
{
return;
}
const DWORD mission_point = mission_manager->GetMissionPoint(reward_index);
printf("GoldRushTeam::_OnReward :User [%u] MissonNumber[%u], MissionPoint[%u]\n",
player->GetUserKey(), reward_index, mission_point);
MissionRewardManager* reward_manager = MissionRewardManager::Instance();
reward_manager->Init();
MissionRewardArgs& mission_reward_args = reward_manager->GetMissionRewardArgs();
mission_reward_args.SetPlayer(player);
mission_reward_args.SetMissionManager(mission_manager);
mission_reward_args.SetNum(reward_index);
const WORD reward_code = reward_manager->GetRewardCode(true);
ASSERT(0xFFFF != reward_code);
if (0xFFFF != reward_code)
{
MSG_CG_TRIGGER_REWARD_WINDOW_CMD cmsg;
cmsg.m_RewardCode = reward_code;
player->SendPacket(&cmsg, sizeof(cmsg));
}
mission_manager->SetMissionState(reward_index, MISSION_REWARD);
mission_manager->SetMissionPoint(reward_index, mission_point + 1);
SUNLOG(eFULL_LOG,
"[GoldRushTeam::_OnReward] [ID:%s]:Æô¶¯ÈÎÎñ½±Àø´°¿Ú.",player->GetUserID());
}
FLOWCONTROL_END;
*/
}
#endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH