⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 battle_murimfield.cpp

📁 墨香最新私服
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "Battle_MurimField.h"
#include "BattleTeam_MurimField.h"

#include "../BattleObject.h"
#include "Object.h"
#include "Player.h"

#ifdef _MAPSERVER_		// mapserver

#include "UserTable.h"
#include "ServerTable.h"
#include "CharMove.h"
#include "ObjectStateManager.h"
#include "PackedData.h"

#else					// client

#include "ChatManager.h"
#include "./interface/cWindowManager.h"
#include "./Interface/cScriptManager.h"
#include "ObjectManager.h"
//#include "TileManager.h"
//#include "MHMap.h"
#endif

#define BATTLE_MURIMFIELD_READYTIME		20000
#define	BATTLE_MURIMFIELD_FIGHTTIME		100000
#define BATTLE_MURIMFIELD_RESULTTIME	30000

VECTOR3 team1Po,team2Po,team3Po;


CBattle_MurimField::CBattle_MurimField()
{
	memset( &m_MurimBattleInfo, 0, sizeof(MURIMFIELD_BATTLE_INFO) );

	m_BattleFlag = BATTLE_FLAG_LOGINBATTLE;

	// ÀÓ½Ã
	SetVector3(&team1Po,23000,0,25000);
	SetVector3(&team2Po,27000,0,25000);
	SetVector3(&team3Po,25000,0,25000);

#ifndef _MAPSERVER_
	m_pCurShowImage	= NULL;
#endif
}

CBattle_MurimField::~CBattle_MurimField()
{
}

// Àû,¾Æ±º ±¸º°
BOOL CBattle_MurimField::IsEnemy( CObject* pOperator, CObject* pTarget )
{
	if( m_BattleInfo.BattleState != eBATTLE_STATE_FIGHT )
		return FALSE;
		
	if( pOperator->GetBattleID() != pTarget->GetBattleID() )
		return FALSE;
	
	if( pOperator->GetBattleTeam() == pTarget->GetBattleTeam() )
		return FALSE;
	
	return TRUE;
}

BOOL CBattle_MurimField::IsFriend( CObject* pOperator, CObject* pTarget )
{
	if( m_BattleInfo.BattleState != eBATTLE_STATE_FIGHT )
		return FALSE;

	if( pOperator->GetBattleID() != pTarget->GetBattleID() )
		return FALSE;
	
	if( pOperator->GetBattleTeam() != pTarget->GetBattleTeam() )
		return FALSE;
	
	return TRUE;
}

// event func
void CBattle_MurimField::OnCreate( BATTLE_INFO_BASE* pCreateInfo, CBattleTeam* pTeam1, CBattleTeam* pTeam2 )
{
	CBattle::OnCreate( pCreateInfo, pTeam1, pTeam2 );

	memcpy( &m_MurimBattleInfo, pCreateInfo, sizeof(MURIMFIELD_BATTLE_INFO) );

#ifndef _MAPSERVER_	
	m_ImageNumber.Init( 32, 0 );
	m_ImageNumber.SetFillZero( TRUE );
	m_ImageNumber.SetLimitCipher( 3 );
	m_ImageNumber.SetPosition( 528 + 32, 70 );

	SCRIPTMGR->GetImage( 59, &m_ImageReady, PFT_HARDPATH );
	SCRIPTMGR->GetImage( 60, &m_ImageFight, PFT_HARDPATH );
	SCRIPTMGR->GetImage( 61, &m_ImageWin, PFT_HARDPATH );
	SCRIPTMGR->GetImage( 62, &m_ImageLose, PFT_HARDPATH );
	SCRIPTMGR->GetImage( 76, &m_ImageDraw, PFT_HARDPATH );
	
	m_pCurShowImage = &m_ImageReady;

	m_vImagePos.x = (1024 - 128) / 2;			//128 width
	m_vImagePos.y = 32;
	m_vImageScale.x = m_vImageScale.y = 1.0f;
#endif
}

void CBattle_MurimField::OnFightStart()
{
	CBattle::OnFightStart();

#ifndef _MAPSERVER_
	m_pCurShowImage = &m_ImageFight;
#endif
}

void CBattle_MurimField::OnDestroy()
{
}

void CBattle_MurimField::OnTeamMemberAdd( int Team, DWORD MemberID, char* Name )
{
#ifdef _MAPSERVER_
	CObject* pObject = g_pUserTable->FindUser(MemberID);
	ASSERT(pObject);
	if(pObject->GetObjectKind() == eObjectKind_Player)
	{
		CPlayer* pPlayer = (CPlayer*)pObject;

		if(Team == eBattleTeam1)
		{
			CCharMove::SetPosition(pPlayer,&team1Po);
		}
		else if( Team == eBattleTeam2 )
		{
			CCharMove::SetPosition(pPlayer,&team2Po);
		}
		else
		{
			CCharMove::SetPosition(pPlayer,&team3Po);
		}
		CCharMove::CorrectPlayerPosToServer(pPlayer);
	}	
#else
	CHATMGR->AddMsg( CTC_TOWHOLE, CHATMGR->GetChatMsg(451), Name, Team );
#endif
	
	CBattleTeam_MurimField* pTeam = GetTeam(Team);
	MURIMFIELD_TEAMINFO* pTeamInfo = pTeam->GetTeamInfo();
	BATTLE_TEAMMEMBER_INFO* pMemberInfo = pTeamInfo->FindMember(MemberID);

	for(int n=0;n<MAX_MUNPAFIELD_MEMBERNUM;++n)
	{
		if(pTeamInfo->TeamMember[n].MemberID == MemberID)
		{
			pTeamInfo->TeamMember[n].set(MemberID,Name);
			break;
		}
	}
}

