Hikayeler

Reklam vermek için turkmmo@gmail.com
Kaynak ikonu

Geçici Grand Master beceri sistemi

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

mistikaptal

Mysteriously Stupidity
TM Üye
Katılım
8 Haz 2024
Konular
85
Mesajlar
526
Online süresi
2ay 12g
Reaksiyon Skoru
405
Altın Konu
0
Başarım Puanı
121
TM Yaşı
1 Yıl 10 Ay 15 Gün
MmoLira
3,272
DevLira
189

Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. HEMEN TIKLA!

denizeriye saygılar alıntıdır :)

char.h içinde aratılır:
void SkillLevelPacket();

değiştirilir:
void SkillLevelPacket(bool temporary = false) const;

tekrar aratılır:
int GetSkillLevel(DWORD dwVnum) const;

ve değiştirilir:

int GetSkillLevel(DWORD dwVnum, bool skilltraining = false) const;

char_skill.cpp içinde aratılır:

void CHARACTER::SkillLevelPacket()

fonksiyon ve içeriği değiştirilir:
void CHARACTER::SkillLevelPacket(const bool temporary)
{
if (!GetDesc())
return;

TPacketGCSkillLevel pack;

pack.bHeader = HEADER_GC_SKILL_LEVEL;
thecore_memcpy(&pack.skills, m_pSkillLevels, sizeof(TPlayerSkill) * SKILL_MAX_NUM);

if (temporary)
{
UpgradeSkillsTemporary(pack, GetJob(), GetSkillGroup());
}

GetDesc()->Packet(&pack, sizeof(TPacketGCSkillLevel));
}

Değişiklik yapılan fonksiyonun hemen üstüne eklenir;

constexpr void UpgradeSkillsTemporary(TPacketGCSkillLevel & packet, BYTE job, BYTE skillgroup) noexcept
{
switch (job)
{
case JOB_WARRIOR:
{
if (skillgroup == 1)
{
for (BYTE i = 1; i <= 5; i++)
{
if (30 > packet.skills.bLevel)
{
packet.skills.bLevel = 30;
packet.skills.bMasterType = SKILL_GRAND_MASTER;
}
}
}
else if (skillgroup == 2)
{
for (BYTE i = 16; i <= 20; i++)
{
if (30 > packet.skills.bLevel)
{
packet.skills.bLevel = 30;
packet.skills.bMasterType = SKILL_GRAND_MASTER;
}
}
}
}

case JOB_ASSASSIN:
{
if (skillgroup == 1)
{
for (BYTE i = 31; i <= 35; i++)
{
if (30 > packet.skills.bLevel)
{
packet.skills.bLevel = 30;
packet.skills.bMasterType = SKILL_GRAND_MASTER;
}
}
}
else if (skillgroup == 2)
{
for (BYTE i = 46; i <= 50; i++)
{
if (30 > packet.skills.bLevel)
{
packet.skills.bLevel = 30;
packet.skills.bMasterType = SKILL_GRAND_MASTER;
}
}
}
}

case JOB_SURA:
{
if (skillgroup == 1)
{
for (BYTE i = 61; i <= 66; i++)
{
if (30 > packet.skills.bLevel)
{
packet.skills.bLevel = 30;
packet.skills.bMasterType = SKILL_GRAND_MASTER;
}
}
}
else if (skillgroup == 2)
{
for (BYTE i = 76; i <= 81; i++)
{
if (30 > packet.skills.bLevel)
{
packet.skills.bLevel = 30;
packet.skills.bMasterType = SKILL_GRAND_MASTER;
}
}
}
}

case JOB_SHAMAN:
{
if (skillgroup == 1)
{
for (BYTE i = 91; i <= 96; i++)
{
if (30 > packet.skills.bLevel)
{
packet.skills.bLevel = 30;
packet.skills.bMasterType = SKILL_GRAND_MASTER;
}
}
}
else if (skillgroup == 2)
{
for (BYTE i = 106; i <= 111; i++)
{
if (30 > packet.skills.bLevel)
{
packet.skills.bLevel = 30;
packet.skills.bMasterType = SKILL_GRAND_MASTER;
}
}
}
}
}
}


aynı dosya içerisinde aratılır:

int CHARACTER::GetSkillMasterType(DWORD dwVnum) const

ve fonksiyon içeriği değiştirilir;

if (!IsPC())
return 0;

if (dwVnum >= SKILL_MAX_NUM)
{
sys_err("%s skill vnum overflow %u", GetName(), dwVnum);
return 0;
}

if (m_pSkillLevels)
{
if (IsEquipUniqueItem(UNIQUE_ITEM_TEMP_SKILL_GRAND_MASTER))
{
return (SKILL_GRAND_MASTER > m_pSkillLevels[dwVnum].bMasterType) ? SKILL_GRAND_MASTER : m_pSkillLevels[dwVnum].bMasterType;
}
else
{
return m_pSkillLevels[dwVnum].bMasterType;
}
}

return SKILL_NORMAL;

tekrar aratılır:

int CHARACTER::GetSkillLevel(DWORD dwVnum) const

ve fonksiyon içeriği değiştirilir;

if (dwVnum >= SKILL_MAX_NUM)
{
sys_err("%s skill vnum overflow %u", GetName(), dwVnum);
sys_log(0, "%s skill vnum overflow %u", GetName(), dwVnum);
return 0;
}

if (m_pSkillLevels)
{
if (IsEquipUniqueItem(UNIQUE_ITEM_TEMP_SKILL_GRAND_MASTER) && !skilltraining)
{
return (30 > m_pSkillLevels[dwVnum].bLevel) ? 30 : m_pSkillLevels[dwVnum].bLevel;
}
else
{
return std::min<int>(SKILL_MAX_LEVEL, m_pSkillLevels[dwVnum].bLevel);
}
}

return 0;
}

input_login.cpp içerisinde üst kısımda eğer yoksa eklenir:
#include "unique_item.h"

aynı dosyada aratılır:
void CInputLogin::Entergame(LPDESC d, const char * data)

ve aratılan fonksiyonun en altına eklenir;
if (ch->IsEquipUniqueItem(UNIQUE_ITEM_TEMP_SKILL_GRAND_MASTER))
{
ch->SkillLevelPacket(true);
}

item.cpp içerisinde aratılır:

void CItem::StartUniqueExpireEvent()

ve fonksiyonun içerisine eklenir;
bu kısımın altına;

// HARD CODING
if (GetVnum() == UNIQUE_ITEM_HIDE_ALIGNMENT_TITLE)
m_pOwner->ShowAlignment(false);

bu eklenecek;

if (GetVnum() == UNIQUE_ITEM_TEMP_SKILL_GRAND_MASTER)
m_pOwner->SkillLevelPacket(true);

tekrar aratılır:

void CItem::StopUniqueExpireEvent()

ve fonksiyonun içerisine eklenir;

bu kısımın altına;

// HARD CODING
if (GetVnum() == UNIQUE_ITEM_HIDE_ALIGNMENT_TITLE)
m_pOwner->ShowAlignment(false);

bu eklenecek;

if (GetVnum() == UNIQUE_ITEM_TEMP_SKILL_GRAND_MASTER)
m_pOwner->SkillLevelPacket();

questlua_pc.cpp içerisinde aratılır:
int pc_get_skill_level(lua_State * L)

ve fonksiyon içeriği komple değiştirilir;

if (!lua_isnumber(L, 1))
{
sys_err("invalid argument");
lua_pushnumber(L, 0);
return 1;
}

LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();

DWORD dwVnum = (DWORD) lua_tonumber(L, 1);
lua_pushnumber(L, ch->GetSkillLevel(dwVnum, true));

return 1;

unique_item.h içerisine eklenir:

UNIQUE_ITEM_TEMP_SKILL_GRAND_MASTER = 70059,

item_proto.txt:

70059 ¼±ՀǠÀ尩 ITEM_UNIQUE UNIQUE_NONE 1 NONE NONE WEAR_SHIELD 0 50000 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 120 0 0 0 0 0 0 0 0

item_names.txt

70059 Büyük Usta'nın Yüzüğü

denizeri notes
----------------------

item kodu 70059 dur. isteğe göre değiştirilebilir. client/pack kısmından item_list.txt ve item_desc.txt kısmını düzenlemeniz gerekir (yoksa oyun içinde item gözükmez)

bug varmıdır bilmiyorum, aklıma gelen türden denemeler yaptım ve sıkıntı yaşamadım ayrıca fonksiyonda constexpr ve noexcept kullandığım için c++ sürümü düşük dosyalarda derlenmeyebilir, eğer düşük c++ sürümüyle derlemek istiyorsanız constexpr kısmını inline ile değiştirip noexcept kısmını silin.
 
Paylaşım için teşekkürler.
24 saat içerisinde kanıt ekleyiniz.
 
Paylaşım için teşekkürler.
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Şu an konuyu görüntüleyenler (Toplam : 1, Üye: 0, Misafir: 1)

Geri
Üst