Jump to content

C++ - Joueurs en Ligne sous la MiniMap


Recommended Posts

  • Bot

Niveau requis Intermédiaire

Temps estimé : Entre 5 et 10 minutes

 

Réécriture by Xayah

 

Ce système vous permet de voir combien de joueurs sont connectés sur votre serveur, les informations sont affichées en dessous de la minimap.

 

Révélation

171526Sans-titre.jpg

 

Pré-requis:

  • Sources client
  • Sources serveur

 

I. Sources Client

Révélation

Ouvrez donc votre projet avec Visual Studio et ouvrez le fichier PythonNetworkStreamCommand.cpp présent UserInterface

Recherchez ce code :

	else if (!strcmpi(szCmd, "gift"))
	{
		PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "Gift_Show", Py_BuildValue("()")); 	
	}

Ajouter ceci en dessous :

	//JOUEURS EN LIGNE
	else if (!strcmpi(szCmd, "black"))
	{
		UINT black = atoi(TokenVector[1].c_str()); //toplam
		UINT sari = atoi(TokenVector[2].c_str());
		UINT kirmizi = atoi(TokenVector[3].c_str());
		UINT mavi = atoi(TokenVector[4].c_str());
		//elleme
		PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "oyuncu_black", Py_BuildValue("(iiii)", black, sari, kirmizi, mavi));
	}

 

Sauvegardez et compilez votre lanceur !

 

 

II. Sources Serveur

Révélation

 

A. Fichier desc_manager.cpp

Révélation

Recherchez donc cette fonction :


class FuncWho
{
	public:
		int iTotalCount;
		int aiEmpireUserCount[EMPIRE_MAX_NUM];

		FuncWho()
		{
			iTotalCount = 0;
			memset(aiEmpireUserCount, 0, sizeof(aiEmpireUserCount));
		}

		void operator() (LPDESC d)
		{
			if (d->GetCharacter())
			{
				++iTotalCount;
				++aiEmpireUserCount[d->GetEmpire()];
			}
		}
};

Remplacez la totalement par ceci :


class FuncWho
{
	public:
		int iTotalCount;
		int aiEmpireUserCount[EMPIRE_MAX_NUM];
		int toplam;
		int * Bayrak;
		int asdasdas;

		FuncWho()
		{
			iTotalCount = 0;
			memset(aiEmpireUserCount, 0, sizeof(aiEmpireUserCount));
		}

		void operator() (LPDESC d)
		{
			if (d->GetCharacter())
			{
				++iTotalCount;
				++aiEmpireUserCount[d->GetEmpire()];
				/**
				getusercount'dan getirmeseydim sadece bir kisi,
				icin guncellenecekti.Digerleri guncellenmeyecekti.
				Tecrubeyle sabit.
				*/
				DESC_MANAGER::instance().GetUserCount(toplam, &Bayrak, asdasdas);
				d->ChatPacket(CHAT_TYPE_COMMAND, "black %d %d %d %d", toplam, Bayrak[2], Bayrak[1], Bayrak[3]);
			}
		}
};

 

 

B. Fichier p2p.cpp

Révélation

Cherchez la fonction suivante :


void P2P_MANAGER::Login(LPDESC d, const TPacketGGLogin * p)
{
	CCI* pkCCI = Find(p->szName);

	bool UpdateP2P = false;

	if (NULL == pkCCI)
	{
		UpdateP2P = true;
		pkCCI = M2_NEW CCI;

		if (false == LC_IsBrazil())
			strlcpy(pkCCI->szName, p->szName, sizeof(pkCCI->szName));
		else
			trim_and_lower(p->szName, pkCCI->szName, sizeof(pkCCI->szName));

		pkCCI->dwPID = p->dwPID;
		pkCCI->bEmpire = p->bEmpire;

		if (p->bChannel == g_bChannel)
		{
			if (pkCCI->bEmpire < EMPIRE_MAX_NUM)
			{
				++m_aiEmpireUserCount[pkCCI->bEmpire];
			}
			else
			{
				sys_err("LOGIN_EMPIRE_ERROR: %d >= MAX(%d)", pkCCI->bEmpire, EMPIRE_MAX_NUM);
			}
		}

		m_map_pkCCI.insert(std::make_pair(pkCCI->szName, pkCCI));
		m_map_dwPID_pkCCI.insert(std::make_pair(pkCCI->dwPID, pkCCI));
	}

	pkCCI->lMapIndex = p->lMapIndex;
	pkCCI->pkDesc = d;
	pkCCI->bChannel = p->bChannel;
	sys_log(0, "P2P: Login %s", pkCCI->szName);

	CGuildManager::instance().P2PLoginMember(pkCCI->dwPID);
	CPartyManager::instance().P2PLogin(pkCCI->dwPID, pkCCI->szName);

	// CCI°¡ »ý¼º½Ã¿¡¸¸ ¸Þ½ÅÀú¸¦ ¾÷µ¥ÀÌÆ®ÇÏ¸é µÈ´Ù.
	if (UpdateP2P) {
		std::string name(pkCCI->szName);
	    MessengerManager::instance().P2PLogin(name);
	}
}

