mirror of
https://port.numenaute.org/aleajactaest/khanat-opennel-code.git
synced 2024-11-18 05:11:42 +00:00
1318 lines
44 KiB
C++
1318 lines
44 KiB
C++
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
|
// Copyright (C) 2010 Winch Gate Property Limited
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero General Public License as
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
// License, or (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
#include "stdpch.h"
|
|
#include "guild_manager.h"
|
|
|
|
#include "interface_manager.h"
|
|
#include "../string_manager_client.h"
|
|
#include "action_handler.h"
|
|
#include "view_text.h"
|
|
#include "dbctrl_sheet.h"
|
|
#include "group_container.h"
|
|
#include "group_menu.h"
|
|
#include "group_html.h"
|
|
#include "../init_main_loop.h"
|
|
#include "inventory_manager.h"
|
|
|
|
#include "../connection.h"
|
|
#include "../entity_cl.h"
|
|
#include "../user_entity.h" // UserEntity
|
|
#include "view_bitmap.h"
|
|
#include "../sheet_manager.h"
|
|
#include "../net_manager.h"
|
|
#include "../client_sheets/building_sheet.h"
|
|
|
|
#include "game_share/lift_icons.h"
|
|
|
|
#include "../r2/editor.h"
|
|
#include "chat_window.h"
|
|
#include "people_interraction.h"
|
|
|
|
using namespace std;
|
|
using namespace NLMISC;
|
|
|
|
extern CPeopleInterraction PeopleInterraction;
|
|
|
|
NLMISC_REGISTER_OBJECT(CViewBase, CDBGroupListAscensor, std::string, "list_sheet_guild");
|
|
|
|
// ***************************************************************************
|
|
// Interface part
|
|
// ***************************************************************************
|
|
|
|
#define WIN_GUILD "ui:interface:guild"
|
|
#define WIN_GUILD_CHAT "ui:interface:guild_chat"
|
|
#define WIN_GUILD_FORUM "ui:interface:guild_forum"
|
|
#define VIEW_TEXT_GUILD_QUIT "ui:interface:guild:content:tab_guild:quit_guild"
|
|
#define CTRL_SHEET_GUILD_BLASON "ui:interface:guild:content:tab_guild:blason"
|
|
#define VIEW_TEXT_GUILD_MEMBER_COUNT "ui:interface:guild:content:tab_guild:member_count"
|
|
|
|
|
|
#define LIST_GUILD_MEMBERS "ui:interface:guild:content:tab_guild:list_member:guild_members"
|
|
#define CTRL_QUIT_GUILD "ui:interface:guild:content:tab_guild:quit_guild"
|
|
#define TEMPLATE_GUILD_MEMBER "member_template"
|
|
#define TEMPLATE_GUILD_MEMBER_NAME "name"
|
|
#define TEMPLATE_GUILD_MEMBER_GRADE "grade"
|
|
#define TEMPLATE_GUILD_MEMBER_SCORE "score"
|
|
#define TEMPLATE_GUILD_MEMBER_ENTER_DATE "enter_date"
|
|
#define MENU_GUILD_MEMBER "ui:interface:menu_member"
|
|
|
|
#define WIN_ASCENSOR "ui:interface:ascensor_teleport_list"
|
|
|
|
#define WIN_JOIN_PROPOSAL "ui:interface:join_guild_proposal"
|
|
#define VIEW_JOIN_PROPOSAL_PHRASE "ui:interface:join_guild_proposal:content:inside:phrase"
|
|
|
|
CGuildManager* CGuildManager::_Instance = NULL;
|
|
|
|
// ***************************************************************************
|
|
CGuildManager::CGuildManager()
|
|
{
|
|
// TEMP TEMP TEMP&
|
|
initForDebug();
|
|
|
|
initDBObservers();
|
|
_NeedRebuild = true;
|
|
_NeedRebuildMembers = true;
|
|
_NeedUpdate = false;
|
|
_NeedUpdateMembers = false;
|
|
_InGuild = false;
|
|
_JoinPropUpdate = false;
|
|
_NewToTheGuild = false;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
CGuildManager::~CGuildManager()
|
|
{
|
|
}
|
|
|
|
|
|
static inline bool lt_member_name(const SGuildMember &m1, const SGuildMember &m2)
|
|
{
|
|
return toLower(m1.Name) < toLower(m2.Name);
|
|
}
|
|
|
|
static inline bool lt_member_grade(const SGuildMember &m1, const SGuildMember &m2)
|
|
{
|
|
return m1.Grade < m2.Grade;
|
|
}
|
|
|
|
static inline bool lt_member_online(const SGuildMember &m1, const SGuildMember &m2)
|
|
{
|
|
if (m1.Online == m2.Online)
|
|
{
|
|
return lt_member_grade(m1, m2);
|
|
}
|
|
|
|
// Compare online status
|
|
switch (m1.Online)
|
|
{
|
|
case ccs_online:
|
|
// m1 is < if m1 is online
|
|
return true;
|
|
break;
|
|
case ccs_online_abroad:
|
|
// m1 is < if m2 is offline
|
|
return (m2.Online == ccs_offline);
|
|
break;
|
|
case ccs_offline:
|
|
default:
|
|
// m2 is always < if m1 is offline
|
|
return false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
void CGuildManager::sortGuildMembers(TSortOrder order)
|
|
{
|
|
if (_GuildMembers.size() < 2) return;
|
|
|
|
switch (order)
|
|
{
|
|
default:
|
|
case sort_grade:
|
|
sort(_GuildMembers.begin(), _GuildMembers.end(), lt_member_name);
|
|
stable_sort(_GuildMembers.begin(), _GuildMembers.end(), lt_member_grade);
|
|
break;
|
|
case sort_name:
|
|
sort(_GuildMembers.begin(), _GuildMembers.end(), lt_member_name);
|
|
break;
|
|
case sort_online:
|
|
sort(_GuildMembers.begin(), _GuildMembers.end(), lt_member_name);
|
|
stable_sort(_GuildMembers.begin(), _GuildMembers.end(), lt_member_online);
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool CGuildManager::isProxy()
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
return pIM->getDbProp("SERVER:GUILD:PROXY")->getValueBool();
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
/*void CGuildManager::init (const std::vector< std::pair<uint32,uint8> > &NameGrade)
|
|
{
|
|
_GuildMembers.clear();
|
|
_GuildMembers.resize(NameGrade.size());
|
|
for (uint32 i = 0; i < NameGrade.size(); ++i)
|
|
{
|
|
_GuildMembers[i].Index = i;
|
|
_GuildMembers[i].NameID = NameGrade[i].first;
|
|
_GuildMembers[i].Grade = (EGSPD::CGuildGrade::TGuildGrade)(NameGrade[i].second&0x7f);
|
|
_GuildMembers[i].Online = ((NameGrade[i].second&0x80) != 0);
|
|
}
|
|
}*/
|
|
|
|
// ***************************************************************************
|
|
/*void CGuildManager::set (uint32 indexMember, uint32 MemberName, uint8 MemberGrade, bool bOnline)
|
|
{
|
|
uint32 i;
|
|
for (i = 0; i < _GuildMembers.size(); ++i)
|
|
{
|
|
if (_GuildMembers[i].Index == indexMember)
|
|
break;
|
|
}
|
|
|
|
// indexMember not found create it
|
|
if (i == _GuildMembers.size())
|
|
{
|
|
_GuildMembers.resize(_GuildMembers.size()+1);
|
|
_GuildMembers[i].Index = indexMember;
|
|
}
|
|
|
|
if ((MemberName == 0) && (MemberGrade == (uint32)EGSPD::CGuildGrade::EndGuildGrade))
|
|
{
|
|
// Delete entry
|
|
_GuildMembers.erase(_GuildMembers.begin()+i);
|
|
}
|
|
else
|
|
{
|
|
// Setup entry
|
|
_GuildMembers[i].NameID = MemberName;
|
|
_GuildMembers[i].Grade = (EGSPD::CGuildGrade::TGuildGrade)MemberGrade;
|
|
_GuildMembers[i].Online = bOnline;
|
|
}
|
|
|
|
rebuild();
|
|
}*/
|
|
|
|
// ***************************************************************************
|
|
bool CGuildManager::isInGuild()
|
|
{
|
|
// InGuild is set from database (if the guild name id != 0)
|
|
return _InGuild;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
bool CGuildManager::canRecruit()
|
|
{
|
|
if (!_InGuild) return false;
|
|
if ((_Grade == EGSPD::CGuildGrade::Leader) || (_Grade == EGSPD::CGuildGrade::HighOfficer) ||
|
|
(_Grade == EGSPD::CGuildGrade::Officer) /*|| (_Grade == EGSPD::CGuildGrade::Recruiter)*/)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
bool CGuildManager::isLeaderOfTheGuild()
|
|
{
|
|
return (_Grade == EGSPD::CGuildGrade::Leader);
|
|
}
|
|
|
|
// ***************************************************************************
|
|
ucstring CGuildManager::getGuildName()
|
|
{
|
|
if (_InGuild)
|
|
return _Guild.Name;
|
|
return ucstring("");
|
|
}
|
|
|
|
// ***************************************************************************
|
|
uint64 CGuildManager::getMoney()
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
return pIM->getDbProp("SERVER:GUILD:INVENTORY:MONEY")->getValue64();
|
|
}
|
|
|
|
// ***************************************************************************
|
|
uint64 CGuildManager::getXP()
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
return pIM->getDbProp("SERVER:GUILD:XP")->getValue64();
|
|
}
|
|
|
|
// ***************************************************************************
|
|
void CGuildManager::update()
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance();
|
|
|
|
// *** Need to rebuild the guild data?
|
|
if (_NeedRebuild)
|
|
{
|
|
_NeedUpdate = true;
|
|
_NeedRebuild = false;
|
|
|
|
// Rebuild transfert the database to the local structure
|
|
|
|
// Guild stuff
|
|
uint32 oldName = _Guild.NameID;
|
|
_Guild.NameID = pIM->getDbProp("SERVER:GUILD:NAME")->getValue32();
|
|
_Guild.Name = "";
|
|
_InGuild = (_Guild.NameID != 0);
|
|
if (!_InGuild)
|
|
closeAllInterfaces();
|
|
_Guild.Icon = pIM->getDbProp("SERVER:GUILD:ICON")->getValue64();
|
|
_Guild.QuitGuildAvailable = true;
|
|
|
|
// Guild Members
|
|
if(_NeedRebuildMembers)
|
|
{
|
|
_NeedUpdateMembers = true;
|
|
_NeedRebuildMembers = false;
|
|
|
|
_GuildMembers.clear();
|
|
for (uint32 i = 0; i < MAX_GUILD_MEMBER; ++i)
|
|
{
|
|
sint32 name = pIM->getDbProp("SERVER:GUILD:MEMBERS:"+toString(i)+":NAME")->getValue32();
|
|
if (name != 0)
|
|
{
|
|
SGuildMember gm;
|
|
gm.NameID = name;
|
|
gm.Index = i;
|
|
gm.Grade = (EGSPD::CGuildGrade::TGuildGrade)(pIM->getDbProp("SERVER:GUILD:MEMBERS:"+toString(i)+":GRADE")->getValue32());
|
|
gm.Online = (TCharConnectionState)(pIM->getDbProp("SERVER:GUILD:MEMBERS:"+toString(i)+":ONLINE")->getValue32());
|
|
gm.EnterDate = pIM->getDbProp("SERVER:GUILD:MEMBERS:"+toString(i)+":ENTER_DATE")->getValue32();
|
|
_GuildMembers.push_back(gm);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Does the player are newcomer ?
|
|
// Boris 01/09/2006 : removed : now the guild interface is open if
|
|
// is was active before OR if the EGS ask it to the client
|
|
|
|
bool playerNewToTheGuild = _NewToTheGuild &&(oldName != _Guild.NameID) && _InGuild;
|
|
if (playerNewToTheGuild)
|
|
{
|
|
// reset the flag
|
|
_NewToTheGuild = false;
|
|
// Don't pop the guild window in ring mode.
|
|
// NB nico : this test should not be necessary, as the guild infos should be filled during the init of the db
|
|
// However, there are situation where this db info is filled after init (should only happen at guild creation time ...)
|
|
// Maybe an EGS bug ?
|
|
if (R2::getEditor().getMode() == R2::CEditor::NotInitialized)
|
|
{
|
|
CInterfaceElement *pElt;
|
|
// Open the guild info if we are not in the init phase
|
|
if (!IngameDbMngr.initInProgress())
|
|
{
|
|
pElt = pIM->getElementFromId(WIN_GUILD);
|
|
if (pElt != NULL)
|
|
pElt->setActive(true);
|
|
}
|
|
// Browse the forum
|
|
pElt = pIM->getElementFromId(WIN_GUILD_FORUM":content:html");
|
|
if (pElt != NULL)
|
|
{
|
|
CGroupHTML *html = dynamic_cast<CGroupHTML*>(pElt);
|
|
if (html)
|
|
html->browse("home");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// *** Need to update Names?
|
|
if (_NeedUpdate)
|
|
{
|
|
bool bAllValid = true;
|
|
// Update wait until all the name of members, name of the guild and description are valid
|
|
|
|
if (!pSMC->getString (_Guild.NameID, _Guild.Name)) bAllValid = false;
|
|
|
|
for (uint i = 0; i < _GuildMembers.size(); ++i)
|
|
{
|
|
if (!pSMC->getString (_GuildMembers[i].NameID, _GuildMembers[i].Name)) bAllValid = false;
|
|
else _GuildMembers[i].Name = CEntityCL::removeTitleAndShardFromName(_GuildMembers[i].Name);
|
|
}
|
|
|
|
// If all is valid no more need update and if guild is opened update the interface
|
|
if (bAllValid)
|
|
{
|
|
// Search for UserEntity to find our own grade
|
|
if ((UserEntity != NULL) && (_GuildMembers.size() > 0))
|
|
{
|
|
uint i;
|
|
_Grade = EGSPD::CGuildGrade::Member;
|
|
string sUserName = strlwr(UserEntity->getEntityName().toString());
|
|
for (i = 0; i < _GuildMembers.size(); ++i)
|
|
{
|
|
if (strlwr(_GuildMembers[i].Name.toString()) == sUserName)
|
|
{
|
|
_Grade = _GuildMembers[i].Grade;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// set this value in the database
|
|
pIM->getDbProp("UI:VARIABLES:USER:GUILD_GRADE")->setValue32(_Grade);
|
|
|
|
// update the guild display
|
|
CGroupContainer *pGuild = dynamic_cast<CGroupContainer*>(pIM->getElementFromId(WIN_GUILD));
|
|
if (pGuild != NULL)
|
|
{
|
|
// if the guild window is visible
|
|
if (pGuild->isOpen() && pGuild->getActive())
|
|
{
|
|
// Close the modal window if the member list will change
|
|
if(pIM->getModalWindow()!=NULL && _NeedUpdateMembers)
|
|
{
|
|
if (pIM->getModalWindow()->getId() == MENU_GUILD_MEMBER )
|
|
pIM->disableModalWindow();
|
|
}
|
|
|
|
// Rebuild interface. Rebuild members only if needed
|
|
pIM->runActionHandler("guild_sheet_open", NULL, toString("update_members=%d", (uint)_NeedUpdateMembers) );
|
|
}
|
|
}
|
|
|
|
// guild updated
|
|
_NeedUpdate = false;
|
|
_NeedUpdateMembers= false;
|
|
}
|
|
}
|
|
|
|
// *** Join proposal handling
|
|
if (_JoinPropUpdate)
|
|
{
|
|
bool bAllValid = true;
|
|
if (!pSMC->getDynString (_JoinPropPhraseID, _JoinPropPhrase)) bAllValid = false;
|
|
// If all is valid no more need update and update the interface
|
|
if (bAllValid)
|
|
{
|
|
_JoinPropUpdate = false;
|
|
CGroupContainer *pJoinProp = dynamic_cast<CGroupContainer*>(pIM->getElementFromId(WIN_JOIN_PROPOSAL));
|
|
if (pJoinProp != NULL)
|
|
{
|
|
CViewText *pJoinPropPhraseView = dynamic_cast<CViewText*>(pIM->getElementFromId(VIEW_JOIN_PROPOSAL_PHRASE));
|
|
if (pJoinPropPhraseView != NULL)
|
|
pJoinPropPhraseView->setText(_JoinPropPhrase);
|
|
|
|
pJoinProp->setActive(true);
|
|
pIM->setTopWindow(pJoinProp);
|
|
pJoinProp->updateCoords();
|
|
pJoinProp->center();
|
|
pJoinProp->enableBlink(2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
void CGuildManager::launchAscensor()
|
|
{
|
|
// Start the huge list exchange
|
|
Ascensors.start();
|
|
|
|
// Increment session id
|
|
Ascensors.incrementSessionID();
|
|
|
|
// Send request of the first page to the server specifying the session id
|
|
CBitMemStream out;
|
|
if(GenericMsgHeaderMngr.pushNameToStream("GUILD:FIRST_ASCENSOR_PAGE", out))
|
|
{
|
|
uint16 session = Ascensors.getSessionID();
|
|
out.serial(session);
|
|
NetMngr.push(out);
|
|
//nlinfo("impulseCallBack : GUILD:FIRST_ASCENSOR_PAGE %d sent",session);
|
|
}
|
|
else
|
|
{
|
|
nlwarning("impulseCallBack : unknown message name : 'GUILD:FIRST_ASCENSOR_PAGE'.");
|
|
}
|
|
|
|
// Start Ascensor Interface
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
CGroupContainer *pAC = dynamic_cast<CGroupContainer*>(pIM->getElementFromId(WIN_ASCENSOR));
|
|
if (pAC == NULL) return;
|
|
pAC->setActive(true);
|
|
pIM->setTopWindow(pAC);
|
|
}
|
|
|
|
// TEMP TEMP TEMP
|
|
|
|
NLMISC_COMMAND(testAscensorPage, "Temp : Simulate the server that fills the database for ascensor","")
|
|
{
|
|
CInterfaceManager *im = CInterfaceManager::getInstance();
|
|
uint64 prop;
|
|
//
|
|
im->getDbProp("LOCAL:ASCENSOR:0:NAME")->setValue32(12);
|
|
prop = CGuildManager::iconMake(1, 1, false, CRGBA(255, 255, 0), CRGBA(0, 255, 0));
|
|
im->getDbProp("LOCAL:ASCENSOR:0:ICON")->setValue64(prop);
|
|
//
|
|
im->getDbProp("LOCAL:ASCENSOR:1:NAME")->setValue32(12);
|
|
prop = CGuildManager::iconMake(1, 2, false, CRGBA(0, 255, 255), CRGBA(255, 0, 255));
|
|
im->getDbProp("LOCAL:ASCENSOR:1:ICON")->setValue64(prop);
|
|
//
|
|
im->getDbProp("LOCAL:ASCENSOR:2:NAME")->setValue32(12);
|
|
prop = CGuildManager::iconMake(2, 3, false, CRGBA(255, 0, 0), CRGBA(0, 255, 0));
|
|
im->getDbProp("LOCAL:ASCENSOR:2:ICON")->setValue64(prop);
|
|
//
|
|
im->getDbProp("LOCAL:ASCENSOR:3:NAME")->setValue32(12);
|
|
prop = CGuildManager::iconMake(2, 4, false, CRGBA(255, 255, 0), CRGBA(0, 255, 255));
|
|
im->getDbProp("LOCAL:ASCENSOR:3:ICON")->setValue64(prop);
|
|
//
|
|
im->getDbProp("LOCAL:ASCENSOR:4:NAME")->setValue32(12);
|
|
prop = CGuildManager::iconMake(3, 5, false, CRGBA(255, 255, 0), CRGBA(255, 0, 255));
|
|
im->getDbProp("LOCAL:ASCENSOR:4:ICON")->setValue64(prop);
|
|
//
|
|
im->getDbProp("LOCAL:ASCENSOR:5:NAME")->setValue32(12);
|
|
prop = CGuildManager::iconMake(3, 6, false, CRGBA(0, 255, 255), CRGBA(255, 255, 0));
|
|
im->getDbProp("LOCAL:ASCENSOR:5:ICON")->setValue64(prop);
|
|
//
|
|
im->getDbProp("LOCAL:ASCENSOR:6:NAME")->setValue32(12);
|
|
prop = CGuildManager::iconMake(4, 7, false, CRGBA(0, 255, 255), CRGBA(255, 0, 255));
|
|
im->getDbProp("SERVER:ASCENSOR:6:ICON")->setValue64(prop);
|
|
//
|
|
im->getDbProp("LOCAL:ASCENSOR:7:NAME")->setValue32(12);
|
|
prop = CGuildManager::iconMake(4, 8, false, CRGBA(255, 0, 255), CRGBA(0, 255, 255));
|
|
im->getDbProp("LOCAL:ASCENSOR:7:ICON")->setValue64(prop);
|
|
|
|
return true;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
void CGuildManager::quitAscensor()
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
CGroupContainer *pAC = dynamic_cast<CGroupContainer*>(pIM->getElementFromId(WIN_ASCENSOR));
|
|
if (pAC == NULL) return;
|
|
pAC->setActive(false);
|
|
}
|
|
|
|
// ***************************************************************************
|
|
void CGuildManager::launchJoinProposal(uint32 phraseID)
|
|
{
|
|
_JoinPropPhraseID = phraseID;
|
|
_JoinPropUpdate = true;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
void CGuildManager::quitJoinProposal()
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
CGroupContainer *pJoinProp = dynamic_cast<CGroupContainer*>(pIM->getElementFromId(WIN_JOIN_PROPOSAL));
|
|
if (pJoinProp != NULL)
|
|
pJoinProp->setActive(false);
|
|
}
|
|
|
|
// ***************************************************************************
|
|
void CGuildManager::closeAllInterfaces()
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
CGroupContainer *pGuild = dynamic_cast<CGroupContainer*>(pIM->getElementFromId(WIN_GUILD));
|
|
if (pGuild != NULL)
|
|
pGuild->setActive(false);
|
|
CGroupContainer *pGuildForum = dynamic_cast<CGroupContainer*>(pIM->getElementFromId(WIN_GUILD_FORUM));
|
|
if (pGuildForum != NULL)
|
|
pGuildForum->setActive(false);
|
|
CGroupContainer *pGuildChat = dynamic_cast<CGroupContainer*>(pIM->getElementFromId(WIN_GUILD_CHAT));
|
|
if (pGuildChat != NULL)
|
|
pGuildChat->setActive(false);
|
|
}
|
|
|
|
// ***************************************************************************
|
|
void CGuildManager::openGuildWindow()
|
|
{
|
|
_NewToTheGuild = true;
|
|
// CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
// // Open the guild window
|
|
//
|
|
// CCDBNodeLeaf *node= pIM->getDbProp("CLIENT:GUILD:HAVE_JOINED", false);
|
|
// if(node)
|
|
// node->setValue64(1);
|
|
//
|
|
// CInterfaceElement *pElt;
|
|
// pElt = pIM->getElementFromId(WIN_GUILD);
|
|
// if (pElt != NULL)
|
|
// {
|
|
// pElt->setActive(true);
|
|
// }
|
|
// // Browse the forum
|
|
// pElt = pIM->getElementFromId(WIN_GUILD_FORUM":content:html");
|
|
// if (pElt != NULL)
|
|
// {
|
|
// CGroupHTML *html = dynamic_cast<CGroupHTML*>(pElt);
|
|
// if (html)
|
|
// html->browse("home");
|
|
// }
|
|
}
|
|
|
|
// ***************************************************************************
|
|
void CGuildManager::initForDebug()
|
|
{
|
|
_InGuild = true;
|
|
_Guild.Name = "TrapsGuild";
|
|
_Guild.Icon = CGuildManager::iconMake(1,1,false,CRGBA(255,0,255), CRGBA(0,255,255));
|
|
|
|
_Grade = EGSPD::CGuildGrade::Officer;
|
|
|
|
_GuildMembers.clear();
|
|
SGuildMember m;
|
|
m.Grade = EGSPD::CGuildGrade::Leader;
|
|
m.Name = "Trap";
|
|
// m.Score = 645;
|
|
_GuildMembers.push_back(m);
|
|
m.Grade = EGSPD::CGuildGrade::Officer;
|
|
m.Name = "Nico";
|
|
// m.Score = 354;
|
|
_GuildMembers.push_back(m);
|
|
m.Grade = EGSPD::CGuildGrade::HighOfficer;
|
|
m.Name = "Vianney";
|
|
// m.Score = 1657;
|
|
_GuildMembers.push_back(m);
|
|
m.Grade = EGSPD::CGuildGrade::Member;
|
|
m.Name = "Hulud";
|
|
// m.Score = 16;
|
|
_GuildMembers.push_back(m);
|
|
m.Grade = EGSPD::CGuildGrade::Member;
|
|
m.Name = "Geoffroy";
|
|
// m.Score = 64;
|
|
_GuildMembers.push_back(m);
|
|
// m.Grade = EGSPD::CGuildGrade::Bearer;
|
|
m.Name = "Yoyo";
|
|
// m.Score = 16570;
|
|
_GuildMembers.push_back(m);
|
|
// m.Grade = EGSPD::CGuildGrade::Recruiter;
|
|
m.Name = "Norm";
|
|
// m.Score = 10021;
|
|
_GuildMembers.push_back(m);
|
|
// m.Grade = EGSPD::CGuildGrade::Recruiter;
|
|
m.Name = "Nygot";
|
|
// m.Score = 102651;
|
|
_GuildMembers.push_back(m);
|
|
m.Grade = EGSPD::CGuildGrade::Member;
|
|
m.Name = "Alex";
|
|
// m.Score = 1465;
|
|
_GuildMembers.push_back(m);
|
|
m.Grade = EGSPD::CGuildGrade::Member;
|
|
m.Name = "EricSimon";
|
|
// m.Score = 654;
|
|
_GuildMembers.push_back(m);
|
|
}
|
|
|
|
// ***************************************************************************
|
|
void CGuildManager::initDBObservers()
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
|
|
// add an observer on the whole guild
|
|
CCDBNodeBranch *pGuild = pIM->getDbBranch("SERVER:GUILD");
|
|
if (pGuild != NULL)
|
|
pGuild->addBranchObserver(&_DBObs);
|
|
|
|
// add an observer on members only => need to update all
|
|
CCDBNodeBranch *pGuildMembers = pIM->getDbBranch("SERVER:GUILD:MEMBERS");
|
|
if (pGuildMembers != NULL)
|
|
pGuildMembers->addBranchObserver(&_DBObsMembers);
|
|
|
|
// observer on ascencors
|
|
Ascensors.setListType(CHugeListObs::Ascensor);
|
|
CCDBNodeBranch *pAscensor = pIM->getDbBranch("SERVER:ASCENSOR");
|
|
if (pAscensor != NULL)
|
|
pAscensor->addBranchObserver(&Ascensors);
|
|
}
|
|
|
|
// ***************************************************************************
|
|
// CDBGroupListAscensor
|
|
// ***************************************************************************
|
|
|
|
// **********************************************************************************
|
|
void CDBGroupListAscensor::CSheetChildAscensor::init(CDBGroupListSheetText *pFather, uint index)
|
|
{
|
|
// init my parent
|
|
CSheetChild::init(pFather, index);
|
|
|
|
Setuped = false;
|
|
Index = index;
|
|
SecondSheetIdCache = 0;
|
|
}
|
|
|
|
// **********************************************************************************
|
|
bool CDBGroupListAscensor::CSheetChildAscensor::isInvalidated(CDBGroupListSheetText * /* pFather */)
|
|
{
|
|
if (Ctrl->getSheetId() != SecondSheetIdCache)
|
|
{
|
|
SecondSheetIdCache = Ctrl->getSheetId();
|
|
Setuped = false;
|
|
}
|
|
|
|
if (!Setuped)
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance();
|
|
|
|
uint32 nameID = pIM->getDbProp("LOCAL:ASCENSOR:" + toString(Index) + ":NAME")->getValue32();
|
|
ucstring name;
|
|
if (nameID && pSMC->getDynString(nameID, name))
|
|
{
|
|
Text->setText(name);
|
|
|
|
uint64 icon = pIM->getDbProp("LOCAL:ASCENSOR:" + toString(Index) + ":ICON")->getValue64();
|
|
|
|
// Slot setup
|
|
if ((icon & UINT64_CONSTANT(0x8000000000000000)) != 0)
|
|
{
|
|
|
|
LIFT_ICONS::TLiftIcon li = (LIFT_ICONS::TLiftIcon)(icon & UINT64_CONSTANT(0x7FFFFFFFFFFFFFFF));
|
|
string str = strlwr(LIFT_ICONS::toString(li));
|
|
Ctrl->setType(CCtrlSheetInfo::SheetType_Teleport_Location);
|
|
Ctrl->setSlot("asc_"+str+".tga");
|
|
}
|
|
else // Guild icon
|
|
{
|
|
Ctrl->setType(CCtrlSheetInfo::SheetType_GuildFlag);
|
|
Ctrl->initSheetSize();
|
|
Ctrl->setSheetId(SecondSheetIdCache);
|
|
}
|
|
|
|
Setuped = true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// **********************************************************************************
|
|
bool CDBGroupListAscensor::CSheetChildAscensor::isSheetValid(CDBGroupListSheetText * /* pFather */)
|
|
{
|
|
if (!Ctrl) return false;
|
|
return Ctrl->getSheetId() != 0;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
// CDBObs
|
|
// ***************************************************************************
|
|
|
|
// ***************************************************************************
|
|
void CGuildManager::CDBObs::update(ICDBNode* /* node */)
|
|
{
|
|
CGuildManager *pGM = CGuildManager::getInstance();
|
|
pGM->rebuildBasic();
|
|
}
|
|
|
|
void CGuildManager::CDBObsMembers::update(ICDBNode* /* node */)
|
|
{
|
|
CGuildManager *pGM = CGuildManager::getInstance();
|
|
pGM->rebuildBasicAndMembers();
|
|
}
|
|
|
|
// ***************************************************************************
|
|
// ACTION HANDLERS
|
|
// ***************************************************************************
|
|
|
|
// ***************************************************************************
|
|
class CAHGuildSheetOpen : public IActionHandler
|
|
{
|
|
virtual void execute (CCtrlBase * /* pCaller */, const string &Params)
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
CGuildManager *pGM = CGuildManager::getInstance();
|
|
bool updateMembers= getParam(Params, "update_members")=="1";
|
|
|
|
|
|
// *** Update interface with data of Guild Manager
|
|
const SGuild &rGuild = pGM->getGuild();
|
|
|
|
// Freeze / unfreeze quit button
|
|
CCtrlBaseButton *control = dynamic_cast<CCtrlBaseButton*>(pIM->getElementFromId(VIEW_TEXT_GUILD_QUIT));
|
|
if (control)
|
|
control->setFrozen (!rGuild.QuitGuildAvailable || pGM->isProxy());
|
|
|
|
|
|
// *** Update Members, if necessary
|
|
if(updateMembers)
|
|
{
|
|
CGuildManager::TSortOrder order = (CGuildManager::TSortOrder)(pIM->getDbProp("UI:SAVE:GUILD_LIST:SORT_ORDER")->getValue32());
|
|
// Sort the members in Guild Manager
|
|
pGM->sortGuildMembers(order);
|
|
|
|
// update member count view
|
|
const vector<SGuildMember> &rGuildMembers = pGM->getGuildMembers();
|
|
CViewText *pVT = dynamic_cast<CViewText*>(pIM->getElementFromId(VIEW_TEXT_GUILD_MEMBER_COUNT));
|
|
if (pVT)
|
|
pVT->setText(toString(rGuildMembers.size()));
|
|
|
|
// rebuild guild member list
|
|
CGroupList *pParent = dynamic_cast<CGroupList*>(pIM->getElementFromId(LIST_GUILD_MEMBERS));
|
|
if (pParent == NULL) return;
|
|
pParent->clearGroups();
|
|
pParent->setDynamicDisplaySize(false);
|
|
for (uint i = 0; i < rGuildMembers.size(); i++)
|
|
{
|
|
// create the member line
|
|
string templateId = LIST_GUILD_MEMBERS ":m" + toString(i);
|
|
vector< pair<string, string> > vParams;
|
|
vParams.push_back(vector< pair<string, string> >::value_type("id", templateId));
|
|
CInterfaceGroup *pLine = NULL;
|
|
pLine = pIM->createGroupInstance (TEMPLATE_GUILD_MEMBER, LIST_GUILD_MEMBERS, vParams);
|
|
if (pLine == NULL) continue;
|
|
|
|
// Set name
|
|
CViewText *pViewName = dynamic_cast<CViewText*>(pLine->getView(TEMPLATE_GUILD_MEMBER_NAME));
|
|
if (pViewName != NULL)
|
|
pViewName->setText (rGuildMembers[i].Name);
|
|
|
|
// Set Grade
|
|
CViewText *pViewGrade = dynamic_cast<CViewText*>(pLine->getView(TEMPLATE_GUILD_MEMBER_GRADE));
|
|
if (pViewGrade != NULL)
|
|
{
|
|
if (rGuildMembers[i].Grade == EGSPD::CGuildGrade::Leader)
|
|
pViewGrade->setText (CI18N::get("uiGuildLeader"));
|
|
else if (rGuildMembers[i].Grade == EGSPD::CGuildGrade::HighOfficer)
|
|
pViewGrade->setText (CI18N::get("uiGuildHighOfficer"));
|
|
else if (rGuildMembers[i].Grade == EGSPD::CGuildGrade::Officer)
|
|
pViewGrade->setText (CI18N::get("uiGuildOfficer"));
|
|
else
|
|
pViewGrade->setText (CI18N::get("uiGuildMember"));
|
|
}
|
|
|
|
// online?
|
|
CViewBitmap *onlineView = dynamic_cast<CViewBitmap*>(pLine->getView("online"));
|
|
if (onlineView != NULL)
|
|
{
|
|
CCtrlBase *toolTip = pLine->getCtrl("tt_online");
|
|
|
|
switch(rGuildMembers[i].Online)
|
|
{
|
|
case ccs_online:
|
|
onlineView->setTexture("w_online.tga");
|
|
if (toolTip)
|
|
toolTip->setDefaultContextHelp(CI18N::get("uittGuildMemberOnline"));
|
|
break;
|
|
case ccs_online_abroad:
|
|
onlineView->setTexture("w_online_abroad.tga");
|
|
if (toolTip)
|
|
toolTip->setDefaultContextHelp(CI18N::get("uittGuildMemberOnlineAbroad"));
|
|
break;
|
|
default:
|
|
onlineView->setTexture("w_offline.tga");
|
|
if (toolTip)
|
|
toolTip->setDefaultContextHelp(CI18N::get("uittGuildMemberOffline"));
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Enter Date
|
|
CViewText *pViewEnterDate = dynamic_cast<CViewText*>(pLine->getView(TEMPLATE_GUILD_MEMBER_ENTER_DATE));
|
|
if (pViewEnterDate != NULL)
|
|
{
|
|
CRyzomTime rt;
|
|
rt.updateRyzomClock(rGuildMembers[i].EnterDate);
|
|
ucstring str = toString("%04d", rt.getRyzomYear()) + " ";
|
|
str += CI18N::get("uiJenaYear") + " : ";
|
|
str += CI18N::get("uiAtysianCycle") + " ";
|
|
str += toString("%01d", rt.getRyzomCycle()+1) +", ";
|
|
str += CI18N::get("ui"+MONTH::toString( (MONTH::EMonth)rt.getRyzomMonthInCurrentCycle() )) + ", ";
|
|
str += toString("%02d", rt.getRyzomDayOfMonth()+1);
|
|
pViewEnterDate->setText(str);
|
|
}
|
|
|
|
// Add to the list
|
|
pLine->setParent (pParent);
|
|
pParent->addChild (pLine);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
REGISTER_ACTION_HANDLER (CAHGuildSheetOpen, "guild_sheet_open");
|
|
|
|
// ***************************************************************************
|
|
static void setRights(bool lead, bool hioff, bool offi, bool recr, bool bear, bool memb, bool kick)
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
CViewTextMenu *pVTM;
|
|
pVTM = dynamic_cast<CViewTextMenu*>(pIM->getElementFromId(string(MENU_GUILD_MEMBER":lead")));
|
|
if (pVTM != NULL) pVTM->setGrayed(!lead);
|
|
pVTM = dynamic_cast<CViewTextMenu*>(pIM->getElementFromId(string(MENU_GUILD_MEMBER":hiof")));
|
|
if (pVTM != NULL) pVTM->setGrayed(!hioff);
|
|
pVTM = dynamic_cast<CViewTextMenu*>(pIM->getElementFromId(string(MENU_GUILD_MEMBER":offi")));
|
|
if (pVTM != NULL) pVTM->setGrayed(!offi);
|
|
pVTM = dynamic_cast<CViewTextMenu*>(pIM->getElementFromId(string(MENU_GUILD_MEMBER":recr")));
|
|
if (pVTM != NULL) pVTM->setGrayed(!recr);
|
|
pVTM = dynamic_cast<CViewTextMenu*>(pIM->getElementFromId(string(MENU_GUILD_MEMBER":bear")));
|
|
if (pVTM != NULL) pVTM->setGrayed(!bear);
|
|
pVTM = dynamic_cast<CViewTextMenu*>(pIM->getElementFromId(string(MENU_GUILD_MEMBER":memb")));
|
|
if (pVTM != NULL) pVTM->setGrayed(!memb);
|
|
pVTM = dynamic_cast<CViewTextMenu*>(pIM->getElementFromId(string(MENU_GUILD_MEMBER":kick")));
|
|
if (pVTM != NULL) pVTM->setGrayed(!kick);
|
|
}
|
|
|
|
// ***************************************************************************
|
|
class CAHGuildSheetMenuOpen : public IActionHandler
|
|
{
|
|
virtual void execute (CCtrlBase *pCaller, const string &/* Params */)
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
CGuildManager *pGM = CGuildManager::getInstance();
|
|
const vector<SGuildMember> &rGuildMembers = pGM->getGuildMembers();
|
|
|
|
// *** Check and retrieve the current member index (index in the member list)
|
|
CCtrlBase *ctrlLaunchingModal= pIM->getCtrlLaunchingModal();
|
|
if (pCaller == NULL || ctrlLaunchingModal == NULL)
|
|
{
|
|
// Error -> Close
|
|
pIM->disableModalWindow();
|
|
return;
|
|
}
|
|
string sId = ctrlLaunchingModal->getId();
|
|
sId = sId.substr(sId.rfind('m')+1,sId.size());
|
|
sint32 nLineNb;
|
|
fromString(sId, nLineNb);
|
|
if ((nLineNb < 0) || (nLineNb >= (sint32)rGuildMembers.size()))
|
|
{
|
|
// Error -> Close
|
|
pIM->disableModalWindow();
|
|
return;
|
|
}
|
|
MemberIndexSelected= nLineNb;
|
|
MemberNameSelected= rGuildMembers[nLineNb].Name;
|
|
|
|
// If the member is not yet received, do not allow any operation
|
|
if(MemberNameSelected.empty())
|
|
{
|
|
// Error -> Close
|
|
pIM->disableModalWindow();
|
|
return;
|
|
}
|
|
|
|
// *** Check with the grade of the local player which types of actions we can do on the player selected
|
|
|
|
// enable or disable menu entries
|
|
if (pGM->isProxy())
|
|
{
|
|
// no action allowed on proxy guild
|
|
setRights(false, false, false, false, false, false, false);
|
|
}
|
|
else
|
|
{
|
|
// Depending on the grade we can do things or other
|
|
|
|
// Grade less or equal can't do anything
|
|
if (pGM->getGrade() >= rGuildMembers[nLineNb].Grade)
|
|
setRights(false, false, false, false, false, false, false);
|
|
else if (pGM->getGrade() == EGSPD::CGuildGrade::Leader)
|
|
setRights(true, true, true, true, true, true, true);
|
|
else if (pGM->getGrade() == EGSPD::CGuildGrade::HighOfficer)
|
|
setRights(false, false, true, true, true, true, true);
|
|
else if (pGM->getGrade() == EGSPD::CGuildGrade::Officer)
|
|
setRights(false, false, false, false, true, true, true);
|
|
else
|
|
setRights(false, false, false, false, false, false, false);
|
|
}
|
|
}
|
|
|
|
public:
|
|
// Current selection
|
|
static sint32 MemberIndexSelected; // Index of the member selected when right clicked
|
|
static ucstring MemberNameSelected; // Name of the member selected when right clicked (for extra check)
|
|
};
|
|
REGISTER_ACTION_HANDLER (CAHGuildSheetMenuOpen, "guild_member_menu_open");
|
|
|
|
sint32 CAHGuildSheetMenuOpen::MemberIndexSelected= -1;
|
|
ucstring CAHGuildSheetMenuOpen::MemberNameSelected;
|
|
|
|
|
|
// ***************************************************************************
|
|
// Use the control launching modal to know the text to send to the server
|
|
static void sendMsgSetGrade(EGSPD::CGuildGrade::TGuildGrade Grade)
|
|
{
|
|
const string &message = "GUILD:SET_GRADE";
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
CGuildManager *pGM = CGuildManager::getInstance();
|
|
const vector<SGuildMember> &rGuildMembers = pGM->getGuildMembers();
|
|
|
|
// check the member selected is still valid
|
|
sint32 MemberNb= CAHGuildSheetMenuOpen::MemberIndexSelected;
|
|
if ((MemberNb < 0) || (MemberNb >= (sint32)rGuildMembers.size())) return;
|
|
// double check the name (in case of some change in the guild members list)
|
|
if(rGuildMembers[MemberNb].Name != CAHGuildSheetMenuOpen::MemberNameSelected)
|
|
return;
|
|
|
|
// Ok! let's send the message!
|
|
CBitMemStream out;
|
|
if(GenericMsgHeaderMngr.pushNameToStream(message, out))
|
|
{
|
|
uint16 u16MemberNb = (uint16)rGuildMembers[MemberNb].Index;
|
|
out.serial(u16MemberNb);
|
|
uint8 u8Grade = Grade;
|
|
out.serial(u8Grade);
|
|
uint8 u8Counter = (uint8)pIM->getDbProp("SERVER:GUILD:COUNTER")->getValue8();
|
|
out.serial(u8Counter);
|
|
NetMngr.push(out);
|
|
//nlinfo("impulseCallBack : %s %d %d %d sent", message.c_str(), u16MemberNb, u8Grade, u8Counter);
|
|
}
|
|
else
|
|
{
|
|
nlwarning("<CHandlerAcceptExchange::execute> unknown message name '%s'", message.c_str());
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
// Sort the guild member list
|
|
class CAHGuildSheetSortGuildList : public IActionHandler
|
|
{
|
|
public:
|
|
void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */)
|
|
{
|
|
CInterfaceManager* pIM= CInterfaceManager::getInstance();
|
|
CGuildManager::TSortOrder order = (CGuildManager::TSortOrder)(pIM->getDbProp("UI:SAVE:GUILD_LIST:SORT_ORDER")->getValue32());
|
|
|
|
order = (CGuildManager::TSortOrder)(order + 1);
|
|
if (order == CGuildManager::END_SORT_ORDER)
|
|
{
|
|
order = CGuildManager::START_SORT_ORDER;
|
|
}
|
|
|
|
pIM->getDbProp("UI:SAVE:GUILD_LIST:SORT_ORDER")->setValue32((sint32)order);
|
|
pIM->runActionHandler("guild_sheet_open", NULL, toString("update_members=1"));
|
|
}
|
|
};
|
|
REGISTER_ACTION_HANDLER(CAHGuildSheetSortGuildList, "sort_guild_list");
|
|
|
|
// ***************************************************************************
|
|
// Invoke the 'tell' command on a contact from its menu
|
|
// The tell command is displayed in the 'around me' window
|
|
class CAHGuildSheetTellMember : public IActionHandler
|
|
{
|
|
public:
|
|
void execute (CCtrlBase * pCaller, const std::string &/* sParams */)
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
CGuildManager *pGM = CGuildManager::getInstance();
|
|
const vector<SGuildMember> &rGuildMembers = pGM->getGuildMembers();
|
|
// *** Check and retrieve the current member index (index in the member list)
|
|
CCtrlBase *ctrlLaunchingModal= pIM->getCtrlLaunchingModal();
|
|
if (pCaller == NULL)
|
|
{
|
|
// Error -> Close
|
|
return;
|
|
}
|
|
string sId = pCaller->getId();
|
|
sId = sId.substr(sId.rfind('m')+1,sId.size());
|
|
sint32 nLineNb;
|
|
fromString(sId, nLineNb);
|
|
if ((nLineNb < 0) || (nLineNb >= (sint32)rGuildMembers.size()))
|
|
{
|
|
// Error -> Close
|
|
return;
|
|
}
|
|
MemberIndexSelected= nLineNb;
|
|
MemberNameSelected = rGuildMembers[nLineNb].Name;
|
|
|
|
CPeopleInterraction::displayTellInMainChat(MemberNameSelected);
|
|
}
|
|
|
|
// Current selection
|
|
static sint32 MemberIndexSelected; // Index of the member selected when left clicked
|
|
static ucstring MemberNameSelected; // Name of the member selected when lef clicked
|
|
};
|
|
REGISTER_ACTION_HANDLER(CAHGuildSheetTellMember, "guild_tell_member");
|
|
|
|
sint32 CAHGuildSheetTellMember::MemberIndexSelected= -1;
|
|
ucstring CAHGuildSheetTellMember::MemberNameSelected;
|
|
|
|
// ***************************************************************************
|
|
class CAHGuildSheetSetLeader : public IActionHandler
|
|
{
|
|
virtual void execute (CCtrlBase * /* pCaller */, const string &/* Params */)
|
|
{
|
|
sendMsgSetGrade(EGSPD::CGuildGrade::Leader);
|
|
}
|
|
};
|
|
REGISTER_ACTION_HANDLER (CAHGuildSheetSetLeader, "guild_member_chg_to_leader");
|
|
|
|
// ***************************************************************************
|
|
class CAHGuildSheetSetHighOfficer : public IActionHandler
|
|
{
|
|
virtual void execute (CCtrlBase * /* pCaller */, const string &/* Params */)
|
|
{
|
|
sendMsgSetGrade(EGSPD::CGuildGrade::HighOfficer);
|
|
}
|
|
};
|
|
REGISTER_ACTION_HANDLER (CAHGuildSheetSetHighOfficer, "guild_member_chg_to_high_officer");
|
|
|
|
// ***************************************************************************
|
|
class CAHGuildSheetSetOfficer : public IActionHandler
|
|
{
|
|
virtual void execute (CCtrlBase * /* pCaller */, const string &/* Params */)
|
|
{
|
|
sendMsgSetGrade(EGSPD::CGuildGrade::Officer);
|
|
}
|
|
};
|
|
REGISTER_ACTION_HANDLER (CAHGuildSheetSetOfficer, "guild_member_chg_to_officer");
|
|
|
|
// ***************************************************************************
|
|
class CAHGuildSheetSetRecruiter : public IActionHandler
|
|
{
|
|
virtual void execute (CCtrlBase * /* pCaller */, const string &/* Params */)
|
|
{
|
|
//sendMsgSetGrade(EGSPD::CGuildGrade::Recruiter);
|
|
}
|
|
};
|
|
REGISTER_ACTION_HANDLER (CAHGuildSheetSetRecruiter, "guild_member_chg_to_recruiter");
|
|
|
|
// ***************************************************************************
|
|
class CAHGuildSheetSetBearer : public IActionHandler
|
|
{
|
|
virtual void execute (CCtrlBase * /* pCaller */, const string &/* Params */)
|
|
{
|
|
//sendMsgSetGrade(EGSPD::CGuildGrade::Bearer);
|
|
}
|
|
};
|
|
REGISTER_ACTION_HANDLER (CAHGuildSheetSetBearer, "guild_member_chg_to_bearer");
|
|
|
|
// ***************************************************************************
|
|
class CAHGuildSheetSetMember : public IActionHandler
|
|
{
|
|
virtual void execute (CCtrlBase * /* pCaller */, const string &/* Params */)
|
|
{
|
|
sendMsgSetGrade(EGSPD::CGuildGrade::Member);
|
|
}
|
|
};
|
|
REGISTER_ACTION_HANDLER (CAHGuildSheetSetMember, "guild_member_chg_to_member");
|
|
|
|
// ***************************************************************************
|
|
class CAHGuildSheetKick : public IActionHandler
|
|
{
|
|
virtual void execute (CCtrlBase * /* pCaller */, const string &/* Params */)
|
|
{
|
|
const string &message = "GUILD:KICK_MEMBER";
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
CGuildManager *pGM = CGuildManager::getInstance();
|
|
const vector<SGuildMember> &rGuildMembers = pGM->getGuildMembers();
|
|
|
|
// check the member selected is still valid
|
|
sint32 MemberNb= CAHGuildSheetMenuOpen::MemberIndexSelected;
|
|
if ((MemberNb < 0) || (MemberNb >= (sint32)rGuildMembers.size())) return;
|
|
// double check the name (in case of some change in the guild members list)
|
|
if(rGuildMembers[MemberNb].Name != CAHGuildSheetMenuOpen::MemberNameSelected)
|
|
return;
|
|
|
|
// Ok! let's send the message!
|
|
CBitMemStream out;
|
|
if(GenericMsgHeaderMngr.pushNameToStream(message, out))
|
|
{
|
|
uint16 u16MemberNb = (uint16)rGuildMembers[MemberNb].Index;
|
|
out.serial(u16MemberNb);
|
|
uint8 u8Counter = (uint8)pIM->getDbProp("SERVER:GUILD:COUNTER")->getValue8();
|
|
out.serial(u8Counter);
|
|
NetMngr.push(out);
|
|
//nlinfo("impulseCallBack : %s %d %d sent", message.c_str(), u16MemberNb, u8Counter);
|
|
}
|
|
else
|
|
{
|
|
nlwarning("<CHandlerAcceptExchange::execute> unknown message name '%s'", message.c_str());
|
|
}
|
|
}
|
|
};
|
|
REGISTER_ACTION_HANDLER (CAHGuildSheetKick, "guild_member_kick");
|
|
|
|
// ***************************************************************************
|
|
class CHandlerAscensorTeleport : public IActionHandler
|
|
{
|
|
virtual void execute (CCtrlBase *pCaller, const string &/* Params */)
|
|
{
|
|
CDBCtrlSheet *ctrlSheet = dynamic_cast<CDBCtrlSheet *>(pCaller);
|
|
if (!ctrlSheet) return;
|
|
|
|
uint16 nTeleportLocation = ctrlSheet->getIndexInParent();
|
|
|
|
const string msgName = "GUILD:TELEPORT";
|
|
CBitMemStream out;
|
|
if(GenericMsgHeaderMngr.pushNameToStream(msgName, out))
|
|
{
|
|
out.serial( nTeleportLocation );
|
|
NetMngr.push(out);
|
|
|
|
// Last teleport is an elevator
|
|
LoadingBackground = ElevatorBackground;
|
|
}
|
|
//nlinfo("impulseCallBack : GUILD:TELEPORT %d sent", nTeleportLocation);
|
|
}
|
|
};
|
|
REGISTER_ACTION_HANDLER (CHandlerAscensorTeleport, "ascensor_teleport");
|
|
|
|
/*
|
|
// ***************************************************************************
|
|
class CHandlerInvGuildToBag : public IActionHandler
|
|
{
|
|
virtual void execute (CCtrlBase *pCaller, const string &Params)
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
CDBCtrlSheet *pCSDst = dynamic_cast<CDBCtrlSheet*>(pCaller);
|
|
if (!pCSDst->isSheetValid()) return;
|
|
string sTmp = pCSDst->getSheet();
|
|
|
|
CCDBNodeLeaf *pNL = pIM->getDbProp(sTmp+":SHEET",false);
|
|
CCDBNodeLeaf *pNLquantity = pIM->getDbProp(sTmp+":QUANTITY",false);
|
|
if (pNL == NULL) return;
|
|
if (pNLquantity == NULL) return;
|
|
|
|
sTmp = sTmp.substr(sTmp.rfind(':')+1, sTmp.size());
|
|
uint8 GuildIndex;
|
|
fromString(sTmp, GuildIndex);
|
|
|
|
CInventoryManager *pInv = CInventoryManager::getInstance();
|
|
uint32 quantity = pNLquantity->getValue32();
|
|
double totalBulk = quantity * pInv->getItemBulk(pNL->getValue32());
|
|
|
|
// Only check with the bag for the moment
|
|
|
|
bool bPlaceFound = false;
|
|
if (pInv->isInventoryAvailable(INVENTORIES::bag))
|
|
if ((pInv->getBagBulk(0) + totalBulk) <= pInv->getMaxBagBulk(0))
|
|
bPlaceFound = true;
|
|
|
|
if (!bPlaceFound)
|
|
{
|
|
ucstring msg = CI18N::get("msgCantPutItemInBag");
|
|
string cat = getStringCategory(msg, msg);
|
|
pIM->displaySystemInfo(msg, cat);
|
|
return;
|
|
}
|
|
// Look for a free entry in the bag
|
|
bPlaceFound = false;
|
|
uint8 BagIndex;
|
|
for (uint32 i = 0; i < MAX_BAGINV_ENTRIES; ++i)
|
|
{
|
|
if (getInventory().getBagItem(i).getSheetID() == 0)
|
|
{
|
|
BagIndex = (uint8)i;
|
|
bPlaceFound = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!bPlaceFound) return;
|
|
|
|
uint16 Session = pIM->getDbProp("SERVER:GUILD:INVENTORY:SESSION")->getValue16();
|
|
|
|
CBitMemStream out;
|
|
const string sMsg = "GUILD:GUILD_TO_BAG";
|
|
if (!GenericMsgHeaderMngr.pushNameToStream(sMsg, out))
|
|
{
|
|
nlwarning ("don't know message name %s", sMsg.c_str());
|
|
}
|
|
else
|
|
{
|
|
// Fill the message (temporary inventory slot)
|
|
out.serial(GuildIndex);
|
|
out.serial(Session);
|
|
NetMngr.push (out);
|
|
nlinfo("impulseCallBack : %s %d %d sent", sMsg.c_str(), GuildIndex, Session);
|
|
}
|
|
}
|
|
};
|
|
REGISTER_ACTION_HANDLER (CHandlerInvGuildToBag, "inv_guild_to_bag");
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
class CHandlerInvBagToGuild : public IActionHandler
|
|
{
|
|
virtual void execute (CCtrlBase *pCaller, const string &Params)
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
|
|
CDBCtrlSheet *pCS = dynamic_cast<CDBCtrlSheet*>(pCaller);
|
|
string sTmp = pCS->getSheet();
|
|
sTmp = sTmp.substr(sTmp.rfind(':')+1, sTmp.size());
|
|
uint8 BagIndex;
|
|
fromString(sTmp, BagIndex);
|
|
|
|
uint16 Session = pIM->getDbProp("SERVER:GUILD:INVENTORY:SESSION")->getValue16();
|
|
|
|
CBitMemStream out;
|
|
const string sMsg = "GUILD:BAG_TO_GUILD";
|
|
if (!GenericMsgHeaderMngr.pushNameToStream(sMsg, out))
|
|
{
|
|
nlwarning ("don't know message name %s", sMsg.c_str());
|
|
}
|
|
else
|
|
{
|
|
// Fill the message (temporary inventory slot)
|
|
out.serial(BagIndex);
|
|
out.serial(Session);
|
|
NetMngr.push (out);
|
|
nlinfo("impulseCallBack : %s %d %d sent", sMsg.c_str(), BagIndex, Session);
|
|
}
|
|
}
|
|
};
|
|
REGISTER_ACTION_HANDLER (CHandlerInvBagToGuild, "inv_bag_to_guild");
|
|
*/
|
|
|
|
// ***************************************************************************
|
|
static void sendMoneyServerMessage(const string &sMsg)
|
|
{
|
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
uint64 nMoney = pIM->getDbProp("UI:VARIABLES:CHOOSE_MONEY")->getValue64();
|
|
uint16 Session = pIM->getDbProp("SERVER:GUILD:INVENTORY:SESSION")->getValue16();
|
|
CBitMemStream out;
|
|
if (!GenericMsgHeaderMngr.pushNameToStream(sMsg, out))
|
|
{
|
|
nlwarning ("don't know message name %s", sMsg.c_str());
|
|
}
|
|
else
|
|
{
|
|
// Fill the message (temporary inventory slot)
|
|
out.serial(nMoney);
|
|
out.serial(Session);
|
|
NetMngr.push (out);
|
|
//nlinfo("impulseCallBack : %s %d %d sent", sMsg.c_str(), nMoney, Session);
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
class CHandlerGuildInvGetMoney : public IActionHandler
|
|
{
|
|
virtual void execute (CCtrlBase * /* pCaller */, const string &/* Params */)
|
|
{
|
|
sendMoneyServerMessage("GUILD:TAKE_MONEY");
|
|
CInterfaceManager::getInstance()->popModalWindow();
|
|
}
|
|
};
|
|
REGISTER_ACTION_HANDLER (CHandlerGuildInvGetMoney, "guild_inv_get_money");
|
|
|
|
|
|
// ***************************************************************************
|
|
class CHandlerGuildInvPutMoney : public IActionHandler
|
|
{
|
|
virtual void execute (CCtrlBase * /* pCaller */, const string &/* Params */)
|
|
{
|
|
sendMoneyServerMessage("GUILD:PUT_MONEY");
|
|
CInterfaceManager::getInstance()->popModalWindow();
|
|
}
|
|
};
|
|
REGISTER_ACTION_HANDLER (CHandlerGuildInvPutMoney, "guild_inv_put_money");
|