BOOL CBattle_MurimField::OnTeamMemberDelete(int Team,DWORD MemberID,char* Name)
{
#ifdef _MHCLIENT_
	CHATMGR->AddMsg( CTC_TOWHOLE, CHATMGR->GetChatMsg(452), Name, Team );
#endif
	//////////////////////////////////////////////////////////////////////////
	// Àӽà Å×½ºÆ®¿ë
	CBattleTeam_MurimField* pTeam = GetTeam(Team);
	MURIMFIELD_TEAMINFO* pTeamInfo = pTeam->GetTeamInfo();
	BATTLE_TEAMMEMBER_INFO* pMemberInfo = pTeamInfo->FindMember(MemberID);
	ASSERT(pMemberInfo);
	pMemberInfo->MemberID = 0;
	//////////////////////////////////////////////////////////////////////////

	return TRUE;
}

BOOL CBattle_MurimField::OnTeamMemberDie(int Team,DWORD VictimMemberID,DWORD KillerID)
{
	ASSERT(Team < eBattleTeam_Max);
	
#ifdef _MAPSERVER_
	CObject* pVictimMember = g_pUserTable->FindUser(VictimMemberID);
	CObject* pKiller = g_pUserTable->FindUser(KillerID);
	if(pVictimMember == NULL || pKiller == NULL)
	{
		ASSERT(0);
		return FALSE;
	}
	
	ASSERT(pVictimMember->GetBattleID() == GetBattleID());
	if(pKiller->GetBattleID() != GetBattleID())
		return FALSE;

	OBJECTSTATEMGR_OBJ->StartObjectState( pVictimMember, eObjectState_Die, pKiller->GetID() );
	OBJECTSTATEMGR_OBJ->EndObjectState( pVictimMember, eObjectState_Die, PLAYERREVIVE_TIME );
	
	MSG_DWORD3 msg;
	SetProtocol(&msg,MP_BATTLE,MP_BATTLE_TEAMMEMBER_DIE_NOTIFY);
	msg.dwData1 = Team;
	msg.dwData2 = VictimMemberID;
	msg.dwData3 = KillerID;
	ToEachTeam(pTeam)
		pTeam->SendTeamMsg(&msg,sizeof(msg));
	EndToEachTeam
#endif	

	MURIMFIELD_TEAMINFO* pKillTeam = GetTeam(GetOtherTeamNum(Team))->GetTeamInfo();
	MURIMFIELD_TEAMINFO* pDiedTeam = GetTeam(Team)->GetTeamInfo();

	++pKillTeam->TotalKill;
	++pDiedTeam->TotalDied;

	BATTLE_TEAMMEMBER_INFO* pKillerInfo = pKillTeam->FindMember(KillerID);
	BATTLE_TEAMMEMBER_INFO* pVictimInfo = pDiedTeam->FindMember(VictimMemberID);

	ASSERT(pKillerInfo);
	ASSERT(pVictimInfo);

	++pKillerInfo->MemberKillNum;
	++pVictimInfo->MemberDieNum;


	return TRUE;
}

void CBattle_MurimField::OnTeamMemberRevive(int Team,CObject* pReviver)
{
#ifdef _MAPSERVER_
	VECTOR3 pos;
	if( Team == eBattleTeam1 )
		pos = team1Po;
	else if( Team == eBattleTeam2 )
		pos = team2Po;
	else
		pos = team3Po;

	MOVE_POS msg;
	msg.Category = MP_USERCONN;
	msg.Protocol = MP_USERCONN_CHARACTER_REVIVE;
	msg.dwObjectID = pReviver->GetID();
	msg.dwMoverID = pReviver->GetID();
	msg.cpos.Compress(&pos);
	
	CCharMove::SetPosition( pReviver, &pos );

	DWORD MaxLife = pReviver->GetMaxLife();
	DWORD MaxNaeryuk = pReviver->GetMaxNaeRyuk();
	pReviver->SetLife((DWORD)(MaxLife));
	pReviver->SetNaeRyuk((DWORD)(MaxNaeryuk));
	
	ToEachTeam(pTeam)
		pTeam->SendTeamMsg(&msg,sizeof(msg));
	EndToEachTeam
#endif
}

void CBattle_MurimField::OnTeamObjectCreate(int Team,CBattleObject* pBattleObject)
{
}

void CBattle_MurimField::OnTeamObjectDestroy(int Team,CBattleObject* pBattleObject)
{
}

void CBattle_MurimField::OnTick()
{
	ySWITCH(m_BattleInfo.BattleState)
		yCASE(eBATTLE_STATE_READY)
			DWORD ElapTime = gCurTime - m_BattleInfo.BattleTime;
			if( ElapTime > BATTLE_MURIMFIELD_READYTIME )
			{
				for( int n = 0; n < eBattleTeam_Max; ++n )
				{
					if( m_TeamArray[n]->GetAliveTeamMemberNum() == 0 )
						return;
				}

				StartBattle();
			}

		yCASE(eBATTLE_STATE_FIGHT)
			Judge();

		yCASE(eBATTLE_STATE_RESULT)
			Result();
	
	yENDSWITCH
}

BOOL CBattle_MurimField::Judge()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -