[Development] Source Mu Main 1.03.35 [Season 5.1 - Season 5.2]

Joined
Jul 31, 2012
Messages
490
Reaction score
93
Please tell me which server (with sources) is suitable for this client? And another question is, can I use the zTeam season 6 server files (for example these https://forum.ragezone.com/f197/release-zteam-season-6-100-a-1156924/) ?

I have not tested which servers are compatible with these source codes.
I edited season 4 for these resources.

It will be best if you use source codes that have already been tested with the game client.

Luis Fernando Más Ortiz

I want to thank the creator. Good work but no further development.
Such a shame
 
Joined
Jul 31, 2012
Messages
490
Reaction score
93
Has anyone created the SKILL_ATTRIBUTE season 6 structure where the Rage Fighter is entered?
I don't want to deal with it.
 
Newbie Spellweaver
Joined
May 16, 2011
Messages
93
Reaction score
28
I won't write all the code for you and I won't share the code I created for protection. In other words, I won't do all the work for you.

typedef struct
{
char Name[32]; //32
BYTE Level; //
WORD Damage; //
WORD Mana; //
WORD AbilityGuage; //
BYTE Distance; //
DWORD Delay; //
DWORD Energy; //所需能量(所需计算=20+(Reqeng*Level)*0.04)
WORD Charisma; //Req_Level
BYTE MasteryType; //Property_1
BYTE SkillUseType; //技能用户类型。
BYTE SkillBrand; //使用该技能必须施放的技能编号。
BYTE KillCount; //KillCount
BYTE RequireDutyClass[MAX_DUTY_CLASS]; //
BYTE RequireClass[MAX_CLASS]; //
BYTE TypeSkill; //80
WORD Magic_Icon; // 76
WORD m_byItemSkill; //84
WORD m_byMasterSkillValAtt; //88
WORD Strength; //
WORD Dexterity; //
BYTE m_Stnk[6];

} SKILL_ATTRIBUTE;

你个小老外 我以为有多吊。还不是个小垃圾
 
Joined
Jul 31, 2012
Messages
490
Reaction score
93

Nice, I had to do it myself anyway.

Open Skill Eng.bmd in Magic Hand editor for Skill season 6.
Write the Rage Fighter skill and save as skill_eng.bmd.

The structure is like this.

PHP:
typedef struct
{
	char Name[32];
	BYTE Level;
	WORD Damage;
	WORD Mana;
	WORD AbilityGuage;
	BYTE Distance;
	int  Delay;
	int Energy;
	WORD Charisma;
	BYTE MasteryType;
	BYTE SkillUseType; 
	BYTE SkillBrand; 
	BYTE KillCount;
	BYTE RequireDutyClass[MAX_DUTY_CLASS];
	BYTE RequireClass[MAX_CLASS];
	WORD Magic_Icon;
	BYTE TypeSkill;
	int Strength;
	int Dexterity;
} SKILL_ATTRIBUTE;

Then remove the CRC or find out the checksum for better security and it's OK.
 
Joined
Jul 31, 2012
Messages
490
Reaction score
93
I am also attaching the skill_eng.bmd file here with fully functional Rage fighter attacks.



The MagicHand editor must be used for editing.
For example this one



You can turn off CRC like this

PHP:
if ( dwCheckSum != GenerateCheckSum2( Buffer, Size*MAX_SKILLS, 0x5A18)) // With CRC
if ( dwCheckSum == GenerateCheckSum2( Buffer, Size*MAX_SKILLS, 0x5A18)) // Without CRC

Or better

PHP:
void OpenSkillScript(char *FileName)
{
	FILE *fp = fopen(FileName,"rb");
	if(fp != NULL)
	{
		int Size = sizeof(SKILL_ATTRIBUTE);

		BYTE *Buffer = new BYTE [Size*MAX_SKILLS];
		fread(Buffer,Size*MAX_SKILLS,1,fp);

		BYTE *pSeek = Buffer;
		for(int i=0;i<MAX_SKILLS;i++)
		{
			BuxConvert(pSeek,Size);
			memcpy(&SkillAttribute[i],pSeek,Size);
			pSeek += Size;
		}
		delete [] Buffer;
	}
	else
	{
		char Text[256];
    	sprintf(Text,"%s - File not exist.",FileName);
		g_ErrorReport.Write( Text);
		MessageBox(g_hWnd,Text,NULL,MB_OK);
		SendMessage(g_hWnd,WM_DESTROY,0,0);
	}
}

Or even slightly better for the above skill_eng.bmd

PHP:
void OpenSkillScript(char *FileName)
{
	FILE *fp = fopen(FileName,"rb");
	if(fp != NULL)
	{
		int Size = sizeof(SKILL_ATTRIBUTE);
		// 읽기
		BYTE *Buffer = new BYTE [Size*MAX_SKILLS];
		fread(Buffer,Size*MAX_SKILLS,1,fp);
		// crc 체크
		DWORD dwCheckSum;
		fread(&dwCheckSum,sizeof ( DWORD),1,fp);
		fclose(fp);
		//DWORD dwCheckSum2 = GenerateCheckSum2( Buffer, Size*MAX_SKILLS, 0x5A18);
		DWORD dwCheckSum2 = 7798882;
		if ( dwCheckSum != dwCheckSum2)
		{
			char Text[256];
    		sprintf(Text,"%s - File corrupted.",FileName);
			g_ErrorReport.Write( Text);
			MessageBox(g_hWnd,Text,NULL,MB_OK);
			SendMessage(g_hWnd,WM_DESTROY,0,0);
		}
		else
		{
			BYTE *pSeek = Buffer;
			for(int i=0;i<MAX_SKILLS;i++)
			{

				BuxConvert(pSeek,Size);
				memcpy(&SkillAttribute[i],pSeek,Size);

				pSeek += Size;
			}
		}
		delete [] Buffer;
	}
	else
	{
		char Text[256];
    	sprintf(Text,"%s - File not exist.",FileName);
		g_ErrorReport.Write( Text);
		MessageBox(g_hWnd,Text,NULL,MB_OK);
		SendMessage(g_hWnd,WM_DESTROY,0,0);
	}
}

I would add the most correct option to my answer.
Set MAX_SKILLS to the number of lines in the Skill_eng.bmd file + 1.
When using the correct number of lines for the correct BMD file, the CRC will successfully evaluate to key 0x5A18.

PHP:
void OpenSkillScript(char *FileName)
{
	FILE *fp = fopen(FileName,"rb");
	if(fp != NULL)
	{
		int Size = sizeof(SKILL_ATTRIBUTE);
		// read
		BYTE *Buffer = new BYTE [Size*MAX_SKILLS];
		fread(Buffer,Size*MAX_SKILLS,1,fp);
		// crc check
		DWORD dwCheckSum;
		fread(&dwCheckSum,sizeof ( DWORD),1,fp);
		fclose(fp);
		DWORD dwCheckSum2 = GenerateCheckSum2( Buffer, Size*MAX_SKILLS, 0x5A18);
		if ( dwCheckSum != dwCheckSum2)
		{
			char Text[256];
    		sprintf(Text,"%s - File corrupted.",FileName);
			g_ErrorReport.Write( Text);
			MessageBox(g_hWnd,Text,NULL,MB_OK);
			SendMessage(g_hWnd,WM_DESTROY,0,0);
		}
		else
		{
			BYTE *pSeek = Buffer;
			for(int i=0;i<MAX_SKILLS;i++)
			{

				BuxConvert(pSeek,Size);
				memcpy(&SkillAttribute[i],pSeek,Size);

				pSeek += Size;
			}
		}
		delete [] Buffer;
	}
	else
	{
		char Text[256];
    	sprintf(Text,"%s - File not exist.",FileName);
		g_ErrorReport.Write( Text);
		MessageBox(g_hWnd,Text,NULL,MB_OK);
		SendMessage(g_hWnd,WM_DESTROY,0,0);
	}
}
 
Last edited:
Joined
Jul 31, 2012
Messages
490
Reaction score
93
If you don't have the correct file, I recommend using the function

PHP:
void SaveSkillScript(char *FileName)

This function creates an empty Skill_eng.bmd file with the key 0x5A18.
After that, just write all the spells into it and you have a fully functional CRC.
 
Newbie Spellweaver
Joined
Jul 13, 2019
Messages
87
Reaction score
37
Old minimap,


 

Attachments

You must be registered for see attachments list
Newbie Spellweaver
Joined
Mar 29, 2020
Messages
11
Reaction score
0
Thanks you a lot!!! a question ... can be posible that we need to add in ZzzScene.cpp this lines?
PHP:
// ---- 3D camera ----
extern float CameraZoom;
extern float AngleY3D;
// -------------------

Cause this variables was declared in ZzzOpenglUtil.cpp and ZzzScene.cpp just its include ZzzScene.h

Too in ZzzLodTerrain.cpp

PHP:
 // ---- 3D camera ----
extern float CameraZoom;
extern float AngleY3D;
// -------------------

Another question is that the variables

PHP:
float AgleRL = 0.f;
float AgleX3D = 0.f;

its were not used. (?)

**Sorry my bad english.

 
Last edited:
Joined
Jul 31, 2012
Messages
490
Reaction score
93
I found that websites are easy to attack.
I try to put everything into the game environment and thereby improve security.
I prefer to use Discord for communication and forum.

 
Newbie Spellweaver
Joined
Jan 15, 2015
Messages
10
Reaction score
0
someone fixed the problem of minimizing and restoring by tasks and main force disconnect?
 
Joined
Jul 31, 2012
Messages
490
Reaction score
93
Leaderboard of top players and indicator of online players in the game.




You can learn a lot from the source code of the game client.

If you search it properly, you will find out WebZen's true intention for the attack.

The attack should not be as big as it is on all muonline servers now, but on the contrary.

As an example I will give the character Rage Fighter.

Dark Side ( As we know the definition )
PHP:
AttackDamage = (AttackDamage+(Vitality/8)+(Energy/10))*(100 + (Vitality/8) + (Energy/10))/100.0f;

This is how the definition is written in the game client
PHP:
100 + (Dexterity / 8 + Energy / 10);

The reason why it is not possible to level the characters in the game is an incorrect calculation on the server side.

Dark Side ( How the calculation should look like )
PHP:
AttackDamage += 100 + (Dexterity / 8 + Energy / 10);

After this intervention, the Rage Fighter is primarily a power character and is on par with an Elf or Dark Wizard.

Elf and Dark Wizard have no defined attacks and therefore have low attack levels.

After all, it is not logical for a character to have a lower number of lives than the received attack.



If I write out the hit value after this adjustment.

I get a number that is genuine and agrees. When I add IMP for example, the hit value really only increases by 20%.
 
Newbie Spellweaver
Joined
Mar 29, 2020
Messages
11
Reaction score
0
Could someone fix this?



I know that the problem can be fixed here --> ZzzEffectPoint.cpp in the function "Void CreatePoint(...)" in o->Position[0], o->Position[1], o->Position[2]


But, i tried and i couldn't solved it. I think we have to create a whole new structure...
 
Newbie Spellweaver
Joined
Mar 29, 2020
Messages
11
Reaction score
0
Could something solved the Hits in the 3d Camera ?


i know that the problem can be fixed in ZzzEffectPoint.cpp

in the function void CreatePoint(vec3_t Position,int Value,vec3_t Color,float scale, bool bMove)

VectorCopy(Position, o->Position); <--- Here

i tried modified the position o->Position[0], o->Position[1] and o->Position[2] but i think that the problem could be solved doing a new struct T_T
 
Joined
Jul 31, 2012
Messages
490
Reaction score
93

Are you familiar with matrices? Instead of trying to calculate the position for each number, use a matrix which translates 0,0,0 to the position where you want them to render, and render the number at 0,0,0. Then you can 'stack' other matrices as well, like a rotation matrix.
 
Newbie Spellweaver
Joined
Mar 29, 2020
Messages
11
Reaction score
0
Ok, i will try to do it. Really i dont understood but i will try


 
Newbie Spellweaver
Joined
Mar 29, 2020
Messages
11
Reaction score
0
But, how can i rotate it ? ... Look at it, in the funtion CreatePoint() a parameter called Position have 3 Positiones (Position[0], Position[1] and Position[2]) ... the problem is that, no one of this rotate the number (Hits).Watch the images:

** maybe i am asking something basic (sry) xD

Position[0]

Position[1]

Position[2]
 
Newbie Spellweaver
Joined
Nov 17, 2016
Messages
15
Reaction score
20

You are seeing the wrong function I think.
Check the RenderNumber function, since within it the calculations of the position of each number are performed.
I think you should change those calculations making the X angle of the camera affect the result.

In the Season 6 main, i did it like this:

Code:
SetCompleteHook(0xE9, 0x0063764C, &this->RotateFix);

__declspec(naked) void CCamera::RotateFix()
{
    static DWORD jmpBack = 0x0063752D;

    _asm
    {
        Lea Eax, [Ebp - 0x38]; //-> p[1]
        Lea Ecx, [Ebp - 0x3C]; //-> p[0]
        Push Dword Ptr[Ebp + 0x18]; //-> Scale
        Push Eax; //-> p[1]
        Push Ecx; //-> p[2]
        Call RotateDmg;
        Add Esp, 0xC;
        Jmp[jmpBack];
    }
}

void CCamera::RotateDmg(float& X, float& Y, float D)
{
    const float Rad = 0.01745329f;

    float sinTh = sin(Rad * (*gCamera.m_Address.RotX));

    float cosTh = cos(Rad * (*gCamera.m_Address.RotX));

    X += D / 0.7071067f * cosTh / 2;

    Y -= D / 0.7071067f * sinTh / 2;
}

[Ebp - 0x38] => p[1]
[Ebp - 0x3C] => p[0]
[Ebp - 0x18] => Scale

So you need to change these two lines inside RenderNumber function:

Code:
p[0] += Scale * 0.5f;

p[1] += Scale * 0.5f;




Try changing these two lines inside RenderNumber function:

Code:
p[0] += Scale * 0.5f;

p[1] += Scale * 0.5f;

For something like this:

Code:
const float Rad = 0.01745329f;

float sinTh = sin(Rad * (Camera.RotX));

float cosTh = cos(Rad * (Camera.RotX));

p[0] += Scale / 0.7071067f * cosTh / 2;

p[1] -= Scale / 0.7071067f * sinTh / 2;

I don't know how your camera system works but if its based on the DLL version, i think this should work.
 
Newbie Spellweaver
Joined
Mar 29, 2020
Messages
11
Reaction score
0
Thanks a lot!!! this was what i was looking for! =)