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]

Newbie Spellweaver
Joined
Jul 13, 2019
Messages
86
Reaction score
37
The camera works fine, but I can't find the monster display.
Monsters will show a maximum of 15 forward and backward coordinates.

i thing, check viewport on server,

-------------------------
i add small custom
 
Initiate Mage
Joined
Oct 21, 2022
Messages
3
Reaction score
0
hi brd, GS did not respond! help



You must construct your own MuServer based on this things:

Original 1.00.97/.98 Season 5.2 Chs MuServer Webzen:


Original 1.01.00/.01 Season 6.2 Tha MuServer Webzen:


Original 1.01.02/.03 Season 6.2 Chs MuServer Webzen:


Original 1.01.02/.03 Season 6.2/6.3 Tha MuServer Webzen:


Modified 1.01.02/.03 Season 6.2/6.3 Gmo MuServer Webzen:






To crack M:\ Drive MessageBox Error, you simply debug your compiled: GameServer.exe in Ollydbg and: Search for all referenced text string -> "M:" to make bypass.

Small Example (Guide) with ScreenShots of How to make to Search Strings for bypass on any GameServer.exe Original of Webzen (used: 1.00.97/.98 Season 5.2 Chs) in Ollydbg 2.00:

1st Step: load your damn: GameServer.exe in ollydbg (you must to be sure that you have: mumsg.dll and WzAG.dll on the same directory/path that your GameServer.exe because it's imports).

2nd Step: you must press: Second Click -> Search for -> All referenced text strings:

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


you must to be sure that you have unchecked: "Ignore case". and search: "M:" (withouts: "").

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


3rd Step: ENTER and in: Dissasemble window, press: Left-Click on: "Hex dump window" and press: "Ctrl+G" to search: 0085B448 allocated string: "M:" in memory, then press: Right-Click -> Edit -> Edit binary string (or at least something how this).. you can see something how this:


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


you must change this Ducking: "M:" by: "..:" (and if you using Ollydbg 2.00), on this step you must save, and re-analize (later) again... your stored copy of: "GameServer.exe" (because olly 2.00 have a small bug).

4th Step: Repeat the: "1st Step" and you can search (now) this poop:

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


then you must press: "ENTER" and into the: "Dissasembly window" you can see something how this:

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


5th Step: now you only must change this fuckings: "JNE SHORT 005B02AC" by: "JMP SHORT 005B02AC", and the same for: "JNE SHORT 005B02AC" (of bellow). and save your new copy on Disk of: "GameServer.exe", ready your GameServer must be Cracked or Bypassed (now).

or you can directly remove of the source... you must press: Ctrl+F on Visual Studio and search: "M:" and back to null the: "If" instruction.

/**/

Small Example of Correct Edition (using my Released Source of 1.01.03 Partially Rebuilded):

Gamemain.cpp file:
oZ66bHj - [Development] Source Mu Main 1.03.35 [Season 5.1 - Season 5.2] - RaGEZONE Forums


PS: If you don't searching for use C: how local disk you can easy change string by something how: "..\\Data"


Gamemain.cpp file:
axJZWkA - [Development] Source Mu Main 1.03.35 [Season 5.1 - Season 5.2] - RaGEZONE Forums

hi brd,
I did it,
But GS did not respond!
help!thanks!
 

Attachments

You must be registered for see attachments list
Newbie Spellweaver
Joined
Jul 13, 2019
Messages
86
Reaction score
37
I already figured it out, there is a rendering error in the game server.



are you worried this will use a lot of cpu/gpu, because i don't see mu is not well optimized for graphics
 
Newbie Spellweaver
Joined
Jul 13, 2019
Messages
86
Reaction score
37
É o mais viável hoje em dia, né, você conseguiu fazer alguma melhoria em relação ao FPS? Com muita quantidade de pessoa ao redor?
i am using 1 patch of kletx inside tuservermu. I also increased the fps from 25 to 30 and am testing the anti-aliasing available in the source
 
Joined
Jul 31, 2012
Messages
490
Reaction score
93
I just finished optimizing the 3D camera for performance and display.
25 FPS is optimal for Mu Online.
I also added ATI and NVidia support + CPU Info.

In my opinion, the result is sufficient.
The most FPS limits the rendering of objects on maps.

Just adjust the edges of the rendering of the objects and you can start testing.

After that I will share with you.

 
Newbie Spellweaver
Joined
Nov 17, 2016
Messages
15
Reaction score
20
I just finished optimizing the 3D camera for performance and display.
25 FPS is optimal for Mu Online.
I also added ATI and NVidia support + CPU Info.

In my opinion, the result is sufficient.
The most FPS limits the rendering of objects on maps.

Just adjust the edges of the rendering of the objects and you can start testing.

After that I will share with you.



The problem is in the rendering system. Making a good shader for rendering and using correctly the buffer system of the graphic driver will improve the performance a lot. Even adding fog to avoid the objects pop in and pop out magically, rendering the correct side of the objects face culling (in your video when you move the camera, the wooden gates looks transparent).

If you want to improve the rendering system, i think you should rebuild the complete system using higher version of OpenGL and making good GLSL files.
 
Joined
Aug 6, 2005
Messages
552
Reaction score
298
I already figured it out, there is a rendering error in the game server.



It's actually not a "rendering error" of the game server. It's by design, because the server optimized that for the normal camera frustum. The original game is not designed for a 3D Camera with changing perspectives.

Of course, you can increase this frustum on the server side, but that also has downsides, which should be kept in mind, for example:
- It not only increases the load on the client side (I saw you worked on that), but also on the server. It needs to notify more players about changes, so it increases the network traffic a lot, when there are more objects (players, monsters) on the map.
- Also, it might be strange from a sound perspective. Afaik, the client plays sound effects of all objects it currently knows at full volume. With an increased frustum on the server, the client plays sounds of objects far away, which it might not see.
 
Joined
Jul 31, 2012
Messages
490
Reaction score
93
The problem is in the rendering system. Making a good shader for rendering and using correctly the buffer system of the graphic driver will improve the performance a lot. Even adding fog to avoid the objects pop in and pop out magically, rendering the correct side of the objects face culling (in your video when you move the camera, the wooden gates looks transparent).

If you want to improve the rendering system, i think you should rebuild the complete system using higher version of OpenGL and making good GLSL files.

You still don't understand what OpenGL is.

I would like to explain something else.

OpenGL is the perfect tool. You can use, for example, EGL or another rewritten version, but if you do not remove the errors in the coding, you will not have a better rendering.

What you write can be done in OpenGL using six lines.





It's actually not a "rendering error" of the game server. It's by design, because the server optimized that for the normal camera frustum. The original game is not designed for a 3D Camera with changing perspectives.

Of course, you can increase this frustum on the server side, but that also has downsides, which should be kept in mind, for example:
- It not only increases the load on the client side (I saw you worked on that), but also on the server. It needs to notify more players about changes, so it increases the network traffic a lot, when there are more objects (players, monsters) on the map.
- Also, it might be strange from a sound perspective. Afaik, the client plays sound effects of all objects it currently knows at full volume. With an increased frustum on the server, the client plays sounds of objects far away, which it might not see.

The truth is that it is a mistake.

- This is an original function with a condition for the distance between the object and the player.
PHP:
BOOL gObjCheckViewport(int aIndex, int x, int y)
{
	if(OBJMAX_RANGE(aIndex) == 0)
	{
		return false;
	}

	LPOBJ lpObj = &gObj[aIndex];

	if(x < lpObj->X - 15  || x > lpObj->X + 15 || y < lpObj->Y - 15 || y > lpObj->Y + 15)
	{
		return false;
	}

	int j = 3;

	for(int i = 0; i < MAX_ARRAY_FRUSTRUM; j = i, i++)
	{
		int frustrum = (lpObj->FrustrumX[i]- x) * (lpObj->FrustrumY[j]-y) - (lpObj->FrustrumX[j]-x) * (lpObj->FrustrumY[i]-y);
		if(frustrum < 0)
		{
			return false;
		}
	}
	return true;
}

- This is a condition modified by me
PHP:
BOOL gObjCheckViewport(int aIndex, int x, int y)
{
	LPOBJ lpObj = &gObj[aIndex];

	int distance = 20;
	if(x < lpObj->X - distance || x > lpObj->X + distance || y < lpObj->Y - distance || y > lpObj->Y + distance)
	{
		return false;
	}

	int j = 3;

	for(int i = 0; i < 4; j = i, i++)
	{
		int frustrum = (lpObj->FrustrumX[i]- lpObj->X) * (lpObj->FrustrumY[j]- lpObj->Y) - (lpObj->FrustrumX[j]- lpObj->X) * (lpObj->FrustrumY[i]- lpObj->Y);
		if(frustrum < 0)
		{
			return false;
		}
	}
	return true;
}

The change is minimal and you don't need to make the difference of two points big.
 
Newbie Spellweaver
Joined
Nov 17, 2016
Messages
15
Reaction score
20
You still don't understand what OpenGL is.

I would like to explain something else.

OpenGL is the perfect tool. You can use, for example, EGL or another rewritten version, but if you do not remove the errors in the coding, you will not have a better rendering.

What you write can be done in OpenGL using six lines.



I know its easy to add fog effect and correct the face culling of the objects.
You misunderstood me. I said that you need to IMPROVE the actual code with OpenGL, not changing OpenGL itself. I give an example of GLSL (OpenGL Shading Language) that is used in newer versions of OGL. What i meant when i said 'If you want to improve the rendering system, i think you should rebuild the complete system' is the same as what you're saying about correcting the code.
Even i said UPGRADE the OpenGL Version, because by default its using OGL 1.1 (defined by Windows library) and not the latest OGL version (defined by Graphics Card's Drivers) and that takes down a lot of performance.
 
Joined
Aug 6, 2005
Messages
552
Reaction score
298
The truth is that it is a mistake.

- This is an original function with a condition for the distance between the object and the player.
...
- This is a condition modified by me
...

The change is minimal and you don't need to make the difference of two points big.

Understood, but did you also modify the frustum? Because otherwise, you'll not see very far if you rotate the camera to specific directions, e.g. to the opposite of the default direction (downwards).
 
Newbie Spellweaver
Joined
Jul 13, 2019
Messages
86
Reaction score
37
can anyone share a fix for socket system, when mixing socket item can crash main
 
Experienced Elementalist
Joined
Apr 2, 2009
Messages
223
Reaction score
57
You still don't understand what OpenGL is.

I would like to explain something else.

OpenGL is the perfect tool. You can use, for example, EGL or another rewritten version, but if you do not remove the errors in the coding, you will not have a better rendering.

What you write can be done in OpenGL using six lines.







The truth is that it is a mistake.

- This is an original function with a condition for the distance between the object and the player.
PHP:
BOOL gObjCheckViewport(int aIndex, int x, int y)
{
	if(OBJMAX_RANGE(aIndex) == 0)
	{
		return false;
	}

	LPOBJ lpObj = &gObj[aIndex];

	if(x < lpObj->X - 15  || x > lpObj->X + 15 || y < lpObj->Y - 15 || y > lpObj->Y + 15)
	{
		return false;
	}

	int j = 3;

	for(int i = 0; i < MAX_ARRAY_FRUSTRUM; j = i, i++)
	{
		int frustrum = (lpObj->FrustrumX[i]- x) * (lpObj->FrustrumY[j]-y) - (lpObj->FrustrumX[j]-x) * (lpObj->FrustrumY[i]-y);
		if(frustrum < 0)
		{
			return false;
		}
	}
	return true;
}

- This is a condition modified by me
PHP:
BOOL gObjCheckViewport(int aIndex, int x, int y)
{
	LPOBJ lpObj = &gObj[aIndex];

	int distance = 20;
	if(x < lpObj->X - distance || x > lpObj->X + distance || y < lpObj->Y - distance || y > lpObj->Y + distance)
	{
		return false;
	}

	int j = 3;

	for(int i = 0; i < 4; j = i, i++)
	{
		int frustrum = (lpObj->FrustrumX[i]- lpObj->X) * (lpObj->FrustrumY[j]- lpObj->Y) - (lpObj->FrustrumX[j]- lpObj->X) * (lpObj->FrustrumY[i]- lpObj->Y);
		if(frustrum < 0)
		{
			return false;
		}
	}
	return true;
}

The change is minimal and you don't need to make the difference of two points big.


please shared camera 3D
 
Joined
Jul 31, 2012
Messages
490
Reaction score
93
3D Camera

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