- Mesaj
- 1.328
- Çözümler
- 75
- Beğeni
- 5.079
- Puan
- 2.859
- Ticaret Puanı
- 0
Sadeleştirilmiş Pet Sistemi V2 ye skill ler eklemek istedim ama eklenen skillerin kaçıncı level olduğu bilgisini tutacak bir yer yoktu bende bu 4 skillin level bilgisini bit halinde paketleyip socket0 da saklamaya karar verdim(bir tek socket0 boş) ve yapay zeka yardımıyla aşağıdaki kodu yazdım. Bu kodu yazarak mantıklı bir şeymi yaptım yoksa saçmaladımmı karar veremedim yorumlarınızı bekliyorum.
kod:
//////////////////////////////////////////////////////////////////////////////Pet Skill////////////////////////////////////////////////
// Bit işlemleri için yardımcı fonksiyonlar
namespace PacketUtils {
inline uint32_t PackBytes(uint8_t a, uint8_t b, uint8_t c, uint8_t d) {
return (a << 24) | (b << 16) | (c << 8) | d;
}
inline uint8_t UnpackByte(uint32_t packed, uint8_t position) {
return (packed >> (8 * (4 - position))) & 0xFF;
}
}
void CNewPet::SetSkill(LPITEM skillBook, LPITEM petItem)
{
if (!skillBook || !petItem)
return;
const BYTE newSkillId = skillBook->GetValue(0);
if (newSkillId == 0)
{
sys_err("SetSkill: Geçersiz skill ID: %d", newSkillId);
return;
}
// Skill tablosunu kontrol et
if (petSkillTable.empty())
{
sys_err("SetSkill: Skill tablosu boş!");
return;
}
// Mevcut skill'leri kontrol et ve güncelle
if (UpdateExistingSkill(petItem, newSkillId))
return;
// Yeni skill ekle
AddNewSkill(petItem, newSkillId);
}
bool CNewPet::UpdateExistingSkill(LPITEM petItem, BYTE skillId)
{
for (int i = PET_ATTR_SKILL_START; i < PET_ATTR_SKILL_END; ++i)
{
if (petItem->GetAttributeType(i) == skillId)
{
const auto skillData = FindSkillData(skillId);
if (!skillData.empty())
{
const uint8_t skillLevel = PacketUtils::UnpackByte(petItem->GetSocket(0), i - PET_ATTR_SKILL_START + 1);
if (skillLevel < skillData.size())
{
petItem->SetForceAttribute(i, skillId, skillData[skillLevel]);
//sys_log(0, "Pet skill güncellendi: ID %d, Seviye %d", skillId, skillLevel);
return true;
}
}
break;
}
}
return false;
}
bool CNewPet::AddNewSkill(LPITEM petItem, BYTE skillId)
{
for (int i = PET_ATTR_SKILL_START; i < PET_ATTR_SKILL_END; ++i)
{
if (petItem->GetAttributeType(i) == 0)
{
const auto skillData = FindSkillData(skillId);
if (!skillData.empty())
{
petItem->SetForceAttribute(i, skillId, skillData[1]); // Varsayılan seviye 1
// Socket verisini güncelle
UpdateSkillPacketData(petItem, i - PET_ATTR_SKILL_START + 1, 1);
sys_log(0, "Yeni pet skill eklendi: ID %d", skillId);
return true;
}
break;
}
}
sys_err("AddNewSkill: Pet için boş skill slotu bulunamadı veya skill verisi yok");
return false;
}
const std::vector<int>& CNewPet::FindSkillData(BYTE skillId)
{
static const std::vector<int> emptyVector;
for (const auto& row : petSkillTable) {
if (!row.empty() && row[0] == skillId) {
return row;
}
}
sys_err("FindSkillData: Skill ID %d için veri bulunamadı", skillId);
return emptyVector;
}
void CNewPet::UpdateSkillPacketData(LPITEM petItem, uint8_t position, uint8_t level)
{
uint32_t currentPacket = petItem->GetSocket(0);
// Mevcut byte'ları al
uint8_t bytes[4];
for (int i = 1; i <= 4; ++i)
{
bytes[i-1] = (i == position) ? level : PacketUtils::UnpackByte(currentPacket, i);
}
// Yeni paketi oluştur
uint32_t newPacket = PacketUtils::PackBytes(bytes[0], bytes[1], bytes[2], bytes[3]);
petItem->SetSocket(0, newPacket);
}
//////////////////////////////////////////////////////////////////////////////Pet Skill////////////////////////////////////////////////
Son düzenleme: