romegames 1
romegames
Bvural41 1
Bvural41
Best Studio 1
Best Studio
BlackFullMoon 1
BlackFullMoon
NovaLst 1
NovaLst
SLyFeLLowTR 1
SLyFeLLowTR
xranzei 1
xranzei
InfernoShade 1
InfernoShade
shrpnl 1
shrpnl
D 1
delimuratt
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

New item function by: Grzyb

  • Konuyu başlatan Konuyu başlatan muchomor1337
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 4
  • Görüntüleme Görüntüleme 992

muchomor1337

Level 2
Üye
Katılım
24 May 2018
Konular
35
Mesajlar
64
Online süresi
16d 13h
Reaksiyon Skoru
89
Altın Konu
0
TM Yaşı
8 Yıl 17 Gün
Başarım Puanı
97
Yaş
34
MmoLira
8,533
DevLira
75
Ticaret - 0%
0   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!



Kod:
ACMD(do_item_new) // Nowa funkcja by: Muchomor
{
    char arg1[256], arg2[256], arg3[256];
    three_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2), arg3, sizeof(arg3));

    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Usage: item <item vnum> <item count> <times to spawn>");
        return;
    }

    int iCount = 1;
    int iTimes = 1;

    if (*arg2)
    {
        str_to_number(iCount, arg2);
        iCount = MINMAX(1, iCount, g_bItemCountLimit);
    }

    if (*arg3)
    {
        str_to_number(iTimes, arg3);
        iTimes = MAX(1, iTimes);
    }

    DWORD dwVnum;
    std::pair<DWORD, DWORD> vnumRange;

    std::vector<std::string> v_range;
    std::string sRange(arg1);
    boost::split(v_range, sRange, boost::is_any_of("-"));

    if (v_range.size() < 2)
    {
        if (isnhdigit(*arg1))
        {
            str_to_number(dwVnum, arg1);
            if (!ITEM_MANAGER::instance().GetTable_NEW(dwVnum))
            {
                ch->ChatPacket(CHAT_TYPE_INFO, "#%u item does not exist by that vnum.", dwVnum);
                return;
            }
            else
            {
                vnumRange = std::make_pair(dwVnum, dwVnum);
            }
        }
        else
        {
            if (!ITEM_MANAGER::instance().GetVnum(arg1, dwVnum))
            {
                ch->ChatPacket(CHAT_TYPE_INFO, "#%u item does not exist by that vnum(%s).", dwVnum, arg1);
                return;
            }
            else
            {
                vnumRange = std::make_pair(dwVnum, dwVnum);
            }
        }
    }
    else
    {
        try
        {
            vnumRange = std::make_pair(std::stoul(v_range[0], NULL, 10), std::stoul(v_range[1], NULL, 10));
            if (vnumRange.first > vnumRange.second)
            {
                std::swap(vnumRange.first, vnumRange.second);
            }
        }
        catch (...)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Invalid range! To use range feature type following syntax: ID-ID.");
            return;
        }
    }

    for (unsigned int i = vnumRange.first; i <= vnumRange.second; i++)
    {
        for (int j = 0; j < iTimes; j++)
        {
            LPITEM item = ITEM_MANAGER::instance().CreateItem(i, iCount, 0, true);
            
            if (item)
            {
                if (item->IsDragonSoul())
                {
                    int iEmptyPos = ch->GetEmptyDragonSoulInventory(item);

                    if (iEmptyPos != -1)
                    {
                        item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
                        LogManager::instance().ItemLog(ch, item, "GM", item->GetName());
                    }
                    else
                    {
                        M2_DESTROY_ITEM(item);
                        if (!ch->DragonSoul_IsQualified())
                        {
                            ch->ChatPacket(CHAT_TYPE_INFO, "ŔÎşĄŔĚ Č°ĽşČ µÇÁö ľĘŔ˝.");
                        }
                        else
                        {
                            ch->ChatPacket(CHAT_TYPE_INFO, "Not enough inventory space.");
                        }
                    }
                }
                else
                {
                    int iEmptyPos = ch->GetEmptyInventory(item->GetSize());

                    if (iEmptyPos != -1)
                    {
                        item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
                        LogManager::instance().ItemLog(ch, item, "GM", item->GetName());
                    }
                    else
                    {
                        M2_DESTROY_ITEM(item);
                        ch->ChatPacket(CHAT_TYPE_INFO, "Not enough inventory space.");
                    }
                }
            }
            else
            {
                ch->ChatPacket(CHAT_TYPE_INFO, "#%u item does not exist by that vnum.", dwVnum);
            }
        }
    }
}
 

En Çok Reaksiyon Alan Mesajlar

[CODE lang="cpp" title="kontrol 1"]if (item->IsDragonSoul()) {
// ...
if (iEmptyPos != -1) {
item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
LogManager::instance().ItemLog(ch, item, "GM", item->GetName());
} else {
// ...
}
} else {
// ...
if (iEmptyPos != -1) {
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
LogManager::instance().ItemLog(ch, item, "GM", item->GetName());
} else {
// ...
}
}
[/CODE]

[CODE lang="cpp" title="kod 2"]} else {
// ...
if (iEmptyPos != -1) {
// ...
} else {
M2_DESTROY_ITEM(item);
ch->ChatPacket(CHAT_TYPE_INFO, "Not enough inventory space.");
}
}
[/CODE]

Burdaki envanter kontrolleri beğendim, paylaşım için teşekkürler kendime yazdığım event sisteminde de benzer bir şeyler kullanacağım. Bilgi için de teşekkürler.
Burada farklı bir yapı yok. Oyunun 10 yıl önce sızdırılan dosyalarındaki yapının aynısı ve korkunç.
Bu yapıda sürekli olarak kullanılmayan eşyalar yaratılıp bellekten siliniyor ve çıkış yok. Bunun yerine proto'daki size ile eşya yaratmadan boş slot arayabilirsin.

Bunu kullanmak istiyorsan envanter doluysa break at. Yoksa dolu envantere eşya almaya çalışmaya devam eder. GM komutu olduğu için verilmeyen eşyalar dert değil.

Thanks for share.
[CODE lang="cpp" title="kontrol 1"]if (item->IsDragonSoul()) {
// ...
if (iEmptyPos != -1) {
item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
LogManager::instance().ItemLog(ch, item, "GM", item->GetName());
} else {
// ...
}
} else {
// ...
if (iEmptyPos != -1) {
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
LogManager::instance().ItemLog(ch, item, "GM", item->GetName());
} else {
// ...
}
}
[/CODE]

[CODE lang="cpp" title="kod 2"]} else {
// ...
if (iEmptyPos != -1) {
// ...
} else {
M2_DESTROY_ITEM(item);
ch->ChatPacket(CHAT_TYPE_INFO, "Not enough inventory space.");
}
}
[/CODE]

Burdaki envanter kontrolleri beğendim, paylaşım için teşekkürler kendime yazdığım event sisteminde de benzer bir şeyler kullanacağım. Bilgi için de teşekkürler.
 
[CODE lang="cpp" title="kontrol 1"]if (item->IsDragonSoul()) {
// ...
if (iEmptyPos != -1) {
item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
LogManager::instance().ItemLog(ch, item, "GM", item->GetName());
} else {
// ...
}
} else {
// ...
if (iEmptyPos != -1) {
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
LogManager::instance().ItemLog(ch, item, "GM", item->GetName());
} else {
// ...
}
}
[/CODE]

[CODE lang="cpp" title="kod 2"]} else {
// ...
if (iEmptyPos != -1) {
// ...
} else {
M2_DESTROY_ITEM(item);
ch->ChatPacket(CHAT_TYPE_INFO, "Not enough inventory space.");
}
}
[/CODE]

Burdaki envanter kontrolleri beğendim, paylaşım için teşekkürler kendime yazdığım event sisteminde de benzer bir şeyler kullanacağım. Bilgi için de teşekkürler.
Burada farklı bir yapı yok. Oyunun 10 yıl önce sızdırılan dosyalarındaki yapının aynısı ve korkunç.
Bu yapıda sürekli olarak kullanılmayan eşyalar yaratılıp bellekten siliniyor ve çıkış yok. Bunun yerine proto'daki size ile eşya yaratmadan boş slot arayabilirsin.

Bunu kullanmak istiyorsan envanter doluysa break at. Yoksa dolu envantere eşya almaya çalışmaya devam eder. GM komutu olduğu için verilmeyen eşyalar dert değil.

Thanks for share.
 
Burada farklı bir yapı yok. Oyunun 10 yıl önce sızdırılan dosyalarındaki yapının aynısı ve korkunç.
Bu yapıda sürekli olarak kullanılmayan eşyalar yaratılıp bellekten siliniyor ve çıkış yok. Bunun yerine proto'daki size ile eşya yaratmadan boş slot arayabilirsin.

Bunu kullanmak istiyorsan envanter doluysa break at. Yoksa dolu envantere eşya almaya çalışmaya devam eder. GM komutu olduğu için verilmeyen eşyalar dert değil.

Thanks for share.
++
Ben de item'i verene kadar oluşturmanın mantıklı olduğunu düşünmüyorum,TItemTable'da kontrol etmeniz için yeterince veri var. Item oluşturulduktan sonra kontrollerde fonksiyon return'lenirse memory leak oluşacak. En son tüm kontrolleri geçtikten sonra item'i create edin ve create'den sonraki tek sorgu
if (!item) olmalı.
C++:
TItemTable* pTable = ITEM_MANAGER::instance().GetTable(dwVnum);
//item size
BYTE bSize = pTable->bSize;
 
Burada farklı bir yapı yok. Oyunun 10 yıl önce sızdırılan dosyalarındaki yapının aynısı ve korkunç.
Bu yapıda sürekli olarak kullanılmayan eşyalar yaratılıp bellekten siliniyor ve çıkış yok. Bunun yerine proto'daki size ile eşya yaratmadan boş slot arayabilirsin.

Bunu kullanmak istiyorsan envanter doluysa break at. Yoksa dolu envantere eşya almaya çalışmaya devam eder. GM komutu olduğu için verilmeyen eşyalar dert değil.

Thanks for share.
Teşekkür ederim hocam yazılım ve özellikle mt2 içinde yazılımı kendi başıma youtube ve udemyden öğreniyorum dediğinizi dikkate alacağım.
++
Ben de item'i verene kadar oluşturmanın mantıklı olduğunu düşünmüyorum,TItemTable'da kontrol etmeniz için yeterince veri var. Item oluşturulduktan sonra kontrollerde fonksiyon return'lenirse memory leak oluşacak. En son tüm kontrolleri geçtikten sonra item'i create edin ve create'den sonraki tek sorgu
if (!item) olmalı.
C++:
TItemTable* pTable = ITEM_MANAGER::instance().GetTable(dwVnum);
//item size
BYTE bSize = pTable->bSize;
Kardom bilgi için teşekkürler
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst