Revert All core changes (to be reapplied on next commit)

13-inventory-fixes
Nuno 3 years ago
parent 70286d36a9
commit 3709ea4520

@ -89,9 +89,6 @@ void createDebug (const char *logPath = NULL, bool logInFile = true, bool eraseL
/// Do not call this, unless you know what you're trying to do (it kills debug)! /// Do not call this, unless you know what you're trying to do (it kills debug)!
void destroyDebug(); void destroyDebug();
/// Attach exception handler, for new threads and fibers
void attachExceptionHandler();
// call this if you want to change the dir of the log.log file // call this if you want to change the dir of the log.log file
void changeLogDirectory(const std::string &dir); void changeLogDirectory(const std::string &dir);
@ -355,7 +352,7 @@ void setCrashAlreadyReported(bool state);
* Same as nlassertex(false,exp); * Same as nlassertex(false,exp);
*/ */
#if defined(NL_DEBUG) /* Debug break is only useful in debug builds */ // removed because we always check assert (even in release mode) #if defined (NL_OS_WINDOWS) && defined (NL_DEBUG)
#if defined(NL_OS_WINDOWS) #if defined(NL_OS_WINDOWS)
#define NLMISC_BREAKPOINT __debugbreak() #define NLMISC_BREAKPOINT __debugbreak()
#elif defined(NL_OS_UNIX) && defined(NL_COMP_GCC) #elif defined(NL_OS_UNIX) && defined(NL_COMP_GCC)
@ -363,9 +360,6 @@ void setCrashAlreadyReported(bool state);
#else #else
#define NLMISC_BREAKPOINT abort() #define NLMISC_BREAKPOINT abort()
#endif #endif
#else
#define NLMISC_BREAKPOINT do { } while (0)
#endif
// Internal, don't use it (make smaller assert code) // Internal, don't use it (make smaller assert code)
extern bool _assert_stop(bool &ignoreNextTime, sint line, const char *file, const char *funcName, const char *exp); extern bool _assert_stop(bool &ignoreNextTime, sint line, const char *file, const char *funcName, const char *exp);

@ -30,19 +30,19 @@ namespace NLMISC {
struct CHashKey struct CHashKey
{ {
CHashKey() { HashKeyString.resize(20); } CHashKey () { HashKeyString.resize(20); }
CHashKey(const unsigned char Message_Digest[20]) CHashKey (const unsigned char Message_Digest[20])
{ {
HashKeyString.clear(); HashKeyString.clear();
for (sint i = 0; i < 20; ++i) for(sint i = 0; i < 20 ; ++i)
{ {
HashKeyString += Message_Digest[i]; HashKeyString += Message_Digest[i];
} }
} }
// Init the hash key with a binary key format or a text key format // Init the hash key with a binary key format or a text key format
CHashKey(const std::string &str) CHashKey (const std::string &str)
{ {
if (str.size() == 20) if (str.size() == 20)
{ {
@ -51,25 +51,25 @@ struct CHashKey
else if (str.size() == 40) else if (str.size() == 40)
{ {
HashKeyString.clear(); HashKeyString.clear();
for (size_t i = 0; i < str.size(); i += 2) for(uint i = 0; i < str.size(); i+=2)
{ {
uint8 val; uint8 val;
if (isdigit((unsigned char)str[i + 0])) if (isdigit((unsigned char)str[i+0]))
val = str[i + 0] - '0'; val = str[i+0]-'0';
else else
val = 10 + tolower(str[i + 0]) - 'a'; val = 10+tolower(str[i+0])-'a';
val *= 16; val *= 16;
if (isdigit((unsigned char)str[i + 1])) if (isdigit((unsigned char)str[i+1]))
val += str[i + 1] - '0'; val += str[i+1]-'0';
else else
val += 10 + tolower(str[i + 1]) - 'a'; val += 10+tolower(str[i+1])-'a';
HashKeyString += val; HashKeyString += val;
} }
} }
else else
{ {
nlwarning("SHA: Bad hash key format"); nlwarning ("SHA: Bad hash key format");
} }
} }
@ -85,28 +85,23 @@ struct CHashKey
} }
// serial the hash key in binary format // serial the hash key in binary format
void serial(NLMISC::IStream &stream) void serial (NLMISC::IStream &stream)
{ {
stream.serial(HashKeyString); stream.serial (HashKeyString);
} }
bool operator==(const CHashKey &v) const bool operator==(const CHashKey &v) const
{ {
return HashKeyString == v.HashKeyString; return HashKeyString == v.HashKeyString;
} }
bool operator!=(const CHashKey &v) const
{
return !(*this == v);
}
// this string is always 20 bytes long and is the code in binary format (can't print it directly) // this string is always 20 bytes long and is the code in binary format (can't print it directly)
std::string HashKeyString; std::string HashKeyString;
}; };
inline bool operator<(const struct CHashKey &a, const struct CHashKey &b) inline bool operator <(const struct CHashKey &a,const struct CHashKey &b)
{ {
return a.HashKeyString < b.HashKeyString; return a.HashKeyString<b.HashKeyString;
} }
// This function get a filename (it works with big files) and returns his SHA hash key // This function get a filename (it works with big files) and returns his SHA hash key

@ -246,9 +246,10 @@ inline bool fromString(const std::string &str, sint64 &val) { bool ret = sscanf(
inline bool fromString(const std::string &str, float &val) { bool ret = sscanf(str.c_str(), "%f", &val) == 1; if (!ret) val = 0.0f; return ret; } inline bool fromString(const std::string &str, float &val) { bool ret = sscanf(str.c_str(), "%f", &val) == 1; if (!ret) val = 0.0f; return ret; }
inline bool fromString(const std::string &str, double &val) { bool ret = sscanf(str.c_str(), "%lf", &val) == 1; if (!ret) val = 0.0; return ret; } inline bool fromString(const std::string &str, double &val) { bool ret = sscanf(str.c_str(), "%lf", &val) == 1; if (!ret) val = 0.0; return ret; }
// Fast string to bool, reliably defined for strings starting with 0, 1, t, T, f, F, y, Y, n, N, anything else is undefined. /// Fast string to bool, reliably defined for strings starting with 0, 1, t, T, f, F, y, Y, n, N, and empty strings, anything else is undefined.
// (str[0] == '1' || (str[0] & 0xD2) == 0x50) /// - Kaetemi
// - Kaetemi inline bool toBool(const char *str) { return str[0] == '1' || (str[0] & 0xD2) == 0x50; }
inline bool toBool(const std::string &str) { return toBool(str.c_str()); } // Safe because first byte may be null
bool fromString(const std::string &str, bool &val); bool fromString(const std::string &str, bool &val);
@ -290,14 +291,6 @@ inline bool endsWith(const char *str, const char *suffix) { return endsWith(str,
inline bool endsWith(const std::string &str, const char *suffix) { return endsWith(str.c_str(), str.size(), suffix, strlen(suffix)); } inline bool endsWith(const std::string &str, const char *suffix) { return endsWith(str.c_str(), str.size(), suffix, strlen(suffix)); }
inline bool endsWith(const std::string &str, const std::string &suffix) { return endsWith(str.c_str(), str.size(), suffix.c_str(), suffix.size()); } inline bool endsWith(const std::string &str, const std::string &suffix) { return endsWith(str.c_str(), str.size(), suffix.c_str(), suffix.size()); }
// ****************************************************************************
// Conversion of strings between
// - UTF-8
// - Local codepage (UTF-8 on Linux)
// - TString (Local codepage or wide on Windows)
// - Wide (wchar_t *, UTF-16 on Windows, UTF-32 on Linux)
// ****************************************************************************
// Convert local codepage to UTF-8 // Convert local codepage to UTF-8
// On Windows, the local codepage is undetermined // On Windows, the local codepage is undetermined
// On Linux, the local codepage is always UTF-8 (no-op) // On Linux, the local codepage is always UTF-8 (no-op)

@ -0,0 +1,74 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef XML_MACROS_H
#define XML_MACROS_H
//
// xmlNodePtr cur;
// CXMLAutoPtr prop;
//
// sint i;
// XML_READ_SINT(cur, "prop_name", i, -1);
//
#define XML_READ_UINT(node, name, var, def) { \
uint tmp; \
prop = (char *) xmlGetProp(node, (xmlChar*)name); \
if (prop && fromString((const char*)prop, tmp)) \
var = tmp; \
else \
var = def; \
}
#define XML_READ_SINT(node, name, var, def) { \
sint tmp; \
prop = (char *) xmlGetProp(node, (xmlChar*)name); \
if (prop && fromString((const char*)prop, tmp)) \
var = tmp; \
else \
var = def; \
}
#define XML_READ_BOOL(node, name, var, def) { \
prop = (char *) xmlGetProp(node, (xmlChar*)name); \
if (prop) \
var = NLMISC::toBool((const char*)prop); \
else \
var = def; \
}
#define XML_READ_COLOR(node, name, var, def) { \
NLMISC::CRGBA tmp; \
prop = (char *) xmlGetProp(node, (xmlChar*)name); \
if (prop && fromString((const char*)prop, tmp)) \
var = tmp; \
else \
var = def; \
}
#define XML_READ_STRING(node, name, var, def) { \
prop = (char *) xmlGetProp(node, (xmlChar*)name); \
if (prop) \
var = (const char*)prop; \
else \
var = def; \
}
#endif // XML_MACROS_H

@ -108,7 +108,7 @@ public:
bool play(const std::string &filepath, uint xFadeTime = 0, bool async = true, bool loop = true); bool play(const std::string &filepath, uint xFadeTime = 0, bool async = true, bool loop = true);
/// Stop the music previously loaded and played (the Memory is also freed) /// Stop the music previously loaded and played (the Memory is also freed)
bool stop(uint xFadeTime = 0); void stop(uint xFadeTime = 0);
/// Pause the music previously loaded and played (the Memory is not freed) /// Pause the music previously loaded and played (the Memory is not freed)
void pause(); void pause();

@ -96,8 +96,6 @@ private:
IAudioDecoder *m_AudioDecoder; IAudioDecoder *m_AudioDecoder;
std::string m_LookupPath;
bool m_Paused; bool m_Paused;
bool m_DecodingEnded; bool m_DecodingEnded;

@ -34,7 +34,7 @@ class CCurlHttpClient
public: public:
/// Constructor /// Constructor
CCurlHttpClient() : _CurlStruct(NULL) {} CCurlHttpClient() {}
/// Connect to an http server (string by val is intended). If you specify a whole URL, an attempt will be made to determine the server. /// Connect to an http server (string by val is intended). If you specify a whole URL, an attempt will be made to determine the server.
bool connect(const std::string &server); bool connect(const std::string &server);

@ -3830,15 +3830,9 @@ void CDriverD3D::CLightState::apply(CDriverD3D *driver)
void CDriverD3D::CRenderTargetState::apply(CDriverD3D *driver) void CDriverD3D::CRenderTargetState::apply(CDriverD3D *driver)
{ {
H_AUTO_D3D(CDriverD3D_CRenderTargetState); H_AUTO_D3D(CDriverD3D_CRenderTargetState);
nlassert(TargetOwned); // Can only apply once! driver->_DeviceInterface->SetRenderTarget (0, Target);
driver->_DeviceInterface->SetRenderTarget(0, Target);
driver->setupViewport(driver->_Viewport); driver->setupViewport(driver->_Viewport);
driver->setupScissor(driver->_Scissor); driver->setupScissor(driver->_Scissor);
if (TargetOwned)
{
Target->Release();
TargetOwned = false;
}
} }
// *************************************************************************** // ***************************************************************************

@ -1546,13 +1546,11 @@ public:
Texture = NULL; Texture = NULL;
Level = 0; Level = 0;
CubeFace = 0; CubeFace = 0;
TargetOwned = false;
} }
IDirect3DSurface9 *Target; IDirect3DSurface9 *Target;
ITexture *Texture; ITexture *Texture;
uint8 Level; uint8 Level;
uint8 CubeFace; uint8 CubeFace;
bool TargetOwned;
virtual void apply(CDriverD3D *driver); virtual void apply(CDriverD3D *driver);
}; };
@ -2078,17 +2076,10 @@ public:
NL_D3D_CACHE_TEST(CacheTest_RenderTarget, _RenderTarget.Target != target) NL_D3D_CACHE_TEST(CacheTest_RenderTarget, _RenderTarget.Target != target)
#endif // NL_D3D_USE_RENDER_STATE_CACHE #endif // NL_D3D_USE_RENDER_STATE_CACHE
{ {
if (_RenderTarget.TargetOwned)
{
nlassert(_RenderTarget.Target);
_RenderTarget.Target->Release();
}
_RenderTarget.Target = target; _RenderTarget.Target = target;
_RenderTarget.Texture = texture; _RenderTarget.Texture = texture;
_RenderTarget.Level = level; _RenderTarget.Level = level;
_RenderTarget.CubeFace = cubeFace; _RenderTarget.CubeFace = cubeFace;
_RenderTarget.TargetOwned = target;
target->AddRef();
touchRenderVariable (&_RenderTarget); touchRenderVariable (&_RenderTarget);

@ -706,13 +706,9 @@ bool CDriverD3D::setupMaterial(CMaterial &mat)
// Set the texture states // Set the texture states
if (text || (stage == 0)) if (text || (stage == 0))
{ {
if (matShader == CMaterial::Program) // Doesn't use a pixel shader ? Set the textures stages
if (pShader->PixelShader == NULL)
{ {
// Do nothing for user pixel shader
}
else if (!pShader->PixelShader)
{
// Doesn't use a pixel shader ? Set the textures stages
if (pShader->RGBPipe[stage]) if (pShader->RGBPipe[stage])
{ {
setTextureState (stage, D3DTSS_COLOROP, pShader->ColorOp[stage]); setTextureState (stage, D3DTSS_COLOROP, pShader->ColorOp[stage]);
@ -1149,7 +1145,7 @@ bool CDriverD3D::setupMaterial(CMaterial &mat)
} }
break; break;
case CMaterial::Cloud: case CMaterial::Cloud:
{ {
H_AUTO_D3D(CDriverD3D_setupMaterial_setupCloudShader) H_AUTO_D3D(CDriverD3D_setupMaterial_setupCloudShader)
activeShader (&_ShaderCloud); activeShader (&_ShaderCloud);
@ -1171,7 +1167,7 @@ bool CDriverD3D::setupMaterial(CMaterial &mat)
return false; return false;
} }
break; break;
case CMaterial::Water: case CMaterial::Water:
{ {
H_AUTO_D3D(CDriverD3D_setupMaterial_setupWaterShader) H_AUTO_D3D(CDriverD3D_setupMaterial_setupWaterShader)
activeShader(mat.getTexture(3) ? &_ShaderWaterDiffuse : &_ShaderWaterNoDiffuse); activeShader(mat.getTexture(3) ? &_ShaderWaterDiffuse : &_ShaderWaterNoDiffuse);
@ -1300,14 +1296,7 @@ bool CDriverD3D::setupMaterial(CMaterial &mat)
} }
} }
} }
break; // CMaterial::Water // CMaterial::Water
case CMaterial::Program:
{
H_AUTO_D3D(CDriverD3D_setupMaterial_setupProgramshader)
// No material shader
activeShader(NULL);
}
break;
} }
// New material setuped // New material setuped

@ -1084,7 +1084,6 @@ void CDriverD3D::swapTextureHandle(ITexture &tex0, ITexture &tex1)
swap(t0->Height, t1->Height); swap(t0->Height, t1->Height);
swap(t0->SrcCompressed, t1->SrcCompressed); swap(t0->SrcCompressed, t1->SrcCompressed);
swap(t0->IsCube, t1->IsCube); swap(t0->IsCube, t1->IsCube);
swap(t0->RenderTarget, t1->RenderTarget);
swap(t0->Levels, t1->Levels); swap(t0->Levels, t1->Levels);
swap(t0->FirstMipMap, t1->FirstMipMap); swap(t0->FirstMipMap, t1->FirstMipMap);
swap(t0->TextureMemory, t1->TextureMemory); swap(t0->TextureMemory, t1->TextureMemory);

@ -246,7 +246,6 @@ void CFXAA::applyEffect()
// create render target // create render target
CTextureUser *otherRenderTarget = m_Driver->getRenderTargetManager().getRenderTarget(width, height, mode2D); CTextureUser *otherRenderTarget = m_Driver->getRenderTargetManager().getRenderTarget(width, height, mode2D);
nlassert(otherRenderTarget);
// swap render target // swap render target
CTextureUser texNull; CTextureUser texNull;

@ -979,9 +979,6 @@ void CLodCharacterManager::addTextureCompute(CLodCharacterInstance &instance,
// get lookup ptr. // get lookup ptr.
nlassert(lodTexture.Texture.size()==NL3D_CLOD_TEXT_SIZE); nlassert(lodTexture.Texture.size()==NL3D_CLOD_TEXT_SIZE);
if (lodTexture.Texture.size() < NL3D_CLOD_TEXT_SIZE)
return;
const CLodCharacterTexture::CTUVQ *lookUpPtr= &lodTexture.Texture[0]; const CLodCharacterTexture::CTUVQ *lookUpPtr= &lodTexture.Texture[0];
// apply the lodTexture, taking only better quality (ie nearer 0) // apply the lodTexture, taking only better quality (ie nearer 0)

@ -143,9 +143,6 @@ namespace NLMISC
NL_CT_DEBUG("CoTask : task %p start func called", task); NL_CT_DEBUG("CoTask : task %p start func called", task);
// Attach exception handler
attachExceptionHandler();
try try
{ {
// run the task // run the task
@ -154,7 +151,6 @@ namespace NLMISC
catch(...) catch(...)
{ {
nlwarning("CCoTask::startFunc : the task has generated an unhandled exeption and will terminate"); nlwarning("CCoTask::startFunc : the task has generated an unhandled exeption and will terminate");
NLMISC_BREAKPOINT;
} }
task->_Finished = true; task->_Finished = true;

@ -1157,15 +1157,6 @@ void destroyDebug()
} }
} }
void attachExceptionHandler()
{
#ifndef NL_COMP_MINGW
# ifdef NL_OS_WINDOWS
_set_se_translator(exceptionTranslator);
# endif // NL_OS_WINDOWS
#endif //!NL_COMP_MINGW
}
void createDebug (const char *logPath, bool logInFile, bool eraseLastLog) void createDebug (const char *logPath, bool logInFile, bool eraseLastLog)
{ {
// Do some basic compiler time check on type size // Do some basic compiler time check on type size

@ -558,7 +558,7 @@ bool CIFile::seek (sint32 offset, IStream::TSeekOrigin origin) const
return true; return true;
// seek in the file. NB: if not in bigfile, _BigFileOffset==0. // seek in the file. NB: if not in bigfile, _BigFileOffset==0.
if (nlfseek64(_F, (sint64)_BigFileOffset + _ReadPos, SEEK_SET) != 0) if (nlfseek64(_F, _BigFileOffset+_ReadPos, SEEK_SET) != 0)
return false; return false;
return true; return true;
} }

@ -171,16 +171,15 @@ bool CIXml::init (IStream &stream)
// Try binary mode // Try binary mode
if (_TryBinaryMode) if (_TryBinaryMode)
{ {
char header[5]; char header[4];
header[0] = buffer[0]; header[0] = buffer[0];
header[1] = buffer[1]; header[1] = buffer[1];
header[2] = buffer[2]; header[2] = buffer[2];
header[3] = buffer[3]; header[3] = buffer[3];
header[4] = '\0';
toLower(header); toLower(header);
// Does it a xml stream ? // Does it a xml stream ?
if (strcmp(header, "<?xm")) if (!strcmp(header, "<?xm"))
{ {
// NO ! Go in binary mode // NO ! Go in binary mode
_BinaryStream = &stream; _BinaryStream = &stream;

@ -67,9 +67,6 @@ static unsigned long __stdcall ProxyFunc (void *arg)
// Set the thread pointer in TLS memory // Set the thread pointer in TLS memory
nlverify (TlsSetValue (TLSThreadPointer, (void*)parent) != 0); nlverify (TlsSetValue (TLSThreadPointer, (void*)parent) != 0);
// Attach exception handler
attachExceptionHandler();
// Run the thread // Run the thread
parent->Runnable->run(); parent->Runnable->run();

@ -56,12 +56,18 @@ IAudioDecoder::~IAudioDecoder()
IAudioDecoder *IAudioDecoder::createAudioDecoder(const std::string &filepath, bool async, bool loop) IAudioDecoder *IAudioDecoder::createAudioDecoder(const std::string &filepath, bool async, bool loop)
{ {
std::string lookup = CPath::lookup(filepath, false);
if (lookup.empty())
{
nlwarning("Music file %s does not exist!", filepath.c_str());
return NULL;
}
std::string type = CFile::getExtension(filepath); std::string type = CFile::getExtension(filepath);
CIFile *ifile = new CIFile(); CIFile *ifile = new CIFile();
ifile->setCacheFileOnOpen(!async); ifile->setCacheFileOnOpen(!async);
ifile->allowBNPCacheFileOnOpen(!async); ifile->allowBNPCacheFileOnOpen(!async);
ifile->open(filepath); ifile->open(lookup);
IAudioDecoder *mb = createAudioDecoder(type, ifile, loop); IAudioDecoder *mb = createAudioDecoder(type, ifile, loop);

@ -147,7 +147,7 @@ void CMusicChannelFader::updateVolume()
*/ */
bool CMusicChannelFader::play(const std::string &filepath, uint xFadeTime, bool async, bool loop) bool CMusicChannelFader::play(const std::string &filepath, uint xFadeTime, bool async, bool loop)
{ {
bool stopped = stop(xFadeTime); stop(xFadeTime);
// Find the next best free music channel // Find the next best free music channel
uint nextFader = _MaxMusicFader; uint nextFader = _MaxMusicFader;
@ -164,7 +164,7 @@ bool CMusicChannelFader::play(const std::string &filepath, uint xFadeTime, bool
// Play a song in it :) // Play a song in it :)
_CMusicFader &fader = _MusicFader[_ActiveMusicFader]; _CMusicFader &fader = _MusicFader[_ActiveMusicFader];
if (xFadeTime && !stopped) fader.fadeIn(xFadeTime); // only fade in when fading out if (xFadeTime) fader.fadeIn(xFadeTime);
else fader.XFadeVolume = 1.0f; else fader.XFadeVolume = 1.0f;
fader.Playing = true; fader.Playing = true;
updateVolume(); // make sure at ok volume to start :) updateVolume(); // make sure at ok volume to start :)
@ -173,17 +173,12 @@ bool CMusicChannelFader::play(const std::string &filepath, uint xFadeTime, bool
} }
/// Stop the music previously loaded and played (the Memory is also freed) /// Stop the music previously loaded and played (the Memory is also freed)
bool CMusicChannelFader::stop(uint xFadeTime) void CMusicChannelFader::stop(uint xFadeTime)
{ {
if (xFadeTime) if (xFadeTime)
{ {
bool stopped = true;
for (uint i = 0; i < _MaxMusicFader; ++i) if (_MusicFader[i].Playing) for (uint i = 0; i < _MaxMusicFader; ++i) if (_MusicFader[i].Playing)
{
_MusicFader[i].fadeOut(xFadeTime); _MusicFader[i].fadeOut(xFadeTime);
stopped = false; // fading
}
return stopped;
} }
else else
{ {
@ -193,7 +188,6 @@ bool CMusicChannelFader::stop(uint xFadeTime)
_MusicFader[i].Fade = false; _MusicFader[i].Fade = false;
_MusicFader[i].Playing = false; _MusicFader[i].Playing = false;
} }
return true;
} }
} }

@ -108,13 +108,6 @@ void CStreamFileSource::play()
//{ //{
// nlwarning("Already waiting for play"); // nlwarning("Already waiting for play");
//} //}
std::string filepath = getStreamFileSound()->getFilePath();
m_LookupPath = NLMISC::CPath::lookup(filepath, false, false);
if (m_LookupPath.empty())
{
nlwarning("Music file %s does not exist!", filepath.c_str());
return;
}
if (!getStreamFileSound()->getAsync()) if (!getStreamFileSound()->getAsync())
{ {
if (!prepareDecoder()) if (!prepareDecoder())
@ -279,8 +272,7 @@ bool CStreamFileSource::prepareDecoder()
if (!m_AudioDecoder) if (!m_AudioDecoder)
{ {
// load the file // load the file
nlassert(!m_LookupPath.empty()); m_AudioDecoder = IAudioDecoder::createAudioDecoder(getStreamFileSound()->getFilePath(), getStreamFileSound()->getAsync(), getStreamFileSound()->getLooping());
m_AudioDecoder = IAudioDecoder::createAudioDecoder(m_LookupPath, getStreamFileSound()->getAsync(), getStreamFileSound()->getLooping());
if (!m_AudioDecoder) if (!m_AudioDecoder)
{ {
nlwarning("Failed to create IAudioDecoder, likely invalid format"); nlwarning("Failed to create IAudioDecoder, likely invalid format");

@ -192,7 +192,6 @@ bool CCurlHttpClient::receive(string &res, bool verbose)
void CCurlHttpClient::disconnect() void CCurlHttpClient::disconnect()
{ {
curl_easy_cleanup(_Curl); curl_easy_cleanup(_Curl);
_CurlStruct = NULL;
curl_global_cleanup(); curl_global_cleanup();
} }

@ -326,8 +326,8 @@ CClientConfig::CClientConfig()
Local = false; // Default is Net Mode. Local = false; // Default is Net Mode.
FSHost = ""; // Default Host. FSHost = ""; // Default Host.
TexturesInterface.push_back("texture_interfaces_v3"); TexturesInterface.push_back("texture_interfaces_v3_2x");
TexturesInterfaceDXTC.push_back("texture_interfaces_dxtc"); TexturesInterfaceDXTC.push_back("texture_interfaces_dxtc_2x");
TexturesOutGameInterface.push_back("texture_interfaces_v3_outgame_ui"); TexturesOutGameInterface.push_back("texture_interfaces_v3_outgame_ui");
@ -456,13 +456,7 @@ CClientConfig::CClientConfig()
SoundOn = true; // Default is with sound. SoundOn = true; // Default is with sound.
DriverSound = SoundDrvAuto; DriverSound = SoundDrvAuto;
SoundForceSoftwareBuffer = true; SoundForceSoftwareBuffer = true;
StartMusic = "main theme air.ogg"; // Use at game startup (originally no music) SoundOutGameMusic = "main menu loop.ogg";
EmptySlotMusic = "loading music loop.ogg"; // Use in character selection for empty slots
LoadingMusic = "main menu loop.ogg"; // Main loading used after leaving character selection, and when going back to character selection
KamiTeleportMusic = "kami teleport.ogg"; // Kami teleport
KaravanTeleportMusic = "karavan teleport.ogg"; // Karavan teleport
TeleportLoadingMusic = "loading music loop.ogg"; // Use for generic teleportations
DeathMusic = "death.ogg"; // Player death
SoundSFXVolume = 1.f; SoundSFXVolume = 1.f;
SoundGameMusicVolume = 1.f; SoundGameMusicVolume = 1.f;
SoundTPFade = 500; SoundTPFade = 500;
@ -473,7 +467,7 @@ CClientConfig::CClientConfig()
UserEntitySoundLevel = 0.5f; // Default volume for sound in 1st person UserEntitySoundLevel = 0.5f; // Default volume for sound in 1st person
UseEax = true; // Default to use EAX; UseEax = true; // Default to use EAX;
UseADPCM = false; // Defualt to PCM sample, NO ADPCM UseADPCM = false; // Defualt to PCM sample, NO ADPCM
MaxTrack = 32; // Default to 32 track MaxTrack = 32; // DEfault to 32 track
ColorShout = CRGBA(150,0,0,255); // Default Shout color. ColorShout = CRGBA(150,0,0,255); // Default Shout color.
ColorTalk = CRGBA(255,255,255,255); // Default Talk color. ColorTalk = CRGBA(255,255,255,255); // Default Talk color.
@ -788,8 +782,8 @@ void CClientConfig::setValues()
READ_STRINGVECTOR_FV(TexturesOutGameInterfaceDXTC); READ_STRINGVECTOR_FV(TexturesOutGameInterfaceDXTC);
// interface textures ingame and r2 // interface textures ingame and r2
READ_STRINGVECTOR_FV(TexturesInterface); //READ_STRINGVECTOR_FV(TexturesInterface);
READ_STRINGVECTOR_FV(TexturesInterfaceDXTC); //READ_STRINGVECTOR_FV(TexturesInterfaceDXTC);
// interface files login menus // interface files login menus
READ_STRINGVECTOR_FV(XMLLoginInterfaceFiles); READ_STRINGVECTOR_FV(XMLLoginInterfaceFiles);
@ -909,17 +903,77 @@ void CClientConfig::setValues()
READ_STRING_FV(FSHost) READ_STRING_FV(FSHost)
READ_BOOL_DEV(DisplayAccountButtons) READ_BOOL_DEV(DisplayAccountButtons)
READ_STRING_DEV(CreateAccountURL)
READ_STRING_DEV(EditAccountURL)
READ_STRING_DEV(ForgetPwdURL) READ_STRING_FV(CreateAccountURL)
READ_STRING_FV(EditAccountURL)
READ_STRING_FV(ForgetPwdURL)
READ_STRING_DEV(BetaAccountURL) READ_STRING_DEV(BetaAccountURL)
READ_STRING_DEV(FreeTrialURL) READ_STRING_DEV(FreeTrialURL)
// defined in client_default.cfg // defined in client_default.cfg
READ_STRING_FV(ConditionsTermsURL)
READ_STRING_FV(NamingPolicyURL)
READ_STRING_FV(LoginSupportURL) READ_STRING_FV(LoginSupportURL)
// read NamingPolicyURL from client_default.cfg
//READ_STRING_FV(NamingPolicyURL)
std::string languageCo = "wk";
CConfigFile::CVar *languageCodeVarPtr = ClientCfg.ConfigFile.getVarPtr("LanguageCode");
if (languageCodeVarPtr)
{
languageCo = languageCodeVarPtr->asString();
}
CConfigFile::CVar *policyurl = ClientCfg.ConfigFile.getVarPtr("NamingPolicyURL");
if (policyurl)
{
for (uint i = 0; i < policyurl->size(); ++i)
{
std::string entry = policyurl->asString(i);
if (entry.size() >= languageCo.size())
{
if (nlstricmp(entry.substr(0, languageCo.size()), languageCo) == 0)
{
std::string::size_type pos = entry.find("=");
if (pos != std::string::npos)
{
ClientCfg.NamingPolicyURL = entry.substr(pos + 1);
}
}
}
}
}
// read NamingPolicyURL from client_default.cfg
//READ_STRING_FV(ConditionsTermsURL)
CConfigFile::CVar *coturl = ClientCfg.ConfigFile.getVarPtr("ConditionsTermsURL");
if (coturl)
{
for (uint i = 0; i < coturl->size(); ++i)
{
std::string entry = coturl->asString(i);
if (entry.size() >= languageCo.size())
{
if (nlstricmp(entry.substr(0, languageCo.size()), languageCo) == 0)
{
std::string::size_type pos = entry.find("=");
if (pos != std::string::npos)
{
ClientCfg.ConditionsTermsURL = entry.substr(pos + 1);
}
}
}
}
}
#ifndef RZ_NO_CLIENT #ifndef RZ_NO_CLIENT
// if cookie is not empty, it means that the client was launch // if cookie is not empty, it means that the client was launch
// by the nel_launcher, so it can't be local // by the nel_launcher, so it can't be local
@ -1244,13 +1298,7 @@ void CClientConfig::setValues()
// SoundForceSoftwareBuffer // SoundForceSoftwareBuffer
READ_BOOL_FV(SoundForceSoftwareBuffer); READ_BOOL_FV(SoundForceSoftwareBuffer);
// SoundOutGameMusic // SoundOutGameMusic
READ_STRING_DEV(StartMusic) READ_STRING_DEV(SoundOutGameMusic)
READ_STRING_DEV(EmptySlotMusic)
READ_STRING_DEV(LoadingMusic)
READ_STRING_DEV(KamiTeleportMusic)
READ_STRING_DEV(KaravanTeleportMusic)
READ_STRING_DEV(TeleportLoadingMusic)
READ_STRING_DEV(DeathMusic)
// SoundSFXVolume // SoundSFXVolume
READ_FLOAT_FV(SoundSFXVolume); READ_FLOAT_FV(SoundSFXVolume);
// SoundGameMusicVolume // SoundGameMusicVolume

@ -348,14 +348,8 @@ struct CClientConfig
/// SoundForceSoftwareBuffer /// SoundForceSoftwareBuffer
bool SoundForceSoftwareBuffer; bool SoundForceSoftwareBuffer;
/// Music files /// The outgame music file
string StartMusic; string SoundOutGameMusic;
string EmptySlotMusic;
string LoadingMusic;
string KamiTeleportMusic;
string KaravanTeleportMusic;
string TeleportLoadingMusic;
string DeathMusic;
/// The Sound SFX Volume (0-1) (ie all but music) /// The Sound SFX Volume (0-1) (ie all but music)
float SoundSFXVolume; float SoundSFXVolume;

@ -193,6 +193,7 @@ bool hasPrivilegeG() { return (UserPrivileges.find(":G:") != std::string::npos);
bool hasPrivilegeEM() { return (UserPrivileges.find(":EM:") != std::string::npos); } bool hasPrivilegeEM() { return (UserPrivileges.find(":EM:") != std::string::npos); }
bool hasPrivilegeEG() { return (UserPrivileges.find(":EG:") != std::string::npos); } bool hasPrivilegeEG() { return (UserPrivileges.find(":EG:") != std::string::npos); }
bool hasPrivilegeOBSERVER() { return (UserPrivileges.find(":OBSERVER:") != std::string::npos); } bool hasPrivilegeOBSERVER() { return (UserPrivileges.find(":OBSERVER:") != std::string::npos); }
bool hasPrivilegeTESTER() { return (UserPrivileges.find(":TESTER:") != std::string::npos); }
// Restore the video mode (fullscreen for example) after the connection (done in a window) // Restore the video mode (fullscreen for example) after the connection (done in a window)
@ -278,73 +279,6 @@ void setOutGameFullScreen()
CViewRenderer::getInstance()->setInterfaceScale(1.0f, 1024, 768); CViewRenderer::getInstance()->setInterfaceScale(1.0f, 1024, 768);
} }
// ------------------------------------------------------------------------------------------------
class CSoundGlobalMenu
{
public:
CSoundGlobalMenu()
{
_MusicWantedAsync= false;
_NbFrameBeforeChange= NbFrameBeforeChangeMax;
}
void reset();
void setMusic(const string &music, bool async);
void updateSound();
private:
string _MusicPlayed;
string _MusicWanted;
bool _MusicWantedAsync;
sint _NbFrameBeforeChange;
enum {NbFrameBeforeChangeMax= 10};
};
void CSoundGlobalMenu::reset()
{
_MusicPlayed.clear();
_MusicWanted.clear();
}
void CSoundGlobalMenu::updateSound()
{
// **** update the music played
// The first music played is the music played at loading, before select char
if (_MusicPlayed.empty())
_MusicPlayed = toLower(LoadingMusic.empty() ? ClientCfg.StartMusic : LoadingMusic);
if (_MusicWanted.empty())
_MusicWanted = toLower(LoadingMusic.empty() ? ClientCfg.StartMusic : LoadingMusic);
// because music is changed when the player select other race for instance,
// wait the 3D to load (stall some secs)
// if the wanted music is the same as the one currently playing, just continue playing
if(_MusicPlayed!=_MusicWanted)
{
// wait nbFrameBeforeChangeMax before actually changing the music
_NbFrameBeforeChange--;
if(_NbFrameBeforeChange<=0)
{
_MusicPlayed= _MusicWanted;
// play the music
if (SoundMngr != NULL)
SoundMngr->playMusic(_MusicPlayed, 500, _MusicWantedAsync, true, true);
}
}
// **** update mngr
if (SoundMngr != NULL)
SoundMngr->update();
}
void CSoundGlobalMenu::setMusic(const string &music, bool async)
{
_MusicWanted= toLower(music);
_MusicWantedAsync= async;
// reset the counter
_NbFrameBeforeChange= NbFrameBeforeChangeMax;
}
static CSoundGlobalMenu SoundGlobalMenu;
// New version of the menu after the server connection // New version of the menu after the server connection
// //
@ -477,8 +411,6 @@ bool connection (const string &cookie, const string &fsaddr)
InterfaceState = GLOBAL_MENU; InterfaceState = GLOBAL_MENU;
} }
// No loading music here, this is right before character selection, using the existing music
// Create the loading texture. We can't do that before because we need to add search path first. // Create the loading texture. We can't do that before because we need to add search path first.
beginLoading (LoadBackground); beginLoading (LoadBackground);
UseEscapeDuringLoading = USE_ESCAPE_DURING_LOADING; UseEscapeDuringLoading = USE_ESCAPE_DURING_LOADING;
@ -581,7 +513,6 @@ bool reconnection()
ProgressBar.setFontFactor(1.0f); ProgressBar.setFontFactor(1.0f);
// Init out game // Init out game
SoundGlobalMenu.reset();
pIM->initOutGame(); pIM->initOutGame();
// Hide cursor for interface // Hide cursor for interface
@ -597,9 +528,6 @@ bool reconnection()
FarTP.setOutgame(); FarTP.setOutgame();
if (SoundMngr)
SoundMngr->setupFadeSound(1.0f, 1.0f);
// these two globals sequence GlobalMenu to display the character select dialog // these two globals sequence GlobalMenu to display the character select dialog
WaitServerAnswer = true; WaitServerAnswer = true;
userChar = true; userChar = true;
@ -634,8 +562,6 @@ bool reconnection()
// this also kicks the state machine to sendReady() so we stop spinning in farTPmainLoop // this also kicks the state machine to sendReady() so we stop spinning in farTPmainLoop
FarTP.setIngame(); FarTP.setIngame();
// Not loading music here, this is before character selection, keep existing music
// Create the loading texture. We can't do that before because we need to add search path first. // Create the loading texture. We can't do that before because we need to add search path first.
beginLoading (LoadBackground); beginLoading (LoadBackground);
UseEscapeDuringLoading = USE_ESCAPE_DURING_LOADING; UseEscapeDuringLoading = USE_ESCAPE_DURING_LOADING;
@ -811,6 +737,66 @@ std::string buildPlayerNameForSaveFile(const ucstring &playerNameIn)
return ret; return ret;
} }
// ------------------------------------------------------------------------------------------------
class CSoundGlobalMenu
{
public:
CSoundGlobalMenu()
{
_MusicWantedAsync= false;
_NbFrameBeforeChange= NbFrameBeforeChangeMax;
}
void setMusic(const string &music, bool async);
void updateSound();
private:
string _MusicPlayed;
string _MusicWanted;
bool _MusicWantedAsync;
sint _NbFrameBeforeChange;
enum {NbFrameBeforeChangeMax= 10};
};
void CSoundGlobalMenu::updateSound()
{
// **** update the music played
// The first music played is the music played at loading, before select char
if(_MusicPlayed.empty())
_MusicPlayed= toLower(ClientCfg.SoundOutGameMusic);
if(_MusicWanted.empty())
_MusicWanted= toLower(ClientCfg.SoundOutGameMusic);
// because music is changed when the player select other race for instance,
// wait the 3D to load (stall some secs)
// if the wanted music is the same as the one currently playing, just continue playing
if(_MusicPlayed!=_MusicWanted)
{
// wait nbFrameBeforeChangeMax before actually changing the music
_NbFrameBeforeChange--;
if(_NbFrameBeforeChange<=0)
{
_MusicPlayed= _MusicWanted;
// play the music
if (SoundMngr != NULL)
SoundMngr->playMusic(_MusicPlayed, 500, _MusicWantedAsync, true, true);
}
}
// **** update mngr
if (SoundMngr != NULL)
SoundMngr->update();
}
void CSoundGlobalMenu::setMusic(const string &music, bool async)
{
_MusicWanted= toLower(music);
_MusicWantedAsync= async;
// reset the counter
_NbFrameBeforeChange= NbFrameBeforeChangeMax;
}
static CSoundGlobalMenu SoundGlobalMenu;
static bool LuaBGDSuccessFlag = true; // tmp, for debug static bool LuaBGDSuccessFlag = true; // tmp, for debug
@ -1127,7 +1113,7 @@ TInterfaceState globalMenu()
charSelect = LoginCharsel; charSelect = LoginCharsel;
WaitServerAnswer = false; WaitServerAnswer = false;
if (charSelect == -1) if (charSelect == -1 || FarTP.isReselectingChar())
{ {
CCDBNodeLeaf *pNL = NLGUI::CDBManager::getInstance()->getDbProp("UI:SERVER_RECEIVED_CHARS", false); CCDBNodeLeaf *pNL = NLGUI::CDBManager::getInstance()->getDbProp("UI:SERVER_RECEIVED_CHARS", false);
if (pNL != NULL) if (pNL != NULL)
@ -2061,8 +2047,8 @@ public:
fromString(getParam(Params, "async"), async); fromString(getParam(Params, "async"), async);
// if empty name, return to default mode // if empty name, return to default mode
if (sName.empty()) if(sName.empty())
sName = ClientCfg.EmptySlotMusic; sName= ClientCfg.SoundOutGameMusic;
// change the music // change the music
SoundGlobalMenu.setMusic(sName, async); SoundGlobalMenu.setMusic(sName, async);

@ -49,12 +49,12 @@
#include "login_progress_post_thread.h" #include "login_progress_post_thread.h"
#include "interface_v3/action_handler_base.h" #include "interface_v3/action_handler_base.h"
#include "item_group_manager.h" #include "item_group_manager.h"
#include "nel/misc/cmd_args.h"
#ifdef DEBUG_NEW #ifdef DEBUG_NEW
#define new DEBUG_NEW #define new DEBUG_NEW
#endif #endif
using namespace NLMISC; using namespace NLMISC;
using namespace NLNET; using namespace NLNET;
using namespace NL3D; using namespace NL3D;
@ -210,6 +210,7 @@ extern bool IsInRingSession;
extern void selectTipsOfTheDay (uint tips); extern void selectTipsOfTheDay (uint tips);
#define BAR_STEP_TP 2 #define BAR_STEP_TP 2
extern NLMISC::CCmdArgs Args;
CLoginStateMachine::TEvent CLoginStateMachine::waitEvent() CLoginStateMachine::TEvent CLoginStateMachine::waitEvent()
{ {
@ -462,12 +463,14 @@ void CLoginStateMachine::run()
case st_check_patch: case st_check_patch:
/// check the data to check if patch needed /// check the data to check if patch needed
CLoginProgressPostThread::getInstance().step(CLoginStep(LoginStep_PostLogin, "login_step_post_login")); CLoginProgressPostThread::getInstance().step(CLoginStep(LoginStep_PostLogin, "login_step_post_login"));
if (!ClientCfg.PatchWanted)
if (!ClientCfg.PatchWanted || (Args.haveArg("n") && Args.getLongArg("nopatch").front() == "1"))
{ {
// client don't want to be patched ! // client don't want to be patched !
_CurrentState = st_display_eula; _CurrentState = st_display_eula;
break; break;
} }
initPatchCheck(); initPatchCheck();
SM_BEGIN_EVENT_TABLE SM_BEGIN_EVENT_TABLE
if (isBGDownloadEnabled()) if (isBGDownloadEnabled())
@ -1112,6 +1115,15 @@ void CFarTP::disconnectFromPreviousShard()
beginLoading (StartBackground); beginLoading (StartBackground);
UseEscapeDuringLoading = false; UseEscapeDuringLoading = false;
// Play music and fade out the Game Sound
if (SoundMngr)
{
// Loading Music Loop.ogg
LoadingMusic = ClientCfg.SoundOutGameMusic;
SoundMngr->playEventMusic(LoadingMusic, CSoundManager::LoadingMusicXFade, true);
SoundMngr->fadeOutGameSound(ClientCfg.SoundTPFade);
}
// Change the tips // Change the tips
selectTipsOfTheDay (rand()); selectTipsOfTheDay (rand());
@ -1120,21 +1132,6 @@ void CFarTP::disconnectFromPreviousShard()
ucstring nmsg("Loading..."); ucstring nmsg("Loading...");
ProgressBar.newMessage ( ClientCfg.buildLoadingString(nmsg) ); ProgressBar.newMessage ( ClientCfg.buildLoadingString(nmsg) );
ProgressBar.progress(0); ProgressBar.progress(0);
// Play music and fade out the Game Sound
if (SoundMngr)
{
SoundMngr->fadeOutGameSound(ClientCfg.SoundTPFade);
// Stop and enable music
SoundMngr->stopMusic(0);
SoundMngr->setupFadeSound(0.0f, 1.0f);
// Loading Music Loop.ogg
LoadingMusic = ClientCfg.LoadingMusic;
// SoundMngr->playEventMusic(LoadingMusic, CSoundManager::LoadingMusicXFade, true);
SoundMngr->playMusic(LoadingMusic, 0, false, true, true);
}
} }
// Disconnect from the FS // Disconnect from the FS
@ -1523,4 +1520,3 @@ void CFarTP::farTPmainLoop()
if(welcomeWindow) if(welcomeWindow)
initWelcomeWindow(); initWelcomeWindow();
} }

@ -1410,42 +1410,6 @@ void prelogInit()
StereoDisplay->setDriver(Driver); // VR_DRIVER StereoDisplay->setDriver(Driver); // VR_DRIVER
} }
{
H_AUTO(InitRZSound)
// Init the sound manager
nmsg = "Initializing sound manager...";
ProgressBar.newMessage(ClientCfg.buildLoadingString(nmsg));
if (ClientCfg.SoundOn)
{
nlassert(!SoundMngr);
SoundMngr = new CSoundManager(&ProgressBar);
try
{
SoundMngr->init(&ProgressBar);
}
catch(const Exception &e)
{
nlwarning("init : Error when creating 'SoundMngr' : %s", e.what());
delete SoundMngr;
SoundMngr = NULL;
}
// Play Music just after the SoundMngr is inited
if (SoundMngr)
{
// init the SoundMngr with backuped volume
SoundMngr->setSFXVolume(ClientCfg.SoundSFXVolume);
SoundMngr->setGameMusicVolume(ClientCfg.SoundGameMusicVolume);
// Play the login screen music
SoundMngr->playMusic(ClientCfg.StartMusic, 0, true, true, true);
}
}
CPath::memoryCompress(); // Because sound calls addSearchPath
}
nlinfo ("PROFILE: %d seconds for prelogInit", (uint32)(ryzomGetLocalTime ()-initStart)/1000); nlinfo ("PROFILE: %d seconds for prelogInit", (uint32)(ryzomGetLocalTime ()-initStart)/1000);
FPU_CHECKER_ONCE FPU_CHECKER_ONCE
@ -1588,6 +1552,55 @@ void postlogInit()
// set the primitive context // set the primitive context
CPrimitiveContext::instance().CurrentLigoConfig = &LigoConfig; CPrimitiveContext::instance().CurrentLigoConfig = &LigoConfig;
{
H_AUTO(InitRZSound)
// Init the sound manager
nmsg = "Initializing sound manager...";
ProgressBar.newMessage ( ClientCfg.buildLoadingString(nmsg) );
if(ClientCfg.SoundOn)
{
SoundMngr = new CSoundManager(&ProgressBar);
try
{
SoundMngr->init(&ProgressBar);
}
catch(const Exception &e)
{
nlwarning("init : Error when creating 'SoundMngr' : %s", e.what());
delete SoundMngr;
SoundMngr = NULL;
}
// Play Music just after the SoundMngr is inited
if(SoundMngr)
{
// init the SoundMngr with backuped volume
SoundMngr->setSFXVolume(ClientCfg.SoundSFXVolume);
SoundMngr->setGameMusicVolume(ClientCfg.SoundGameMusicVolume);
// no fadein, and not async because don't work well because of loading in the main thread
// Force use GameMusic volume
const uint fadeInTime= 500;
SoundMngr->playMusic(ClientCfg.SoundOutGameMusic, fadeInTime, false, true, true);
// Because of blocking loading, force the fadeIn
TTime t0= ryzomGetLocalTime();
TTime t1;
while((t1=ryzomGetLocalTime())<t0+fadeInTime)
{
//ProgressBar.progress(1.f);
SoundMngr->updateAudioMixerOnly();
}
}
}
CPath::memoryCompress(); // Because sound call addSearchPath
initLast = initCurrent;
initCurrent = ryzomGetLocalTime();
//nlinfo ("PROFILE: %d seconds (%d total) for Initializing sound manager", (uint32)(initCurrent-initLast)/1000, (uint32)(initCurrent-initStart)/1000);
}
{ {
H_AUTO(InitRZShIdI) H_AUTO(InitRZShIdI)

@ -473,27 +473,6 @@ void initMainLoop()
FPU_CHECKER_ONCE FPU_CHECKER_ONCE
if (SoundMngr)
{
// Loading Music
LoadingMusic = ClientCfg.LoadingMusic;
// SoundMngr->playEventMusic(LoadingMusic, CSoundManager::LoadingMusicXFade, true);
// no fadein, and not async because don't work well because of loading in the main thread
// Force use GameMusic volume
const uint fadeInTime = 500;
SoundMngr->playMusic(LoadingMusic, fadeInTime, false, true, true);
// Because of blocking loading, force the fadeIn
TTime t0 = ryzomGetLocalTime();
TTime t1;
do
{
ProgressBar.progress(0);
SoundMngr->updateAudioMixerOnly();
nlSleep(10);
} while ((t1 = ryzomGetLocalTime()) < t0 + fadeInTime);
}
// Get the interface manager // Get the interface manager
CInterfaceManager *pIM = CInterfaceManager::getInstance(); CInterfaceManager *pIM = CInterfaceManager::getInstance();

@ -271,16 +271,16 @@ void CInputHandlerManager::operator ()(const NLMISC::CEvent &event)
{ {
CViewPointer &rIP = *static_cast<CViewPointer *>(CWidgetManager::getInstance()->getPointer()); CViewPointer &rIP = *static_cast< CViewPointer* >( CWidgetManager::getInstance()->getPointer() );
NLGUI::CEventDescriptorMouse eventDesc; NLGUI::CEventDescriptorMouse eventDesc;
sint32 x, y; sint32 x,y;
rIP.getPointerDispPos(x, y); rIP.getPointerDispPos (x, y);
eventDesc.setX(x); eventDesc.setX (x);
eventDesc.setY(y); eventDesc.setY (y);
bool handled = false; bool handled= false;
// button down ? // button down ?
static volatile bool doTest = false; static volatile bool doTest = false;
@ -291,7 +291,7 @@ void CInputHandlerManager::operator ()(const NLMISC::CEvent &event)
{ {
if (_RecoverFocusLost) if (_RecoverFocusLost)
{ {
handled |= updateMousePos((CEventMouse&)event); // must update mouse pos here, handled |= updateMousePos((CEventMouse&)event, eventDesc); // must update mouse pos here,
// because when app window focus is gained by a mouse click, this is // because when app window focus is gained by a mouse click, this is
// the only place where we can retrieve mouse pos before a mouse move // the only place where we can retrieve mouse pos before a mouse move
_RecoverFocusLost = false; _RecoverFocusLost = false;
@ -299,19 +299,10 @@ void CInputHandlerManager::operator ()(const NLMISC::CEvent &event)
if (!handled) if (!handled)
{ {
if (R2::getEditor().isInitialized() if (R2::getEditor().isInitialized()
&& (R2::isEditionCurrent() || R2::getEditor().getCurrentTool())) && (R2::isEditionCurrent() || R2::getEditor().getCurrentTool())
)
{ {
const NLMISC::CEventMouseDown *mouseDownEvent = static_cast<const NLMISC::CEventMouseDown *>(&event); handled |= R2::getEditor().handleEvent(eventDesc);
if (mouseDownEvent->Button & NLMISC::leftButton)
{
eventDesc.setEventTypeExtended(CEventDescriptorMouse::mouseleftdown);
handled |= R2::getEditor().handleEvent(eventDesc);
}
if (mouseDownEvent->Button & NLMISC::rightButton)
{
eventDesc.setEventTypeExtended(CEventDescriptorMouse::mouserightdown);
handled |= R2::getEditor().handleEvent(eventDesc);
}
} }
} }
handled |= inputHandler.handleMouseButtonDownEvent( event ); handled |= inputHandler.handleMouseButtonDownEvent( event );
@ -330,7 +321,7 @@ void CInputHandlerManager::operator ()(const NLMISC::CEvent &event)
// mouse move? // mouse move?
else if(event == EventMouseMoveId) else if(event == EventMouseMoveId)
{ {
handled |= updateMousePos((CEventMouse&)event); handled |= updateMousePos((CEventMouse&)event, eventDesc);
} }
else if (event == EventMouseWheelId) else if (event == EventMouseWheelId)
{ {
@ -339,77 +330,19 @@ void CInputHandlerManager::operator ()(const NLMISC::CEvent &event)
} }
// if Event not handled, post to Action Manager // if Event not handled, post to Action Manager
if (!handled) if( !handled )
{ {
bool handled = false;
if (R2::getEditor().isInitialized() if (R2::getEditor().isInitialized()
&& (R2::isEditionCurrent() || R2::getEditor().getCurrentTool())) && (R2::isEditionCurrent() || R2::getEditor().getCurrentTool())
)
{ {
if (event == EventMouseDownId) handled = R2::getEditor().handleEvent(eventDesc);
{
const NLMISC::CEventMouseDown *mouseDownEvent = static_cast<const NLMISC::CEventMouseDown *>(&event);
if (mouseDownEvent->Button & NLMISC::leftButton)
{
eventDesc.setEventTypeExtended(CEventDescriptorMouse::mouseleftdown);
handled |= R2::getEditor().handleEvent(eventDesc);
}
if (mouseDownEvent->Button & NLMISC::rightButton)
{
eventDesc.setEventTypeExtended(CEventDescriptorMouse::mouserightdown);
handled |= R2::getEditor().handleEvent(eventDesc);
}
}
else if (event == EventMouseUpId)
{
const NLMISC::CEventMouseUp *mouseUpEvent = static_cast<const NLMISC::CEventMouseUp *>(&event);
if (mouseUpEvent->Button & NLMISC::leftButton)
{
eventDesc.setEventTypeExtended(CEventDescriptorMouse::mouseleftup);
handled |= R2::getEditor().handleEvent(eventDesc);
}
if (mouseUpEvent->Button & NLMISC::rightButton)
{
eventDesc.setEventTypeExtended(CEventDescriptorMouse::mouserightup);
handled |= R2::getEditor().handleEvent(eventDesc);
}
}
else if (event == EventMouseDblClkId)
{
const NLMISC::CEventMouseDblClk *mouseDblClkEvent = static_cast<const NLMISC::CEventMouseDblClk *>(&event);
if (mouseDblClkEvent->Button & NLMISC::leftButton)
{
eventDesc.setEventTypeExtended(CEventDescriptorMouse::mouseleftdblclk);
handled |= R2::getEditor().handleEvent(eventDesc);
}
if (mouseDblClkEvent->Button & NLMISC::rightButton)
{
eventDesc.setEventTypeExtended(CEventDescriptorMouse::mouserightdblclk);
handled |= R2::getEditor().handleEvent(eventDesc);
}
}
else
{
if (event == EventMouseWheelId)
{
const NLMISC::CEventMouseWheel *wheelEvent = static_cast<const NLMISC::CEventMouseWheel *>(&event);
eventDesc.setEventTypeExtended(CEventDescriptorMouse::mousewheel);
eventDesc.setWheel(wheelEvent->Direction ? 1 : -1);
handled = R2::getEditor().handleEvent(eventDesc);
}
else if (event == EventMouseMoveId)
{
eventDesc.setEventTypeExtended(CEventDescriptorMouse::mousemove);
handled = R2::getEditor().handleEvent(eventDesc);
}
else
{
nlwarning("R2 unknown mouse event '%s'", event.toString().c_str());
}
}
} }
if (!handled) if (!handled)
{ {
// post to Action Manager // post to Action Manager
FilteredEventServer.postEvent(event.clone()); FilteredEventServer.postEvent( event.clone() );
} }
} }
} }
@ -422,7 +355,7 @@ void CInputHandlerManager::operator ()(const NLMISC::CEvent &event)
// *************************************************************************** // ***************************************************************************
bool CInputHandlerManager::updateMousePos(NLMISC::CEventMouse &event) bool CInputHandlerManager::updateMousePos(NLMISC::CEventMouse &event, NLGUI::CEventDescriptorMouse &eventDesc)
{ {
if (!IsMouseFreeLook()) if (!IsMouseFreeLook())
return inputHandler.handleMouseMoveEvent( event ); return inputHandler.handleMouseMoveEvent( event );

@ -181,7 +181,7 @@ private:
void parseKey(xmlNodePtr cur, std::vector<CComboKey> &out); void parseKey(xmlNodePtr cur, std::vector<CComboKey> &out);
// return true if handled // return true if handled
bool updateMousePos(NLMISC::CEventMouse &event); bool updateMousePos(NLMISC::CEventMouse &event, NLGUI::CEventDescriptorMouse &eventDesc);
NLGUI::CInputHandler inputHandler; NLGUI::CInputHandler inputHandler;

@ -3648,23 +3648,19 @@ void CInventoryManager::onTradeChangeSession()
// *************************************************************************** // ***************************************************************************
void CInventoryManager::updateItemInfoQueue() void CInventoryManager::updateItemInfoQueue()
{ {
if (!ConnectionReadySent) // CONNECTION:READY not yet sent, so we cannot send requests yet!
{
// Caused by CNetworkConnection::reinit, and NLMISC::CCDBNodeBranch::resetData
// TODO: Item sheets are effectively being set to 0, any way to detect this in particular?
// Slots with sheet 0 won't have any info to request anyway!
// Remove this check in favour of the assert lower down when properly implemented.
nlwarning("Update item info queue (%i), but connection not ready", (int)_ItemInfoWaiters.size());
return;
}
// CONNECTION:READY not yet sent, so we cannot send requests yet!
nlassert(ConnectionReadySent || !_ItemInfoWaiters.size());
// For All waiters, look if one need update. // For All waiters, look if one need update.
TItemInfoWaiters::iterator it; TItemInfoWaiters::iterator it;
for(it= _ItemInfoWaiters.begin();it!=_ItemInfoWaiters.end();it++) for(it= _ItemInfoWaiters.begin();it!=_ItemInfoWaiters.end();it++)
{ {
/* yoyo remove: temp patch to be sure that the client does not send messages before the
CONNECTION:READY is sent
Ulukyn: this only happens if player ask to reselect a char before end of update items.
On this case, skip it...
*/
if (!ConnectionReadySent)
continue;
IItemInfoWaiter *waiter=*it; IItemInfoWaiter *waiter=*it;
uint itemSlotId= waiter->ItemSlotId; uint itemSlotId= waiter->ItemSlotId;
TItemInfoMap::iterator it= _ItemInfoMap.find(itemSlotId); TItemInfoMap::iterator it= _ItemInfoMap.find(itemSlotId);

@ -1932,8 +1932,11 @@ class CAHOpenURL : public IActionHandler
#else #else
// TODO: for Linux and Mac OS // TODO: for Linux and Mac OS
#endif #endif
if (sParams == "cfg_CreateAccountURL")
if (sParams == "cfg_EditAccountURL") {
url = ClientCfg.CreateAccountURL;
}
else if (sParams == "cfg_EditAccountURL")
{ {
url = ClientCfg.EditAccountURL; url = ClientCfg.EditAccountURL;
} }
@ -1972,31 +1975,34 @@ class CAHOpenURL : public IActionHandler
return; return;
} }
// modify existing languages if(sParams != "cfg_ConditionsTermsURL" && sParams != "cfg_NamingPolicyURL")
{
// modify existing languages
// old site // old site
string::size_type pos_lang = url.find("/en/"); string::size_type pos_lang = url.find("/en/");
// or new forums // or new forums
if (pos_lang == string::npos) if (pos_lang == string::npos)
pos_lang = url.find("=en#"); pos_lang = url.find("=en#");
if (pos_lang != string::npos) if (pos_lang != string::npos)
{ {
url.replace(pos_lang + 1, 2, ClientCfg.getHtmlLanguageCode()); url.replace(pos_lang + 1, 2, ClientCfg.getHtmlLanguageCode());
} }
else
{
// append language
if (url.find('?') != string::npos)
url += "&";
else else
url += "?"; {
// append language
if (url.find('?') != string::npos)
url += "&";
else
url += "?";
url += "language=" + ClientCfg.LanguageCode; url += "language=" + ClientCfg.LanguageCode;
if (!LoginCustomParameters.empty()) if (!LoginCustomParameters.empty())
url += LoginCustomParameters; url += LoginCustomParameters;
}
} }
openURL(url); openURL(url);
@ -3283,7 +3289,6 @@ bool loginIntroSkip;
void loginIntro() void loginIntro()
{ {
// Display of nevrax logo is done at init time (see init.cpp) just before addSearchPath (second one) // Display of nevrax logo is done at init time (see init.cpp) just before addSearchPath (second one)
#if 0
for (uint i = 0; i < 1; i++) // previously display nevrax then nvidia for (uint i = 0; i < 1; i++) // previously display nevrax then nvidia
{ {
if (i != 0) if (i != 0)
@ -3321,7 +3326,6 @@ void loginIntro()
NLGUI::CDBManager::getInstance()->flushObserverCalls(); NLGUI::CDBManager::getInstance()->flushObserverCalls();
} }
} }
#endif
beginLoading(StartBackground); beginLoading(StartBackground);
ProgressBar.finish(); ProgressBar.finish();
} }

@ -2255,21 +2255,19 @@ bool mainLoop()
{ {
StartPlayTime = NLMISC::CTime::getLocalTime(); StartPlayTime = NLMISC::CTime::getLocalTime();
} }
// Start background sound play now ! (nb: restarted if load just ended, or if sound re-enabled) // Start background sound play now ! (nb: restarted if load just ended, or if sound re-enabled)
if (SoundMngr) if (SoundMngr)
{ {
H_AUTO_USE ( RZ_Client_Main_Loop_Sound ) H_AUTO_USE ( RZ_Client_Main_Loop_Sound )
SoundMngr->playBackgroundSound();
}
// Fade in Game Sound now (before endLoading)
if(SoundMngr)
{
// fade out loading music // fade out loading music
if (SoundMngr->getEventMusicPlayed() == LoadingMusic) if(LoadingMusic==SoundMngr->getEventMusicPlayed())
{
SoundMngr->stopEventMusic(LoadingMusic, CSoundManager::LoadingMusicXFade); SoundMngr->stopEventMusic(LoadingMusic, CSoundManager::LoadingMusicXFade);
}
SoundMngr->playBackgroundSound();
// Fade in Game Sound now (before endLoading)
// fade in game sound // fade in game sound
SoundMngr->fadeInGameSound(ClientCfg.SoundTPFade); SoundMngr->fadeInGameSound(ClientCfg.SoundTPFade);
} }
@ -2533,7 +2531,7 @@ bool mainLoop()
EditActions.enable(true); EditActions.enable(true);
// For stoping the outgame music, start after 30 frames, and duration of 3 seconds // For stoping the outgame music, start after 30 frames, and duration of 3 seconds
outgameFader = CMusicFader(60, 3); // CMusicFader outgameFader(60, 3);
// check for banned player // check for banned player
if (testPermanentBanMarkers()) if (testPermanentBanMarkers())

@ -33,6 +33,7 @@
#include "game_share/chat_group.h" #include "game_share/chat_group.h"
#include "game_share/character_summary.h" #include "game_share/character_summary.h"
#include "game_share/sphrase_com.h" #include "game_share/sphrase_com.h"
#include "game_share/outpost.h"
#include "game_share/msg_client_server.h" #include "game_share/msg_client_server.h"
#include "game_share/ryzom_database_banks.h" #include "game_share/ryzom_database_banks.h"
#include "game_share/msg_encyclopedia.h" #include "game_share/msg_encyclopedia.h"
@ -1488,33 +1489,32 @@ void impulseTPCommon(NLMISC::CBitMemStream &impulse, bool hasSeason)
void impulseTPCommon2(NLMISC::CBitMemStream &impulse, bool hasSeason) void impulseTPCommon2(NLMISC::CBitMemStream &impulse, bool hasSeason)
{ {
// choose a default screen if not setuped // choose a default screen if not setuped
if (LoadingBackground != ResurectKamiBackground && LoadingBackground != ResurectKaravanBackground if( LoadingBackground!=ResurectKamiBackground && LoadingBackground!=ResurectKaravanBackground &&
&& LoadingBackground != TeleportKamiBackground && LoadingBackground != TeleportKaravanBackground) LoadingBackground!=TeleportKamiBackground && LoadingBackground!=TeleportKaravanBackground)
LoadingBackground = ElevatorBackground; LoadingBackground= TeleportKaravanBackground;
// if resurect but user not dead, choose default. NB: this is a bug, the tp impulse should tell // if resurect but user not dead, choose default. NB: this is a bug, the tp impulse should tell
// which background to choose. \todo yoyo: this is a temp fix // which background to choose. \todo yoyo: this is a temp fix
if (UserEntity && !UserEntity->isDead() && (LoadingBackground == ResurectKamiBackground || LoadingBackground == ResurectKaravanBackground)) if( UserEntity && !UserEntity->isDead() &&
LoadingBackground = ElevatorBackground; (LoadingBackground==ResurectKamiBackground || LoadingBackground==ResurectKaravanBackground) )
LoadingBackground= TeleportKaravanBackground;
// Play music according to the background // Play music according to the background
if (SoundMngr) if(SoundMngr)
{ {
LoadingMusic.clear(); LoadingMusic.clear();
switch (LoadingBackground) if(LoadingBackground==TeleportKamiBackground)
LoadingMusic= "Kami Teleport.ogg";
else if(LoadingBackground==TeleportKaravanBackground)
LoadingMusic= "Karavan Teleport.ogg";
// if resurection, continue to play death music
else if(LoadingBackground==ResurectKamiBackground || LoadingBackground==ResurectKaravanBackground)
{ {
case TeleportKamiBackground: // noop
LoadingMusic = ClientCfg.KamiTeleportMusic; }
break; // default: loading music
case TeleportKaravanBackground: else
LoadingMusic = ClientCfg.KaravanTeleportMusic; {
break; LoadingMusic= "Loading Music Loop.ogg";
case ResurectKamiBackground:
case ResurectKaravanBackground:
// TODO: Resurrect music
break;
default:
LoadingMusic = ClientCfg.TeleportLoadingMusic;
break;
} }
// start to play // start to play
@ -3206,9 +3206,11 @@ void impulseUserBars(NLMISC::CBitMemStream &impulse)
void impulseOutpostChooseSide(NLMISC::CBitMemStream &impulse) void impulseOutpostChooseSide(NLMISC::CBitMemStream &impulse)
{ {
// read message // read message
uint8 type;
bool outpostInFire; bool outpostInFire;
bool playerGuildInConflict; bool playerGuildInConflict;
bool playerGuildIsAttacker; bool playerGuildIsAttacker;
impulse.serial(type);
impulse.serial(outpostInFire); impulse.serial(outpostInFire);
impulse.serial(playerGuildInConflict); impulse.serial(playerGuildInConflict);
impulse.serial(playerGuildIsAttacker); impulse.serial(playerGuildIsAttacker);
@ -3220,7 +3222,7 @@ void impulseOutpostChooseSide(NLMISC::CBitMemStream &impulse)
impulse.serial( declTimer ); impulse.serial( declTimer );
// start // start
OutpostManager.startPvpJoinProposal(outpostInFire, playerGuildInConflict, playerGuildIsAttacker, OutpostManager.startPvpJoinProposal((OUTPOSTENUMS::TPVPType)type, outpostInFire, playerGuildInConflict, playerGuildIsAttacker,
ownerGuildNameId, attackerGuildNameId, declTimer); ownerGuildNameId, attackerGuildNameId, declTimer);
} }

@ -2674,17 +2674,6 @@ void CUserEntity::selection(const CLFECOMMON::TCLEntityId &slot) // virtual
{ {
playerGiftNeeded->setValue32(0); playerGiftNeeded->setValue32(0);
} }
//
missionOption = NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:TARGET:CONTEXT_MENU:MISSIONS_OPTIONS:%d:TITLE", (int) k), false);
if (missionOption)
{
missionOption->setValue32(0);
}
playerGiftNeeded = NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:TARGET:CONTEXT_MENU:MISSIONS_OPTIONS:%d:PLAYER_GIFT_NEEDED", (int) k), false);
if (playerGiftNeeded)
{
playerGiftNeeded->setValue32(0);
}
} }
/* TODO ULU : Add RP tags */ /* TODO ULU : Add RP tags */
@ -4313,19 +4302,20 @@ void CUserEntity::updatePreCollision(const NLMISC::TTime &time, CEntityCL *targe
// test each frame if the mode has changed // test each frame if the mode has changed
if(SoundMngr) if(SoundMngr)
{ {
string deadMusic= "death.ogg";
// Play/stop music if comes from or goes to dead // Play/stop music if comes from or goes to dead
bool isDead = _Mode == MBEHAV::DEATH || _Mode == MBEHAV::SWIM_DEATH; bool isDead= _Mode==MBEHAV::DEATH || _Mode==MBEHAV::SWIM_DEATH;
// must start music? // must start music?
if (isDead && SoundMngr->getEventMusicPlayed() != ClientCfg.DeathMusic) if( isDead && SoundMngr->getEventMusicPlayed()!=deadMusic )
{ {
SoundMngr->playEventMusic(ClientCfg.DeathMusic, 0, true); SoundMngr->playEventMusic(deadMusic, 0, true);
} }
// must end music? // must end music?
if (!isDead && SoundMngr->getEventMusicPlayed() == ClientCfg.DeathMusic) if( !isDead && SoundMngr->getEventMusicPlayed()==deadMusic )
{ {
SoundMngr->stopEventMusic(ClientCfg.DeathMusic, CSoundManager::LoadingMusicXFade); SoundMngr->stopEventMusic(deadMusic, CSoundManager::LoadingMusicXFade);
} }
} }
} }

Loading…
Cancel
Save