Remplacez la par ceci :


void P2P_MANAGER::Login(LPDESC d, const TPacketGGLogin * p)
{
	CCI* pkCCI = Find(p->szName);

	bool UpdateP2P = false;

	if (NULL == pkCCI)
	{
		UpdateP2P = true;
		pkCCI = M2_NEW CCI;

		if (false == LC_IsBrazil())
			strlcpy(pkCCI->szName, p->szName, sizeof(pkCCI->szName));
		else
			trim_and_lower(p->szName, pkCCI->szName, sizeof(pkCCI->szName));

		pkCCI->dwPID = p->dwPID;
		pkCCI->bEmpire = p->bEmpire;

		if (pkCCI->bEmpire < EMPIRE_MAX_NUM)
		{
			LPCHARACTER ch;
			++m_aiEmpireUserCount[pkCCI->bEmpire];
		}
		else
		{
			sys_err("LOGIN_EMPIRE_ERROR: %d >= MAX(%d)", pkCCI->bEmpire, EMPIRE_MAX_NUM);
		}

		m_map_pkCCI.insert(std::make_pair(pkCCI->szName, pkCCI));
		m_map_dwPID_pkCCI.insert(std::make_pair(pkCCI->dwPID, pkCCI));
	}

	pkCCI->lMapIndex = p->lMapIndex;
	pkCCI->pkDesc = d;
	pkCCI->bChannel = p->bChannel;
	sys_log(0, "P2P: Login %s", pkCCI->szName);

	CGuildManager::instance().P2PLoginMember(pkCCI->dwPID);
	CPartyManager::instance().P2PLogin(pkCCI->dwPID, pkCCI->szName);

	// CCI가 생성시에만 메신저를 업데이트하면 된다.
	if (UpdateP2P) {
		std::string name(pkCCI->szName);
	    MessengerManager::instance().P2PLogin(name);
	}
}

 

 

Ensuite cherchez la fonction suivante :


