Merge branch 'atys' into feature/hires-textures

feature/hires-textures
Nuno 4 years ago
commit f84184af25

@ -102,6 +102,7 @@ SET(RYZOM_CLIENT_CREATE_ACCOUNT_URL "https://open.ryzom.dev/ams/" CACHE STRING
SET(RYZOM_CLIENT_EDIT_ACCOUNT_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Edit Account URL") SET(RYZOM_CLIENT_EDIT_ACCOUNT_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Edit Account URL")
SET(RYZOM_CLIENT_FORGET_PASSWORD_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Forget Password URL") SET(RYZOM_CLIENT_FORGET_PASSWORD_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Forget Password URL")
SET(RYZOM_CLIENT_PATCH_URL "https://cdn.ryzom.dev/open/patch/" CACHE STRING "Ryzom Client Patch URL") SET(RYZOM_CLIENT_PATCH_URL "https://cdn.ryzom.dev/open/patch/" CACHE STRING "Ryzom Client Patch URL")
SET(RYZOM_CLIENT_APP_NAME "default")
SET(RYZOM_WEBIG_MAIN_URL "https://open.ryzom.dev/" CACHE STRING "Ryzom Client WebIG Main URL") SET(RYZOM_WEBIG_MAIN_URL "https://open.ryzom.dev/" CACHE STRING "Ryzom Client WebIG Main URL")
SET(RYZOM_WEBIG_TRUSTED_DOMAIN "open.ryzom.dev" CACHE STRING "Ryzom Client WebIG Trusted Domain") SET(RYZOM_WEBIG_TRUSTED_DOMAIN "open.ryzom.dev" CACHE STRING "Ryzom Client WebIG Trusted Domain")
@ -114,6 +115,7 @@ IF(WITH_RYZOM_LIVE)
SET(RYZOM_CLIENT_EDIT_ACCOUNT_URL "https://account.ryzom.com/payment_profile/index.php") SET(RYZOM_CLIENT_EDIT_ACCOUNT_URL "https://account.ryzom.com/payment_profile/index.php")
SET(RYZOM_CLIENT_FORGET_PASSWORD_URL "https://account.ryzom.com/payment_profile/lost_secure_password.php") SET(RYZOM_CLIENT_FORGET_PASSWORD_URL "https://account.ryzom.com/payment_profile/lost_secure_password.php")
SET(RYZOM_CLIENT_PATCH_URL "http://dl.ryzom.com/patch_live") SET(RYZOM_CLIENT_PATCH_URL "http://dl.ryzom.com/patch_live")
SET(RYZOM_CLIENT_APP_NAME "ryzom_live")
SET(RYZOM_WEBIG_MAIN_URL "https://app.ryzom.com/") SET(RYZOM_WEBIG_MAIN_URL "https://app.ryzom.com/")
SET(RYZOM_WEBIG_TRUSTED_DOMAIN "app.ryzom.com") SET(RYZOM_WEBIG_TRUSTED_DOMAIN "app.ryzom.com")

@ -37,6 +37,7 @@
#cmakedefine RYZOM_CLIENT_EDIT_ACCOUNT_URL "${RYZOM_CLIENT_EDIT_ACCOUNT_URL}" #cmakedefine RYZOM_CLIENT_EDIT_ACCOUNT_URL "${RYZOM_CLIENT_EDIT_ACCOUNT_URL}"
#cmakedefine RYZOM_CLIENT_FORGET_PASSWORD_URL "${RYZOM_CLIENT_FORGET_PASSWORD_URL}" #cmakedefine RYZOM_CLIENT_FORGET_PASSWORD_URL "${RYZOM_CLIENT_FORGET_PASSWORD_URL}"
#cmakedefine RYZOM_CLIENT_PATCH_URL "${RYZOM_CLIENT_PATCH_URL}" #cmakedefine RYZOM_CLIENT_PATCH_URL "${RYZOM_CLIENT_PATCH_URL}"
#cmakedefine RYZOM_CLIENT_APP_NAME "${RYZOM_CLIENT_APP_NAME}"
#cmakedefine RYZOM_WEBIG_MAIN_URL "${RYZOM_WEBIG_MAIN_URL}" #cmakedefine RYZOM_WEBIG_MAIN_URL "${RYZOM_WEBIG_MAIN_URL}"
#cmakedefine RYZOM_WEBIG_TRUSTED_DOMAIN "${RYZOM_WEBIG_TRUSTED_DOMAIN}" #cmakedefine RYZOM_WEBIG_TRUSTED_DOMAIN "${RYZOM_WEBIG_TRUSTED_DOMAIN}"

@ -1168,6 +1168,8 @@ namespace NLGUI
{ {
_Active = state; _Active = state;
invalidateCoords(); invalidateCoords();
// force invalidate CViewText/CGroupTable inner elements
invalidateContent();
} }
} }

@ -2296,7 +2296,7 @@ namespace NLGUI
// Hide menu if the key is pushed // Hide menu if the key is pushed
// if ((eventDesc.getKeyEventType() == CEventDescriptorKey::keydown) && !_ModalStack.empty() && !eventDesc.getKeyAlt() && !eventDesc.getKeyCtrl() && !eventDesc.getKeyShift()) // if ((eventDesc.getKeyEventType() == CEventDescriptorKey::keydown) && !_ModalStack.empty() && !eventDesc.getKeyAlt() && !eventDesc.getKeyCtrl() && !eventDesc.getKeyShift())
// Hide menu (or popup menu) is ESCAPE pressed // Hide menu (or popup menu) is ESCAPE pressed
if( eventDesc.getKeyEventType() == CEventDescriptorKey::keychar && eventDesc.getChar() == NLMISC::KeyESCAPE ) if( eventDesc.getKeyEventType() == CEventDescriptorKey::keydown && eventDesc.getKey() == NLMISC::KeyESCAPE )
{ {
if( hasModal() ) if( hasModal() )
{ {
@ -2307,7 +2307,7 @@ namespace NLGUI
} }
// Manage "quit window" If the Key is ESCAPE, no captureKeyboard // Manage "quit window" If the Key is ESCAPE, no captureKeyboard
if( eventDesc.getKeyEventType() == CEventDescriptorKey::keychar && eventDesc.getChar() == NLMISC::KeyESCAPE ) if( eventDesc.getKeyEventType() == CEventDescriptorKey::keydown && eventDesc.getKey() == NLMISC::KeyESCAPE )
{ {
// Get the last escapable active top window. NB: this is ergonomically better. // Get the last escapable active top window. NB: this is ergonomically better.
CInterfaceGroup *win= getLastEscapableTopWindow(); CInterfaceGroup *win= getLastEscapableTopWindow();

@ -172,16 +172,12 @@ void CEventsListener::operator()(const CEvent& event)
// Get in pixel space, centered // Get in pixel space, centered
uint32 drW, drH; uint32 drW, drH;
Driver->getWindowSize(drW, drH); Driver->getWindowSize(drW, drH);
float fX = mouseEvent->X; // from 0 to 1.0 sint scX = (sint32)(mouseEvent->X * (float)drW) - ((sint32)drW >> 1); // in pixels, centered
float fY = (ClientCfg.FreeLookInverted ? -mouseEvent->Y : mouseEvent->Y); sint scY = (sint32)(mouseEvent->Y * (float)drH) - ((sint32)drH >> 1);
sint scX = (sint32)(fX * (float)drW) - ((sint32)drW >> 1); // in pixels, centered
sint scY = (sint32)(fY * (float)drH) - ((sint32)drH >> 1);
if (!s_MouseFreeLookReady) if (!s_MouseFreeLookReady)
{ {
float pfX = _MouseX; sint pscX = (sint32)(_MouseX * (float)drW) - ((sint32)drW >> 1); // in pixels, centered
float pfY = (ClientCfg.FreeLookInverted ? -_MouseY : _MouseY); sint pscY = (sint32)(_MouseY * (float)drH) - ((sint32)drH >> 1);
sint pscX = (sint32)(pfX * (float)drW) - ((sint32)drW >> 1); // in pixels, centered
sint pscY = (sint32)(pfY * (float)drH) - ((sint32)drH >> 1);
s_MouseFreeLookReady = true; s_MouseFreeLookReady = true;
s_MouseFreeLookLastX = pscX; s_MouseFreeLookLastX = pscX;
s_MouseFreeLookLastY = pscY; s_MouseFreeLookLastY = pscY;
@ -199,13 +195,12 @@ void CEventsListener::operator()(const CEvent& event)
} }
// Get delta since last center // Get delta since last center
sint scXd = scX - s_MouseFreeLookLastX; s_MouseFreeLookFrameX += (scX - s_MouseFreeLookLastX);
sint scYd = scY - s_MouseFreeLookLastY; s_MouseFreeLookFrameY += (scY - s_MouseFreeLookLastY) * (ClientCfg.FreeLookInverted ? -1 : 1);
s_MouseFreeLookLastX = scX; s_MouseFreeLookLastX = scX;
s_MouseFreeLookLastY = scY; s_MouseFreeLookLastY = scY;
s_MouseFreeLookFrameX += scXd;
s_MouseFreeLookFrameY += scYd;
// updateFreeLookPos is called in updateMouseSmoothing per frame // updateFreeLookPos is called in updateMouseSmoothing per frame
// Center cursor // Center cursor

@ -136,7 +136,7 @@ public:
if (pCSDst->isShortCut()) if (pCSDst->isShortCut())
pPM->CompositionPhraseMemoryLineDest= pPM->getSelectedMemoryLineDB(); pPM->CompositionPhraseMemoryLineDest= pPM->getSelectedMemoryLineDB();
else else
pPM->CompositionPhraseMemoryLineDest= 0; pPM->CompositionPhraseMemoryLineDest= pPM->getSelectedMemoryAltLineDB();
pPM->CompositionPhraseMemorySlotDest= pCSDst->getIndexInDB(); pPM->CompositionPhraseMemorySlotDest= pCSDst->getIndexInDB();
} }
@ -536,7 +536,7 @@ public:
CInterfaceManager *pIM= CInterfaceManager::getInstance(); CInterfaceManager *pIM= CInterfaceManager::getInstance();
// Launch the modal to select the faber plan // Launch the modal to select the faber plan
extern void fillFaberPlanSelection(const std::string &brickDB, uint maxSelection, TOOL_TYPE::TCraftingToolType toolType); extern void fillFaberPlanSelection(const std::string &brickDB, uint maxSelection, TOOL_TYPE::TCraftingToolType toolType);
// from sphrase_manager.cpp // from sphrase_manager.cpp
extern TOOL_TYPE::TCraftingToolType getRightHandCraftToolType(); extern TOOL_TYPE::TCraftingToolType getRightHandCraftToolType();
fillFaberPlanSelection(CDBGroupBuildPhrase::BrickSelectionDB, CDBGroupBuildPhrase::MaxSelection, getRightHandCraftToolType()); fillFaberPlanSelection(CDBGroupBuildPhrase::BrickSelectionDB, CDBGroupBuildPhrase::MaxSelection, getRightHandCraftToolType());
@ -750,8 +750,8 @@ class CHandlerMemorizePhraseOrMacro : public IActionHandler
{ {
public: public:
virtual void execute (CCtrlBase *pCaller, const string &Params); virtual void execute (CCtrlBase *pCaller, const string &Params);
void memorizePhraseOrMacro(uint dstMemoryIndex, bool isMacro, sint32 phraseId, sint32 macroId); void memorizePhraseOrMacro(sint32 memoryLine, uint dstMemoryIndex, bool isMacro, sint32 phraseId, sint32 macroId);
void memorizePhraseSheet(uint dstMemoryIndex, uint32 sheetId); void memorizePhraseSheet(sint32 memoryLine, uint dstMemoryIndex, uint32 sheetId);
}; };
REGISTER_ACTION_HANDLER( CHandlerMemorizePhraseOrMacro, "memorize_phrase_or_macro"); REGISTER_ACTION_HANDLER( CHandlerMemorizePhraseOrMacro, "memorize_phrase_or_macro");
@ -771,7 +771,11 @@ void CHandlerMemorizePhraseOrMacro::execute (CCtrlBase *pCaller, const string &P
// The dest must be a memory or a macro memory // The dest must be a memory or a macro memory
if (!pCSDst->isSPhraseIdMemory() && !pCSDst->isMacroMemory()) return; if (!pCSDst->isSPhraseIdMemory() && !pCSDst->isMacroMemory()) return;
// get the memory line and memory index // get the memory line and memory index
sint32 dstMemoryLine= pPM->getSelectedMemoryLineDB(); sint32 dstMemoryLine;
if (pCSDst->isShortCut())
dstMemoryLine = pPM->getSelectedMemoryLineDB();
else
dstMemoryLine = pPM->getSelectedMemoryAltLineDB();
uint dstMemoryIndex= pCSDst->getIndexInDB(); uint dstMemoryIndex= pCSDst->getIndexInDB();
bool srcIsMacro; bool srcIsMacro;
@ -806,7 +810,7 @@ void CHandlerMemorizePhraseOrMacro::execute (CCtrlBase *pCaller, const string &P
pPM->sendLearnToServer(newPhraseId); pPM->sendLearnToServer(newPhraseId);
// memorize the new phrase // memorize the new phrase
memorizePhraseOrMacro(dstMemoryIndex, srcIsMacro, newPhraseId, srcMacroId); memorizePhraseOrMacro(dstMemoryLine, dstMemoryIndex, srcIsMacro, newPhraseId, srcMacroId);
} }
} }
else else
@ -833,7 +837,7 @@ void CHandlerMemorizePhraseOrMacro::execute (CCtrlBase *pCaller, const string &P
if(pCSSrc->isSPhrase()) if(pCSSrc->isSPhrase())
{ {
// learn and memorize this phrase // learn and memorize this phrase
memorizePhraseSheet(dstMemoryIndex, pCSSrc->getSheetId()); memorizePhraseSheet(dstMemoryLine, dstMemoryIndex, pCSSrc->getSheetId());
} }
else else
{ {
@ -842,7 +846,7 @@ void CHandlerMemorizePhraseOrMacro::execute (CCtrlBase *pCaller, const string &P
pPM->fullDeletePhraseIfLast(dstMemoryLine, dstMemoryIndex); pPM->fullDeletePhraseIfLast(dstMemoryLine, dstMemoryIndex);
// memorize the phrase or macro // memorize the phrase or macro
memorizePhraseOrMacro(dstMemoryIndex, srcIsMacro, srcPhraseId, srcMacroId); memorizePhraseOrMacro(dstMemoryLine, dstMemoryIndex, srcIsMacro, srcPhraseId, srcMacroId);
} }
} }
// Else the src is a memory too // Else the src is a memory too
@ -868,7 +872,7 @@ void CHandlerMemorizePhraseOrMacro::execute (CCtrlBase *pCaller, const string &P
pPM->sendLearnToServer(newPhraseId); pPM->sendLearnToServer(newPhraseId);
// memorize the new phrase // memorize the new phrase
memorizePhraseOrMacro(dstMemoryIndex, srcIsMacro, newPhraseId, srcMacroId); memorizePhraseOrMacro(dstMemoryLine, dstMemoryIndex, srcIsMacro, newPhraseId, srcMacroId);
} }
else else
{ {
@ -876,7 +880,7 @@ void CHandlerMemorizePhraseOrMacro::execute (CCtrlBase *pCaller, const string &P
pPM->fullDeletePhraseIfLast(dstMemoryLine, dstMemoryIndex); pPM->fullDeletePhraseIfLast(dstMemoryLine, dstMemoryIndex);
// memorize the macro (still a reference) // memorize the macro (still a reference)
memorizePhraseOrMacro(dstMemoryIndex, srcIsMacro, srcPhraseId, srcMacroId); memorizePhraseOrMacro(dstMemoryLine, dstMemoryIndex, srcIsMacro, srcPhraseId, srcMacroId);
} }
} }
// else this is a swap! // else this is a swap!
@ -887,17 +891,23 @@ void CHandlerMemorizePhraseOrMacro::execute (CCtrlBase *pCaller, const string &P
{ {
// get the memory index for src // get the memory index for src
uint srcMemoryIndex= pCSSrc->getIndexInDB(); uint srcMemoryIndex= pCSSrc->getIndexInDB();
// get the memory line for src
sint32 srcMemoryLine;
if (pCSSrc->isShortCut())
srcMemoryLine = pPM->getSelectedMemoryLineDB();
else
srcMemoryLine = pPM->getSelectedMemoryAltLineDB();
// memorize dst into src // memorize dst into src
memorizePhraseOrMacro(srcMemoryIndex, dstIsMacro, dstPhraseId, dstMacroId); memorizePhraseOrMacro(srcMemoryLine, srcMemoryIndex, dstIsMacro, dstPhraseId, dstMacroId);
// memorize src into dst // memorize src into dst
memorizePhraseOrMacro(dstMemoryIndex, srcIsMacro, srcPhraseId, srcMacroId); memorizePhraseOrMacro(dstMemoryLine, dstMemoryIndex, srcIsMacro, srcPhraseId, srcMacroId);
} }
// else, it's a move // else, it's a move
else else
{ {
// copy // copy
memorizePhraseOrMacro(dstMemoryIndex, srcIsMacro, srcPhraseId, srcMacroId); memorizePhraseOrMacro(dstMemoryLine, dstMemoryIndex, srcIsMacro, srcPhraseId, srcMacroId);
// forget src (after shorctut change!) // forget src (after shorctut change!)
CAHManager::getInstance()->runActionHandler("forget_phrase_or_macro", pCSSrc); CAHManager::getInstance()->runActionHandler("forget_phrase_or_macro", pCSSrc);
@ -909,14 +919,13 @@ void CHandlerMemorizePhraseOrMacro::execute (CCtrlBase *pCaller, const string &P
// memorize a spell // memorize a spell
void CHandlerMemorizePhraseOrMacro::memorizePhraseOrMacro(uint memoryIndex, bool isMacro, sint32 phraseId, sint32 macroId) void CHandlerMemorizePhraseOrMacro::memorizePhraseOrMacro(sint32 memoryLine, uint memoryIndex, bool isMacro, sint32 phraseId, sint32 macroId)
{ {
CSPhraseManager *pPM= CSPhraseManager::getInstance(); CSPhraseManager *pPM= CSPhraseManager::getInstance();
sint32 memoryLine= pPM->getSelectedMemoryLineDB(); if (memoryLine<0)
if(memoryLine<0) return;
return;
if(isMacro) if(isMacro)
{ {
pPM->memorizeMacro(memoryLine, memoryIndex, macroId); pPM->memorizeMacro(memoryLine, memoryIndex, macroId);
@ -931,11 +940,10 @@ void CHandlerMemorizePhraseOrMacro::memorizePhraseOrMacro(uint memoryIndex, bool
} }
// memorize a default spell // memorize a default spell
void CHandlerMemorizePhraseOrMacro::memorizePhraseSheet(uint memoryIndex, uint32 sheetId) void CHandlerMemorizePhraseOrMacro::memorizePhraseSheet(sint32 memoryLine, uint memoryIndex, uint32 sheetId)
{ {
CSPhraseManager *pPM= CSPhraseManager::getInstance(); CSPhraseManager *pPM= CSPhraseManager::getInstance();
sint32 memoryLine= pPM->getSelectedMemoryLineDB();
if(memoryLine<0) if(memoryLine<0)
return; return;
@ -989,7 +997,11 @@ public:
return; return;
// Ok, the user try to forget a phrase slot. // Ok, the user try to forget a phrase slot.
sint32 memoryLine= pPM->getSelectedMemoryLineDB(); sint32 memoryLine;
if (pCSDst->isShortCut())
memoryLine = pPM->getSelectedMemoryLineDB();
else
memoryLine = pPM->getSelectedMemoryAltLineDB();
if(memoryLine<0) if(memoryLine<0)
return; return;
@ -1026,6 +1038,9 @@ public:
if (!pCSDst->isSPhraseIdMemory() && !pCSDst->isMacroMemory()) if (!pCSDst->isSPhraseIdMemory() && !pCSDst->isMacroMemory())
return; return;
// is alternative action bar
bool isMain = pCSDst->isShortCut();
// get the memory index // get the memory index
uint memoryIndex = pCSDst->getIndexInDB(); uint memoryIndex = pCSDst->getIndexInDB();
@ -1034,7 +1049,9 @@ public:
// build params string // build params string
string sParams; string sParams;
sParams.append("memoryIndex="); sParams.append("isMain=");
sParams.append(toString(isMain));
sParams.append("|memoryIndex=");
sParams.append(toString(memoryIndex)); sParams.append(toString(memoryIndex));
sParams.append("|isMacro="); sParams.append("|isMacro=");
sParams.append(toString(isMacro)); sParams.append(toString(isMacro));
@ -1066,11 +1083,10 @@ public:
// Ok, the user try to forget a phrase slot // Ok, the user try to forget a phrase slot
CSPhraseManager *pPM = CSPhraseManager::getInstance(); CSPhraseManager *pPM = CSPhraseManager::getInstance();
sint32 memoryLine = pPM->getSelectedMemoryLineDB();
if (memoryLine<0)
return;
// get params // get params
bool isMain;
fromString(getParam(Params, "isMain"), isMain);
uint memoryIndex; uint memoryIndex;
fromString(getParam(Params, "memoryIndex"), memoryIndex); fromString(getParam(Params, "memoryIndex"), memoryIndex);
bool isMacro; bool isMacro;
@ -1078,6 +1094,14 @@ public:
sint32 phraseId; sint32 phraseId;
fromString(getParam(Params, "phraseId"),phraseId); fromString(getParam(Params, "phraseId"),phraseId);
sint32 memoryLine;
if (isMain)
memoryLine = pPM->getSelectedMemoryLineDB();
else
memoryLine = pPM->getSelectedMemoryAltLineDB();
if (memoryLine<0)
return;
if (isMacro) if (isMacro)
{ {
pPM->forgetMacro(memoryLine, memoryIndex); pPM->forgetMacro(memoryLine, memoryIndex);
@ -1513,7 +1537,7 @@ public:
if (pCSDst->isShortCut()) if (pCSDst->isShortCut())
memoryLine = pPM->getSelectedMemoryLineDB(); memoryLine = pPM->getSelectedMemoryLineDB();
else else
memoryLine = 0; memoryLine = pPM->getSelectedMemoryAltLineDB();
if(memoryLine<0) if(memoryLine<0)
return; return;

@ -588,7 +588,8 @@ void CBotChatPageTrade::updateTradeModal()
if ((_BuyMean == MoneyGuildXP) || (_BuyMean == GuildMoney) || (_BuyMean == GuildMoneyGuildXP)) if ((_BuyMean == MoneyGuildXP) || (_BuyMean == GuildMoney) || (_BuyMean == GuildMoneyGuildXP))
{ {
uint64 totalPrice = (uint64) priceWithoutFame * (uint64) quantity; uint64 totalPrice = (uint64) priceWithoutFame * (uint64) quantity;
NLGUI::CDBManager::getInstance()->getDbProp("UI:TEMP:TRADE_ITEM:PRICE")->setValue64(totalPrice); NLGUI::CDBManager::getInstance()->getDbProp("UI:TEMP:TRADE_ITEM:UNIT_PRICE")->setValue64(totalPrice);
NLGUI::CDBManager::getInstance()->getDbProp("UI:TEMP:TRADE_ITEM:UNIT_PRICE_WITH_FAME")->setValue64(totalPrice);
uint64 totalXP = (uint64) getCurrItemXP() * (uint64) quantity; uint64 totalXP = (uint64) getCurrItemXP() * (uint64) quantity;
CGuildManager *pGM = CGuildManager::getInstance(); CGuildManager *pGM = CGuildManager::getInstance();

@ -425,6 +425,9 @@ CViewBase *CChatTextManager::createMsgTextComplex(const ucstring &msg, NLMISC::C
ucstring::size_type pos = 0; ucstring::size_type pos = 0;
// Manage Translations // Manage Translations
CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:CHAT:SHOW_TRANSLATION_ONLY_AS_TOOLTIP_CB", false);
bool originalFirst = node->getValueBool();
string::size_type startTr = msg.find(ucstring("{:")); string::size_type startTr = msg.find(ucstring("{:"));
string::size_type endOfOriginal = msg.find(ucstring("}@{")); string::size_type endOfOriginal = msg.find(ucstring("}@{"));
@ -436,12 +439,22 @@ CViewBase *CChatTextManager::createMsgTextComplex(const ucstring &msg, NLMISC::C
string texture = "flag-"+toLower(msg.substr(startTr+2, 2)).toString()+".tga"; string texture = "flag-"+toLower(msg.substr(startTr+2, 2)).toString()+".tga";
ucstring original = msg.substr(startTr+5, endOfOriginal-startTr-5); ucstring original = msg.substr(startTr+5, endOfOriginal-startTr-5);
pos = endOfOriginal+3; ucstring translation = msg.substr(endOfOriginal+3);
CCtrlButton *ctrlButton = new CCtrlButton(CViewBase::TCtorParam()); CCtrlButton *ctrlButton = new CCtrlButton(CViewBase::TCtorParam());
ctrlButton->setTexture(texture); ctrlButton->setTexture(texture);
ctrlButton->setTextureOver(texture); ctrlButton->setTextureOver(texture);
ctrlButton->setTexturePushed(texture); ctrlButton->setTexturePushed(texture);
ctrlButton->setDefaultContextHelp(original); if (!originalFirst)
{
ctrlButton->setDefaultContextHelp(original);
pos = endOfOriginal+3;
}
else
{
ctrlButton->setDefaultContextHelp(translation);
pos = startTr+5;
textSize = endOfOriginal;
}
ctrlButton->setId("tr"); ctrlButton->setId("tr");
para->addChild(ctrlButton); para->addChild(ctrlButton);
} }

@ -2875,7 +2875,7 @@ bool CDBCtrlSheet::handleEvent (const NLGUI::CEventDescriptor &event)
} }
else else
{ {
validClic = isDraggable() && !isDragged() && ((!getItemWeared()&&!getGrayed()) || isShortCut()); validClic = isDraggable() && !isDragged() && ((!getItemWeared()&&!getGrayed()) || isSPhraseId());
} }
} }
if (_Type == SheetType_Macro) if (_Type == SheetType_Macro)

@ -257,7 +257,7 @@ void CDBGroupListSheetTrade::CSheetChildTrade::updateViewText(CDBGroupListSheetT
case CDBCtrlSheet::Pact: text= CI18N::get("uiBotChatPact") + text; break; case CDBCtrlSheet::Pact: text= CI18N::get("uiBotChatPact") + text; break;
case CDBCtrlSheet::Skill: text= CI18N::get("uiBotChatSkill") + text; break; case CDBCtrlSheet::Skill: text= CI18N::get("uiBotChatSkill") + text; break;
case CDBCtrlSheet::GuildFlag: text= CI18N::get("uiBotChatSkill") + text; break; case CDBCtrlSheet::GuildFlag: text= CI18N::get("uiBotChatSkill") + text; break;
case CDBCtrlSheet::Phrase: text= CI18N::get("uiBotChatPhrase") + text; break; case CDBCtrlSheet::Phrase: text= text; break;
default: break; default: break;
} }
@ -536,12 +536,12 @@ bool CDBGroupListSheetTrade::CSheetChildTrade::isSheetValid(CDBGroupListSheetTex
nlwarning("Brick %d has type %s", (int) k, BRICK_TYPE::toString(bs->getBrickType()).c_str()); nlwarning("Brick %d has type %s", (int) k, BRICK_TYPE::toString(bs->getBrickType()).c_str());
} }
else else
{ {
nlwarning("Brick %d : not a brick sheet", (int) k); nlwarning("Brick %d : not a brick sheet", (int) k);
} }
} }
} }
*/ */
if (phraseSheet) if (phraseSheet)
{ {
@ -563,7 +563,7 @@ bool CDBGroupListSheetTrade::CSheetChildTrade::isSheetValid(CDBGroupListSheetTex
break; break;
} }
} }
return true; return true;

@ -846,11 +846,26 @@ void CGroupInSceneBubbleManager::chatOpen (uint32 nUID, const ucstring &ucsText,
// Clean bubble from translation system // Clean bubble from translation system
CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:CHAT:SHOW_TRANSLATION_ONLY_AS_TOOLTIP_CB", false);
bool originalFirst = node->getValueBool();
ucstring::size_type pos = 0; ucstring::size_type pos = 0;
ucstring::size_type textSize = ucsText.size();
string::size_type startTr = ucsText.find(ucstring("{:"));
string::size_type endOfOriginal = ucsText.find(ucstring("}@{")); string::size_type endOfOriginal = ucsText.find(ucstring("}@{"));
if (endOfOriginal != string::npos) if (endOfOriginal != string::npos)
pos = endOfOriginal+4; {
if (!originalFirst)
{
pos = endOfOriginal+4;
}
else
{
pos = startTr+5;
textSize = endOfOriginal;
}
}
// Output the message in a bubble // Output the message in a bubble
bool show = false; bool show = false;
@ -870,7 +885,7 @@ void CGroupInSceneBubbleManager::chatOpen (uint32 nUID, const ucstring &ucsText,
return; return;
// Get a bubble // Get a bubble
CGroupInSceneBubble *bubble = newBubble (ucsText.substr(pos)); CGroupInSceneBubble *bubble = newBubble (ucsText.substr(pos, textSize-pos));
if (bubble) if (bubble)
{ {
// Link the bubble // Link the bubble

@ -2472,7 +2472,8 @@ void CGroupMap::updateMatchedLandmarks()
std::vector<std::pair<string,string> > params; std::vector<std::pair<string,string> > params;
params.clear(); params.clear();
params.push_back(std::pair<string,string>("id", toString("lm%d", k))); params.push_back(std::pair<string,string>("id", toString("lm%d", k)));
params.push_back(std::pair<string,string>("tooltip", _MatchedLandmarks[k].Title.toUtf8())); // ctrl base expects utf8 string to start with "u:"
params.push_back(std::pair<string,string>("tooltip", "u:" + _MatchedLandmarks[k].Title.toUtf8()));
params.push_back(std::pair<string,string>("index", toString(k))); params.push_back(std::pair<string,string>("index", toString(k)));
CInterfaceGroup *g = CWidgetManager::getInstance()->getParser()->createGroupInstance("lm_search_result", pL->getId(), params); CInterfaceGroup *g = CWidgetManager::getInstance()->getParser()->createGroupInstance("lm_search_result", pL->getId(), params);
@ -2680,7 +2681,7 @@ void CGroupMap::setLandmarkFilter(const std::string &s)
if (!s.empty()) { if (!s.empty()) {
ucstring ucs; ucstring ucs;
ucs.fromUtf8(s); ucs.fromUtf8(s);
splitUCString(toLower(s), ucstring(" "), _LandmarkFilter); splitUCString(toLower(ucs), ucstring(" "), _LandmarkFilter);
} }
// recreate landmarks // recreate landmarks

@ -67,6 +67,7 @@ NLMISC_REGISTER_OBJECT(CViewBase, CDBGroupListAscensor, std::string, "list_sheet
#define VIEW_TEXT_GUILD_QUIT "ui:interface:guild:content:tab_guild_info:quit_guild" #define VIEW_TEXT_GUILD_QUIT "ui:interface:guild:content:tab_guild_info:quit_guild"
#define CTRL_SHEET_GUILD_BLASON "ui:interface:guild:content:tab_guild_info:blason" #define CTRL_SHEET_GUILD_BLASON "ui:interface:guild:content:tab_guild_info:blason"
#define VIEW_TEXT_GUILD_MEMBER_COUNT "ui:interface:guild:content:tab_guild_info:member_count" #define VIEW_TEXT_GUILD_MEMBER_COUNT "ui:interface:guild:content:tab_guild_info:member_count"
#define VIEW_TEXT_GUILD_MEMBER_COUNT_ONLINE "ui:interface:guild:content:tab_guild_info:member_count_online"
#define LIST_GUILD_MEMBERS "ui:interface:guild:content:tab_guild:list_member:guild_members" #define LIST_GUILD_MEMBERS "ui:interface:guild:content:tab_guild:list_member:guild_members"
@ -817,6 +818,7 @@ class CAHGuildSheetOpen : public IActionHandler
if (pParent == NULL) return; if (pParent == NULL) return;
pParent->clearGroups(); pParent->clearGroups();
pParent->setDynamicDisplaySize(false); pParent->setDynamicDisplaySize(false);
uint member_online = 0;
for (uint i = 0; i < rGuildMembers.size(); i++) for (uint i = 0; i < rGuildMembers.size(); i++)
{ {
// create the member line // create the member line
@ -855,11 +857,13 @@ class CAHGuildSheetOpen : public IActionHandler
switch(rGuildMembers[i].Online) switch(rGuildMembers[i].Online)
{ {
case ccs_online: case ccs_online:
member_online++;
onlineView->setTexture("w_online.tga"); onlineView->setTexture("w_online.tga");
if (toolTip) if (toolTip)
toolTip->setDefaultContextHelp(CI18N::get("uittGuildMemberOnline")); toolTip->setDefaultContextHelp(CI18N::get("uittGuildMemberOnline"));
break; break;
case ccs_online_abroad: case ccs_online_abroad:
member_online++;
onlineView->setTexture("w_online_abroad.tga"); onlineView->setTexture("w_online_abroad.tga");
if (toolTip) if (toolTip)
toolTip->setDefaultContextHelp(CI18N::get("uittGuildMemberOnlineAbroad")); toolTip->setDefaultContextHelp(CI18N::get("uittGuildMemberOnlineAbroad"));
@ -895,6 +899,12 @@ class CAHGuildSheetOpen : public IActionHandler
pLine->setParent (pParent); pLine->setParent (pParent);
pParent->addChild (pLine); pParent->addChild (pLine);
} }
// update member online count view
CViewText *pOnlineMember = dynamic_cast<CViewText*>(CWidgetManager::getInstance()->getElementFromId(VIEW_TEXT_GUILD_MEMBER_COUNT_ONLINE));
if (pOnlineMember)
pOnlineMember->setText(toString(member_online));
} }
} }
}; };

@ -3769,6 +3769,21 @@ void CInventoryManager::sortBag()
if (pIconList != NULL) pIconList->needToSort(); if (pIconList != NULL) pIconList->needToSort();
pList = dynamic_cast<CDBGroupListSheetBag*>(CWidgetManager::getInstance()->getElementFromId(LIST_PA3_TEXT)); pList = dynamic_cast<CDBGroupListSheetBag*>(CWidgetManager::getInstance()->getElementFromId(LIST_PA3_TEXT));
if (pList != NULL) pList->needToSort(); if (pList != NULL) pList->needToSort();
pIconList = dynamic_cast<CDBGroupIconListBag*>(CWidgetManager::getInstance()->getElementFromId(LIST_PA4_ICONS));
if (pIconList != NULL) pIconList->needToSort();
pList = dynamic_cast<CDBGroupListSheetBag*>(CWidgetManager::getInstance()->getElementFromId(LIST_PA4_TEXT));
if (pList != NULL) pList->needToSort();
pIconList = dynamic_cast<CDBGroupIconListBag*>(CWidgetManager::getInstance()->getElementFromId(LIST_PA5_ICONS));
if (pIconList != NULL) pIconList->needToSort();
pList = dynamic_cast<CDBGroupListSheetBag*>(CWidgetManager::getInstance()->getElementFromId(LIST_PA5_TEXT));
if (pList != NULL) pList->needToSort();
pIconList = dynamic_cast<CDBGroupIconListBag*>(CWidgetManager::getInstance()->getElementFromId(LIST_PA6_ICONS));
if (pIconList != NULL) pIconList->needToSort();
pList = dynamic_cast<CDBGroupListSheetBag*>(CWidgetManager::getInstance()->getElementFromId(LIST_PA6_TEXT));
if (pList != NULL) pList->needToSort();
} }
// *************************************************************************** // ***************************************************************************

@ -822,6 +822,15 @@ private:
#define LIST_PA3_TEXT "ui:interface:inv_pa3:content:iil:bag_list" #define LIST_PA3_TEXT "ui:interface:inv_pa3:content:iil:bag_list"
#define LIST_PA3_ICONS "ui:interface:inv_pa3:content:iil:bag_icons" #define LIST_PA3_ICONS "ui:interface:inv_pa3:content:iil:bag_icons"
#define LIST_PA4_TEXT "ui:interface:inv_pa4:content:iil:bag_list"
#define LIST_PA4_ICONS "ui:interface:inv_pa4:content:iil:bag_icons"
#define LIST_PA5_TEXT "ui:interface:inv_pa5:content:iil:bag_list"
#define LIST_PA5_ICONS "ui:interface:inv_pa5:content:iil:bag_icons"
#define LIST_PA6_TEXT "ui:interface:inv_pa6:content:iil:bag_list"
#define LIST_PA6_ICONS "ui:interface:inv_pa6:content:iil:bag_icons"
// Theorically never used // Theorically never used
#define LIST_BAG2_TEXT "ui:interface:inv_bag:content:iil:bag_list" #define LIST_BAG2_TEXT "ui:interface:inv_bag:content:iil:bag_list"
#define LIST_BAG2_ICONS "ui:interface:inv_bag:content:iil:bag_icons" #define LIST_BAG2_ICONS "ui:interface:inv_bag:content:iil:bag_icons"

@ -565,6 +565,7 @@ void CLuaIHMRyzom::RegisterRyzomFunctions(NLGUI::CLuaState &ls)
LUABIND_FUNC(isDynStringAvailable), LUABIND_FUNC(isDynStringAvailable),
LUABIND_FUNC(isFullyPatched), LUABIND_FUNC(isFullyPatched),
LUABIND_FUNC(getSheetType), LUABIND_FUNC(getSheetType),
LUABIND_FUNC(getSheetShape),
LUABIND_FUNC(getSheetFamily), LUABIND_FUNC(getSheetFamily),
LUABIND_FUNC(getSheetName), LUABIND_FUNC(getSheetName),
LUABIND_FUNC(getFameIndex), LUABIND_FUNC(getFameIndex),
@ -1245,7 +1246,7 @@ int CLuaIHMRyzom::getMousePos(CLuaState &ls)
CTool::getMousePos(x, y); CTool::getMousePos(x, y);
ls.push(x); ls.push(x);
ls.push(y); ls.push(y);
return 2; return 2;
} }
@ -1257,7 +1258,7 @@ int CLuaIHMRyzom::getMouseDown(CLuaState &ls)
ls.push(down); ls.push(down);
ls.push(x); ls.push(x);
ls.push(y); ls.push(y);
return 3; return 3;
} }
@ -1266,11 +1267,11 @@ int CLuaIHMRyzom::getMouseMiddleDown(CLuaState &ls)
sint32 x, y; sint32 x, y;
bool down; bool down;
CTool::getMouseMiddleDown(down, x, y); CTool::getMouseMiddleDown(down, x, y);
ls.push(down); ls.push(down);
ls.push(x); ls.push(x);
ls.push(y); ls.push(y);
return 3; return 3;
} }
@ -1279,11 +1280,11 @@ int CLuaIHMRyzom::getMouseRightDown(CLuaState &ls)
sint32 x, y; sint32 x, y;
bool down; bool down;
CTool::getMouseRightDown(down, x, y); CTool::getMouseRightDown(down, x, y);
ls.push(down); ls.push(down);
ls.push(x); ls.push(x);
ls.push(y); ls.push(y);
return 3; return 3;
} }
@ -1294,10 +1295,10 @@ int CLuaIHMRyzom::getShapeIdAt(CLuaState &ls)
CLuaIHM::checkArgCount(ls, funcName, 2); CLuaIHM::checkArgCount(ls, funcName, 2);
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER); CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER);
CLuaIHM::checkArgType(ls, funcName, 2, LUA_TNUMBER); CLuaIHM::checkArgType(ls, funcName, 2, LUA_TNUMBER);
uint32 x = (uint32)ls.toInteger(1); uint32 x = (uint32)ls.toInteger(1);
uint32 y = (uint32)ls.toInteger(2); uint32 y = (uint32)ls.toInteger(2);
uint32 w, h; uint32 w, h;
CViewRenderer &viewRender = *CViewRenderer::getInstance(); CViewRenderer &viewRender = *CViewRenderer::getInstance();
viewRender.getScreenSize(w, h); viewRender.getScreenSize(w, h);
@ -1308,11 +1309,11 @@ int CLuaIHMRyzom::getShapeIdAt(CLuaState &ls)
float cursX = (float)x/(float)w; float cursX = (float)x/(float)w;
float cursY = (float)y/(float)h; float cursY = (float)y/(float)h;
sint32 instance_idx; sint32 instance_idx;
EntitiesMngr.getShapeInstanceUnderPos(cursX, cursY, instance_idx); EntitiesMngr.getShapeInstanceUnderPos(cursX, cursY, instance_idx);
ls.push(instance_idx); ls.push(instance_idx);
return 1; return 1;
} }
@ -1339,7 +1340,7 @@ int CLuaIHMRyzom::getGroundAtMouse(CLuaState &ls)
worldViewRay.Up = camMatrix.getK().normed(); worldViewRay.Up = camMatrix.getK().normed();
CVector sceneInter; CVector sceneInter;
CTool::TRayIntersectionType rayInterType = CTool::computeLandscapeRayIntersection(worldViewRay, sceneInter); CTool::TRayIntersectionType rayInterType = CTool::computeLandscapeRayIntersection(worldViewRay, sceneInter);
ls.push(sceneInter.x); ls.push(sceneInter.x);
ls.push(sceneInter.y); ls.push(sceneInter.y);
ls.push(sceneInter.z); ls.push(sceneInter.z);
@ -1367,7 +1368,7 @@ int CLuaIHMRyzom::moveCam(CLuaState &ls)
float z = (float)ls.toNumber(3); float z = (float)ls.toNumber(3);
CVector moves(x, y, z); CVector moves(x, y, z);
UserEntity->setCameraMoves(moves); UserEntity->setCameraMoves(moves);
return 0; return 0;
} }
@ -1541,7 +1542,7 @@ int CLuaIHMRyzom::moveToTarget(CLuaState &ls)
const std::string &url = ls.toString(1); const std::string &url = ls.toString(1);
CEntityCL *target = getTargetEntity(); CEntityCL *target = getTargetEntity();
if (!target) return 0; if (!target) return 0;
CLuaManager::getInstance().executeLuaScript("ArkTargetUrl = [["+url+"]]", 0); CLuaManager::getInstance().executeLuaScript("ArkTargetUrl = [["+url+"]]", 0);
UserEntity->moveTo(UserEntity->selection(), 1.0, CUserEntity::OpenArkUrl); UserEntity->moveTo(UserEntity->selection(), 1.0, CUserEntity::OpenArkUrl);
return 0; return 0;
@ -2180,7 +2181,7 @@ int CLuaIHMRyzom::addShape(CLuaState &ls)
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING);
sint32 idx = -1; sint32 idx = -1;
if (!Scene) if (!Scene)
{ {
nlwarning("No scene available"); nlwarning("No scene available");
@ -2189,7 +2190,7 @@ int CLuaIHMRyzom::addShape(CLuaState &ls)
} }
string shape = ls.toString(1); string shape = ls.toString(1);
float x = 0.0f, y = 0.0f, z = 0.0f; float x = 0.0f, y = 0.0f, z = 0.0f;
float scale = 1.0f; float scale = 1.0f;
string context, url, skeleton, texture; string context, url, skeleton, texture;
@ -2197,7 +2198,7 @@ int CLuaIHMRyzom::addShape(CLuaState &ls)
bool transparency = false; bool transparency = false;
bool collision = true; bool collision = true;
bool inIgZone = false; bool inIgZone = false;
if (ls.getTop() >= 2) if (ls.getTop() >= 2)
{ {
CLuaIHM::checkArgType(ls, funcName, 2, LUA_TNUMBER); CLuaIHM::checkArgType(ls, funcName, 2, LUA_TNUMBER);
@ -2223,14 +2224,14 @@ int CLuaIHMRyzom::addShape(CLuaState &ls)
y = UserEntity->pos().y; y = UserEntity->pos().y;
z = UserEntity->pos().z; z = UserEntity->pos().z;
} }
CVector userDir = UserEntity->dir(); CVector userDir = UserEntity->dir();
if (ls.getTop() >= 5) if (ls.getTop() >= 5)
{ {
CLuaIHM::checkArgType(ls, funcName, 5, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 5, LUA_TSTRING);
string angle = ls.toString(5); string angle = ls.toString(5);
if (angle != "user") if (angle != "user")
{ {
float a; float a;
@ -2238,7 +2239,7 @@ int CLuaIHMRyzom::addShape(CLuaState &ls)
userDir = CVector(sin(a), cos(a), 0.f); userDir = CVector(sin(a), cos(a), 0.f);
} }
} }
if (ls.getTop() >= 6) if (ls.getTop() >= 6)
{ {
CLuaIHM::checkArgType(ls, funcName, 6, LUA_TNUMBER); CLuaIHM::checkArgType(ls, funcName, 6, LUA_TNUMBER);
@ -2250,19 +2251,19 @@ int CLuaIHMRyzom::addShape(CLuaState &ls)
CLuaIHM::checkArgType(ls, funcName, 7, LUA_TBOOLEAN); CLuaIHM::checkArgType(ls, funcName, 7, LUA_TBOOLEAN);
collision = ls.toBoolean(7); collision = ls.toBoolean(7);
} }
if (ls.getTop() >= 8) if (ls.getTop() >= 8)
{ {
CLuaIHM::checkArgType(ls, funcName, 8, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 8, LUA_TSTRING);
context = ls.toString(8); context = ls.toString(8);
} }
if (ls.getTop() >= 9) if (ls.getTop() >= 9)
{ {
CLuaIHM::checkArgType(ls, funcName, 9, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 9, LUA_TSTRING);
url = ls.toString(9); url = ls.toString(9);
} }
if (ls.getTop() >= 10) if (ls.getTop() >= 10)
{ {
CLuaIHM::checkArgType(ls, funcName, 10, LUA_TBOOLEAN); CLuaIHM::checkArgType(ls, funcName, 10, LUA_TBOOLEAN);
@ -2274,25 +2275,25 @@ int CLuaIHMRyzom::addShape(CLuaState &ls)
CLuaIHM::checkArgType(ls, funcName, 11, LUA_TBOOLEAN); CLuaIHM::checkArgType(ls, funcName, 11, LUA_TBOOLEAN);
transparency = ls.toBoolean(11); transparency = ls.toBoolean(11);
} }
if (ls.getTop() >= 12) if (ls.getTop() >= 12)
{ {
CLuaIHM::checkArgType(ls, funcName, 12, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 12, LUA_TSTRING);
texture = ls.toString(12); texture = ls.toString(12);
} }
if (ls.getTop() >= 13) if (ls.getTop() >= 13)
{ {
CLuaIHM::checkArgType(ls, funcName, 13, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 13, LUA_TSTRING);
skeleton = ls.toString(13); skeleton = ls.toString(13);
} }
if (ls.getTop() >= 14) if (ls.getTop() >= 14)
{ {
CLuaIHM::checkArgType(ls, funcName, 14, LUA_TBOOLEAN); CLuaIHM::checkArgType(ls, funcName, 14, LUA_TBOOLEAN);
inIgZone = ls.toBoolean(14); inIgZone = ls.toBoolean(14);
} }
CShapeInstanceReference instref = EntitiesMngr.createInstance(shape, CVector(x, y, z), context, url, collision, inIgZone, idx); CShapeInstanceReference instref = EntitiesMngr.createInstance(shape, CVector(x, y, z), context, url, collision, inIgZone, idx);
UInstance instance = instref.Instance; UInstance instance = instref.Instance;
@ -2373,9 +2374,9 @@ int CLuaIHMRyzom::addShape(CLuaState &ls)
instance.setPos(CVector(x, y, z)); instance.setPos(CVector(x, y, z));
instance.setRotQuat(dir.getRot()); instance.setRotQuat(dir.getRot());
} }
instance.setTransformMode(UTransformable::RotEuler); instance.setTransformMode(UTransformable::RotEuler);
// if the shape is a particle system, additionnal parameters are user params // if the shape is a particle system, additionnal parameters are user params
UParticleSystemInstance psi; UParticleSystemInstance psi;
psi.cast (instance); psi.cast (instance);
@ -2398,7 +2399,7 @@ int CLuaIHMRyzom::addShape(CLuaState &ls)
} }
} }
}*/ }*/
UMovePrimitive *primitive = instref.Primitive; UMovePrimitive *primitive = instref.Primitive;
if (primitive) if (primitive)
{ {
@ -2408,7 +2409,7 @@ int CLuaIHMRyzom::addShape(CLuaState &ls)
primitive->setReactionType(UMovePrimitive::Slide); primitive->setReactionType(UMovePrimitive::Slide);
primitive->setTriggerType(UMovePrimitive::NotATrigger); primitive->setTriggerType(UMovePrimitive::NotATrigger);
primitive->setAbsorbtion(0); primitive->setAbsorbtion(0);
primitive->setPrimitiveType(UMovePrimitive::_2DOrientedBox); primitive->setPrimitiveType(UMovePrimitive::_2DOrientedBox);
primitive->setSize((bbox.getMax().x - bbox.getMin().x)*scale, (bbox.getMax().y - bbox.getMin().y)*scale); primitive->setSize((bbox.getMax().x - bbox.getMin().x)*scale, (bbox.getMax().y - bbox.getMin().y)*scale);
primitive->setHeight((bbox.getMax().z - bbox.getMin().z)*scale); primitive->setHeight((bbox.getMax().z - bbox.getMin().z)*scale);
@ -2416,10 +2417,10 @@ int CLuaIHMRyzom::addShape(CLuaState &ls)
primitive->setCollisionMask(MaskColPlayer | MaskColNpc | MaskColDoor); primitive->setCollisionMask(MaskColPlayer | MaskColNpc | MaskColDoor);
primitive->setOcclusionMask(MaskColPlayer | MaskColNpc | MaskColDoor); primitive->setOcclusionMask(MaskColPlayer | MaskColNpc | MaskColDoor);
primitive->setObstacle(true); primitive->setObstacle(true);
primitive->setGlobalPosition(instance.getPos(), dynamicWI); primitive->setGlobalPosition(instance.getPos(), dynamicWI);
primitive->insertInWorldImage(dynamicWI); primitive->insertInWorldImage(dynamicWI);
} }
} }
@ -2434,9 +2435,9 @@ int CLuaIHMRyzom::setupShape(CLuaState &ls)
CLuaIHM::checkArgCount(ls, funcName, 2); CLuaIHM::checkArgCount(ls, funcName, 2);
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER); CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER);
CLuaIHM::checkArgType(ls, funcName, 2, LUA_TTABLE); CLuaIHM::checkArgType(ls, funcName, 2, LUA_TTABLE);
uint32 idx = (uint32)ls.toInteger(1); uint32 idx = (uint32)ls.toInteger(1);
std::vector<string> keys; std::vector<string> keys;
std::vector<string> values; std::vector<string> values;
CLuaObject params; CLuaObject params;
@ -2459,12 +2460,12 @@ int CLuaIHMRyzom::setupShape(CLuaState &ls)
values.push_back(it.nextValue().toString()); values.push_back(it.nextValue().toString());
keys.push_back(it.nextKey().toString()); keys.push_back(it.nextKey().toString());
} }
if (EntitiesMngr.setupInstance(idx, keys, values)) if (EntitiesMngr.setupInstance(idx, keys, values))
ls.push(1); ls.push(1);
else else
ls.pushNil(); ls.pushNil();
return 1; return 1;
} }
@ -2476,15 +2477,15 @@ int CLuaIHMRyzom::moveShape(CLuaState &ls)
CLuaIHM::checkArgType(ls, funcName, 2, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 2, LUA_TSTRING);
CLuaIHM::checkArgType(ls, funcName, 3, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 3, LUA_TSTRING);
CLuaIHM::checkArgType(ls, funcName, 4, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 4, LUA_TSTRING);
uint32 idx = (uint32)ls.toInteger(1); uint32 idx = (uint32)ls.toInteger(1);
CVector pos = EntitiesMngr.getInstancePos(idx); CVector pos = EntitiesMngr.getInstancePos(idx);
string x = ls.toString(2); string x = ls.toString(2);
string y = ls.toString(3); string y = ls.toString(3);
string z = ls.toString(4); string z = ls.toString(4);
float move_x = 0; float move_x = 0;
float move_y = 0; float move_y = 0;
float move_z = 0; float move_z = 0;
@ -2502,7 +2503,7 @@ int CLuaIHMRyzom::moveShape(CLuaState &ls)
pos.x = move_x; pos.x = move_x;
} }
} }
if (!y.empty()) if (!y.empty())
{ {
if (y[0] == '+') if (y[0] == '+')
@ -2516,7 +2517,7 @@ int CLuaIHMRyzom::moveShape(CLuaState &ls)
pos.y = move_y; pos.y = move_y;
} }
} }
if (!z.empty()) if (!z.empty())
{ {
if (z[0] == '+') if (z[0] == '+')
@ -2530,12 +2531,12 @@ int CLuaIHMRyzom::moveShape(CLuaState &ls)
pos.z = move_z; pos.z = move_z;
} }
} }
if (EntitiesMngr.setInstancePos(idx, pos)) if (EntitiesMngr.setInstancePos(idx, pos))
ls.push(1); ls.push(1);
else else
ls.pushNil(); ls.pushNil();
return 1; return 1;
} }
@ -2547,9 +2548,9 @@ int CLuaIHMRyzom::rotateShape(CLuaState &ls)
CLuaIHM::checkArgType(ls, funcName, 2, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 2, LUA_TSTRING);
CLuaIHM::checkArgType(ls, funcName, 3, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 3, LUA_TSTRING);
CLuaIHM::checkArgType(ls, funcName, 4, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 4, LUA_TSTRING);
uint32 idx = (uint32)ls.toInteger(1); uint32 idx = (uint32)ls.toInteger(1);
CVector rot = EntitiesMngr.getInstanceRot(idx); CVector rot = EntitiesMngr.getInstanceRot(idx);
string x = ls.toString(2); string x = ls.toString(2);
@ -2573,7 +2574,7 @@ int CLuaIHMRyzom::rotateShape(CLuaState &ls)
rot.x = rot_x; rot.x = rot_x;
} }
} }
if (!y.empty()) if (!y.empty())
{ {
if (y[0] == '+') if (y[0] == '+')
@ -2587,7 +2588,7 @@ int CLuaIHMRyzom::rotateShape(CLuaState &ls)
rot.y = rot_y; rot.y = rot_y;
} }
} }
if (!z.empty()) if (!z.empty())
{ {
if (z[0] == '+') if (z[0] == '+')
@ -2601,12 +2602,12 @@ int CLuaIHMRyzom::rotateShape(CLuaState &ls)
rot.z = rot_z; rot.z = rot_z;
} }
} }
if (EntitiesMngr.setInstanceRot(idx, rot)) if (EntitiesMngr.setInstanceRot(idx, rot))
ls.push(1); ls.push(1);
else else
ls.pushNil(); ls.pushNil();
return 1; return 1;
} }
@ -2615,7 +2616,7 @@ int CLuaIHMRyzom::deleteShape(CLuaState &ls)
const char* funcName = "deleteShape"; const char* funcName = "deleteShape";
CLuaIHM::checkArgCount(ls, funcName, 1); CLuaIHM::checkArgCount(ls, funcName, 1);
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER); CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER);
if (EntitiesMngr.deleteInstance((uint32)ls.toInteger(1))) if (EntitiesMngr.deleteInstance((uint32)ls.toInteger(1)))
ls.push(1); ls.push(1);
else else
@ -2629,9 +2630,9 @@ int CLuaIHMRyzom::getShapePos(CLuaState &ls)
const char* funcName = "getShapePos"; const char* funcName = "getShapePos";
CLuaIHM::checkArgCount(ls, funcName, 1); CLuaIHM::checkArgCount(ls, funcName, 1);
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER); CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER);
uint32 idx = (uint32)ls.toInteger(1); uint32 idx = (uint32)ls.toInteger(1);
CVector pos = EntitiesMngr.getInstancePos(idx); CVector pos = EntitiesMngr.getInstancePos(idx);
ls.push(pos.x); ls.push(pos.x);
@ -2645,9 +2646,9 @@ int CLuaIHMRyzom::getShapeRot(CLuaState &ls)
const char* funcName = "getShapeRot"; const char* funcName = "getShapeRot";
CLuaIHM::checkArgCount(ls, funcName, 1); CLuaIHM::checkArgCount(ls, funcName, 1);
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER); CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER);
uint32 idx = (uint32)ls.toInteger(1); uint32 idx = (uint32)ls.toInteger(1);
CVector rot = EntitiesMngr.getInstanceRot(idx); CVector rot = EntitiesMngr.getInstanceRot(idx);
ls.push(rot.x); ls.push(rot.x);
@ -2661,11 +2662,11 @@ int CLuaIHMRyzom::getShapeScale(CLuaState &ls)
const char* funcName = "getShapeScale"; const char* funcName = "getShapeScale";
CLuaIHM::checkArgCount(ls, funcName, 1); CLuaIHM::checkArgCount(ls, funcName, 1);
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER); CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER);
uint32 idx = (uint32)ls.toInteger(1); uint32 idx = (uint32)ls.toInteger(1);
CVector scale = EntitiesMngr.getInstanceScale(idx); CVector scale = EntitiesMngr.getInstanceScale(idx);
ls.push(scale.x); ls.push(scale.x);
ls.push(scale.y); ls.push(scale.y);
ls.push(scale.z); ls.push(scale.z);
@ -2677,11 +2678,11 @@ int CLuaIHMRyzom::getShapeColPos(CLuaState &ls)
const char* funcName = "getShapeColPos"; const char* funcName = "getShapeColPos";
CLuaIHM::checkArgCount(ls, funcName, 1); CLuaIHM::checkArgCount(ls, funcName, 1);
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER); CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER);
uint32 idx = (uint32)ls.toInteger(1); uint32 idx = (uint32)ls.toInteger(1);
CVector pos = EntitiesMngr.getInstanceColPos(idx); CVector pos = EntitiesMngr.getInstanceColPos(idx);
ls.push(pos.x); ls.push(pos.x);
ls.push(pos.y); ls.push(pos.y);
ls.push(pos.z); ls.push(pos.z);
@ -2693,11 +2694,11 @@ int CLuaIHMRyzom::getShapeColScale(CLuaState &ls)
const char* funcName = "getShapeColScale"; const char* funcName = "getShapeColScale";
CLuaIHM::checkArgCount(ls, funcName, 1); CLuaIHM::checkArgCount(ls, funcName, 1);
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER); CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER);
uint32 idx = (uint32)ls.toInteger(1); uint32 idx = (uint32)ls.toInteger(1);
CVector scale = EntitiesMngr.getInstanceColScale(idx); CVector scale = EntitiesMngr.getInstanceColScale(idx);
ls.push(scale.x); ls.push(scale.x);
ls.push(scale.y); ls.push(scale.y);
ls.push(scale.z); ls.push(scale.z);
@ -2709,11 +2710,11 @@ int CLuaIHMRyzom::getShapeColOrient(CLuaState &ls)
const char* funcName = "getShapeColOrient"; const char* funcName = "getShapeColOrient";
CLuaIHM::checkArgCount(ls, funcName, 1); CLuaIHM::checkArgCount(ls, funcName, 1);
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER); CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER);
uint32 idx = (uint32)ls.toInteger(1); uint32 idx = (uint32)ls.toInteger(1);
double orient = EntitiesMngr.getInstanceColOrient(idx); double orient = EntitiesMngr.getInstanceColOrient(idx);
ls.push(orient); ls.push(orient);
return 1; return 1;
} }
@ -3469,6 +3470,30 @@ std::string CLuaIHMRyzom::getSheetType(const std::string &sheet)
return CEntitySheet::typeToString(sheetPtr->Type); return CEntitySheet::typeToString(sheetPtr->Type);
} }
// ***************************************************************************
std::string CLuaIHMRyzom::getSheetShape(const std::string &sheet)
{
//H_AUTO(Lua_CLuaIHM_getSheetType)
const CEntitySheet *sheetPtr = SheetMngr.get(CSheetId(sheet));
if (!sheetPtr)
return "";
if (sheetPtr->type() == CEntitySheet::ITEM)
{
CItemSheet *sheet = (CItemSheet*)sheetPtr;
return sheet->getShape();
}
else if (sheetPtr->type() == CEntitySheet::FAUNA)
{
CCharacterSheet *sheet = (CCharacterSheet*)(sheetPtr);
return sheet->Body.getItem();
}
return "";
}
// *************************************************************************** // ***************************************************************************
std::string CLuaIHMRyzom::getSheetFamily(const std::string &sheet) std::string CLuaIHMRyzom::getSheetFamily(const std::string &sheet)
@ -3481,7 +3506,7 @@ std::string CLuaIHMRyzom::getSheetFamily(const std::string &sheet)
if (pIS) if (pIS)
return ITEMFAMILY::toString(pIS->Family); return ITEMFAMILY::toString(pIS->Family);
} }
return ""; return "";
} }
@ -3712,7 +3737,7 @@ float CLuaIHMRyzom::setChar3dDBfromVPX(const std::string &branch, const std::str
cs.People = EGSPD::CPeople::fromString(people); cs.People = EGSPD::CPeople::fromString(people);
SCharacter3DSetup::setupDBFromCharacterSummary(branch, cs); SCharacter3DSetup::setupDBFromCharacterSummary(branch, cs);
return cs.VisualPropC.PropertySubData.CharacterHeight; return cs.VisualPropC.PropertySubData.CharacterHeight;
} }
@ -3879,42 +3904,42 @@ sint32 CLuaIHMRyzom::getPlayerLevel()
// *************************************************************************** // ***************************************************************************
std::string CLuaIHMRyzom::getPlayerVpaHex() std::string CLuaIHMRyzom::getPlayerVpaHex()
{ {
sint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E0:P" + toString("%d", CLFECOMMON::PROPERTY_VPA))->getValue64(); uint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E0:P" + toString("%d", CLFECOMMON::PROPERTY_VPA))->getValue64();
return NLMISC::toString("%X", prop); return NLMISC::toString("%X", prop);
} }
// *************************************************************************** // ***************************************************************************
std::string CLuaIHMRyzom::getPlayerVpbHex() std::string CLuaIHMRyzom::getPlayerVpbHex()
{ {
sint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E0:P" + toString("%d", CLFECOMMON::PROPERTY_VPB))->getValue64(); uint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E0:P" + toString("%d", CLFECOMMON::PROPERTY_VPB))->getValue64();
return NLMISC::toString("%X", prop); return NLMISC::toString("%X", prop);
} }
// *************************************************************************** // ***************************************************************************
std::string CLuaIHMRyzom::getPlayerVpcHex() std::string CLuaIHMRyzom::getPlayerVpcHex()
{ {
sint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E0:P" + toString("%d", CLFECOMMON::PROPERTY_VPB))->getValue64(); uint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E0:P" + toString("%d", CLFECOMMON::PROPERTY_VPC))->getValue64();
return NLMISC::toString("%X", prop); return NLMISC::toString("%X", prop);
} }
// *************************************************************************** // ***************************************************************************
sint64 CLuaIHMRyzom::getPlayerVpa() sint64 CLuaIHMRyzom::getPlayerVpa()
{ {
sint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E0:P" + toString("%d", CLFECOMMON::PROPERTY_VPA))->getValue64(); uint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E0:P" + toString("%d", CLFECOMMON::PROPERTY_VPA))->getValue64();
return prop; return prop;
} }
// *************************************************************************** // ***************************************************************************
sint64 CLuaIHMRyzom::getPlayerVpb() sint64 CLuaIHMRyzom::getPlayerVpb()
{ {
sint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E0:P" + toString("%d", CLFECOMMON::PROPERTY_VPB))->getValue64(); uint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E0:P" + toString("%d", CLFECOMMON::PROPERTY_VPB))->getValue64();
return prop; return prop;
} }
// *************************************************************************** // ***************************************************************************
sint64 CLuaIHMRyzom::getPlayerVpc() sint64 CLuaIHMRyzom::getPlayerVpc()
{ {
sint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E0:P" + toString("%d", CLFECOMMON::PROPERTY_VPB))->getValue64(); uint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E0:P" + toString("%d", CLFECOMMON::PROPERTY_VPC))->getValue64();
return prop; return prop;
} }
@ -3964,7 +3989,7 @@ std::string CLuaIHMRyzom::getTargetVpaHex()
CEntityCL *target = getTargetEntity(); CEntityCL *target = getTargetEntity();
if (!target) return 0; if (!target) return 0;
sint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E" + toString("%d", getTargetSlotNr()) + ":P" + toString("%d", CLFECOMMON::PROPERTY_VPA))->getValue64(); uint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E" + toString("%d", getTargetSlotNr()) + ":P" + toString("%d", CLFECOMMON::PROPERTY_VPA))->getValue64();
return NLMISC::toString("%X", prop); return NLMISC::toString("%X", prop);
} }
@ -3974,7 +3999,7 @@ std::string CLuaIHMRyzom::getTargetVpbHex()
CEntityCL *target = getTargetEntity(); CEntityCL *target = getTargetEntity();
if (!target) return 0; if (!target) return 0;
sint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E" + toString("%d", getTargetSlotNr()) + ":P" + toString("%d", CLFECOMMON::PROPERTY_VPB))->getValue64(); uint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E" + toString("%d", getTargetSlotNr()) + ":P" + toString("%d", CLFECOMMON::PROPERTY_VPB))->getValue64();
return NLMISC::toString("%X", prop); return NLMISC::toString("%X", prop);
} }
@ -3984,7 +4009,7 @@ std::string CLuaIHMRyzom::getTargetVpcHex()
CEntityCL *target = getTargetEntity(); CEntityCL *target = getTargetEntity();
if (!target) return 0; if (!target) return 0;
sint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E" + toString("%d", getTargetSlotNr()) + ":P" + toString("%d", CLFECOMMON::PROPERTY_VPB))->getValue64(); uint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E" + toString("%d", getTargetSlotNr()) + ":P" + toString("%d", CLFECOMMON::PROPERTY_VPC))->getValue64();
return NLMISC::toString("%X", prop); return NLMISC::toString("%X", prop);
} }
@ -3994,7 +4019,7 @@ sint64 CLuaIHMRyzom::getTargetVpa()
CEntityCL *target = getTargetEntity(); CEntityCL *target = getTargetEntity();
if (!target) return 0; if (!target) return 0;
sint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E" + toString("%d", getTargetSlotNr()) + ":P" + toString("%d", CLFECOMMON::PROPERTY_VPA))->getValue64(); uint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E" + toString("%d", getTargetSlotNr()) + ":P" + toString("%d", CLFECOMMON::PROPERTY_VPA))->getValue64();
return prop; return prop;
} }
@ -4016,7 +4041,7 @@ sint64 CLuaIHMRyzom::getTargetVpc()
CEntityCL *target = getTargetEntity(); CEntityCL *target = getTargetEntity();
if (!target) return 0; if (!target) return 0;
sint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E" + toString("%d", getTargetSlotNr()) + ":P" + toString("%d", CLFECOMMON::PROPERTY_VPB))->getValue64(); sint64 prop = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E" + toString("%d", getTargetSlotNr()) + ":P" + toString("%d", CLFECOMMON::PROPERTY_VPC))->getValue64();
return prop; return prop;
} }
@ -4172,12 +4197,12 @@ int CLuaIHMRyzom::addLandMark(CLuaState &ls)
point.LeftClickParam = ls.toString(6); point.LeftClickParam = ls.toString(6);
point.RightClickAction = ls.toString(7); point.RightClickAction = ls.toString(7);
point.RightClickParam = ls.toString(8); point.RightClickParam = ls.toString(8);
point.Color = CRGBA(255,255,255,255); point.Color = CRGBA(255,255,255,255);
if (ls.getTop() >= 9) if (ls.getTop() >= 9)
CLuaIHM::pop(ls, point.Color); CLuaIHM::pop(ls, point.Color);
CGroupMap *pMap = dynamic_cast<CGroupMap*>(CWidgetManager::getInstance()->getElementFromId("ui:interface:map:content:map_content:actual_map")); CGroupMap *pMap = dynamic_cast<CGroupMap*>(CWidgetManager::getInstance()->getElementFromId("ui:interface:map:content:map_content:actual_map"));
if (pMap != NULL) if (pMap != NULL)
pMap->addArkPoint(point); pMap->addArkPoint(point);

