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!

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

Joined
Jul 31, 2012
Messages
490
Reaction score
92
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
92
Has anyone created the SKILL_ATTRIBUTE season 6 structure where the Rage Fighter is entered?
I don't want to deal with it.
 
Initiate Mage
Joined
May 16, 2011
Messages
92
Reaction score
27
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
92
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;

你个小老外 我以为有多吊。还不是个小垃圾

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
92
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
92
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.
 
Initiate Mage
Joined
Jul 13, 2019
Messages
84
Reaction score
35
Old minimap,
jKuRmhI - [Development] Source Mu Main 1.03.35 [Season 5.1 - Season 5.2] - RaGEZONE Forums


2DHFWgu - [Development] Source Mu Main 1.03.35 [Season 5.1 - Season 5.2] - RaGEZONE Forums
 

Attachments

You must be registered for see attachments list
Initiate Mage
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.

As promised, I will share with you my work on the 3D camera.

I want to inform you that I am still working on the 3D camera.

Unfinished or in preparation...
1. Damage listing function
2. Complete saving of settings in windows registry
- drawing objects on the map
3. FPS, CPU usage for maximum performance
4. Reworked feature for monster sounds

Here I will add instructions for the 3D camera, which is controlled by the arrow keys and the keys PgUp, PgOn, END

1. defining all variables
- In the ZzzOpenglUtil.cpp file, add the definitions
PHP:
//////////////////////////////////////////////////////////////////////////
//  Global Variable.
//////////////////////////////////////////////////////////////////////////
int     OpenglWindowX;     
int     OpenglWindowY;     
int     OpenglWindowWidth; 
int     OpenglWindowHeight;
bool    CameraTopViewEnable = false;
float   CameraViewNear      = 20.f;
float   CameraViewFar       = 2000.f;
float   CameraFOV           = 55.f;
// ---- 3D camera ----
float    CameraZoom            = 0.f;
float    AngleX3D            = 0.f;
float    AngleY3D            = 0.f;
float    AngleRL                = 0.f;
// -------------------
vec3_t  CameraPosition;
vec3_t  CameraAngle;
float   CameraMatrix[3][4];
vec3_t  MousePosition;
vec3_t  MouseTarget;
float   g_fCameraCustomDistance = 0.f;
bool    FogEnable   = false;
GLfloat FogDensity  = 0.0004f;
GLfloat FogColor[4] = {30/256.f,20/256.f,10/256.f,};

- In the Winmain.h file, add the definition
PHP:
extern char m_ID[];
extern char m_Version[];
extern int  m_SoundOnOff;
extern int  m_MusicOnOff;
// ---- 3D camera ----
extern int    m_CameraOnOff;
// -------------------
extern int  m_Resolution;
extern int m_nColorDepth;

- In the Winmain.cpp file, find the BOOL OpenInitFile() function and add a definition above this function
PHP:
char m_ID[11];
char m_Version[11];
char m_ExeVersion[11];
int  m_SoundOnOff;
int  m_MusicOnOff;
// ---- 3D camera ----
int    m_CameraOnOff;
// -------------------
int  m_Resolution;
int    m_nColorDepth;
int    g_iRenderTextType = 0;

#ifdef LJH_ADD_SUPPORTING_MULTI_LANGUAGE
// ´Ů±ąľî Áöżř ·±ĂÄżˇĽ­ Ľ±ĹĂµČ ľđľî
char g_aszMLSelection[MAX_LANGUAGE_NAME_LENGTH] = {'\0'};
string g_strSelectedML = "";
#endif //LJH_ADD_SUPPORTING_MULTI_LANGUAGE

//int ĆÄŔĎ ŔĐ´Â ÇÔĽö
BOOL OpenInitFile()
{

2. Creating a 3D camera launcher using windows registry save
- Go to the BOOL OpenInitFile() function in the Winmain.cpp file and supply the following condition to validate and possibly write to the windows registry
PHP:
    m_ID[0] = '\0';
    m_SoundOnOff = 1;
    m_MusicOnOff = 1;
// ---- 3D camera ----
    m_CameraOnOff = 1;
// -------------------
    m_Resolution = 0;
    m_nColorDepth = 0;

PHP:
        dwSize = 11;
        if ( RegQueryValueEx (hKey, "ID", 0, NULL, (LPBYTE)m_ID, & dwSize) != ERROR_SUCCESS)
        {
        }
        dwSize = sizeof ( int);
        if ( RegQueryValueEx (hKey, "SoundOnOff", 0, NULL, (LPBYTE) & m_SoundOnOff, &dwSize) != ERROR_SUCCESS)
        {
            m_SoundOnOff = true;
        }
        dwSize = sizeof ( int);
        if ( RegQueryValueEx (hKey, "MusicOnOff", 0, NULL, (LPBYTE) & m_MusicOnOff, &dwSize) != ERROR_SUCCESS)
        {
            m_MusicOnOff = false;
        }
// ---- 3D camera ----
        dwSize = sizeof ( int);
        if ( RegQueryValueEx (hKey, "3DCameraOnOff", 0, NULL, (LPBYTE) & m_CameraOnOff, &dwSize) != ERROR_SUCCESS)
        {
            m_CameraOnOff = false;
        }
// -------------------
        dwSize = sizeof ( int);
        if ( RegQueryValueEx (hKey, "Resolution", 0, NULL, (LPBYTE) & m_Resolution, &dwSize) != ERROR_SUCCESS)
        {
            m_Resolution = 1;
        }

- Now go to the NewUIOptionWindow.h file and define a new public function
PHP:
void SetCameraOnOff();
- Then create a new function in the NewUIOptionWindow.cpp file
- This function checks if a setting for the camera exists in the registry and has permission to change the value of that setting
PHP:
void SEASON3B::CNewUIOptionWindow::SetCameraOnOff()
{

    HKEY hKey;
    DWORD dwDisp;
    DWORD dwSize;
    dwSize = sizeof ( int);
    if ( ERROR_SUCCESS == RegCreateKeyEx(HKEY_CURRENT_USER, "SOFTWARE\\Webzen\\Mu\\Config", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, & hKey, &dwDisp))
    {
        m_CameraOnOff = !m_CameraOnOff;
        RegSetValueEx(hKey, "3DCameraOnOff", 0, NULL, (LPBYTE) & m_CameraOnOff, dwSize);
    }
    RegCloseKey( hKey);
}
- Go to the Render Buttons() function in the NewUIOption Window.cpp file and create a checkbox for the 3D camera
- My settings save is next to the Effects render settings name
PHP:
    // 3D Camera checkbox
    if(m_CameraOnOff)
    {
        RenderImage(IMAGE_OPTION_BTN_CHECK, m_Pos.x+150, m_Pos.y+149, 15, 15, 0, 0);
    }
    else
    {
        RenderImage(IMAGE_OPTION_BTN_CHECK, m_Pos.x+150, m_Pos.y+149, 15, 15, 0, 15.f);
    }
- Go to the RenderContents() function in the NewUIOption Window.cpp file and create a dot before the description and the settings description itself for the 3D camera
PHP:
void SEASON3B::CNewUIOptionWindow::RenderContents()
{
    float x, y;
    x = m_Pos.x + 20.f;
    y = m_Pos.y + 46.f;
    RenderImage(IMAGE_OPTION_POINT, x, y, 10.f, 10.f);
    y += 22.f;
    RenderImage(IMAGE_OPTION_POINT, x, y, 10.f, 10.f);
    y += 22.f;
    RenderImage(IMAGE_OPTION_POINT, x, y, 10.f, 10.f);
    y += 40.f;
    RenderImage(IMAGE_OPTION_POINT, x, y, 10.f, 10.f);
    y += 22.f;
    RenderImage(IMAGE_OPTION_POINT, x, y, 10.f, 10.f);
    // 3D Camera
    RenderImage(IMAGE_OPTION_POINT, x+60, y, 10.f, 10.f);
    
    g_pRenderText->SetFont(g_hFont);
    g_pRenderText->SetTextColor(255, 255, 255, 255);
    g_pRenderText->SetBgColor(0);
    // 386 "ŔÚµż °ř°Ý"
    g_pRenderText->RenderText(m_Pos.x+40, m_Pos.y+48, GlobalText[386]);
    // 387 "±Ó¸» ľË¸˛Ŕ˝"
    g_pRenderText->RenderText(m_Pos.x+40, m_Pos.y+70, GlobalText[387]);
    // 389 "şĽ·ýÁ¶Ŕý"
    g_pRenderText->RenderText(m_Pos.x+40, m_Pos.y+92, GlobalText[389]);
    // 919 "˝˝¶óŔĚµĺ µµżň¸»"
    g_pRenderText->RenderText(m_Pos.x+40, m_Pos.y+132, GlobalText[919]);
    // 1840 "+Čż°úÁ¦ÇŃ"
    g_pRenderText->RenderText(m_Pos.x+40, m_Pos.y+154, "+Effect");
    // 3D Camera
    g_pRenderText->RenderText(m_Pos.x+100, m_Pos.y+154, "3D Camera");
}
- Now go to the UpdateMouseEvent() function in the NewUIOption Window.cpp file and create an action when the 3D camera checkbox is checked
PHP:
    if(SEASON3B::IsPress(VK_LBUTTON) && CheckMouseIn(m_Pos.x+150, m_Pos.y+127, 15, 15))
    {
        m_bSlideHelp = !m_bSlideHelp;
    }
    // 3D Camera
    if(SEASON3B::IsPress(VK_LBUTTON) && CheckMouseIn(m_Pos.x+150, m_Pos.y+149, 15, 15))
    {
        SetCameraOnOff();
    }
    
    if(CheckMouseIn(m_Pos.x+33-8, m_Pos.y+104, 124+8, 16))

Now we have our startup setup ready and we can get down to the 3D camera itself

3. Creating a 3D camera control
- This control setting is contained in the ZzzScene.cpp file and can be customized to your liking.
I chose keyboard control for the player's convenience.


- Go to the ZzzScene.cpp file in the MoveMainCamera() function and add the settings for the 3D camera.
- Edit the first condition of the function as follows.
PHP:
    if (
#ifdef PJH_NEW_SERVER_SELECT_MAP
        World == WD_73NEW_LOGIN_SCENE
#else
        World == WD_77NEW_LOGIN_SCENE
#endif //PJH_NEW_SERVER_SELECT_MAP
        && CCameraMove::GetInstancePtr()->IsTourMode())
#ifdef PJH_NEW_SERVER_SELECT_MAP
        CameraFOV = 65.0f;
#else //PJH_NEW_SERVER_SELECT_MAP
        CameraFOV = 61.0f;
#endif //PJH_NEW_SERVER_SELECT_MAP
    else
    {
        if (World == WD_74NEW_CHARACTER_SCENE || World == WD_73NEW_LOGIN_SCENE) // Fix for opening scene and character selection
        {
            CameraZoom = 0;
            AngleY3D = 0;
        }
        CameraFOV = 35.f + CameraZoom;
        if( !g_pUIManager->IsInputEnable())
        {
            if (m_CameraOnOff == 1)
            {
                if(HIBYTE(GetAsyncKeyState(109))==128 || HIBYTE(GetAsyncKeyState(VK_PRIOR))==128) // PAGE UP or +
                {
                    if (CameraZoom < 12) CameraZoom += 2;
                }
                if(HIBYTE(GetAsyncKeyState(107))==128 || HIBYTE(GetAsyncKeyState(VK_NEXT))==128) // PAGE DOWN or -
                {
                    if (CameraZoom > -12) CameraZoom -= 2;
                }
                if(HIBYTE(GetAsyncKeyState(VK_RIGHT))==128) // RIGHT ARROW
                    CameraAngle[2] -= 4;
                if(HIBYTE(GetAsyncKeyState(VK_LEFT))==128) // LEFT ARROW
                    CameraAngle[2] += 4;
                
                if(HIBYTE(GetAsyncKeyState(VK_DOWN))==128) // DOWN ARROW
                    if (AngleY3D < 5) AngleY3D += 1;
                if(HIBYTE(GetAsyncKeyState(VK_UP))==128) // UP ARROW
                    if (AngleY3D > -10) AngleY3D -= 1;
                if(HIBYTE(GetAsyncKeyState(VK_END))==128) // END keys for reset 3D camera
                {
                    CameraZoom = 0;
                    CameraAngle[2] = -45.f;
                    AngleY3D = 0;
                }
            }
            else {
                CameraZoom = 0;
                CameraAngle[2] = -45.f;
                AngleY3D = 0;
            }
        }
    }
- In the same function, go to this condition and edit as follows
PHP:
        else if(SceneFlag == CHARACTER_SCENE) // ŔĚÇőŔç - ÄɸŻĹÍ ľŔ Ŕ϶§ Ä«¸Ţ¶ó Ŕ§Äˇ ĽĽĆĂ
        {
#ifdef PJH_NEW_SERVER_SELECT_MAP
            CameraAngle[0] = -84.5f;
            CameraAngle[1] = 0.0f;
            CameraAngle[2] = -75.0f;
             CameraPosition[0] = 9758.93f;
             CameraPosition[1] = 18913.11f;
             CameraPosition[2] = 675.5f;
#else //PJH_NEW_SERVER_SELECT_MAP
            CameraAngle[0] = -84.5f;
            CameraAngle[1] = 0.0f;
            CameraAngle[2] = -30.0f;
            CameraPosition[0] = 23566.75f;
            CameraPosition[1] = 14085.51f;
            CameraPosition[2] = 395.0f;
#endif //PJH_NEW_SERVER_SELECT_MAP
        }
        else
        {
            CameraAngle[0] = -48.5f;
            if (m_CameraOnOff == 1)
            {
                CameraAngle[0] += AngleY3D;
            }
        }
#endif
- At the end of this function, add the following condition before return bLockCamera;
PHP:
    // Field of vision
    if (m_CameraOnOff == 1)
    {
        if (CameraZoom > 0)
            CameraViewFar += 458.33f + (458.33f * CameraZoom);
        else 
            CameraViewFar += 1458.33f;
    }
- Go to the MoveMainScene() function and modify this condition. Thus...
PHP:
    if(!CameraTopViewEnable
        || m_CameraOnOff == 1    // <= 3D Camera
#ifdef LDS_FIX_DISABLE_INPUTJUNKKEY_WHEN_LORENMARKT
#ifdef LDS_FIX_DISABLE_INPUTJUNKKEY_WHEN_LORENMARKT_EX01    // °řĽşŔü, ĹëÇŐ˝ĂŔĺŔş Ľ­ąö ·Îµů˝Ă°ŁŔĚ ±ćľî ·ÎµůÁß Ĺ°ŔÔ·Â şí·°.
        && ( g_bReponsedMoveMapFromServer == TRUE )        // Ĺ°ŔÔ·Â ¸·±â : Ľ­ąö·ÎşÎĹÍ ·Îµů żůµĺ ŔŔ´äŔĚ ľČżÂ °ćżě¸¸. 
#else // LDS_FIX_DISABLE_INPUTJUNKKEY_WHEN_LORENMARKT_EX01
        && LoadingWorld < 30
#endif // LDS_FIX_DISABLE_INPUTJUNKKEY_WHEN_LORENMARKT_EX01
#endif // LDS_FIX_DISABLE_INPUTJUNKKEY_WHEN_LORENMARKT
        )
    {
#ifdef MOD_MOUSE_Y_CLICK_AREA
        if(GFxProcess::GetInstancePtr()->GetUISelect() == 1)
        {
            if(MouseY>=(int)(480))
                MouseOnWindow = true;
        }
        else
        {
            if(MouseY>=(int)(480-48))
                MouseOnWindow = true;
        }
#else //MOD_MOUSE_Y_CLICK_AREA
        if(MouseY>=(int)(480-48))
            MouseOnWindow = true;
#endif //MOD_MOUSE_Y_CLICK_AREA

        g_pPartyManager->Update();
        g_pNewUISystem->Update();
        
        // Ŕ©µµżě ľĆ´Ń°÷ Ŭ¸Ż˝Ă
        if (MouseLButton == true 
            && false == g_pNewUISystem->CheckMouseUse() /* NewUIżë ¸¶żě˝ş ĂĽĹ© */
            && g_dwMouseUseUIID == 0 /* ±âÁ¸ŔÇ UI ¸¶żě˝ş ĂĽĹ© ŔüżŞ şŻĽö */
            && g_pNewUISystem->IsVisible(SEASON3B::INTERFACE_CHATINPUTBOX) == false
            )
        {
            g_pWindowMgr->SetWindowsEnable(FALSE);
            g_pFriendMenu->HideMenu();
            g_dwKeyFocusUIID = 0;
            if(GetFocus() != g_hWnd)
            {
                SaveIMEStatus();
                SetFocus(g_hWnd);
            }
        }
#ifdef _PVP_ADD_MOVE_SCROLL
        g_MurdererMove.MurdererMoveCheck();
#endif    // _PVP_ADD_MOVE_SCROLL
        
        MoveInterface();
        MoveTournamentInterface();
        if( ErrorMessage != MESSAGE_LOG_OUT )
            g_pUIManager->UpdateInput();
    }
- Go to the next condition in the MoveMainScene() function and edit that condition. Thus...
PHP:
    if(!CameraTopViewEnable 
        || m_CameraOnOff == 1) // <= 3D Camera
        MoveItems();
    if ( ( World==WD_0LORENCIA && HeroTile!=4 ) || 
         ( World==WD_2DEVIAS && HeroTile!=3 && HeroTile<10 ) 
         || World==WD_3NORIA 
         || World==WD_7ATLANSE 
         || InDevilSquare() == true
         || World==WD_10HEAVEN 
         || InChaosCastle()==true 
         || battleCastle::InBattleCastle()==true
         || M31HuntingGround::IsInHuntingGround()==true
         || M33Aida::IsInAida()==true
         || M34CryWolf1st::IsCyrWolf1st()==true
        || World == WD_42CHANGEUP3RD_2ND
#ifdef CSK_ADD_MAP_ICECITY
        || IsIceCity()
#endif // CSK_ADD_MAP_ICECITY
#ifdef YDG_ADD_MAP_SANTA_TOWN
        || IsSantaTown()
#endif    // YDG_ADD_MAP_SANTA_TOWN
#ifdef PBG_ADD_PKFIELD
        || IsPKField()
#endif //PBG_ADD_PKFIELD
#ifdef YDG_ADD_MAP_DOPPELGANGER2
        || IsDoppelGanger2()
#endif    // YDG_ADD_MAP_DOPPELGANGER2
#ifdef LDS_ADD_EMPIRE_GUARDIAN
        || IsEmpireGuardian1() 
        || IsEmpireGuardian2()
        || IsEmpireGuardian3()
        || IsEmpireGuardian4()
#endif //LDS_ADD_EMPIRE_GUARDIAN
#ifdef LDS_ADD_MAP_UNITEDMARKETPLACE
        || IsUnitedMarketPlace()
#endif    // LDS_ADD_MAP_UNITEDMARKETPLACE
     )
    {
        MoveLeaves();
    }
- Go to the next condition in the RenderMainScene() function and edit that condition. Thus...
PHP:
    BYTE byWaterMap = 0;

    if(CameraTopViewEnable == false 
        || m_CameraOnOff == 1) // 3D Camera
    {
#ifdef MOD_MAINSCENE_HEIGHT
        Height = 480;
#else //MOD_MAINSCENE_HEIGHT
        Height = 480-48;
#endif //MOD_MAINSCENE_HEIGHT
    }
    else
    {
        Height = 480;
    }
- And the last condition in this file in the RenderMainScene() function modify this condition. Thus...
PHP:
    RenderCharactersClient();   //  Äł¸ŻĹÍ ą¦»ç.

    if(EditFlag!=EDIT_NONE)     //  żˇµđĹÍżˇĽ­¸¸ Ăł¸®.
    {
        RenderTerrain(true);
    }
    if(!CameraTopViewEnable 
        || m_CameraOnOff == 1)    // <=  3D Camera
         RenderItems();

3. Problem with rotating figure and head when moving the cursor.
Webzen did not expect that someone would create a 3D camera. Because of this, an abnormality will appear when the camera is turned to the right or left side.
- Go to the ZzzInterface.cpp file and find the MoveHero() function. Modify the following condition as follows.
PHP:
    //  ! ¸¶żě˝ş µű¶óĽ­ Äł¸ŻĹÍŔÇ Č¸Ŕü °˘µµ¸¦ şŻ°ćÇŃ´Ů.
    if( g_isCharacterBuff(o, eDeBuff_Stun)
        || g_isCharacterBuff(o, eDeBuff_Sleep)
#ifdef WORLDCUP_ADD
        || o->CurrentAction == PLAYER_POINT_DANCE
#endif //WORLDCUP_ADD
#ifdef PBG_ADD_NEWCHAR_MONK_SKILL
        || o->CurrentAction == PLAYER_SKILL_GIANTSWING
#endif //PBG_ADD_NEWCHAR_MONK_SKILL
            )
    {
        Angle = (int)Hero->Object.Angle[2];
        bLookAtMouse = false;
    }
    else
    {
        if (m_CameraOnOff == 1)
            Angle = (int)(Hero->Object.Angle[2]+CreateAngle((float)HeroX,(float)HeroY,(float)MouseX,(float)MouseY)) + 360 + CameraAngle[2];
        else
            Angle = (int)(Hero->Object.Angle[2]+CreateAngle((float)HeroX,(float)HeroY,(float)MouseX,(float)MouseY)) + 360 - 45;

        Angle %= 360;
        if(Angle < 120) Angle = 120;
        if(Angle > 240) Angle = 240;
        Angle += 180;
        Angle %= 360;
    }
        
    Hero->Object.HeadTargetAngle[2] = 0.f;
- Find another condition and edit it like this
PHP:
        if(StandTime >= 40 && !MouseOnWindow && !Hero->Dead &&
            o->CurrentAction!=PLAYER_POSE1 && o->CurrentAction!=PLAYER_POSE_FEMALE1 &&
            o->CurrentAction!=PLAYER_SIT1  && o->CurrentAction!=PLAYER_SIT_FEMALE1 && NoAutoAttacking &&
            o->CurrentAction!=PLAYER_ATTACK_TELEPORT &&
            o->CurrentAction!=PLAYER_ATTACK_RIDE_TELEPORT &&
            o->CurrentAction != PLAYER_FENRIR_ATTACK_DARKLORD_TELEPORT &&
#ifdef PBG_ADD_NEWCHAR_MONK_SKILL
            o->CurrentAction != PLAYER_SKILL_ATT_UP_OURFORCES &&
            o->CurrentAction != PLAYER_SKILL_HP_UP_OURFORCES &&
#endif //PBG_ADD_NEWCHAR_MONK_SKILL
            Hero->AttackTime == 0)
        {
            StandTime = 0;
            if (m_CameraOnOff == 1)
                HeroAngle = -(int)(CameraAngle[2]+CreateAngle((float)MouseX,(float)MouseY,(float)HeroX,(float)HeroY)) + 360;
            else
                HeroAngle = -(int)(CreateAngle((float)MouseX,(float)MouseY,(float)HeroX,(float)HeroY)) + 360 + 45;

            HeroAngle %= 360;
            BYTE Angle1 = ((BYTE)((o->Angle[2]+22.5f)/360.f*8.f+1.f)%8);
            BYTE Angle2 = ((BYTE)(((float)HeroAngle+22.5f)/360.f*8.f+1.f)%8);
            if(Angle1 != Angle2)
            {
                if ( o->CurrentAction!=PLAYER_ATTACK_SKILL_SWORD2 )
                {
                    Hero->Object.Angle[2] = (float)HeroAngle;
                }
                SendRequestAction(AT_STAND1,((BYTE)((HeroAngle+22.5f)/360.f*8.f+1.f)%8));
            }
        }

Now, even when moving sideways, the figure and head will rotate behind the cursor.

4. The distance of drawing objects from the character
- Go to the ZzzLodTerrain.cpp file and find the function bool TestFrustrum2D(float x,float y,float Range). Edit it as follows.
PHP:
bool TestFrustrum2D(float x,float y,float Range)
{
    if ( SceneFlag == SERVER_LIST_SCENE || SceneFlag == WEBZEN_SCENE || SceneFlag == LOADING_SCENE)
        return true;

    int j = 3;
    for(int i=0;i<4;j=i,i++)
    {
        if (m_CameraOnOff == 1)    
        {
            if (CameraZoom > 0)
                Range -= ((50.f/2.5f) * CameraZoom);//Range -= 600.f;
            else
                Range -= 50.f;

            if (AngleY3D < 0)
                Range += 15.f * AngleY3D;
        }

        if((FrustrumX[i]-x) * (FrustrumY[j]-y) - (FrustrumX[j]-x) * (FrustrumY[i]-y) <= Range)
        {
            return false;
        }
    }
    return true;
}
- Then find the function bool bool TestFrustrum(vec3_t Position,float Range). Edit it as follows.
PHP:
bool TestFrustrum(vec3_t Position,float Range)
{
    for(int i=0;i<5;i++)
    {
        float Value;
        if (m_CameraOnOff == 1) 
        {
            if (CameraZoom > 0)
                Range += 0.f + ((41.66f/2.5f) * CameraZoom);//Range += 500.f;
            else
                Range += 41.66f;
        }
        Value = FrustrumFaceD[i] + DotProduct(Position,FrustrumFaceNormal[i]);
        if(Value < -(Range)) return false;
    }
    return true;
}


[BONUS]
5. Fog around field of vision.
Another problem is rendering objects while walking. Objects just disappear and it looks ugly. This problem can also be solved.

- Go to the ZzzOpenglUtil.cpp file and find the void BeginOpengl(int x,int y,int Width,int Height ) function. Adjust the fog condition as follows.
PHP:
    glDisable(GL_ALPHA_TEST);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
       glDepthMask(true);
    AlphaTestEnable = false;
    TextureEnable   = true;
    DepthTestEnable = true;
    CullFaceEnable  = true;
    DepthMaskEnable = true;
    glDepthFunc(GL_LEQUAL);
    glAlphaFunc(GL_GREATER,0.25f);

    if(FogEnable) 
    {
        if (m_CameraOnOff == 1)
        {
            glEnable(GL_FOG);
            glFogf( GL_FOG_MODE, GL_LINEAR );
            glFogf(GL_FOG_START, 2000.f);
            glFogf(GL_FOG_END, 2700.f);

            glFogf(GL_FOG_DENSITY, FogDensity);
            float color[] = {10/256.f,10/256.f,10/256.f,5.0};
            glFogfv(GL_FOG_COLOR, color);
        }
        else 
        {
            glEnable(GL_FOG);
            glFogi(GL_FOG_MODE, GL_LINEAR);
            glFogf(GL_FOG_DENSITY, FogDensity);
            glFogfv(GL_FOG_COLOR, FogColor);
        }
    }
    else
    {
        glDisable(GL_FOG);
    }

    GetOpenGLMatrix(CameraMatrix);
- Go to the ZzzScene.cpp file and find the RenderMainScene() function. Replace the following line
PHP:
FogEnable = true;
with this line
PHP:
FogEnable   = (m_CameraOnOff)?true:false;

If you did everything right, your 3D camera is now almost ready.
When I finish the other edits I can provide them as well.

During this tutorial I modified the code to make it faster. It's not a win.
 
Last edited:
Joined
Jul 31, 2012
Messages
490
Reaction score
92
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.

 
Initiate Mage
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
92
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%.
 
Initiate Mage
Joined
Mar 29, 2020
Messages
11
Reaction score
0
Could someone fix this?

dsw_pool - [Development] Source Mu Main 1.03.35 [Season 5.1 - Season 5.2] - RaGEZONE Forums


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]
dsw_pool - [Development] Source Mu Main 1.03.35 [Season 5.1 - Season 5.2] - RaGEZONE Forums


But, i tried and i couldn't solved it. I think we have to create a whole new structure...
 
Initiate Mage
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
92
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

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.
 
Initiate Mage
Joined
Mar 29, 2020
Messages
11
Reaction score
0
Ok, i will try to do it. Really i dont understood but i will try :p


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.
 
Initiate Mage
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]
 
Initiate Mage
Joined
Nov 17, 2016
Messages
14
Reaction score
19
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]

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;



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]

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.
 
Initiate Mage
Joined
Mar 29, 2020
Messages
11
Reaction score
0
Thanks a lot!!! this was what i was looking for! =)


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.
 
Back
Top