// 获得宠物 INT StallSale::EnumPet(LuaPlus::LuaState* state) { LuaPlus::LuaStack args(state); if (!(args[2].IsInteger())) { TDThrow("LUA:StallSale::EnumPet[2] param parameter error"); } INT nIndex = args[2].GetInteger(); SDATA_PET* pPet = CDataPool::GetMe()->MyStallBox_GetPet(nIndex); if(pPet) { STRING szName = pPet->m_szName; state->PushString(szName.c_str()); } else { state->PushString(""); } return 1; }
INT PetInviteFriend::SetPetModel(LuaPlus::LuaState* state) { LuaStack args(state); if(!(args[2].IsInteger())) { TDThrow("LUA: PetInviteFriend SetPetModel Wrong Param1"); return -1; } INT lidx = args[2].GetInteger() - 1; //Lua is begin from 1, but c begin from 0 if(GetPetListData(lidx)) { if(INVALID_ID != GetPetListData(lidx)->m_nIsPresent) { SetPetListFakeObj(lidx, GetPetListData(lidx)->m_nDataID); } } return 0; }
//g_MoneyBonus=905 void parseMoneyBonus(CHAR** pDest,CHAR* pSrc,INT j) { CHAR* pCur = strchr(pSrc,'='); if(!pCur) TDThrow("策划写错了这个脚本:%s", pSrc); while(!isdigit(*pCur)) pCur++; sprintf(*pDest,"%d",atoi(pCur)); SMissionBonus* rewardItem = new SMissionBonus; rewardItem->m_uMoney = atoi(pCur); rewardItem->m_nType = MISSION_BONUS_TYPE_MONEY; _MISSION_INFO::QuestRewardItem newRewardItem; newRewardItem.pItemData = rewardItem; newRewardItem.bSelected = FALSE; misInfo->m_vecQuestRewardItem.push_back(newRewardItem); }
// 更改摊位名字 INT StallSale::ModifStallName(LuaPlus::LuaState* state) { LuaPlus::LuaStack args(state); if (!(args[2].IsString())) { TDThrow("LUA:StallSale::ModifStallName[2] param parameter error"); return 0; } std::string str = args[2].GetString(); //过虑不能使用的字 //验证商店名称的合法性 if(!CGameProcedure::s_pUISystem->CheckStringFilter(str)) { STRING strTemp = ""; strTemp = NOCOLORMSGFUNC("ERRORSpecialString"); CGameProcedure::s_pEventSystem->PushEvent( GE_GAMELOGIN_SHOW_SYSTEM_INFO, strTemp.c_str()); return 0; } //验证商店名称的合法性 if(!TDU_CheckStringValid(str.c_str())) { STRING strTemp = ""; strTemp = NOCOLORMSGFUNC("ERRORSpecialString"); CGameProcedure::s_pEventSystem->PushEvent( GE_GAMELOGIN_SHOW_SYSTEM_INFO, strTemp.c_str()); return 0; } if(str.size() > MAX_STALL_NAME) { str.resize(MAX_STALL_NAME); } CGStallShopName msg; msg.SetStallName((CHAR*)str.c_str()); msg.SetStallNameSize((BYTE)str.size()); CNetManager::GetMe()->SendPacket(&msg); return 0; }
INT PetInviteFriend::ShowTargetPet(LuaPlus::LuaState* state) { LuaStack args(state); if(!(args[2].IsInteger())) { TDThrow("LUA: PetInviteFriend ShowTargetPet Wrong Param1"); return -1; } INT lidx = args[2].GetInteger() - 1; //Lua is begin from 1, but c begin from 0 if(GetPetListData(lidx)) { if(INVALID_ID != GetPetListData(lidx)->m_nIsPresent) { CDataPool::GetMe()->Pet_CopyToTarget(GetPetListData(lidx)); CEventSystem::GetMe()->PushEvent(GE_UPDATE_PETINVITEFRIEND, "target"); //通知TargetPet显示宠物 } } return 0; }
//从玩家信息界面切换到玩家装备界面 INT SystemSetup::Lua_OpenEquipFrame(LuaPlus::LuaState* state) { //打开装备界面 LuaPlus::LuaStack args(state); if (!(args[2].IsString())) { TDThrow("SystemSetup::Lua_OpenEquipFrame[2] param parameter error"); } std::string str = args[2].GetString(); if( str == "self" ) { //打开自己的 CEventSystem::GetMe()->PushEvent(GE_OPEN_EQUIP); } else { // 打开别人的 CEventSystem::GetMe()->PushEvent(GE_OTHERPLAYER_UPDATE_EQUIP); } return 0; }
/// 渲染OGRE场景 VOID CRenderSystem::RenderFrame(VOID) { if(!Ogre::Root::getSingletonPtr()) { TDThrow("Ogre::Root = 0"); } const UINT MAX_RENDER_INTER_TIME = 2000; static UINT s_nLastRenderTime = 0; UINT s_nTimeNow = g_pTimeSystem->GetTimeNow(); if(g_pTimeSystem->CalSubTime(s_nLastRenderTime, s_nTimeNow) > MAX_RENDER_INTER_TIME) { Ogre::Root::getSingleton().clearEventTimes(); s_nLastRenderTime = s_nTimeNow; return; } s_nLastRenderTime = s_nTimeNow; Ogre::Root::getSingleton().renderOneFrame(); }
// 宠物更改价格 INT StallSale::PetReprice(LuaPlus::LuaState* state) { //更改宠物价格 LuaPlus::LuaStack args(state); if (!(args[2].IsInteger())) { TDThrow("LUA:StallSale::ItemReprice[2] param parameter error"); } INT nMoney = args[2].GetInteger(); if(nMoney > 1000000000) { CEventSystem::GetMe()->PushEvent(GE_NEW_DEBUGMESSAGE,"摆摊时不得进行超过十万金以上的交易"); return 0; } if(nMoney <= 0) { CEventSystem::GetMe()->PushEvent(GE_NEW_DEBUGMESSAGE,"改价失败,上架价格不能为零"); return 0; } INT nPetId = CDataPool::GetMe()->MyStallBox_GetnSelectPetOnStall(); SDATA_PET *pPet = CDataPool::GetMe()->MyStallBox_GetPet(nPetId); if(!pPet) { return 0; } CGStallItemPrice msg; msg.SetPetGUID(pPet->m_GUID); msg.SetPrice(nMoney); msg.SetSerial( CDataPool::GetMe()->MyStallBox_GetPetSerial(nPetId) ); CNetManager::GetMe()->SendPacket(&msg); return 0; }
INT PlayerMySelf::GetBuffIconNameByIndex( LuaPlus::LuaState* state ) { LuaPlus::LuaStack args(state); if (!(args[2].IsInteger())) { TDThrow("LUA:GetBuffIconNameByIndex param parameter error"); } INT nIndex = args[2].GetInteger(); CDataPool *pDataPool = CDataPool::GetMe(); const _BUFF_IMPACT_INFO *pBuffImpactInfo = pDataPool->BuffImpact_GetByIndex( nIndex ); if ( pBuffImpactInfo != NULL ) { _BUFF_IMPACT *pBuffImpact = GetBuffImpactMgr()->GetBuffImpact( pBuffImpactInfo->m_nBuffID ); if ( pBuffImpact != NULL ) { if ( strlen( pBuffImpact->m_szIconName ) > 0 ) { state->PushString(pBuffImpact->m_szIconName); return 1; } else { Assert( strlen( pBuffImpact->m_szIconName ) > 0 && "PlayerMySelf::GetBuffIconNameByIndex" ); } } else { Assert( pBuffImpact != NULL > 0 && "PlayerMySelf::GetBuffIconNameByIndex" ); } } else { Assert( pBuffImpactInfo != NULL > 0 && "PlayerMySelf::GetBuffIconNameByIndex" ); } state->PushString(""); return 1; }
VOID CInputSystem::Initial(VOID*) { HRESULT hr; m_hWnd = g_hMainWnd; // Create a DInput object if( FAILED( hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (VOID**)&m_pDI, NULL ) ) ) { TDThrow(_T("Create a DInput object error:%08X"), hr); return; } // Create the keyboard device hr = m_pDI->CreateDevice(GUID_SysKeyboard, &m_lpDIDKeyboard, NULL); if(hr == DI_OK) { m_lpDIDKeyboard->SetDataFormat(&c_dfDIKeyboard); m_lpDIDKeyboard->SetCooperativeLevel(g_hMainWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND); AcquireKeyboard(); } }
VOID CGameProcedure::CreateMainWnd(VOID) { //------------------------------------------------------ //计算窗口大小 m_bMinimized = FALSE; m_bFullScreen = TRUE; fVector2 fResoution; if (CGameProcedure::s_pVariableSystem->GetAs_Int("View_FullScreen")) { fResoution.x = (float)::GetSystemMetrics(SM_CXSCREEN); fResoution.y = (float)::GetSystemMetrics(SM_CYSCREEN); } else { fResoution = s_pVariableSystem->GetAs_Vector2("View_Resoution"); } CGameProcedure::m_fWindowFOV = fResoution.x / fResoution.y; SetRect(&m_rectWindow, 0, 0, (int)fResoution.x, (int)fResoution.y); AdjustWindowRect(&m_rectWindow, DEFWINDOW_STYLE, FALSE); SetRect(&m_rectFCOffset, m_rectWindow.left, m_rectWindow.top, m_rectWindow.right-(int)fResoution.x, m_rectWindow.bottom-(int)fResoution.y); UINT dwX = (::GetSystemMetrics(SM_CXFULLSCREEN)-(m_rectWindow.right-m_rectWindow.left))/2; UINT dwY = (::GetSystemMetrics(SM_CYFULLSCREEN)-(m_rectWindow.bottom-m_rectWindow.top))/2; OffsetRect(&m_rectWindow, -m_rectFCOffset.left, -m_rectFCOffset.top); OffsetRect(&m_rectWindow, dwX, dwY); m_bActive = true; m_bRenderingPaused = FALSE; //------------------------------------------------------ //注册窗口类 WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wcex.lpfnWndProc = (WNDPROC)_MainWndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = g_hInstance; wcex.hIcon = LoadIcon(g_hInstance, (LPCTSTR)IDD_GAME_DIALOG); wcex.hCursor = LoadCursor( NULL, IDC_ARROW ); wcex.hbrBackground = (HBRUSH)NULL; //GetStockObject(WHITE_BRUSH); wcex.lpszMenuName = (LPCTSTR)NULL; wcex.lpszClassName = MAINWINDOW_CLASS; wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); RegisterClassEx(&wcex); //------------------------------------------------------ //创建窗口 CHAR szTitle[MAX_PATH]; _snprintf(szTitle, MAX_PATH, "%s %s (%s %s)", GAME_TITLE, VERSION_INFO, __DATE__, __TIME__); HWND hWnd = CreateWindowEx(NULL, MAINWINDOW_CLASS, szTitle, DEFWINDOW_STYLE, m_rectWindow.left, m_rectWindow.top, m_rectWindow.right-m_rectWindow.left, m_rectWindow.bottom-m_rectWindow.top, NULL, NULL, g_hInstance, NULL); if (!hWnd) { TDThrow(_T("Can't create main window!")); } if (CGameProcedure::s_pVariableSystem->GetAs_Int("View_FullScreen")) { s_pEventSystem->PushEvent(GE_VARIABLE_CHANGED, "View_FullScreen", "1"); s_pEventSystem->PushEvent(GE_CHAT_ADJUST_MOVE_CTL, (INT)fResoution.x, (INT)fResoution.y); }else { const STRING& strVariable = CGameProcedure::s_pVariableSystem->GetAs_String("View_Resoution"); s_pEventSystem->PushEvent(GE_VARIABLE_CHANGED,"View_Resoution", strVariable.c_str()); s_pEventSystem->PushEvent(GE_CHAT_ADJUST_MOVE_CTL, (INT)fResoution.x, (INT)fResoution.y); } ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); g_hMainWnd = hWnd; }
//设置是否可见 VOID CRFObj_Dummy::SetVisible(BOOL bVisible) { TDThrow("Not support!"); }
uint GCNewPet_MoveHandler::Execute( GCNewPet_Move* pPacket, Player* pPlayer ) { //当前流程是主流程 if(CGameProcedure::GetActiveProcedure() == (CGameProcedure*)CGameProcedure::s_pProcMain) { CObjectManager* pObjectManager = CObjectManager::GetMe(); //检查位置是否合法 if(!CWorldManager::GetMe()->GetActiveScene()->IsValidPosition(fVector2(pPacket->getWorldPos().m_fX, pPacket->getWorldPos().m_fZ))) { TDThrow("ERROR POSITION @ GCNewMonster_MoveHandler"); } if(!CWorldManager::GetMe()->GetActiveScene()->IsValidPosition(fVector2(pPacket->getTargetPos().m_fX, pPacket->getTargetPos().m_fZ))) { TDThrow("ERROR POSITION @ GCNewMonster_MoveHandler target"); } //创建玩家 CObject_PlayerNPC* pNPC = (CObject_PlayerNPC*)pObjectManager->FindServerObject( (INT)pPacket->getObjID() ); fVector3 fvGame; CGameProcedure::s_pGfxSystem->Axis_Trans( CRenderSystem::AX_PLAN, fVector3(pPacket->getWorldPos().m_fX, 0.0f, pPacket->getWorldPos().m_fZ), CRenderSystem::AX_GAME, fvGame); if ( pNPC == NULL ) { pNPC = pObjectManager->NewPlayerNPC( (INT)pPacket->getObjID() ); SObjectInit initPlayerNPC; initPlayerNPC.m_fvPos = fvGame; initPlayerNPC.m_fvRot = fVector3( 0.f, 0.f, 0.f ); pNPC->Initial( &initPlayerNPC ); } else { fVector2 mapPos(fvGame.x, fvGame.z); pNPC->SetMapPosition(mapPos); pNPC->Enable( OSF_VISIABLE ); pNPC->Disalbe( OSF_OUT_VISUAL_FIELD ); } pNPC->SetNpcType(NPC_TYPE_PET); pNPC->GetCharacterData()->Set_MoveSpeed(pPacket->getMoveSpeed()); // move to command { WORLD_POS posTarget; posTarget.m_fX = pPacket->getTargetPos().m_fX; posTarget.m_fZ = pPacket->getTargetPos().m_fZ; SCommand_Object cmdTemp; cmdTemp.m_wID = OC_MOVE; cmdTemp.m_auParam[0] = 0; cmdTemp.m_anParam[1] = pPacket->getHandleID(); cmdTemp.m_anParam[2] = 1; cmdTemp.m_apParam[3] = &posTarget; pNPC->PushCommand(&cmdTemp ); } //放入Ask队列 CObjectManager::GetMe()->GetLoadQueue()->TryAddLoadTask(pNPC->GetID(), CObject_Character::CT_MONSTER); // tempcode{ // 此版不做服务器繁忙客户端延后发消息的处理 // CGCharAskBaseAttrib msgAskBaseAttrib; // msgAskBaseAttrib.setTargetID( (INT)pPacket->getObjID() ); // CNetManager::GetMe()->SendPacket( &msgAskBaseAttrib ); // } //同步渲染层 char szTemp[MAX_PATH]; _snprintf(szTemp, MAX_PATH, "GCNewPet_Move(%.1f,%.1f)", pPacket->getWorldPos().m_fX, pPacket->getWorldPos().m_fZ); pNPC->PushDebugString(szTemp); pNPC->SetMsgTime(CGameProcedure::s_pTimeSystem->GetTimeNow()); } return PACKET_EXE_CONTINUE ; }
//获得玩家信息 INT SystemSetup::Lua_SetPrivateInfo(LuaPlus::LuaState* state) { LuaPlus::LuaStack args(state); if (!(args[2].IsString())) { TDThrow("SystemSetup::Lua_SetPrivateInfo[2] param parameter error"); } if (!(args[3].IsString())) { TDThrow("SystemSetup::Lua_SetPrivateInfo[3] param parameter error"); } //std::string strWho = args[2].GetString(); //std::string str = args[3].GetString(); //std::string strDesc; //if ((args[4].IsString())) //{ // strDesc = args[4].GetString(); // //验证商店名称的合法性 // if(!CGameProcedure::s_pUISystem->CheckStringFilter(strDesc)) // { // STRING strTemp = ""; // strTemp = NOCOLORMSGFUNC("ERRORSpecialString"); // CGameProcedure::s_pEventSystem->PushEvent( GE_NEW_DEBUGMESSAGE, strTemp.c_str()); // strDesc = ""; // state->PushInteger(0); // return 1; // } //} //if( strWho == "self" ) //{ // if( str == "type" ) // { // CDataPool::GetMe()->PI_SetMyInfoType(args[4].GetInteger() ); // } // else if( str == "age" ) // { // CDataPool::GetMe()->PI_SetMyAge((args[4].GetInteger()==-1) ? 0 : args[4].GetInteger()); // } // else if( str == "sex" ) // { // CDataPool::GetMe()->PI_SetMySex((args[4].GetInteger()==-1) ? 0 : args[4].GetInteger()); // } // else if( str == "job" ) // { // CDataPool::GetMe()->PI_SetMyJobInfo(args[4].GetString()); // } // else if( str == "school" ) // { // CDataPool::GetMe()->PI_SetMySchoolInfo(args[4].GetString()); // } // else if( str == "blood" ) // { // CDataPool::GetMe()->PI_SetMyBloodType((args[4].GetInteger()==-1) ? 0 : args[4].GetInteger()); // } // else if( str == "animal" ) // { // CDataPool::GetMe()->PI_SetMyYearAnimal((args[4].GetInteger()==-1) ? 0 : args[4].GetInteger()); // } // else if( str == "Consella" ) // { // CDataPool::GetMe()->PI_SetMyConsella((args[4].GetInteger()==-1) ? 0 : args[4].GetInteger()); // } // else if( str == "Province" ) // { // CDataPool::GetMe()->PI_SetMyProvince((args[4].GetInteger()==-1) ? 0 : args[4].GetInteger()); // } // else if( str == "city" ) // { // CDataPool::GetMe()->PI_SetMyCity(args[4].GetString()); // } // else if( str == "email" ) // { // CDataPool::GetMe()->PI_SetMyEmailInfo(args[4].GetString()); // } // else if( str == "luck" ) // { // CDataPool::GetMe()->PI_SetMyLuckWord(args[4].GetString()); // } //} //else //{ // if( str == "type" ) // { // CDataPool::GetMe()->PI_SetOtInfoType(args[4].GetInteger()); // } // else if( str == "age" ) // { // CDataPool::GetMe()->PI_SetOtAge(args[4].GetInteger()); // } // else if( str == "sex" ) // { // CDataPool::GetMe()->PI_SetOtSex(args[4].GetInteger()); // } // else if( str == "job" ) // { // CDataPool::GetMe()->PI_SetOtJobInfo(args[4].GetString()); // } // else if( str == "school" ) // { // CDataPool::GetMe()->PI_SetOtSchoolInfo(args[4].GetString()); // } // else if( str == "blood" ) // { // CDataPool::GetMe()->PI_SetOtBloodType(args[4].GetInteger()); // } // else if( str == "animal" ) // { // CDataPool::GetMe()->PI_SetOtYearAnimal(args[4].GetInteger()); // } // else if( str == "Consella" ) // { // CDataPool::GetMe()->PI_SetOtConsella(args[4].GetInteger()); // } // else if( str == "Province" ) // { // CDataPool::GetMe()->PI_SetOtProvince(args[4].GetInteger()); // } // else if( str == "city" ) // { // CDataPool::GetMe()->PI_SetOtCity(args[4].GetString()); // } // else if( str == "email" ) // { // CDataPool::GetMe()->PI_SetOtEmailInfo(args[4].GetString()); // } // else if( str == "luck" ) // { // CDataPool::GetMe()->PI_SetOtLuckWord(args[4].GetString()); // } //} //state->PushInteger(1); return 0; }
VOID CNetManager::WaitConnecting(VOID) { //监测登录线程是否结束 int nExitCode = 0; if(::GetExitCodeThread(m_hConnectThread, (DWORD*)&nExitCode)) { } //登录线程未结束 if( STILL_ACTIVE == nExitCode) { //检查是否超时 UINT dwTimeNow = CGameProcedure::s_pTimeSystem->GetTimeNow(); UINT dwUsed = CGameProcedure::s_pTimeSystem->CalSubTime(m_timeConnectBegin, dwTimeNow); //超时 if(dwUsed >= MAX_CONNECT_TIME) { //强制结束登录线程 TerminateThread(m_hConnectThread, 0); nExitCode = -3; } //继续等待 else { return; } } //登录线程已经结束 关闭句柄 if(CloseHandle(m_hConnectThread)) { m_hConnectThread = NULL; } //登录过程中发生错误 if(nExitCode < 0) { //LPCTSTR szErrorDesc; switch(nExitCode) { case -1: { SetNetStatus(CONNECT_FAILED_CREATE_SOCKET_ERROR); CGameProcedure::s_pEventSystem->PushEvent(GE_NET_CLOSE, "创建网络连接失败!"); break; } case -2: { SetNetStatus(CONNECT_FAILED_CONNECT_ERROR); CGameProcedure::s_pEventSystem->PushEvent(GE_NET_CLOSE, "目的服务器可能关闭!"); break; } case -3: { SetNetStatus(CONNECT_FAILED_TIME_OUT); CGameProcedure::s_pEventSystem->PushEvent(GE_NET_CLOSE, "连接超时!"); break; } default: { SetNetStatus(CONNECT_FAILED_CONNECT_ERROR); CGameProcedure::s_pEventSystem->PushEvent(GE_NET_CLOSE, "未知错误!"); break; } } this->Close(); return; } //连接成功后设置为非阻塞模式和设置Linger参数 if(!m_Socket.setNonBlocking() || !m_Socket.setLinger(0)) { SetNetStatus(CONNECT_FAILED_CONNECT_ERROR); TDThrow(_T("(CNetManager::Tick)SetSocket Error")); return; } //通知登录流程,SOCKET连接成功 if(CGameProcedure::GetActiveProcedure() == (CGameProcedure*)CGameProcedure::s_pProcLogIn) { CGameProcedure::s_pProcLogIn->SendClConnectMsg(); SetNetStatus(CONNECT_SUCESS);// } else if(CGameProcedure::GetActiveProcedure() == (CGameProcedure*)CGameProcedure::s_pProcChangeScene) { SetNetStatus(CONNECT_SUCESS);// } return; }
BOOL CRenderSystem::Axis_Trans( AXIS_TYPE typeSource, const fVector3& fvSource, AXIS_TYPE typeTar, fVector3& fvTarget) { register WX::TerrainData* pTerrainData = m_pRenderSystem->getTerrainData(); //尚未加载 if(pTerrainData && (pTerrainData->getXSize()==0 || pTerrainData->getZSize()==0)) { pTerrainData = 0; } fVector3 fvScale = GetSacle(); //检查是否是合法的坐标 fvTarget = fvSource; if(!Axis_CheckValid(typeSource, fvSource)) return FALSE; if(typeSource == typeTar) return TRUE; switch(typeSource) { //----------------------------------------------- case AX_GAME: { if(AX_PLAN==typeTar) return TRUE; else if(AX_GFX == typeTar) { if(pTerrainData) { fvTarget.x = pTerrainData->mPosition.x + (FLOAT)fvSource.x * pTerrainData->mScale.x; fvTarget.y = pTerrainData->mPosition.y + (FLOAT)fvSource.y * pTerrainData->mScale.y; fvTarget.z = pTerrainData->mPosition.z + (FLOAT)fvSource.z * pTerrainData->mScale.z; } else { fvTarget.x = (FLOAT)fvSource.x * fvScale.x; fvTarget.y = (FLOAT)fvSource.y * fvScale.y; fvTarget.z = (FLOAT)fvSource.z * fvScale.z; } return TRUE; } else if(AX_SCREEN==typeTar) { TDThrow("(AX_GAME->AX_SCREEN) Not support yet!"); } } break; //----------------------------------------------- case AX_PLAN: { if(!pTerrainData) return FALSE; FLOAT fGfxX = pTerrainData->mPosition.x + (FLOAT)fvSource.x * pTerrainData->mScale.x; FLOAT fGfxZ = pTerrainData->mPosition.z + (FLOAT)fvSource.z * pTerrainData->mScale.z; if(AX_GAME==typeTar) { //取得相地形高度作为Y坐标(游戏坐标) fvTarget.y = (pTerrainData->getHeightAtGrid(fvSource.x, fvSource.z)-pTerrainData->mPosition.y)/ pTerrainData->mScale.y; return TRUE; } else if(AX_GFX == typeTar) { //取得相地形高度作为Y坐标 fvTarget.x = fGfxX; fvTarget.z = fGfxZ; fvTarget.y = pTerrainData->getHeightAtGrid(fvSource.x, fvSource.z); return TRUE; } else if(AX_SCREEN==typeTar) { TDThrow("(AX_PLAN->AX_SCREEN) Not support yet!"); } } break; //----------------------------------------------- case AX_GFX: { if(AX_GAME==typeTar || AX_PLAN==typeTar) { if(pTerrainData) { fvTarget.x = (fvSource.x-pTerrainData->mPosition.x)/pTerrainData->mScale.x; fvTarget.y = (fvSource.y-pTerrainData->mPosition.y)/pTerrainData->mScale.y; fvTarget.z = (fvSource.z-pTerrainData->mPosition.z)/pTerrainData->mScale.z; } else { fvTarget.x = (fvSource.x)/fvScale.x; fvTarget.y = (fvSource.y)/fvScale.y; fvTarget.z = (fvSource.z)/fvScale.z; } return TRUE; } else if(AX_SCREEN==typeTar) { //TDThrow("(AX_GFX->AX_SCREEN) Not support yet!"); if(!pTerrainData) return FALSE; //得到Ogre相机 Ogre::Camera* pOgreCamera = m_pCamera_Current->GetOgreCamera(); if(!pOgreCamera) return FALSE; if(!(pOgreCamera->isVisible(Ogre::Vector3(fvSource.x, fvSource.y, fvSource.z)))) return FALSE; // x:[-1w, 1w] z:[-1h, 1h] Ogre::Vector3 vRet = pOgreCamera->getProjectionMatrix()* pOgreCamera->getViewMatrix() * Ogre::Vector3(fvSource.x, fvSource.y, fvSource.z); int nWidth = m_pRenderSystem->getViewport()->getActualWidth(); int nHeight = m_pRenderSystem->getViewport()->getActualHeight(); fvTarget.x = (( vRet.x + 1.0f)*nWidth/2.0f); fvTarget.y = ((-vRet.y + 1.0f)*nHeight/2.0f); return TRUE; } } break; //----------------------------------------------- case AX_SCREEN: { if(!pTerrainData) return FALSE; Ogre::Vector3 vRenderPos; BOOL bRet = m_pRenderSystem->getTerrainIntersects(WX::Point((INT)fvSource.x, fvSource.y), vRenderPos); if(!bRet) return FALSE; if(AX_GAME==typeTar || AX_PLAN==typeTar) { return Axis_Trans(AX_GFX, fVector3(vRenderPos.x, vRenderPos.y, vRenderPos.z), AX_GAME, fvTarget); } else if(AX_GFX==typeTar) { fvTarget = fVector3(vRenderPos.x, vRenderPos.y, vRenderPos.z); return TRUE; } } break; } return FALSE; }
//获得玩家信息 INT SystemSetup::Lua_GetPrivateInfo(LuaPlus::LuaState* state) { LuaPlus::LuaStack args(state); if (!(args[2].IsString())) { TDThrow("SystemSetup::Lua_GetPrivateInfo[2] param parameter error"); } if (!(args[3].IsString())) { TDThrow("SystemSetup::Lua_GetPrivateInfo[3] param parameter error"); } //std::string strWho = args[2].GetString(); //std::string str = args[3].GetString(); //if( strWho == "self" ) //{ // if( str == "type" ) // { // state->PushInteger(CDataPool::GetMe()->PI_GetMyInfoType()); // } // else if( str == "guid" ) // { // CHAR szTemp[16] = {0}; // _snprintf(szTemp, 16, "%X",CDataPool::GetMe()->PI_GetMyCharGUID()); // state->PushString(szTemp); // } // else if( str == "age" ) // { // state->PushInteger(CDataPool::GetMe()->PI_GetMyAge()); // } // else if( str == "sex" ) // { // state->PushInteger(CDataPool::GetMe()->PI_GetMySex()); // } // else if( str == "job" ) // { // state->PushString(CDataPool::GetMe()->PI_GetMyJobInfo()); // } // else if( str == "school" ) // { // state->PushString(CDataPool::GetMe()->PI_GetMySchoolInfo()); // } // else if( str == "blood" ) // { // state->PushInteger(CDataPool::GetMe()->PI_GetMyBloodType()); // } // else if( str == "animal" ) // { // state->PushInteger(CDataPool::GetMe()->PI_GetMyYearAnimal()); // } // else if( str == "Consella" ) // { // state->PushInteger(CDataPool::GetMe()->PI_GetMyConsella()); // } // else if( str == "Province" ) // { // state->PushInteger(CDataPool::GetMe()->PI_GetMyProvince()); // } // else if( str == "city" ) // { // state->PushString(CDataPool::GetMe()->PI_GetMyCity()); // } // else if( str == "email" ) // { // state->PushString(CDataPool::GetMe()->PI_GetMyEmailInfo()); // } // else if( str == "luck" ) // { // state->PushString(CDataPool::GetMe()->PI_GetMyLuckWord()); // } // else if( str == "name" ) // { // state->PushString(CObjectManager::GetMe()->GetMySelf()->GetCharacterData()->Get_Name()); // } // else // { // state->PushInteger(0); // } //} //else //{ // if( str == "type" ) // { // state->PushInteger(CDataPool::GetMe()->PI_GetOtInfoType()); // } // else if( str == "guid" ) // { // CHAR szTemp[16]; // _snprintf(szTemp, 16, "%X",CDataPool::GetMe()->PI_GetOtCharGUID()); // state->PushString(szTemp); // } // else if( str == "age" ) // { // state->PushInteger(CDataPool::GetMe()->PI_GetOtAge()); // } // else if( str == "sex" ) // { // state->PushInteger(CDataPool::GetMe()->PI_GetOtSex()); // } // else if( str == "job" ) // { // state->PushString(CDataPool::GetMe()->PI_GetOtJobInfo()); // } // else if( str == "school" ) // { // state->PushString(CDataPool::GetMe()->PI_GetOtSchoolInfo()); // } // else if( str == "blood" ) // { // state->PushInteger(CDataPool::GetMe()->PI_GetOtBloodType()); // } // else if( str == "animal" ) // { // state->PushInteger(CDataPool::GetMe()->PI_GetOtYearAnimal()); // } // else if( str == "Consella" ) // { // state->PushInteger(CDataPool::GetMe()->PI_GetOtConsella()); // } // else if( str == "Province" ) // { // state->PushInteger(CDataPool::GetMe()->PI_GetOtProvince()); // } // else if( str == "city" ) // { // state->PushString(CDataPool::GetMe()->PI_GetOtCity()); // } // else if( str == "email" ) // { // state->PushString(CDataPool::GetMe()->PI_GetOtEmailInfo()); // } // else if( str == "luck" ) // { // state->PushString(CDataPool::GetMe()->PI_GetOtLuckWord()); // } // else if( str == "name" ) // { // state->PushString(CDataPool::GetMe()->PI_GetOtName()); // } // else // { // state->PushInteger(0); // } //} return 0; }
//获得视频设置数据 INT SystemSetup::Lua_View_GetData(LuaPlus::LuaState* state) { LuaPlus::LuaStack args(state); if (!(args[2].IsString())) { TDThrow("SystemSetup::View_GetData[2] param parameter error"); } std::string str = args[2].GetString(); if(str == "dxyy") //地形阴影 { INT fTemp = CGameProcedure::s_pVariableSystem->GetAs_Int("View_LightmapQuality"); state->PushNumber(fTemp); } else if(str == "fhj") //反混角 { INT nTemp = CGameProcedure::s_pVariableSystem->GetAs_Int("View_Fanhunjiao"); state->PushNumber(nTemp); } else if(str == "wtdh") //物体动画 { INT nTemp = CGameProcedure::s_pVariableSystem->GetAs_Int("View_ObjectMove"); state->PushNumber(nTemp); } else if(str == "gamma") //gamma调整 { INT nTemp = CGameProcedure::s_pVariableSystem->GetAs_Int("View_Gamma"); state->PushNumber(nTemp); } else if(str == "yszl") //颜色质量 { INT nTemp = CGameProcedure::s_pVariableSystem->GetAs_Int("View_ColorQuality"); state->PushNumber(nTemp); } else if(str == "wldx") //纹理大小 { INT nTemp = CGameProcedure::s_pVariableSystem->GetAs_Int("View_TextureQuality"); state->PushNumber(nTemp); } else if(str == "cy") //采样 { INT nTemp = CGameProcedure::s_pVariableSystem->GetAs_Int("View_TextureFiltering"); state->PushNumber(nTemp); } else if(str == "dbxs") //多边形数 { INT nTemp = CGameProcedure::s_pVariableSystem->GetAs_Int("View_PolygonQuantity"); state->PushNumber(nTemp); } else if(str == "dxgg") //地形高光 { INT nTemp = CGameProcedure::s_pVariableSystem->GetAs_Int("View_GroundHighLight"); state->PushNumber(nTemp); } else if(str == "rwgg") //人物高光 { INT nTemp = CGameProcedure::s_pVariableSystem->GetAs_Int("View_HumanHighLight"); state->PushNumber(nTemp); } else if(str == "rwyy") //人物阴影 { INT nTemp = CGameProcedure::s_pVariableSystem->GetAs_Int("View_HumanLightmap"); state->PushNumber(nTemp); } else if(str == "qpfg") //全屏泛光 { INT nTemp = CGameProcedure::s_pVariableSystem->GetAs_Int("View_FullScreenLight"); state->PushNumber(nTemp); } else if(str == "cztb") //垂直同步 { INT nTemp = CGameProcedure::s_pVariableSystem->GetAs_Int("View_Aplomb"); state->PushNumber(nTemp); } else if(str == "sdh") //水动画 { INT nTemp = CGameProcedure::s_pVariableSystem->GetAs_Int("View_WaterMove"); state->PushNumber(nTemp); } else if(str == "qpms") //全屏模式 { INT nTemp = CGameProcedure::s_pVariableSystem->GetAs_Int("View_FullScreen"); state->PushNumber(nTemp); } return 1; }
//设置视频数据 INT SystemSetup::Lua_View_SetData(LuaPlus::LuaState* state) { LuaPlus::LuaStack args(state); if (!(args[2].IsString())) { TDThrow("SystemSetup::View_SetData[2] param parameter error"); } if (!(args[3].IsInteger())) { TDThrow("SystemSetup::View_SetData[3] param parameter error"); } std::string str = args[2].GetString(); INT fTemp = args[3].GetInteger(); if(str == "dxyy") //地形阴影 { CGameProcedure::s_pVariableSystem->SetAs_Int("View_LightmapQuality",fTemp,FALSE); } else if(str == "fhj") //反混角 { CGameProcedure::s_pVariableSystem->SetAs_Int("View_Fanhunjiao",fTemp,FALSE); } else if(str == "wtdh") //物体动画 { CGameProcedure::s_pVariableSystem->SetAs_Int("View_ObjectMove",fTemp,FALSE); } else if(str == "gamma") //gamma调整 { CGameProcedure::s_pVariableSystem->SetAs_Int("View_Gamma",fTemp,FALSE); } else if(str == "yszl") //颜色质量 { CGameProcedure::s_pVariableSystem->SetAs_Int("View_ColorQuality",fTemp,FALSE); } else if(str == "wldx") //纹理大小 { CGameProcedure::s_pVariableSystem->SetAs_Int("View_TextureQuality",fTemp,FALSE); } else if(str == "cy") //采样 { CGameProcedure::s_pVariableSystem->SetAs_Int("View_TextureFiltering",fTemp,FALSE); } else if(str == "dbxs") //多边形数 { CGameProcedure::s_pVariableSystem->SetAs_Int("View_PolygonQuantity",fTemp,FALSE); } else if(str == "dxgg") //地形高光 { CGameProcedure::s_pVariableSystem->SetAs_Int("View_GroundHighLight",fTemp,FALSE); } else if(str == "rwgg") //人物高光 { CGameProcedure::s_pVariableSystem->SetAs_Int("View_HumanHighLight",fTemp,FALSE); } else if(str == "rwyy") //人物阴影 { CGameProcedure::s_pVariableSystem->SetAs_Int("View_HumanLightmap",fTemp,FALSE); } else if(str == "qpfg") //全屏泛光 { CGameProcedure::s_pVariableSystem->SetAs_Int("View_FullScreenLight",fTemp,FALSE); } else if(str == "cztb") //垂直同步 { CGameProcedure::s_pVariableSystem->SetAs_Int("View_Aplomb",fTemp,FALSE); } else if(str == "sdh") //水动画 { CGameProcedure::s_pVariableSystem->SetAs_Int("View_WaterMove",fTemp,FALSE); } else if(str == "qpms") //全屏模式 { char szTemp[MAX_PATH]; _snprintf(szTemp, MAX_PATH, "%d",fTemp); CGameProcedure::s_pVariableSystem->SetVariableDelay("View_FullScreen",szTemp); } return 0; }
//g_DemandItem={{id=20004008,num=1},{id=20004009,num=1}} void parseDemandItem(CHAR** pDest,CHAR* pSrc,INT j) { CHAR* pCur = strchr(pSrc,'='); if(!pCur) TDThrow("策划写错了这个脚本:%s", pSrc); strcpy(*pDest,tokens[j]); CHAR* pNow = *pDest + strlen(tokens[j]); int count = 0; int digit = 1; int itemId = 0; int itemCount = 0; while(pCur++) { if(*pCur == '{') { digit = 1; count++; } else if(*pCur == '}') { digit = 1; count--; if(count == 0) break; } if(digit == 1 && isdigit(*pCur)) { digit = 2; itemId = atoi(pCur); *pNow++=*pCur; } else if(digit == 3 && isdigit(*pCur)) { digit = 4; itemCount = atoi(pCur); tObject_Item* pItem = CObject_Item::NewItem(itemId); if(!pItem) { TDThrow("非法的奖励物品ID:%d", itemId); } _MISSION_INFO::QuestDemandItem newDemandItem; newDemandItem.pDemandItem = new SMissionBonusItem; newDemandItem.pDemandItem->m_uItemID = itemId; newDemandItem.pDemandItem->m_yCount = itemCount; pItem->SetTypeOwner(tObject_Item::IO_QUESTVIRTUALITEM); newDemandItem.pItemImpl = pItem; misInfo->m_vecQuestDemandItem.push_back(newDemandItem); *pNow++=*pCur; } else if(digit && (*pCur == ',')) { digit = 3; *pNow++=','; } } }
void parseRadioItemBonus(CHAR** pDest,CHAR* pSrc,INT j) { CHAR* pCur = strchr(pSrc,'='); if(!pCur) TDThrow("策划写错了这个脚本:%s", pSrc); strcpy(*pDest,tokens[j]); CHAR* pNow = *pDest + strlen(tokens[j]); int count = 0; int digit = 1; int itemId = 0; int itemCount = 0; while(pCur++) { if(*pCur == '{') { digit = 1; count++; } else if(*pCur == '}') { digit = 1; count--; if(count == 0) break; } if(digit == 1 && isdigit(*pCur)) { itemId = atoi(pCur); digit = 2; *pNow++=*pCur; } else if(digit == 3 && isdigit(*pCur)) { digit = 4; itemCount = atoi(pCur); //以后考虑内存池 SMissionBonus* rewardItem = new SMissionBonus; rewardItem->m_ItemBonus.m_uItemID = itemId; rewardItem->m_ItemBonus.m_yCount = itemCount; rewardItem->m_nType = MISSION_BONUS_TYPE_ITEM_RADIO; tObject_Item* pItem = CObject_Item::NewItem(itemId); if(!pItem) { TDThrow("非法的奖励物品ID:%d", itemId); } _MISSION_INFO::QuestRewardItem newRewardItem; // CActionSystem::GetMe()->UpdateAction_FromItem(pItem); newRewardItem.pItemData = rewardItem; pItem->SetTypeOwner(tObject_Item::IO_QUESTVIRTUALITEM); newRewardItem.pItemImpl = pItem; newRewardItem.bSelected = FALSE; misInfo->m_vecQuestRewardItem.push_back(newRewardItem); *pNow++=*pCur; } else if(digit && (*pCur == ',')) { *pNow++=','; digit = 3; } } }
uint GCNewPlayerHandler :: Execute( GCNewPlayer* pPacket, Player* pPlayer ) { //__ENTER_FUNCTION //当前流程是主流程 if(CGameProcedure::GetActiveProcedure() == (CGameProcedure*)CGameProcedure::s_pProcMain) { CObjectManager* pObjectManager = CObjectManager::GetMe(); //检查位置是否合法 if(!CWorldManager::GetMe()->GetActiveScene()->IsValidPosition(fVector2(pPacket->getWorldPos().m_fX, pPacket->getWorldPos().m_fZ))) { TDThrow("ERROR POSITION @ GCNewPlayerHandler"); } //创建玩家 CObject_PlayerOther* pOther = (CObject_PlayerOther*)(pObjectManager->FindServerObject( (INT)pPacket->getObjID())); fVector3 fvGame; CGameProcedure::s_pGfxSystem->Axis_Trans( CRenderSystem::AX_PLAN, fVector3(pPacket->getWorldPos().m_fX, 0.0f, pPacket->getWorldPos().m_fZ), CRenderSystem::AX_GAME, fvGame); FLOAT fFaceDir = pPacket->getDir(); if ( pOther == NULL ) { pOther = pObjectManager->NewPlayerOther( (INT)pPacket->getObjID() ); SObjectInit initPlayerOther; initPlayerOther.m_fvPos = fvGame; initPlayerOther.m_fvRot = fVector3( 0.f, fFaceDir, 0.f ); pOther->Initial( &initPlayerOther ); fVector2 mapPos(fvGame.x, fvGame.z); pOther->SetMapPosition( mapPos ); } else { fVector2 mapPos(fvGame.x, fvGame.z); pOther->SetMapPosition( mapPos ); pOther->SetFaceDir( fFaceDir ); pOther->Enable( OSF_VISIABLE ); pOther->Disalbe( OSF_OUT_VISUAL_FIELD ); } //更新装备信息 pOther->GetCharacterData()->Set_EquipVer(pPacket->getEquipVer()); pOther->GetCharacterData()->Set_MoveSpeed(pPacket->getMoveSpeed()); ////激活鼠标查询 //if(pOther->GetRenderInterface()) //{ // pOther->Enable(OSF_RAY_QUERY); //} SCommand_Object cmdTemp; cmdTemp.m_wID = OC_IDLE; cmdTemp.m_afParam[0] = fvGame.x; cmdTemp.m_afParam[1] = fvGame.z; cmdTemp.m_abParam[2] = FALSE; pOther->PushCommand(&cmdTemp ); //放入Ask队列 CObjectManager::GetMe()->GetLoadQueue()->TryAddLoadTask(pOther->GetID(), CObject_Character::CT_PLAYEROTHER); // tempcode{ // 此版不做服务器繁忙客户端延后发消息的处理 // CGCharAskBaseAttrib msgAskBaseAttrib; // msgAskBaseAttrib.setTargetID( (INT)pPacket->getObjID() ); // CNetManager::GetMe()->SendPacket( &msgAskBaseAttrib ); //AxTrace(0, 0, "[%d]Ask %d", m_hmObject.size(), pPacket->getObjID()); // } //如果是自己,退出死亡效果 if(pOther == (CObject_PlayerOther*)pObjectManager->GetMySelf()) { CGameProcedure::s_pGfxSystem->Scene_SetPostFilter_Death(FALSE); } pOther->PushDebugString("GCNewPlayer"); pOther->SetMsgTime(CGameProcedure::s_pTimeSystem->GetTimeNow()); } return PACKET_EXE_CONTINUE ; //__LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint GCNewPlayer_MoveHandler :: Execute( GCNewPlayer_Move* pPacket, Player* pPlayer ) { //__ENTER_FUNCTION //AxTrace(0, 2, "GCNewPlayerHandler"); // return PACKET_EXE_CONTINUE ; //当前流程是主流程 if(CGameProcedure::GetActiveProcedure() == (CGameProcedure*)CGameProcedure::s_pProcMain) { CObjectManager* pObjectManager = CObjectManager::GetMe(); //检查位置是否合法 if(!CWorldManager::GetMe()->GetActiveScene()->IsValidPosition(fVector2(pPacket->getWorldPos().m_fX, pPacket->getWorldPos().m_fZ))) { TDThrow("ERROR POSITION @ GCNewPlayer_MoveHandler"); } //创建玩家 CObject_PlayerOther* pOther = (CObject_PlayerOther*)(pObjectManager->FindServerObject( (INT)pPacket->getObjID() )); fVector3 fvGame; CGameProcedure::s_pGfxSystem->Axis_Trans( CRenderSystem::AX_PLAN, fVector3(pPacket->getWorldPos().m_fX, 0.0f, pPacket->getWorldPos().m_fZ), CRenderSystem::AX_GAME, fvGame); if ( pOther == NULL ) { pOther = pObjectManager->NewPlayerOther( (INT)pPacket->getObjID() ); SObjectInit initPlayerOther; initPlayerOther.m_fvPos = fvGame; pOther->Initial( &initPlayerOther ); } else { fVector2 mapPos(fvGame.x, fvGame.z); pOther->SetMapPosition(mapPos); pOther->Enable( OSF_VISIABLE ); pOther->Disalbe( OSF_OUT_VISUAL_FIELD ); } ////激活鼠标查询 //if(pOther->GetRenderInterface()) //{ // pOther->Enable(OSF_RAY_QUERY); //} //更新装备信息 pOther->GetCharacterData()->Set_EquipVer(pPacket->getEquipVer()); //跟新移动速度 pOther->GetCharacterData()->Set_MoveSpeed(pPacket->getMoveSpeed()); // move to command { WORLD_POS posTarget; posTarget.m_fX = pPacket->getTargetPos().m_fX; posTarget.m_fZ = pPacket->getTargetPos().m_fZ; SCommand_Object cmdTemp; cmdTemp.m_wID = OC_MOVE; cmdTemp.m_auParam[0] = 0; cmdTemp.m_anParam[1] = pPacket->getHandleID(); cmdTemp.m_anParam[2] = 1; cmdTemp.m_apParam[3] = &posTarget; pOther->PushCommand(&cmdTemp ); } //放入Ask队列 CObjectManager::GetMe()->GetLoadQueue()->TryAddLoadTask(pOther->GetID(), CObject_Character::CT_PLAYEROTHER); // tempcode{ // 此版不做服务器繁忙客户端延后发消息的处理 // CGCharAskBaseAttrib msgAskBaseAttrib; // msgAskBaseAttrib.setTargetID( (INT)pPacket->getObjID() ); // CNetManager::GetMe()->SendPacket( &msgAskBaseAttrib ); //AxTrace(0, 0, "[%d]Ask %d", m_hmObject.size(), pPacket->getObjID()); // } pOther->PushDebugString("GCNewPlayer"); pOther->SetMsgTime(CGameProcedure::s_pTimeSystem->GetTimeNow()); } return PACKET_EXE_CONTINUE ; //__LEAVE_FUNCTION return PACKET_EXE_ERROR ; //__ENTER_FUNCTION // AxTrace(0, 2, "GCNewPlayerHandler"); // // //当前流程是主流程 // if(CGameProcedure::GetActiveProcedure() == (CGameProcedure*)CGameProcedure::s_pProcMain) // { // CObjectManager* pObjectManager = CObjectManager::GetMe(); // // //创建玩家 // CObject_PlayerOther* pOther = pObjectManager->CreatePlayerOther( // (INT)pPacket->getObjID(), // (INT)pPacket->getRace(), // pPacket->getEquipVer(), // fVector2(pPacket->getWorldPos().m_fX, pPacket->getWorldPos().m_fZ), // true); // // if(!pOther) return PACKET_EXE_CONTINUE; // // //设置新的位置 // pOther->SetMapPosition(fVector2(pPacket->getWorldPos().m_fX, pPacket->getWorldPos().m_fZ)); // pOther->RegisterToZone(); // //IDLE装态 // pOther->SetMotionStatus(CMS_STATUS_IDLE); // pOther->PushDebugString("GCNewPlayer"); // pOther->SetMsgTime(CGameProcedure::s_pTimeSystem->GetTimeNow()); // } // // return PACKET_EXE_CONTINUE ; // //__LEAVE_FUNCTION // // return PACKET_EXE_ERROR ; }
//处理消息缓冲 VOID CNetManager::ProcessInputStream(SocketInputStream& inputStream) { static USHORT nPacketIDSaved=0; BOOL ret ; char PackCompart[PACKET_HEADER_SIZE]; char header[PACKET_HEADER_SIZE]; PacketID_t packetID; uint packetuint, packetSize, packetIndex; WORD packetTick; Packet* pPacket = NULL ; static PacketID_t packetIDList[10]; static int packetIDListIdx = 0; { for( ;; ) { if( !m_SocketInputStream.Find( PackCompart ) ) {//数据没有消息分隔点 break ; } if( !m_SocketInputStream.Peek(&header[0], PACKET_HEADER_SIZE) ) {//数据不能填充消息头 break ; } ENCRYPT_HEAD(header, LOGIN_TO_CLIENT_KEY)//封包头解密 memcpy( &packetID, &header[0], sizeof(PacketID_t) ) ; memcpy( &packetTick, &header[sizeof(WORD)], sizeof(WORD) ) ; memcpy( &packetuint, &header[sizeof(WORD)+sizeof(PacketID_t)], sizeof(uint) ); packetSize = GET_PACKET_LEN(packetuint) ; packetIndex = GET_PACKET_INDEX(packetuint) ; if( packetID >= (PacketID_t)PACKET_MAX ) {//无效的消息类型 TDU_Log( "Invalid Packet, Old Packet List[%d,%d,%d,%d,%d,%d,%d,%d,%d,%d], Idx=%d", packetIDList[0], packetIDList[1], packetIDList[2], packetIDList[3], packetIDList[4], packetIDList[5], packetIDList[6], packetIDList[7], packetIDList[8], packetIDList[9], packetIDListIdx ); TDU_Log("Invalid Packet[%d]!", packetID); //TDThrow("Invalid Packet[%d]!", packetID); return ; } //消息解密处理--Begin { UINT t_uSize = packetSize+PACKET_HEADER_SIZE; UINT t_uHead = m_SocketInputStream.GetHead(); UINT t_uTail = m_SocketInputStream.GetTail(); UINT t_uBufferLen = m_SocketInputStream.GetBuffLen(); CHAR* t_szBuffer = m_SocketInputStream.GetBuff(); if ( t_uHead < t_uTail ) { ENCRYPT(&t_szBuffer[t_uHead], t_uSize, LOGIN_TO_CLIENT_KEY, 0); } else { UINT rightLen = t_uBufferLen - t_uHead ; if( t_uSize <= rightLen ) { ENCRYPT(&t_szBuffer[t_uHead], t_uSize, LOGIN_TO_CLIENT_KEY, 0); } else { ENCRYPT(&t_szBuffer[t_uHead], rightLen, LOGIN_TO_CLIENT_KEY, 0); ENCRYPT(t_szBuffer, t_uSize-rightLen, LOGIN_TO_CLIENT_KEY, rightLen); } } } //消息解密处理--End { if( m_SocketInputStream.Length()<PACKET_HEADER_SIZE+packetSize ) { //消息没有接收全 break; } if( packetSize>m_PacketFactoryManager.GetPacketMaxSize(packetID) ) { TDU_Log( "Packet size error, Old Packet List[%d,%d,%d,%d,%d,%d,%d,%d,%d,%d], Idx=%d", packetIDList[0], packetIDList[1], packetIDList[2], packetIDList[3], packetIDList[4], packetIDList[5], packetIDList[6], packetIDList[7], packetIDList[8], packetIDList[9], packetIDListIdx ); //消息的大小出现异常,收到的消息比预定义消息的最大值还要大 TDU_Log("Packet size error![ID=%d](%d>%d)", packetID, packetSize, m_PacketFactoryManager.GetPacketMaxSize(packetID)); //TDThrow("Packet size error![ID=%d](%d>%d)", // packetID, packetSize, m_PacketFactoryManager.GetPacketMaxSize(packetID)); // m_SocketInputStream.Skip( PACKET_HEADER_SIZE+packetSize ) ; return ; } Packet* pPacket = m_PacketFactoryManager.CreatePacket( packetID ) ; Assert( pPacket ) ; if( pPacket==NULL ) {//不能分配到足够的内存 TDU_Log( "Create Packet error, Old Packet List[%d,%d,%d,%d,%d,%d,%d,%d,%d,%d], Idx=%d", packetIDList[0], packetIDList[1], packetIDList[2], packetIDList[3], packetIDList[4], packetIDList[5], packetIDList[6], packetIDList[7], packetIDList[8], packetIDList[9], packetIDListIdx ); TDThrow("Create Packet error[%d]!", packetID); // m_SocketInputStream.Skip( PACKET_HEADER_SIZE+packetSize ) ; return ; } //设置消息序列号 pPacket->SetPacketIndex( packetIndex ) ; ret = m_SocketInputStream.ReadPacket( pPacket ) ; if( ret==FALSE ) { //读取消息内容错误 TDU_Log( "Read Packet error, Old Packet List[%d,%d,%d,%d,%d,%d,%d,%d,%d,%d], Idx=%d", packetIDList[0], packetIDList[1], packetIDList[2], packetIDList[3], packetIDList[4], packetIDList[5], packetIDList[6], packetIDList[7], packetIDList[8], packetIDList[9], packetIDListIdx ); TDU_Log("Read Packet error!"); //TDThrow("Read Packet error!"); continue ; } packetIDList[packetIDListIdx++] = packetID; if( packetIDListIdx == 10 ) packetIDListIdx = 0; //消息包执行 ret = executePacket_Gen_Exception(pPacket); if(ret != PACKET_EXE_NOTREMOVE) { m_PacketFactoryManager.RemovePacket( pPacket ) ; } nPacketIDSaved = packetID; } } } }
VOID CDataBaseSystem::OpenAllDataBase(VOID) { //所有需要打开的数据库定义 struct _DATABASE_DEFINE { INT idDatabase; const CHAR* pFileName; }; _DATABASE_DEFINE s_dbToLoad[] = { { DBC_CHARACTER_RACE, "CharRace.txt" }, { DBC_CHARACTER_HAIR_GEO, "CharHairGeo.txt" }, { DBC_CHARACTER_HEAD_GEO, "CharHeadGeo.txt" }, { DBC_CHARACTER_ACTION_SET, "CharActionSet.txt" }, { DBC_CHARACTER_MODEL, "CharModel.txt" }, { DBC_CHARACTER_MOUNT, "CharMount.txt" }, { DBC_MISSION_LIST, "MissionList.txt" }, { DBC_MISSION_DATA, "MissionData.txt" }, { DBC_MISSION_REWARD, "MissionReward.txt" }, { DBC_MISSION_PUNISH, "MissionPunish.txt" }, { DBC_MISSION_DIALOG, "MissionDialog.txt" }, { DBC_CHARACTER_EFFECT, "CharEffect.txt" }, { DBC_CHARACTER_EXPLEVEL, "PlayerExpLevel.txt" }, { DBC_CHARACTER_FACE, "CharacterFace.txt" }, // 头像信息 { DBC_SYSTEM_COLOR, "SystemColour.txt" }, { DBC_CREATURE_ATT, "MonsterAttrExTable.txt"}, { DBC_PET_EX_ATT, "PetAttrTable.txt" }, { DBC_CREATURE_SOUND, "CreatureSound.txt" }, { DBC_ITEM_VISUAL_CHAR, "ItemVisualChar.txt" }, { DBC_ITEM_VISUAL_LOCATOR, "ItemVisualLocator.txt" }, { DBC_ITEM_EQUIP_WHITE, "WhiteEquipBase.txt" }, { DBC_ITEM_EQUIP_GREEN, "GreenEquipBase.txt" }, { DBC_ITEM_EQUIP_BLUE, "BlueEquipBase.txt" }, { DBC_ITEM_MEDIC, "CommonItem.txt" }, { DBC_ITEM_GEM, "GemInfo.txt" }, { DBC_ITEM_STOREMAP, "StoreMapItem.txt" }, { DBC_ITEM_SETATT, "EquipSetAttr.txt" }, { DBC_SOUND_INFO, "SoundInfo.txt" }, { DBC_EFFECT_DEFINE, "EffectDefine.txt" }, { DBC_SKILL_XINFA, "XinFa_V1.txt" }, { DBC_SKILL_ADDIMPACT, "SkillAddImpact.txt" }, { DBC_BUFF_IMPACT, "ImpactSEData_V1.txt" }, { DBC_DIRECTLY_IMPACT, "ImpactDirectly.txt" }, { DBC_BULLET_DATA, "Bullet.txt" }, { DBC_SKILL_DATA, "SkillTemplate_V1.txt" }, { DBC_SKILL_DEPLETE, "SkillDeplete.txt" }, { DBC_SPECIAL_OBJ_DATA, "SpecialObjData.txt" }, { DBC_SCENE_DEFINE, "SceneDefine.txt" }, { DBC_SCENE_POS_DEFINE, "ScenePosDefine.txt" }, { DBC_UI_LAYOUTDEFINE, "Interface.txt" }, { DBC_LIFEABILITY_GROWPOINT, "GrowPoint.txt" }, { DBC_LIFEABILITY_DEFINE, "Ability.txt" }, { DBC_LIFEABILITY_ITEMCOMPOSE, "ItemCompound.txt" }, { DBC_LIFEABILITY_PLATFORM, "Platform.txt" }, { DBC_CODE_CONVERT, "CodeConvert.txt" }, //{ DBC_XINFA_STUDYSPEND, "XinFaStudySpend_V1.txt"}, { DBC_TITLE_NAME, "CharTitle.txt" }, { DBC_SKILLDATA_V1_DEPLETE, "SkillData_V1.txt" }, // 读取skillData_V1.txt; { DBC_MISSION_KIND, "MissionKind.txt" }, { DBC_STRING_DICT, "StrDictionary.txt" }, //字典 { DBC_ITEM_RULE, "ItemRule.txt" }, //物品规则 { DBC_TALK_FILTER, "StrFilter.txt" }, //过滤词汇文件 { DBC_LV_MAXMONEY, "LvMaxMoney.txt" }, //等级金钱对应表 { DBC_TALK_ACT, "ChatMood.txt" }, //聊天动作命令文件 { DBC_TALK_CONFIG, "ChatConfig.txt" }, //聊天配置文件 { DBC_MONSTER_PAOPAO, "MonsterPaoPao.txt" }, //怪物聊天泡泡 { DBC_HAIR_STYLE, "HairStyle.txt" }, //发型消耗表 { DBC_BUILDING_DEINFE, "BuildingDefine.txt" }, //城市建筑物定义表 { DBC_CITY_BUILDING, "CityBuilding.txt" }, //城市建筑物表 { DBC_CAMP_AND_STAND, "CampAndStand.txt" }, //阵营配置表 { DBC_FULLCMP_FILTER, "FullCompareFilter.txt" }, //完全匹配过滤表 { DBC_PET_LEVELUP, "PetLevelUpTable.txt" }, //宠物升级所需经验表 }; //打开所有数据库 INT nNum = sizeof(s_dbToLoad)/sizeof(_DATABASE_DEFINE); for(INT i=0; i<nNum; i++) { CDataBase* pDataBase = new CDataBase(s_dbToLoad[i].idDatabase); if(!(pDataBase->OpenFromTXT (s_dbToLoad[i].pFileName))) { TDThrow("Open %s Error!", s_dbToLoad[i].pFileName); } if(m_mapDataBaseBuf.find(s_dbToLoad[i].idDatabase) != m_mapDataBaseBuf.end()) { TDThrow("DBC ID Multi define(%s)", s_dbToLoad[i].pFileName); } m_mapDataBaseBuf.insert(std::make_pair(s_dbToLoad[i].idDatabase, pDataBase)); } }
INT SystemSetup::Lua_SaveGameSetup(LuaPlus::LuaState* state) { LuaPlus::LuaStack args(state); if (!(args[2].IsInteger())) { TDThrow("SystemSetup::SaveGameSetup[2] param parameter error"); } if (!(args[3].IsInteger())) { TDThrow("SystemSetup::SaveGameSetup[3] param parameter error"); } if (!(args[4].IsInteger())) { TDThrow("SystemSetup::SaveGameSetup[4] param parameter error"); } if (!(args[5].IsInteger())) { TDThrow("SystemSetup::SaveGameSetup[5] param parameter error"); } if (!(args[6].IsInteger())) { TDThrow("SystemSetup::SaveGameSetup[6] param parameter error"); } if (!(args[7].IsInteger())) { TDThrow("SystemSetup::SaveGameSetup[7] param parameter error"); } if (!(args[8].IsInteger())) { TDThrow("SystemSetup::SaveGameSetup[8] param parameter error"); } if (!(args[9].IsInteger())) { TDThrow("SystemSetup::View_SetData[9] param parameter error"); } INT nRefuseAllMail = args[2].GetInteger(); INT nRefuseJoinMeToFriend = args[3].GetInteger(); INT nRefuseStrangerMail = args[4].GetInteger(); INT nRefuseExchange = args[5].GetInteger(); INT nRefuseTeamRequest = args[6].GetInteger(); INT nCloseMyPaopao = args[7].GetInteger(); INT nRefuseSeeMySpouse = args[8].GetInteger(); INT nCloseTalkFrame = args[9].GetInteger(); INT Original = m_GameData; if(nRefuseAllMail == 0) { INT nGsf = 1 << (GSF_CANNOT_RECV_MAIL); m_GameData = ~(nGsf) & m_GameData; } else { INT nGsf = 1 << (GSF_CANNOT_RECV_MAIL); m_GameData = nGsf | m_GameData; } if(nRefuseJoinMeToFriend == 0) { INT nGsf = 1 << (GSF_CANNOT_ADD_FRIEND); m_GameData = ~(nGsf) & m_GameData; } else { INT nGsf = 1 << (GSF_CANNOT_ADD_FRIEND); m_GameData = nGsf | m_GameData; } if(nRefuseStrangerMail == 0) { INT nGsf = 1 << (GSF_CANNOT_RECV_STRANGER_MAIL); m_GameData = ~(nGsf) & m_GameData; } else { INT nGsf = 1<< (GSF_CANNOT_RECV_STRANGER_MAIL); m_GameData = nGsf | m_GameData; } if(nRefuseExchange == 0) { INT nGsf = 1 << (GSF_REFUSE_TRADE); m_GameData = ~(nGsf) & m_GameData; } else { INT nGsf = 1<< (GSF_REFUSE_TRADE); m_GameData = nGsf | m_GameData; } if(nRefuseTeamRequest == 0) { INT nGsf = 1 << (GSF_REFUSE_TEAM_INVITE); m_GameData = ~(nGsf) & m_GameData; } else { INT nGsf = 1<< (GSF_REFUSE_TEAM_INVITE); m_GameData = nGsf | m_GameData; } if(nCloseMyPaopao == 0) { INT nGsf = 1 << (GSF_CLOSE_POPUP); m_GameData = ~(nGsf) & m_GameData; CGameProcedure::s_pUISystem->SetPaoPaoActive(true); } else { INT nGsf = 1<< (GSF_CLOSE_POPUP); m_GameData = nGsf | m_GameData; CGameProcedure::s_pUISystem->SetPaoPaoActive(false); } if(nRefuseSeeMySpouse == 0) { INT nGsf = 1 << (GSF_REFUSE_LOOK_SPOUSE_INFO); m_GameData = ~(nGsf) & m_GameData; } else { INT nGsf = 1<< (GSF_REFUSE_LOOK_SPOUSE_INFO); m_GameData = nGsf | m_GameData; } if(Original != m_GameData) { CGModifySetting msg; _OWN_SETTING* pSend_Value = msg.GetValue(); msg.SetType(SETTING_TYPE_GAME); pSend_Value->m_SettingType = -1; pSend_Value->m_SettingData = m_GameData; //给服务器发送CGMODIFYSETTING CNetManager::GetMe()->SendPacket( &msg ); } return 0; }
//g_DemandKill={{id=66,num=1},{id=56,num=1}} void parseDemandKill(CHAR** pDest,CHAR* pSrc,INT j) { CHAR* pCur = strchr(pSrc,'='); if(!pCur) TDThrow("策划写错了这个脚本:%s", pSrc); strcpy(*pDest,tokens[j]); CHAR* pNow = *pDest + strlen(tokens[j]); int count = 0; int digit = 1; int npcId = 0; int npcCount = 0; while(pCur++) { if(*pCur == '{') { digit = 1; count++; } else if(*pCur == '}') { digit = 1; count--; if(count == 0) break; } if(digit == 1 && isdigit(*pCur)) { digit = 2; npcId = atoi(pCur); *pNow++=*pCur; } else if(digit == 3 && isdigit(*pCur)) { digit = 4; npcCount = atoi(pCur); DBC_DEFINEHANDLE(s_pCreatureDBC, DBC_CREATURE_ATT); //从DBC中查找定义 const _DBC_CREATURE_ATT* pMissionNpc = (const _DBC_CREATURE_ATT*)s_pCreatureDBC->Search_Index_EQU(npcId); _MISSION_INFO::QuestDemandKill newDemandKill; newDemandKill.pDemandKill = new SMissionDemandKill; newDemandKill.pDemandKill->m_uNPCID = npcId; newDemandKill.pDemandKill->m_yCount = npcCount; if(!pMissionNpc) newDemandKill.szNPCName = "???"; else newDemandKill.szNPCName = (STRING)pMissionNpc->pName; misInfo->m_vecQuestDemandKill.push_back(newDemandKill); *pNow++=*pCur; } else if(digit && (*pCur == ',')) { digit = 3; *pNow++=','; } } }
//初始化 VOID CRenderSystem::Initial(VOID* pParam) { #if (_MSC_VER >= 1400) // std::locale langLocale(""); // std::locale::global(langLocale); setlocale( LC_CTYPE, "" ); #endif //--------------------------------------------------------- //取得渲染窗口句柄 TDAssert(pParam); HWND hMainWnd = *((HWND*)pParam); g_hMainWnd = hMainWnd; g_pVaribleSys = (tVariableSystem*)g_pKernel->GetNode("bin\\var"); TDAssert(g_pVaribleSys); g_pEventSys = (tEventSystem*)g_pKernel->GetNode("bin\\event"); TDAssert(g_pEventSys); //--------------------------------------------------------- //初始化RenderSystem m_pRenderSystem->init("WXResources.cfg", "", "", "WXRender.log"); //--------------------------------------------------------- //加载OGRE插件 g_pDebuger = (tDebuger*)g_pKernel->GetNode("bin\\debuger"); g_pSoundSystem = (tSoundSystem*)g_pKernel->GetNode("bin\\snd"); TDAssert(g_pSoundSystem); g_pWorldSystem = (tWorldSystem*)g_pKernel->GetNode("bin\\worldman"); TDAssert(g_pWorldSystem); g_pTimeSystem = (tTimeSystem*)g_pKernel->GetNode("bin\\time"); TDAssert(g_pTimeSystem); g_pResourceProvider = (CResourceProvider*)g_pKernel->GetNode("bin\\resprovider"); TDAssert(g_pResourceProvider); //STRING str = g_pVaribleSys->GetAs_String("Gfx_API"); Ogre::Root* pTheRoot = &(Ogre::Root::getSingleton()); //选择渲染系统 //if(stricmp(g_pVaribleSys->GetAs_String("Gfx_API").c_str(), "Direct3D") == 0) //{ // pTheRoot->loadPlugin("RenderSystem_Direct3D9.dll"); // pTheRoot->setRenderSystem(pTheRoot->getRenderSystemByName("Direct3D9 Rendering Subsystem")); //} //else if(stricmp(g_pVaribleSys->GetAs_String("Gfx_API").c_str(), "OpenGL") == 0) //{ // TDThrow("Don't Support GL RenderSystem!"); // //pTheRoot->loadPlugin("RenderSystem_GL.dll"); // //pTheRoot->setRenderSystem(pTheRoot->getRenderSystemByName("OpenGL Rendering Subsystem")); //} //else // TDThrow("UnKnown RenderSystem!"); //使用D3D渲染 pTheRoot->loadRenderPlugins_D3D9(); //加载其他插件 pTheRoot->loadInnerPlugins(); //pTheRoot->loadPlugin("Plugin_ParticleFX.dll"); //pTheRoot->loadPlugin("Plugin_ParticleFX2.dll"); //pTheRoot->loadPlugin("Plugin_OctreeSceneManager.dll"); //pTheRoot->loadPlugin("Plugin_CgProgramManager.dll"); //分析资源 ScriptParsingListener listener; try { //传入渲染窗口句柄 WX::System::NameValuePairList ViewSetting; INT nFSAA = g_pVaribleSys->GetAs_Int(szFSAAVar); INT nVsync = g_pVaribleSys->GetAs_Int(szvsyncVar); switch(nFSAA) { case 0: ViewSetting["FSAA"] = Ogre::StringConverter::toString(0); break; case 1: ViewSetting["FSAA"] = Ogre::StringConverter::toString(2); break; case 2: ViewSetting["FSAA"] = Ogre::StringConverter::toString(4); break; default: ViewSetting["FSAA"] = Ogre::StringConverter::toString(0); break; } if(nVsync == 1) ViewSetting["vsync"] = "true"; else ViewSetting["vsync"] = "false"; m_pRenderSystem->setup((WX::ulong)(UINT_PTR)g_hMainWnd, &ViewSetting); //关闭OGRE图标 m_pRenderSystem->getFrameStatsListener()->showLogoPanel(FALSE); //状态板 m_pRenderSystem->getFrameStatsListener()->showStatPanel(FALSE); //创建射线交集 m_pRaySceneQuery = m_pRenderSystem->getSceneManager()->createRayQuery(Ogre::Ray()); m_pRaySceneQuery->setSortByDistance(TRUE); //--------------------------------------------------------- //设置DebugPanel m_pDebugPanel = new CDebugPanel( Ogre::OverlayManager::getSingleton().getByName("WX/DebugOverlay"), Ogre::OverlayManager::getSingleton().getOverlayElement("WX/StatPanel"), Ogre::OverlayManager::getSingleton().getOverlayElement("WX/HitObjPanel"), Ogre::OverlayManager::getSingleton().getOverlayElement("WX/HitObjText"), m_pRenderSystem->getRenderWindow()); //--------------------------------------------------------- //创建摄像机 { //设置摄像机 //取得环境变量 BOOL bHave; FLOAT fCamera_MinDistance = g_pVaribleSys->GetAs_Float("Camera_MinDistance", &bHave); if(bHave) CCamera_Scene::MIN_DISTANCE = fCamera_MinDistance; FLOAT fCamera_MaxDistance = g_pVaribleSys->GetAs_Float("Camera_MaxDistance", &bHave); if(bHave) CCamera_Scene::MAX_DISTANCE = fCamera_MaxDistance; FLOAT fCamera_Pitch = g_pVaribleSys->GetAs_Float("Camera_Pitch", &bHave); if(bHave) CCamera_Scene::STATIC_PITCH = -fCamera_Pitch*TDU_PI/180.0f; } m_pCamera_CharView = new CCamera_CharSel(m_pRenderSystem->getCamera()); m_pCamera_Scene = new CCamera_Scene(m_pRenderSystem->getCamera()); m_pCamera_Scene->SetDistance(CCamera_Scene::MAX_DISTANCE); m_pCamera_Current = m_pCamera_CharView; //-------------------------------------------- //初始化PostFilter系统 m_pPostFilterManager = m_pRenderSystem->getPostFilterManager(); //注册所有全局渲染器 WX::registerAllPostFilterFactories(m_pPostFilterManager); m_pPostFilterManager->createPostFilter("Floodlighting", m_pRenderSystem->getViewport()); // m_pPostFilterManager->createPostFilter("Bloom", m_pRenderSystem->getViewport()); // m_pPostFilterManager->createPostFilter("HeatVision", m_pRenderSystem->getViewport()); m_pPostFilterManager->createPostFilter("Fade", m_pRenderSystem->getViewport()); //-------------------------------------------- //设置特效系统的声音播放函数 WX::LogicModel::SetPlaySoundFuncton((OnPlaySound)(g_pSoundSystem->GetPlaySoundFunc())); WX::LogicModel::SetStopSoundFunction((OnStopSound)(g_pSoundSystem->GetStopSoundFunc())); WX::LogicModel::SetGetHeightInWorldListener((GetHeightInWorld)(g_pWorldSystem->GetTerrainHeightFunc())); // 初始化 fake obeject manager m_pFakeObjectManager = new CFakeObjectManager; m_pFakeObjectManager->Initial(); // WX::Effect::setDefaultIterativeInterval(0.01f); Ogre::ParticleSystem::setDefaultIterationInterval(0.033f); //系统设置接口挂接变量控制系统 g_pEventSys->RegisterEventHandle("VARIABLE_CHANGED",_OnVariableChangedEvent); //恢复上次颜色设置 g_pEventSys->PushEvent( GE_VARIABLE_CHANGED, sz32BitTexturesVar, g_pVaribleSys->GetAs_String(sz32BitTexturesVar).c_str()); } catch(const Ogre::Exception& e) { BOOL rethrow = TRUE; if (e.getNumber() == Ogre::Exception::ERR_DUPLICATE_ITEM) { if (e.getSource() == "ResourceManager::add") { if (Ogre::StringUtil::endsWith(listener._scriptName, ".material", TRUE)) { char materialName[256]; if (sscanf(e.getDescription().c_str(), "Resource with the name %255s already exists.", materialName) == 1) { Ogre::MaterialPtr material = Ogre::MaterialManager::getSingleton().getByName(materialName); if (!material.isNull()) { char message[1024]; Ogre::StringVectorPtr currentNames = WX::findResourceFilenames(listener._groupName, listener._scriptName); const Ogre::String& currentName = currentNames.isNull() || currentNames->empty() ? listener._scriptName : currentNames->front(); if (material->getOrigin().empty()) { _snprintf(message, 1024, ("Predefined material \"%s\" duplicated in file \"%s\", the application will exit."), material->getName().c_str(), currentName.c_str()); } else { Ogre::StringVectorPtr originNames = WX::findResourceFilenames(material->getGroup(), material->getOrigin()); const Ogre::String& originName = originNames.isNull() || originNames->empty() ? material->getOrigin() : originNames->front(); if (currentName == originName) { _snprintf(message, 1024, ("The material \"%s\" occuring in the file \"%s\" more than once, the application will exit."), material->getName().c_str(), currentName.c_str()); } else { _snprintf(message, 1024, ("Duplicate material \"%s\" in files \"%s\" and \"%s\", the application will exit."), material->getName().c_str(), currentName.c_str(), originName.c_str()); } } TDThrow("Ogre::%s", message); } } } } } throw; } }