@ -90,7 +90,7 @@ static const sint PARTY_CHAT_SPAWN_DELTA = 20; // to avoid that all party chat a
////////////////////////////////// //////////////////////////////////
/** Display an error msg in the system info window, and also in the last window that triggered the command (so that the user is sure to see it) /** Display an error msg in the system info window, and also in the last window that triggered the command (so that the user is sure to see it)
*/ */
static void displayVisibleSystemMsg(const ucstring &msg, const string &cat = "CHK"); static void displayVisibleSystemMsg(const ucstring &msg, const string &cat = "CHK");
@ -289,13 +289,13 @@ void CChatStdInput::registerListeningWindow(CChatWindow *cw)
//=========================================================================================================== //===========================================================================================================
CPeopleInterraction::CPeopleInterraction() : Region(NULL), CPeopleInterraction::CPeopleInterraction() : Region(NULL),
Universe(NULL), Universe(NULL),
TeamChat(NULL), TeamChat(NULL),
GuildChat(NULL), GuildChat(NULL),
SystemInfo(NULL), SystemInfo(NULL),
TellWindow(NULL), TellWindow(NULL),
DebugInfo(NULL), DebugInfo(NULL),
CurrPartyChatID(0) CurrPartyChatID(0)
{ {
for(uint i=0;i<CChatGroup::MaxDynChanPerPlayer;i++) for(uint i=0;i<CChatGroup::MaxDynChanPerPlayer;i++)
{ {
@ -311,6 +311,8 @@ void CPeopleInterraction::release()
ChatInput.Tell.removeListeningPeopleList(&TeamList); ChatInput.Tell.removeListeningPeopleList(&TeamList);
ChatInput.Team.removeListeningPeopleList(&TeamList); ChatInput.Team.removeListeningPeopleList(&TeamList);
FriendList.saveContactGroups();
CChatWindowManager &cwm = getChatWndMgr(); CChatWindowManager &cwm = getChatWndMgr();
AroundMe.release(); AroundMe.release();
@ -333,7 +335,7 @@ void CPeopleInterraction::release()
SystemInfo = NULL; SystemInfo = NULL;
TellWindow = NULL; TellWindow = NULL;
DebugInfo = NULL; DebugInfo = NULL;
// TellWindow = NULL; // TellWindow = NULL;
for(uint i=0;i<CChatGroup::MaxDynChanPerPlayer;i++) for(uint i=0;i<CChatGroup::MaxDynChanPerPlayer;i++)
{ {
@ -390,7 +392,7 @@ void CPeopleInterraction::removeAllPartyChat()
//=========================================================================================================== //===========================================================================================================
bool CPeopleInterraction::isUserChat(CChatWindow *cw) const bool CPeopleInterraction::isUserChat(CChatWindow *cw) const
{ {
// if (cw == MainChat.Window) return true; // if (cw == MainChat.Window) return true;
if (cw == ChatGroup.Window) return true; if (cw == ChatGroup.Window) return true;
for(uint k = 0; k < MaxNumUserChats; ++k) for(uint k = 0; k < MaxNumUserChats; ++k)
{ {
@ -432,8 +434,8 @@ void CPeopleInterraction::init()
void CPeopleInterraction::initAfterLoad() void CPeopleInterraction::initAfterLoad()
{ {
/* activate the USER chat per default. /* activate the USER chat per default.
Important: we must do it after ChatGroup.Window var init, DB color init etc... Important: we must do it after ChatGroup.Window var init, DB color init etc...
because the latest are used in chat_group_filter ActionHandler because the latest are used in chat_group_filter ActionHandler
*/ */
CChatGroupWindow *pCGW= PeopleInterraction.getChatGroupWindow(); CChatGroupWindow *pCGW= PeopleInterraction.getChatGroupWindow();
if(pCGW) if(pCGW)
@ -562,12 +564,12 @@ void CPeopleInterraction::createFriendList()
// //
FriendList.create(peopleListDesc); FriendList.create(peopleListDesc);
FriendList.setPeopleMenuEx("ui:interface:friend_list_menu_offline_unblocked", FriendList.setPeopleMenuEx("ui:interface:friend_list_menu_offline_unblocked",
"ui:interface:friend_list_menu_online_unblocked", "ui:interface:friend_list_menu_online_unblocked",
"ui:interface:friend_list_menu_online_abroad_unblocked", "ui:interface:friend_list_menu_online_abroad_unblocked",
"ui:interface:friend_list_menu_offline_blocked", "ui:interface:friend_list_menu_offline_blocked",
"ui:interface:friend_list_menu_online_blocked", "ui:interface:friend_list_menu_online_blocked",
"ui:interface:friend_list_menu_online_abroad_blocked" "ui:interface:friend_list_menu_online_abroad_blocked"
); );
FriendList.setMenu("ui:interface:sort_menu"); FriendList.setMenu("ui:interface:sort_menu");
} }
@ -703,21 +705,21 @@ void CPeopleInterraction::createUniverseWindow()
void CPeopleInterraction::createTellWindow() void CPeopleInterraction::createTellWindow()
{ {
/*CChatWindowDesc chatDesc; /*CChatWindowDesc chatDesc;
chatDesc.FatherContainer = "ui:interface"; chatDesc.FatherContainer = "ui:interface";
chatDesc.Title = "uiTellWindow"; chatDesc.Title = "uiTellWindow";
chatDesc.Listener = NULL; chatDesc.Listener = NULL;
chatDesc.Savable = true; chatDesc.Savable = true;
chatDesc.Localize = true; chatDesc.Localize = true;
chatDesc.Id = "tell"; chatDesc.Id = "tell";
chatDesc.ChatTemplate ="chat_no_eb_id"; chatDesc.ChatTemplate ="chat_no_eb_id";
chatDesc.AHOnActive = "set"; chatDesc.AHOnActive = "set";
chatDesc.AHOnActiveParams = "dblink=UI:SAVE:ISDETACHED:TELL|value=1"; chatDesc.AHOnActiveParams = "dblink=UI:SAVE:ISDETACHED:TELL|value=1";
chatDesc.AHOnDeactive = "set"; chatDesc.AHOnDeactive = "set";
chatDesc.AHOnDeactiveParams = "dblink=UI:SAVE:ISDETACHED:TELL|value=0"; chatDesc.AHOnDeactiveParams = "dblink=UI:SAVE:ISDETACHED:TELL|value=0";
TellWindow = getChatWndMgr().createChatWindow(chatDesc); TellWindow = getChatWndMgr().createChatWindow(chatDesc);
if (!TellWindow) return; if (!TellWindow) return;
TellWindow->setMenu("ui:interface:base_chat_box_menu"); */ TellWindow->setMenu("ui:interface:base_chat_box_menu"); */
} }
//=========================================================================================================== //===========================================================================================================
@ -826,13 +828,13 @@ class CHandlerUserChatActive : public IActionHandler
CChatGroup::TGroupType m = PeopleInterraction.TheUserChat.Filter.getTargetGroup(); CChatGroup::TGroupType m = PeopleInterraction.TheUserChat.Filter.getTargetGroup();
switch(m) switch(m)
{ {
default: default:
case CChatGroup::arround: case CChatGroup::arround:
case CChatGroup::say: pUserBut->setHardText("uiFilterAround"); break; case CChatGroup::say: pUserBut->setHardText("uiFilterAround"); break;
case CChatGroup::region: pUserBut->setHardText("uiFilterRegion"); break; case CChatGroup::region: pUserBut->setHardText("uiFilterRegion"); break;
case CChatGroup::universe: pUserBut->setHardText("uiFilterUniverse"); break; case CChatGroup::universe: pUserBut->setHardText("uiFilterUniverse"); break;
case CChatGroup::team: pUserBut->setHardText("uiFilterTeam"); break; case CChatGroup::team: pUserBut->setHardText("uiFilterTeam"); break;
case CChatGroup::guild: pUserBut->setHardText("uiFilterGuild"); break; case CChatGroup::guild: pUserBut->setHardText("uiFilterGuild"); break;
} }
pUserBut->getParent()->updateCoords(); pUserBut->getParent()->updateCoords();
pUserBut->updateCoords(); pUserBut->updateCoords();
@ -925,29 +927,29 @@ class CHandlerChatGroupFilter : public IActionHandler
CChatGroup::TGroupType m = PeopleInterraction.TheUserChat.Filter.getTargetGroup(); CChatGroup::TGroupType m = PeopleInterraction.TheUserChat.Filter.getTargetGroup();
switch(m) switch(m)
{ {
default: default:
case CChatGroup::arround: case CChatGroup::arround:
case CChatGroup::say: pUserBut->setHardText("uiFilterAround"); break; case CChatGroup::say: pUserBut->setHardText("uiFilterAround"); break;
case CChatGroup::region: pUserBut->setHardText("uiFilterRegion"); break; case CChatGroup::region: pUserBut->setHardText("uiFilterRegion"); break;
case CChatGroup::team: pUserBut->setHardText("uiFilterTeam"); break; case CChatGroup::team: pUserBut->setHardText("uiFilterTeam"); break;
case CChatGroup::guild: pUserBut->setHardText("uiFilterGuild"); break; case CChatGroup::guild: pUserBut->setHardText("uiFilterGuild"); break;
case CChatGroup::universe: pUserBut->setHardText("uiFilterUniverse"); break; case CChatGroup::universe: pUserBut->setHardText("uiFilterUniverse"); break;
case CChatGroup::dyn_chat: case CChatGroup::dyn_chat:
uint32 index = PeopleInterraction.TheUserChat.Filter.getTargetDynamicChannelDbIndex(); uint32 index = PeopleInterraction.TheUserChat.Filter.getTargetDynamicChannelDbIndex();
uint32 textId = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:DYN_CHAT:CHANNEL"+toString(index)+":NAME")->getValue32(); uint32 textId = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:DYN_CHAT:CHANNEL"+toString(index)+":NAME")->getValue32();
ucstring title; ucstring title;
STRING_MANAGER::CStringManagerClient::instance()->getDynString(textId, title); STRING_MANAGER::CStringManagerClient::instance()->getDynString(textId, title);
if (title.empty()) if (title.empty())
{ {
// Dyn channel not available yet, so set to around // Dyn channel not available yet, so set to around
PeopleInterraction.TheUserChat.Filter.setTargetGroup(CChatGroup::arround); PeopleInterraction.TheUserChat.Filter.setTargetGroup(CChatGroup::arround);
pUserBut->setHardText("uiFilterAround"); pUserBut->setHardText("uiFilterAround");
} }
else else
{ {
pUserBut->setHardText(title.toUtf8()); pUserBut->setHardText(title.toUtf8());
} }
break; break;
} }
pUserBut->setActive(true); pUserBut->setActive(true);
@ -1252,8 +1254,8 @@ void CPeopleInterraction::askRemoveContact(uint peopleIndex, CPeopleList *pl)
//================================================================================================================= //=================================================================================================================
void CPeopleInterraction::initContactLists( const std::vector<uint32> &vFriendListName, void CPeopleInterraction::initContactLists( const std::vector<uint32> &vFriendListName,
const std::vector<TCharConnectionState> &vFriendListOnline, const std::vector<TCharConnectionState> &vFriendListOnline,
const std::vector<ucstring> &vIgnoreListName ) const std::vector<ucstring> &vIgnoreListName )
{ {
// clear the current lists if any // clear the current lists if any
@ -1266,6 +1268,9 @@ void CPeopleInterraction::initContactLists( const std::vector<uint32> &vFriendLi
addContactInList(contactIdPool++, vFriendListName[i], vFriendListOnline[i], 0); addContactInList(contactIdPool++, vFriendListName[i], vFriendListOnline[i], 0);
for (uint i = 0; i < vIgnoreListName.size(); ++i) for (uint i = 0; i < vIgnoreListName.size(); ++i)
addContactInList(contactIdPool++, vIgnoreListName[i], ccs_offline, 1); addContactInList(contactIdPool++, vIgnoreListName[i], ccs_offline, 1);
FriendList.readContactGroups();
CPeopleList::TSortOrder order = (CPeopleList::TSortOrder)(NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:CONTACT_LIST:SORT_ORDER")->getValue32());
FriendList.sortEx(order);
updateAllFreeTellerHeaders(); updateAllFreeTellerHeaders();
} }
@ -1278,6 +1283,8 @@ void CPeopleInterraction::addContactInList(uint32 contactId, const ucstring &nam
// remove the shard name if possible // remove the shard name if possible
ucstring name= CEntityCL::removeShardFromName(nameIn); ucstring name= CEntityCL::removeShardFromName(nameIn);
// add the contact to this list // add the contact to this list
sint index = pl.getIndexFromName(name); sint index = pl.getIndexFromName(name);
// try to create if not found // try to create if not found
@ -1477,7 +1484,7 @@ bool CPeopleInterraction::testValidPartyChatName(const ucstring &title)
index = IgnoreList.getIndexFromName(title); index = IgnoreList.getIndexFromName(title);
if (index != -1) return false; if (index != -1) return false;
// TODO_GAMEDEV server test for the name (not only local), & modify callers of this function // TODO_GAMEDEV server test for the name (not only local), & modify callers of this function
// The party chat should NOT have the name of a player // The party chat should NOT have the name of a player
// A player name is NOT valid if it is the same that a party chat name // A player name is NOT valid if it is the same that a party chat name
return true; return true;
} }
@ -1547,14 +1554,14 @@ bool CPeopleInterraction::createNewPartyChat(const ucstring &title)
{ {
// popup the container // popup the container
/* /*
newPartyChat->getContainer()->setup(); newPartyChat->getContainer()->setup();
newPartyChat->getContainer()->setOpen(true); newPartyChat->getContainer()->setOpen(true);
newPartyChat->getContainer()->popupCurrentPos(); newPartyChat->getContainer()->popupCurrentPos();
newPartyChat->getContainer()->updateCoords(); newPartyChat->getContainer()->updateCoords();
newPartyChat->getContainer()->center(); newPartyChat->getContainer()->center();
newPartyChat->getContainer()->setX(newPartyChat->getContainer()->getX() + (sint32) (rand() % PARTY_CHAT_SPAWN_DELTA)); newPartyChat->getContainer()->setX(newPartyChat->getContainer()->getX() + (sint32) (rand() % PARTY_CHAT_SPAWN_DELTA));
newPartyChat->getContainer()->setY(newPartyChat->getContainer()->getY() + (sint32) (rand() % PARTY_CHAT_SPAWN_DELTA)); newPartyChat->getContainer()->setY(newPartyChat->getContainer()->getY() + (sint32) (rand() % PARTY_CHAT_SPAWN_DELTA));
newPartyChat->getContainer()->enableBlink(2); newPartyChat->getContainer()->enableBlink(2);
*/ */
CPartyChatInfo pci; CPartyChatInfo pci;
@ -1742,15 +1749,15 @@ bool CPeopleInterraction::loadUserChatsInfos(NLMISC::IStream &f)
f.serialCheck(NELID("TAHC")); f.serialCheck(NELID("TAHC"));
if (ver>=1) if (ver>=1)
{ {
// CChatGroupWindow *pCGW = PeopleInterraction.getChatGroupWindow(); // CChatGroupWindow *pCGW = PeopleInterraction.getChatGroupWindow();
sint32 index; sint32 index;
f.serial(index); f.serial(index);
/* Yoyo: decide to always start with the default channel (user) activated /* Yoyo: decide to always start with the default channel (user) activated
because complex (at this time, the buttons are not all active, must wait guild loading, UI:SAVE loading etc...) because complex (at this time, the buttons are not all active, must wait guild loading, UI:SAVE loading etc...)
Hence this doesn't work for anything but User and Sysinfo (if it is activated....) Hence this doesn't work for anything but User and Sysinfo (if it is activated....)
NB: must still load the index for file format reason NB: must still load the index for file format reason
//if (pCGW) pCGW->setTabIndex(index); //if (pCGW) pCGW->setTabIndex(index);
*/ */
f.serial(present); f.serial(present);
if (present) if (present)
{ {
@ -2012,17 +2019,17 @@ public:
if (list == &PeopleInterraction.TeamList) // check for good list if (list == &PeopleInterraction.TeamList) // check for good list
{ {
/* /*
const string msgName = "TEAM:SET_LEADER"; const string msgName = "TEAM:SET_LEADER";
CBitMemStream out; CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) if(GenericMsgHeaderMngr.pushNameToStream(msgName, out))
{ {
uint8 teamMember = (uint8)(peopleIndex); uint8 teamMember = (uint8)(peopleIndex);
out.serial(teamMember); out.serial(teamMember);
NetMngr.push(out); NetMngr.push(out);
//nlinfo("impulseCallBack : %s %d sent", msgName.c_str(), teamMember); //nlinfo("impulseCallBack : %s %d sent", msgName.c_str(), teamMember);
} }
else else
nlwarning("command 'set_leader': unknown message named '%s'.", msgName.c_str()); nlwarning("command 'set_leader': unknown message named '%s'.", msgName.c_str());
*/ */
NLMISC::ICommand::execute("a setTeamLeader " + toString(peopleIndex), g_log); NLMISC::ICommand::execute("a setTeamLeader " + toString(peopleIndex), g_log);
} }
@ -2177,8 +2184,8 @@ public:
void execute (CCtrlBase *pCaller, const std::string &sParams) void execute (CCtrlBase *pCaller, const std::string &sParams)
{ {
/** This msg may have been triggered from valid button or from the edit box itself, so retrieve /** This msg may have been triggered from valid button or from the edit box itself, so retrieve
* the edit box from the enclosing group * the edit box from the enclosing group
*/ */
// Get enclosing container to know in which people list we are // Get enclosing container to know in which people list we are
if (pCaller) if (pCaller)
{ {
@ -2221,8 +2228,8 @@ public:
CInterfaceManager *pIM = CInterfaceManager::getInstance(); CInterfaceManager *pIM = CInterfaceManager::getInstance();
/** This msg may have been triggered from valid button or from the edit box itself, so retrieve /** This msg may have been triggered from valid button or from the edit box itself, so retrieve
* the edit box from the enclosing group * the edit box from the enclosing group
*/ */
// Get enclosing container to know in which people list we are // Get enclosing container to know in which people list we are
if (!LastFatherAddContactId.empty() && pCaller) if (!LastFatherAddContactId.empty() && pCaller)
{ {
@ -2292,13 +2299,13 @@ public:
} }
switch(listIndex) switch(listIndex)
{ {
case 0: case 0:
destList = &PeopleInterraction.IgnoreList; destList = &PeopleInterraction.IgnoreList;
break; break;
case 1: case 1:
destList = &PeopleInterraction.FriendList; destList = &PeopleInterraction.FriendList;
break; break;
default: nlwarning("Bad list index"); return; default: nlwarning("Bad list index"); return;
} }
PeopleInterraction.askMoveContact(peopleIndex, srcList, destList); PeopleInterraction.askMoveContact(peopleIndex, srcList, destList);
@ -2307,6 +2314,56 @@ public:
}; };
REGISTER_ACTION_HANDLER( CHandlerMoveContact, "move_contact"); REGISTER_ACTION_HANDLER( CHandlerMoveContact, "move_contact");
uint lastPeopleIndexChangeGroup;
//=================================================================================================================
class CHandlerChangeContactGroupBegin : public IActionHandler
{
public:
void execute (CCtrlBase * pCaller, const std::string &sParams)
{
// retrieve the index of the people
CPeopleList *srcList;
if (PeopleInterraction.getPeopleFromCurrentMenu(srcList, lastPeopleIndexChangeGroup))
{
string groupName= getParam(sParams, "group");
CInterfaceGroup *gc = dynamic_cast<CInterfaceGroup *>(CWidgetManager::getInstance()->getElementFromId(groupName));
if (gc)
{
CGroupEditBox *geb = dynamic_cast<CGroupEditBox *>(gc->getGroup("change_contact_group_eb:eb"));
geb->setInputString(ucstring(""));
}
CAHManager::getInstance()->runActionHandler("enter_modal", pCaller, sParams);
}
}
};
REGISTER_ACTION_HANDLER( CHandlerChangeContactGroupBegin, "change_contact_group_begin");
//=================================================================================================================
// Change the group of a contact in the list
class CHandlerChangeContactGroup : public IActionHandler
{
public:
void execute (CCtrlBase *pCaller, const std::string &/* sParams */)
{
CInterfaceManager *pIM = CInterfaceManager::getInstance();
if (pCaller)
{
// Get the modal edit box
CGroupEditBox *geb = dynamic_cast<CGroupEditBox *>(CWidgetManager::getInstance()->getElementFromId("ui:interface:change_contact_group:change_contact_group_eb:eb"));
if (geb)
{
PeopleInterraction.FriendList.changeGroup(lastPeopleIndexChangeGroup, geb->getInputString());
geb->setInputString(ucstring(""));
CPeopleList::TSortOrder order = (CPeopleList::TSortOrder)(NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:CONTACT_LIST:SORT_ORDER")->getValue32());
PeopleInterraction.FriendList.sortEx(order);
}
}
CAHManager::getInstance()->runActionHandler("leave_modal", pCaller, "");
}
};
REGISTER_ACTION_HANDLER( CHandlerChangeContactGroup, "change_contact_group");
//================================================================================================================= //=================================================================================================================
class CHandlerSortContacts : public IActionHandler class CHandlerSortContacts : public IActionHandler
@ -2372,7 +2429,7 @@ REGISTER_ACTION_HANDLER( CHandlerContactDirectChat, "contact_direct_chat");
//================================================================================================================= //=================================================================================================================
/** Menu to create a new party chat /** Menu to create a new party chat
*/ */
class CHandlerNewPartyChat : public IActionHandler class CHandlerNewPartyChat : public IActionHandler
{ {
public: public:
@ -2406,7 +2463,7 @@ REGISTER_ACTION_HANDLER( CHandlerNewPartyChat, "new_party_chat");
//================================================================================================================= //=================================================================================================================
/** The name of a party chat has been validated /** The name of a party chat has been validated
*/ */
class CHandlerValidatePartyChatName : public IActionHandler class CHandlerValidatePartyChatName : public IActionHandler
{ {
void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */) void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */)
@ -2439,12 +2496,12 @@ REGISTER_ACTION_HANDLER(CHandlerValidatePartyChatName, "validate_party_chat_name
//================================================================================================================= //=================================================================================================================
/** Menu to create a new party chat /** Menu to create a new party chat
*/ */
//================================================================================================================= //=================================================================================================================
/** Menu to remove a currenlty created party chat /** Menu to remove a currenlty created party chat
*/ */
class CHandlerRemovePartyChat : public IActionHandler class CHandlerRemovePartyChat : public IActionHandler
{ {
void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */) void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */)
@ -2457,7 +2514,7 @@ REGISTER_ACTION_HANDLER( CHandlerRemovePartyChat, "remove_party_chat");
//================================================================================================================= //=================================================================================================================
/** TEMP : just create an 'invite' command in the 'around me' edit box /** TEMP : just create an 'invite' command in the 'around me' edit box
*/ */
class CHandlerPartyChatInvite : public IActionHandler class CHandlerPartyChatInvite : public IActionHandler
{ {
void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */) void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */)
@ -2483,12 +2540,12 @@ REGISTER_ACTION_HANDLER( CHandlerPartyChatInvite, "party_chat_invite" );
//================================================================================================================= //=================================================================================================================
/** Add all members of the team to the party chat /** Add all members of the team to the party chat
*/ */
class CHandlerAddAllTeamMembersToPartyChat : public IActionHandler class CHandlerAddAllTeamMembersToPartyChat : public IActionHandler
{ {
void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */) void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */)
{ {
// CChatWindow *chat = getChatWndMgr().getChatWindowFromCaller(CWidgetManager::getInstance()->getCtrlLaunchingModal()); // CChatWindow *chat = getChatWndMgr().getChatWindowFromCaller(CWidgetManager::getInstance()->getCtrlLaunchingModal());
// TODO GAMEDEV : add all team members // TODO GAMEDEV : add all team members
} }
}; };
@ -2496,12 +2553,12 @@ REGISTER_ACTION_HANDLER( CHandlerAddAllTeamMembersToPartyChat, "add_all_team_mem
//================================================================================================================= //=================================================================================================================
/** Remove all members of the team to the party chat /** Remove all members of the team to the party chat
*/ */
class CHandlerRemoveAllTeamMembersToPartyChat : public IActionHandler class CHandlerRemoveAllTeamMembersToPartyChat : public IActionHandler
{ {
void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */) void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */)
{ {
// CChatWindow *chat = getChatWndMgr().getChatWindowFromCaller(CWidgetManager::getInstance()->getCtrlLaunchingModal()); // CChatWindow *chat = getChatWndMgr().getChatWindowFromCaller(CWidgetManager::getInstance()->getCtrlLaunchingModal());
// TODO GAMEDEV : remove all team members // TODO GAMEDEV : remove all team members
} }
}; };
@ -2509,12 +2566,12 @@ REGISTER_ACTION_HANDLER( CHandlerRemoveAllTeamMembersToPartyChat, "remove_all_te
//================================================================================================================= //=================================================================================================================
/** Add all members of the guild to the party chat /** Add all members of the guild to the party chat
*/ */
class CHandlerAddAllGuildMembersToPartyChat : public IActionHandler class CHandlerAddAllGuildMembersToPartyChat : public IActionHandler
{ {
void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */) void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */)
{ {
// CChatWindow *chat = getChatWndMgr().getChatWindowFromCaller(CWidgetManager::getInstance()->getCtrlLaunchingModal()); // CChatWindow *chat = getChatWndMgr().getChatWindowFromCaller(CWidgetManager::getInstance()->getCtrlLaunchingModal());
// TODO GAMEDEV : add all guild members // TODO GAMEDEV : add all guild members
} }
}; };
@ -2522,12 +2579,12 @@ REGISTER_ACTION_HANDLER( CHandlerAddAllGuildMembersToPartyChat, "add_all_guild_m
//================================================================================================================= //=================================================================================================================
/** Remove all members of the team to the party chat /** Remove all members of the team to the party chat
*/ */
class CHandlerRemoveAllGuildMembersToPartyChat : public IActionHandler class CHandlerRemoveAllGuildMembersToPartyChat : public IActionHandler
{ {
void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */) void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */)
{ {
// CChatWindow *chat = getChatWndMgr().getChatWindowFromCaller(CWidgetManager::getInstance()->getCtrlLaunchingModal()); // CChatWindow *chat = getChatWndMgr().getChatWindowFromCaller(CWidgetManager::getInstance()->getCtrlLaunchingModal());
// TODO_GAMEDEV : remove all guild members // TODO_GAMEDEV : remove all guild members
} }
}; };
@ -2539,8 +2596,8 @@ REGISTER_ACTION_HANDLER( CHandlerRemoveAllGuildMembersToPartyChat, "remove_all_g
//================================================================================================================= //=================================================================================================================
/** Select the target on a filtered chat window /** Select the target on a filtered chat window
* This create a menu with the standard window (team, around me ...) + the party chat windows * This create a menu with the standard window (team, around me ...) + the party chat windows
*/ */
class CHandlerSelectChatTarget : public IActionHandler class CHandlerSelectChatTarget : public IActionHandler
{ {
public: public:
@ -2603,7 +2660,7 @@ public:
{ {
CInterfaceManager *pIM = CInterfaceManager::getInstance(); CInterfaceManager *pIM = CInterfaceManager::getInstance();
cw = PeopleInterraction.TheUserChat.Window; cw = PeopleInterraction.TheUserChat.Window;
// CChatStdInput &ci = PeopleInterraction.ChatInput; // CChatStdInput &ci = PeopleInterraction.ChatInput;
CGroupMenu *pMenu = dynamic_cast<CGroupMenu*>(CWidgetManager::getInstance()->getElementFromId("ui:interface:user_chat_target_menu")); CGroupMenu *pMenu = dynamic_cast<CGroupMenu*>(CWidgetManager::getInstance()->getElementFromId("ui:interface:user_chat_target_menu"));
CViewTextMenu *pMenuAround = dynamic_cast<CViewTextMenu*>(pMenu->getElement("ui:interface:user_chat_target_menu:around")); CViewTextMenu *pMenuAround = dynamic_cast<CViewTextMenu*>(pMenu->getElement("ui:interface:user_chat_target_menu:around"));
CViewTextMenu *pMenuRegion = dynamic_cast<CViewTextMenu*>(pMenu->getElement("ui:interface:user_chat_target_menu:region")); CViewTextMenu *pMenuRegion = dynamic_cast<CViewTextMenu*>(pMenu->getElement("ui:interface:user_chat_target_menu:region"));
@ -2659,7 +2716,7 @@ REGISTER_ACTION_HANDLER( CHandlerSelectChatTarget, "select_chat_target");
//================================================================================================================= //=================================================================================================================
/** A target has been selected for a filtered chat /** A target has been selected for a filtered chat
*/ */
class CHandlerChatTargetSelected : public IActionHandler class CHandlerChatTargetSelected : public IActionHandler
{ {
void execute (CCtrlBase * /* pCaller */, const std::string &sParams) void execute (CCtrlBase * /* pCaller */, const std::string &sParams)
@ -2748,7 +2805,7 @@ REGISTER_ACTION_HANDLER( CHandlerChatTargetSelected, "chat_target_selected");
//================================================================================================================= //=================================================================================================================
/** If no more in team, leave team chat mode /** If no more in team, leave team chat mode
*/ */
class CHandlerLeaveTeamChat : public IActionHandler class CHandlerLeaveTeamChat : public IActionHandler
{ {
void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */) void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */)
@ -2773,7 +2830,7 @@ REGISTER_ACTION_HANDLER( CHandlerLeaveTeamChat, "leave_team_chat");
/** Create checkbox for a menu. /** Create checkbox for a menu.
*/ */
static CInterfaceGroup *createMenuCheckBox(const std::string &onclickL, const std::string &paramsL, bool checked) static CInterfaceGroup *createMenuCheckBox(const std::string &onclickL, const std::string &paramsL, bool checked)
{ {
pair<string, string> params [2]; pair<string, string> params [2];
@ -2795,7 +2852,7 @@ static CInterfaceGroup *createMenuCheckBox(const std::string &onclickL, const st
//================================================================================================================= //=================================================================================================================
/** Display a menu to select the source on a filtered chat /** Display a menu to select the source on a filtered chat
*/ */
class CHandlerSelectChatSource : public IActionHandler class CHandlerSelectChatSource : public IActionHandler
{ {
void execute (CCtrlBase *pCaller, const std::string &/* sParams */) void execute (CCtrlBase *pCaller, const std::string &/* sParams */)
@ -2977,7 +3034,7 @@ REGISTER_ACTION_HANDLER(CHandlerSelectChatSource, "select_chat_source");
//================================================================================================================= //=================================================================================================================
/** A new source has been selected / unselected from a filtered chat /** A new source has been selected / unselected from a filtered chat
*/ */
class CHandlerChatSourceSelected : public IActionHandler class CHandlerChatSourceSelected : public IActionHandler
{ {
void execute (CCtrlBase * /* pCaller */, const std::string &sParams) void execute (CCtrlBase * /* pCaller */, const std::string &sParams)
@ -3001,10 +3058,10 @@ class CHandlerChatSourceSelected : public IActionHandler
/*CCtrlBaseButton *button = dynamic_cast<CCtrlBaseButton *>(pCaller); /*CCtrlBaseButton *button = dynamic_cast<CCtrlBaseButton *>(pCaller);
if (button) if (button)
{ {
button->setPushed(!button->getPushed()); button->setPushed(!button->getPushed());
}*/ }*/
// GUILD // GUILD
if (nlstricmp(sParams, "guild") == 0) if (nlstricmp(sParams, "guild") == 0)
{ {
@ -3012,71 +3069,71 @@ class CHandlerChatSourceSelected : public IActionHandler
else ci.Guild.addListeningWindow(cw); else ci.Guild.addListeningWindow(cw);
} }
else else
// TEAM // TEAM
if (nlstricmp(sParams, "team") == 0) if (nlstricmp(sParams, "team") == 0)
{
if (ci.Team.isListeningWindow(cw)) ci.Team.removeListeningWindow(cw);
else ci.Team.addListeningWindow(cw);
}
else
// AROUND ME
if (nlstricmp(sParams, "am") == 0)
{
if (ci.AroundMe.isListeningWindow(cw)) ci.AroundMe.removeListeningWindow(cw);
else ci.AroundMe.addListeningWindow(cw);
}
else
// REGION
if (nlstricmp(sParams, "region") == 0)
{
if (ci.Region.isListeningWindow(cw)) ci.Region.removeListeningWindow(cw);
else ci.Region.addListeningWindow(cw);
}
else
// UNIVERSE
if (nlstricmp(sParams, "universe") == 0)
{
if (ci.Universe.isListeningWindow(cw)) ci.Universe.removeListeningWindow(cw);
else ci.Universe.addListeningWindow(cw);
}
else
// TELL
if (nlstricmp(sParams, "tell") == 0)
{
if (ci.Tell.isListeningWindow(cw)) ci.Tell.removeListeningWindow(cw);
else ci.Tell.addListeningWindow(cw);
}
else
// SYSTEM INFOS
if (nlstricmp(sParams, "si") == 0)
{
if (ci.SystemInfo.isListeningWindow(cw)) ci.SystemInfo.removeListeningWindow(cw);
else ci.SystemInfo.addListeningWindow(cw);
}
else
// PARTY CHAT
if (fromString(sParams, partyChatID))
{
std::vector<CPartyChatInfo> &partyChats = PeopleInterraction.PartyChats;
for(uint k = 0; k < partyChats.size(); ++k)
{ {
if (partyChats[k].ID == (uint) partyChatID) if (ci.Team.isListeningWindow(cw)) ci.Team.removeListeningWindow(cw);
else ci.Team.addListeningWindow(cw);
}
else
// AROUND ME
if (nlstricmp(sParams, "am") == 0)
{ {
if (partyChats[k].Filter != NULL) if (ci.AroundMe.isListeningWindow(cw)) ci.AroundMe.removeListeningWindow(cw);
else ci.AroundMe.addListeningWindow(cw);
}
else
// REGION
if (nlstricmp(sParams, "region") == 0)
{ {
if (partyChats[k].Filter->isListeningWindow(cw)) partyChats[k].Filter->removeListeningWindow(partyChats[k].Window); if (ci.Region.isListeningWindow(cw)) ci.Region.removeListeningWindow(cw);
else partyChats[k].Filter->addListeningWindow(cw); else ci.Region.addListeningWindow(cw);
} }
} else
} // UNIVERSE
} if (nlstricmp(sParams, "universe") == 0)
else if (nlstricmp(sParams.substr(0, 3), "dyn") == 0) {
{ if (ci.Universe.isListeningWindow(cw)) ci.Universe.removeListeningWindow(cw);
uint8 i = 0; else ci.Universe.addListeningWindow(cw);
fromString(sParams.substr(3), i); }
if (ci.DynamicChat[i].isListeningWindow(cw)) ci.DynamicChat[i].removeListeningWindow(cw); else
else ci.DynamicChat[i].addListeningWindow(cw); // TELL
} if (nlstricmp(sParams, "tell") == 0)
{
if (ci.Tell.isListeningWindow(cw)) ci.Tell.removeListeningWindow(cw);
else ci.Tell.addListeningWindow(cw);
}
else
// SYSTEM INFOS
if (nlstricmp(sParams, "si") == 0)
{
if (ci.SystemInfo.isListeningWindow(cw)) ci.SystemInfo.removeListeningWindow(cw);
else ci.SystemInfo.addListeningWindow(cw);
}
else
// PARTY CHAT
if (fromString(sParams, partyChatID))
{
std::vector<CPartyChatInfo> &partyChats = PeopleInterraction.PartyChats;
for(uint k = 0; k < partyChats.size(); ++k)
{
if (partyChats[k].ID == (uint) partyChatID)
{
if (partyChats[k].Filter != NULL)
{
if (partyChats[k].Filter->isListeningWindow(cw)) partyChats[k].Filter->removeListeningWindow(partyChats[k].Window);
else partyChats[k].Filter->addListeningWindow(cw);
}
}
}
}
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");
@ -3186,80 +3243,80 @@ NLMISC_COMMAND(ignore, "add or remove a player from the ignore list", "<player n
} // ignore // } // ignore //
/* /*
**** ****
Yoyo: Party chat is not ended: DON'T LET THOSE COMMANDS AVAILABLE! Yoyo: Party chat is not ended: DON'T LET THOSE COMMANDS AVAILABLE!
they made the client crash (cf createNewPartyChat)... they made the client crash (cf createNewPartyChat)...
**** ****
// create a new party chat with the given name // create a new party chat with the given name
NLMISC_COMMAND(party_chat, "Create a new party chat", "<party_chat_name>") NLMISC_COMMAND(party_chat, "Create a new party chat", "<party_chat_name>")
{ {
if (args.size() != 1) if (args.size() != 1)
{ {
displayVisibleSystemMsg(CI18N::get("uiPartyChatCmd")); displayVisibleSystemMsg(CI18N::get("uiPartyChatCmd"));
return true; return true;
} }
CPeopleInterraction &pi = PeopleInterraction; CPeopleInterraction &pi = PeopleInterraction;
ucstring title = args[0]; ucstring title = args[0];
if (!pi.testValidPartyChatName(title)) if (!pi.testValidPartyChatName(title))
{ {
displayVisibleSystemMsg(CI18N::get("uiInvalidPartyChatName")); displayVisibleSystemMsg(CI18N::get("uiInvalidPartyChatName"));
return true; return true;
} }
PeopleInterraction.createNewPartyChat(title); PeopleInterraction.createNewPartyChat(title);
return true; return true;
} }
// Remove the party chat with the given name // Remove the party chat with the given name
NLMISC_COMMAND(remove_party_chat, "Remove a party chat", "<party_chat_name>") NLMISC_COMMAND(remove_party_chat, "Remove a party chat", "<party_chat_name>")
{ {
if (args.size() != 1) if (args.size() != 1)
{ {
displayVisibleSystemMsg(CI18N::get("uiRemovePartyChatCmd")); displayVisibleSystemMsg(CI18N::get("uiRemovePartyChatCmd"));
return true; return true;
} }
ucstring title = ucstring(args[0]); ucstring title = ucstring(args[0]);
CChatWindow *chat = getChatWndMgr().getChatWindow(title); CChatWindow *chat = getChatWndMgr().getChatWindow(title);
if (!chat) if (!chat)
{ {
displayVisibleSystemMsg(title + ucstring(" : ") + CI18N::get("uiBadPartyChatName")); displayVisibleSystemMsg(title + ucstring(" : ") + CI18N::get("uiBadPartyChatName"));
return true; return true;
} }
if (!PeopleInterraction.removePartyChat(chat)) if (!PeopleInterraction.removePartyChat(chat))
{ {
displayVisibleSystemMsg(title + ucstring(" : ") + CI18N::get("uiCantRemovePartyChat")); displayVisibleSystemMsg(title + ucstring(" : ") + CI18N::get("uiCantRemovePartyChat"));
return true; return true;
} }
return true; return true;
} }
// Join a party chat whose name is known // Join a party chat whose name is known
NLMISC_COMMAND(add_to_party_chat, "Join the given party chat", "<party_chat_name>") NLMISC_COMMAND(add_to_party_chat, "Join the given party chat", "<party_chat_name>")
{ {
if (args.size() != 1) if (args.size() != 1)
{ {
displayVisibleSystemMsg(CI18N::get("uiAddPartyChatCmd")); displayVisibleSystemMsg(CI18N::get("uiAddPartyChatCmd"));
return true; return true;
} }
// TODO GAMEDEV : join the party chat // TODO GAMEDEV : join the party chat
return true; return true;
} }
// Invite someone in a party chat // Invite someone in a party chat
NLMISC_COMMAND(invite, "Invite someone to a party chat", "<people_name> <party_chat_name>") NLMISC_COMMAND(invite, "Invite someone to a party chat", "<people_name> <party_chat_name>")
{ {
if (args.size() != 2) if (args.size() != 2)
{ {
displayVisibleSystemMsg(CI18N::get("uiInviteCmd")); displayVisibleSystemMsg(CI18N::get("uiInviteCmd"));
return true; return true;
} }
// TODO GAMEDEV : Send invite message to the server // TODO GAMEDEV : Send invite message to the server
// Check that the inviter has created the chat ? // Check that the inviter has created the chat ?
// The people being invited should receive a popup to announce that he is being invited // The people being invited should receive a popup to announce that he is being invited
return true; return true;
} }
*/ */

@ -31,6 +31,7 @@
#include "chat_text_manager.h" #include "chat_text_manager.h"
#include "people_interraction.h" #include "people_interraction.h"
#include "../user_entity.h" #include "../user_entity.h"
#include "nel/misc/o_xml.h"
using namespace std; using namespace std;
using namespace NLMISC; using namespace NLMISC;
@ -49,9 +50,9 @@ extern CClientChatManager ChatMngr;
//================================================================== //==================================================================
CPeopleList::CPeopleList() : _ChatWindow(NULL), CPeopleList::CPeopleList() : _ChatWindow(NULL),
_ContactType(CPeopleListDesc::Unknown), _ContactType(CPeopleListDesc::Unknown),
_CurrPeopleID(0), _CurrPeopleID(0),
_Savable(false) _Savable(false)
{ {
// Construct // Construct
@ -191,34 +192,41 @@ sint CPeopleList::getIndexFromContainerID(const std::string &id) const
//================================================================== //==================================================================
bool CPeopleList::sortExByContactId(const CPeople& a, const CPeople& b) bool CPeopleList::sortExByContactId(const CPeople& a, const CPeople& b)
{ {
return (a.ContactId < b.ContactId); if (a.Group == b.Group)
return (a.ContactId < b.ContactId);
else
return (a.Group < b.Group);
} }
//================================================================== //==================================================================
bool CPeopleList::sortExByName(const CPeople& a, const CPeople& b) bool CPeopleList::sortExByName(const CPeople& a, const CPeople& b)
{ {
ucstring name_a = toUpper(a.getName()); if (a.Group == b.Group) {
ucstring name_b = toUpper(b.getName()); ucstring name_a = toUpper(a.getName());
ucstring name_b = toUpper(b.getName());
return (name_a < name_b); return (name_a < name_b);
}
else
return (a.Group < b.Group);
} }
//================================================================== //==================================================================
bool CPeopleList::sortExByOnline(const CPeople& a, const CPeople& b) bool CPeopleList::sortExByOnline(const CPeople& a, const CPeople& b)
{ {
ucstring name_a = toUpper(a.getName()); if (a.Group == b.Group) {
ucstring name_b = toUpper(b.getName()); ucstring name_a = toUpper(a.getName());
ucstring name_b = toUpper(b.getName());
// We want order: online/alpha, offworld/alpha, offline/alpha // We want order: online/alpha, offworld/alpha, offline/alpha
if (a.Online == b.Online) if (a.Online == b.Online)
{
return (name_a < name_b);
}
else
{
// Compare online status
switch (a.Online)
{ {
return (name_a < name_b);
}
else
{
// Compare online status
switch (a.Online)
{
case ccs_online: case ccs_online:
// a is > if a is online // a is > if a is online
return true; return true;
@ -232,11 +240,11 @@ bool CPeopleList::sortExByOnline(const CPeople& a, const CPeople& b)
// b is always > if a is offline // b is always > if a is offline
return false; return false;
break; break;
}
} }
} }
else
// Should not get here so just return something return (a.Group < b.Group);
return true;
} }
//================================================================== //==================================================================
@ -245,29 +253,54 @@ void CPeopleList::sortEx(TSortOrder order)
// remove all people from the father container // remove all people from the father container
if (!_BaseContainer) return; if (!_BaseContainer) return;
uint k; uint k;
for(k = 0; k < _Peoples.size(); ++k) for(k = 0; k < _Peoples.size(); ++k)
{ {
_BaseContainer->detachContainer(_Peoples[k].Container); CGroupContainer *parentContainer = _Peoples[k].Container->getProprietaryContainer();
parentContainer->detachContainer(_Peoples[k].Container);
}
for (k = 0; k < _GroupContainers.size(); ++k)
{
if (_GroupContainers[k].second->getProprietaryContainer() != NULL)
_BaseContainer->detachContainer(_GroupContainers[k].second);
} }
switch (order) switch (order)
{ {
default: default:
case sort_index: case sort_index:
std::sort(_Peoples.begin(), _Peoples.end(), CPeopleList::sortExByContactId); std::sort(_Peoples.begin(), _Peoples.end(), CPeopleList::sortExByContactId);
break; break;
case sort_name: case sort_name:
std::sort(_Peoples.begin(), _Peoples.end(), CPeopleList::sortExByName); std::sort(_Peoples.begin(), _Peoples.end(), CPeopleList::sortExByName);
break; break;
case sort_online: case sort_online:
std::sort(_Peoples.begin(), _Peoples.end(), CPeopleList::sortExByOnline); std::sort(_Peoples.begin(), _Peoples.end(), CPeopleList::sortExByOnline);
break; break;
} }
CGroupContainer *group = _BaseContainer;
uint groupIndex = 0;
for(k = 0; k < _Peoples.size(); ++k) for(k = 0; k < _Peoples.size(); ++k)
{ {
_BaseContainer->attachContainer(_Peoples[k].Container); bool newGroup = false;
if (k == 0)
{
newGroup = true;
}
while (groupIndex < _GroupContainers.size() && _GroupContainers[groupIndex].first != _Peoples[k].Group.toString())
{
newGroup = true;
++groupIndex;
}
if (newGroup && groupIndex < _GroupContainers.size() && _GroupContainers.size() > 1)
{
group = _GroupContainers[groupIndex].second;
_BaseContainer->attachContainer(group);
}
group->attachContainer(_Peoples[k].Container);
} }
} }
@ -299,34 +332,34 @@ bool CPeopleList::isPeopleChatVisible(uint index) const
return (_Peoples[index].Chat != NULL); return (_Peoples[index].Chat != NULL);
} }
/* /*
bool CPeopleList::isPeopleWindowVisible(uint index) const bool CPeopleList::isPeopleWindowVisible(uint index) const
{ {
if (index >= _Peoples.size()) if (index >= _Peoples.size())
{ {
nlwarning("Bad index"); nlwarning("Bad index");
return false; return false;
} }
if (!_Peoples[index].Container) return false; if (!_Peoples[index].Container) return false;
if (_Peoples[index].Container->isOpen()) if (_Peoples[index].Container->isOpen())
{ {
CInterfaceGroup *ig = _Peoples[index].Container; CInterfaceGroup *ig = _Peoples[index].Container;
do do
{ {
if (ig->isGroupContainer()) if (ig->isGroupContainer())
{ {
if (!static_cast<CGroupContainer *>(ig)->isOpen()) break; if (!static_cast<CGroupContainer *>(ig)->isOpen()) break;
} }
if (!ig->getActive()) break; if (!ig->getActive()) break;
ig = ig->getParent(); ig = ig->getParent();
} }
while(ig); while(ig);
return ig == NULL; // all parent windows must be open & visible return ig == NULL; // all parent windows must be open & visible
} }
else else
{ {
return false; return false;
} }
} }
*/ */
//================================================================== //==================================================================
@ -354,12 +387,12 @@ sint CPeopleList::addPeople(const ucstring &name, uint teamMateIndex /*= 0*/)
std::string templateName; std::string templateName;
switch (_ContactType) switch (_ContactType)
{ {
case CPeopleListDesc::Team: templateName = "mate_id"; break; case CPeopleListDesc::Team: templateName = "mate_id"; break;
case CPeopleListDesc::Contact: templateName = "contact_id_friend"; break; case CPeopleListDesc::Contact: templateName = "contact_id_friend"; break;
case CPeopleListDesc::Ignore: templateName = "contact_id_ignore"; break; case CPeopleListDesc::Ignore: templateName = "contact_id_ignore"; break;
default: default:
nlwarning("<CPeopleList::addPeople> Unknown contact type"); nlwarning("<CPeopleList::addPeople> Unknown contact type");
return -1; return -1;
break; break;
} }
@ -379,10 +412,10 @@ sint CPeopleList::addPeople(const ucstring &name, uint teamMateIndex /*= 0*/)
gc->setSavable(false); gc->setSavable(false);
// //
/*if (_ChatWindow) /*if (_ChatWindow)
{ {
_ChatWindow->getContainer()->attachContainer(gc); _ChatWindow->getContainer()->attachContainer(gc);
} }
else*/ else*/
{ {
_BaseContainer->attachContainer(gc); _BaseContainer->attachContainer(gc);
} }
@ -415,8 +448,9 @@ void CPeopleList::removePeople(uint index)
} }
else else
{ {
if (_BaseContainer) CGroupContainer *parentContainer = _Peoples[index].Container->getProprietaryContainer();
_BaseContainer->detachContainer(_Peoples[index].Container); if (parentContainer)
parentContainer->detachContainer(_Peoples[index].Container);
} }
CInterfaceManager *im = CInterfaceManager::getInstance(); CInterfaceManager *im = CInterfaceManager::getInstance();
CInterfaceGroup *pRoot = dynamic_cast<CInterfaceGroup*>(CWidgetManager::getInstance()->getElementFromId("ui:interface")); CInterfaceGroup *pRoot = dynamic_cast<CInterfaceGroup*>(CWidgetManager::getInstance()->getElementFromId("ui:interface"));
@ -447,6 +481,169 @@ void CPeopleList::setContactId(uint index, uint32 contactId)
_Peoples[index].ContactId = contactId; _Peoples[index].ContactId = contactId;
} }
//==================================================================
void CPeopleList::changeGroup(uint index, const ucstring &groupName)
{
if (index >= _Peoples.size())
{
nlwarning("<CPeopleList::changeGroup> bad index.");
return;
}
ucstring group = groupName;
if (group.toString() == "General")
group = ucstring("");
_Peoples[index].Group = group;
for (uint k = 0; k < _GroupContainers.size(); ++k)
{
if (_GroupContainers[k].first == group.toString())
return;
}
vector<pair<string, string> > properties;
properties.push_back(make_pair(string("posparent"), string("parent")));
properties.push_back(make_pair(string("id"), _ContainerID + "_group_" + toString(_GroupContainers.size())));
if (group.toString() == "")
properties.push_back(make_pair(string("title"), "General"));
else
properties.push_back(make_pair(string("title"), group.toString()));
CGroupContainer *gc = dynamic_cast<CGroupContainer *>(CWidgetManager::getInstance()->getParser()->createGroupInstance("people_list_group_header", "ui:interface", properties, false));
if (group.toString() == "")
gc->setUCTitle(ucstring("General"));
else
gc->setUCTitle(group.toString());
gc->setSavable(false);
CInterfaceGroup *pRoot = dynamic_cast<CInterfaceGroup*>(CWidgetManager::getInstance()->getElementFromId("ui:interface"));
pRoot->addGroup (gc);
_BaseContainer->attachContainer(gc);
_GroupContainers.push_back(make_pair(group.toString(), gc));
std::sort(_GroupContainers.begin(), _GroupContainers.end());
}
//==================================================================
void CPeopleList::readContactGroups()
{
_GroupContainers.clear();
// Create default group even if no groups defined
vector<pair<string, string> > properties;
properties.push_back(make_pair(string("posparent"), string("parent")));
properties.push_back(make_pair(string("id"), _ContainerID + "_group_0"));
properties.push_back(make_pair(string("title"), "General"));
CInterfaceGroup *group = CWidgetManager::getInstance()->getParser()->createGroupInstance("people_list_group_header", "ui:interface", properties, false);
CGroupContainer *gc = dynamic_cast<CGroupContainer *>(group);
gc->setUCTitle(ucstring("General"));
gc->setSavable(false);
CInterfaceGroup *pRoot = dynamic_cast<CInterfaceGroup*>(CWidgetManager::getInstance()->getElementFromId("ui:interface"));
pRoot->addGroup (gc);
_BaseContainer->attachContainer(gc);
_GroupContainers.push_back(make_pair("", gc));
const std::string filename = CInterfaceManager::getInstance()->getSaveFileName("contactgroups", "xml");
try
{
CIFile fd;
if (fd.open(CPath::lookup(filename)))
{
CIXml stream;
stream.init(fd);
xmlKeepBlanksDefault(0);
xmlNodePtr root = stream.getRootNode();
if (!root) return;
xmlNodePtr node = root->children;
uint nb = 0;
while (node)
{
CXMLAutoPtr propName;
propName = (char*) xmlGetProp(node, (xmlChar*)"name");
CXMLAutoPtr propGroup;
propGroup = (char*) xmlGetProp(node, (xmlChar*)"group");
if (propName && propGroup)
{
sint index = getIndexFromName(propName.str());
if (index < _Peoples.size())
{
_Peoples[index].Group = propGroup.str();
if (_GroupContainers.empty() || _GroupContainers.back().first != propGroup.str()) {
vector<pair<string, string> > properties;
properties.push_back(make_pair(string("posparent"), string("parent")));
properties.push_back(make_pair(string("id"), _ContainerID + "_group_" + toString(_GroupContainers.size())));
if (propGroup.str() == "")
properties.push_back(make_pair(string("title"), "General"));
else
properties.push_back(make_pair(string("title"), propGroup.str()));
CInterfaceGroup *group = CWidgetManager::getInstance()->getParser()->createGroupInstance("people_list_group_header", "ui:interface", properties, false);
CGroupContainer *gc = dynamic_cast<CGroupContainer *>(group);
if (propGroup.str() == "")
gc->setUCTitle(ucstring("General"));
else
gc->setUCTitle(propGroup.str());
gc->setSavable(false);
CInterfaceGroup *pRoot = dynamic_cast<CInterfaceGroup*>(CWidgetManager::getInstance()->getElementFromId("ui:interface"));
pRoot->addGroup (gc);
_BaseContainer->attachContainer(gc);
_GroupContainers.push_back(make_pair(propGroup.str(), gc));
}
}
}
node = node->next;
nb++;
}
fd.close();
}
std::sort(_GroupContainers.begin(), _GroupContainers.end());
}
catch (const Exception &e)
{
nlwarning("Error while parsing xml file %s : %s", filename.c_str(), e.what());
}
}
//==================================================================
void CPeopleList::saveContactGroups()
{
const std::string filename = CInterfaceManager::getInstance()->getSaveFileName("contactgroups", "xml");
try
{
COFile fd;
if (fd.open(filename, false, false, true))
{
COXml stream;
stream.init(&fd);
xmlDocPtr doc = stream.getDocument();
xmlNodePtr node = xmlNewDocNode(doc, NULL, (const xmlChar*)"contact_groups", NULL);
xmlDocSetRootElement(doc, node);
for (uint k = 0; k < _Peoples.size(); ++k)
{
xmlNodePtr newNode = xmlNewChild(node, NULL, (const xmlChar*)"contact", NULL);
xmlSetProp(newNode, (const xmlChar*)"name", (const xmlChar*)_Peoples[k].getName().toString().c_str());
xmlSetProp(newNode, (const xmlChar*)"group", (const xmlChar*)_Peoples[k].Group.toString().c_str());
}
stream.flush();
fd.close();
}
nlinfo("save %s", filename.c_str());
}
catch (const Exception &e)
{
nlwarning("Error while writing the file %s : %s", filename.c_str(), e.what());
}
}
//================================================================== //==================================================================
void CPeopleList::displayLocalPlayerTell(const ucstring &receiver, uint index, const ucstring &msg,uint numBlinks /*=0*/) void CPeopleList::displayLocalPlayerTell(const ucstring &receiver, uint index, const ucstring &msg,uint numBlinks /*=0*/)
{ {
@ -607,7 +804,12 @@ void CPeopleList::removeAllPeoples()
{ {
_BaseContainer->removeAllContainers(); _BaseContainer->removeAllContainers();
} }
for (uint k = 0; k < _GroupContainers.size(); ++k)
{
_GroupContainers[k].second->removeAllContainers();
}
NLMISC::contReset(_Peoples); NLMISC::contReset(_Peoples);
NLMISC::contReset(_GroupContainers);
} }
//================================================================== //==================================================================
@ -617,12 +819,12 @@ void CPeopleList::setPeopleMenu(const std::string &menuName)
} }
void CPeopleList::setPeopleMenuEx(const std::string &offlineUnblockedMenuName, void CPeopleList::setPeopleMenuEx(const std::string &offlineUnblockedMenuName,
const std::string &onlineUnblockedMenuName, const std::string &onlineUnblockedMenuName,
const std::string &onlineAbroadUnblockedMenuName, const std::string &onlineAbroadUnblockedMenuName,
const std::string &offlineBockedMenuName, const std::string &offlineBockedMenuName,
const std::string &onlineBlockedMenuName, const std::string &onlineBlockedMenuName,
const std::string &onlineAbroadBlockedMenuName const std::string &onlineAbroadBlockedMenuName
) )
{ {
_PeopleMenuOfflineUnblocked = offlineUnblockedMenuName; _PeopleMenuOfflineUnblocked = offlineUnblockedMenuName;
_PeopleMenuOnlineUnblocked = onlineUnblockedMenuName; _PeopleMenuOnlineUnblocked = onlineUnblockedMenuName;

@ -110,6 +110,11 @@ public:
void setContactId(uint index, uint32 contactId); void setContactId(uint index, uint32 contactId);
sint getIndexFromContactId(uint32 contactId); sint getIndexFromContactId(uint32 contactId);
// For Friend Groups management
void changeGroup(uint index, const ucstring &groupName);
void readContactGroups();
void saveContactGroups();
/** Display a message for the given people /** Display a message for the given people
* If the window is closed, it causes it to blink (and also the parent window) * If the window is closed, it causes it to blink (and also the parent window)
*/ */
@ -151,19 +156,21 @@ public:
private: private:
struct CPeople struct CPeople
{ {
CPeople() : Container(NULL), Chat(NULL), Online(ccs_offline), Blocked(false), ContactId(0) {} CPeople() : Container(NULL), Chat(NULL), Online(ccs_offline), Blocked(false), ContactId(0), Group("") {}
NLMISC::CRefPtr<CGroupContainer> Container; // todo : replace this with a CChatWindow one day, for consistency NLMISC::CRefPtr<CGroupContainer> Container; // todo : replace this with a CChatWindow one day, for consistency
NLMISC::CRefPtr<CGroupContainer> Chat; NLMISC::CRefPtr<CGroupContainer> Chat;
uint GlobalID; uint GlobalID;
TCharConnectionState Online; TCharConnectionState Online;
bool Blocked; bool Blocked;
uint32 ContactId; uint32 ContactId;
ucstring Group;
bool operator < (const CPeople &other) const { return getName() < other.getName(); } bool operator < (const CPeople &other) const { return getName() < other.getName(); }
ucstring getName() const { return Container->getUCTitle(); } ucstring getName() const { return Container->getUCTitle(); }
}; };
typedef std::vector<CPeople> TPeopleVect; typedef std::vector<CPeople> TPeopleVect;
private: private:
CGroupContainerPtr _BaseContainer; CGroupContainerPtr _BaseContainer;
std::vector<std::pair<std::string, NLMISC::CRefPtr<CGroupContainer> > > _GroupContainers;
NLMISC::CRefPtr<CChatWindow> _ChatWindow; NLMISC::CRefPtr<CChatWindow> _ChatWindow;
TPeopleVect _Peoples; TPeopleVect _Peoples;
CPeopleListDesc::TContactType _ContactType; CPeopleListDesc::TContactType _ContactType;

@ -411,7 +411,7 @@ void CSPhraseManager::forgetPhrase(uint32 memoryLine, uint32 memorySlot)
_Memories[memoryLine].Slot[memorySlot].Id= 0; _Memories[memoryLine].Slot[memorySlot].Id= 0;
// must update DB? // must update DB?
if((sint32)memoryLine==_SelectedMemoryDB) if((sint32)memoryLine==_SelectedMemoryDB || (sint32)memoryLine==_SelectedMemoryDBalt)
{ {
// update the db // update the db
updateMemoryDBSlot(memorySlot); updateMemoryDBSlot(memorySlot);
@ -465,7 +465,7 @@ void CSPhraseManager::memorizePhrase(uint32 memoryLine, uint32 memorySlot, ui
_Memories[memoryLine].Slot[memorySlot].Id= slot; _Memories[memoryLine].Slot[memorySlot].Id= slot;
// must update DB? // must update DB?
if((sint32)memoryLine==_SelectedMemoryDB) if((sint32)memoryLine==_SelectedMemoryDB || (sint32)memoryLine==_SelectedMemoryDBalt)
{ {
// update the DB // update the DB
updateMemoryDBSlot(memorySlot); updateMemoryDBSlot(memorySlot);
@ -3276,7 +3276,7 @@ void CSPhraseManager::memorizeMacro(uint32 memoryLine, uint32 memorySlot, uint32
_Memories[memoryLine].Slot[memorySlot].Id= macroId; _Memories[memoryLine].Slot[memorySlot].Id= macroId;
// must update DB? // must update DB?
if((sint32)memoryLine==_SelectedMemoryDB) if((sint32)memoryLine==_SelectedMemoryDB || (sint32)memoryLine==_SelectedMemoryDBalt)
{ {
// update the DB // update the DB
updateMemoryDBSlot(memorySlot); updateMemoryDBSlot(memorySlot);
@ -3302,7 +3302,7 @@ void CSPhraseManager::forgetMacro(uint32 memoryLine, uint32 memorySlot)
_Memories[memoryLine].Slot[memorySlot].Id= 0; _Memories[memoryLine].Slot[memorySlot].Id= 0;
// must update DB? // must update DB?
if((sint32)memoryLine==_SelectedMemoryDB) if((sint32)memoryLine==_SelectedMemoryDB || (sint32)memoryLine==_SelectedMemoryDBalt)
{ {
// update the db // update the db
updateMemoryDBSlot(memorySlot); updateMemoryDBSlot(memorySlot);

@ -733,6 +733,12 @@ std::string CItemGroupManager::toDbPath(INVENTORIES::TInventory inventory)
return LIST_PA2_TEXT; break; return LIST_PA2_TEXT; break;
case INVENTORIES::pet_animal4: case INVENTORIES::pet_animal4:
return LIST_PA3_TEXT; break; return LIST_PA3_TEXT; break;
case INVENTORIES::pet_animal5:
return LIST_PA4_TEXT; break;
case INVENTORIES::pet_animal6:
return LIST_PA5_TEXT; break;
case INVENTORIES::pet_animal7:
return LIST_PA6_TEXT; break;
case INVENTORIES::player_room: case INVENTORIES::player_room:
return LIST_ROOM_TEXT;break; return LIST_ROOM_TEXT;break;
case INVENTORIES::guild: case INVENTORIES::guild:

@ -1280,6 +1280,19 @@ void CPatchManager::readDescFile(sint32 nVersion)
CBNPFileSet &bnpFS = const_cast<CBNPFileSet &>(DescFile.getFiles()); CBNPFileSet &bnpFS = const_cast<CBNPFileSet &>(DescFile.getFiles());
// TODO: .ref files are expected to follow platform category naming (they are in 'main' category)
std::set<std::string>::const_iterator it;
for(it = forceRemovePatchCategories.begin(); it != forceRemovePatchCategories.end(); ++it)
{
std::string name = *it;
std::string::size_type pos = name.find("_");
if (pos != std::string::npos)
{
name = name.substr(pos+1) + "_.ref";
bnpFS.removeFile(name);
}
}
for (cat = 0; cat < DescFile.getCategories().categoryCount();) for (cat = 0; cat < DescFile.getCategories().categoryCount();)
{ {
const CBNPCategory &bnpCat = DescFile.getCategories().getCategory(cat); const CBNPCategory &bnpCat = DescFile.getCategories().getCategory(cat);
@ -2967,7 +2980,7 @@ void CPatchThread::processFile (CPatchManager::SFileToPatch &rFTP)
PatchSizeProgress += rFTP.PatcheSizes[j]; PatchSizeProgress += rFTP.PatcheSizes[j];
currentPatchedSize += rFTP.PatcheSizes[j]; currentPatchedSize += rFTP.PatcheSizes[j];
} }
}
if (tmpSourceName != DestinationName) if (tmpSourceName != DestinationName)
{ {
pPM->deleteFile(SourceName, false, false); // File can exists if bad BNP loading pPM->deleteFile(SourceName, false, false); // File can exists if bad BNP loading
@ -2981,7 +2994,6 @@ void CPatchThread::processFile (CPatchManager::SFileToPatch &rFTP)
pPM->renameFile(tmpSourceName, DestinationName); pPM->renameFile(tmpSourceName, DestinationName);
} }
} }
}
} }
else else
{ {

@ -269,6 +269,7 @@ public:
void setStartRyzomAtEnd(bool startAtEnd){ _StartRyzomAtEnd = startAtEnd; } void setStartRyzomAtEnd(bool startAtEnd){ _StartRyzomAtEnd = startAtEnd; }
// Forward message to installation software if needed // Forward message to installation software if needed
void fatalError(const std::string& errorId, const std::string& param1, const std::string& param2); void fatalError(const std::string& errorId, const std::string& param1, const std::string& param2);
bool bnpUnpack(const std::string &srcBigfile, const std::string &dstPath, std::vector<std::string> &vFilenames);
const std::string & getServerVersion () { return ServerVersion; } const std::string & getServerVersion () { return ServerVersion; }
private: private:
@ -320,8 +321,6 @@ private:
void getPatchFromDesc(SFileToPatch &ftpOut, const CBNPFile &fIn, bool forceCheckSumTest); void getPatchFromDesc(SFileToPatch &ftpOut, const CBNPFile &fIn, bool forceCheckSumTest);
bool bnpUnpack(const std::string &srcBigfile, const std::string &dstPath, std::vector<std::string> &vFilenames);
// stop the threads (called when knowing the thread ended) // stop the threads (called when knowing the thread ended)
void stopCheckThread(); void stopCheckThread();
void stopPatchThread(); void stopPatchThread();

@ -191,7 +191,8 @@ struct CClientPatcherTranslations : public NLMISC::CI18N::ILoadProxy
}; };
// hardcoded URL to not depend on external files // hardcoded URL to not depend on external files
static const std::string PatchUrl = RYZOM_CLIENT_PATCH_URL; // "https://cdn.ryzom.dev/open/patch"; static const std::string DefaultPatchUrl = RYZOM_CLIENT_PATCH_URL; // "https://cdn.ryzom.dev/open/patch";
static const std::string DefaultAppName = RYZOM_CLIENT_APP_NAME; // "default"
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
@ -200,9 +201,40 @@ int main(int argc, char *argv[])
Args.setVersion(getDisplayVersion()); Args.setVersion(getDisplayVersion());
Args.setDescription("Ryzom client"); Args.setDescription("Ryzom client");
Args.addArg("p", "patch", "patch", "Name of the file to use tp xdelta the source file");
Args.addArg("s", "source", "source", "Name of source file to xdelta with patch file");
Args.addArg("d", "destination", "destination", "Name of destination operation (patch or unpack)");
Args.addArg("u", "unpack", "unpack", "Name of bnp file to unpack");
Args.addArg("", "url", "PatchUrl", "Patch server url, ie 'https://dl.ryzom.com/patch_live'");
Args.addArg("", "app", "Application", "Patch application name for version file, ie 'ryzom_live' requests ryzom_live.version from PatchUrl");
if (!Args.parse(argc, argv)) return 1; if (!Args.parse(argc, argv)) return 1;
if (Args.haveArg("p") && Args.haveArg("s") && Args.haveArg("d"))
{
string patchName = Args.getArg("p").front();
string sourceName = Args.getArg("s").front();
string destinationName = Args.getArg("d").front();
std::string errorMsg;
CXDeltaPatch::TApplyResult ar = CXDeltaPatch::apply(patchName, sourceName, destinationName, errorMsg);
nlinfo("%s", errorMsg.c_str());
return ar;
}
// initialize patch manager and set the ryzom full path, before it's used
CPatchManager *pPM = CPatchManager::getInstance();
if (Args.haveArg("u") && Args.haveArg("d"))
{
string bnpName = Args.getArg("u").front();
string destinationName = Args.getArg("d").front();
vector<string> vFilenames;
if (pPM->bnpUnpack(bnpName, destinationName, vFilenames))
return 0;
return 1;
}
// create logs in temporary directory // create logs in temporary directory
createDebug(CPath::getTemporaryDirectory().c_str(), true, true); createDebug(CPath::getTemporaryDirectory().c_str(), true, true);
@ -240,16 +272,32 @@ int main(int argc, char *argv[])
// now translations are read, we don't need it anymore // now translations are read, we don't need it anymore
delete trans; delete trans;
// create minimal client.cfg file in memory for patcher
{
CConfigFile::CVar patchUrl;
patchUrl.forceAsString(DefaultPatchUrl);
if (Args.haveLongArg("url") && !Args.getLongArg("url").empty())
patchUrl.forceAsString(Args.getLongArg("url").front());
CConfigFile::CVar appName;
appName.forceAsString(DefaultAppName);
if (Args.haveLongArg("app") && !Args.getLongArg("app").empty())
appName.forceAsString(Args.getLongArg("app").front());
ClientCfg.ConfigFile.insertVar("PatchUrl", patchUrl);
ClientCfg.ConfigFile.insertVar("Application", appName);
}
//
Args.displayVersion(); Args.displayVersion();
printf("\n"); printf("\n");
printf("Checking %s files to patch...\n", convert(CI18N::get("TheSagaOfRyzom")).c_str()); printf("Checking %s files to patch...\n", convert(CI18N::get("TheSagaOfRyzom")).c_str());
printf("Using '%s/%s.version'\n", ClientCfg.ConfigFile.getVar("PatchUrl").asString().c_str(),
// initialize patch manager and set the ryzom full path, before it's used ClientCfg.ConfigFile.getVar("Application").asString().c_str());
CPatchManager *pPM = CPatchManager::getInstance();
// use PatchUrl // use PatchUrl
vector<string> patchURLs; vector<string> patchURLs;
pPM->init(patchURLs, PatchUrl, ""); pPM->init(patchURLs, ClientCfg.ConfigFile.getVar("PatchUrl").asString(), "");
pPM->startCheckThread(true /* include background patchs */); pPM->startCheckThread(true /* include background patchs */);
ucstring state; ucstring state;

Loading…
Cancel
Save