📄 battle.cpp
字号:
// Battle.cpp: implementation of the CBattle class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Battle.h"
#include "Player.h"
#include "BattleTeam.h"
#include "BattleObject.h"
#include "WantedManager.h"
#include "PartyManager.h"
#include "Party.h"
#include "PKManager.h"
#ifdef _MAPSERVER_
#include "Monster.h"
#include "ItemDrop.h"
#include "ItemManager.h"
#include "SkillManager_Server.h"
#include "ChannelSystem.h"
#include "..\[CC]Quest\QuestEvent.h"
#include "QuestManager.h"
#include "EventMapMgr.h"
#else
#include "ObjectManager.h"
#include "ChatManager.h"
#include "EventMapInfo.h"
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBattle::CBattle()
{
m_BattleFlag = BATTLE_FLAG_NONE;
m_bDestroyFlag = FALSE;
}
CBattle::~CBattle()
{
}
void CBattle::Initialize(BATTLE_INFO_BASE* pCreateInfo, CBattleTeam* pTeam1, CBattleTeam* pTeam2)
{
OnCreate(pCreateInfo,pTeam1,pTeam2);
m_BattleInfo = *pCreateInfo;
m_Team1 = pTeam1;
m_Team2 = pTeam2;
m_bDestroyFlag = FALSE;
m_WinnerTeam = eBattleTeam_Max;
m_BattleFlag = BATTLE_FLAG_NONE;
}
void CBattle::StartBattle()
{
OnFightStart();
#ifdef _MAPSERVER_
MSG_DWORD msg;
msg.Category = MP_BATTLE;
msg.Protocol = MP_BATTLE_START_NOTIFY;
msg.dwData = GetBattleID();
for(int n=0;n<eBattleTeam_Max;++n)
{
m_TeamArray[n]->SendTeamMsg(&msg,sizeof(msg));
}
#endif
}
BOOL CBattle::IsEnemy(CObject* pOperator,CObject* pTarget)
{
if(pOperator->GetObjectKind() & eObjectKind_Monster)
{ // Operator 啊 阁胶磐老版快
if(pTarget->GetObjectKind() & eObjectKind_Monster) // 阁胶磐绰 利捞 酒丛
return FALSE;
#ifdef _MAPSERVER_
if( pTarget->GetState() == eObjectState_Immortal ) //公利惑怕绰 利捞 酒聪促.
return FALSE;
#endif
}
else if(pOperator->GetObjectKind() == eObjectKind_Player)
{ // Operator 啊 敲饭捞绢老版快
if( pTarget->GetObjectKind() & eObjectKind_Monster ) // 阁胶磐绰 利捞促
{
return TRUE;
}
else if( pTarget->GetObjectKind() == eObjectKind_Player )
{
#ifdef _MAPSERVER_
if( pTarget->GetState() == eObjectState_Immortal ) //公利惑怕绰 利捞 酒聪促.
return FALSE;
if( ((CPlayer*)pOperator)->GetPartyIdx() != 0 )
{
CParty* pParty = PARTYMGR->GetParty( ((CPlayer*)pOperator)->GetPartyIdx() );
if( pParty )
if( pParty->IsPartyMember( pTarget->GetID() ) )
return FALSE; //颇萍盔篮 利捞 酒聪促.
}
if( PKMGR->IsPKAllow() )
if( WANTEDMGR->IsOwner((CPlayer*)pOperator, ((CPlayer*)pTarget)->GetWantedIdx()) == TRUE )
return TRUE; //么混 措惑磊绰 利捞促.
if( EVENTMAPMGR->IsEnemy( pOperator, pTarget, this->GetBattleID() ) )
return TRUE;
#else
if( pOperator == HERO )
{
if( PARTYMGR->IsPartyMember( pTarget->GetID() ) )
{
return FALSE; //颇萍盔篮 利捞 酒聪促.
}
if( PKMGR->IsPKAllow() )
if( WANTEDMGR->IsChrIDInList( pTarget->GetID() ) )
return TRUE; //么混 措惑磊绰 利捞促.
if( EVENTMAP->IsEnemy( pTarget ) )
return TRUE;
}
#endif
if( PKMGR->IsPKAllow() )
{
if( ((CPlayer*)pOperator)->IsPKMode() )
{
if(pOperator == pTarget )
return FALSE;
else
return TRUE; //磊脚捞 PK葛靛捞搁 磊脚阑 猾 唱赣瘤绰 利捞促.
}
if( ((CPlayer*)pTarget)->IsPKMode() )
return TRUE; //惑措啊 PK葛靛捞搁 利捞促.
}
return FALSE;
}
else if(pTarget->GetObjectKind() == eObjectKind_SkillObject)
{
// YH2DO 鞍篮祈 寒篮 救锭妨具 登绰单... -_-a;
CSkillObject* pSObj = (CSkillObject*)pTarget;
return TRUE;
}
else //唱赣瘤绰 利捞 酒聪促.
{
return FALSE;
}
}
return TRUE; // 唱赣柳 葛滴 利
}
BOOL CBattle::IsFriend(CObject* pOperator,CObject* pTarget)
{
if(pOperator->GetObjectKind() & eObjectKind_Monster)
{ // Operator 啊 阁胶磐老版快
if((pTarget->GetObjectKind() & eObjectKind_Monster) == FALSE) // 阁胶磐啊 酒聪搁 teammate啊 酒聪促.
return FALSE;
}
else if(pOperator->GetObjectKind() == eObjectKind_Player)
{ // Operator 啊 敲饭捞绢老版快
DWORD PartyIdx = 0;
#ifdef _MAPSERVER_
PartyIdx = ((CPlayer*)pOperator)->GetPartyIdx(); // 颇萍啊 绝栏搁 悼丰 绝澜
if(PartyIdx == 0)
return FALSE;
if(((CPlayer*)pTarget)->GetPartyIdx() != PartyIdx) // 颇萍啊 促福搁 FALSE
return FALSE;
#endif
if(pTarget->GetObjectKind() != eObjectKind_Player) // 敲饭捞绢啊 酒聪搁 FALSE
return FALSE;
}
return TRUE; // 唱赣柳 评皋捞飘
}
#ifdef _MAPSERVER_
BOOL CBattle::AddObjectToBattle(CObject* pObject)
{
for(int n=0;n<eBattleTeam_Max;++n)
{
if(m_TeamArray[n]->IsAddableTeamMember(pObject))
{
pObject->SetBattle(GetBattleID(),n);
BOOL rt = m_TeamArray[n]->AddTeamMember(pObject);
ASSERT(rt);
MSG_BATTLE_TEAMMEMBER_ADDDELETE msg;
SetProtocol(&msg,MP_BATTLE,MP_BATTLE_TEAMMEMBER_ADD_NOTIFY);
msg.Member.set(pObject->GetID(),pObject->GetObjectName());
msg.Team = n;
ToEachTeam(pTeam)
pTeam->SendTeamMsg(&msg,sizeof(msg));
EndToEachTeam
OnTeamMemberAdd(n,pObject->GetID(),pObject->GetObjectName());
if(pObject->GetObjectKind() == eObjectKind_Player)
SendBattleInfo((CPlayer*)pObject);
return TRUE;
}
}
return FALSE;
}
BOOL CBattle::IsAddableBattle(CObject* pObject)
{
for(int n=0;n<eBattleTeam_Max;++n)
{
if(m_TeamArray[n]->IsAddableTeamMember(pObject))
{
return TRUE;
}
}
return FALSE;
}
BOOL CBattle::DeleteObjectFromBattle(CObject* pObject)
{
ToEachTeam(pTeam)
if(pTeam->DeleteTeamMember(pObject) == TRUE)
{
pObject->SetBattle(pObject->GetGridID(),0);
if(OnTeamMemberDelete(TeamNumber,pObject->GetID(),pObject->GetObjectName()) == TRUE)
{
MSG_BATTLE_TEAMMEMBER_ADDDELETE msg;
SetProtocol(&msg,MP_BATTLE,MP_BATTLE_TEAMMEMBER_DELETE_NOTIFY);
msg.Member.set(pObject->GetID(),pObject->GetObjectName());
msg.Team = TeamNumber;
ToEachTeam(pTeam)
pTeam->SendTeamMsg(&msg,sizeof(msg));
EndToEachTeam
}
return TRUE;
}
EndToEachTeam
return FALSE;
}
void CBattle::SendBattleInfo(CPlayer* pPlayer)
{
static MSG_BATTLE_INFO msg;
SetProtocol(&msg,MP_BATTLE,MP_BATTLE_INFO);
GetBattleInfo(msg.info,&msg.msglen);
pPlayer->SendMsg(&msg,msg.GetMsgLength());
}
void CBattle::GetBattleInfo(char* pInfo,WORD* size)
{
memcpy(pInfo,&m_BattleInfo,sizeof(BATTLE_INFO_BASE));
*size = sizeof(BATTLE_INFO_BASE);
}
DWORD CBattle::GetTeamMemberNum(int i)
{
return m_TeamArray[i]->GetMemberNum();
}
#endif
// event func
void CBattle::OnCreate(BATTLE_INFO_BASE* pCreateInfo, CBattleTeam* pTeam1, CBattleTeam* pTeam2)
{
#ifdef _MAPSERVER_
pCreateInfo->BattleTime = gCurTime;
#else
// pCreateInfo->BattleTime = gCurTime - pCreateInfo->BattleTime;
pCreateInfo->BattleTime = gCurTime;
#endif
pCreateInfo->BattleState = eBATTLE_STATE_READY;
}
void CBattle::OnFightStart()
{
m_BattleInfo.BattleTime = gCurTime;
m_BattleInfo.BattleState = eBATTLE_STATE_FIGHT;
}
void CBattle::OnDestroy()
{
#ifdef _MAPSERVER_
MSGBASE msg;
SetProtocol(&msg,MP_BATTLE,MP_BATTLE_DESTROY_NOTIFY);
ToEachTeam(pTeam)
pTeam->SendTeamMsg(&msg,sizeof(msg));
YHTPOSITION pos = pTeam->GetPositionHead();
while(CObject* pObject = pTeam->GetNextTeamMember(&pos))
{
pTeam->DeleteTeamMember(pObject);
}
EndToEachTeam
#endif
}
void CBattle::OnTeamMemberAdd(int Team,DWORD MemberID,char* Name)
{
}
BOOL CBattle::OnTeamMemberDelete(int Team,DWORD MemberID,char* Name)
{
// return TRUE甫 窍搁 MP_BATTLE_TEAMMEMBER_DELETE_NOTIFY 皋技瘤甫 谎府霸 等促.
return FALSE;
}
BOOL CBattle::OnTeamMemberDie(int Team,DWORD VictimMemberID,DWORD KillerID)
{
return FALSE;
}
void CBattle::OnTeamObjectCreate(int Team,CBattleObject* pBattleObject)
{
}
void CBattle::OnTeamObjectDestroy(int Team,CBattleObject* pBattleObject)
{
}
void CBattle::OnTeamMemberRevive(int Team,CObject* pReviver)
{
}
void CBattle::OnMonsterDistribute(CMonster* pMonster,CObject* pKiller)
{
#ifdef _MAPSERVER_
pMonster->Drop();
if(pKiller->GetObjectKind() == eObjectKind_Player)
{
// jsd quest
// 咯扁辑 monsterkill event惯积
CQuestEvent qe;
qe.SetValue( eQuestEvent_Hunt, pMonster->m_MonsterInfo.MonsterKind, 0 );
QUESTMGR->AddQuestEvent( (CPlayer*)pKiller, &qe );
//
}
#endif
}
void CBattle::OnTick()
{
ySWITCH(m_BattleInfo.BattleState)
yCASE(eBATTLE_STATE_READY)
yCASE(eBATTLE_STATE_FIGHT)
yCASE(eBATTLE_STATE_RESULT)
yENDSWITCH
}
// 铰菩 魄沥
BOOL CBattle::Judge()
{
return FALSE;
}
void CBattle::Victory(int WinnerTeamNum,int LoserTeamNum)
{
#ifdef _MAPSERVER_
MSG_DWORD2 msg;
msg.Category = MP_BATTLE;
msg.Protocol = MP_BATTLE_VICTORY_NOTIFY;
msg.dwData1 = WinnerTeamNum;
msg.dwData2 = LoserTeamNum;
ToEachTeam(pTeam)
pTeam->SendTeamMsg(&msg,sizeof(msg));
EndToEachTeam
#endif
m_WinnerTeam = WinnerTeamNum;
m_BattleInfo.BattleState = eBATTLE_STATE_RESULT;
m_BattleInfo.BattleTime = gCurTime;
}
void CBattle::Draw()
{
#ifdef _MAPSERVER_
MSGBASE msg;
msg.Category = MP_BATTLE;
msg.Protocol = MP_BATTLE_DRAW_NOTIFY;
ToEachTeam(pTeam)
pTeam->SendTeamMsg(&msg,sizeof(msg));
EndToEachTeam
#endif
m_WinnerTeam = eBattleTeam_Max;
m_BattleInfo.BattleState = eBATTLE_STATE_RESULT;
m_BattleInfo.BattleTime = gCurTime;
}
// Render
#ifdef _MHCLIENT_
#include "interface/cFont.h"
void CBattle::Render()
{
// RECT rect;
// SetRect(&rect,30,100,500,150);
// char temp[256];
// sprintf(temp,"Default Battle");
// CFONT_OBJ->RenderFont(0,temp,strlen(temp),&rect,0xffffffff);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -