Metin2 - Bölüm 7
Tamamlanmamış, yarım kalmış özellikler.
-Bu özellik en son benim şahit olduğum kadarıyla 2021de hala çalışıyordu(büyük ihtimal daha yeni fixlenmiştir), güncelde çalışmıyor-
Bu bölümde neredeyse arka kapı diyeceğiniz bir özelliğe bakıyoruz.
Metin2de grup(party) sistemi aslında çok daha gelişmiş bir şey olacakmış. Grup skilleri olacakmış ve oyuna farklı bir mekanik getirecekmiş. Bu skillerin alt yapısı hazırdı ve yakın zamana kadar çalışıyorlardı.
UI'da göstermemeyi tercih etmişler çünkü korece yorum satırlarından da anlayacağımz üzere henüz oturmamış, bitmemiş bir özellikti. ama oyunda server tarafı çalışıyordu ve alt yapısı bulunan 2 adet skill vardı. WARP ve HEAL.
Oyunda bunların tutulduğu bir enum var.
enum
{
PARTY_SKILL_HEAL = 1,
PARTY_SKILL_WARP = 2
};
Gelen skill için aşağıdaki gibi bir switch-case yapısı var.
case PARTY_SKILL_HEAL:
ch->GetParty()->HealParty();
break;
case PARTY_SKILL_WARP:
{
LPCHARACTER pch = CHARACTER_MANAGER::instance().Find(p->vid);
if (pch)
ch->GetParty()->SummonToLeader(pch->GetPlayerID());
else
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<파티> 소환하려는 대상을 찾을 수 없습니다."));
}
break;
Bu skiller CParty::HealParty() ve CParty::SummonToLeader'da tanımlanıyor.
Ve isimden de anlaşılacağı üzere grup üyelerini iyileştirme ve grup liderinin yanına ışınlama işlevleri var. Komiktir ki healı bitirememişler bile.
void CParty::HealParty()
{
// XXX DELETEME 클라이언트 완료될때까지
{
return;
}
if (!m_bPartyHealReady)
return;
Korece yorum satırının çevirisi,
// XXX DELETEME until client completes
Çok detaya girmeye gerek yok ne yaptıkları isimlerinden de anlaşılıyor. WARP skiliyle lider kendine oyuncuları çekebiliyor, HEAL da heal atıyor.
Summon yeteneğini kullanabilmemiz için liderliğimizin en az 12 olması gerekiyor. Biz yine de M1 ve üstü bir şey kullanacağız yoksa biraz bekleme süresi var.
bool CHARACTER::CanSummon(int iLeaderShip)
{
return (iLeaderShip >= 20 || iLeaderShip >= 12 && m_dwLastDeadTime 180 > get_dword_time());
}
Bu skilleri kullanarak lvl sınırı olan bölgelere oyuncular çekilebiliyorlardı. 50lvlde sürgüne girmek veya videoda göstereceğim gibi 31 lvlde kuleye girmek gibi gibi.
Hadi bunu test edelim,
Bu aksiyonu triggerlayan paket 2 argüman alıyor. Skill indexi ve player idsi.
bool SendPartyUseSkillPacket(BYTE bySkillIndex, DWORD dwVID);
PyObject* netSendPartyUseSkillPacket(PyObject* poSelf, PyObject* poArgs)
{
int iSkillIndex;
if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
return Py_BuildException();
int iVID;
if (!PyTuple_GetInteger(poArgs, 1, &iVID))
return Py_BuildException();
CPythonNetworkStream& rns=CPythonNetworkStream::Instance();
rns.SendPartyUseSkillPacket(iSkillIndex, iVID);
return Py_BuildNone();
}
Aşağıdaki bloğu oyunda çalıştırırsak bu aksiyonu triggerlayabiliriz
import net
import player
selected_vid = player.GetTargetVID() # sag tikladigimiz insan
chat.AppendChat(
chat.CHAT_TYPE_INFO, str(selected_vid)) # debug icin yazalim
# 73128 other player
# 72900 me
PARTY_SKILL_WARP = 2
PARTY_SKILL_HEAL = 1
net.SendPartyUseSkillPacket(PARTY_SKILL_WARP, selected_vid)
Videoyu izleyebilirsiniz :)
Bonus:
Healın ve warpın buttonları bile hazırmış.
self.buttonDict[
localeInfo.PARTY_HEAL_ALL_MEMBER].SetOverVisual("d:/ymir work/ui/game/windows/Party_Skill_Heal_02.sub")
Kırmızı ile işaretledim. Üstteki 3 küçük buton heal, alttaki 3 de warp