Team BlueWater Game Online Tutorial's
Bine ati venit la Team-BlueWater!!Tutorial's 4 all Games!

[Release] Mu Online Sources

View previous topic View next topic Go down

[Release] Mu Online Sources

Post  m4s4cru on Tue Aug 02, 2011 10:32 am

Command /post source code
Code:
void DataSendAll(unsigned char* Packet, int Length)
{
    for (int i=6400; i<7400; i++)
        if(gObjIsConnected(i))
            DataSend(i, Packet, Length);
}

void SendPost(int wId, LPCSTR Command, LPCSTR Text)
{
    if (!IsPost) return;
    if (!gObjIsConnected(wId)) return;
    if (!strcmpi(Command, "/Post"))
    {
        MessageOutput(wId, "[%s] Useage: /Post <Msg>.", szPrefix);
        MessageOutput(wId, "[%s] Price for post: %d, Minimun Level: %d", szPrefix, PostCost, PostLevel);
        return;
    }
    gObj_SetInfo(wId);
    if (gObj.Level < PostLevel)
    {
        MessageOutput(wId, "[%s] You're level is too low to post!", szPrefix);
        return;
    }
    if (gObj.Money < PostCost)
    {
        MessageOutput(wId, "[%s] You don't have enough money to post!", szPrefix);
        return;
    }
    BYTE *Packet;
    char Message[100];
    Packet = (BYTE*) malloc(200);
    memset(Packet, 0x00, 200);
    *Packet = 0xC1;
    *(Packet+2) = 0x00;
    memcpy((Packet+3), gObj.Nick, strlen(gObj.Nick));
    sprintf(Message, "@@[Global] %s", Text);
    memcpy((Packet+13), Message, strlen(Message));
    int Len = (strlen(Message) + 0x13);
    *(Packet+1) = Len;
    DataSendAll(Packet, Len);
    int Amount = (gObj.Money - PostCost);
    gObj_Write(wId, gObj_Money, Amount);
    MoneySend(wId, Amount);
    free (Packet);

Adding new options to gameserver

Code:
/* AddMU.cpp
made by: drakelv
Updates by: DMCahir
*/
#include "AddMU.h"
//////////////////////////////////////////////////////////////////////
// Source Start
//////////////////////////////////////////////////////////////////////
#include <string.h>
#include <windows.h>
 
extern "C" __declspec(dllexport) void OptionAndBugFix();
// Fixing Potion Bug in GS
bool PotBugFix( char * inipath )
{
if (GetPrivateProfileInt("GameServerNormal" , "PotionBugFix" , 1 , "./Addicted.ini")){
memset((PBYTE) FixPotionBug1 ,0x90,8 ) ; //warehouse
memset((PBYTE) FixPotionBug2 ,0x90,8 ) ; //inventory
memset((PBYTE) FixPotionBug3 ,0x90,8 ) ;
return 1;
}
return 0;
}
// Fixing ID Code in GS for characters
bool NoIDChar( char * inipath)
{
if (GetPrivateProfileInt("GameServerNormal" , "DeleteCharWithoutID" , 1 , "./Addicted.ini")){
memset((PBYTE) FixDeleteChar, 0xEB , 1 ); //Dzēst čaru bez ID.
return 1;
}
return 0;
}
// Fixing ID Code in GS for Guilds
bool NoIDGuild( char * inipath )
{
if (GetPrivateProfileInt("GameServerNormal", "DeleteGuildWithoutID", 1, "./Addicted.ini")){
memset((PBYTE) FixDeleteGuild ,0x90 , 6 ); //Dzēst ģildi bez ID
memset((PBYTE) FixLeaveGuild ,0x90 , 2 ); //Pames ģildi bez ID
return 1;
}
return 0;
}
// Party Zen Bug Fix
// transformation ring change
 
bool TransRing( char * inipath ){
int TransformationRing = GetPrivateProfileInt("GameServerNormal", "TransformationRingInit", 0, "Addicted.ini");
DWORD dwTmp ;
dwTmp=GetPrivateProfileInt("GameServerNormal", "TransformationRing1",2, "Addicted.ini") ;
*(unsigned int *) TransformationRing1 = dwTmp ;
dwTmp=GetPrivateProfileInt("GameServerNormal", "TransformationRing2",7, "Addicted.ini") ;
*(unsigned int *) TransformationRing2 = dwTmp ;
dwTmp=GetPrivateProfileInt("GameServerNormal", "TransformationRing3",14, "Addicted.ini") ;
*(unsigned int *) TransformationRing3 = dwTmp ;
dwTmp=GetPrivateProfileInt("GameServerNormal", "TransformationRing4",8, "Addicted.ini") ;
*(unsigned int *) TransformationRing4 = dwTmp ;
dwTmp=GetPrivateProfileInt("GameServerNormal", "TransformationRing5",9, "Addicted.ini") ;
*(unsigned int *) TransformationRing5 = dwTmp ;
dwTmp=GetPrivateProfileInt("GameServerNormal", "TransformationRing6",41, "Addicted.ini") ;
*(unsigned int *) TransformationRing6 = dwTmp ;
return 1 ;
}
bool NotifyIfDllLoaded( char * inipath ){
if (GetPrivateProfileInt("GameServerNormal", "NotifyIfDllLoaded", 1, "./Addicted.ini") )
{
MessageBox ( 0 , "Addicted.Dll by drakelv has been successfully loaded. Enjoy the Game!" , "DLL Loaded!" , MB_OK );
return 1;
}
else return 0;
}
void ChaosBoxRate()
{
    DWORD dwTemp ;
    BYTE cTemp ;
    dwTemp = GetPrivateProfileIntA("GameServerNormal", "ChaosMix10",50, "./DMT.ini") ;
    *(unsigned int *) ChaosMix10 = dwTemp ;

    dwTemp = GetPrivateProfileIntA("GameServerNormal", "ChaosMix11",45, "./DMT.ini") ;
    *(unsigned int *) ChaosMix11 = dwTemp ;

    dwTemp = GetPrivateProfileIntA("GameServerNormal", "ChaosMix12",45, "./DMT.ini") ;
    *(unsigned int *) ChaosMix12 = dwTemp ;

    dwTemp = GetPrivateProfileIntA("GameServerNormal", "ChaosMix13",45, "./DMT.ini") ;
    *(unsigned int *) ChaosMix13 = dwTemp ;
}

void JewelSuccesRate()
{
    BYTE cTemp ;
    cTemp = GetPrivateProfileIntA("GameServerNormal", "SoulWithLuckSuccessRate",70, "./DMT.ini") ;
    *(unsigned char *) SoulLuckRate = cTemp ;

    cTemp = GetPrivateProfileIntA("GameServerNormal", "SoulNoLuckSuccessRate", 55, "./DMT.ini") ;
    *(unsigned char *) SoulRate = cTemp ;

    cTemp = GetPrivateProfileIntA("GameServerNormal", "LifeSuccessRate", 50, "./DMT.ini") ;
    *(unsigned char *) LifeRate = 100 - cTemp ;
}

void JewelPrices()
{
    DWORD dwTemp;

    dwTemp = GetPrivateProfileIntA("GameServerNormal", "BlessiPrice", 9000000, "./DMT.ini") ;
    *(unsigned int *) BlessPrice = dwTemp ;

    dwTemp = GetPrivateProfileIntA("GameServerNormal", "SoulPrice", 6000000, "./DMT.ini") ;
    *(unsigned int *) SoulPrice = dwTemp ;

    dwTemp = GetPrivateProfileIntA("GameServerNormal", "ChaosPrice", 810000, "./DMT.ini") ;
    *(unsigned int *) ChaosPrice = dwTemp ;

    dwTemp = GetPrivateProfileIntA("GameServerNormal", "LifePrice", 45000000, "./DMT.ini") ;
    *(unsigned int *) LifePrice = dwTemp ;

    dwTemp = GetPrivateProfileIntA("GameServerNormal", "CreationPrice", 36000000, "./DMT.ini") ;
    *(unsigned int *) CreationPrice = dwTemp ;

    dwTemp = GetPrivateProfileIntA("GameServerNormal", "GuardianPrice", 60000000, "./DMT.ini") ;
    *(unsigned int *) GuardianPrice = dwTemp ;

    dwTemp = GetPrivateProfileIntA("GameServerNormal", "PotionOfBlessPrice", 900000, "./DMT.ini") ;
    *(unsigned int *) BlessPotionPrice = dwTemp ;

    dwTemp = GetPrivateProfileIntA("GameServerNormal", "PotionOfSoulPrice", 450000, "./DMT.ini") ;
    *(unsigned int *) SoulPotionPrice = dwTemp ;
}
void OptionAndBugFix()
{
char inipath[] = "./Addicted.ini";
bool bResult ;
DWORD dwOld1,dwOld2;
LPVOID lpAddress1,lpAddress2 ;
lpAddress1 = (LPVOID) 0x00401000 ; //fix96
lpAddress2 = (LPVOID) 0x0C296000 ; //fix96
if ( VirtualProtect (lpAddress1,0x246000+0x1D000,PAGE_EXECUTE_READWRITE,&dwOld1 ) ) //fix96
{
if (VirtualProtect(lpAddress2,0x4000,PAGE_EXECUTE_READWRITE, &dwOld2) ) //fix96
{
bResult =FixPotionNumber( inipath );
bResult =NoIDChar( inipath );
bResult =NoIDGuild( inipath );
bResult =TransRing( inipath );
bResult =NotifyIfDllLoaded( inipath );
bResult =PartyZenFix( inipath );
}
// Gs is VirtualProtected so we need to use Vprotect function.
VirtualProtect (lpAddress1,0x246000+0x1D000,PAGE_EXECUTE_READ,&dwOld1 );
VirtualProtect (lpAddress2,0x4000 ,PAGE_EXECUTE_READ,&dwOld2 );
}
}

The .H file
Code:

#define FixDeleteGuild 0x004431CA
#define FixLeaveGuild 0x00443320
#define FixDeleteChar 0x004328E4
#define FixPotionBug1 0x00427A71
#define FixPotionBug3 0x004CD0FF
#define FixPotionBug2 0x004CD0AE
#define FixZenParty 0x004DD318
#define TransformationRing1 0x004B472E
#define TransformationRing2 0x004B4737
#define TransformationRing3 0x004B4740
#define TransformationRing4 0x004B4749
#define TransformationRing5 0x004B4752
#define TransformationRing6 0x004B475B
//Ceny Jeweli
#define ChaosPrice 0x00508489
#define SoulPrice 0x00508446
#define BlessPrice 0x00508467
#define CreationPrice 0x005084CC
#define GuardianPrice 0x005085AA
#define LifePrice 0x005084AB

//Ceny potionów
#define BlessPotionPrice 0x005085E1
#define SoulPotionPrice 0x00508607

//Chaos Machine
#define ChaosMix10 0x0049136F
#define ChaosMix11 0x0049139A
#define ChaosMix12 0x004913C5
#define ChaosMix13 0x004913F0

//Jewel Rate
#define SoulLuckRate 0x004F80CF
#define SoulRate 0x004F81AE
#define LifeRate 0x004F893D
 char inipath[] = "./Addicted.ini";

Command /add source
Code:

/*
Credits: coNsept,Yukura,leo123
*/
void AddStats(int aIndex)
{
    if (!IsAddCmd) return;
    cObj->Init(aIndex);
    if (!strcmpi(Message, "/add"))
    {
        MessageOutput(aIndex, "Useage: /add <Type> <Amount>");
        MessageOutput(aIndex, "The price for Add is: %d, Maximum stats: %d", AddPrice, AddMax);
        return;
    }
    if (cObj->Money < AddPrice)
    {
        MessageOutput(aIndex, "You are lacking zen! %d", AddPrice - cObj->Money);
        return;
    }
    char Param1[100];
    memset(Param1, 0x00, 100);
    GetParam(1, Message, Param1);
    int AddType = 0;
    if (!strcmpi(Param1, "str")) AddType = 0xB8;
    if (!strcmpi(Param1, "agi")) AddType = 0xBA;
    if (!strcmpi(Param1, "vit")) AddType = 0xBC;
    if (!strcmpi(Param1, "eng")) AddType = 0xBE;
    if (!strcmpi(Param1, "cmd")) AddType = 0xD8;
    if (!AddType)
    {
        MessageOutput(aIndex, "You have selected wrong type! The types are: str, agi, vit, eng, cmd");
        return;
    }
    if (cObj->Class != 4 && AddType == 0xD8)
    {
        MessageOutput(aIndex, "Only Dark Lords can use the add cmd type.");
        return;
    }
    char Param2[100];
    memset(Param2, 0x00, 100);
    GetParam(2, Message, Param2);
    int StatsToAdd = atoi(Param2);
    if (cObj->LvlUpPoints < StatsToAdd)
    {
        MessageOutput(aIndex, "You are lacking level up points! %d", StatsToAdd - cObj->LvlUpPoints);
        return;
    }
    int NowStats = cObj->GetWord(AddType);
    if ((StatsToAdd + NowStats) > AddMax)
    {
        MessageOutput(aIndex, "You are not allowed to add more than %d points!", AddMax);
        return;
    }
    BYTE Packet[5] = {0xC1, 0x05, 0x0F3, 0x06};
    Packet[4] = ((AddType % 16) ^ 8) / 2; // Nice algorithm by coNsept to convert from gObj Offsets to the add types :P
    if (AddType == 0xD8) Packet[4] = 0x04;
    if (StatsToAdd <= 100)
        for (int i=0; i<StatsToAdd; i++)
            CGLevelUpPointAdd(Packet, aIndex);
    else
    {
        int Amount = (cObj->LvlUpPoints - StatsToAdd - 1);
        cObj->SetInt(0xA4, Amount);
        cObj->AddInt(AddType, StatsToAdd - 1);
        CGLevelUpPointAdd(Packet, aIndex);
    }
    cObj->SetInt(0xB4, cObj->Money - AddPrice);
    CGMoneySend(aIndex, cObj->Money - AddPrice);
    cObj->Init(aIndex);
    MessageOutput(aIndex, "You've added %d points. You have now %d points left.", StatsToAdd, cObj->LvlUpPoints);
    if (StatsToAdd > 100)
        MessageOutput(aIndex, "Please relog and your stats will be updated.");
}
Season 3 Quest source
Code:

/*
Credits: deathway from CzF
*/
BOOL CQuestInfo::QuestClear(LPOBJ lpObj, int QuestIndex) 

    LPQUESTINFOSTRUCT lpQuestInfo = this->GetQuestInfo(QuestIndex); 

    if ( lpQuestInfo == NULL ) 
    { 
        return -1; 
    } 

    int subquestcount = lpQuestInfo->iSubInfoCount; 
    int concount = lpQuestInfo->iFailInfoCount; 
    LPQUESTREQ lpSubInfo; 

    for ( int subquest=0;subquest<subquestcount;subquest++) 
    { 
        lpSubInfo = this->GetSubquestInfo(lpObj, lpQuestInfo, subquest); 

        if ( lpSubInfo != NULL ) 
        { 
            if ( lpSubInfo->iCompensationType == QUEST_COMPENSATION_CHANGEUP ) 
            { 
                lpObj->iFreeStatPoints += lpSubInfo->iAdditionalStatPoints; 
                GCSendQuestPrize(lpObj->Index, QUEST_COMPENSATION_CHANGEUP, lpSubInfo->iAdditionalStatPoints ); 
                lpObj->btChangeUP = 1; 
                lpObj->btCharacterClass |= 1; 
                gObjMakePreviewCharSet(lpObj->Index); 
                BYTE btClass = (lpObj->wClass * 32) & 224 ; 
                btClass |= (lpObj->btCharacterClass * 16) & 16; 
                GCSendQuestPrize(lpObj->Index, QUEST_COMPENSATION_CHANGEUP, btClass); 
                LogAddTD("[Quest] Quest Clear (%s) : [%s][%s] Stat(%d,%d), ChangeUP", 
                    lpQuestInfo->szQuestName, lpObj->AccountID, lpObj->CharName, lpObj->iFreeStatPoints, 
                    lpSubInfo->iAdditionalStatPoints ); 
            } 
            else if ( lpSubInfo->iCompensationType == QUEST_COMPENSATION_STATUP ) 
            { 
                lpObj->iFreeStatPoints += lpSubInfo->iAdditionalStatPoints; 
                GCSendQuestPrize(lpObj->Index, QUEST_COMPENSATION_STATUP, lpSubInfo->iAdditionalStatPoints ); 
                LogAddTD("[Quest] Quest Clear (%s) : [%s][%s] Stat(%d,%d)", 
                    lpQuestInfo->szQuestName, lpObj->AccountID, lpObj->CharName, lpObj->iFreeStatPoints, 
                    lpSubInfo->iAdditionalStatPoints ); 
            } 
            else if ( lpSubInfo->iCompensationType == QUEST_COMPENSATION_PLUSSSTAT ) 
            { 
                int level = lpObj->Level - QUEST_MINLEVEL_PLUSSTAT; 

                if ( level <= 0 ) 
                { 
                    level = 0; 
                } 

                lpObj->iFreeStatPoints += level; 
                lpObj->btPlusQuest = TRUE; 
                GCSendQuestPrize(lpObj->Index, QUEST_COMPENSATION_PLUSSSTAT, level ); 
                LogAddTD("[Quest] Quest Clear (%s) : [%s][%s] Stat(%d,%d), PlusStat", 
                    lpQuestInfo->szQuestName, lpObj->AccountID, lpObj->CharName, lpObj->iFreeStatPoints, 
                    lpSubInfo->iAdditionalStatPoints ); 
            } 
            else if ( lpSubInfo->iCompensationType == QUEST_COMPENSATION_COMBOSKILL ) 
            { 
                GCSendQuestPrize(lpObj->Index, QUEST_COMPENSATION_PLUSSSTAT, 0 ); 
                lpObj->btComboSkillQuest = TRUE; 
                LogAddTD("[Quest] Quest Clear (%s) : [%s][%s] ComboSkill", 
                    lpQuestInfo->szQuestName, lpObj->AccountID, lpObj->CharName); 
            } 

            if ( lpSubInfo->iQuestType == 1 ) 
            { 
                gObjDelteItemCountInInventory(lpObj->Index, lpSubInfo->iItemType, lpSubInfo->iItemSubType, 
                    lpSubInfo->iItemQuantity); 
            } 
        } 
    } 
    return true; 

avatar
m4s4cru
Admin
Admin

Mesaje : 172
Data de inscriere : 2011-07-29
Varsta : 26

View user profile

Back to top Go down

View previous topic View next topic Back to top

- Similar topics

 
Permissions in this forum:
You cannot reply to topics in this forum