- Mesaj
- 577
- Çözümler
- 18
- Beğeni
- 576
- Puan
- 829
- Ticaret Puanı
- 0
Sistem basittir, belirli eşyayı giyince grandmaster olmayan aktif karakter becerilerini grandmaster yapar. Grandmaster veya daha üstü becerileri etkilemez.
char.h içinde aratılır:
C++:
void SkillLevelPacket();
değiştirilir:
C++:
void SkillLevelPacket(bool temporary = false) const;
tekrar aratılır:
C++:
int GetSkillLevel(DWORD dwVnum) const;
ve değiştirilir:
C++:
int GetSkillLevel(DWORD dwVnum, bool skilltraining = false) const;
char_skill.cpp içinde aratılır:
C++:
void CHARACTER::SkillLevelPacket()
fonksiyon ve içeriği değiştirilir:
C++:
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;
C++:
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[i].bLevel)
{
packet.skills[i].bLevel = 30;
packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
}
}
}
else if (skillgroup == 2)
{
for (BYTE i = 16; i <= 20; i++)
{
if (30 > packet.skills[i].bLevel)
{
packet.skills[i].bLevel = 30;
packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
}
}
}
}
case JOB_ASSASSIN:
{
if (skillgroup == 1)
{
for (BYTE i = 31; i <= 35; i++)
{
if (30 > packet.skills[i].bLevel)
{
packet.skills[i].bLevel = 30;
packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
}
}
}
else if (skillgroup == 2)
{
for (BYTE i = 46; i <= 50; i++)
{
if (30 > packet.skills[i].bLevel)
{
packet.skills[i].bLevel = 30;
packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
}
}
}
}
case JOB_SURA:
{
if (skillgroup == 1)
{
for (BYTE i = 61; i <= 66; i++)
{
if (30 > packet.skills[i].bLevel)
{
packet.skills[i].bLevel = 30;
packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
}
}
}
else if (skillgroup == 2)
{
for (BYTE i = 76; i <= 81; i++)
{
if (30 > packet.skills[i].bLevel)
{
packet.skills[i].bLevel = 30;
packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
}
}
}
}
case JOB_SHAMAN:
{
if (skillgroup == 1)
{
for (BYTE i = 91; i <= 96; i++)
{
if (30 > packet.skills[i].bLevel)
{
packet.skills[i].bLevel = 30;
packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
}
}
}
else if (skillgroup == 2)
{
for (BYTE i = 106; i <= 111; i++)
{
if (30 > packet.skills[i].bLevel)
{
packet.skills[i].bLevel = 30;
packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
}
}
}
}
}
}
aynı dosya içerisinde aratılır:
C++:
int CHARACTER::GetSkillMasterType(DWORD dwVnum) const
ve fonksiyon içeriği değiştirilir;
C++:
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:
C++:
int CHARACTER::GetSkillLevel(DWORD dwVnum) const
ve fonksiyon içeriği değiştirilir;
C++:
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:
C++:
#include "unique_item.h"
aynı dosyada aratılır:
C++:
void CInputLogin::Entergame(LPDESC d, const char * data)
ve aratılan fonksiyonun en altına eklenir;
C++:
if (ch->IsEquipUniqueItem(UNIQUE_ITEM_TEMP_SKILL_GRAND_MASTER))
{
ch->SkillLevelPacket(true);
}
----------------------
item.cpp içerisinde aratılır:
C++:
void CItem::StartUniqueExpireEvent()
ve fonksiyonun içerisine eklenir;
C++:
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:
C++:
void CItem::StopUniqueExpireEvent()
ve fonksiyonun içerisine eklenir;
C++:
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:
C++:
int pc_get_skill_level(lua_State * L)
ve fonksiyon içeriği komple değiştirilir;
C++:
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:
C++:
UNIQUE_ITEM_TEMP_SKILL_GRAND_MASTER = 70059,
----------------------
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.
item_proto.txt ve item_names.txt kısmını unutmuşum:
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üğü
Son düzenleme: