Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

Moss Merchant for 1.00.90

Elite Diviner
Joined
Sep 28, 2005
Messages
419
Reaction score
105
How to configure?
I looked at the Raklion.dat file already, but if I changed the number to five in 1330 to not allow it.
Thanks in advance for your answer.
I'm sorry that I write here. :)

0061018B . 817D D4 681000>CMP DWORD PTR SS:[EBP-2C],1F4


Use olly to do this and change the red number with 15811 or a big number so you can put a higher number in the raklion.dat file.
You will have to search for the gs_cs offset.
 
Junior Spellweaver
Joined
Jul 30, 2005
Messages
176
Reaction score
110
0061018B . 817D D4 681000>CMP DWORD PTR SS:[EBP-2C],1F4


Use olly to do this and change the red number with 15811 or a big number so you can put a higher number in the raklion.dat file.
You will have to search for the gs_cs offset.

That's why my Raklion work normal. My GS was already patched... :eek:tt1:

Code:
0061018B   .  817D D4 81510>cmp dword ptr ss:[ebp-2C],15181
 
IGCN Co-Founder
Joined
Jun 26, 2006
Messages
303
Reaction score
487
Wow, very nice dude ! Can you share the GambleSystem.cpp and .h ?
Code:
#pragma once

#define MAX_GAMBLING_OPTION_RATE 5
#define MAX_GAMBLING_SPECIAL_ITEM_RATE 6
#define MAX_GAMBLING_EXC_OPTION_RATE 5
#define MAX_GAMBLING_EXC_LEVEL 7
#define MAX_GAMBLING_NORMAL_BAG_OPTION_RATE 25

#define MAX_GAMBLING_GROUPS 25
#define MAX_GAMBLING_GROUP_ITEMS 150

struct GAMBLING_ITEM_OPTION_RATE
{
    int iSkillOptionRate;    // 0
    int iLuckOptionRate;    // 4
    int iAddOptionRate;    // 8
    int iExOptionRate;    // C
    int iSortOptionRate;
};

struct GAMBLING_ITEMLIST
{
    WORD wItemIndex;    // 0
    BYTE btItemType;    // 2
    BYTE btItemLevelMin;    // 3
    BYTE btItemLevelMax;    // 4
    BYTE btSkillOption;    // 5
    BYTE btLuckOption;    // 6
    BYTE btAddOption;    // 7
    BYTE btExOption;    // 8
};


class CGamblingSystem
{
public:
    CGamblingSystem(void);
    virtual ~CGamblingSystem(void);

    void Initialize(LPSTR lpFileName);
    bool TryGambling(int aIndex, int a2, int a3, int a4, BYTE pos);

    int GetItemCount() { return this->m_iGamblingAllItemCount; }

private:

    bool LoadFile(LPSTR lpFileName);
    int GetItemLevel(int Group, int Item);
    int GetExcellentOption(int Number);

    bool m_bFileLoad;

    int m_iGamblingOptionRate[MAX_GAMBLING_OPTION_RATE];
    int m_iGamblingSpecialItemRate[MAX_GAMBLING_SPECIAL_ITEM_RATE];
    int m_iGamblingExcOptionRate[MAX_GAMBLING_EXC_OPTION_RATE];
    int m_iGamblingExcSpecialLevel[MAX_GAMBLING_EXC_LEVEL];
    int m_iGamblingExcNormalLevel[MAX_GAMBLING_EXC_LEVEL];
    int m_iGamblingItemCount[MAX_GAMBLING_GROUPS];
    int m_iGamblingGroups;
    int m_iGamblingAllItemCount;
    GAMBLING_ITEMLIST m_iGamblingItems[MAX_GAMBLING_GROUPS][MAX_GAMBLING_GROUP_ITEMS];
    GAMBLING_ITEM_OPTION_RATE m_iGamblingItemOptionRate[MAX_GAMBLING_NORMAL_BAG_OPTION_RATE];
};

extern CGamblingSystem g_Gambling;

Code:
#include "stdafx.h"
#include "GamblingSystem.h"
#include "..\common\ReadScript.h"
#include "..\common\winutil.h"
#include "logproc.h"
#include "LargeRand.h"
#include "user.h"
#include "DSProtocol.h"

CGamblingSystem g_Gambling;

CGamblingSystem::CGamblingSystem(void)
{
}


CGamblingSystem::~CGamblingSystem(void)
{
}

void CGamblingSystem::Initialize(LPSTR lpFileName)
{
    this->m_bFileLoad = false;
    this->m_iGamblingAllItemCount = 0;
    this->m_iGamblingGroups = 0;

    for(int i=0;i<MAX_GAMBLING_OPTION_RATE;i++)
    {
        this->m_iGamblingOptionRate[i] = 0;
    }

    for(int j=0;j<MAX_GAMBLING_SPECIAL_ITEM_RATE;j++)
    {
        this->m_iGamblingSpecialItemRate[j] = 0;
    }

    for(int k=0;k<MAX_GAMBLING_EXC_OPTION_RATE;k++)
    {
        this->m_iGamblingExcOptionRate[k] = 0;
    }

    for(int l=0;l<MAX_GAMBLING_EXC_LEVEL;l++)
    {
        this->m_iGamblingExcSpecialLevel[l] = 0;
        this->m_iGamblingExcNormalLevel[l] = 0;
    }
    
    for(int m=0;m<MAX_GAMBLING_NORMAL_BAG_OPTION_RATE;m++)
    {
        this->m_iGamblingItemCount[m] = 0;
    }

    this->LoadFile(lpFileName);
}



bool CGamblingSystem::LoadFile(LPSTR lpFileName)
{
    int Token;
    int Group;
    int count;
    int Table = 0;

    SMDFile = fopen(lpFileName, "r");

    if(SMDFile != NULL)
    {
        while ( true )
        {
            Token = GetToken();
        
            if(Token == END)
            {
                break;
            }
            else if(Token == NUMBER)
            {
                Group = TokenNumber;
                
                switch ( Group )
                {
                    case 0:
                    {
                        count = 0;

                        while ( true )
                        {
                            Token = GetToken();

                            if(!strcmp("end", TokenString))
                                break;

                            if ( count > 25 )
                            {
                                MsgBox("Load Script Error %s", lpFileName);
                                break;
                            }

                            this->m_iGamblingItemOptionRate[count].iSkillOptionRate = TokenNumber;

                            Token = GetToken();
                            this->m_iGamblingItemOptionRate[count].iLuckOptionRate = TokenNumber;

                            Token = GetToken();
                            this->m_iGamblingItemOptionRate[count].iAddOptionRate = TokenNumber;

                            Token = GetToken();
                            this->m_iGamblingItemOptionRate[count].iExOptionRate = TokenNumber;

                            Token = GetToken();
                            this->m_iGamblingItemOptionRate[count++].iSortOptionRate = TokenNumber;
                        }

                        break;
                    }

                    case 1:
                    {
                        count = 0;

                        while ( true )
                        {
                            Token = GetToken();

                            if(!strcmp("end", TokenString))
                                break;

                            if ( count > 4 )
                            {
                                MsgBox("Load Script Error %s", lpFileName);
                                break;
                            }

                            this->m_iGamblingOptionRate[count++] = TokenNumber;
                        }

                        break;
                    }
                    
                    case 2:
                    {
                        count = 0;

                        while ( true )
                        {
                            Token = GetToken();

                            if(!strcmp("end", TokenString))
                                break;

                            if ( count > 5 )
                            {
                                MsgBox("Load Script Error %s", lpFileName);
                                break;
                            }

                            this->m_iGamblingSpecialItemRate[count++] = TokenNumber;
                        }
                        
                        break;
                    }

                    case 3:
                    {
                        count = 0;

                        while ( true )
                        {
                            Token = GetToken();

                            if(!strcmp("end", TokenString))
                                break;

                            if ( count > 4 )
                            {
                                MsgBox("Load Script Error %s", lpFileName);
                                break;
                            }

                            this->m_iGamblingExcOptionRate[count++] = TokenNumber;
                        }

                        break;
                    }

                    case 4:
                    {
                        count = 0;

                        while ( true )
                        {
                            Token = GetToken();
                            if(!strcmp("end", TokenString))
                                break;

                            if ( count > 4 )
                            {
                                MsgBox("Load Script Error %s", lpFileName);
                                break;
                            }

                            this->m_iGamblingExcSpecialLevel[count] = TokenNumber;

                            Token = GetToken();
                            this->m_iGamblingExcNormalLevel[count++] = TokenNumber;
                        }
                        
                        break;
                    }

                    default:
                    {
                        if ( Group >= 5 )
                        {
                            int count = 0;

                            while ( true )
                            {
                                Token = GetToken();
                                if(!strcmp("end", TokenString))
                                    break;

                                this->m_iGamblingItems[Table][count].wItemIndex = TokenNumber;

                                Token = GetToken();
                                this->m_iGamblingItems[Table][count].btItemType = TokenNumber;

                                Token = GetToken();
                                this->m_iGamblingItems[Table][count].btItemLevelMin = TokenNumber;

                                Token = GetToken();
                                this->m_iGamblingItems[Table][count].btItemLevelMax = TokenNumber;
                                
                                Token = GetToken();
                                this->m_iGamblingItems[Table][count].btSkillOption = TokenNumber;

                                Token = GetToken();
                                this->m_iGamblingItems[Table][count].btLuckOption = TokenNumber;

                                Token = GetToken();
                                this->m_iGamblingItems[Table][count].btAddOption = TokenNumber;

                                Token = GetToken();
                                this->m_iGamblingItems[Table][count].btExOption = TokenNumber;

                                if(this->m_iGamblingItems[Table][count].btItemLevelMin >
                                    this->m_iGamblingItems[Table][count].btItemLevelMax)
                                {
                                    MsgBox("Load Script Error %s", lpFileName);
                                    return 0;
                                }

                                count++;
                                this->m_iGamblingAllItemCount++;

                                if(this->m_iGamblingAllItemCount > 149)
                                    break;
                            }

                            this->m_iGamblingItemCount[Table] = count;

                            Table++;

                            if(Table > 24)
                                break;
                            
                            this->m_iGamblingGroups = Table;
                        }
                    }
                }
            }
        }

        fclose(SMDFile);

        this->m_bFileLoad = true;
    }

    return this->m_bFileLoad;
}

int CGamblingSystem::GetItemLevel(int Group, int Item)
{
    if(Item < 0 && Item > 149)
    {
        return 0;
    }
    else
    {
        if(this->m_iGamblingItems[Group][Item].btItemLevelMin == this->m_iGamblingItems[Group][Item].btItemLevelMax)
        {
            return this->m_iGamblingItems[Group][Item].btItemLevelMin;
        }
        else
        {
            return rand() % (this->m_iGamblingItems[Group][Item].btItemLevelMax - this->m_iGamblingItems[Group][Item].btItemLevelMin +1) + this->m_iGamblingItems[Group][Item].btItemLevelMin;
        }
    }
}

int CGamblingSystem::GetExcellentOption(int Number)
{
    int v4 = 0;
    int Exc = 0;
    int i;
    for (i=0; ; i++)
    {
        if(this->m_iGamblingExcSpecialLevel[i] < GetLargeRand()%1000000)
            v4++;
        else
            Exc |= 1 << i;
        if(v4 >= 6 - Number)
            break;
    }

    while (true)
    {
        i++;
        if ( i >= 6 )
            break;
        Exc |= 1 << i;
    }

    return Exc;
}

bool CGamblingSystem::TryGambling(int aIndex, int a2, int a3, int a4, BYTE pos)
{
    if(!this->m_bFileLoad)
        return false;

    int Skill = 0, Luck = 0, Option = 0, Excellent = 0, Level = 0, RandomKey = 0, ItemNumber = -1;

    if ( this->GetItemCount() > 0 )
    {

        if ( this->m_iGamblingSpecialItemRate[pos] < GetLargeRand() % 1000000 )
        {
            int ItemGetMax = 0;
            int ItemGetMin = 0;
            int ItemCount = 0;
            int StartGroup = 0;

            switch ( pos )
            {
                case 0:
                    StartGroup = 0;
                    break;
                case 2:
                    StartGroup = 5;
                    break;
                case 4:
                    StartGroup = 10;
                    break;
                case 6:
                    StartGroup = 15;
                    break;
                case 24:
                    StartGroup = 20;
                    break;
            }

            RandomKey = GetLargeRand() % 1000000;
            int Sort = 0;
            for (int i = StartGroup; i < StartGroup+5; i++)
            {
                Sort += this->m_iGamblingItemOptionRate[i].iSortOptionRate;
                if ( RandomKey <= Sort )
                {
                    StartGroup = i;
                    break;
                }
            }

            while ( true )
            {
                ItemGetMax += this->m_iGamblingItemCount[ItemCount];
                if(StartGroup <= ItemCount)
                    break;
                ItemGetMin += this->m_iGamblingItemCount[ItemCount++];
            }

            int ItemIndex = GetLargeRand() % (ItemGetMax-ItemGetMin);
            Level = this->GetItemLevel(StartGroup, ItemIndex);
            ItemNumber = ItemGetNumberMake(this->m_iGamblingItems[StartGroup][ItemIndex].wItemIndex, this->m_iGamblingItems[StartGroup][ItemIndex].btItemType);
            if(ItemNumber == -1)
                return 0;

            if(this->m_iGamblingItems[StartGroup][ItemIndex].btSkillOption && this->m_iGamblingItemOptionRate[StartGroup].iSkillOptionRate >= GetLargeRand() % 1000000)
            {
                Skill = 1;
            }
            if(this->m_iGamblingItems[StartGroup][ItemIndex].btLuckOption && this->m_iGamblingItemOptionRate[StartGroup].iLuckOptionRate >= GetLargeRand() % 1000000)
            {
                Luck = 1;
            }
            if(this->m_iGamblingItems[StartGroup][ItemIndex].btAddOption && this->m_iGamblingItemOptionRate[StartGroup].iAddOptionRate >= GetLargeRand() % 1000000)
            {
                RandomKey = GetLargeRand()%1000000;

                if(RandomKey > this->m_iGamblingOptionRate[0])
                {
                    if(RandomKey > this->m_iGamblingOptionRate[1] + this->m_iGamblingOptionRate[0])
                    {
                        if(RandomKey > this->m_iGamblingOptionRate[2] + this->m_iGamblingOptionRate[1] + this->m_iGamblingOptionRate[0])
                        {
                            if(RandomKey <= this->m_iGamblingOptionRate[3] + this->m_iGamblingOptionRate[2] + this->m_iGamblingOptionRate[1] + this->m_iGamblingOptionRate[0])
                            {
                                Option = 4;
                            }
                        }
                        else
                        {
                            Option = 3;
                        }
                    }
                    else
                    {
                        Option = 2;
                    }
                }
                else
                {
                    Option = 1;
                }
            }
            
            if ( this->m_iGamblingItems[StartGroup][ItemIndex].btExOption )
            {
                if ( this->m_iGamblingItemOptionRate[StartGroup].iExOptionRate >= GetLargeRand() % 1000000 )
                {
                    Excellent = 1;
                    Luck = 0;
                    Skill = 1;
                    Level = 0;
                }
            }
        }
        else
        {
            Level = 0;
            Skill = 1;
            Luck = 0;

            RandomKey = GetLargeRand()%1000000;

            if(RandomKey > this->m_iGamblingOptionRate[0])
            {
                if(RandomKey > this->m_iGamblingOptionRate[1] + this->m_iGamblingOptionRate[0])
                {
                    if(RandomKey > this->m_iGamblingOptionRate[2] + this->m_iGamblingOptionRate[1] + this->m_iGamblingOptionRate[0])
                    {
                        if(RandomKey <= this->m_iGamblingOptionRate[3] + this->m_iGamblingOptionRate[2] + this->m_iGamblingOptionRate[1] + this->m_iGamblingOptionRate[0])
                        {
                            Option = 4;
                        }
                    }
                    else
                    {
                        Option = 3;
                    }
                }
                else
                {
                    Option = 2;
                }
            }
            else
            {
                Option = 1;
            }

            RandomKey = GetLargeRand()%1000000;

            if(RandomKey > this->m_iGamblingExcOptionRate[0])
            {
                if(RandomKey > this->m_iGamblingExcOptionRate[1] + this->m_iGamblingExcOptionRate[0])
                {
                    if(RandomKey > this->m_iGamblingExcOptionRate[2] + this->m_iGamblingExcOptionRate[1] + this->m_iGamblingExcOptionRate[0])
                    {
                        if(RandomKey <= this->m_iGamblingExcOptionRate[3] + this->m_iGamblingExcOptionRate[2] + this->m_iGamblingOptionRate[1] + this->m_iGamblingExcOptionRate[0])
                        {
                            this->GetExcellentOption(4);
                        }
                    }
                    else
                    {
                        this->GetExcellentOption(3);
                    }
                }
                else
                {
                    this->GetExcellentOption(2);
                }
            }
            else
            {
                this->GetExcellentOption(1);
            }

            switch ( pos )
            {
                case 0:
                    ItemNumber = ItemGetNumberMake(3,11);
                    break;
                case 2:
                    ItemNumber = ItemGetNumberMake(5,33);
                    break;
                case 4:
                    ItemNumber = ItemGetNumberMake(4,24);
                    break;
                case 6:
                    ItemNumber = ItemGetNumberMake(2,18);
                    break;
                case 24:
                    ItemNumber = ItemGetNumberMake(5,34);
                    break;
            }
        }
        ItemSerialCreateSend(aIndex, 238, 0, 0, ItemNumber, Level, 255, Skill, Luck, Option, aIndex, Excellent, 0);

        LogAddTD("[Gambling][Try Gambling] (%s)(%s) Try item: %d Level:%d op1:%d op2:%d op3:%d ExOp:%d",
            gObj[aIndex].AccountID, gObj[aIndex].Name, ItemNumber, Level, Skill, Luck, Option, Excellent);
    }
    return 1;
}

It's not 100% 1:1 decompilation, but it works like original, IGCN have 100% decompiled gs .90 too ^^.
 
Back
Top