📄 gcharacter.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 + -