www.pudn.com > 3D_OnlineGame_Humen.rar > D3DRMScreen.cpp


#include "stdafx.h" 
#include "XMudClient.h" 
#include "D3DRMScreen.h" 
#include "MainScreen.h" 
#include "d3dappi.h" 
#include "MenuCreateNew.h" 
#include "MapInfo.h" 
#include "NpcInfo.h" 
#include "CommandCheck.h" 
#include "FacePlate.h" 
#include "MyMusic.h" 
#include  
#include "MyDInput.h" 
#define MSG(str) MessageBox( NULL, str, "Application Message", MB_OK ) 
extern char g_tszPathName[256]; 
extern D3DVECTOR g_CameraPosition; 
LPDIRECT3DRMFRAME3 g_lights; 
LPDIRECT3DRMLIGHT g_ambient; 
LPDIRECT3DRMLIGHT g_parallel; 
LPDIRECT3DRMFRAME3 g_lpplayer; 
LPDIRECT3DRMFRAME3 g_pChaseFrame; 
LPDIRECT3DRMANIMATION2 g_lpAnim; 
LPDIRECT3DRMFRAME3 g_sFrame = NULL;//處理被鼠標選種的3D物體 
D3DRMBOX BaseBox; 
D3DVECTOR BaseCenter; 
D3DVECTOR g_PlayAndCameraPos = D3DVECTOR(0,-1,0); 
D3DVECTOR g_lightgammer = D3DVECTOR(0.8f,0.8f,0.8f); 
PathInfo info; 
int g_playerState = STOP; 
 
extern float g_fCamfov; 
extern char g_tszPathName[256]; 
extern LPDIRECT3DRM3	g_lpD3DRM; 
extern rmfullglobals myglobs; 
extern CMainScreen m_MainScreen; 
char szPlayerName[16]; 
 
CList exitlist; 
CExitInfo *lpExitInfo; 
extern CRITICAL_SECTION csMaplist; 
extern CList  maplist; 
extern CListplayerlist; 
extern CPlayerInfo * lpPlayerInfo; 
extern CList  animationlist; 
extern animationCallbackArgs *cb; 
extern CList	 npclist; 
extern CNpcInfo *lpNpcInfo; 
extern BOOL g_GetSameMove; 
 
extern CRITICAL_SECTION csAnimation; 
 
extern void QuitResolution(void); 
void __cdecl 
CleanupObjectsCallback( LPDIRECT3DRMOBJECT pObj, VOID* pArg ) 
{ 
    PathInfo* pInfo = (PathInfo*)pArg; 
 
    pInfo->pChaseFrame->Release(); 
    pInfo->pPlaneFrame->Release(); 
    pInfo->pFlightPath->Release(); 
} 
 
void __cdecl 
MoveCameraCallback( LPDIRECT3DRMFRAME3 pCamera, VOID* pArg, D3DVALUE delta ) 
{ 
    PathInfo* pInfo = (PathInfo*)pArg; 
    D3DVECTOR dir, up; 
    D3DVECTOR dirCam, upCam; 
    LPDIRECT3DRMFRAME3 pScene; 
    myglobs.camera->GetScene( &pScene ); 
    pInfo->fTime += 0.04f; 
    pInfo->pFlightPath->SetFrame( myglobs.camera ); 
    pInfo->pFlightPath->SetTime( pInfo->fTime ); 
    myglobs.camera->LookAt( g_lpplayer, pScene, D3DRMCONSTRAIN_Z); 
    pInfo->pFlightPath->SetTime( pInfo->fTime + 0.4f); 
    pScene->Release(); 
} 
 
extern BOOL CreateTreeDecal(LPDIRECT3DRM3 pD3DRM,LPDIRECT3DRMFRAME3 pScene,D3DVALUE x,D3DVALUE y,D3DVALUE z); 
extern BOOL CreateTreeDecalAlpha(LPDIRECT3DRM3 pD3DRM,LPDIRECT3DRMFRAME3 pScene,D3DVALUE x,D3DVALUE y,D3DVALUE z); 
 
//----------------------------------------------------------------------------- 
//建立遊戲主場景 
//----------------------------------------------------------------------------- 
BOOL BuildScene( LPDIRECT3DRM3 pD3DRM, 
				 LPDIRECT3DRMDEVICE3 pDevice, LPDIRECT3DRMVIEWPORT2 pViewport, 
	             LPDIRECT3DRMFRAME3 pScene, LPDIRECT3DRMFRAME3 pCamera ) 
{ 
	CMapInfo * lpMapInfo; 
	m_MainScreen.PrepareNewMapInfo(); 
	LPDIRECT3DRMMESHBUILDER3 mesh_builder = NULL; 
	LPDIRECT3DRMMESHBUILDER3 mesh_builder_base = NULL; 
	LPDIRECT3DRMMESH mesh = NULL; 
	LPDIRECT3DRMMESH meshbase = NULL; 
	LPDIRECT3DRMFRAME3 frame = NULL; 
	LPDIRECT3DRMFRAME3 baseframe = NULL; 
	LPDIRECT3DRMFRAME3 lights = NULL; 
	LPDIRECT3DRMLIGHT ambient = NULL; 
	LPDIRECT3DRMLIGHT parallel = NULL; 
 
	LPDIRECT3DRMFRAME3	playerframe = NULL; 
	LPDIRECT3DRMFRAME3	chaseFrame = NULL; 
	D3DVECTOR exitpos,lightpos; 
	char pFloorFileName[256],pFileName[256],pFileName1[256],pFileName2[256],TagFileName[256]; 
	int i=0,j; 
	//	定義map的三維mesh,建議map mesh 最好不要有Scale 
	LPTSTR lpsz,lpsz2,lpsz3,lpsz4; 
	CString buf,buf1,buf2,buf3,buf4; 
 
	j = maplist.GetCount(); 
	lpMapInfo=maplist.GetHead(); 
	buf4 = CString("\\media\\")+lpMapInfo->m_sXFILENAME+CString("base")+CString(".x"); 
	lpsz4 = buf4.GetBuffer(buf4.GetLength()+1); 
	_tcscpy(lpsz4, buf4); 
 
	strcpy(pFloorFileName,g_tszPathName); 
	strcat(pFloorFileName,lpsz4); 
 
	buf = CString("\\media\\")+lpMapInfo->m_sXFILENAME+CString(".x"); 
	lpsz = buf.GetBuffer(buf.GetLength()+1); 
	_tcscpy(lpsz, buf); 
	strcpy(pFileName,g_tszPathName); 
	strcat(pFileName,lpsz); 
 
	lpPlayerInfo = playerlist.GetHead(); 
 
	strcpy(szPlayerName,lpPlayerInfo->m_sENAME); 
	buf1 = CString("\\media\\")+lpPlayerInfo->m_sXFILENAME; 
	lpsz = buf1.GetBuffer(buf1.GetLength()+1); 
	strcpy(pFileName1,g_tszPathName); 
	strcat(pFileName1,lpsz); 
 
	buf2 = CString("\\media\\")+lpPlayerInfo->m_sENAME+CString(".x"); 
	lpsz2 = buf2.GetBuffer(buf2.GetLength()+1);	//firstplayerfilename 
	strcpy(TagFileName,g_tszPathName); 
	strcat(TagFileName,lpsz2); 
 
	buf3 = CString("\\media\\")+lpPlayerInfo->m_sENAME+CString(".x"); 
	lpsz3 = buf3.GetBuffer(buf3.GetLength()+1); 
	strcpy(pFileName2,g_tszPathName); 
	strcat(pFileName2,lpsz3); 
 
	if(!modifyfile(pFileName1,lpPlayerInfo->m_sENAME)){ 
		MSG(lstrcat(pFileName1,"Load File Error!")); 
    QuitDirectMusic(); 
    QuitResolution(); 
    QuitIME(myglobs.hWndMain); 
		exit(1); 
	} 
	BOOL bFindRoom = FALSE; 
	lpPlayerInfo = playerlist.GetHead(); 
	if(!lpPlayerInfo->m_sROOM.IsEmpty()){ 
		for(i=1;im_sEXIT_DBF != "") 
			{ 
				if(!stricmp(lpMapInfo->m_sCNAME,lpPlayerInfo->m_sROOM)) 
				{ 
					bFindRoom = TRUE; 
					break; 
				} 
			} 
		} 
	} 
	//	定義Player的初始位置 
	D3DVECTOR path = D3DVECTOR((float)lpMapInfo->m_fPOSITION_X, 
					(float)lpMapInfo->m_fPOSITION_Y, 
					(float)lpMapInfo->m_fPOSITION_Z); 
	if((float)lpMapInfo->m_fPOSITION_X == 0  
		&& (float)lpMapInfo->m_fPOSITION_Y == 0 
		&& (float)lpMapInfo->m_fPOSITION_Z == 0){ 
		for(i=1;im_sENAME  != lpPlayerInfo->m_sENAME){ 
				if(lpMapInfo->m_sEXIT_DBF != ""){ 
					path.x = (float)lpMapInfo->m_fPOSITION_X; 
					path.y = 0.0f; 
					path.z = (float)lpMapInfo->m_fPOSITION_Z; 
					break; 
				} 
			} 
		} 
	} 
 
	lpMapInfo = maplist.GetHead(); 
	lpPlayerInfo->m_sROOM = lpMapInfo->m_sENAME; 
 
	CTime CurrentTime=CTime::GetCurrentTime(); 
	int iMinTime = CurrentTime.GetMinute(); 
	if( iMinTime >= 0 && iMinTime < 10 ){ 
		//在遊戲中表示早晨6:00到8:00 
		lightpos.x = 50.0f; 
		lightpos.y = 20.0f; 
		lightpos.z = -25.0f; 
	}else if( iMinTime >= 10 && iMinTime < 20 ){ 
		//在遊戲中表示早晨8:00到10:00 
		lightpos.x = 25.0f; 
		lightpos.y = 30.0f; 
		lightpos.z = -25.0f; 
	}else if( iMinTime >= 20 && iMinTime < 30 ){ 
		//在遊戲中表示早晨10:00到12:00 
		lightpos.x = 5.0f; 
		lightpos.y = 55.0f; 
		lightpos.z = -25.0f; 
	}else if( iMinTime >= 30 && iMinTime < 40 ){ 
		//在遊戲中表示早晨12:00到14:00 
		lightpos.x = -5.0f; 
		lightpos.y = 55.0f; 
		lightpos.z = -25.0f; 
	}else if( iMinTime >= 40 && iMinTime < 50 ){ 
		//在遊戲中表示早晨14:00到16:00 
		lightpos.x = -25.0f; 
		lightpos.y = 30.0f; 
		lightpos.z = -25.0f; 
	}else if( iMinTime >= 40 && iMinTime <= 59 ){ 
		//在遊戲中表示早晨16:00到18:00 
		lightpos.x = -50.0f; 
		lightpos.y = 20.0f; 
		lightpos.z = -25.0f; 
	} 
	if(FAILED(pD3DRM->CreateFrame(pScene,&lights))) 
		goto generic_error; 
	if(FAILED(lights->SetPosition(pScene,lightpos.x,lightpos.y,lightpos.z))) 
		goto generic_error; 
 
	if(FAILED(pD3DRM->CreateLightRGB(D3DRMLIGHT_POINT,0.8f,0.6f,0.7f,¶llel))) 
		goto generic_error; 
	if(FAILED(lights->AddLight(parallel))) 
		goto generic_error; 
 
	if(FAILED(pD3DRM->CreateLightRGB(D3DRMLIGHT_AMBIENT,0.8f,0.8f,0.8f,&ambient))) 
		goto generic_error; 
	if(FAILED(pScene->AddLight(ambient))) 
		goto generic_error; 
 
	g_lights = lights; 
	g_ambient = ambient; 
	g_parallel = parallel; 
 
  g_parallel->SetColorRGB( g_lightgammer.x,g_lightgammer.y,g_lightgammer.z); 
 
	if(FAILED(pD3DRM->CreateFrame(pScene, &playerframe))) 
		goto generic_error; 
	if (FAILED(pD3DRM->Load(TagFileName, 
					NULL, NULL, 0,  
					D3DRMLOAD_FROMFILE, 
					loadXFileCallback, (LPVOID)playerframe, 
					loadTextures, 
					NULL, NULL))) 
		goto ret_with_error; 
	cb = animationlist.GetHead(); 
	cb->cXFileName = lpPlayerInfo->m_sENAME; 
	cb->cCName = lpPlayerInfo->m_sCNAME; 
  cb->cTitle = lpPlayerInfo->m_sTITLE; 
 
	if(!DeleteFile(pFileName2)) 
		goto ret_with_error; 
	//調用tmpfile後刪除。 
	if(FAILED(playerframe->SetPosition(pScene,path.x,path.y,path.z))) 
		goto generic_error; 
	if(FAILED(pD3DRM->CreateFrame(pScene,&chaseFrame))) 
		goto generic_error; 
	if(FAILED(chaseFrame->SetPosition(pScene,path.x,path.y,path.z))) 
		goto generic_error; 
 
    //建立地表 
	if(FAILED(pD3DRM->CreateFrame(pScene,&baseframe))) 
		goto generic_error; 
	if(FAILED(pD3DRM->CreateMeshBuilder(&mesh_builder_base))) 
		goto generic_error; 
	if(FAILED(mesh_builder_base->Load(pFloorFileName,NULL,D3DRMLOAD_FROMFILE,NULL,NULL))) 
		goto generic_error; 
	if(FAILED(mesh_builder_base->CreateMesh(&meshbase))) 
		goto generic_error; 
	if(FAILED(baseframe->AddVisual((LPDIRECT3DRMVISUAL)meshbase))) 
		goto generic_error; 
  if(FAILED(meshbase->GetBox(&BaseBox))) 
		goto generic_error; 
#define random2(n) ((n==0)?0:(rand()%(n)))	 
	BaseCenter.x=(BaseBox.max.x-BaseBox.min.x)*(random2(3)+4)/10; 
	BaseCenter.y=(BaseBox.max.y-BaseBox.min.y)*(random2(3)+4)/10; 
	BaseCenter.z=(BaseBox.max.z-BaseBox.min.z)*(random2(3)+4)/10; 
	//建立房屋 
	if(FAILED(pD3DRM->CreateFrame(pScene,&frame))) 
		goto generic_error; 
	if(FAILED(pD3DRM->CreateMeshBuilder(&mesh_builder))) 
		goto generic_error; 
	if(FAILED(mesh_builder->Load(pFileName,NULL,D3DRMLOAD_FROMFILE,NULL,NULL))) 
		goto generic_error; 
	if(FAILED(mesh_builder->CreateMesh(&mesh))) 
		goto generic_error; 
	if(FAILED(frame->AddVisual((LPDIRECT3DRMVISUAL)mesh))) 
		goto generic_error; 
	g_lpplayer = playerframe; 
	g_pChaseFrame = chaseFrame; 
	if(g_PlayAndCameraPos.y == -1) { 
		pCamera->SetPosition(pScene,path.x-12.0f, 
									path.y+ 6.5f, 
									path.z-12.0f); 
	}else{ 
		pCamera->SetPosition(pScene,path.x+g_PlayAndCameraPos.x, 
									  path.y+g_PlayAndCameraPos.y, 
									  path.z+g_PlayAndCameraPos.z); 
	} 
		pCamera->LookAt(g_lpplayer, pScene, D3DRMCONSTRAIN_Z); 
		pCamera->GetPosition(pScene,&g_CameraPosition); 
		myglobs.view->SetField( g_fCamfov ); 
 
	for(i=1;im_sENAME  != lpPlayerInfo->m_sENAME){ 
			if(lpMapInfo->m_sEXIT_DBF != ""){ 
				exitpos.x = (float)lpMapInfo->m_fPOSITION_X; 
				exitpos.y = 0.0f; 
				exitpos.z = (float)lpMapInfo->m_fPOSITION_Z; 
				AddItemXFile( "\\media\\exit.x",exitpos,lpMapInfo->m_sEXIT_DBF); 
			}else if(lpMapInfo->m_sNPC_DBF != ""){ 
				if(lpMapInfo->m_sMAPINFO == "DEAD") continue; 
				exitpos.x = (float)lpMapInfo->m_fPOSITION_X; 
				exitpos.y = 0.0f; 
				exitpos.z = (float)lpMapInfo->m_fPOSITION_Z; 
 
				buf2 = CString("\\media\\")+lpMapInfo->m_sXFILENAME+CString(".x"); 
				lpsz2 = buf2.GetBuffer(buf2.GetLength()+1); 
				strcpy(TagFileName,g_tszPathName); 
				strcat(TagFileName,lpsz2); 
				if(!modifyfile(TagFileName,lpMapInfo->m_sENAME)){ 
					MSG(lstrcat(TagFileName,"Load File Error!")); 
          QuitDirectMusic(); 
          QuitResolution(); 
          QuitIME(myglobs.hWndMain); 
					exit(1); 
				} 
				buf3 = CString("\\media\\")+lpMapInfo->m_sENAME+CString(".x"); 
				lpsz3 = buf3.GetBuffer(buf3.GetLength()+1); 
				strcpy(pFileName2,g_tszPathName); 
				strcat(pFileName2,lpsz3); 
				LoadXFile( pFileName2,exitpos,(float)lpMapInfo->m_fSCALE); 
				cb = animationlist.GetTail(); 
				cb->cXFileType = CString("NPC"); 
				cb->cXFileName = lpMapInfo->m_sENAME; 
				cb->cCName = lpMapInfo->m_sCNAME; 
 
				D3DVECTOR Npcposite; 
				int k=0; 
				for(;k<50;k++){ 
					//給出NPC的初始化地圖位置 
					Npcposite = GetNextPosite(cb->frame3obj,cb); 
					Npcposite.y=0; 
				  { 
					g_GetSameMove=FALSE; 
					cb->frame3obj->SetPosition(myglobs.scene,BaseCenter.x,BaseCenter.y,BaseCenter.z); 
				  } 
				} 
 
				if(lpMapInfo->m_sMAPINFO == "DEAD"){ 
					cb->PlayerState = DEAD; 
					cb->time = DEAD_START; 
				}else if(lpMapInfo->m_sMAPINFO.IsEmpty()){ 
					if(g_GetSameMove){ 
						cb->PlayerState= STOP; 
						cb->time = STOP_START; 
            cb->way = -1; 
					} 
					else 
					{ 
						cb->PlayerState= LEFTGO; 
						cb->time = LEFTGO_START; 
						cb->nSteps = 0; 
						cb->way = rand()%8; 
					} 
				} 
				DeleteFile(pFileName2); 
				npclist.RemoveAll(); 
        g_GetSameMove=FALSE; 
			}else if(lpMapInfo->m_sPLAYER_DBF != ""){ 
				if(lpMapInfo->m_sMAPINFO == "DEAD") continue; 
				CString PlayerName = lpMapInfo->m_sENAME; 
				buf = CString("\\media\\")+lpMapInfo->m_sXFILENAME; 
				lpsz = buf.GetBuffer(buf.GetLength()+1); 
				strcpy(pFileName,g_tszPathName); 
				strcat(pFileName,lpsz); 
				if(!modifyfile(pFileName,lpMapInfo->m_sENAME)){ 
					MSG(lstrcat(TagFileName,"Load File Error!")); 
				  QuitDirectMusic(); 
				  QuitResolution(); 
				  QuitIME(myglobs.hWndMain); 
					exit(1); 
				}//建立tmpfile 
				buf = CString("\\media\\")+lpMapInfo->m_sENAME+CString(".x"); 
				lpsz = buf.GetBuffer(buf.GetLength()+1); 
				strcpy(TagFileName,g_tszPathName); 
				strcat(TagFileName,lpsz); 
				//修改maplist,增加3D模型 
				AddXFile(TagFileName); 
				DeleteFile(TagFileName); 
 
				cb = animationlist.GetTail(); 
				cb->cXFileType = CString("OTHERPLAY"); 
				cb->PlayerState= LEFTGO; 
				cb->time = LEFTGO_START; 
				cb->cXFileName = PlayerName; 
				cb->cCName = lpMapInfo->m_sCNAME; 
        cb->cTitle = lpMapInfo->m_sTITLE; 
        // 設定其它玩家進入的位置 
        cb->frame3obj->SetPosition(myglobs.scene,BaseCenter.x,BaseCenter.y,BaseCenter.z); 
				if(lpMapInfo->m_sMAPINFO == "DEAD") 
				{ 
					cb->PlayerState = DEAD; 
					cb->time = DEAD_START; 
				} 
			} 
		} 
	} 
	SAFE_RELEASE( playerframe ); 
	SAFE_RELEASE( chaseFrame ); 
	SAFE_RELEASE( lights ); 
	SAFE_RELEASE( mesh_builder ); 
	SAFE_RELEASE( mesh_builder_base ); 
	SAFE_RELEASE( mesh ); 
	SAFE_RELEASE( meshbase ); 
	SAFE_RELEASE( ambient ); 
	SAFE_RELEASE( parallel ); 
	SAFE_RELEASE( frame ); 
	SAFE_RELEASE( baseframe ); 
	return TRUE; 
 
generic_error: 
	MSG("A failure has occurred while building the scene.\n"); 
ret_with_error: 
	SAFE_RELEASE( playerframe ); 
	SAFE_RELEASE( chaseFrame ); 
	SAFE_RELEASE( lights ); 
	SAFE_RELEASE( mesh_builder ); 
	SAFE_RELEASE( mesh_builder_base ); 
	SAFE_RELEASE( mesh ); 
	SAFE_RELEASE( meshbase ); 
	SAFE_RELEASE( ambient ); 
	SAFE_RELEASE( parallel ); 
	SAFE_RELEASE( frame ); 
	SAFE_RELEASE( baseframe ); 
	return FALSE; 
} 
 
VOID OverrideDefaults( BOOL* pbNoTextures, BOOL* pbResizingDisabled,  
					   BOOL* pbConstRenderQuality, CHAR** pstrName ) 
{ 
	(*pbNoTextures) = TRUE; 
    (*pbConstRenderQuality) = TRUE; 
    (*pstrName)     = "Wang-HuaKui D3DEngine"; 
} 
 
 
void __cdecl 
loadXFileCallback(LPDIRECT3DRMOBJECT pObj, REFIID guidObj, LPVOID pArg) 
{ 
	LPDIRECT3DRMVISUAL pVis; 
	LPDIRECT3DRMFRAME3 pParent = (LPDIRECT3DRMFRAME3)pArg; 
	LPDIRECT3DRMFRAME3 pFrame; 
	LPDIRECT3DRMANIMATIONSET2 pAnimSet; 
	if (SUCCEEDED(pObj->QueryInterface(IID_IDirect3DRMFrame3, (LPVOID*)&pFrame))){ 
		pParent->AddChild(pFrame); 
		SAFE_RELEASE(pFrame); 
		SAFE_RELEASE(pObj); 
		return; 
	} 
 
	if (SUCCEEDED(pObj->QueryInterface(IID_IDirect3DRMVisual, (LPVOID*)&pVis))){ 
		g_lpD3DRM->CreateFrame(pParent, &pFrame); 
		pFrame->AddVisual(pVis); 
		SAFE_RELEASE(pFrame); 
		SAFE_RELEASE(pVis); 
		SAFE_RELEASE(pObj); 
		return; 
	} 
 
	if (SUCCEEDED(pObj->QueryInterface(IID_IDirect3DRMAnimationSet2, 
				       (LPVOID*)&pAnimSet))){ 
		setAnimationCallback(pParent, pAnimSet); 
		SAFE_RELEASE(pObj); 
		return; 
	} 
	OutputDebugString("Object loaded with no known D3DRM interface"); 
	SAFE_RELEASE(pObj); 
	return; 
} 
 
HRESULT __cdecl loadTextures(char *name, void *arg, LPDIRECT3DRMTEXTURE3 *tex) 
{ 
	char *sTmpName = name; 
	     
	while(sTmpName[0] != '.') sTmpName ++; 
	strcpy(sTmpName, ".bmp"); 
    if (FAILED(g_lpD3DRM->LoadTexture(name, tex))) return -1; 
	return 0; 
} 
 
