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

📄 gcharacter.cc

📁 五行MMORPG引擎系统V1.0
💻 CC
字号:
//GCharacter.cc
/*/////////////////////////////////////////////////////////////////

   李亦
	liease@163.com 4040719
	2006-7-18
/*/////////////////////////////////////////////////////////////////

#include "console/consoleTypes.h"
#include "rpg/RPGDataMan.h"
#include "rpg/gobjects/GCharacter.h"
#include "rpg/RPGSetting.h"
#include "rpg/RPGChat.h"

#ifdef TGE_RPGCLIENT
#include "game/shapeBase.h"
#include "game/aiPlayer.h"
#endif

namespace RPG
{
IMPLEMENT_CO_NETOBJECT_V1(GCharacter);


GCharacter::GCharacter()
#ifdef TGE_RPG
:m_arActionQueues(8)
#endif
{
	m_dwRPGTypes |= GOT_CHARACTER;

	m_arBagGoods.setSize(0);
	m_arSkills.setSize(0);
	m_arBagGoods.SetArrayType(GGAR_GOODSBAG0);

	dMemset(&m_dataCharacter,0,sizeof(m_dataCharacter));
	dMemset(&m_dataAffect,0,sizeof(m_dataAffect));
	dMemset(&m_dataResult,0,sizeof(m_dataResult));
	//m_pTSFileFormat = StringTable->insert(CHAR_TSFILEFORMAT);

}

GCharacter::~GCharacter()
{
}

//----------------------------------------------------------------------------

//bool GCharacter::onAdd()
//{
//   if (!Parent::onAdd())
//      return false;
//   return true;
//}
//
//
//void GCharacter::onRemove()
//{
//   Parent::onRemove();
//}


//bool GCharacter::OnNewDataBlock(RPGBaseData* dptr)
//{
//   return true;
//}
//
//bool GCharacter::OnNewGameBase(GameBase* dptr)
//{
//   return true;
//}




void GCharacter::SetCharacter(EGCareer career,EGClan clan,EGZone zone,U32 dwLevel)
{
	m_dataCharacter.dataResult.abilities	= RPGSetting::GetCareerAbility(career);
	m_dataCharacter.clan		= clan;
	m_dataCharacter.career	= career;
	m_dataCharacter.zone		= zone;
}


#ifndef TGE_RPGCLIENT
bool GCharacter::PlayMotion(StringTableEntry pIconTag)
{
	return false;
}
#endif


void GCharacter::SetPos(Point3F &ptPos)
{
	m_dataCharacter.x = ptPos.x;
	m_dataCharacter.y = ptPos.y;
	m_dataCharacter.z = ptPos.z;

	Parent::SetPos(ptPos);
}

//void GCharacter::MoveTo(Point3F &ptPos)
//{
//	Player* pPlayer = dynamic_cast<Player*>(GameBase());
//	if()
//	{
//	}
//}


void GCharacter::CalcEquipMoveSpeed()
{
	U32 n;
	GGoods*		pGoods;
	GEfficacy*	pEfficacy;
	
	//计算所有装备移动属性
	m_dataResult.eMoveRate	= m_dataCharacter.dataResult.eMoveRate;
	m_dataResult.eMoveSpeed = m_dataCharacter.dataResult.eMoveSpeed;

	for(n=0; n<m_arEquipments.size(); n++)
	{
		pGoods = m_arEquipments[n];
		if(pGoods == NULL)
			continue;
		pEfficacy = pGoods->GetEfficacy();
		if(pEfficacy == NULL)
			continue;

		m_dataResult.eMoveRate	+= pEfficacy->GetMoveRate();
		m_dataResult.eMoveSpeed += pEfficacy->GetMoveSpeed();
	}//for
}


bool GCharacter::AffectMoveSpeed(F32 fSpeed)
{
	m_dataAffect.eMoveSpeed = fSpeed;
#ifdef TGE_RPGCLIENT
	UpdateToTShape(TSU_MOVE);
#endif
	return true;
}

bool GCharacter::AffectMoveRate(F32 fRate)
{
	m_dataAffect.eMoveRate	= fRate;
#ifdef TGE_RPGCLIENT
	UpdateToTShape(TSU_MOVE);
#endif
	return true;
}


bool GCharacter::AddMoney(S32 nAdd)
{
	S32 nMoney;

	//保证身上金钱>=0
	if(m_dataCharacter.nMoney < 0)
		m_dataCharacter.nMoney = 0;

	if(nAdd == 0)
		return true;

	nMoney = m_dataCharacter.nMoney;
	nMoney += nAdd;

	//结果<0,则返回false
	if(nMoney < 0)
		return false;

	//金钱上限计算
	m_dataCharacter.nMoney = nMoney;

#ifdef TGE_RPGCLIENT
	UpdateToTShape(TSU_PROPERTY);
	if(IsMainRole())
	{
		if(nAdd>0)
			RPGChat::OutputTipF(TIP_MONEYADD ,nAdd, g_pRPGSetting->GetMoneyUnit());
		else
			RPGChat::OutputTipF(TIP_MONEYREDUCE ,-nAdd, g_pRPGSetting->GetMoneyUnit());
	}
#endif
	return true;
}


bool GCharacter::ExistGoods(U32 nGoodsCode, EGGoodsKind kind, U32 nLevel, U32 nAmount)
{
	U32				nNum;
	if(nAmount == -1)
		nAmount = 1;

	nNum = m_arBagGoods.CountSameGoods(nGoodsCode,  kind, nLevel);
	return (nNum >= nAmount);
}

//bool GCharacter::ExistGoods(const GEFFICACY& ref,GNpc* pNpc,GTaskBase* pTask)
bool GCharacter::ExistGoods(const GGOODSREF& ref)
{
	U32	nNum;
	U32	nAmount;
	if(!ref.pData)
		return false;

	nAmount = ref.pData->nAmount;
	if(nAmount == -1)
		nAmount = 1;

	nNum = m_arBagGoods.CountSameGoods(ref);//, pNpc, pTask);
	return (nNum >= nAmount);
}


bool GCharacter::RemoveGoods(U32 nGoodsCode, EGGoodsKind kind, U32 nLevel, U32 nAmount)
{
	U32		nNum;

	nNum = m_arBagGoods.CountSameGoods(nGoodsCode,  kind, nLevel);
	if(nAmount == -1)
		nAmount = nNum;
	if(nNum < nAmount)
		return false;

#ifdef TGE_RPGCLIENT
	U32		n;
	n = m_arBagGoods.SearchSameGoods(nGoodsCode,  kind,  nLevel);
	if(n != -1 && IsMainRole())
		RPGChat::OutputTipF(TIP_GOODSREMOVED,m_arBagGoods[n]->GetFullName(), nNum, m_arBagGoods[n]->GetUnit() );
#endif

	nNum = m_arBagGoods.RemoveSameGoods(nGoodsCode,  kind, nLevel, nAmount);

#ifdef TGE_RPGCLIENT
	UpdateToUI(&m_arBagGoods,-1);
#endif

	return nNum == nAmount;
}



//bool GCharacter::RemoveGoods(const GEFFICACY& ref,GNpc* pNpc,GTaskBase* pTask)
bool GCharacter::RemoveGoods(const GGOODSREF& ref)
{
	U32		nNum;
	U32		nAmount;
	if(ref.pData == NULL)
		return false;

	nAmount = ref.pData->nAmount;
	if(nAmount == -1)
		nAmount = 1;

	nNum = m_arBagGoods.CountSameGoods(ref);//, pNpc, pTask);
	if(nNum < nAmount)
		return false;


#ifdef TGE_RPGCLIENT
	U32		n;
	n = m_arBagGoods.SearchSameGoods(ref);//, pNpc, pTask);
	if(n != -1 && IsMainRole())
		RPGChat::OutputTipF(TIP_GOODSREMOVED,m_arBagGoods[n]->GetFullName(), nNum, m_arBagGoods[n]->GetUnit() );
#endif

	nNum = m_arBagGoods.RemoveSameGoods(ref);//, pNpc, pTask);

#ifdef TGE_RPGCLIENT
	UpdateToUI(&m_arBagGoods,-1);
#endif

	return nNum == nAmount;
}


//bool GCharacter::AddGoods(const GEFFICACY& ref,GNpc* pNpc,GTaskBase* pTask)
bool GCharacter::AddGoods(const GGOODSREF& ref)
{
	U32					n;
	Vector<GGoods*>	arGoods;
	BOOL					bFailed;
	U32					nNum;
	GGoods*				pGoods;
	GEfficacy*			pEfficacy;
	U32					nAmount;
	GNpc					*pGoodsTo,
							*pGoodsFrom;
	GGOODSDEFINE		*pDefine;

	if(!ref.pData)
		return false;

	nAmount	= ref.pData->nAmount;
	if(nAmount == 0)
		return true;

	n = m_arBagGoods.SearchBlankCell(nAmount);
	//背包槽空间不足
	if(n == -1)
		return false;

	pDefine	= g_pRPGDataMan->GetGoodsDefine(ref.pData->nGoodsCode);
	if(!pDefine)
		return false;

	ref.GetFromToNpc(pDefine->dwGoodsType, pGoodsFrom,pGoodsTo);
	//GTaskBase::GetFromToNpc(ref.pTask,ref.pNpc,pDefine->dwGoodsType, pGoodsFrom,pGoodsTo,ref.bCreateGoods);

	//pEfficacy = g_pRPGDataMan->GetEfficacy(ref.pData->nGoodsEffID);
	///////////////////////////////
	//生成物品
	arGoods.setSize(nAmount);
	nNum = 0;
	for(n=0; n<nAmount; n++)
	{
		pGoods = g_pRPGDataMan->NewGoods();
		if(pGoods && pGoods->SetGoods( ref) )
		{	
			if(pGoods->IsGoodsType(GGT_TASK))
			{
				pGoods->SetGoodsFromNpc(pGoodsFrom);
				pGoods->SetGoodsToNpc( pGoodsTo );
			}//if
			nNum++;
		}
		arGoods[n] = pGoods;
	}//for


	/////////////////////////////////
	//增加成功
	if(nNum == nAmount)
	{	
		GGoodsArray* pOwner;
		for(n=0; n<nAmount; n++)
			AddGoodsToBag(arGoods[n],pOwner);
		//UpdateToUI(pOwner);
		return true;
	}

	////////////////////////////////
	//增加失败的话,则删除
	for(n=0; n<nAmount; n++)
		if(arGoods[n])
			g_pRPGDataMan->RemoveGoods(arGoods[n]);

	return false;
}



U32 GCharacter::AddGoodsToBag(GGoods* pGGoods,GGoodsArray*&	pOwnerAdd)
{
	if(!pGGoods)
		return -1;
	//按任务、普通等物品类别,分别加到各槽中
	U32 nAdd = m_arBagGoods.AddGoods(pGGoods);
	if(nAdd == -1)
	{
		pOwnerAdd = NULL;
		return -1;
	}

	pOwnerAdd = &m_arBagGoods;
#ifdef TGE_RPGCLIENT
	UpdateToUI(&m_arBagGoods,nAdd);
	//ToggleGoodsHandle ghandle(pGGoods,FALSE);
	if(IsMainRole())
		RPGChat::OutputTipF(TIP_GOODSADDTOBAG,pGGoods->GetFullName(),1,pGGoods->GetUnit());
	//RPGChat::OutputTipF(TIP_GOODSADDTOBAG,ToggleGoodsHandle(pGGoods)->GetGoodsName());
#endif
	return nAdd;
}

U32 GCharacter::ApplyGoodsToEquip(GGoods* pGGoods, U32 nBagIndex, GGoodsArray*&	pOwnerAdd)
{
	U32			slot;
	GGoods*		pGEquip;

	if(pGGoods == NULL || !pGGoods->IsGoodsType(GGT_EQUIP) )
		return -1;

	// 1.取得装备类型,确定装备槽
	slot		= pGGoods->GetSubType();
	if(slot >= EQUIP_SLOTNUM)
		return -1;

	// 2.卸下装备槽装备、并且放在背包中(通常在要待装备位置)
	pGEquip	= m_arEquipments[slot];
	m_arBagGoods[nBagIndex] = pGEquip;

	// 3.把待装备装在槽中
	m_arEquipments[slot] = pGGoods;

	pOwnerAdd = &m_arEquipments;

#ifdef TGE_RPG
		UpdateToUI(&m_arBagGoods,nBagIndex);
		UpdateToUI(&m_arEquipments,slot);
		//if(pGEquip)
		//	RPGChat::OutputTipF(TIP_GOODS_APPLYEQUIP,
		//					pGGoods->GetGoodsName(), 
		//					g_pRPGSetting->GetEquipTypeName(slot),
		//					pGEquip->GetGoodsName());
		//else
		//	RPGChat::OutputTipF(TIP_EQUIP_ARMING, pGGoods->GetGoodsName(), g_pRPGSetting->GetEquipTypeName(slot));

#endif

	//UpdateToTShape(TSU_PROPERTY);
	return slot;
}





//----------------------------------------------------------------------------
void GCharacter::ProcessTick(const Move*)
{
#ifdef TGE_RPG
	if(m_arActionQueues.size())
	{
		Player*	pPlayer = static_cast<Player*>(GetGameBase());
		CharAction& ca = m_arActionQueues.front();
		m_arActionQueues.pop_front();

		switch(ca.dwCmd)
		{
		case CA_PLAYMOTION:
			if(pPlayer)
				pPlayer->setActionThread(ca.sData, false,true);
			if(IsMainRole())
				RPGChat::OutputTipF(TIP_MOTION_PLAYING,ca.sData);
			break;
		}//switch
	}//if
#endif

}

void GCharacter::InterpolateTick(F32 delta)
{
}

void GCharacter::AdvanceTime(F32)
{
}



//U32 GCharacter::GetPacketDataChecksum(GameConnection*)
//{
//   return 0;
//}

//void GCharacter::WritePacketData(GameConnection*, BitStream*)
//{
//}
//
//void GCharacter::ReadPacketData(GameConnection*, BitStream*)
//{
//}


U32 GCharacter::packUpdate(NetConnection *, U32 mask, BitStream *stream)
{
   // Check the mask for the ScaleMask; if it's true, pass that in.
   //if (stream->writeFlag( mask & ScaleMask ) ) {
   //    mathWrite( *stream, Parent::getScale() );
   //}
   //if (stream->writeFlag((mask & DataBlockMask) && m_pDataBlock != NULL)) {
   //   stream->writeRangedU32(m_pDataBlock->getId(),
   //                          DataBlockObjectIdFirst,
   //                          DataBlockObjectIdLast);
   //}

   // cafTODO: ControlMask
   return 0;
}

void GCharacter::unpackUpdate(NetConnection *con, BitStream *stream)
{
   //if (stream->readFlag()) {
   //   VectorF scale;
   //   mathRead( *stream, &scale );
   //   setScale( scale );
   //}
   //if (stream->readFlag()) {
   //   RPGBaseData* dptr = 0;
   //   SimObjectId id = stream->readRangedU32(DataBlockObjectIdFirst,
   //                                          DataBlockObjectIdLast);

   //   if (!Sim::findObject(id,dptr) || !SetDataBlock(dptr))
   //      con->setLastError("Invalid packet GCharacter::unpackUpdate()");
   //}
}


//----------------------------------------------------------------------------
//ConsoleMethod( GCharacter, GetDataBlock, S32, 2, 2, "()"
//              "Return the datablock this GCharacter is using.")
//{
//   return object->GetDataBlock()? object->GetDataBlock()->getId(): 0;
//}




void GCharacter::initPersistFields()
{
   Parent::initPersistFields();

   addField("charName",		TypeString,		Offset(m_dataCharacter.pCharName,   GCharacter));
   addField("charLevel",	TypeS32,			Offset(m_dataCharacter.dwLevel,		GCharacter));
   addField("charMoney",	TypeS32,			Offset(m_dataCharacter.nMoney,		GCharacter));

   //addGroup("Misc");	
   //addField("nameTag",		TypeCaseString,		Offset(m_pNameTag,   GCharacter));
   //addField("dataBlock",	TypeRPGBaseDataPtr,	Offset(m_pDataBlock, GCharacter));
   //addField("gameBase",		TypeGameBasePtr,		Offset(m_pGameBase, GCharacter));
   //endGroup("Misc");	
}

void GCharacter::consoleInit()
{
//   Con::addVariable("GCharacter::boundingBox", TypeBool, &gShowBoundingBox);
}


/////////////////////////////////////////////////////////////////
CONSOLEMETHOD_CHAR_STR(GCharacter,GetTSName,"GetTSName");
CONSOLEMETHOD_CHAR_STR(GCharacter,GetPathTitle,"GetPathTitle");
CONSOLEMETHOD_CHAR_STR(GCharacter,GetInstName,"GetInstName");

CONSOLEMETHOD_CHAR_VOID(GCharacter,UpdateToTShape,"UpdateToTShape");

CONSOLEMETHOD_CHAR_TYPE(GCharacter,Clan,"Clan");
CONSOLEMETHOD_CHAR_TYPE(GCharacter,Career,"Career");
CONSOLEMETHOD_CHAR_TYPE(GCharacter,Gender,"Gender");







};//namespace RPG

⌨️ 快捷键说明

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