void P2P_MANAGER::Logout(CCI * pkCCI)
{
	if (pkCCI->bChannel == g_bChannel)
	{
		if (pkCCI->bEmpire < EMPIRE_MAX_NUM)
		{
			--m_aiEmpireUserCount[pkCCI->bEmpire];
			if (m_aiEmpireUserCount[pkCCI->bEmpire] < 0)
			{
				sys_err("m_aiEmpireUserCount[%d] < 0", pkCCI->bEmpire);
			}
		}
		else
		{
			sys_err("LOGOUT_EMPIRE_ERROR: %d >= MAX(%d)", pkCCI->bEmpire, EMPIRE_MAX_NUM);
		}
	}

Remplacez la par ceci :


void P2P_MANAGER::Logout(CCI * pkCCI)
{
		if (pkCCI->bEmpire < EMPIRE_MAX_NUM)
		{
			LPCHARACTER ch;
			--m_aiEmpireUserCount[pkCCI->bEmpire];
			if (m_aiEmpireUserCount[pkCCI->bEmpire] < 0)
			{
				sys_err("m_aiEmpireUserCount[%d] < 0", pkCCI->bEmpire);
			}
		}
		else
		{
			sys_err("LOGOUT_EMPIRE_ERROR: %d >= MAX(%d)", pkCCI->bEmpire, EMPIRE_MAX_NUM);
		}

	std::string name(pkCCI->szName);

	CGuildManager::instance().P2PLogoutMember(pkCCI->dwPID);
	CPartyManager::instance().P2PLogout(pkCCI->dwPID);
	MessengerManager::instance().P2PLogout(name);
	marriage::CManager::instance().Logout(pkCCI->dwPID);
	m_map_pkCCI.erase(name);
	m_map_dwPID_pkCCI.erase(pkCCI->dwPID);
	M2_DELETE(pkCCI);
}

 

 

C. Fichier main.cpp

Révélation

Recherchez cette fonction :


	if (!(pulse % (passes_per_sec * 5 + 2)))
	{
		ITEM_MANAGER::instance().Update();
		DESC_MANAGER::instance().UpdateLocalUserCount();
	}

Remplacez la fonction par ceci :


	if (!(pulse % (passes_per_sec + 1)))
	{
		ITEM_MANAGER::instance().Update();
		DESC_MANAGER::instance().UpdateLocalUserCount();
	}

 

 

Succès ! N'oubliez pas de compiler votre game !

 

 

 

III. Partie Client (Python)

Révélation

 

A. Fichier locale_game.txt (Locale_fr)

Révélation

Rendez-vous tout en bas de votre fichier et copiez-y ce code :


BLACK_ONLINE	|cff00CC00|Hemp|hJoueurs en ligne:|h|r
BLACK_SARI	|cffFDD017|H|hChunjo:|h|r
BLACK_KIRMIZI	|cffff0000|Hemp|hShinsoo:|h|r
Information. Vous pouvez changer le code couleur, il suffit de modifier les codes présents après "cff" , voici un site qui peut vous fournir des codes couleurs : HTML Color Codes

 

 

B. Fichier game.py (root)

Révélation

Cherchez la fonction suivante : 


	def BINARY_Cube_UpdateInfo(self, gold, itemVnum, count):
		self.interface.UpdateCubeInfo(gold, itemVnum, count)

Ajoutez ce code en dessous :


	def oyuncu_black(self, black, sari, kirmizi, mavi):
		#blackdragonx61
		self.interface.wndMiniMap.online_cok_hojdir_ama_benane(black, sari, kirmizi, mavi)

Sauvegardez !

 

C. Fichier uiminimap.py (root)

Révélation

Cherchez la fonction suivante :


			self.serverInfo = self.GetChild("ServerInfo")

Ajoutez ceci en dessous :


			self.mali	= self.GetChild("Toplam")
			self.sari	= self.GetChild("sari")
			self.kirmizi	= self.GetChild("kirmizi")
			self.mavi	= self.GetChild("mavi")

 

 

Ensuite, cherchez la fonction suivante :


def UpdateObserverCount(self, observerCount):
		if observerCount>0:
			self.observerCount.Show()
		elif observerCount<=0:
			self.observerCount.Hide()

		self.observerCount.SetText(localeInfo.MINIMAP_OBSERVER_COUNT % observerCount)

Placez ceci en dessous :


	def online_cok_hojdir_ama_benane(self, black, sari, kirmizi, mavi):	 	
		#blackdragonx61
		self.mali.Show()
		self.sari.Show()
		self.kirmizi.Show()
		self.mavi.Show()
		self.mali.SetText(localeInfo.BLACK_ONLINE + str(black))#Toplam
		self.sari.SetText(localeInfo.BLACK_SARI + str(sari))
		self.kirmizi.SetText(localeInfo.BLACK_KIRMIZI + str(kirmizi))
		self.mavi.SetText("|cff00ccffJinno:|h|r" + str(mavi))

 

Sauvegardez !

 

D. Fichier minimap.py (uiscript)

Révélation

Cherchez la fonction suivante :


				## ServerInfo
				{
					"name" : "ServerInfo",
					"type" : "text",
					
					"text_horizontal_align" : "center",

					"outline" : 1,

					"x" : 67,
					"y" : 165,

					"text" : "",
				},

Placez ceci en dessous :


{
					"name" : "Toplam",
					"type" : "text",
					
					"text_horizontal_align" : "center",

					"outline" : 1,

					"x" : 70,
					"y" : 180,

					"text" : "",
				},
				{
					"name" : "sari",
					"type" : "text",
					
					"text_horizontal_align" : "center",

					"outline" : 1,

					"x" : 70,
					"y" : 195,

					"text" : "",
				},
				{
					"name" : "kirmizi",
					"type" : "text",
					
					"text_horizontal_align" : "center",

					"outline" : 1,

					"x" : 70,
					"y" : 210,

					"text" : "",
				},
				{
					"name" : "mavi",
					"type" : "text",
					
					"text_horizontal_align" : "center",

					"outline" : 1,

					"x" : 70,
					"y" : 225,

					"text" : "",
				},

 

Sauvegardez !

 

 

Succès ! Vous pouvez désormais voir les joueurs en ligne en dessous de votre minimap !

 

 

Pour continuer :

Si vous avez un problème n'hésitez pas à poster votre demande d'aide dans la section AQS

 

  • Like 5
  • Ah ah 1
Link to post
  • 3 months later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.