📄 regenmanager.cpp
字号:
// RegenManager.cpp: implementation of the CRegenManager class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "RegenManager.h"
#include "RegenPrototype.h"
#include "AIGroupManager.h"
#include "..\[CC]Header\GameResourceManager.h"
#include "Object.h"
#include "AIGroupManager.h"
#include "TileManager.h"
#include "Monster.h"
#include "BossMonster.h"
#include "GridSystem.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CRegenManager::CRegenManager()
{
m_RegenPrototypeList.Initialize(500);
}
CRegenManager::~CRegenManager()
{
Release();
}
void CRegenManager::Release()
{
CRegenPrototype * pPrototype= NULL;
m_RegenPrototypeList.SetPositionHead();
while((pPrototype = m_RegenPrototypeList.GetData()))
{
delete pPrototype;
pPrototype = NULL;
}
m_RegenPrototypeList.RemoveAll();
}
void CRegenManager::AddPrototype(CRegenPrototype * pType)
{
m_RegenPrototypeList.Add(pType, pType->dwObjectID);
}
CRegenPrototype * CRegenManager::GetPrototype(DWORD dwID)
{
return m_RegenPrototypeList.GetData(dwID);
}
void CRegenManager::RegenGroup(DWORD groupID, DWORD dwGridID)
{
GROUPMGR->GetGroup(groupID, dwGridID)->ForceRegen();
}
BOOL CRegenManager::RegenObject(DWORD groupID, DWORD dwGridID, DWORD dwObjectID,BOOL bRandomPos)
{
CAIGroup * pGroup = GROUPMGR->GetGroup(groupID, dwGridID);
CRegenObject * pRegenInfo = pGroup->GetRegenObject(dwObjectID);
return RegenObject(dwObjectID, pRegenInfo->GetSubID(), dwGridID,
pRegenInfo->GetObjectKind(),
pRegenInfo->GetMonsterKind(),
pRegenInfo->GetPos(),
groupID, 0, 100, bRandomPos)
? TRUE : FALSE;
}
void CRegenManager::RangePosAtOrig(VECTOR3 * OrigPos, int Range, VECTOR3 * OutPos)
{
int ran=0;
float dx=0,dz=0;
ran = rand();
dx = float(ran%Range) * (ran%2?1:-1);
ran = rand();
dz = float(ran%Range) * (ran%2?1:-1);
OutPos->x = OrigPos->x + dx;
OutPos->z = OrigPos->z + dz;
if( OutPos->x < 0 ) OutPos->x = 0;
else if( OutPos->x > 51199 ) OutPos->x = 51199;
if( OutPos->z < 0 ) OutPos->z = 0;
else if( OutPos->z > 51199 ) OutPos->z = 51199;
}
CMonster* CRegenManager::RegenObject(DWORD dwID, DWORD dwSubID, DWORD dwGridID, WORD wObjectKind, WORD wMonsterKind, VECTOR3 * vPos, DWORD dwGroupID, WORD DropItemID, DWORD dwDropRatio ,BOOL bRandomPos )
{
VECTOR3 vOutPos;
if(bRandomPos)
RangePosAtOrig(vPos, MONSTER_REGEN_RANDOM_RANGE, &vOutPos);
else
vOutPos = *vPos;
switch( wObjectKind )
{
case eObjectKind_Monster:
{
MONSTER_TOTALINFO MonsterInfo;
BASEOBJECT_INFO Baseinfo;
BASE_MONSTER_LIST * pMonsterListInfo = NULL;
pMonsterListInfo = GAMERESRCMNGR->GetMonsterListInfo(wMonsterKind);
if(pMonsterListInfo == NULL)
return NULL;
MAPTYPE MapNum = g_pServerSystem->GetGridSystem()->GetGridMapNum(dwGridID);
vOutPos.x = ((DWORD)(vOutPos.x/TILECOLLISON_DETAIL)*TILECOLLISON_DETAIL);
vOutPos.z = ((DWORD)(vOutPos.z/TILECOLLISON_DETAIL)*TILECOLLISON_DETAIL);
if(g_pServerSystem->GetMap()->CollisionTilePos(vOutPos.x,vOutPos.z,MapNum) == TRUE)
{
g_Console.LOG(4, "Regen Failed : ID: %d, NAME: %s", dwID, pMonsterListInfo->Name);
return NULL;
}
Baseinfo.dwObjectID = dwID;
SafeStrCpy(Baseinfo.ObjectName, pMonsterListInfo->Name, MAX_NAME_LENGTH+1);
Baseinfo.BattleID = dwGridID;
g_Console.LOG(4, "Regen Succeeded : CHANNEL:%d, GROUPID: %d, ID: %d, NAME: %s, (x,z):(%f,%f)", dwGridID, dwGroupID, dwID, pMonsterListInfo->Name, vOutPos.x, vOutPos.z);
MonsterInfo.Life = pMonsterListInfo->Life;
MonsterInfo.Shield = pMonsterListInfo->Shield;
MonsterInfo.MonsterKind = wMonsterKind;
MonsterInfo.Group = (WORD)dwGroupID;
CMonster* pMonster = g_pServerSystem->AddMonster(dwSubID, &Baseinfo, &MonsterInfo, &vOutPos);
if(!pMonster)
return NULL;
pMonster->SetEventMob(TRUE);
pMonster->SetDropItemID(DropItemID, dwDropRatio);
return pMonster;
}
break;
case eObjectKind_BossMonster:
{
MONSTER_TOTALINFO MonsterInfo;
BASEOBJECT_INFO Baseinfo;
BASE_MONSTER_LIST * pMonsterListInfo = NULL;
pMonsterListInfo = GAMERESRCMNGR->GetMonsterListInfo(wMonsterKind);
MAPTYPE MapNum = g_pServerSystem->GetGridSystem()->GetGridMapNum(dwGridID);
vOutPos.x = ((DWORD)(vOutPos.x/TILECOLLISON_DETAIL)*TILECOLLISON_DETAIL);
vOutPos.z = ((DWORD)(vOutPos.z/TILECOLLISON_DETAIL)*TILECOLLISON_DETAIL);
if(g_pServerSystem->GetMap()->CollisionTilePos(vOutPos.x,vOutPos.z,MapNum) == TRUE)
{
g_Console.LOG(4, "BossMonster Regen Failed : ID: %d, NAME: %s", dwID, pMonsterListInfo->Name);
return NULL;
}
Baseinfo.dwObjectID = dwID;
Baseinfo.BattleID = dwGridID;
SafeStrCpy(Baseinfo.ObjectName, pMonsterListInfo->Name, MAX_NAME_LENGTH+1);
g_Console.LOG(4, "BossMonster Regen Succeeded : GROUPID: %d, ID: %d, NAME: %s, (x,z):(%f,%f)", dwGroupID, dwID, pMonsterListInfo->Name, vOutPos.x, vOutPos.z);
MonsterInfo.Life = pMonsterListInfo->Life;
MonsterInfo.Shield = pMonsterListInfo->Shield;
MonsterInfo.MonsterKind = wMonsterKind;
MonsterInfo.Group = (WORD)dwGroupID;
CBossMonster * pMob = g_pServerSystem->AddBossMonster(dwSubID, &Baseinfo, &MonsterInfo, &vOutPos);
pMob->SetEventMob(TRUE);
return pMob;
}
break;
default:
{
ASSERT(0);
return NULL;
}
}
return NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -