ITJA İtem İnfo sistemi

  • Konuyu açan Konuyu açan ITJA
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 0
  • Gösterim Gösterim 148

ITJA

Yasaklanmış Üye
Cezalı
Mesaj
73
Beğeni
37
Puan
676
Ticaret Puanı
0

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:
Kod:
Genişlet Daralt Kopyala
class CItem içine private alanlara şunları ekle:[/FONT][/SIZE][/COLOR][/FONT]
[FONT=Quicksand][COLOR=rgb(54, 57, 90)][SIZE=13px][FONT=Monaco]// 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:
Kod:
Genişlet Daralt Kopyala
// item.cpp[/FONT][/SIZE][/COLOR][/FONT]
[FONT=Quicksand][COLOR=rgb(54, 57, 90)][SIZE=13px][FONT=Monaco]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:
Kod:
Genişlet Daralt Kopyala
LPITEM ITEM_MANAGER::CreateItem(...) içinde şu satırları CreateItem()'ın içinde Initialize() ve SetProto()'dan hemen sonra ekle:[/FONT][/SIZE][/COLOR][/FONT]
[FONT=Quicksand][COLOR=rgb(54, 57, 90)][SIZE=13px][FONT=Monaco]// 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:
Kod:
Genişlet Daralt Kopyala
void CHARACTER::SetItem(...) içinde şu satırı ekle:[/FONT][/SIZE][/COLOR][/FONT]
[FONT=Quicksand][COLOR=rgb(54, 57, 90)][SIZE=13px][FONT=Monaco]
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 — ve PvM Öldürme Takibi


Dosyada Attack() içinde BATTLE_DEAD durumunu bul:



öldürme:​


Kod:
Kod:
Genişlet Daralt Kopyala
if (victim->IsPC() && GetWear(WEAR_WEAPON))[/FONT][/SIZE][/COLOR][/FONT]
[FONT=Quicksand][COLOR=rgb(54, 57, 90)][SIZE=13px][FONT=Monaco]{
    if (LPITEM pWeapon = GetWear(WEAR_WEAPON))
        pWeapon->AddPvPKill();
}


PvM öldürme:​


Kod:
Kod:
Genişlet Daralt Kopyala
if (!victim->IsPC() && GetWear(WEAR_WEAPON))[/FONT][/SIZE][/COLOR][/FONT]
[FONT=Quicksand][COLOR=rgb(54, 57, 90)][SIZE=13px][FONT=Monaco]{
    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:
Kod:
Genişlet Daralt Kopyala
ACMD(do_iteminfo)[/FONT][/SIZE][/COLOR][/FONT]
[FONT=Quicksand][COLOR=rgb(54, 57, 90)][SIZE=13px][FONT=Monaco]{
    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:
Kod:
Genişlet Daralt Kopyala
item = ITEM_MANAGER::instance().CreateItem(r_item.vnum, r_item.count);[/FONT][/SIZE][/COLOR][/FONT]
[FONT=Quicksand][COLOR=rgb(54, 57, 90)][SIZE=13px][FONT=Monaco]if (!item)
    return SHOP_SUBHEADER_GC_SOLD_OUT;

Hemen altına şunu EKLE:​


Kod:
Kod:
Genişlet Daralt Kopyala
if (!m_pkPC && item)[/FONT][/SIZE][/COLOR][/FONT]
[FONT=Quicksand][COLOR=rgb(54, 57, 90)][SIZE=13px][FONT=Monaco]    item->AddOwner(ch->GetName()); // Sadece NPC shop ise geçmişe ekle

KANIT
 
Geri
Üst