BOOL setAnimationCallback(LPDIRECT3DRMFRAME3 frame,  
				 LPDIRECT3DRMANIMATIONSET2 animset) 
{ 
	animationCallbackArgs *cb; 
	cb = new animationCallbackArgs; 
	if (!cb) 
		return FALSE; 
	cb->frame3obj = frame; 
	cb->animset = animset; 
	cb->time = D3DVAL(50); 
	EnterCriticalSection(&csAnimation); 
	animationlist.AddTail(cb); 
	LeaveCriticalSection(&csAnimation); 
 
	if (FAILED(frame->AddMoveCallback(animationCallback, (void *) cb, 
										D3DRMCALLBACK_PREORDER))) 
		return FALSE; 
	if (FAILED(frame->AddDestroyCallback(animationDestroyCallback, animset))) 
		return FALSE; 
	return TRUE; 
} 
 
HRESULT AddItemXFile(const char * filename,D3DVECTOR playerpos,CString cXfileName) 
{ 
	HRESULT hr; 
	LPDIRECT3DRMFRAME3 pParent; 
	char tmpfilename[256]; 
 
	strcpy(tmpfilename,g_tszPathName); 
	strcat(tmpfilename,filename); 
 
	if (FAILED(hr = g_lpD3DRM->CreateFrame(myglobs.scene, &pParent))){ 
		MSG("Failed to create XFiles parent frame"); 
		return(hr); 
	} 
	if (FAILED(hr = g_lpD3DRM->Load((LPVOID)tmpfilename,  
					NULL, NULL, 0,  
					D3DRMLOAD_FROMFILE, 
					loadXFileCallback, (LPVOID)pParent, 
					loadTextures, 
					NULL, NULL))){ 
		SAFE_RELEASE(pParent); 
		MSG("Failed to load X File"); 
		return(hr); 
	} 
 
	pParent->SetPosition( myglobs.scene, playerpos.x, playerpos.y, playerpos.z); 
 
	lpExitInfo = new CExitInfo; 
	lpExitInfo->frame3obj = pParent; 
	lpExitInfo->cXFileName = cXfileName; 
	lpExitInfo->posExit = playerpos; 
	exitlist.AddTail(lpExitInfo); 
 
	SAFE_RELEASE(pParent); 
	return(D3DRM_OK); 
} 
 
HRESULT LoadXFile(const char *filename,D3DVECTOR playerpos,float fRotation) 
{ 
	HRESULT hr; 
	LPDIRECT3DRMFRAME3 pParent; 
 
	if (FAILED(hr = g_lpD3DRM->CreateFrame(myglobs.scene, &pParent))){ 
		MSG("Failed to create XFiles parent frame"); 
		return(hr); 
	} 
 
	if (FAILED(hr = g_lpD3DRM->Load((LPVOID)filename,  
					NULL, NULL, 0,  
					D3DRMLOAD_FROMFILE, 
					loadXFileCallback, (LPVOID)pParent, 
					loadTextures, 
					NULL, NULL))){ 
		SAFE_RELEASE(pParent); 
		MSG("Failed to load X File"); 
		return(hr); 
	} 
	pParent->SetPosition( myglobs.scene, playerpos.x, playerpos.y, playerpos.z); 
	pParent->AddRotation(D3DRMCOMBINE_BEFORE, 0.0f, 1.0f, 0.0f, fRotation); 
	SAFE_RELEASE(pParent); 
 
	return(D3DRM_OK); 
} 
 
HRESULT AddXFile(const char * filename) 
{ 
	CMapInfo * lpMapInfo; 
	HRESULT hr; 
	LPDIRECT3DRMFRAME3 pParent; 
 
	if (FAILED(hr = g_lpD3DRM->CreateFrame(myglobs.scene, &pParent))) 
		return(hr); 
	lpMapInfo = maplist.GetHead(); 
	pParent->SetPosition( myglobs.scene, 
						(float)lpMapInfo->m_fPOSITION_X, 
						(float)lpMapInfo->m_fPOSITION_Y, 
						(float)lpMapInfo->m_fPOSITION_Z ); 
	if (FAILED(hr = g_lpD3DRM->Load((LPVOID)filename,  
					NULL, NULL, 0,  
					D3DRMLOAD_FROMFILE, 
					loadXFileCallback, (LPVOID)pParent, 
					loadTextures, 
					NULL, NULL))){ 
		SAFE_RELEASE(pParent); 
		return(hr); 
	} 
	SAFE_RELEASE(pParent); 
	return(D3DRM_OK); 
} 
 
BOOL modifyfile(char * FileName, CString sTagName) 
{ 
	LPTSTR lpsz; 
	CString buf; 
	FILE *fp; 
	FILE *out; 
	char string[255],str[255],TagFileName[256]; 
	char *ptr,*p1; 
 
	buf = CString("\\media\\")+sTagName+CString(".x"); 
	lpsz = buf.GetBuffer(buf.GetLength()+1); 
	strcpy(TagFileName,g_tszPathName); 
	strcat(TagFileName,lpsz); 
 
	fp=fopen(FileName,"rt"); 
	if(!fp)return FALSE; 
	out=fopen(TagFileName,"wt"); 
	while(!feof(fp)){ 
		fgets(string,255,fp); 
		ptr=strstr(string,"pmud"); 
		if(ptr!=NULL){ 
			p1=ptr+strlen("pmud"); 
			strcpy(str,p1); 
			*ptr='\0'; 
			strcat(string,sTagName); 
			strcat(string,str); 
		} 
		fputs(string, out); 
	} 
	fclose(fp); 
	fclose(out); 
	return TRUE; 
} 
 
void SetCammerPos(int cammerpos) 
{ 
	D3DVECTOR playerpos,currentpos; 
	g_lpplayer->GetPosition(myglobs.scene, &playerpos); 
	myglobs.camera->GetPosition(myglobs.scene, ¤tpos); 
  currentpos.x = playerpos.x-(float)(17.0f*cos(3.141592f*cammerpos/60.0f)); 
	currentpos.z = playerpos.z-(float)(17.0f*sin(3.141592f*cammerpos/60.0f)); 
	myglobs.camera->SetPosition(myglobs.scene, currentpos.x, currentpos.y, currentpos.z); 
	myglobs.camera->LookAt(g_lpplayer, myglobs.scene, D3DRMCONSTRAIN_Z); 
  myglobs.camera->GetPosition(myglobs.scene,&g_CameraPosition); 
} 
 
 
//服務器發來某用戶進入同一地圖 
void SomejoinMap(char * JoinMapMsg) 
{ 
	CMapInfo *lpMapInfo; 
	CStringList strls; 
	char *ps; 
	CString parm = CString("\t"); 
	CString strtmp; 
	//開始分解mapdata 
	ps=strtok(JoinMapMsg,(const char*)parm); 
	strls.AddTail(ps); 
	for(;;){ 
		ps=strtok(NULL,(const char*)parm); 
		if(ps==NULL)break; 
		strls.AddTail(ps); 
	} 
	if( strls.GetCount() < 5 )	{//收到錯誤的加入指令 
		strls.RemoveAll(); 
		return; 
	} 
	EnterCriticalSection(&csMaplist); 
	if(maplist.IsEmpty())	{ 
		LeaveCriticalSection(&csMaplist); 
		return; 
	} 
	lpMapInfo = maplist.GetHead(); 
	strtmp = strls.GetHead(); 
	int i,j; 
	BOOL bFindInMapAlready = FALSE; 
	if(strtmp == lpMapInfo->m_sENAME  
		&& lpMapInfo->m_sENAME != szPlayerName)	{//同在一張地圖 
		j = maplist.GetCount(); 
		for(i=0;im_sENAME == strls.GetAt( strls.FindIndex(2))){ 
				bFindInMapAlready = TRUE; 
				break; 
			} 
		} 
		if(!bFindInMapAlready){ 
			lpMapInfo = new CMapInfo; 
			strtmp = strls.GetAt( strls.FindIndex(1)); 
			lpMapInfo->m_sCNAME = strtmp; 
			strtmp = strls.GetAt( strls.FindIndex(2)); 
			lpMapInfo->m_sENAME = strtmp; 
			strtmp = strls.GetAt( strls.FindIndex(3)); 
			lpMapInfo->m_sTITLE = strtmp; 
			strtmp = strls.GetAt( strls.FindIndex(4)); 
			lpMapInfo->m_sPLAYER_DBF = strtmp;//門派 
			strtmp = strls.GetAt( strls.FindIndex(5)); 
			lpMapInfo->m_sXFILENAME = strtmp; 
			strtmp = strls.GetAt( strls.FindIndex(6)); 
			lpMapInfo->szPlayerIP = strtmp; 
			maplist.AddTail(lpMapInfo); 
		} 
	}else{ 
		strls.RemoveAll(); 
		LeaveCriticalSection(&csMaplist);//如果假設不在一張地圖,也不能影響我。 
		return; 
	} 
	strls.RemoveAll(); 
	LeaveCriticalSection(&csMaplist); 
	if(bFindInMapAlready) 
		return; 
 
	CString buf; 
	char pFileName[128]; 
	char TagFileName[128]; 
	LPTSTR lpsz; 
 
	buf = CString("\\media\\")+lpMapInfo->m_sXFILENAME; 
	lpsz = buf.GetBuffer(buf.GetLength()+1); 
	strcpy(pFileName,g_tszPathName); 
	strcat(pFileName,lpsz); 
	if(!modifyfile(pFileName,lpMapInfo->m_sENAME)) 
		return; 
 
	buf = CString("\\media\\")+lpMapInfo->m_sENAME+CString(".x"); 
	lpsz = buf.GetBuffer(buf.GetLength()+1); 
	strcpy(TagFileName,g_tszPathName); 
	strcat(TagFileName,lpsz); 
	 
	//修改maplist,增加3D模型 
	AddXFile(TagFileName); 
	DeleteFile(TagFileName); 
 
	//此處不正確,當二個人物進入MAP時,不能夠判斷先發而後至的情況。 
	EnterCriticalSection(&csAnimation); 
	cb = animationlist.GetTail(); 
	cb->cXFileType = CString("OTHERPLAY"); 
	cb->PlayerState= LEFTGO; 
	cb->cXFileName = lpMapInfo->m_sENAME; 
	cb->cCName = lpMapInfo->m_sCNAME; 
  cb->cTitle = lpMapInfo->m_sTITLE; 
  // 設定其它玩家進入的位置 
  cb->frame3obj->SetPosition(myglobs.scene,BaseCenter.x,BaseCenter.y,BaseCenter.z); 
	LeaveCriticalSection(&csAnimation); 
} 
 
