kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
farkmt2official 1
farkmt2official
Bvural41 1
Bvural41
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Hikaye Ekle
Kaynak ikonu

Geçici Grand Master beceri sistemi

  • Konuyu başlatan Konuyu başlatan mistikaptal
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 3
  • Görüntüleme Görüntüleme 641
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Ayyıldız2 | 2008 TR Yapısı • 1-99 Orta Emek Destan • Oto Avsız • 10 Temmuz 21:00 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.
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

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

Geri
Üst