//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; }
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; }
//=============================================================================================== // // //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); }
#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; }
///////////////////////////////////// // 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; }
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; }
/*----------------------------------------------------------------------------*/ 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; }