Earth nature field

Ingame csatornaváltó hozzáadása

Minden ami szerverkészítéshez tartozik (szerverfájlok, src, kliensek stb)
Válasz küldése
Hugoboss
Újonc

Újonc
Hozzászólások: 1
Csatlakozott: 2025.08.28. 11:34

Ingame csatornaváltó hozzáadása

Hozzászólás Szerző: Hugoboss »

📌 Csatornaváltó hozzáadása a játékba (F7 gomb)
Üdv mindenkinek!
Ebben az útmutatóban bemutatom, hogyan tudsz egy InGame csatornaváltó ablakot hozzáadni a Metin2 szerveredhez és kliensedhez.
A funkció lehetővé teszi a játékosnak, hogy gombnyomással (F7) váltson csatornát játék közben, GUI-n keresztül.

---

💾 Letöltés
Töltsd le a szükséges fájlt (uiChannel.py):
🔗 [Please login or register to view this link]

---

🖥️ Kliens oldali beállítások

1. uiChannel.py hozzáadása
Másold a letöltött uiChannel.py fájlt a következő mappába:

Kód: Egész kijelölése

root/uiChannel.py
2. game.py módosítása
Nyisd meg a game.py fájlt, és a legvégére illeszd be ezt a függvényt:

Kód: Egész kijelölése

	def __switch_channel(self):
		import uiChannel
		a = uiChannel.ChannelChanger()
		a.Show()
3. F7 billentyű hozzárendelése
Keresd meg ezt a sort:

Kód: Egész kijelölése

onPressKeyDict[app.DIK_F4]	= lambda : self.__PressQuickSlot(7)
Alá írd be:

Kód: Egész kijelölése

onPressKeyDict[app.DIK_F7]	= lambda : self.__switch_channel()
Mostantól az F7 megnyomására megjelenik a csatornaváltó ablak.

---

🛠️ Szerver oldali beállítások

1. cmd.cpp
Keresd ezt:

Kód: Egész kijelölése

ACMD(do_warp);

Alá írd:

Kód: Egész kijelölése

ACMD(do_channel_switch);
Keresd:

Kód: Egész kijelölése

{ "mall_close", do_mall_close, 0, POS_DEAD, GM_PLAYER },

Alá írd:

Kód: Egész kijelölése

{ "channel", do_channel_switch, 0, POS_DEAD, GM_PLAYER },
---

2. cmd_general.cpp
Keresd:

Kód: Egész kijelölése

ACMD(do_set_run_mode)
{
	ch->SetNowWalking(false);
	ch->SetWalking(false);
}
Alá írd:

Kód: Egész kijelölése

ACMD(do_channel_switch)
{
	char arg1[256];
	one_argument(argument, arg1, sizeof(arg1));

	if (!*arg1)
		return;

	int new_ch;
	str_to_number(new_ch, arg1);
	if (new_ch < 1 || new_ch > 4) // Csatornák száma (pl.: 1-4)
		return;

	if (!ch->IsPC())
		return;

	ch->ChannelSwitch(new_ch);
}
---

3. char.h
Keresd:

Kód: Egész kijelölése

void StartWarpNPCEvent();

Alá írd:

Kód: Egész kijelölése

void ChannelSwitch(int new_ch);
---

4. char.cpp
Keresd:

Kód: Egész kijelölése

EVENTFUNC(warp_npc_event)
{
	char_event_info* info = dynamic_cast<char_event_info*>( event->info );
	if ( info == NULL )
	{
		sys_err( "warp_npc_event> <Factor> Null pointer" );
		return 0;
	}
	// stb...
}
Alá illeszd be ezt az új függvényt:

Kód: Egész kijelölése

void CHARACTER::ChannelSwitch(int new_ch)
{
	long lAddr;
	long lMapIndex;
	WORD wPort;
	long x = this->GetX();
	long y = this->GetY();

	if (!CMapLocation::instance().Get(x, y, lMapIndex, lAddr, wPort))
	{
		sys_err("cannot find map location index %d x %d y %d name %s", lMapIndex, x, y, GetName());
		return;
	}
	if (lMapIndex >= 10000)
		return;

	std::map<WORD, int> micha;
	for (int i = 0; i < 4; i++) // max csatorna - 1
	{
		for (int i2 = 2; i2 < 9; i2++) // core értékek pl. 13002–13008
		{
			micha[13 * 1000 + i * 100 + i2] = i + 1;
		}
	}

	int chan;
	if (micha.find(wPort) != micha.end())
	{
		chan = micha[wPort];
	}
	else return;

	Stop();
	Save();

	if (GetSectree())
	{
		GetSectree()->RemoveEntity(this);
		ViewCleanup();
		EncodeRemovePacket(this);
	}

	TPacketGCWarp p;
	p.bHeader = HEADER_GC_WARP;
	p.lX = x;
	p.lY = y;
	p.lAddr = lAddr;
	p.wPort = (wPort - 100 * (chan - 1) + 100 * (new_ch - 1));

	sys_err("x : %d y: %d, addr: %d, port: %d , newPort: %d", x, y, lAddr, wPort, p.wPort);

	GetDesc()->Packet(&p, sizeof(TPacketGCWarp));
}
---

✅ Kész is vagy!
Most már a játékosok könnyedén válthatnak csatornát a játékban az F7 gomb megnyomásával, egy szép kis GUI ablakon keresztül.

Ha több csatornád van, állítsd be a csatornaszámokat és a porttartományokat az igényeid szerint a `char.cpp`-ben található ciklusban!

---
Válasz küldése