[Release]GM Online Liste per Source

03/05/2015 09:56 .Sanii#1
Hey, hatte vor ein paar Tagen mal wieder diesen Thread gesehen:
[Only registered and activated users can see links. Click Here To Register...]

Und ich dachte mir, versuchst du mal das per Source zu regeln. Et viola, meine geringen C++ Kentnisse haben ausgereicht mir ein wenig Hilfe von Inya.

Also fangen wir an:

Python:
Befolgt Schritt 6 bis 10 aus dem anderem Thread damit ihr die Group im Messenger Window habt.

Bei Schritt 9. unter
Code:
self.SetName("Symeria2-Teamler")
könnt ihr euren Messengergruppenname ändern. Ich persönlich würde einfach "Team" reinschreiben.


Serversource:

Ihr öffnet die "messenger_manager.cpp" und sucht nach:

Code:
void MessengerManager::SendLogin(MessengerManager::keyA account, MessengerManager::keyA companion)
und Kommentiert/Löscht das aus:
Code:
if (ch->GetGMLevel() == GM_PLAYER && gm_get_level(companion.c_str(),0,0) != GM_PLAYER)
		return;
Das muss getan werden damit auch ein Spieler über "GM_PLAYER" ein Login sendet.

Weiter gehts mit:
Code:
void MessengerManager::Login(MessengerManager::keyA account)
Die gesamte Funktion ersetzt ihr hiermit:
Code:
void MessengerManager::Login(MessengerManager::keyA account)
{
	if (m_set_loginAccount.find(account) != m_set_loginAccount.end())
		return;

	SQLMsg* msg;
	msg = DBManager::instance().DirectQuery("SELECT mName FROM common.gmlist%s", get_table_postfix());
	if(msg->uiSQLErrno != 0) {
		return;
	}
	MYSQL_ROW row;
	while ((row = mysql_fetch_row(msg->Get()->pSQLResult))) {
		m_Relation[account.c_str()].insert(row[0]);
	};

	DBManager::instance().FuncQuery(std::bind1st(std::mem_fun(&MessengerManager::LoadList), this),
			"SELECT account, companion FROM messenger_list%s WHERE account='%s'", get_table_postfix(), account.c_str());


	m_set_loginAccount.insert(account);

	SendList(account.c_str());

	if (std::string(account)[0] == '[')
	{
		for (std::set<keyT>::iterator it = m_set_loginAccount.begin(); it != m_set_loginAccount.end(); ++it)
		{
			  SendLogin(*it, account);
		}
	}
}
Code:
void MessengerManager::Logout(MessengerManager::keyA account)
Komplett ersetzen mit:
Code:
void MessengerManager::Logout(MessengerManager::keyA account)
{
	if (m_set_loginAccount.find(account) == m_set_loginAccount.end())
		return;

	m_set_loginAccount.erase(account);

	std::set<MessengerManager::keyT>::iterator it;

	for (it = m_InverseRelation[account].begin(); it != m_InverseRelation[account].end(); ++it)
	{
		SendLogout(*it, account);
	}

	if (std::string(account)[0] == '[')
	{
		for (std::set<keyT>::iterator it = m_set_loginAccount.begin(); it != m_set_loginAccount.end(); ++it)
		{
			  SendLogout(*it, account);
		}
	}

	std::map<keyT, std::set<keyT> >::iterator it2 = m_Relation.begin();

	while (it2 != m_Relation.end())
	{
		it2->second.erase(account);
		++it2;
	}

	m_Relation.erase(account);
	//m_map_stMobile.erase(account);
}
Nun geht ihr in die
Code:
void MessengerManager::LoadList(SQLMsg * msg)
direkt unter der "Login" Funktion und löscht dort das:
Code:
SendList(account);
Dieses SendList ist nun nämlich mit in der Login drin.


Mit dem was ihr jetzt hinzugefügt habt, wird die gesamte "gmlist" an eure m_Relation angehängt (ergo. "Beziehungen").

Clientsource:

Ihr öffnet die "PythonNetworkSteamPhaseGame.cpp" und sucht nach:
Code:
if (on.connected & MESSENGER_CONNECTED_STATE_ONLINE)
Ihr ersetzt:
Code:
				if (on.connected & MESSENGER_CONNECTED_STATE_ONLINE)
				{
					CPythonMessenger::Instance().OnFriendLogin(char_name);
				}
				else
				{
					CPythonMessenger::Instance().OnFriendLogout(char_name);
				}
durch

Code:
				if (on.connected & MESSENGER_CONNECTED_STATE_ONLINE)
				{
					if (char_name[0] == '[')
					{
						CPythonMessenger::Instance().OnGamemasterLogin(char_name);
					}
					else
					{
						CPythonMessenger::Instance().OnFriendLogin(char_name);
					}
				}
				else
				{
					if (char_name[0] == '[')
					{
						CPythonMessenger::Instance().OnGamemasterLogout(char_name);
					}
					else
					{
						CPythonMessenger::Instance().OnFriendLogout(char_name);
					}
				}
Weiter gehts.
Ihr sucht nach
Code:
		case MESSENGER_SUBHEADER_GC_LOGIN:
und macht aus
Code:
CPythonMessenger::Instance().OnFriendLogin(char_name);
Code:
			if (char_name[0] == '[')
			{
				CPythonMessenger::Instance().OnGamemasterLogin(char_name);
			}
			else
			{
				CPythonMessenger::Instance().OnFriendLogin(char_name);
			}
Das selbe bei
Code:
		case MESSENGER_SUBHEADER_GC_LOGOUT:
Dort
Code:
CPythonMessenger::Instance().OnFriendLogout(char_name);
durch
Code:
			if (char_name[0] == '[')
			{
				CPythonMessenger::Instance().OnGamemasterLogout(char_name);
			}
			else
			{
				CPythonMessenger::Instance().OnFriendLogout(char_name);
			}
ersetzen.


Öffnet die "PythonMessenger.cpp" und sucht:
Code:
void CPythonMessenger::OnFriendLogout(const char * c_szKey)
darunter fügt ihr das hinzu:
Code:
void CPythonMessenger::OnGamemasterLogin(const char * c_szKey/*, const char * c_szName*/)
{
	m_GamemasterNameMap.insert(c_szKey);

	if (m_poMessengerHandler)
		PyCallClassMemberFunc(m_poMessengerHandler, "OnLogin", Py_BuildValue("(is)", MESSENGER_GRUOP_INDEX_GM, c_szKey));
}

void CPythonMessenger::OnGamemasterLogout(const char * c_szKey)
{
	m_GamemasterNameMap.insert(c_szKey);

	if (m_poMessengerHandler)
		PyCallClassMemberFunc(m_poMessengerHandler, "OnLogout", Py_BuildValue("(is)", MESSENGER_GRUOP_INDEX_GM, c_szKey));
}
Nun die "PythonMessnger.h" öffnen und suchen:
Code:
MESSENGER_GRUOP_INDEX_GUILD,
darünter fügt ihr hinzu:
Code:
MESSENGER_GRUOP_INDEX_GM,
Nun noch ein ganz kleines Stück weiter unten bei:
Code:
void OnFriendLogout(const char * c_szKey);
noch das anhängen:

Code:
void OnGamemasterLogin(const char * c_szKey);
void OnGamemasterLogout(const char * c_szKey);

So das sollte eigendlich alles gewesen sein!
Wenn noch was fehlt oder failt einfach bescheid geben.

P.s: Ich weiß über die '[' zu Filtern ist nicht so cool, aber der einfachste weg. Bemängelt meinen Codestil ruhig, juckt mich nicht ihr ganzen Dr. Dipl. Professoren der Informatik hier.

Viel Spaß damit!

Danke an:
Inya für Hilfe beim Senden der Logins/Logouts
Symeria2 für den Python Teil
03/05/2015 10:39 .ViBeZ™#2
Nette Sache! :)
03/05/2015 11:39 .Marcel'#3
Quote:
P.s: Ich weiß über die '[' zu Filtern ist nicht so cool, aber der einfachste weg. Bemängelt meinen Codestil ruhig, juckt mich nicht ihr ganzen Dr. Dipl. Professoren der Informatik hier.
Du lässt also keienrlei Kritik zu ? Wie willst du dich dann verbessern ?
03/05/2015 11:48 .Sanii#4
Ich lasse Kritik sehrwohl zu, wenn sie angebracht und konstruktiv ist.

Das mit dem "dr. dipl. prof." war an die Leute gemeint, die alle immer gleich nieder machen, nur weil sie z.B :

Code:
if (respekt == 0)
	flame_like_a_vollidiot();
statt:

Code:
if (respekt == 0)
{
  flame_like_a_vollidiot();
}
machen. Mag sein, dass jeder seinen Codestil hat, Verbesserungsvorschläge sind immer gern gesehen, aber ich lese in zu viele Threads direkt geflame, dass ja alles viel besser geht etc. Hat ich einfach kein Turn drauf ^.^
03/05/2015 13:43 .Inya#5
So wir haben den Code mal etwas korrigiert, sollte jetzt funktionieren! :P
03/07/2015 16:34 galetlefrancais#6
"m_GamemasterNameMap" Is not defined :x
03/07/2015 17:06 xP3NG3Rx#7
You have to define it in pythonmessenger.h.

Find this:
Code:
typedef std::map<std::string, BYTE> TGuildMemberStateMap;
Add this under:
Code:
typedef std::map<std::string> TGamemasterNameMap;
Now search this:
Code:
TGuildMemberStateMap m_GuildMemberStateMap;
And define the new map:
Code:
TGamemasterNameMap m_GamemasterNameMap
That's all.
03/08/2015 16:44 SA_Yolo#8
Schon verbaut, vielen Dank.
03/10/2015 12:14 .Fr3zy94™#9
With no lag?
03/12/2015 16:47 galetlefrancais#10
Thanks xP3NG3Rx, I don't know why I don't do this.

Less lag than the actual lua check. ^^
03/12/2015 17:39 .Inya#11
Quote:
Originally Posted by Helpering View Post
With no lag?
It extends the friendlist system. So it shouldnt create any laggs
08/26/2015 21:51 thespeedyy#12
hab beim client compilen folgende fehler:
1 IntelliSense: Zu wenig Argumente für "Klassenvorlage "std::map"". c:\Server\client_source_clean\source\UserInterface \PythonMessenger.h 8

Fehler 2 error C2976: "std::map": Nicht genügend template-Argumente. c:\server\client_source_clean\source\userinterface \PythonMessenger.h 8
08/28/2015 02:33 thespeedyy#13
puuush
08/28/2015 03:35 #Kajo#14
Quote:
Originally Posted by thespeedyy View Post
hab beim client compilen folgende fehler:
1 IntelliSense: Zu wenig Argumente für "Klassenvorlage "std::map"". c:\Server\client_source_clean\source\UserInterface \PythonMessenger.h 8

Fehler 2 error C2976: "std::map": Nicht genügend template-Argumente. c:\server\client_source_clean\source\userinterface \PythonMessenger.h 8
hab gleichen fehler.
08/28/2015 10:43 Benhero#15
Ist daas nur bei mir so, oder gibt es auch bei anderen seit dem einbauen Probleme mit der normalen freundesliste?

Grüße