Files
mir_server/server/LogicServer/config/PetProvider.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

357 lines
7.7 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "PetProvider.h"
#include "../base/Container.hpp"
using namespace wylib::stream;
CPetProvider::CPetProvider() : m_dataAllocator(_T("PetDataAlloc"))
{
}
CPetProvider::~CPetProvider()
{
m_petData.empty();
}
void CPetProvider::showError(LPCTSTR sError)
{
m_sLastErrDesc = sError;
RefString s = _T("[Config Error]");
s += sError;
throw s;
}
//装载宠物的经验
bool CPetProvider::LoadPetExp(LPCTSTR sFilePath)
{
//bool bResult = InheritedReader::LoadFile(this,sFilePath,&CPetProvider::ReadPetExp);
bool bResult = false;
bResult = Inherited::LoadFile(sFilePath);
if (!bResult)
{
showError(_T("ReadPetExp config error!"));
return false;
}
//bResult = InheritedReader::LoadFile(this,sFilePath,&CPetProvider::ReadPetMergePropRate);
//if (!bResult)
//{
// showError(_T("ReadPetMergeProp config error!"));
// return false;
//}
if(ReadPetExp() ==false)
{
return false;
}
setScript(NULL);
bResult = Inherited::LoadFile(sFilePath);
if( ReadPetMergePropRate() ==false)
{
return false;
}
setScript(NULL);
return bResult;
}
bool CPetProvider::ReadPetExp()
{
if ( !openGlobalTable("PetLevelUpExp") )
return false;
//获取配置中的物品数量
const INT_PTR nCount = lua_objlen(m_pLua, -1);
//如果物品数量为0则输出未配置任何物品的错误
if ( nCount <= 0 )
showError(_T("no exp data on pet exp config"));
//申请出物品数据并将物品数据内存块清空
m_petExp.count =nCount;
if( nCount > 0 )
{
m_petExp.pData = ( DataList<unsigned int>*) m_dataAllocator.allocObjects( nCount * sizeof(DataList<unsigned int>)) ;
}
else
{
return false;
}
INT_PTR nIndex =0; //当前遍历的index
if (enumTableFirst())
{
do
{
DataList<unsigned int>* pData = m_petExp.pData + nIndex;
const INT_PTR nItemCount = lua_objlen(m_pLua, -1); //有多少个物品
pData->count = nItemCount; //拥有的物品的类型
pData->pData = ( unsigned int*) m_dataAllocator.allocObjects( nItemCount * sizeof(unsigned int)) ;
INT_PTR j=0;
if (enumTableFirst())
{
do
{
pData->pData[j] = (unsigned int)getFieldInt(NULL);
j++;
} while (enumTableNext());
nIndex ++;
}
}
while (enumTableNext());
}
return true;
}
bool CPetProvider::ReadPetMergePropRate()
{
if (!openGlobalTable("PetMergePropRate"))
return false;
//获取配置中的物品数量
const INT_PTR nCount = lua_objlen(m_pLua, -1);
//如果物品数量为0则输出未配置任何物品的错误
if ( nCount <= 0 )
showError(_T("no config data on PetMergePropRate config"));
//申请出物品数据并将物品数据内存块清空
m_petMergePropRate.count = nCount;
if (nCount > 0)
{
m_petMergePropRate.pData = (DataList<PetMergePropRate>*)m_dataAllocator.allocObjects(nCount * sizeof(DataList<PetMergePropRate>));
}
else
{
return false;
}
INT_PTR nIndex =0; //当前遍历的index
if (enumTableFirst())
{
do
{
DataList<PetMergePropRate> *pData = m_petMergePropRate.pData + nIndex;
const INT_PTR nItemCount = lua_objlen(m_pLua, -1); //有多少个物品
pData->count = nItemCount; //拥有的物品的类型
pData->pData = (PetMergePropRate*)m_dataAllocator.allocObjects(nItemCount * sizeof(PetMergePropRate)) ;
INT_PTR j=0;
if (enumTableFirst())
{
do
{
pData->pData[j].wType = (WORD)getFieldInt("type");
pData->pData[j].fRate = (float)getFieldNumber("value");
j++;
} while (enumTableNext());
nIndex ++;
}
}
while (enumTableNext());
}
return true;
}
/*
* Comments:装载全部怪物的数据
* @Return bool: 失败返回false
*/
bool CPetProvider::LoadPets(LPCTSTR sFilePath)
{
//return InheritedReader::LoadFile(this,sFilePath,&CPetProvider::ReadAllPet);
if( Inherited::LoadFile(sFilePath) )
{
bool r= ReadAllPet();
setScript(NULL);
return r;
}
else
{
return false;
}
}
bool CPetProvider::ReadAllPet()
{
if ( !openGlobalTable("Pets") )
{
showError(_T("no global table Pets Found"));
return false;
}
m_petData.clear();
INT_PTR nIdx =0;
if (enumTableFirst())
{
do
{
PETCONFIG onePet;
ReadOnePet(m_dataAllocator,&onePet,nIdx);
m_petData.add(onePet);
nIdx++;
}
while (enumTableNext());
}
return true;
}
bool CPetProvider::ReadOnePet(CDataAllocator &dataAllocator,PPETCONFIG pPet,INT_PTR nPetId)
{
pPet->id = getFieldInt("id");
if(nPetId != pPet->id)
{
OutputMsg(rmError,_T("宠物的ID错误配置的id=%d期望为%d"),pPet->id, (int)nPetId);
return false;
}
getFieldStringBuffer("name",pPet->name,sizeof(pPet->name) );
int nDef=0;
//pPet->defaultSkill = getFieldInt("defaultSkillId",&nDef);
pPet->nModel = getFieldInt("modelid",&nDef);
pPet->icon =getFieldInt("icon",&nDef);
pPet->aiId =getFieldInt("aiId",&nDef);
nDef =36;
//读取各级宠物的属性
if ( feildTableExists("property") && openFieldTable("property") )
{
const INT_PTR nCount =(INT_PTR) lua_objlen(m_pLua, -1) ;
if (enumTableFirst())
{
INT_PTR i=0;
do
{
if(i >= MAX_PET_LEVEL_COUNT) break;
CREATURBATTLEEDATA data;
nDef =0;
double fDef =0.0;
data.nColor =0;
data.nMaxHp = getFieldInt("nMaxHp",&nDef);
data.nMaxMp = getFieldInt("nMaxMp",&nDef);
data.nPhysicalAttackMin = getFieldInt("nPhysicalAttackMin",&nDef);
data.nPhysicalAttackMax = getFieldInt("nPhysicalAttackMax",&nDef);
data.nMagicAttackMin = getFieldInt("nMagicAttackMin",&nDef);
data.nMagicAttackMax = getFieldInt("nMagicAttackMax",&nDef);
data.nWizardAttackMin = getFieldInt("nWizardAttackMin",&nDef);
data.nWizardAttackMax = getFieldInt("nWizardAttackMax",&nDef);
data.nHysicalDefenceMin = getFieldInt("nHysicalDefenceMin",&nDef);
data.nHysicalDefenceMax = getFieldInt("nHysicalDefenceMax",&nDef);
data.nMagicDefenceMin = getFieldInt("nMagicDefenceMin",&nDef);
data.nMagicDefenceMax = getFieldInt("nMagicDefenceMax",&nDef);
data.nHitrate = getFieldInt("nHitrate",&nDef);
data.nDogerate = getFieldInt("nDogerate",&nDef);
data.nMagicHitRate = getFieldInt("nMagicHitRate",&nDef);
data.nMagicDogerate = getFieldInt("nMagicDogerate",&nDef);
data.nHpRateRenew =(float) getFieldNumber("fHpRateRenew",&fDef);
data.nMpRateRenew = (float)getFieldNumber("fMpRateRenew",&fDef);
data.nMoveOneSlotTime = getFieldInt("nMoveOneSlotTime",&nDef);
data.nAttackSpeed = getFieldInt("nAttackSpeed",&nDef);
data.nLuck = getFieldInt("nLuck",&nDef);
CPropertySystem::InitMonsterCalculator(data,pPet->levels[i].cal);
unsigned int clr = DEFAULT_NAME_COLOR;
const char *pKey = "color";
if (feildTableExists(pKey) && openFieldTable(pKey))
{
INT_PTR count = lua_objlen(m_pLua, -1);
if (count > 0)
{
if (enumTableFirst())
{
int elem[4] = {0}, idx = 0;
do
{
if (idx < 4)
elem[idx] = (int)getFieldNumber(NULL);
idx++;
} while (enumTableNext());
clr = (COLORREF) ( ((BYTE)(elem[3])) | (((BYTE)(elem[2]))<<8) | (((BYTE)(elem[1]))<<16) | ((BYTE)(elem[0])<<24) );
}
}
closeTable();
}
pPet->levels[i].color= clr;
i++;
} while (enumTableNext());
}
closeTable();
}
return true;
}
bool CPetProvider::ReadTable(char *sName, int *pAddr,int nMaxCount)
{
if ( feildTableExists(sName) && openFieldTable(sName) )
{
const INT_PTR nCount =(INT_PTR) lua_objlen(m_pLua, -1) ;
if ( nCount <= 0 )
{
//pPet->.count =0;
}
else
{
if ( enumTableFirst() )
{
INT_PTR nIdx = 0;
int * pBaseLevel =pAddr;
int * pOneCondition =NULL;
do
{
pOneCondition= pBaseLevel + nIdx;
if( nMaxCount > nIdx )
{
*pOneCondition = getFieldInt(NULL);
}
nIdx++;
}while (enumTableNext());
}
}
closeTable();
return true;
}
else
{
return false;
}
}