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

📄 rpgprocess.cc

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

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



#include "core/dnet.h"
#include "game/gameConnection.h"
#include "game/shapeBase.h"
#include "platform/profiler.h"
#include "console/consoleTypes.h"
#include "rpg/RPGProcess.h"
#include "rpg/cmd/RPGCommand.h"

namespace RPG
{

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

RPGProcess g_RPGProcess;


//bool RPGProcess::mDebugControlSync = false;

RPGProcess::RPGProcess()
{
   m_bDirty			= false;
   m_dwSequence	= 0;
   m_dwLastTick	= 0;
   m_dwLastTime	= 0;
   m_dwLastDelta	= 0;
   //mIsServer = isServer;
//   Con::addVariable("debugControlSync",TypeBool, &mDebugControlSync);
}


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

void RPGProcess::orderList()
{
	m_dwSequence++;

   // Install a temporary m_listHeader node
   RPGBase list;
   list.PLLinkBefore(m_listHeader.m_pLinkNext);
   m_listHeader.PLUnlink();

   // Reverse topological sort into the orignal m_listHeader node
   while (list.m_pLinkNext != &list) 
	{
      RPGBase* ptr = list.m_pLinkNext;
      ptr->m_uSequence = m_dwSequence;
      ptr->PLUnlink();
      if (ptr->m_objectPtrAfter) 
		{
         // Build chain "stack" of dependant objects and patch
         // it to the end of the current list.
         while (bool(ptr->m_objectPtrAfter) &&
               ptr->m_objectPtrAfter->m_uSequence != m_dwSequence) 
			{
            ptr->m_objectPtrAfter->m_uSequence = m_dwSequence;
            ptr->m_objectPtrAfter->PLUnlink();
            ptr->m_objectPtrAfter->PLLinkBefore(ptr);
            ptr = ptr->m_objectPtrAfter;
         }
         ptr->PLJoin(&m_listHeader);
      }
      else
         ptr->PLLinkBefore(&m_listHeader);
   }
   m_bDirty = false;
}



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

//bool RPGProcess::advanceServerTime(SimTime timeDelta)
//{
//   PROFILE_START(AdvanceServerTime);
//
//	///去除Server端的所有ProcessTick处理
////#ifndef TGE_RPGCLIENT	/// TGE_RPGClientCtrl
//   if (m_bDirty)
//		orderList();
////#endif
//
//   SimTime targetTime	= m_dwLastTime + timeDelta;
//   SimTime targetTick	= targetTime & ~TICK_MASK;
//   SimTime tickCount		= (targetTick - m_dwLastTick) >> TICK_SHIFT;
//
//   bool bRet = m_dwLastTick != targetTick;
//
//
////#ifndef TGE_RPGCLIENT	/// TGE_RPGClientCtrl
//   // Advance all the objects
//   for (; m_dwLastTick != targetTick; m_dwLastTick += TICK_LEN_MS)
//      advanceObjects();
//
//   // Credit all the connections with the elapsed ticks.
//   //SimGroup *g = Sim::getClientGroup();
//   //for (SimGroup::iterator i = g->begin(); i != g->end(); i++)
//   //   if (GameConnection *t = dynamic_cast<GameConnection *>(*i))
//   //      t->incMoveCredit(tickCount);
////#endif
//
//   m_dwLastTime = targetTime;
//   PROFILE_END();
//   return bRet;
//}


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

bool RPGProcess::AdvanceTime(SimTime timeDelta)
{
   PROFILE_START(RPGProcessAdvanceTime);

	if(g_pRPGCommand)
		g_pRPGCommand->AdvanceTime(timeDelta);

   if (m_bDirty)
		orderList();

	RPGBase* obj;
	F32		dt;
   SimTime	targetTime	= m_dwLastTime + timeDelta;
   SimTime	targetTick	= (targetTime + TICK_MASK) & ~TICK_MASK;
   SimTime	tickCount	= (targetTick - m_dwLastTick) >> TICK_SHIFT;

   if (tickCount)
   {
		////////////////////////////////////////////////////
		//在进行Tick步进前,需要进行Tick复位
		if (m_dwLastDelta)
		{ 
			obj = m_listHeader.m_pLinkNext;
			for (; obj != &m_listHeader; obj = obj->m_pLinkNext)
			{ 
				if (obj->m_bProcessTick)
					obj->InterpolateTick(0);
			}
		}

		/////////////////////////////////////////////////////////////////
		//进行多个Tick步进运算
      for (;m_dwLastTick != targetTick; m_dwLastTick += TICK_LEN_MS)
      {
         advanceObjects();
      }
   }


	///////////////////////////////////////////////////////////////////
	//进行Tick插值运算,对targetTime取Tick模尾数的补数插值
   m_dwLastDelta = (TICK_LEN_MS - (targetTime & TICK_MASK)) & TICK_MASK;

   dt		= m_dwLastDelta / F32(TICK_LEN_MS);	/// 换算0-1比率
	obj	= m_listHeader.m_pLinkNext;

   for (; obj != &m_listHeader; obj = obj->m_pLinkNext)
	{ 
		if (obj->m_bProcessTick)
         obj->InterpolateTick(dt);
	}


	////////////////////////////////////////////////////////////////////
	//以秒为参考,进行时间步进
	dt		= F32(timeDelta) / 1000.f;
	obj	= m_listHeader.m_pLinkNext;
   for (; obj != &m_listHeader; obj = obj->m_pLinkNext)
	{  
		obj->AdvanceTime(dt);
	}


   m_dwLastTime = targetTime;
   PROFILE_END();

   return tickCount != 0;
}


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

void RPGProcess::advanceObjects()
{
   PROFILE_START(RPGProcessAdvanceObjects);

   // A little link list shuffling is done here to avoid problems
   // with objects being deleted from within the process method.
   RPGBase	list;
   RPGBase* obj;

   list.PLLinkBefore(m_listHeader.m_pLinkNext);
   m_listHeader.PLUnlink();

   while ((obj = list.m_pLinkNext) != &list) 
	{
      obj->PLUnlink();
      obj->PLLinkBefore(&m_listHeader);

      // Each object is either advanced a single tick, or if it's
      // being controlled by a client, ticked once for each pending move.

		if ((obj->mTypeMask & RPGBaseObjectType) != RPGBaseObjectType)
			continue;

		//{
		//	RPGBase *pGB = static_cast<RPGBase *>(obj);
		//	GameConnection* con = pGB->GetControllingClient();

		//	if (con && con->getControlObject() == pGB) 
		//	{
		//		Move* movePtr;
		//		U32 m, numMoves;

		//		con->getMoveList(&movePtr, &numMoves);

		//		for (m = 0; m < numMoves && pGB->GetControllingClient() == con; m++)
		//			obj->ProcessTick(&movePtr[m]);

		//		con->clearMoves(m);

		//		continue;
		//	}
		//}

      if (obj->m_bProcessTick)
         obj->ProcessTick(0);
   }
   PROFILE_END();
}

};//namespace RPG

⌨️ 快捷键说明

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