void SomeQuitMap(char * ExitMapMsg,char *szExitName,bool bEscape) 
{ 
	CMapInfo *lpMapInfo; 
	CStringList strls; 
	char *ps; 
	CString parm = CString("\t"); 
	CString strtmp; 
	LPDIRECT3DRMFRAME3 parent, frame; 
	CString sWhoCName; 
 
	//開始分解mapdata 
	ps=strtok(ExitMapMsg,(const char*)parm); 
	strls.AddTail(ps); 
	for(;;) 
	{ 
		ps=strtok(NULL,(const char*)parm); 
		if(ps==NULL)break; 
		strls.AddTail(ps); 
	} 
 
	EnterCriticalSection(&csMaplist); 
	lpMapInfo = maplist.GetHead(); 
	strtmp = strls.GetHead(); 
	strls.RemoveAll(); 
 
	int i,j; 
	BOOL bFindInMapAlready = FALSE; 
	j = maplist.GetCount(); 
	for(i=0;im_sENAME == strtmp) 
		{ 
			sWhoCName = lpMapInfo->m_sCNAME; 
			bFindInMapAlready = TRUE; 
			maplist.RemoveAt(maplist.FindIndex(i)); 
			delete lpMapInfo; 
			break; 
		} 
	} 
	LeaveCriticalSection(&csMaplist); 
	if(!bFindInMapAlready) 
		return; 
 
	// guanhua 2000/10/02 start 
	if(bEscape == FALSE) 
	{ 
	// guanhua 2000/10/02 end 
 
		// Spock start 
		char sResult[256]; 
		if (strcmp(szExitName, "EXIT")) 
			sprintf(sResult,"%s(180,0,0)%s朝(%s)走去",szNewColor,sWhoCName,szExitName); 
		else 
			sprintf(sResult,"%s(180,0,0)%s離線",szNewColor,sWhoCName); 
	//	CString sResult = CString(szNewColor) + "(150,0,0)" + sWhoCName + "朝(" + szExitName + ")走去"; 
		// Spock end 
		SendShowMsg(sResult); 
 
	// guanhua 2000/10/02 start 
	} 
	// guanhua 2000/10/02 end 
	 
	bFindInMapAlready = FALSE; 
	POSITION tmpPosite; 
	D3DVECTOR exitpos; 
	j = animationlist.GetCount(); 
	for(i=0;icXFileName)) 
		{ 
			tmpPosite = animationlist.FindIndex(i); 
			bFindInMapAlready = TRUE; 
			frame = cb->frame3obj; 
			break; 
		} 
	} 
	if(!bFindInMapAlready) 
	{ 
//		LeaveCriticalSection(&csAnimation); 
		return; 
	} 
	for(i=0;icXFileName)) 
		{ 
			cb->frame3obj->GetPosition(myglobs.scene, &exitpos); 
			frame->SetPosition(myglobs.scene,exitpos.x, exitpos.y, exitpos.z); 
//      DelayTime(500); 
			Sleep(500); 
			break; 
		} 
	} 
	EnterCriticalSection(&csAnimation); 
	cb = animationlist.GetAt(tmpPosite); 
	if(!cb->pathlist.IsEmpty()) 
		cb->pathlist.RemoveAll(); 
	animationlist.RemoveAt(tmpPosite); 
	delete cb; 
	LeaveCriticalSection(&csAnimation); 
	frame->DeleteMoveCallback(animationCallback, (void *) cb); 
	frame->GetParent(&parent); 
	parent->DeleteChild(frame); 
	parent->Release(); 
} 
 
extern HRESULT AVITextureQuit(void); 
 
