Browse Source
This means that most users should see the game window pop up immediately after pressing login instead of seeing "Starting URU... Please wait"
Adam Johnson
10 years ago
7 changed files with 362 additions and 317 deletions
@ -0,0 +1,145 @@ |
|||||||
|
/*==LICENSE==*
|
||||||
|
|
||||||
|
CyanWorlds.com Engine - MMOG client, server and tools |
||||||
|
Copyright (C) 2011 Cyan Worlds, Inc. |
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Additional permissions under GNU GPL version 3 section 7 |
||||||
|
|
||||||
|
If you modify this Program, or any covered work, by linking or |
||||||
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||||
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||||
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||||
|
(or a modified version of those libraries), |
||||||
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||||
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||||
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||||
|
licensors of this Program grant you additional |
||||||
|
permission to convey the resulting work. Corresponding Source for a |
||||||
|
non-source form of such a combination shall include the source code for |
||||||
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||||
|
work. |
||||||
|
|
||||||
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||||
|
or by snail mail at: |
||||||
|
Cyan Worlds, Inc. |
||||||
|
14617 N Newport Hwy |
||||||
|
Mead, WA 99021 |
||||||
|
|
||||||
|
*==LICENSE==*/ |
||||||
|
|
||||||
|
#include "plClientLoader.h" |
||||||
|
#include "plClient.h" |
||||||
|
#include "plFileSystem.h" |
||||||
|
#include "plPipeline.h" |
||||||
|
|
||||||
|
#include "hsWindows.h" |
||||||
|
#include <shellapi.h> |
||||||
|
|
||||||
|
#include "plClientResMgr/plClientResMgr.h" |
||||||
|
#include "plNetClient/plNetClientMgr.h" |
||||||
|
#include "plPhysX/plSimulationMgr.h" |
||||||
|
#include "plResMgr/plResManager.h" |
||||||
|
|
||||||
|
static plFileName s_physXSetupExe = "PhysX_Setup.exe"; |
||||||
|
|
||||||
|
static bool InitPhysX() |
||||||
|
{ |
||||||
|
#ifdef HS_BUILD_FOR_WIN32 |
||||||
|
plSimulationMgr::Init(); |
||||||
|
if (!plSimulationMgr::GetInstance()) { |
||||||
|
if (plFileInfo(s_physXSetupExe).Exists()) { |
||||||
|
// launch the PhysX installer
|
||||||
|
SHELLEXECUTEINFOW info; |
||||||
|
memset(&info, 0, sizeof(info)); |
||||||
|
info.cbSize = sizeof(info); |
||||||
|
info.lpFile = s_physXSetupExe.AsString().ToWchar(); |
||||||
|
info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NOASYNC; |
||||||
|
ShellExecuteExW(&info); |
||||||
|
|
||||||
|
// wait for completion
|
||||||
|
WaitForSingleObject(info.hProcess, INFINITE); |
||||||
|
|
||||||
|
// cleanup
|
||||||
|
CloseHandle(info.hProcess); |
||||||
|
} else { |
||||||
|
hsMessageBox("You must install PhysX before you can play URU.", "Error", hsMessageBoxNormal, hsMessageBoxIconError); |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
if (plSimulationMgr::GetInstance()) { |
||||||
|
plSimulationMgr::GetInstance()->Suspend(); |
||||||
|
return true; |
||||||
|
} else { |
||||||
|
hsMessageBox("PhysX install failed. You will not be able to play URU.", "Error", hsMessageBoxNormal, hsMessageBoxIconError); |
||||||
|
return false; |
||||||
|
} |
||||||
|
#else |
||||||
|
return false; |
||||||
|
#endif // HS_BUILD_FOR_WIN32
|
||||||
|
} |
||||||
|
|
||||||
|
hsError plClientLoader::Run() |
||||||
|
{ |
||||||
|
plResManager *resMgr = new plResManager; |
||||||
|
resMgr->SetDataPath("dat"); |
||||||
|
hsgResMgr::Init(resMgr); |
||||||
|
|
||||||
|
if (!plFileInfo("resource.dat").Exists()) { |
||||||
|
hsMessageBox("Required file 'resource.dat' not found.", "Error", hsMessageBoxNormal); |
||||||
|
return false; |
||||||
|
} |
||||||
|
plClientResMgr::Instance().ILoadResources("resource.dat"); |
||||||
|
|
||||||
|
fClient = new plClient; |
||||||
|
fClient->SetWindowHandle(fWindow); |
||||||
|
if (!InitPhysX() || fClient->InitPipeline() || !fClient->StartInit()) { |
||||||
|
fClient->SetDone(true); |
||||||
|
return hsFail; |
||||||
|
} |
||||||
|
return hsOK; |
||||||
|
} |
||||||
|
|
||||||
|
void plClientLoader::Start() |
||||||
|
{ |
||||||
|
fClient->ResizeDisplayDevice(fClient->GetPipeline()->Width(), fClient->GetPipeline()->Height(), !fClient->GetPipeline()->IsFullScreen()); |
||||||
|
|
||||||
|
// Show the client window
|
||||||
|
ShowWindow(fWindow, SW_SHOW); |
||||||
|
BringWindowToTop(fWindow); |
||||||
|
|
||||||
|
// Now, show the intro video, patch the global ages, etc...
|
||||||
|
fClient->BeginGame(); |
||||||
|
} |
||||||
|
|
||||||
|
// ===================================================
|
||||||
|
void plClientLoader::ShutdownStart() |
||||||
|
{ |
||||||
|
// Ensure that the client actually inited
|
||||||
|
hsThread::Stop(); |
||||||
|
|
||||||
|
// Now request the sane exit
|
||||||
|
fClient->SetDone(true); |
||||||
|
if (plNetClientMgr* mgr = plNetClientMgr::GetInstance()) |
||||||
|
mgr->QueueDisableNet(false, nullptr); |
||||||
|
} |
||||||
|
|
||||||
|
void plClientLoader::ShutdownEnd() |
||||||
|
{ |
||||||
|
if (fClient) |
||||||
|
fClient->Shutdown(); |
||||||
|
hsAssert(hsgResMgr::ResMgr()->RefCnt() == 1, "resMgr has too many refs, expect mem leaks"); |
||||||
|
hsgResMgr::Shutdown(); |
||||||
|
} |
@ -0,0 +1,110 @@ |
|||||||
|
/*==LICENSE==*
|
||||||
|
|
||||||
|
CyanWorlds.com Engine - MMOG client, server and tools |
||||||
|
Copyright (C) 2011 Cyan Worlds, Inc. |
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Additional permissions under GNU GPL version 3 section 7 |
||||||
|
|
||||||
|
If you modify this Program, or any covered work, by linking or |
||||||
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||||
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||||
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||||
|
(or a modified version of those libraries), |
||||||
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||||
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||||
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||||
|
licensors of this Program grant you additional |
||||||
|
permission to convey the resulting work. Corresponding Source for a |
||||||
|
non-source form of such a combination shall include the source code for |
||||||
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||||
|
work. |
||||||
|
|
||||||
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||||
|
or by snail mail at: |
||||||
|
Cyan Worlds, Inc. |
||||||
|
14617 N Newport Hwy |
||||||
|
Mead, WA 99021 |
||||||
|
|
||||||
|
*==LICENSE==*/ |
||||||
|
|
||||||
|
#include "HeadSpin.h" |
||||||
|
#include "hsThread.h" |
||||||
|
#include "hsWindows.h" |
||||||
|
|
||||||
|
class plClientLoader : private hsThread |
||||||
|
{ |
||||||
|
class plClient* fClient; |
||||||
|
HWND fWindow; |
||||||
|
|
||||||
|
virtual void OnQuit() |
||||||
|
{ |
||||||
|
SetQuit(true); |
||||||
|
} |
||||||
|
|
||||||
|
/** Does the heavy lifting of client init */ |
||||||
|
virtual hsError Run(); |
||||||
|
|
||||||
|
public: |
||||||
|
plClientLoader() : fClient(nullptr) { } |
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the client asyncrhonouslynn including: loading the localization,
|
||||||
|
* registry, dispatcher, etc. |
||||||
|
*/ |
||||||
|
void Init() |
||||||
|
{ |
||||||
|
hsAssert(fClient == nullptr, "trying to init the client more than once?"); |
||||||
|
hsThread::Start(); |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether or not the client init is done |
||||||
|
*/ |
||||||
|
bool IsInited() const { return hsThread::GetQuit(); } |
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the client HWND |
||||||
|
*/ |
||||||
|
void SetClientWindow(HWND hWnd) { fWindow = hWnd; } |
||||||
|
|
||||||
|
/**
|
||||||
|
* Initial shutdown request received from Windows (or something)... start tear down |
||||||
|
*/ |
||||||
|
void ShutdownStart(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Window mess cleaned up, time to commit hara-kiri |
||||||
|
*/ |
||||||
|
void ShutdownEnd(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Launches the client window and starts the game. |
||||||
|
* This will block if the client is not initialized. |
||||||
|
*/ |
||||||
|
void Start(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Waits for the client to finish initing |
||||||
|
*/ |
||||||
|
void Wait() { hsThread::Stop(); } |
||||||
|
|
||||||
|
/** Returns the current plClient instance */ |
||||||
|
plClient* operator ->() const { return fClient; } |
||||||
|
|
||||||
|
/** Returns whether or not the client is non-null */ |
||||||
|
operator bool() const { return fClient != nullptr; } |
||||||
|
}; |
||||||
|
|
Loading…
Reference in new issue