- Katılım
- 6 Kas 2021
- Mesajlar
- 3,010
- Tepkime puanı
- 4,532
- Puanları
- 113
- Yaş
- 31
- Konum
- Türkiye
- Dc
- fatihbulut
Geliştirilebilir sistemdir kayıtları veritabanına entegre etmek size kalmış.
Nasıl Çalışır?Oyuncu bir eşyayı NPC Shop (market) üzerinden satın aldığında,
Eşyaya otomatik olarak oyuncunun ismi geçmiş olarak eklenir.
Aynı eşya başka bir oyuncunun envanterine geçtiğinde (örneğin takas), geçmiş bozulmaz.
Oyuncular ellerindeki eşyalar için özel bir komutla bu geçmişi görüntüleyebilirler.
Özellikler
Özellik | Açıklama |
---|---|
Geçmiş Takibi | Eşyalar kimin tarafından alındıysa isim listeye yazılır. |
RAM Tabanlı | Geçmiş sadece bellekte tutulur, veritabanına yük bindirmez. |
Market Odaklı | Sadece marketten alınan itemler geçmişe girer. |
Komutla Görüntülem | Oyuncular /iteminfo komutuyla geçmişi görebilir. |
Sosyal Etkileşim Katkısı | Oyuncular nadir itemlerin kimlerde olduğunu görebilir. |
Sınırlamalar
Sadece marketten alınan itemler geçerlidir.Takas görev ödülü boss drop gibi kaynaklardan gelen itemler sisteme dahil değildir.
Geçmiş bilgisi sadece sunucu çalışırken aktiftir (sunucu kapanınca sıfırlanır).
Neden Kullanmalı
Oyuncular için ticaret güvenliği ve “geçmişi temiz item” algısı yaratır.Sosyal ve nostaljik bir bağ kurma imkanı sağlar.
Yüksek değerli itemlerde “önceki sahip kimdi?” sorusuna cevap verir.
1. item.h — Fonksiyonlar Ekle
Kod:
class CItem içine private alanlara şunları ekle:
// item.h
private:
std::string m_szCreatorName;
int m_iPvPKills = 0;
int m_iPvMKills = 0;
std::vector<std::string> m_vecOwners;
public:
void SetCreatorName(const std::string& name) { m_szCreatorName = name; }
void AddOwner(const std::string& name);
void AddPvPKill() { ++m_iPvPKills; }
void AddPvMKill() { ++m_iPvMKills; }
void ShowHistory(LPCHARACTER ch) const;
2. item.cpp — Fonksiyonları Tanımla
Kod:
// item.cpp
void CItem::AddOwner(const std::string& name)
{
if (!name.empty() && (m_vecOwners.empty() || m_vecOwners.back() != name))
{
if (m_vecOwners.size() >= 5)
m_vecOwners.erase(m_vecOwners.begin()); // En eskiyi sil
m_vecOwners.push_back(name);
}
}
void CItem::ShowHistory(LPCHARACTER ch) const
{
ch->ChatPacket(CHAT_TYPE_INFO, "=== [Item Geçmişi] ===");
ch->ChatPacket(CHAT_TYPE_INFO, "İlk Sahibi: %s", m_szCreatorName.c_str());
ch->ChatPacket(CHAT_TYPE_INFO, "PvP Öldürme Sayısı: %d", m_iPvPKills);
ch->ChatPacket(CHAT_TYPE_INFO, "PvM Öldürme Sayısı: %d", m_iPvMKills);
ch->ChatPacket(CHAT_TYPE_INFO, "Önceki Sahipler:");
if (m_vecOwners.empty())
ch->ChatPacket(CHAT_TYPE_INFO, "- [Kayıt Yok]");
else
for (const auto& owner : m_vecOwners)
ch->ChatPacket(CHAT_TYPE_INFO, "- %s", owner.c_str());
}
3. item_manager.cpp — İlk Oluşturulanda Sahip Ata
Kod:
LPITEM ITEM_MANAGER::CreateItem(...) içinde şu satırları CreateItem()'ın içinde Initialize() ve SetProto()'dan hemen sonra ekle:
// item_manager.cpp
if (item && item->GetOwner())
{
item->SetCreatorName(item->GetOwner()->GetName());
item->AddOwner(item->GetOwner()->GetName());
}
Not: GetOwner() null olabilir, koruma yapabilirsin.
4. char_item.cpp — Item Giyme/Çıkarma Anında Sahip Kaydet
Kod:
void CHARACTER::SetItem(...) içinde şu satırı ekle:
if (pItem)
pItem->AddOwner(GetName());
5. char_battle.cpp — PvP ve PvM Öldürme Takibi
Dosyada Attack() içinde BATTLE_DEAD durumunu bul:
PvP öldürme:
Kod:
if (victim->IsPC() && GetWear(WEAR_WEAPON))
{
if (LPITEM pWeapon = GetWear(WEAR_WEAPON))
pWeapon->AddPvPKill();
}
PvM öldürme:
Kod:
if (!victim->IsPC() && GetWear(WEAR_WEAPON))
{
if (LPITEM pWeapon = GetWear(WEAR_WEAPON))
pWeapon->AddPvMKill();
}
Bu kodları, ilgili victim->IsDead() veya iRet == BATTLE_DEAD bölgelerine yerleştirebilirsin.
6. cmd_general.cpp — Komut Tanımı: /iteminfo
Dosyanın sonuna ekle:
Kod:
ACMD(do_iteminfo)
{
LPITEM item = ch->GetWear(WEAR_WEAPON);
if (!item)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Üzerinizde silah bulunmamaktadır.");
return;
}
item->ShowHistory(ch);
}
7. cmd.cpp — Komutu Kaydet
Kod:
ACMD(do_iteminfo);
8. cmd_general.cpp veya cmd.cpp Komut Listesine Ekle
Kod:
{ "iteminfo", do_iteminfo, 0, POS_DEAD, GM_PLAYER },
Dosya: shop.cpp
Fonksiyon: CShop::Buy(...) içinde, item oluşturulduktan hemen sonra:
Şu kısmı bul:
Kod:
item = ITEM_MANAGER::instance().CreateItem(r_item.vnum, r_item.count);
if (!item)
return SHOP_SUBHEADER_GC_SOLD_OUT;
Hemen altına şunu EKLE:
Kod:
if (!m_pkPC && item)
item->AddOwner(ch->GetName()); // Sadece NPC shop ise geçmişe ekle
KANIT