Esempio n. 1
0
//returns true if ready to be removed
PRIVATE bool _fxSmokeUpdate(fxSmoke *mainDat, fxSmoke_par *theSmoke)
{
	double t = TimeGetTime(&theSmoke->delayTimer)/TimeGetDelay(&theSmoke->delayTimer);

	//moving
	if(!theSmoke->bFading)
	{
		if(t <= 1)
		{
			theSmoke->loc[eX] = theSmoke->sLoc[eX] + t*(theSmoke->eLoc[eX]-theSmoke->sLoc[eX]);
			theSmoke->loc[eY] = theSmoke->sLoc[eY] + t*(theSmoke->eLoc[eY]-theSmoke->sLoc[eY]);
			theSmoke->loc[eZ] = theSmoke->sLoc[eZ] + t*(theSmoke->eLoc[eZ]-theSmoke->sLoc[eZ]);

			theSmoke->clr[eA] = t;
		}
		else
		{
			//initialize fading
			theSmoke->bFading = true;

			TimeInit(&theSmoke->delayTimer, mainDat->fadeDelay);
			TimeReset(&theSmoke->delayTimer);
		}
	}
	//fading
	else
	{
		if(t <= 1)
			theSmoke->clr[eA] = 1.0f - t;
		else //we are done
			return true;
	}

	return false;
}
RETCODE StatusInvulnerable::Update()
{
	RETCODE ret = RETCODE_SUCCESS;

	Creature *pCre = (Creature *)IDPageQuery(m_owner);

	if(pCre)
	{
		hOBJ obj = pCre->GetOBJ(); assert(obj);

		double t = TimeGetTime(&m_fadeDelay)/TimeGetDelay(&m_fadeDelay);

		if(t >= 1)
		{
			t = 1;
			TimeReset(&m_fadeDelay);

			m_bFading = !m_bFading;
		}

		OBJSetAlpha(obj, m_bFading ? 1-t : t);

		//invulnerable over?
		if(TimeElapse(&m_invulDelay))
		{
			OBJSetAlpha(obj, 1);
			
			ret = RETCODE_STATUS_DONE;
		}
	}
	else
		ret = RETCODE_STATUS_DONE;

	return ret;
}
RETCODE StatusTeleport::Update()
{
	RETCODE ret = RETCODE_SUCCESS;

	Creature *pCre = (Creature *)IDPageQuery(m_owner);

	if(m_bGO)
	{
		if(pCre)
		{
			hOBJ obj = pCre->GetOBJ(); assert(obj);

			double t = TimeGetTime(&m_delay)/TimeGetDelay(&m_delay);

			if(t >= 1)
			{
				t = 1;
				TimeReset(&m_delay);
			}

			OBJSetAlpha(obj, m_bFading ? 1-t : t);

			//are we done?
			if(t == 1 && !m_bFading)
				ret = RETCODE_STATUS_DONE;
			else if(t == 1 && m_bFading)
			{
				m_bFading = false;

				//set to new location
				pCre->SetLoc(m_dest);

				D3DXVECTOR3 zeroVel(0,0,0);
				pCre->SetVel(zeroVel);

				pCre->CREPlaySound(38);
			}
		}
		else
			ret = RETCODE_STATUS_DONE;
	}

	return ret;
}
Esempio n. 4
0
PROTECTED RETCODE fxLightningYFunc(hPARFX thisPARFX, DWORD message, LPARAM dumbParam, WPARAM otherParam)
{
	fxLightningY *thisData = (fxLightningY *)thisPARFX->data;

	switch(message)
	{
	case PARFXM_UPDATE:
		{
			double t = TimeGetTime(&thisData->onTimer)/TimeGetDelay(&thisData->onTimer);

			if(t > 1){ t = 1; TimeReset(&thisData->onTimer); }

			//update alpha
			if(thisData->clr[eA] < 1
				&& dumbParam != PARFX_UPDATE_DEAD)
			{
				thisData->clr[eA] = t;

				if(thisData->clr[eA] == 1)
				{
					TimeReset(&thisData->onTimer);
				}
			}
			else if(thisData->clr[eA] > 0
				&& dumbParam == PARFX_UPDATE_DEAD)
			{
				thisData->clr[eA] = 1.0f - t;

				if(thisData->clr[eA] == 0)
				{
					TimeReset(&thisData->onTimer);
				}
			}

			/////////////////////////////////////////////////////////////////
			//update nodes
			float trans[eMaxPt] = {0};

			hOBJ obj = PARFXGetOBJ(thisPARFX);

			if(obj)
			{
				PARFXGetOBJLoc(thisPARFX, obj, trans);
			}

			for(int i = 0; i < thisData->numNodes; i++)
			{
				t = TimeGetTime(&thisData->Nodes[i].timeMove)/TimeGetDelay(&thisData->Nodes[i].timeMove);

				if(t > 1) t = 1;

				thisData->Nodes[i].curLoc[eX] = thisData->Nodes[i].sLoc[eX] + t*(thisData->Nodes[i].eLoc[eX] - thisData->Nodes[i].sLoc[eX]);
				thisData->Nodes[i].curLoc[eZ] = thisData->Nodes[i].sLoc[eZ] + t*(thisData->Nodes[i].eLoc[eZ] - thisData->Nodes[i].sLoc[eZ]);

				if(t == 1)
				{
					TimeReset(&thisData->Nodes[i].timeMove);

					//our new start
					memcpy(thisData->Nodes[i].sLoc, thisData->Nodes[i].curLoc, sizeof(thisData->Nodes[i].sLoc));

					//our new end
					thisData->Nodes[i].eLoc[eX] = _GFXMathRand(thisData->min[eX], thisData->max[eX]) + trans[eX];
					thisData->Nodes[i].eLoc[eY] = thisData->min[eY] + ((float)i/(float)thisData->numNodes)*(thisData->max[eY] - thisData->min[eY]) + trans[eY];
					thisData->Nodes[i].eLoc[eZ] = _GFXMathRand(thisData->min[eZ], thisData->max[eZ]) + trans[eZ];
				}
			}

			if(thisData->clr[eA] == 0 && dumbParam == PARFX_UPDATE_DEAD)
			{
				return RETCODE_BREAK;
			}
		}
		break;

	case PARFXM_DISPLAY:
		if(FrustrumCheckBox(
					thisData->min[eX], thisData->min[eY], thisData->min[eZ],
					thisData->max[eX], thisData->max[eY], thisData->max[eZ]))
		{
			float t = 0, max=thisData->maxParticle;

			D3DXVECTOR3 ptOut, pt0, pt1, pt2, pt3;

			float particleCount=0;
			int prevInd=0, ind=0, nextInd=1, next2Ind=2;

			do
			{
				memcpy((float*)pt0, thisData->Nodes[prevInd].curLoc, sizeof(thisData->Nodes[prevInd].curLoc));
				memcpy((float*)pt1, thisData->Nodes[ind].curLoc, sizeof(thisData->Nodes[ind].curLoc));
				memcpy((float*)pt2, thisData->Nodes[nextInd].curLoc, sizeof(thisData->Nodes[nextInd].curLoc));
				memcpy((float*)pt3, thisData->Nodes[next2Ind].curLoc, sizeof(thisData->Nodes[next2Ind].curLoc));

				//cat-mull-rom curve magic
				D3DXVec3CatmullRom(&ptOut, &pt0, &pt1, &pt2, &pt3, t);

				//draw the darn thing
				TextureBltBillboard(thisData->lightningTxt, (float*)ptOut, thisData->scale, thisData->clr);

				particleCount++;

				t = particleCount/max;

				if(t > 1)
				{
					ind++;
					particleCount = 0;
					t = 0;
				}

				prevInd  = ind - 1; if(prevInd  < 0) prevInd = 0;
				nextInd  = ind + 1; if(nextInd  >= thisData->numNodes) nextInd  = thisData->numNodes-1;
				next2Ind = ind + 2; if(next2Ind >= thisData->numNodes) next2Ind = thisData->numNodes-1;

			} while(ind < thisData->numNodes);
		}
		break;

	case PARFXM_CREATE:
		{
			fxLightningY_init *initDat = (fxLightningY_init *)dumbParam;

			fxLightningY *newData = (fxLightningY *)GFX_MALLOC(sizeof(fxLightningY));

			if(!newData)
				return RETCODE_FAILURE;

			newData->lightningTxt = initDat->lightningTxt; TextureAddRef(newData->lightningTxt);

			newData->clr[eR] = initDat->r/255.0f;
			newData->clr[eG] = initDat->g/255.0f;
			newData->clr[eB] = initDat->b/255.0f;
			newData->clr[eA] = 0;

			newData->scale = initDat->scale;

			memcpy(newData->min, initDat->min, sizeof(newData->min));
			memcpy(newData->max, initDat->max, sizeof(newData->max));

			newData->maxParticle = 20;//initDat->maxParticle;

			TimeInit(&newData->onTimer, initDat->delayOn);
			TimeReset(&newData->onTimer);

			newData->delayMove = initDat->delayMove;

			newData->numNodes = initDat->maxPoint;

			newData->Nodes = (lightningNode *)GFX_MALLOC(sizeof(lightningNode)*newData->numNodes);

			if(!newData->Nodes)
				return RETCODE_FAILURE;

			////////////////////////////////////////////////////////////////
			//initialize the nodes
			float trans[eMaxPt] = {0};

			hOBJ obj = PARFXGetOBJ(thisPARFX);

			if(obj)
			{
				PARFXGetOBJLoc(thisPARFX, obj, trans);
			}

			for(int i = 0; i < newData->numNodes; i++)
			{
				newData->Nodes[i].sLoc[eX] = _GFXMathRand(newData->min[eX], newData->max[eX]) + trans[eX];
				newData->Nodes[i].sLoc[eY] = newData->min[eY] + ((float)i/(float)newData->numNodes)*(newData->max[eY] - newData->min[eY]) + trans[eY];
				newData->Nodes[i].sLoc[eZ] = _GFXMathRand(newData->min[eZ], newData->max[eZ]) + trans[eZ];

				memcpy(newData->Nodes[i].curLoc, newData->Nodes[i].sLoc, sizeof(newData->Nodes[i].curLoc));

				newData->Nodes[i].eLoc[eX] = _GFXMathRand(newData->min[eX], newData->max[eX]) + trans[eX];
				newData->Nodes[i].eLoc[eY] = newData->min[eY] + ((float)i/(float)newData->numNodes)*(newData->max[eY] - newData->min[eY]) + trans[eY];
				newData->Nodes[i].eLoc[eZ] = _GFXMathRand(newData->min[eZ], newData->max[eZ]) + trans[eZ];

				TimeInit(&newData->Nodes[i].timeMove, newData->delayMove);
			}

			thisPARFX->data = newData;
		}
		break;

	case PARFXM_DESTROY:
		{
			if(thisData)
			{
				if(thisData->Nodes)
					GFX_FREE(thisData->Nodes);

				if(thisData->lightningTxt)
					TextureDestroy(&thisData->lightningTxt);
			}
		}
		break;
	}

	return RETCODE_SUCCESS;
}
Esempio n. 5
0
//===============================================================================================
//
//
//GS的状态切换 GSTATE_*
// -----------------------------------
// |GSSTATE_INIT_BASEDATA            |  初始化整个系统
// -----------------------------------
// |GSSTATE_INIT_MCC_THREAD          |  启动MCC的处理线程,只处理与网路相关的数据发送接收(MCC和ReloginServer)
// -----------------------------------
// |GSSTATE_AP_MAPINIT               |  等待MCC送回地图初始化信息
// -----------------------------------
// |GSSTATE_INIT_TAXMAP_LIST         |  初始化收税地图信息
// -----------------------------------
// |GSSTATE_AP_GETTIME               |  获得游戏世界里的时间
// -----------------------------------
// |GSSTATE_AP_CLEARLOCK             |  清除MCC上的玩家Onlien信息
// -----------------------------------
// |GSSTATE_INIT_MAP_OBJ             |  初始化Server上的地图相关数据
// -----------------------------------
// |GSSTATE_LOAD_GUILD_INFO_FROM_MCC |  从MCC上读取帮会资料
// -----------------------------------
// |GSSTATE_LOAD_CITYWAR_INFO        |  获取帮会战信息
// -----------------------------------
// |GSSTATE_LOAD_CITYWAR_TIME        |  获取帮会战时间信息
// -----------------------------------
// |GSSTATE_QUERY_TOPTEN_*           |  获取排行榜信息
// -----------------------------------
// |GSSTATE_WAIT_CHATMCC_CONNECT     |  等待CHAT MCC连接
// -----------------------------------
// |GSSTATE_INIT_RELOGINSERVER       |  连接ReloginServer
// -----------------------------------
// |GSSTATE_INIT_NET_THREAD          |  初始化Client端的网络监听线程
// -----------------------------------
// |GSSTATE_INIT_COMPLETE            |  GameServer初始化结束,进入游戏状态
// -----------------------------------
// |GSSTATE_GAME_START               |  游戏运行中
// -----------------------------------
void GsMainLoop()
{
  FuncName("GsMainLoop");

	int			iSize = 0;
  
  static DWORD	          dwLastStartTime = TimeGetTime(), g_dwLoopLoc = 0;
	static DWORD	          g_dwWaitForAllSave = 0;
  static DWORD            g_dwReviveMonster = 0;

  SMsgData			*pTheMsg = NULL;
  
	ThisTickCount = TimeGetTime();
	g_dwLoop++;
  g_wCounterTotal++;
  //
  switch(g_pGs->GetState())
  {
    // Game Server start
    case GSSTATE_GAME_START:
      {
        dwLastStartTime = ThisTickCount;
        // Handle All Mcc Msg
#ifdef SRVD_NO_MCC_MSG_TIMEOUT
        // Do nothing...
#else

#ifdef _DEBUG_WILDCAT_
				ENTERTIME(1);
#endif
				g_pMccDB->ClearTimeoutMsg();
				g_pMccChat->ClearTimeoutMsg();
#endif
#ifdef _DEBUG_RECORD_EVERY_RECV_AID_
        g_AIDLog.Write( "Clear Timeout" );
#endif

				g_pMccDB->DispatchAll();
				g_pMccChat->DispatchAll();
        g_pReloginServer->DispatchAll();
#ifdef _DEBUG_RECORD_EVERY_RECV_AID_
        g_AIDLog.Write( "Do Mcc And Relogin Action" );
#endif
        
#ifdef _DEBUG_WILDCAT_
        LEAVETIME(1);
        g_dwMccNet = GETRECORD(1);
        ENTERTIME(2);
#endif
        
        // Handle All Client Msg and Action
        g_pClientList->DispatchAll();
#ifdef _DEBUG_WILDCAT_
        LEAVETIME(2);
        g_dwClientNet = GETRECORD(2);
        ENTERTIME(3);
#endif

        // Handle NPC, Monster, Magic, GroundItem Action
        g_pGs->DoMapAction();
        //
#ifdef _DEBUG_RECORD_EVERY_RECV_AID_
//        g_AIDLog.Write( "Do MapAction" );
#endif
        
#ifdef  ELYSIUM_3_7_VERSION
        g_FightFieldMgr.DoAction();
#endif
#ifdef _VERSION40_CARRYDOOR
        if( !g_bConvert )
        {
          g_pDoorManager->ConvertCli2Srv();
          g_bConvert = TRUE;
        }
        g_pDoorManager->TimeLoopSelf(dwLastStartTime);
        g_pDoorManager->TimeLoopMult(dwLastStartTime);
#endif
#ifdef VERSION_40_HOUSE_FUNCTION
        g_pHouseMgr->DoAllHouseAction(ThisTickCount);
#endif
#ifdef VERSION40_FIELD
        if(g_pField->IsOn())
          g_pField->DoAction(ThisTickCount);
#endif
        //
        // Handle Monster That Revive Type == REVIVE_TYPE_DELETE
        if( ThisTickCount > g_dwReviveMonster )
        {
          g_dwReviveMonster = ThisTickCount + 5000;
          DeleteAllUnreviveMonster();
        }

#ifdef _DEBUG_WILDCAT_
				LEAVETIME(3);
				g_dwMap = GETRECORD(3);
#endif
#ifdef _DEBUG_RELEASE_MESS_ASHCAN_
        g_pGs->ReleaseMsgAshcan();
#endif

#ifdef _DEBUG_MICHAEL_LOG_MIANlOOP
        extern DWORD                  g_dwMaxMainLoop;
        static DWORD iTemp = 0;
        if( ThisTickCount - iTemp > g_dwMaxMainLoop && 0 != iTemp )
        {
          g_dwMaxMainLoop = ThisTickCount - iTemp;
        }
        iTemp = ThisTickCount;
#endif
#ifdef _MONSTER_ATTACK_CITY_
        g_AttackCity.Loop();
#endif
      }
      break;
    case GSSTATE_RETRY_CONNECT_MCC:
      break;
    case GSSTATE_CREATE_DB_THREAD:
      {
        //if( g_pSqlDB = new CDB_Handle_Thread( false ) )
        //{
        //  g_pGs->SetState( GSSTATE_WAIT_SAVE_ALL_CLIENT );
        //}
        //else
        //{
        //  g_pGs->SetState( GSSTATE_WAIT_SAVE_ALL_CLIENT );
        //}
        //AddMemoMsg( "Create DB Thread OK, Ready Save All Client..." );
      }
      break;
		case GSSTATE_SAVE_ALL_CLIENT:
//			if((ThisTickCount - dwLastStartTime) > (MAIN_GAME_LOOP_MS))
      {
        dwLastStartTime = ThisTickCount;
// ENTERTIME(a)
// LEAVETIME(a)
// GETRECORD(a)
      // Handle All Mcc Msg
#ifdef SRVD_NO_MCC_MSG_TIMEOUT
        // Do nothing...
#else
#ifdef _DEBUG_WILDCAT_
				ENTERTIME(1);	
#endif

				g_pMccDB->ClearTimeoutMsg();
				g_pMccChat->ClearTimeoutMsg();
#endif

				g_pMccDB->DispatchAll();
				g_pMccChat->DispatchAll();
        g_pReloginServer->DispatchAll();

#ifdef _DEBUG_WILDCAT_
				LEAVETIME(1);
				g_dwMccNet = GETRECORD(1);
				ENTERTIME(2);
#endif

        // Handle All Client Msg and Action
        g_pClientList->DispatchAll();

#ifdef _DEBUG_WILDCAT_
				LEAVETIME(2);
				g_dwClientNet = GETRECORD(2);
				ENTERTIME(3);
#endif

        // Handle NPC, Monster, Magic, GroundItem Action
        g_pGs->DoMapAction();
#ifdef VERSION_40_HOUSE_FUNCTION
        g_pHouseMgr->DoExitAction();
#endif

        // Handle Monster That Revive Type == REVIVE_TYPE_DELETE
        if( ThisTickCount > g_dwReviveMonster )
        {
          g_dwReviveMonster = ThisTickCount + 5000;
          DeleteAllUnreviveMonster();
        }

#ifdef _DEBUG_WILDCAT_
				LEAVETIME(3);
				g_dwMap = GETRECORD(3);
#endif
#ifdef _DEBUG_RELEASE_MESS_ASHCAN_
        g_pGs->ReleaseMsgAshcan();
#endif
      }
      //
			if( g_pClientList->AllClientCountdown() )
			{
        if( g_dwRefreshServerTick == 0 )      g_dwRefreshServerTick = ClientTickCount + 2000;
				g_pGs->SetState( GSSTATE_KICK_ALL_SAVE_CLIENT );
        AddMemoMsg( "Count Down OK, Kick All Client And Save Data..." );
			}
      break;
		case GSSTATE_KICK_ALL_SAVE_CLIENT:
      g_pMccDB->ClearTimeoutMsg();
			g_pMccChat->ClearTimeoutMsg();
      //
			g_pMccDB->DispatchAll();
			g_pMccChat->DispatchAll();
      //g_pReloginServer->DispatchAll();
      //
      g_pClientList->DispatchAll();
      //
      g_pGs->DoMapAction();
      //
			if( g_pClientList->AllClientSaveData() )
			{
        //
        g_pGs->SendMcc_AC_LOG_MONSTERDROP();
        g_pGs->SendMcc_AC_LOG_ITEMMIX();
        g_pGs->SendMcc_AC_LOG_ITEMTESSERA();
        g_pGs->SendMcc_AC_LOG_ITEMBLESS();
        g_pGs->SendMcc_AC_LOG_PLAYERALTER();
				//////////////////////
				// Michael added Log
        g_pGs->SendMcc_AC_LOG_GUILDINFO();
				g_pGs->SendMcc_AC_LOG_PICKDROPMONEY();
				// Michael added end
				//////////////////////
        g_pGuildMng->UpdateGuildTaxIncome();
        //
				g_pGs->SetState( GSSTATE_WAIT_SAVE_ALL_CLIENT );
        AddMemoMsg( "Set All Client State OK, Wait Save All Client Data" );
			}
			break;
		case GSSTATE_WAIT_SAVE_ALL_CLIENT:
      g_pMccDB->ClearTimeoutMsg();
			g_pMccChat->ClearTimeoutMsg();
      //
			g_pMccDB->DispatchAll();
			g_pMccChat->DispatchAll();
      //g_pReloginServer->DispatchAll();
      //
      g_pClientList->DispatchAll();
      //
      g_pGs->DoMapAction();
      //
      if( g_pClientList->IsAllExit() )
			{
				g_pGs->SetState( GSSTTATE_SAVE_ALL_GUILD_TAX_INCOME );
        AddMemoMsg( " Save All Client Data OK, Save All Guild Tax Income" );
//        g_pGuildMng->SendMcc_AP_SAVE_GUILDTAXINCOME();
			}
			break;
    case GSSTTATE_SAVE_ALL_GUILD_TAX_INCOME:
      //
      if( IDOK == ( MessageBox( g_hwnd, " Save All Player Data OK, Server Will Close ?", "Warning", 1 ) ) )
      {
        g_pGs->SetState( GSSTATE_CLOSE );
      }
      break;
    case GSSTTATE_CLEAR_ALL_TEAM:
      g_pGs->DeleteAllTeam();
      // Resume The Client Network Accept
      //g_pAcceptThread->SetAcceptMode( true );
      // Send A Message To Mcc
      g_pMccDB->ClearSendMsg();
      g_pMccDB->Send_AP_MAPINIT();
      g_pGs->SetState( GSSTATE_GAME_START );
      break;
    case GSSTATE_RUN:                     // Start Game Server when Button "Run" is Clicked
      AddMemoMsg("--- Try to run Game Server ... ---");
      DialogBox( g_hins, (LPCTSTR)IDD_DIALOG_DB_LOGIN, g_hwnd, (DLGPROC)LoginDlg );
      break;
    // start to initialize Game Data
    case GSSTATE_INIT_BASEDATA:          // Load Base Data and initialize Client Data List
      AddMemoMsg("--- Start To Initialize ---");
      if( IntiAllData() )
      {
        if( g_pGuildMng->InitGuildManager() )
        {
#ifdef _CHECK_SERVER_DATA_FILE_VERSION_
          g_pGs->SetState(GSSTATE_CHECK_ALL_DATA_RELATION);
#else
///////////
#ifdef _DEBUG_GAMESERVER_USE_SQL_QUERY_
          g_pGs->SetState(GSSTATE_INIT_DB_QUERY);
#else
          g_pGs->SetState(GSSTATE_INIT_MCC_THREAD);
#endif
//////////
#endif
          break;
        }
      }
#ifdef _CHECK_SERVER_DATA_FILE_VERSION_
      g_pGs->SetState(GSSTATE_STOP);
      AddMemoMsg("***** Initialize Server Base Data Failed ! *****");
#else
      g_pGs->SetState(GSSTATE_INIT_FAIL);
#endif
      break;
#ifdef _CHECK_SERVER_DATA_FILE_VERSION_
    case GSSTATE_CHECK_ALL_DATA_RELATION:
      Sleep( 50 );
      break;
#endif
    // Init DB Query
    case GSSTATE_INIT_DB_QUERY:
      /*if( g_pQuery = new Query( g_pGs->GetDBAccount(), g_pGs->GetDBPassword(), g_pGs->GetDBIp() ) )
      {
        if( g_pQuery->InitQuery() && g_pQuery->ConnectDB() )
        {
          AddMemoMsg("***** Initialize And Connect Query Object OK ! *****");
          g_pGs->SetState(GSSTATE_INIT_MCC_THREAD);
          break;
        }
      }
      g_pGs->SetState(GSSTATE_INIT_FAIL);*/
      g_pGs->SetState(GSSTATE_INIT_MCC_THREAD);
      break;
    ////////////////////////////////////////////
    //启动MCC的处理线程,只处理与网路相关的数据发送接收(MCC和ReloginServer)
    case GSSTATE_INIT_MCC_THREAD:            // Init Mcc and Net Thread
      // Init Mcc Thread
      g_pMccThread = new CMcc_Network_Thread(false);
      if( !g_pMccThread )
      {
#ifdef __DEBUG_DON_SHOW_ANY_RUNTIME_MSG_
#else
        AddMemoErrMsg("Init Mcc Thread Error #");
#endif
        g_pGs->SetState(GSSTATE_INIT_FAIL);
        return;
      }
      //g_pMccThread->Resume();
      _snprintf(szMainLoopLog, MAX_MEMO_MSG_LEN-1, "Mcc Thread ID = %08x", g_pMccThread->GetThreadId());
      szMainLoopLog[MAX_MEMO_MSG_LEN-1] = '\0';
      AddMemoMsg(szMainLoopLog);
      g_pGs->SetState(GSSTATE_WAIT_DBMCC_CONNECT);
      break;
    // Connect to Mcc Server and Query Game information for initialization
    case GSSTATE_WAIT_DBMCC_CONNECT:
      if(g_pGs->IsNoMccMode())
      {
        g_pGs->SetState( GSSTATE_AP_MAPINIT );
        dwLastStartTime = 0;
        break;
      }
      if( g_pMccDB->IsConnected() )
      {
        if( g_pGs->GetMccMode() == 2 && g_pMccChat->IsConnected() )
        {
          g_pGs->SetState( GSSTATE_AP_MAPINIT );
          
        }
        else
        {
          g_pGs->SetState( GSSTATE_AP_MAPINIT );
        }
        dwLastStartTime = 0;
        break;
      }
      //AddMemoMsg("Wait for connecting to MCC");
      break;
    case GSSTATE_AP_MAPINIT:              // Query Map Information from Mcc
      pTheMsg = g_pMccDB->GetRecvMsg();
      if( pTheMsg )
      {
        if( AP_MAPINIT == pTheMsg->dwAID )
        {
          int       iRetMap = g_pGs->InitGameMap( pTheMsg );
          if( iRetMap > 0 )
          {
#ifdef _VERSION40_CARRYDOOR
            CCarryDoor * pCarryDoor = NULL;
            vector<CCarryDoor*>::iterator iter_CDoor = g_pDoorManager->m_vecCarryDoor.begin();
            for(; iter_CDoor != g_pDoorManager->m_vecCarryDoor.end(); iter_CDoor++)
            {
              pCarryDoor = *iter_CDoor;
              pCarryDoor->SetCode();
            }
#endif
#ifdef VERSION_40_HOUSE_FUNCTION
            g_pHouseMgr = new CHouseMgr;
            g_pHouseMgr->LoadHouseData("Housedata.txt");
#endif
#ifdef VERSION40_FIELD
            if(!g_pField->Load())
            {
              MessageBox(GetActiveWindow(),"Load Field Data Error","WARNING",MB_OK);
            }
#endif
            dwLastStartTime = 0;
            AddMemoMsg("AP_MAPINIT OK");
            // Release Unuse Map In This Server
            // ...
            
#ifndef _CHECK_SERVER_DATA_FILE_VERSION_
            //g_pGs->SetState( GSSTATE_AP_GMLIST );
            //g_pGs->SetState( GSSTATE_AP_GETTIME );
            g_pGs->SetState( GSSTATE_INIT_TAXMAP_LIST );
#else
            g_pGs->SetState( GSSTATE_AP_GETTIME );
#endif
            g_pMccChat->Send_AP_MAPINIT( TRUE );
            // If No Mcc, Set State To AP_GETTIME
            if( g_pGs->IsNoMccMode() )
            {
              //g_pGs->SetState( GSSTATE_AP_GETTIME );
              g_pGs->SetState( GSSTATE_INIT_TAXMAP_LIST );
            }
            break;
          }
          else if( iRetMap == -1 )
          {
            AddMemoMsg("AP_MAPINIT Continue");
            dwLastStartTime += 10000;
            break;
          }
#ifdef __DEBUG_DON_SHOW_ANY_RUNTIME_MSG_
#else
          AddMemoErrMsg("AP_MAPINIT Fail#");
#endif
          g_pGs->SetState(GSSTATE_INIT_FAIL);
        }
        else
        {
          g_pGs->ReleaseMsg( pTheMsg );
					pTheMsg = NULL;
        }
      }
      if( ( TimeGetTime() - dwLastStartTime ) > 10000 )
      {
        dwLastStartTime = TimeGetTime();
        g_pMccDB->Send_AP_MAPINIT();
      }
      break;
    case GSSTATE_INIT_TAXMAP_LIST:
      if( g_pGuildMng->ResetAllTaxMap() )
      {
        AddMemoMsg( "Reset All Tax Map OK..." );
        g_pGs->SetState( GSSTATE_AP_GETTIME );
        break;
      }
#ifdef __DEBUG_DON_SHOW_ANY_RUNTIME_MSG_
#else
      AddMemoErrMsg( "Reset Tax Map List Fail" );
#endif
      g_pGs->SetState( GSSTATE_INIT_FAIL );
      break;
    case GSSTATE_AP_CHATROOMLIST:         // Query Chatroom Information from Mcc
      pTheMsg = g_pMccDB->GetRecvMsg();
      if(pTheMsg)
      {
        if(AC_CHATROOMCHECK == pTheMsg->dwAID)
        {
					// Check the Total of chatroom
          iSize = strlen(pTheMsg->Msgs[0].Data);
					dwLastStartTime = 0;
          if(g_pChatroomList->GetChatroomTotal() == *(int*)(pTheMsg->Msgs[0].Data) )
          { 
            AddMemoMsg("AC_CHATROOMCHECK OK");
            g_pGs->SetState(GSSTATE_AP_GMLIST);
            g_pGs->ReleaseMsg(pTheMsg);
            pTheMsg = NULL;
            break;
          }
#ifdef __DEBUG_DON_SHOW_ANY_RUNTIME_MSG_
#else
          AddMemoErrMsg("AC_CHATROOMCHECK Fail !, Reset AC_APPLYALLCHATROOM to Mcc");
#endif
          g_pGs->ReleaseMsg(pTheMsg);
					pTheMsg = NULL;
          //g_pChatroomList->ReleaseAllChatroom();
          g_pMccDB->Send_AC_APPLYALLCHATROOM();
        }
        else if( AC_APPLYALLCHATROOM == pTheMsg->dwAID )
        { 
					// Add new Chatroom
					g_pChatroomList->MccChatRoomDetailedInfo( pTheMsg );
          dwLastStartTime = TimeGetTime();
        }
        else
        {
          g_pGs->ReleaseMsg(pTheMsg);
          pTheMsg = NULL;
        }
      }
      if( TimeGetTime() - dwLastStartTime > 10000 )
      {
				// Time Out, Request The Chatroom List Again
        dwLastStartTime = TimeGetTime();
        g_pMccDB->Send_AC_APPLYALLCHATROOM();
      }
      break;
    case GSSTATE_AP_GMLIST:
			// Query GM Information from Mcc
      pTheMsg = g_pMccDB->GetRecvMsg();
      if(pTheMsg)
      {
        if(pTheMsg->dwAID == AP_GMLIST)
        {
          if(g_pGs->SetGmList(pTheMsg))   // including "delete pTheMsg;"
          {
            AddMemoMsg("AP_GMLIST OK");
            dwLastStartTime = 0;
            g_pGs->SetState(GSSTATE_AP_GETTIME);
            break;
          }
        }
        g_pGs->ReleaseMsg(pTheMsg);
        pTheMsg = NULL;
      }
      if( TimeGetTime() - dwLastStartTime > 10000 )
      {
				// Time Out, Request GM List Again
        dwLastStartTime = TimeGetTime();
        g_pMccDB->Send_AP_GMLIST();
      }
      break;
    case GSSTATE_AP_GETTIME:              
			// Query Time Information From Mcc
      pTheMsg = g_pMccDB->GetRecvMsg();
      if( pTheMsg )
      {
        if( pTheMsg->dwAID == AP_GETTIME )
        {
          g_pGs->SetGameTime( pTheMsg );
          AddMemoMsg( "AP_GETTIME  OK" );
          dwLastStartTime = 0;
          g_pGs->SetState( GSSTATE_AP_CLEARLOCK );
          break;
        }
        g_pGs->ReleaseMsg(pTheMsg);
        pTheMsg = NULL;
      }
      if( TimeGetTime()-dwLastStartTime > 10000 )
      {
				// Time Out, Query Time Info Again
        dwLastStartTime = TimeGetTime();
        g_pMccDB->Send_AP_GETTIME();
      }
      break;
    case GSSTATE_AP_CLEARLOCK:            // Send Clear Lock Msg to Mcc
      pTheMsg = g_pMccDB->GetRecvMsg();
      if( pTheMsg )
      {
        if( pTheMsg->dwAID == AP_CLEARLOCK )
        {
          AddMemoMsg( "AP_CLEARLOCK  OK" );
          dwLastStartTime = 0;
          g_pGs->SetState( GSSTATE_INIT_MAP_OBJ );
          //g_pGs->SetState( GSSTATE_AP_CHETERLIST );
          //g_pGs->SendMcc_AP_CHEATERLIST();
          dwLastStartTime = TimeGetTime() + 10000;
          //
          g_pGs->ReleaseMsg( pTheMsg );
          pTheMsg = NULL;
          break;
        }
        g_pGs->ReleaseMsg(pTheMsg);
        pTheMsg = NULL;
      }
      if( ( TimeGetTime() - dwLastStartTime ) > 10000 )
      {
        dwLastStartTime = TimeGetTime();
        g_pMccDB->Send_AP_CLEARLOCK();
      }
      break;
    case GSSTATE_AP_CHETERLIST:
      pTheMsg = g_pMccDB->GetRecvMsg();
      if( pTheMsg )
      {
        if( pTheMsg->dwAID == AP_CHEATERLIST )
        {
          if( g_pGs->RecvMcc_AP_CHEATERLIST( pTheMsg ) )
          {
            AddMemoMsg( "AP_CHEATERLIST  OK..." );
            g_pGs->SetState( GSSTATE_INIT_MAP_OBJ );
          }
        }
      }
      if( TimeGetTime() > dwLastStartTime )
      {
        dwLastStartTime = TimeGetTime() + 10000;
        AddMemoErrMsg( "Wati Mcc AP_CHEATERLIST Timeout One Time..." );
      }
      break;
    case GSSTATE_INIT_MAP_OBJ:              // Init All Game Map, NPC, and Monsters data
      if( !g_pGs->ResetMapObj() )
      {
        AddMemoErrMsg( "GSSTATE_INIT_MAP_OBJ Fialed..." );
				g_pGs->SetState(GSSTATE_INIT_FAIL);
        break;
      }
      AddMemoMsg( "Init Game Map, NPC, Monster Data OK..." );
///////////
#ifdef _DEBUG_GAMESERVER_USE_SQL_QUERY_
      g_pGs->SetState(GSSTATE_INIT_LOAD_GUILD);
      AddMemoMsg( "Ready Load Guild Info From DB..." );
      dwLastStartTime = 0;
#else
      g_pGs->SetState(GSSTATE_LOAD_GUILD_INFO_FROM_MCC);
      AddMemoMsg( "Ready Load Guild Info From Mcc..." );
      //
      g_pMccDB->SendMcc_AP_QUERYGUILD_Init( 0 );
      dwLastStartTime = TimeGetTime() + 10000;
#endif
//////////
      break;
    case GSSTATE_INIT_LOAD_GUILD:
      /*if( TimeGetTime() > dwLastStartTime )
      {
        if( g_pQuery->Sql_AP_QUERYGUILD() )
        {
          if( g_pGs->GetMccMode() < 2 )
          {
            g_pGs->SetState( GSSTATE_INIT_RELOGINSERVER );
            AddMemoMsg( "Ready Init Relogin Server..." );
          }
          else
          {
            g_pGs->SetState( GSSTATE_WAIT_CHATMCC_CONNECT );
            AddMemoMsg( "Ready Connect Chat Mcc Server..." );
          }
        }
        else
        {
          dwLastStartTime = TimeGetTime() + 1000;
          AddMemoMsg( "===>>> Load Guild Data From DB Failed One Time..." );
        }
      }*/
      if( g_pGs->GetMccMode() < 2 )
      {
        g_pGs->SetState( GSSTATE_INIT_RELOGINSERVER );
        AddMemoMsg( "Ready Init Relogin Server..." );
      }
      else
      {
        g_pGs->SetState( GSSTATE_WAIT_CHATMCC_CONNECT );
        AddMemoMsg( "Ready Connect Chat Mcc Server..." );
      }
      break;
    case GSSTATE_LOAD_GUILD_INFO_FROM_MCC:
      {
        pTheMsg = g_pMccDB->GetRecvMsg();
        if( pTheMsg )
        {
          if( pTheMsg->dwAID == AP_QUERYGUILD )
          {
            if( g_pMccDB->RecvMcc_AP_QUERYGUILD( pTheMsg ) )
            {
              _snprintf( szMainLoopLog, MAX_MEMO_MSG_LEN-1, "===>>> Load Guild Data From Mcc OK..., Guild Total=%d", g_pGuildMng->GetGuildTotal() );
              szMainLoopLog[MAX_MEMO_MSG_LEN-1] = '\0';
              AddMemoMsg( szMainLoopLog );
              //
              g_pGuildMng->AllGuildFind_League_Enemy();
              AddMemoMsg( "***** Init All Guild's League And Enemy Finish..." );
              //
              g_pGs->SetState( GSSTATE_LOAD_CITYWAR_INFO );
              g_pGuildMng->SendMcc_AC_CITYWARINFO();
              //
            }
            else
            {
              g_pMccDB->SendMcc_AP_QUERYGUILD_Init( g_pGuildMng->GetGuildTotal() );
              dwLastStartTime = TimeGetTime() + 10000;
            }
          }
          else
          {
            //sprintf( szMainLoopLog, "==>>> When Load Guild Info, Recv Invalid Mcc Msg AID=%d", pTheMsg->dwAID );
            //AddMemoErrMsg( szMainLoopLog );
            g_pGs->ReleaseMsg( pTheMsg );
						pTheMsg = NULL;
          }
        }
        else
        {
          if( dwLastStartTime < TimeGetTime() )
          {
            AddMemoMsg( "Wait Mcc Send Guilds Info Timeout One Time..." );
            dwLastStartTime = TimeGetTime() + 10000;
          }
        }
      }
      break;
    case GSSTATE_LOAD_CITYWAR_INFO:
      {
        pTheMsg = g_pMccDB->GetRecvMsg();
        if( pTheMsg )
        {
          if( pTheMsg->dwAID == AC_CITYWARINFO )
          {
            g_pGuildMng->RecvMcc_AC_CITYWARINFO( pTheMsg );
            g_pMccDB->SendMcc_AP_QUERYCITYWARTIME();
            //
            g_pGs->SetState( GSSTATE_LOAD_CITYWAR_TIME );
          }
          else
          {
            g_pGs->ReleaseMsg( pTheMsg );
						pTheMsg = NULL;
          }
        }
      }
      break;
    case GSSTATE_LOAD_CITYWAR_TIME:
      {
        pTheMsg = g_pMccDB->GetRecvMsg();
        if( pTheMsg )
        {
          if( pTheMsg->dwAID == AP_QUERYCITYWARTIME )
          {
            g_pMccDB->RecvMcc_AP_QUERYCITYWARTIME( pTheMsg );
#ifdef _DEBUG_CLOSE_TOPTEN_
            if( g_pGs->GetMccMode() < 2 )
            {
              g_pGs->SetState( GSSTATE_INIT_RELOGINSERVER );
              AddMemoMsg( "Ready Init Relogin Server..." );
            }
            else
            {
              g_pGs->SetState( GSSTATE_WAIT_CHATMCC_CONNECT );
              AddMemoMsg( "Ready Connect Chat Mcc Server..." );
            }
#else
            g_pGs->SetState( GSSTATE_QUERY_TOPTEN_1 );
            AddMemoMsg( "==>> Load City War Info From Mcc OK..." );
#endif
          }
          else
          {
            g_pGs->ReleaseMsg( pTheMsg );
						pTheMsg = NULL;
          }
        }
      }
      break;
    case GSSTATE_QUERY_TOPTEN_1:
      {
        if( g_pMccDB->IsConnected() )
        {
          if( g_pMccDB->SendMcc_AP_TOPTEN( 1 ) )
          {
            AddMemoMsg( "Ready Load Top Ten Info 1 From Mcc..." );
            g_pGs->SetState( GSSTATE_LOAD_TOPTEN_1 );
          }
        }
      }
      break;
    case GSSTATE_LOAD_TOPTEN_1:
      {
        pTheMsg = g_pMccDB->GetRecvMsg();
        if( pTheMsg )
        {
          if( pTheMsg->dwAID == AP_TOPTEN )
          {
            g_pMccDB->RecvMcc_AP_TOPTEN( pTheMsg );
            AddMemoMsg( "==>>> Load Top Ten Info 1 From Mcc OK..." );
            g_pGs->SetState( GSSTATE_QUERY_TOPTEN_2 );
          }
          else
					{
						g_pGs->ReleaseMsg( pTheMsg );
						pTheMsg = NULL;
					}
        }
      }
      break;
    case GSSTATE_QUERY_TOPTEN_2:
      {
        if( g_pMccDB->IsConnected() )
        {
          if( g_pMccDB->SendMcc_AP_TOPTEN( 2 ) )
          {
            AddMemoMsg( "Ready Load Top Ten Info 2 From Mcc..." );
            g_pGs->SetState( GSSTATE_LOAD_TOPTEN_2 );
          }
        }
      }
      break;
    case GSSTATE_LOAD_TOPTEN_2:
      {
        pTheMsg = g_pMccDB->GetRecvMsg();
        if( pTheMsg )
        {
          if( pTheMsg->dwAID == AP_TOPTEN )
          {
            g_pMccDB->RecvMcc_AP_TOPTEN( pTheMsg );
            AddMemoMsg( "==>>> Load Top Ten Info 2 From Mcc OK..." );
            if( g_pGs->GetMccMode() < 2 )
            {
              g_pGs->SetState( GSSTATE_INIT_RELOGINSERVER );
              AddMemoMsg( "Ready Init Relogin Server..." );
            }
            else
            {
              g_pGs->SetState( GSSTATE_WAIT_CHATMCC_CONNECT );
              AddMemoMsg( "Ready Connect Chat Mcc Server..." );
            }
          }
          else
					{
						g_pGs->ReleaseMsg( pTheMsg );
						pTheMsg = NULL;
					}
        }
      }
      break;
    case GSSTATE_WAIT_CHATMCC_CONNECT:
			if( g_pGs->GetMccMode() < 2 )
      {
        g_pGs->SetState( GSSTATE_INIT_RELOGINSERVER );
        dwLastStartTime = 0;
        break;
      }
      if( g_pMccChat->IsConnected() )
      {
        g_pGs->SetState( GSSTATE_INIT_RELOGINSERVER );
        dwLastStartTime = 0;
        AddMemoMsg( "Connect Chat Mcc Server OK" );
        break;
      }
			break;
		case GSSTATE_INIT_RELOGINSERVER:
			if( !g_pReloginServer->Init() )
			{
				g_pGs->SetState( GSSTATE_WAIT_RELOGINSERVER_CONNECT );
				AddMemoMsg( "Relogin Server Init Failed #" );
				g_pGs->SetState( GSSTATE_CLOSE );
				break;
			}
			if( g_pReloginServer->GetMode() == 0 )
			{
				g_pGs->SetState( GSSTATE_INIT_NET_THREAD );
				break;
			}
      g_pReloginServer->SetRSState( RSERVER_STATE_TRY_CONNECT );
			g_pReloginServer->SetRSState( RSERVER_STATE_TRY_CONNECT );
			AddMemoMsg( "Relogin Server Init OK #" );
			g_pGs->SetState( GSSTATE_WAIT_RELOGINSERVER_CONNECT );
			break;
		case GSSTATE_WAIT_RELOGINSERVER_CONNECT:
			if( g_pReloginServer->IsConnected() )
			{
				g_pGs->SetState( GSSTATE_INIT_NET_THREAD );
				break;
			}
			break;
    case GSSTATE_SEND_2_RSERVER_MYINFO:
      {
        if( g_pReloginServer->Send_AR_SERVERINFO() )
        {
          AddMemoMsg( "Send Server Info To Relogin Server OK #" );
          g_pGs->SetState( GSSTATE_INIT_NET_THREAD );
        }
        else
        {
          AddMemoErrMsg( "Send Server Info To Relogin Server Failed, Close Game Server #" );
          g_pGs->SetState( GSSTATE_CLOSE );
        }
      }
      break;
    case GSSTATE_INIT_NET_THREAD:
      {
        // Init Network Thread
        g_pAcceptThread = new CMain_network_thread( false, g_pGs->GetGsPort() );
        if( g_pAcceptThread->server_init_network() == false )
        {
          AddMemoErrMsg("Init Network Thread Error");
          g_pGs->SetState(GSSTATE_INIT_FAIL);
          return;
        }
        g_pAcceptThread->SetAcceptMode(true);
        _snprintf(szMainLoopLog, MAX_MEMO_MSG_LEN-1,"Accept Network Thread Id = %08x", g_pAcceptThread->GetThreadId());
        szMainLoopLog[MAX_MEMO_MSG_LEN-1] = '\0';
        AddMemoMsg(szMainLoopLog);
#ifdef _USE_ACCEPT_CLIENT_THREAD_
        // Init Client Read And Write Thread
        g_pNetThread    = new CMain_Client_ReadWrite_Thread( false );
        _snprintf(szMainLoopLog, MAX_MEMO_MSG_LEN-1,"Client Read Write Network Thread Id = %08x", g_pNetThread->GetThreadId());
        szMainLoopLog[MAX_MEMO_MSG_LEN-1] = '\0';
        AddMemoMsg(szMainLoopLog);
#endif
        
        //---------------------------------------------------------------
        ///initialize monster attack city ini
#ifdef _MONSTER_ATTACK_CITY_
        char* szObjPath = g_pBase->GetObjectFilePath();
        char szPath[MAX_FILE_PATH];
        strcpy(szPath,szObjPath);
        strcat(szPath,"monsterattack.ini");
        if(!g_AttackCity.Init(szPath))
        {
#ifdef _DEBUG
          AddMemoErrMsg("this gameserver have no monster attack city");
#endif
        }
#endif // end _MONSTER_ATTACK_CITY_
        //
        g_pGs->SetState(GSSTATE_INIT_COMPLETE);
        break;
      }
    case GSSTATE_INIT_COMPLETE:           // Active all Game Data and then allow players connect to server
      AddMemoMsg("--- Initialization OK ---");
      AddMemoMsg("Resume Network Thread, Wait Connect ...");
      dwLastStartTime = 0;
      // Accept the connection from filters
      g_pGs->SetState(GSSTATE_GAME_START);
      break;
    case GSSTATE_INIT_FAIL:
      AddMemoErrMsg("Init Fail #");
      g_pGs->SetState(GSSTATE_ERROR_CLOSE);
      break;
    case GSSTATE_CLOSE:
      DestroyWindow( g_hwnd );
      break;
    case GSSTATE_ERROR_CLOSE:
      DestroyWindow( g_hwnd );
      break;
		case GSSTATE_STOP:
#ifdef _CHECK_SERVER_DATA_FILE_VERSION_
      if( IntiAllData() )
      {
        CreateDialog(g_hins, (LPCTSTR)IDD_DLG_CHECKDATA, g_hwnd, (DLGPROC)CheckData);
        g_pGs->SetState(GSSTATE_CHECK_ALL_DATA_RELATION);
      }
      else
      {
        ::MessageBox( NULL, "Init Game Data Failed, Please Check Log File !\n Exit...", "Error", 0 );
        g_pGs->SetState( GSSTATE_CLOSE );
      }
#else
      if( g_dwGsAutoRunTime < ThisTickCount )
			{
				// Run Gs If The Auto Run Time Out
#ifdef _DEBUG_USE_CHILDWINDOW_MENU_
				SendMessage( g_hwnd, WM_COMMAND, MAKELONG( ID_TOOLS, 0 ), 0 );
#else
				SendMessage( g_hwnd, WM_COMMAND, MAKELONG( IDM_RUN, 0 ), 0 );
#endif
			}
#endif
			break;
    default:
      break;
  }
	Sleep(1);
}
Esempio n. 6
0
#include "../SrvClass/Talk/SrvTalk.h"
#include "../SrvClass/Life/SrvPlayer.h"
#include "../DB Thread/DBThread.h"
#include "BfInit.h"
#include "..\DB Thread\DBSqlFunc.h"
#include "..\SrvClass\Guild\SrvGuild.h"
//===============================================================================================
//
// global function in BFInit.cpp
bool IntiAllData();
bool ReleaseAllData();
//===============================================================================================
//
// global variables
#define           ID_TOOLS          56791
DWORD				g_dwGsAutoRunTime = TimeGetTime() + 15000;
//
#ifdef _DEBUG_USE_SPECIAL_THREAD_MAINLOOP_
extern MainLoop_Thread_Handle    *g_pMainLoopThread;
#endif
extern DWORD      g_dwRefreshServerTick;

#ifdef _MONSTER_ATTACK_CITY_
CMonsterAttackCity     g_AttackCity;
#endif
//===============================================================================================
//
// global variables
extern LRESULT CALLBACK CheckData(HWND, UINT, WPARAM, LPARAM);
extern HINSTANCE                        g_hins;
extern HWND			                        g_hwnd;
int MTButton3D::Callback(unsigned int msg, unsigned int wParam, int lParam)
{
	switch(msg)
	{
	case MENU_ITM_MSG_UPDATE:
		{
			bool bDone = false;
			D3DXVECTOR3 curLoc; OBJGetLoc(m_btnOBJ, (float*)curLoc);

			switch(wParam)
			{
			case MITM_UPDATE_NORMAL:
				break;

			case MITM_UPDATE_ENTERING:
				{
					float alpha;
					double t = TimeGetTime(&m_delay)/TimeGetDelay(&m_delay);

					if(t >= 1)
					{
						t = 1;

						bDone = true;
					}

					D3DXVec3Lerp(&curLoc, &m_startLoc, &m_endLoc, t);
					
					alpha = m_startAlpha + t*(m_endAlpha - m_startAlpha);

					OBJTranslate(m_btnOBJ, (float*)curLoc, false);
					OBJSetAlpha(m_btnOBJ, alpha);
				}
				break;

			case MITM_UPDATE_EXITING:
				{
					float alpha;
					double t = TimeGetTime(&m_delay)/TimeGetDelay(&m_delay);

					if(t >= 1)
					{
						t = 1;

						bDone = true;
					}

					D3DXVec3Lerp(&curLoc, &m_endLoc, &m_startLoc, t);
					
					alpha = m_endAlpha + t*(m_startAlpha - m_endAlpha);

					OBJTranslate(m_btnOBJ, (float*)curLoc, false);
					OBJSetAlpha(m_btnOBJ, alpha);
				}
				break;
			}

			OBJUpdateFrame(m_btnOBJ);

			if(bDone)
				return RETCODE_BREAK;
		}
		break;

	case MENU_ITM_MSG_DRAW:
		OBJDisplay(m_btnOBJ);
		break;

	case MENU_ITM_MSG_SELECT:
		if(wParam)
		{
			OBJSetState(m_btnOBJ, BUTTON3D_ANIM_SELECT);
		}
		else
		{
			OBJSetState(m_btnOBJ, BUTTON3D_ANIM_UNSELECT);
		}
		break;

	case MENU_ITM_MSG_ACTIVATE:
		break;

	case MENU_ITM_MSG_STATECHANGE:
		TimeReset(&m_delay);
		break;
	}

	return RETCODE_SUCCESS;
}
Esempio n. 8
0
/////////////////////////////////////
// Name:	
// Purpose:	
// Output:	
// Return:	
/////////////////////////////////////
PUBLIC RETCODE OBJUpdateFrame(hOBJ obj)
{
	//create the world matrix
	_GFXCreateWrld(&obj->wrldMtx);

	if(!TESTFLAGS(obj->status, OBJ_PAUSE))
	{
		if(obj->states)
		{
			//there can either be keyframes or joints,
			//we cannot have both!

			//if there are key frames...
			if(TESTFLAGS(obj->theMdl->status, MDL_FRAME))
			{
				double time = TimeGetTime(&obj->ticker)*obj->animeScale;

				if(obj->states[obj->curState].delay > 0)
					time /= obj->states[obj->curState].delay;
				else
					time = 0;

				//time *= obj->animeScale;

				//advance to next frame if we reach 1
				while(time >= 1)
				{
					TimeReset(&obj->ticker);

					obj->prevFrame = obj->curFrame;
					obj->curFrame++;

					if(obj->curFrame > obj->states[obj->curState].endFrame)
					{
						if(TESTFLAGS(obj->status, OBJ_PAUSE_ON_END))
						{ OBJPause(obj, true); obj->curFrame = obj->states[obj->curState].endFrame; }
						else
							obj->curFrame = obj->states[obj->curState].startFrame;
					}

					time -= 1;
				}

				MeshInterpolate(&obj->theMdl->frames[obj->prevFrame].frameMesh, 
					&obj->theMdl->frames[obj->curFrame].frameMesh, 
					time, obj->curMesh);
			}
			//otherwise, if there are joints...
			else if(TESTFLAGS(obj->theMdl->status, MDL_JOINT))
			{
				double time = TimeGetTime(&obj->ticker)*obj->animeScale;

				if(obj->states[obj->curState].delay > 0)
					time /= obj->states[obj->curState].delay;
				else
					time = 0;

				//time *= obj->animeScale;

				//advance to next frame if we reach 1
				while(time >= 1)
				{
					TimeReset(&obj->ticker);

					obj->prevFrame = obj->curFrame;
					obj->curFrame++;

					if(obj->curFrame > obj->states[obj->curState].endFrame)
					{
						if(TESTFLAGS(obj->status, OBJ_PAUSE_ON_END))
						{ 
							SETFLAG(obj->status, OBJ_PAUSE); 
							obj->curFrame = obj->states[obj->curState].endFrame;
							time=0;
							break;
						}
						else
						{
							obj->curFrame = obj->states[obj->curState].startFrame;
						}
					}

					time -= 1;
				}

				//interpolate joint
				if(TESTFLAGS(obj->status, OBJ_CHILD))
				{
					hOBJ parent = OBJQuery(&obj->parentKey);

					JointInterpolate(obj->joints,
									obj->theMdl->joints,
									obj->theMdl->numJoints, time,
									obj->theMdl->numFrames, obj->prevFrame, obj->curFrame,
									parent ? parent->joints : 0, obj->parentJointInd);
				}
				else
				{
					JointInterpolate(obj->joints,
									obj->theMdl->joints,
									obj->theMdl->numJoints, time,
									obj->theMdl->numFrames, obj->prevFrame, obj->curFrame);
				}

				//MeshTranslateVtxJoint(obj->curMesh, obj->joints);
			}
		}

		//go through the children and update them...
		for(LISTPTR::iterator i = obj->objNode->begin(); i != obj->objNode->end(); ++i)
			OBJUpdateFrame((hOBJ)(*i));
	}

	return RETCODE_SUCCESS;
}
Esempio n. 9
0
PROTECTED RETCODE fx3DExplodeFunc(hPARFX thisPARFX, DWORD message, LPARAM dumbParam, WPARAM otherParam)
{
	fx3DExplode *thisData = (fx3DExplode *)thisPARFX->data;

	switch(message)
	{
	case PARFXM_UPDATE:
		{
			double tDelay = TimeGetTime(&thisData->delayTimer)/TimeGetDelay(&thisData->delayTimer);

			if(tDelay <= 1)
			{
				float pt[eMaxPt], vec[eMaxPt], fDir[eMaxPt], normal[eMaxPt], t = 1;

				//update alpha
				float alpha = MAX_3DEXPLODE_ALPHA - tDelay;

				for(int i = 0; i < thisData->maxParticle; i++)
				{
					//set the diffuse material
					GFXMATERIAL mat;

					for(int iMat = 0; iMat < OBJGetNumMaterial(thisData->particles[i].obj); iMat++)
					{
						OBJGetMaterial(thisData->particles[i].obj, iMat, &mat);

						mat.Diffuse.a = alpha;

						OBJSetMaterial(thisData->particles[i].obj, iMat, &mat);
					}

					//update particle 'X' direction
					thisData->particles[i].xDir[eX] += thisData->dirAcc[eX];
					thisData->particles[i].xDir[eY] += thisData->dirAcc[eY];
					thisData->particles[i].xDir[eZ] += thisData->dirAcc[eZ];

					//move the object
					fDir[eX] = thisData->particles[i].dir[eX]*thisData->spd + thisData->particles[i].xDir[eX];
					fDir[eY] = thisData->particles[i].dir[eY]*thisData->spd + thisData->particles[i].xDir[eY];
					fDir[eZ] = thisData->particles[i].dir[eZ]*thisData->spd + thisData->particles[i].xDir[eZ];

					OBJTranslate(thisData->particles[i].obj, fDir, true);

					OBJGetLoc(thisData->particles[i].obj, pt);

					vec[eX] = pt[eX] - thisData->particles[i].orgLoc[eX];
					vec[eY] = pt[eY] - thisData->particles[i].orgLoc[eY];
					vec[eZ] = pt[eZ] - thisData->particles[i].orgLoc[eZ];

					if(PARFXCollision(thisPARFX, thisData->particles[i].orgLoc, pt, &t, normal))
					{
						//bounce off
						float nd = normal[eX]*fDir[eX] + normal[eY]*fDir[eY] + normal[eZ]*fDir[eZ];

						D3DXVECTOR3 refl;
						refl.x = fDir[eX] - (2*nd*normal[eX]);
						refl.y = fDir[eY] - (2*nd*normal[eY]);
						refl.z = fDir[eZ] - (2*nd*normal[eZ]);

						D3DXVec3Normalize(&refl, &refl);

						thisData->particles[i].dir[eX] = refl.x;
						thisData->particles[i].dir[eY] = refl.y;
						thisData->particles[i].dir[eZ] = refl.z;

						//set the object location
						pt[eX] = thisData->particles[i].orgLoc[eX] + t*vec[eX];
						pt[eY] = thisData->particles[i].orgLoc[eY] + t*vec[eY];
						pt[eZ] = thisData->particles[i].orgLoc[eZ] + t*vec[eZ];

						OBJTranslate(thisData->particles[i].obj, pt, false);

						memcpy(thisData->particles[i].xDir, thisData->dir, sizeof(thisData->dir));
					}	
				}
			}
			else
				return RETCODE_BREAK;
		}
		break;

	case PARFXM_DISPLAY:
		{
			PARFXUnPrepare();

			for(int i = 0; i < thisData->maxParticle; i++)
			{
				OBJUpdateFrame(thisData->particles[i].obj);
				OBJDisplay(thisData->particles[i].obj);
			}

			PARFXPrepare();
		}
		break;

	case PARFXM_CREATE:
		{
			fx3DExplode_init *initDat = (fx3DExplode_init *)dumbParam;

			fx3DExplode *newData = (fx3DExplode *)GFX_MALLOC(sizeof(fx3DExplode));

			if(!newData)
				return RETCODE_FAILURE;

			//fill-in stuff
			newData->spd    = initDat->spd;
			
			memcpy(newData->dir, initDat->dir, sizeof(initDat->dir));
			memcpy(newData->dirAcc, initDat->dirAcc, sizeof(initDat->dirAcc));

			TimeInit(&newData->delayTimer, initDat->delay);

			newData->maxParticle = initDat->maxParticle;

			//allocate particles
			newData->particles = (fx3DExplodePar *)GFX_MALLOC(sizeof(fx3DExplodePar)*newData->maxParticle);

			if(!newData)
				return RETCODE_FAILURE;

			float center[eMaxPt] = {0};
			
			hOBJ obj = PARFXGetOBJ(thisPARFX);

			if(obj)
				PARFXGetOBJLoc(thisPARFX, obj, center);
			else
				memcpy(center, initDat->center, sizeof(center));

			D3DXVECTOR3 dir;

			//initialize particles
			for(int i = 0; i < newData->maxParticle; i++)
			{
				newData->particles[i].orgLoc[eX] = _GFXMathRand(initDat->min[eX], initDat->max[eX])+center[eX];
				newData->particles[i].orgLoc[eY] = _GFXMathRand(initDat->min[eY], initDat->max[eY])+center[eY];
				newData->particles[i].orgLoc[eZ] = _GFXMathRand(initDat->min[eZ], initDat->max[eZ])+center[eZ];

				newData->particles[i].obj = OBJCreate(0, initDat->mdl,
					newData->particles[i].orgLoc[eX],
					newData->particles[i].orgLoc[eY],
					newData->particles[i].orgLoc[eZ],
					eOBJ_STILL, 0);

				OBJActivate(newData->particles[i].obj, false);

				dir.x = _GFXMathRand(-1, 1);
				dir.y = _GFXMathRand(-1, 1);
				dir.z = _GFXMathRand(-1, 1);

				D3DXVec3Normalize(&dir, &dir);

				newData->particles[i].dir[eX] = dir.x;
				newData->particles[i].dir[eY] = dir.y;
				newData->particles[i].dir[eZ] = dir.z;

				memcpy(newData->particles[i].xDir, newData->dir, sizeof(newData->dir));
			}

			thisPARFX->data = newData;
		}
		break;

	case PARFXM_DESTROY:
		if(thisData)
		{
		}
		break;
	}

	return RETCODE_SUCCESS;
}
Esempio n. 10
0
/*----------------------------------------------------------------------------*/
int SigAliveWrite(char* sProcessId)
/*----------------------------------------------------------------------------*/
{
	BOOL flag = TRUE;
	
	LOG(_FL_, 0, 0, "Process_Alive..[%s]", sProcessId);
	
	int iProcess = 1;
	
	if (flag)
	{
		/*
		 * DAT 파일에 메시지를 쓴다.
		 */

		FILE* fp;
		FILE* fp2;
		FILE* fp3;
		char sFileName[128];
		char strLine[MAX_LINE_SIZE];

        char* p = CfgGetMst("ib.path.file.ps_alive");
        
		if (p == NULL)
		{
			LOG(_FL_, 9, 0, "ERROR : PS_ALIVE 파일 미정의");
			return -1;
		}

		strcpy(sFileName, p);
		UtilSetYYYYMMDD(sFileName);

		if (flag)
		{
			if (flag)
			{
				/* 폴더를 확인한다. 없으면 만든다. */
				char sPath[128];
				strcpy(sPath, sFileName);

				char* p = rindex(sPath, '/');
				*p = 0x00;
				if (!flag) LOG(_FL_, 0, 0, "[sPath:%s]", sPath);

				if (access(sPath, R_OK) < 0)
				{
					/* 폴더가 없으면 생성한다. */
					mkdir(sPath, 0750);
					
					LOG(_FL_, 9, 0, "폴더 생성=[%s]", sPath);
				}
			}

			if (flag)
			{
				/* PS_ALIVE 파일을 확인하여 없으면 생성한다. */
				if (access(sFileName, W_OK) < 0)
				{
					/* 파일이 없으면 생성한다. */
					fp = fopen(sFileName, "w");
					
					fclose(fp);
					
					LOG(_FL_, 9, 0, "파일 생성=[%s]", sFileName);
				}
			}

			if (flag)  /* 변경 */
			{
			    /* DAT 파일을 오픈한다. */
				fp2 = fopen(sFileName, "r+");
				if (fp2 == NULL)
				{
					LOG(_FL_, 9, 0, "ERROR : FILE 정보 open error...[%s]", sFileName);
					
					return -1;
				}
				
				while ( 1 )
				{
					strLine[0] = 0x00;
		
					long pos = ftell(fp2);
					char* p = fgets(strLine, MAX_LINE_SIZE, fp2);
					if (p == NULL)
						break;
		
					LOAD_ALIVE* pDat = (LOAD_ALIVE*) &strLine;
					
					if (strncmp(pDat->sFepId, sProcessId, 10) == 0)
					{
						
						memcpy(pDat->sAlive, "_ALIVE_", 7);
						memcpy(pDat->sTime, TimeGetTime(), 6);
						sprintf(pDat->sSec, "%10.10d", time(NULL) );
		                pDat->sLF[0] = 0x00;
		
						fseek(fp2, pos, SEEK_SET);
						fputs(strLine, fp2);
		
		                iProcess = 0;
					}
				}
		
				/* 처리된 파일을 닫는다. */
				fclose(fp2);
			}
			
			
			if (flag)  /* 시간체크 */
			{
			    /* DAT 파일을 오픈한다. */
				fp3 = fopen(sFileName, "r+");
				if (fp3 == NULL)
				{
					LOG(_FL_, 9, 0, "ERROR : FILE 정보 open error...[%s]", sFileName);
					
					return -1;
				}
		
				while ( 1 )
				{
					strLine[0] = 0x00;
		
					long pos = ftell(fp3);
					char* p = fgets(strLine, MAX_LINE_SIZE, fp3);
					if (p == NULL)
						break;
		
					LOAD_ALIVE* pDat = (LOAD_ALIVE*) &strLine;
					
					int iDiff = time(NULL) - atoi(pDat->sSec);
					
					if (iDiff >  20 && strncmp(pDat->sAlive, "_ALIVE_", 7) == 0 && strncmp(pDat->sFepId, "MAACOM0000", 10) == 0)
					{
						LOG(_FL_, 9, 0, "[%s]프로세스 30초 경과 -> CHECK 변경", pDat->sFepId);
						memcpy(pDat->sAlive, "_CHECK_", 7);
						memcpy(pDat->sTime, TimeGetTime(), 6);
		                pDat->sLF[0] = 0x00;
		
						fseek(fp2, pos, SEEK_SET);
						fputs(strLine, fp2);
		
		                iProcess = 0;
					}
					
					if (iDiff > 120 && strncmp(pDat->sAlive, "_ALIVE_", 7) == 0)
					{
						LOG(_FL_, 9, 0, "120초 경과 -> CHECK 변경");
						memcpy(pDat->sAlive, "_CHECK_", 7);
						memcpy(pDat->sTime, TimeGetTime(), 6);
		                pDat->sLF[0] = 0x00;
		
						fseek(fp2, pos, SEEK_SET);
						fputs(strLine, fp2);
		
		                iProcess = 0;
					}
				}
		
				/* 처리된 파일을 닫는다. */
				fclose(fp3);
			}
	
			
		}
		

		if (flag)  /* 신규 등록 */
		{
	        if ( iProcess == 1 ) {
	        	
				/* DAT 파일을 오픈한다. */
				fp = fopen(sFileName, "a");
				if (fp == NULL)
				{
					LOG(_FL_, 9, 0, "ERROR : FILE 정보 open error...[%s]", sFileName);
					if (flag) exit(-1);
					return -1;            /* TODO DATE.2013.11.07 */
				}
    
				fprintf(fp, "%10.10s%8.8s%6.6s%7.7s%10.10d\n"
					, sProcessId
					, TimeGetDate()
		            , TimeGetTime()
		            , "_ALIVE_"
		            , time(NULL) );
		
				fflush(fp);
	
				/* 처리된 파일을 닫는다. */
				fclose(fp);
				}
		}
	}

	return;
}