Jump to content

Wheel Of Destiny System


Recommended Posts

  • Honorable Member

M2 Download Center

This is the hidden content, please
( Internal )

This is the hidden content, please
( GitHub )

 

Here is the old german version: 

This is the hidden content, please

I revised it. Maybe someone would like to use it. Sorry for py and gui

  • Metin2 Dev 86
  • Eyes 2
  • Think 2
  • Confused 2
  • Scream 1
  • Lmao 1
  • Good 24
  • Love 3
  • Love 42

 

Link to comment
Share on other sites

  • 2 years later...
  • Replies 2
  • Created
  • Last Reply

Top Posters In This Topic

  • 1 year later...
#include "stdafx.h"
#include "wheel_of_destiny.h"
#include "char.h"

#if defined(WHEEL_OF_DESTINY)

static constexpr auto WheelItemMax = 16;

// vnum, count(max 255), chance(max 255)
static constexpr std::tuple<DWORD, std::uint8_t, std::uint8_t> m_Data[WheelItemMax] =
{
    { 11209, 1, 0 }, { 11219, 1, 0 }, { 11229, 1, 0 }, { 11239, 1, 0 },
    { 11249, 1, 0 }, { 11259, 1, 0 }, { 11269, 1, 0 }, { 11279, 1, 0 },
    { 11289, 1, 0 }, { 11299, 1, 0 }, { 19, 1, 100 }, { 279, 1, 0 },
    { 299, 1, 0 }, { 29, 1, 0 }, { 39, 1, 0 }, { 49, 1, 0 },
};

static constexpr auto ItemVnum = 5000; // item 
static constexpr auto ItemCount = 1;   // Gerekli miktar 

CWheelDestiny::CWheelDestiny(LPCHARACTER m_ch)
    : ch(m_ch), gift_vnum(0), gift_count(1), turn_count(0)
{
    for (auto i = 0; i < WheelItemMax; i++)
        ch->ChatPacket(CHAT_TYPE_COMMAND, "BINARY_WHEEL_ICON %lu %d %d", std::get<0>(m_Data[i]), std::get<1>(m_Data[i]), i);
    ch->ChatPacket(CHAT_TYPE_COMMAND, "BINARY_WHEEL_OPEN %d %d", ItemVnum, ch->GetWheelFreeCount());
}

CWheelDestiny::~CWheelDestiny() {
    if (GetGiftVnum())
        sys_log(0, "<CWheelDestiny> player(%s) didn't get his gift(vnum: %lu(%d.x))!!", ch->GetName(), GetGiftVnum(), GetGiftCount());
}

template <typename T> std::string NumberToMoneyString(T val)
{
    constexpr int comma = 3;
    auto str = std::to_string(val);
    auto pos = static_cast<int>(str.length()) - comma;

    while (pos > 0) {
        str.insert(pos, ".");
        pos -= comma;
    }

    return str;
}

void CWheelDestiny::TurnWheel()
{
    if (GetGiftVnum()) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Wait motherfucker!");
        return;
    }

    const auto WheelFreeCount = ch->GetWheelFreeCount();
    const auto ItemCountPlayer = ch->CountSpecifyItem(ItemVnum);

    if (WheelFreeCount < 1 && ItemCountPlayer < ItemCount) {
        ch->ChatPacket(CHAT_TYPE_INFO, "You need %d of item %d for <Turning Wheel>", ItemCount, ItemVnum);
        return;
    }

    auto Rand = PickAGift();
    if (Rand == -1) {
        sys_err("CWheelDestiny::TurnWheel() Error Pick Gift (%s)", ch->GetName());
        return;
    }

    if (WheelFreeCount > 0) {
        ch->SetWheelFreeCount(-1);
        ch->ChatPacket(CHAT_TYPE_INFO, "FREE");
    } else {
        ch->RemoveSpecifyItem(ItemVnum, ItemCount);
    }

    // vnum, count, spin count, pos
    ch->ChatPacket(CHAT_TYPE_COMMAND, "BINARY_WHEEL_TURN %lu %d %d %d", GetGiftVnum(), GetGiftCount(), number(1, 8), Rand);

    turn_count++;
}

std::uint8_t CWheelDestiny::GetChance() const
{
#undef max
    const auto TurnCount = GetTurnCount();
    if (TurnCount >= 10 && TurnCount < 25)
        return 25;
    if (TurnCount >= 25 && TurnCount < 40)
        return 50;
    if (TurnCount >= 40)
        return std::numeric_limits<std::uint8_t>::max(); // 255
    return 0;
}

int CWheelDestiny::PickAGift()
{
    const auto Chance = GetChance();

    while (true) {
        const auto rand_pos = number(0, WheelItemMax - 1);
        const auto& [item, count, m_chance] = m_Data[rand_pos];

        if (Chance >= m_chance) {
            SetGift(item, count);
            return rand_pos;
        }
    }
    return -1; // error
}

void CWheelDestiny::SetGift(const DWORD vnum, const std::uint8_t count)
{
    gift_vnum = vnum;
    gift_count = count;
}

void CWheelDestiny::GiveMyFuckingGift()
{
    const auto GiftVnum = GetGiftVnum();

    if (GiftVnum) {
        ch->AutoGiveItem(GiftVnum, GetGiftCount());
        SetGift(0, 1); // reset
    } else
        sys_err("Dude, where is the gift_vnum? <player: %s>", ch->GetName());
}

DWORD CWheelDestiny::GetGiftVnum() const
{
    return gift_vnum;
}

std::uint8_t CWheelDestiny::GetGiftCount() const
{
    return gift_count;
}

std::uint16_t CWheelDestiny::GetTurnCount() const
{
    return turn_count;
}

#endif

 

Link to comment
Share on other sites



×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.