[C++] Mob Drop Komut ile eşya düşürme

theay

mester2.tc
Premium Üye
MT Üye
Mesaj
234
Çözümler
17
Beğeni
65
Puan
484
Ticaret Puanı
0
📌 Sistemin Çalışma Mantığı

Tek tek yaratıkları veya metin taşlarını öldürmeden doğrudan onların düşürmesi gereken eşyaları almanı sağlar.
Gerçek oyun mekanikleriyle çalışır, yani görevler, EXP, yang ve item dropları birebir gerçekçi olur.
İster yaratık, ister metin taşı test et /mob_drop [vnum] [sayı]


Linkleri görebilmek için giriş yap veya kayıt ol.


201467b0513edda0f3b211fe1bc4d51b.gif


commondefines.h veya service.h Ekle:
Genişlet Daralt Kopyala
#define ENABLE_CMD_DROP_ITEM                                                            // Komut ile eşya düşürme
char.h:
Genişlet Daralt Kopyala
//Ara :
void                Reward(bool bItemDrop);

//Değiştir :

#ifdef ENABLE_CMD_DROP_ITEM
        void                Reward(bool bItemDrop, LPCHARACTER dropsystem = NULL);
#else
        void                Reward(bool bItemDrop);
#endif

char_battle.cpp:
Genişlet Daralt Kopyala
// Ara :
void CHARACTER::Reward(bool bItemDrop)

    
// Değiştir :
#ifdef ENABLE_CMD_DROP_ITEM
void CHARACTER::Reward(bool bItemDrop, LPCHARACTER dropsystem)
#else
void CHARACTER::Reward(bool bItemDrop)
#endif

// Ara : 
LPCHARACTER pkAttacker = DistributeExp();

//Değiştir : 
#ifdef ENABLE_CMD_DROP_ITEM
    LPCHARACTER pkAttacker;
    if (dropsystem != NULL)
        pkAttacker = dropsystem;
    else
        pkAttacker = DistributeExp();
#else
    LPCHARACTER pkAttacker = DistributeExp();
#endif

cmd.cpp:
Genişlet Daralt Kopyala
// Müsait Bir yere ekle :
#ifdef ENABLE_CMD_DROP_ITEM
ACMD(do_mob_drop);
#endif

// Ara :
{ "\n",        NULL,            0,            POS_DEAD,    GM_IMPLEMENTOR    }

// Üstüne Ekle :
#ifdef ENABLE_CMD_DROP_ITEM
    { "mob_drop",            do_mob_drop,            0,    POS_DEAD,    GM_IMPLEMENTOR    },
#endif

cmd_general.cpp:
Genişlet Daralt Kopyala
// Müsait Bir yere ekle :
#ifdef ENABLE_CMD_DROP_ITEM
ACMD(do_mob_drop)
{
    if (!ch)
        return;
    
    char arg1[256], arg2[256];
    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
    
    DWORD mobVnum = 0;
    BYTE mobCount = 1, mobLimit = 100;
    
    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Usage: /mob_drop <mob_vnum> <count>");
        return;
    }
    
    str_to_number(mobVnum, arg1);
    
    if (*arg2)
        str_to_number(mobCount, arg2);
    
    if (mobVnum <= 0 || mobCount <= 0)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Hata: Geçersiz VNUM veya öldürme sayısı!");
        return;
    }
    
    if (mobCount > mobLimit)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Hata: Maksimum öldürme sayısı %d'dir.", mobLimit);
        return;
    }
    
    long mapIndex = ch->GetMapIndex();
    
    sys_log(0, "mob_drop: Spawning MobVNUM: %d at MapIndex: %ld (X: %d, Y: %d)",
        mobVnum, mapIndex, ch->GetX(), ch->GetY());
    
    int iKilled = 0;
    
    for (int i = 0; i < mobCount; ++i)
    {
        LPCHARACTER mob = CHARACTER_MANAGER::instance().SpawnMob(mobVnum, mapIndex,
            ch->GetX(), ch->GetY(), ch->GetZ());
    
        if (!mob)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Hata: Mob/metin spawn edilemedi! (Mob VNUM: %d, MapIndex: %ld)", mobVnum, mapIndex);
            sys_log(0, "mob_drop ERROR: Could not spawn mobVNUM: %d at MapIndex: %ld", mobVnum, mapIndex);
            continue;
        }
    
        if (mob->IsStone())
        {
            sys_log(0, "mob_drop: Destroying Metin Taşı VNUM: %d", mobVnum);
            mob->Reward(true, ch);
            iKilled++;
        }
        else if (mob->IsMonster())
        {
            sys_log(0, "mob_drop: Killing Monster VNUM: %d", mobVnum);
            mob->Reward(true, ch);
            iKilled++;
        }
    
        M2_DESTROY_CHARACTER(mob);
    }
    
    ch->ChatPacket(CHAT_TYPE_INFO, "Başarıyla %d adet %d VNUM'lu yaratık/metin taşı öldürüldü!", iKilled, mobVnum);
}


#endif
 
Ellerinize sağlık
Bunu nasıl bulduğunuzu merak ediyorum 😃 kafanızda ne vardı acaba
 
Geri
Üst