void DoPlayerDead() 
{ 
	/* 
	CPlayerInfo * lpPlayerInfo; 
	TFightTag *lpFightTag,*lpOppFightTag; 
	int i,j; 
 
	EnterCriticalSection(&csAnimation); 
	lpPlayerInfo = playerlist.GetHead(); 
	animationCallbackArgs *selfcb ,*cb,*tmpcb; 
	g_playerState = DEAD; 
	selfcb = animationlist.GetHead(); 
	selfcb->time = DEAD_START; 
	j = selfcb->fightopplist.GetCount(); 
	for(i=0;ifightopplist.GetAt(selfcb->fightopplist.FindIndex(i)); 
		cb = animationlist.GetAt(lpFightTag->tagPosite); 
		int m,n; 
		n = cb->fightopplist.GetCount(); 
		for(m=0;mfightopplist.GetAt(cb->fightopplist.FindIndex(m)); 
			tmpcb = animationlist.GetAt(lpOppFightTag->tagPosite); 
			if(selfcb->cXFileName == tmpcb->cXFileName) 
			{ 
				cb->PlayerState = STOP; 
				cb->time = STOP_START; 
				delete lpFightTag; 
				cb->fightopplist.RemoveAt(cb->fightopplist.FindIndex(m)); 
				D3DVECTOR tagPos; 
				cb->frame3obj->GetPosition(myglobs.scene, &tagPos); 
				tagPos.y -= 1.5f; 
				cb->frame3obj->SetPosition(myglobs.scene, tagPos.x,tagPos.y,tagPos.z); 
				break; 
			} 
		} 
	} 
	selfcb->fightopplist.RemoveAll(); 
	LeaveCriticalSection(&csAnimation); 
	myglobs.camera->LookAt( g_lpplayer, myglobs.scene, D3DRMCONSTRAIN_Y); 
	*/ 
 
 
 
	maplist.RemoveAll(); 
	ReleaseD3DScreen(); 
	EnterCriticalSection(&csAnimation); 
	animationlist.RemoveAll(); 
	LeaveCriticalSection(&csAnimation); 
	exitlist.RemoveAll(); 
 
//  AVITextureQuit(); 
 
	CreateNewScreen(); 
	m_MainScreen.PrepareNewMapInfo(); 
	char pFileName1[256], 
		pFileName2[256], 
		TagFileName[256]; 
	//	定義map的三維mesh,建議map mesh 最好不要有Scale 
	LPTSTR lpsz,lpsz2,lpsz3; 
	CString buf,buf1,buf2,buf3,buf4; 
	lpPlayerInfo = playerlist.GetHead(); 
	strcpy(szPlayerName,lpPlayerInfo->m_sENAME); 
	buf1 = CString("\\media\\")+lpPlayerInfo->m_sXFILENAME; 
	lpsz = buf1.GetBuffer(buf1.GetLength()+1); 
	strcpy(pFileName1,g_tszPathName); 
	strcat(pFileName1,lpsz); 
 
	buf2 = CString("\\media\\")+lpPlayerInfo->m_sENAME+CString(".x"); 
	lpsz2 = buf2.GetBuffer(buf2.GetLength()+1);	//firstplayerfilename 
	strcpy(TagFileName,g_tszPathName); 
	strcat(TagFileName,lpsz2); 
 
	buf3 = CString("\\media\\")+lpPlayerInfo->m_sENAME+CString(".x"); 
	lpsz3 = buf3.GetBuffer(buf3.GetLength()+1); 
	strcpy(pFileName2,g_tszPathName); 
	strcat(pFileName2,lpsz3); 
 
	if(!modifyfile(pFileName1,lpPlayerInfo->m_sENAME)) 
	{ 
		MSG(lstrcat(pFileName1,"Load File Error!")); 
    QuitDirectMusic(); 
    QuitResolution(); 
    QuitIME(myglobs.hWndMain); 
		exit(1); 
	}//建立tmpfile。 
 
	LPDIRECT3DRMFRAME3 frame = NULL; 
	LPDIRECT3DRMFRAME3 lights = NULL; 
	LPDIRECT3DRMLIGHT ambient = NULL; 
	LPDIRECT3DRMLIGHT parallel = NULL; 
	LPDIRECT3DRMFRAME3	playerframe = NULL; 
	LPDIRECT3DRMFRAME3	chaseFrame = NULL; 
	D3DVECTOR path = D3DVECTOR(0.0f,0.0f,0.0f); 
	D3DVECTOR lightpos; 
	CTime CurrentTime=CTime::GetCurrentTime(); 
	int iMinTime = CurrentTime.GetMinute(); 
	if( iMinTime >= 0 && iMinTime < 10 ) 
	{ 
		//在遊戲中表示早晨6:00到8:00 
		lightpos.x = 50.0f; 
		lightpos.y = 20.0f; 
		lightpos.z = -25.0f; 
	} 
	else if( iMinTime >= 10 && iMinTime < 20 ) 
	{ 
		//在遊戲中表示早晨8:00到10:00 
		lightpos.x = 25.0f; 
		lightpos.y = 30.0f; 
		lightpos.z = -25.0f; 
	} 
	else if( iMinTime >= 20 && iMinTime < 30 ) 
	{ 
		//在遊戲中表示早晨10:00到12:00 
		lightpos.x = 5.0f; 
		lightpos.y = 55.0f; 
		lightpos.z = -25.0f; 
	} 
	else if( iMinTime >= 30 && iMinTime < 40 ) 
	{ 
		//在遊戲中表示早晨12:00到14:00 
		lightpos.x = -5.0f; 
		lightpos.y = 55.0f; 
		lightpos.z = -25.0f; 
	} 
	else if( iMinTime >= 40 && iMinTime < 50 ) 
	{ 
		//在遊戲中表示早晨14:00到16:00 
		lightpos.x = -25.0f; 
		lightpos.y = 30.0f; 
		lightpos.z = -25.0f; 
	} 
	else if( iMinTime >= 40 && iMinTime <= 59 ) 
	{ 
		//在遊戲中表示早晨16:00到18:00 
		lightpos.x = -50.0f; 
		lightpos.y = 20.0f; 
		lightpos.z = -25.0f; 
	} 
 
	// initialize the lights in the scene 
	if(FAILED(g_lpD3DRM->CreateFrame(myglobs.scene,&lights))) 
		goto generic_error; 
	if(FAILED(lights->SetPosition(myglobs.scene,lightpos.x,lightpos.y,lightpos.z))) 
		goto generic_error; 
 
	if(FAILED(g_lpD3DRM->CreateLightRGB(D3DRMLIGHT_POINT,0.8f,0.6f,0.7f,¶llel))) 
		goto generic_error; 
	if(FAILED(lights->AddLight(parallel))) 
		goto generic_error; 
 
	if(FAILED(g_lpD3DRM->CreateLightRGB(D3DRMLIGHT_AMBIENT,0.8f,0.8f,0.8f,&ambient))) 
		goto generic_error; 
	if(FAILED(myglobs.scene->AddLight(ambient))) 
		goto generic_error; 
 
	g_lights = lights; 
	g_ambient = ambient; 
	g_parallel = parallel; 
 
	if(FAILED(g_lpD3DRM->CreateFrame(myglobs.scene, &playerframe))) 
		goto generic_error; 
	if (FAILED(g_lpD3DRM->Load(TagFileName, 
					NULL, NULL, 0,  
					D3DRMLOAD_FROMFILE, 
					loadXFileCallback, (LPVOID)playerframe, 
					loadTextures, 
					NULL, NULL))) 
		goto ret_with_error; 
	if(!DeleteFile(pFileName2)) 
		goto ret_with_error; 
	//調用tmpfile後刪除。 
	if(FAILED(playerframe->SetPosition(myglobs.scene,path.x,path.y,path.z))) 
		goto generic_error; 
	if(FAILED(g_lpD3DRM->CreateFrame(myglobs.scene,&chaseFrame))) 
		goto generic_error; 
	if(FAILED(chaseFrame->SetPosition(myglobs.scene,path.x,path.y,path.z))) 
		goto generic_error; 
	g_lpplayer = playerframe; 
	g_pChaseFrame = chaseFrame; 
	if(g_PlayAndCameraPos.y == -1){ 
		myglobs.camera->SetPosition(myglobs.scene,path.x-15.0f, path.y+ 8.5f, path.z-15.0f); 
	}else{ 
		myglobs.camera->SetPosition(myglobs.scene,path.x+g_PlayAndCameraPos.x, 
			path.y+g_PlayAndCameraPos.y, path.z+g_PlayAndCameraPos.z); 
	} 
	myglobs.camera->LookAt(g_lpplayer, myglobs.scene, D3DRMCONSTRAIN_Z); 
	myglobs.camera->GetPosition(myglobs.scene,&g_CameraPosition); 
	myglobs.view->SetField( 0.3f ); 
 
	 
	EnterCriticalSection(&csAnimation); 
	cb = animationlist.GetHead(); 
	g_playerState = DEAD; 
	cb->cCName = lpPlayerInfo->m_sCNAME; 
	cb->cTitle = lpPlayerInfo->m_sTITLE; 
	cb->time = DEAD_START; 
	LeaveCriticalSection(&csAnimation); 
 
	SAFE_RELEASE( playerframe ); 
	SAFE_RELEASE( chaseFrame ); 
	SAFE_RELEASE( lights ); 
	SAFE_RELEASE( ambient ); 
	SAFE_RELEASE( parallel ); 
	SAFE_RELEASE( frame ); 
	return; 
 
generic_error: 
	MSG("A failure has occurred while building the scene.\n"); 
ret_with_error: 
	SAFE_RELEASE( playerframe ); 
	SAFE_RELEASE( chaseFrame ); 
	SAFE_RELEASE( lights ); 
	SAFE_RELEASE( ambient ); 
	SAFE_RELEASE( parallel ); 
	SAFE_RELEASE( frame ); 
	return; 
}