Changed: Changes from last patch

hg/feature/sound
kervala 14 years ago
parent dc5b3628ec
commit 0f5605e537

@ -5743,3 +5743,24 @@ NLMISC_COMMAND(guildmotd, "Set the guild message of the day","<msg of the day>")
return true; return true;
} }
NLMISC_COMMAND(time, "Shows information about the current time", "")
{
const uint8 size = 50;
char cs_local[size];
char cs_utc[size];
time_t date;
time(&date);
struct tm *tm;
tm = localtime(&date);
strftime(cs_local, size, "%X", tm);
tm = gmtime(&date);
strftime(cs_utc, size, "%X", tm);
ucstring msg = CI18N::get("uiCurrentLocalAndUtcTime");
strFindReplace(msg, "%local", cs_local);
strFindReplace(msg, "%utc", cs_utc);
CInterfaceManager::getInstance()->displaySystemInfo(msg, "AROUND");
return true;
}

@ -2999,8 +2999,17 @@ void CEntityCL::updateClipped(const NLMISC::TTime &/* currentTimeInMs */, CEntit
void CEntityCL::updateVisiblePostPos(const NLMISC::TTime &/* currentTimeInMs */, CEntityCL * /* target */) void CEntityCL::updateVisiblePostPos(const NLMISC::TTime &/* currentTimeInMs */, CEntityCL * /* target */)
{ {
if (R2::isEditionCurrent()) return; // selection managed by r2 editor in edition mode if (R2::isEditionCurrent()) return; // selection managed by r2 editor in edition mode
bool bShowReticle = true;
CCDBNodeLeaf* node = CInterfaceManager::getInstance()->getDbProp("UI:SAVE:SHOW_RETICLE");
if (node)
{
bShowReticle = node->getValueBool();
}
// No-op if I am not the current UserEntity Target // No-op if I am not the current UserEntity Target
if(isTarget()) if(bShowReticle && isTarget())
{ {
// activate selection fx // activate selection fx
if (_SelectionFX.empty()) if (_SelectionFX.empty())
@ -3028,7 +3037,7 @@ void CEntityCL::updateVisiblePostPos(const NLMISC::TTime &/* currentTimeInMs */,
} }
// Mouse over SFX, only if the entity is selectable // Mouse over SFX, only if the entity is selectable
if (ShowInterface && !isTarget() && isUnderCursor() && properties().selectable()) if (bShowReticle && ShowInterface && !isTarget() && isUnderCursor() && properties().selectable())
{ {
// activate selection fx // activate selection fx
if (_MouseOverFX.empty()) if (_MouseOverFX.empty())

@ -356,7 +356,7 @@ class CAHEditPreviousLine : public CAHEdit
{ {
void actionPart () void actionPart ()
{ {
if(_GroupEdit->getMaxHistoric()) if (_GroupEdit->getMaxHistoric() && (! _GroupEdit->getViewText()->getMultiLine()))
{ {
// Get the start of the string. // Get the start of the string.
ucstring startStr= _GroupEdit->getInputStringRef().substr(0, _GroupEdit->getCursorPos()); ucstring startStr= _GroupEdit->getInputStringRef().substr(0, _GroupEdit->getCursorPos());
@ -372,7 +372,7 @@ class CAHEditPreviousLine : public CAHEdit
} }
} }
} }
else if (!_GroupEdit->getMaxHistoric() && _GroupEdit->getViewText()->getMultiLine()) else if (_GroupEdit->getViewText()->getMultiLine())
{ {
uint cursorPosInText = _GroupEdit->getCursorPos() + (uint)_GroupEdit->getPrompt().length(); uint cursorPosInText = _GroupEdit->getCursorPos() + (uint)_GroupEdit->getPrompt().length();
if ( if (
@ -428,7 +428,7 @@ class CAHEditNextLine : public CAHEdit
{ {
void actionPart () void actionPart ()
{ {
if(_GroupEdit->getMaxHistoric() && _GroupEdit->getCurrentHistoricIndex()>0) if( (! _GroupEdit->getViewText()->getMultiLine()) && _GroupEdit->getMaxHistoric() && _GroupEdit->getCurrentHistoricIndex()>0)
{ {
// Get the start of the string. // Get the start of the string.
ucstring startStr= _GroupEdit->getInputStringRef().substr(0, _GroupEdit->getCursorPos()); ucstring startStr= _GroupEdit->getInputStringRef().substr(0, _GroupEdit->getCursorPos());
@ -444,7 +444,7 @@ class CAHEditNextLine : public CAHEdit
} }
} }
} }
else if (!_GroupEdit->getMaxHistoric() && _GroupEdit->getViewText()->getMultiLine()) else if (_GroupEdit->getViewText()->getMultiLine())
{ {
sint cx, cy; sint cx, cy;
sint height; sint height;

@ -111,6 +111,7 @@ string convertLanguageIntToLanguageCode(sint val)
case 1: return "fr"; break; case 1: return "fr"; break;
case 2: return "de"; break; case 2: return "de"; break;
case 3: return "ru"; break; case 3: return "ru"; break;
case 4: return "es"; break;
} }
} }
@ -2467,7 +2468,7 @@ class CAHAddShape : public IActionHandler
string c = getParam(Params, "text"); string c = getParam(Params, "text");
string u = getParam(Params, "url"); string u = getParam(Params, "url");
string texture_name = getParam(Params, "texture"); string texture_name = getParam(Params, "texture");
string highlight = getParam(Params, "texture"); string highlight = getParam(Params, "highlight");
string transparency = getParam(Params, "transparency"); string transparency = getParam(Params, "transparency");
if (!getParam(Params, "x").empty()) if (!getParam(Params, "x").empty())

@ -65,6 +65,8 @@
#include "../r2/editor.h" #include "../r2/editor.h"
#include "../init.h" #include "../init.h"
#include "../browse_faq.h" #include "../browse_faq.h"
#include "people_list.h"
#include "people_interraction.h"
extern CSheetManager SheetMngr; extern CSheetManager SheetMngr;
@ -618,7 +620,34 @@ class CHandlerOpenTitleHelp : public IActionHandler
void execute (CCtrlBase *pCaller, const std::string &sParams) void execute (CCtrlBase *pCaller, const std::string &sParams)
{ {
// display web profile if necessary // display web profile if necessary
if (getParam(sParams, "from") == "target") if (getParam(sParams, "from") == "contact")
{
if (pCaller == NULL)
return;
CInterfaceGroup *fatherGC = pCaller->getParent();
if (fatherGC == NULL)
return;
fatherGC = fatherGC->getParent();
if (fatherGC == NULL)
return;
string str = fatherGC->getId().substr(0,fatherGC->getId().rfind('_'));
str = str.substr(str.rfind(':')+1, str.size());
CPeopleList *peopleList = PeopleInterraction.getPeopleListFromContainerID(str);
if (peopleList == NULL)
return;
sint index = peopleList->getIndexFromContainerID(fatherGC->getId());
if (index == -1)
return;
ucstring name = peopleList->getName(index);
if ( ! name.empty())
{
CInterfaceManager::getInstance()->runActionHandler("show_hide", pCaller, "profile|pname="+name.toUtf8()+"|ptype="+toString((int)CEntityCL::Player));
}
return;
}
else if (getParam(sParams, "from") == "target")
{ {
// Require info on the target // Require info on the target
CEntityCL *selection = EntitiesMngr.entity(UserEntity->selection()); CEntityCL *selection = EntitiesMngr.entity(UserEntity->selection());

@ -378,7 +378,7 @@ void CChatTargetFilter::setTargetGroup(CChatGroup::TGroupType groupType, uint32
const bool guildActive = pIM->getDbProp("SERVER:GUILD:NAME")->getValueBool(); const bool guildActive = pIM->getDbProp("SERVER:GUILD:NAME")->getValueBool();
switch(groupType) switch(groupType)
{ {
case CChatGroup::dyn_chat: // dyn_chat takes the color of say case CChatGroup::dyn_chat: entry+="DYN"; break;
case CChatGroup::say: entry+="SAY"; break; case CChatGroup::say: entry+="SAY"; break;
case CChatGroup::shout: entry+="SHOUT"; break; case CChatGroup::shout: entry+="SHOUT"; break;
case CChatGroup::team: if(!teamActive) return; entry+="GROUP"; break; case CChatGroup::team: if(!teamActive) return; entry+="GROUP"; break;

@ -557,9 +557,12 @@ void CChatGroupWindow::displayMessage(const ucstring &msg, NLMISC::CRGBA col, CC
CInterfaceManager *pIM= CInterfaceManager::getInstance(); CInterfaceManager *pIM= CInterfaceManager::getInstance();
CRGBA newMsgColor= stringToRGBA(pIM->getDefine("chat_group_tab_color_newmsg").c_str()); CRGBA newMsgColor= stringToRGBA(pIM->getDefine("chat_group_tab_color_newmsg").c_str());
ucstring newmsg = msg;
ucstring prefix;
if (gl != NULL) if (gl != NULL)
{ {
gl->addChild(ctm.createMsgText(msg, col)); gl->addChild(ctm.createMsgText(newmsg, col));
if (!gl->getParent()->getActive()) if (!gl->getParent()->getActive())
if (tab != NULL) if (tab != NULL)
tab->setTextColorNormal(newMsgColor); tab->setTextColorNormal(newMsgColor);
@ -584,14 +587,37 @@ void CChatGroupWindow::displayMessage(const ucstring &msg, NLMISC::CRGBA col, CC
case CChatGroup::guild: if (ci.Guild.isListeningWindow(cw)) gl = gl2; break; case CChatGroup::guild: if (ci.Guild.isListeningWindow(cw)) gl = gl2; break;
case CChatGroup::system: if (ci.SystemInfo.isListeningWindow(cw)) gl = gl2; break; case CChatGroup::system: if (ci.SystemInfo.isListeningWindow(cw)) gl = gl2; break;
case CChatGroup::universe: if (ci.Universe.isListeningWindow(cw)) gl = gl2; break; case CChatGroup::universe: if (ci.Universe.isListeningWindow(cw)) gl = gl2; break;
// NB: the yubo chat and dyn_chat cannot be in a user chat case CChatGroup::dyn_chat:
if (ci.DynamicChat[dynamicChatDbIndex].isListeningWindow(cw))
{
gl = gl2;
// Add dynchannel number and optionally name before text if user channel
CCDBNodeLeaf* node = CInterfaceManager::getInstance()->getDbProp("UI:SAVE:CHAT:SHOW_DYN_CHANNEL_NAME_IN_CHAT_CB", false);
if (node && node->getValueBool())
{
uint32 textId = ChatMngr.getDynamicChannelNameFromDbIndex(dynamicChatDbIndex);
ucstring title;
STRING_MANAGER::CStringManagerClient::instance()->getDynString(textId, title);
if ( ! title.empty())
{
prefix = " " + title;
}
}
// Put the new prefix in the correct position
size_t pos = newmsg.find(ucstring("] "));
newmsg = newmsg.substr(0, pos) + prefix + newmsg.substr(pos);
}
break;
// NB: the yubo chat cannot be in a user chat
case CChatGroup::yubo_chat: gl = NULL; break; case CChatGroup::yubo_chat: gl = NULL; break;
case CChatGroup::dyn_chat: gl = NULL; break;
} }
if (gl != NULL) if (gl != NULL)
{ {
gl->addChild(ctm.createMsgText(msg, col)); gl->addChild(ctm.createMsgText(newmsg, col));
if (!gl->getParent()->getActive()) if (!gl->getParent()->getActive())
if (tab != NULL) if (tab != NULL)
tab->setTextColorNormal(newMsgColor); tab->setTextColorNormal(newMsgColor);

@ -37,3 +37,18 @@ void CFilteredChatSummary::serial(NLMISC::IStream &f) throw(NLMISC::EStream)
if(ver>=2) if(ver>=2)
f.serial(SrcRegion); f.serial(SrcRegion);
} }
//===================================================================================
void CFilteredDynChatSummary::serial(NLMISC::IStream &f) throw(NLMISC::EStream)
{
sint ver = f.serialVersion(0);
f.serialCheck((uint32) 'USHC');
if (ver >= 0)
{
for (uint8 i = 0; i < CChatGroup::MaxDynChanPerPlayer; i++)
{
f.serial(SrcDynChat[i]);
}
}
}

@ -39,6 +39,18 @@ public:
void serial(NLMISC::IStream &f) throw(NLMISC::EStream); void serial(NLMISC::IStream &f) throw(NLMISC::EStream);
}; };
// class for serialisation of user dyn chat (filtered chat) info
class CFilteredDynChatSummary
{
public:
// Inputs
bool SrcDynChat[CChatGroup::MaxDynChanPerPlayer];
// output
CChatGroup::TGroupType Target;
public:
void serial(NLMISC::IStream &f) throw(NLMISC::EStream);
};

@ -135,6 +135,7 @@ namespace R2
// *************************************************************************** // ***************************************************************************
/* /*
Version 11: - Dyn chat in user tab
Version 10: - Last screen resolution serialisation Version 10: - Last screen resolution serialisation
Version 9: UI_DB_SAVE_VERSION system Version 9: UI_DB_SAVE_VERSION system
Version 8: - serialInSceneBubbleInfo (for ignore context help) Version 8: - serialInSceneBubbleInfo (for ignore context help)
@ -147,7 +148,7 @@ namespace R2
Version 1: - people interraction Version 1: - people interraction
Version 0: - base version Version 0: - base version
*/ */
#define ICFG_STREAM_VERSION 10 #define ICFG_STREAM_VERSION 11
#ifdef AJM_DEBUG_TRACK_INTERFACE_GROUPS #ifdef AJM_DEBUG_TRACK_INTERFACE_GROUPS
#define FOREACH(__itvar,__conttype,__contvar) \ #define FOREACH(__itvar,__conttype,__contvar) \
@ -191,7 +192,7 @@ NLMISC::CLog g_log;
// GLOBAL // // GLOBAL //
//////////// ////////////
// Hierachical timer // Hierarchical timer
H_AUTO_DECL ( RZ_Client_Update_Frame_Events ) H_AUTO_DECL ( RZ_Client_Update_Frame_Events )
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
@ -1649,6 +1650,14 @@ bool CInterfaceManager::loadConfig (const string &filename)
if(ver>=8) if(ver>=8)
CGroupInSceneBubbleManager::serialInSceneBubbleInfo(f); CGroupInSceneBubbleManager::serialInSceneBubbleInfo(f);
if (ver >= 11)
{
if ( ! PeopleInterraction.loadUserDynChatsInfos(f))
{
nlwarning("Bad user dyn chat saving");
}
}
} }
catch(NLMISC::EStream &) catch(NLMISC::EStream &)
{ {
@ -1831,6 +1840,11 @@ bool CInterfaceManager::saveConfig (const string &filename)
CGroupInSceneBubbleManager::serialInSceneBubbleInfo(f); CGroupInSceneBubbleManager::serialInSceneBubbleInfo(f);
if ( ! PeopleInterraction.saveUserDynChatsInfos(f))
{
nlwarning("Bad user dyn chat saving");
return false;
}
} }
catch(NLMISC::EStream &) catch(NLMISC::EStream &)
{ {

@ -4710,7 +4710,9 @@ bool CInterfaceParser::loadLUA(const std::string &fileName, std::string &error)
if (needCheck && !isInData) if (needCheck && !isInData)
{ {
return false; nlwarning("You are not allowed to modify the lua files");
// return true so it'll not generate a message box, we just ignore the file
return true;
} }
// Parse script // Parse script

@ -2328,6 +2328,42 @@ bool CDBGroupListSheetFilterExchangeable::CSheetChildFilter::isSheetValid(CDBGro
return false; return false;
} }
// ***************************************************************************
void CDBGroupListSheetFilterExchangeable::sort()
{
vector<SSortStruct> vTemp;
vTemp.resize (_MaxItems);
uint i;
for (i = 0; i < _MaxItems; ++i)
{
vTemp[i].SheetIcon = _SheetChildren[i];
CDBCtrlSheet *ctrl= _SheetChildren[i]->Ctrl;
initStructForItemSort (vTemp, ctrl->getSheetId(), ctrl->getQuality(), i, ctrl->getIndexInDB());
}
std::sort(vTemp.begin(), vTemp.end());
for (i = 0; i < _MaxItems; ++i)
{
_SheetChildren[i] = vTemp[i].SheetIcon;
}
}
// ***************************************************************************
bool CDBGroupListSheetFilterExchangeable::parse(xmlNodePtr cur, CInterfaceGroup *parentGroup)
{
if(!CDBGroupListSheet::parse(cur, parentGroup))
return false;
// Parse options (type, filters ...)
if (!_BO.parse(cur,parentGroup))
return false;
return true;
}
// *************************************************************************** // ***************************************************************************
// *************************************************************************** // ***************************************************************************

@ -692,6 +692,12 @@ public:
{ {
virtual bool isSheetValid(CDBGroupListSheet *pFather); virtual bool isSheetValid(CDBGroupListSheet *pFather);
}; };
void sort();
bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
private:
SBagOptions _BO;
}; };

@ -487,9 +487,6 @@ void CPeopleInterraction::initStdInputs()
if (YuboChat) if (YuboChat)
ChatInput.YuboChat.addListeningWindow(YuboChat); ChatInput.YuboChat.addListeningWindow(YuboChat);
// NB: The universe channel can only be seen from the user chat (and hence chat group)
// There is no Special universe window
if (TheUserChat.Window) if (TheUserChat.Window)
{ {
ChatInput.AroundMe.addListeningWindow(TheUserChat.Window); ChatInput.AroundMe.addListeningWindow(TheUserChat.Window);
@ -498,6 +495,11 @@ void CPeopleInterraction::initStdInputs()
ChatInput.Guild.addListeningWindow(TheUserChat.Window); ChatInput.Guild.addListeningWindow(TheUserChat.Window);
ChatInput.Universe.addListeningWindow (TheUserChat.Window); ChatInput.Universe.addListeningWindow (TheUserChat.Window);
// Don't add the system info by default // Don't add the system info by default
// Dynamic chats
for(i = 0; i < CChatGroup::MaxDynChanPerPlayer; i++)
{
ChatInput.DynamicChat[i].addListeningWindow(TheUserChat.Window);
}
} }
ChatInput.Tell.addListeningPeopleList(&FriendList); ChatInput.Tell.addListeningPeopleList(&FriendList);
@ -804,8 +806,8 @@ void CPeopleInterraction::createDynamicChats()
chatDesc.ChatTemplateParams.push_back(make_pair(string("dyn_chat_nb"),toString(i))); chatDesc.ChatTemplateParams.push_back(make_pair(string("dyn_chat_nb"),toString(i)));
chatDesc.Id = string("dynamic_chat") + toString(i); chatDesc.Id = string("dynamic_chat") + toString(i);
// no active proc because active state is driven by database // no active proc because active state is driven by database
chatDesc.AHOnDeactive = "proc"; chatDesc.AHOnCloseButton = "proc";
chatDesc.AHOnDeactiveParams = string("dynamic_chat_proc_deactive|") + toString(i); chatDesc.AHOnCloseButtonParams = string("dynamic_chat_proc_close|") + toString(i);
chatDesc.HeaderColor = "UI:SAVE:WIN:COLORS:MEM"; chatDesc.HeaderColor = "UI:SAVE:WIN:COLORS:MEM";
DynamicChat[i] = getChatWndMgr().createChatWindow(chatDesc); DynamicChat[i] = getChatWndMgr().createChatWindow(chatDesc);
@ -1560,7 +1562,6 @@ bool CPeopleInterraction::createNewPartyChat(const ucstring &title)
return false; return false;
} }
//================================================================================================================= //=================================================================================================================
void CPeopleInterraction::buildFilteredChatSummary(const CFilteredChat &src, CFilteredChatSummary &fcs) void CPeopleInterraction::buildFilteredChatSummary(const CFilteredChat &src, CFilteredChatSummary &fcs)
{ {
@ -1584,6 +1585,15 @@ void CPeopleInterraction::buildFilteredChatSummary(const CFilteredChat &src, CFi
} }
} }
//=================================================================================================================
void CPeopleInterraction::buildFilteredDynChatSummary(const CFilteredChat &src, CFilteredDynChatSummary &fcs)
{
for (uint8 i = 0; i < CChatGroup::MaxDynChanPerPlayer; i++)
{
fcs.SrcDynChat[i] = ChatInput.DynamicChat[i].isListeningWindow(src.Window);
}
}
//================================================================================================================= //=================================================================================================================
void CPeopleInterraction::saveFilteredChat(NLMISC::IStream &f, const CFilteredChat &src) void CPeopleInterraction::saveFilteredChat(NLMISC::IStream &f, const CFilteredChat &src)
{ {
@ -1603,6 +1613,25 @@ void CPeopleInterraction::saveFilteredChat(NLMISC::IStream &f, const CFilteredCh
} }
} }
//=================================================================================================================
void CPeopleInterraction::saveFilteredDynChat(NLMISC::IStream &f, const CFilteredChat &src)
{
bool present;
if (src.Window == NULL)
{
present = false;
f.serial(present);
}
else
{
present = true;
f.serial(present);
CFilteredDynChatSummary fcs;
buildFilteredDynChatSummary(src, fcs);
f.serial(fcs);
}
}
//================================================================================================================= //=================================================================================================================
CChatGroupWindow *CPeopleInterraction::getChatGroupWindow() const CChatGroupWindow *CPeopleInterraction::getChatGroupWindow() const
{ {
@ -1610,6 +1639,7 @@ CChatGroupWindow *CPeopleInterraction::getChatGroupWindow() const
} }
#define USER_CHATS_INFO_VERSION 2 #define USER_CHATS_INFO_VERSION 2
#define USER_DYN_CHATS_INFO_VERSION 1
//================================================================================================================= //=================================================================================================================
bool CPeopleInterraction::saveUserChatsInfos(NLMISC::IStream &f) bool CPeopleInterraction::saveUserChatsInfos(NLMISC::IStream &f)
@ -1648,6 +1678,27 @@ bool CPeopleInterraction::saveUserChatsInfos(NLMISC::IStream &f)
return true; return true;
} }
//=================================================================================================================
bool CPeopleInterraction::saveUserDynChatsInfos(NLMISC::IStream &f)
{
nlassert(!f.isReading());
try
{
sint ver = f.serialVersion(USER_DYN_CHATS_INFO_VERSION);
f.serialCheck((uint32) 'OMGY');
if (ver >= 1)
{
saveFilteredDynChat(f, TheUserChat);
}
}
catch(NLMISC::EStream &e)
{
nlwarning("Error while saving user dyn chat infos : %s", e.what());
return false;
}
return true;
}
//================================================================================================================= //=================================================================================================================
bool CPeopleInterraction::loadUserChatsInfos(NLMISC::IStream &f) bool CPeopleInterraction::loadUserChatsInfos(NLMISC::IStream &f)
{ {
@ -1713,6 +1764,37 @@ bool CPeopleInterraction::loadUserChatsInfos(NLMISC::IStream &f)
return true; return true;
} }
//=================================================================================================================
bool CPeopleInterraction::loadUserDynChatsInfos(NLMISC::IStream &f)
{
nlassert(f.isReading());
try
{
bool present;
sint ver = f.serialVersion(USER_DYN_CHATS_INFO_VERSION);
f.serialCheck((uint32) 'OMGY');
f.serial(present);
if (!present)
{
nlwarning("Bad data in user dyn chats infos");
return false;
}
CFilteredDynChatSummary fcs;
if (ver >= 1)
{
f.serial(fcs);
setupUserDynChatFromSummary(fcs, TheUserChat);
}
}
catch(NLMISC::EStream &e)
{
nlwarning("Error while loading user dyn chat infos : %s", e.what());
return false;
}
return true;
}
//================================================================================================================= //=================================================================================================================
void CPeopleInterraction::setupUserChatFromSummary(const CFilteredChatSummary &summary, CFilteredChat &dest) void CPeopleInterraction::setupUserChatFromSummary(const CFilteredChatSummary &summary, CFilteredChat &dest)
{ {
@ -1728,6 +1810,18 @@ void CPeopleInterraction::setupUserChatFromSummary(const CFilteredChatSummary &s
ChatInput.Universe.setWindowState(dest.Window, summary.SrcUniverse); ChatInput.Universe.setWindowState(dest.Window, summary.SrcUniverse);
} }
//=================================================================================================================
void CPeopleInterraction::setupUserDynChatFromSummary(const CFilteredDynChatSummary &summary, CFilteredChat &dest)
{
// User Dest
dest.Filter.setTargetGroup(summary.Target, 0, false);
// src
for (uint8 i = 0; i < CChatGroup::MaxDynChanPerPlayer; i++)
{
ChatInput.DynamicChat[i].setWindowState(dest.Window, summary.SrcDynChat[i]);
}
}
//================================================================================================================= //=================================================================================================================
void CPeopleInterraction::removeAllUserChats() void CPeopleInterraction::removeAllUserChats()
{ {
@ -2494,7 +2588,7 @@ public:
for (uint i = 0; i < CChatGroup::MaxDynChanPerPlayer; i++) for (uint i = 0; i < CChatGroup::MaxDynChanPerPlayer; i++)
{ {
string s = toString(i); string s = toString(i);
uint32 textId = im->getDbProp("SERVER:DYN_CHAT:CHANNEL"+s+":NAME")->getValue32(); uint32 textId = ChatMngr.getDynamicChannelNameFromDbIndex(i);
bool active = (textId != 0); bool active = (textId != 0);
if (active) if (active)
{ {
@ -2681,7 +2775,7 @@ class CHandlerSelectChatSource : public IActionHandler
CViewTextMenu *pVTM = dynamic_cast<CViewTextMenu *>(im->getElementFromId(MAIN_CHAT_SOURCE_MENU+":tab:dyn"+s)); CViewTextMenu *pVTM = dynamic_cast<CViewTextMenu *>(im->getElementFromId(MAIN_CHAT_SOURCE_MENU+":tab:dyn"+s));
if (pVTM) if (pVTM)
{ {
uint32 textId = im->getDbProp("SERVER:DYN_CHAT:CHANNEL"+s+":NAME")->getValue32(); uint32 textId = ChatMngr.getDynamicChannelNameFromDbIndex(i);
bool active = (textId != 0); bool active = (textId != 0);
pVTM->setActive(active); pVTM->setActive(active);
if (active) if (active)
@ -2802,6 +2896,23 @@ class CHandlerSelectChatSource : public IActionHandler
++ insertionIndex; ++ insertionIndex;
} }
} }
// Add all existing dynamic channels and set the names
for (uint8 i = 0; i < CChatGroup::MaxDynChanPerPlayer; i++)
{
string s = toString(i);
uint32 textId = ChatMngr.getDynamicChannelNameFromDbIndex(i);
bool active = (textId != 0);
if (active)
{
ucstring title;
STRING_MANAGER::CStringManagerClient::instance()->getDynString(textId, title);
menu->addLineAtIndex(insertionIndex, "["+s+"] " + title, FILTER_TOGGLE, "dyn"+s);
menu->setUserGroupLeft(insertionIndex, createMenuCheckBox(FILTER_TOGGLE, "dyn"+s, pi.ChatInput.DynamicChat[i].isListeningWindow(cw)));
++insertionIndex;
}
}
} }
@ -2910,6 +3021,13 @@ class CHandlerChatSourceSelected : public IActionHandler
} }
} }
} }
else if (nlstricmp(sParams.substr(0, 3), "dyn") == 0)
{
uint8 i = 0;
fromString(sParams.substr(3), i);
if (ci.DynamicChat[i].isListeningWindow(cw)) ci.DynamicChat[i].removeListeningWindow(cw);
else ci.DynamicChat[i].addListeningWindow(cw);
}
} }
}; };
REGISTER_ACTION_HANDLER( CHandlerChatSourceSelected, "chat_source_selected"); REGISTER_ACTION_HANDLER( CHandlerChatSourceSelected, "chat_source_selected");

@ -25,7 +25,7 @@
class CChatWindow; class CChatWindow;
class CFilteredChatSummary; class CFilteredChatSummary;
class CFilteredDynChatSummary;
// *************************************************************************** // ***************************************************************************
#define TEAM_DB_PATH "SERVER:GROUP" #define TEAM_DB_PATH "SERVER:GROUP"
@ -238,6 +238,11 @@ public:
// restore infos about user chats // restore infos about user chats
bool loadUserChatsInfos(NLMISC::IStream &f); bool loadUserChatsInfos(NLMISC::IStream &f);
// save info about user dyn chats
bool saveUserDynChatsInfos(NLMISC::IStream &f);
// restore info about user dyn chats
bool loadUserDynChatsInfos(NLMISC::IStream &f);
// remove all the user chats // remove all the user chats
void removeAllUserChats(); void removeAllUserChats();
@ -281,9 +286,12 @@ private:
// //
// build summary about a filtered chat // build summary about a filtered chat
void buildFilteredChatSummary(const CFilteredChat &src, CFilteredChatSummary &dest); void buildFilteredChatSummary(const CFilteredChat &src, CFilteredChatSummary &dest);
void buildFilteredDynChatSummary(const CFilteredChat &src, CFilteredDynChatSummary &dest);
void saveFilteredChat(NLMISC::IStream &f, const CFilteredChat &src); void saveFilteredChat(NLMISC::IStream &f, const CFilteredChat &src);
void saveFilteredDynChat(NLMISC::IStream &f, const CFilteredChat &src);
// setup a user chat from its summary // setup a user chat from its summary
void setupUserChatFromSummary(const CFilteredChatSummary &summary, CFilteredChat &dest); void setupUserChatFromSummary(const CFilteredChatSummary &summary, CFilteredChat &dest);
void setupUserDynChatFromSummary(const CFilteredDynChatSummary &summary, CFilteredChat &dest);
private: private:
// Contact waiting their name (received by string_manager) to be added // Contact waiting their name (received by string_manager) to be added
struct SWaitingContact struct SWaitingContact

@ -508,7 +508,7 @@ void CSkillManager::onSkillChange()
} }
// *************************************************************************** // ***************************************************************************
void CSkillManager::checkTitleUnblocked(CHARACTER_TITLE::ECharacterTitle i) void CSkillManager::checkTitleUnblocked(CHARACTER_TITLE::ECharacterTitle i, bool show_message)
{ {
if (isTitleReserved(i)) return; if (isTitleReserved(i)) return;
@ -581,7 +581,7 @@ void CSkillManager::checkTitleUnblocked(CHARACTER_TITLE::ECharacterTitle i)
if (!IngameDbMngr.initInProgress()) if (!IngameDbMngr.initInProgress())
{ {
CInterfaceManager *pIM = CInterfaceManager::getInstance(); CInterfaceManager *pIM = CInterfaceManager::getInstance();
if (bAllUnblocked) if (bAllUnblocked && show_message)
{ {
// This is a new title, send a message // This is a new title, send a message
string titleStr = CHARACTER_TITLE::toString((CHARACTER_TITLE::ECharacterTitle)i); string titleStr = CHARACTER_TITLE::toString((CHARACTER_TITLE::ECharacterTitle)i);
@ -682,7 +682,7 @@ void CSkillManager::tryToUnblockTitleFromSkill(SKILLS::ESkills eSkill, sint32 va
} }
// *************************************************************************** // ***************************************************************************
void CSkillManager::tryToUnblockTitleFromBricks() void CSkillManager::tryToUnblockTitleFromBricks(bool show_message)
{ {
CSBrickManager *pSBM = CSBrickManager::getInstance(); CSBrickManager *pSBM = CSBrickManager::getInstance();
@ -703,7 +703,7 @@ void CSkillManager::tryToUnblockTitleFromBricks()
} }
} }
checkTitleUnblocked((CHARACTER_TITLE::ECharacterTitle)i); checkTitleUnblocked((CHARACTER_TITLE::ECharacterTitle)i, show_message);
} }
} }
@ -763,7 +763,7 @@ void CSkillManager::tryToUnblockTitleFromMaxFames( uint32 factionIndex, sint32 f
// *************************************************************************** // ***************************************************************************
void CSkillManager::tryToUnblockTitleFromCiv() void CSkillManager::tryToUnblockTitleFromCiv(bool show_message)
{ {
for (uint i = 0; i < CHARACTER_TITLE::NB_CHARACTER_TITLE; ++i) for (uint i = 0; i < CHARACTER_TITLE::NB_CHARACTER_TITLE; ++i)
{ {
@ -796,12 +796,12 @@ void CSkillManager::tryToUnblockTitleFromCiv()
} }
} }
} }
checkTitleUnblocked((CHARACTER_TITLE::ECharacterTitle)i); checkTitleUnblocked((CHARACTER_TITLE::ECharacterTitle)i, show_message);
} }
} }
// *************************************************************************** // ***************************************************************************
void CSkillManager::tryToUnblockTitleFromCult() void CSkillManager::tryToUnblockTitleFromCult(bool show_message)
{ {
for (uint i = 0; i < CHARACTER_TITLE::NB_CHARACTER_TITLE; ++i) for (uint i = 0; i < CHARACTER_TITLE::NB_CHARACTER_TITLE; ++i)
@ -835,7 +835,7 @@ void CSkillManager::tryToUnblockTitleFromCult()
} }
} }
} }
checkTitleUnblocked((CHARACTER_TITLE::ECharacterTitle)i); checkTitleUnblocked((CHARACTER_TITLE::ECharacterTitle)i, show_message);
} }
} }
@ -933,7 +933,7 @@ void CSkillManager::tryToUnblockTitleFromRingRatings( uint32 authorRating, uint3
} }
// *************************************************************************** // ***************************************************************************
void CSkillManager::tryToUnblockTitleFromItems() void CSkillManager::tryToUnblockTitleFromItems(bool show_message)
{ {
if (IngameDbMngr.initInProgress()) if (IngameDbMngr.initInProgress())
return; return;
@ -1007,7 +1007,7 @@ void CSkillManager::tryToUnblockTitleFromItems()
if (allItemsFromListValidated != _TitlesUnblocked[i].UnblockedItemLists[j]) if (allItemsFromListValidated != _TitlesUnblocked[i].UnblockedItemLists[j])
{ {
_TitlesUnblocked[i].UnblockedItemLists[j] = allItemsFromListValidated; _TitlesUnblocked[i].UnblockedItemLists[j] = allItemsFromListValidated;
checkTitleUnblocked((CHARACTER_TITLE::ECharacterTitle)i); checkTitleUnblocked((CHARACTER_TITLE::ECharacterTitle)i, show_message);
} }
} }
} }
@ -1077,10 +1077,11 @@ public:
virtual void execute(CCtrlBase * /* pCaller */, const string &/* Params */) virtual void execute(CCtrlBase * /* pCaller */, const string &/* Params */)
{ {
CSkillManager *pSM = CSkillManager::getInstance(); CSkillManager *pSM = CSkillManager::getInstance();
pSM->tryToUnblockTitleFromBricks(); // Try to unblock titles without showing the new title message
pSM->tryToUnblockTitleFromCiv(); pSM->tryToUnblockTitleFromBricks(false);
pSM->tryToUnblockTitleFromCult(); pSM->tryToUnblockTitleFromCiv(false);
pSM->tryToUnblockTitleFromItems(); pSM->tryToUnblockTitleFromCult(false);
pSM->tryToUnblockTitleFromItems(false);
CInterfaceManager *pIM = CInterfaceManager::getInstance(); CInterfaceManager *pIM = CInterfaceManager::getInstance();
CDBGroupComboBox *pCB = dynamic_cast<CDBGroupComboBox*>(pIM->getElementFromId(GROUP_TITLE_COMBO)); CDBGroupComboBox *pCB = dynamic_cast<CDBGroupComboBox*>(pIM->getElementFromId(GROUP_TITLE_COMBO));

@ -128,16 +128,16 @@ public:
void tryToUnblockTitleFromSkill(SKILLS::ESkills eSkill, sint32 value); void tryToUnblockTitleFromSkill(SKILLS::ESkills eSkill, sint32 value);
/// The same but with parsing all bricks wanted /// The same but with parsing all bricks wanted
void tryToUnblockTitleFromBricks(); void tryToUnblockTitleFromBricks(bool show_message = true);
/// The same but with civ allegiance /// The same but with civ allegiance
void tryToUnblockTitleFromCiv(); void tryToUnblockTitleFromCiv(bool show_message = true);
/// The same but with cult allegiance /// The same but with cult allegiance
void tryToUnblockTitleFromCult(); void tryToUnblockTitleFromCult(bool show_message = true);
/// The same but with parsing all items wanted /// The same but with parsing all items wanted
void tryToUnblockTitleFromItems(); void tryToUnblockTitleFromItems(bool show_message = true);
/// Called when a fame changes to look if we can unblock a title /// Called when a fame changes to look if we can unblock a title
void tryToUnblockTitleFromMinFames(uint32 factionIndex, sint32 fameValue); void tryToUnblockTitleFromMinFames(uint32 factionIndex, sint32 fameValue);
@ -242,7 +242,7 @@ private:
}; };
std::vector<SUnblockingTitle> _TitlesUnblocked; std::vector<SUnblockingTitle> _TitlesUnblocked;
void checkTitleUnblocked(CHARACTER_TITLE::ECharacterTitle i); void checkTitleUnblocked(CHARACTER_TITLE::ECharacterTitle i, bool show_message = true);
uint8 _CurrentTitle; uint8 _CurrentTitle;
std::vector<sint32> _UIUnblockedTitles; std::vector<sint32> _UIUnblockedTitles;

@ -368,6 +368,7 @@ void impulseUserChars(NLMISC::CBitMemStream &impulse)
// read privileges // read privileges
readPrivileges(impulse); readPrivileges(impulse);
impulse.serial(FreeTrial); impulse.serial(FreeTrial);
FreeTrial = false;
impulse.serialCont(Mainlands); impulse.serialCont(Mainlands);
userChar = true; userChar = true;
@ -666,7 +667,7 @@ void CInterfaceChatDisplayer::displayChat(TDataSetIndex compressedSenderIndex, c
string entry="UI:SAVE:CHAT:COLORS:"; string entry="UI:SAVE:CHAT:COLORS:";
switch(mode) switch(mode)
{ {
case CChatGroup::dyn_chat: // dyn_chat takes the color of say case CChatGroup::dyn_chat: entry+="DYN"; break;
case CChatGroup::say: entry+="SAY"; break; case CChatGroup::say: entry+="SAY"; break;
case CChatGroup::shout: entry+="SHOUT"; break; case CChatGroup::shout: entry+="SHOUT"; break;
case CChatGroup::team: entry+="GROUP"; break; case CChatGroup::team: entry+="GROUP"; break;
@ -764,7 +765,35 @@ void CInterfaceChatDisplayer::displayChat(TDataSetIndex compressedSenderIndex, c
// if found, display, else discarded // if found, display, else discarded
if(dbIndex >= 0 && dbIndex < CChatGroup::MaxDynChanPerPlayer) if(dbIndex >= 0 && dbIndex < CChatGroup::MaxDynChanPerPlayer)
{ {
// Add dyn chan number before string
ucstring prefix = "[" + NLMISC::toString(dbIndex) + "]";
// Find position to put the new string
// After timestamp?
size_t pos = finalString.find(ucstring("]"));
if (pos == ucstring::npos)
{
// No timestamp, so put it right after the color and add a space
pos = finalString.find(ucstring("}"));
prefix += " ";
}
finalString = finalString.substr(0, pos + 1) + prefix + finalString.substr(pos + 1);
PeopleInterraction.ChatInput.DynamicChat[dbIndex].displayMessage(finalString, col, 2, &windowVisible); PeopleInterraction.ChatInput.DynamicChat[dbIndex].displayMessage(finalString, col, 2, &windowVisible);
// Add optionally dynchannel name before text so that the chat log
// will show the correct string if enabled.
CCDBNodeLeaf* node = pIM->getDbProp("UI:SAVE:CHAT:SHOW_DYN_CHANNEL_NAME_IN_CHAT_CB", false);
if (node && pIM->getLogState() && node->getValueBool())
{
uint32 textId = ChatMngr.getDynamicChannelNameFromDbIndex(dbIndex);
ucstring title;
STRING_MANAGER::CStringManagerClient::instance()->getDynString(textId, title);
if ( ! title.empty())
{
prefix = " " + title;
}
// Put the new prefix in the correct position
size_t pos = finalString.find(ucstring("] "));
finalString = finalString.substr(0, pos) + prefix + finalString.substr(pos);
}
} }
else else
{ {
@ -3775,12 +3804,12 @@ bool CNetManager::update()
{ {
nldebug("CNetManager::update : Lag detected."); nldebug("CNetManager::update : Lag detected.");
} }
// Lag detected. // Probe received.
else if(change.Property == ProbeReceived) else if(change.Property == ProbeReceived)
{ {
nldebug("CNetManager::update : Probe Received."); nldebug("CNetManager::update : Probe Received.");
} }
// Lag detected. // Connection ready.
else if(change.Property == ConnectionReady) else if(change.Property == ConnectionReady)
{ {
nldebug("CNetManager::update : Connection Ready."); nldebug("CNetManager::update : Connection Ready.");

Loading…
Cancel
Save