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.
---
Töltsd le a szükséges fájlt (uiChannel.py):
---
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
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()
Keresd meg ezt a sort:
Kód: Egész kijelölése
onPressKeyDict[app.DIK_F4] = lambda : self.__PressQuickSlot(7)
Kód: Egész kijelölése
onPressKeyDict[app.DIK_F7] = lambda : self.__switch_channel()
---
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);
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);
}
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...
}
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));
}
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!
---