Neler yeni
XenForo Bannerlar

Foruma hoş geldin, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Kod ITJA İtem İnfo sistemi

Fatih Bulut

Süper Üye
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​

ÖzellikAçıklama
Geçmiş TakibiEş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ülemOyuncular /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());
Bu sayede item envantere her alındığında veya giyildiğinde sahibin adı kayıt olur.

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
 

Benzer konular

Forumdan daha fazla yararlanmak için giriş yapın yada üye olun!

Forumdan daha fazla yararlanmak için giriş yapın veya kayıt olun!

Kayıt ol

Forumda bir hesap oluşturmak tamamen ücretsizdir.

Şimdi kayıt ol
Giriş yap

Eğer bir hesabınız var ise lütfen giriş yapın

Giriş yap

Tema düzenleyici

Tema özelletirmeleri

Grafik arka planlar

Granit arka planlar