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]

Banned
Banned
Joined
Feb 8, 2015
Messages
108
Reaction score
19
you can use louis update 15, it works on vs 2019 and newer

 
Newbie Spellweaver
Joined
Dec 13, 2020
Messages
21
Reaction score
12
Changes by

Client:

Hardware information has been improved.
Limitation errors in the code have been removed.
The processor description has been improved.
Several corrections were made to the code.
Performance and general stability improvements.

MuServer:
Support for XML has been added.

- Fixed visual bug when walking the DL crow.
- Fixed bug refusing chat in friends window, friend windows.
- Added equip item with right mouser, right click.
- Glow fenrir us RED/BLUE/BLACK.
- Fixed Personal Shop.

Changelog:
Update: 20/04/2023

- Optimization and improvement in overall stability.
- All CS maps have been fixed.
- Set Item Options have been corrected.
- Valley of Loren map has been fixed.
- Smart Cast and other API-related errors have been corrected.

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

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

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

Update: 29/04/2023

- Added Rage Fighter
- Fixes and improvements
- Improvements and updates to GameServer.exe
- Improvements and fixes to GameServerCS.exe
- GameServer.exe has been updated to Season 6.3
- GameServerCS.exe has been updated to Season 6.3

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

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



Update: 06/05/2023 + Download

- Fixes related to the Rage Fighter
- Full screen and resolution issues resolved
- Improvements and optimizations

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


Links:

Source+Client
Update Version: 1.0.0-230504



Not Updated
MuServer

Source_MuServer
 
Junior Spellweaver
Joined
Dec 8, 2007
Messages
137
Reaction score
11
ScottLy Which server and client are you using? I downloaded from the links you posted and after setting up the server and client I have weird glitches with the client i.e. chars are floating on the select char screen, when logged I have a garbage item displayed on my char that disappears only if I re equip something and finally both buffer NPCs appear without their wings...
 
Junior Spellweaver
Joined
Dec 8, 2007
Messages
137
Reaction score
11
Oh I see, nice work, I tried to compile your Main Client fork but couldn't because it requires Visual Studio 2022 and I had 2019. I could install the new VS but it requires that I upgrade my Windows 10 LTSC installation to its next Service Pack because VS2022 doesn't support the one I have now :S

Btw I am looking forward at your Main Client repo, it would be a visual treat to have the game rendered at 60FPS once the animation's speed is sorted out...
 
Last edited:
Newbie Spellweaver
Joined
Dec 13, 2020
Messages
21
Reaction score
12
ScottLy Which server and client are you using? I downloaded from the links you posted and after setting up the server and client I have weird glitches with the client i.e. chars are floating on the select char screen, when logged I have a garbage item displayed on my char that disappears only if I re equip something and finally both buffer NPCs appear without their wings...
You can try using latest source with fixes


Updated
Source+Client


No Updated
MuServer

Source_MuServer
 
Junior Spellweaver
Joined
Dec 8, 2007
Messages
137
Reaction score
11
ScottLy Same error after compiling, take a look
Untitled - [Development] Source Mu Main 1.03.35 [Season 5.1 - Season 5.2] - RaGEZONE Forums


nevS Is there a way to compile your MuClient on GlobalRelease? I only managed to compile it on GlobalDebug
 

Attachments

You must be registered for see attachments list
Last edited:
Newbie Spellweaver
Joined
Jul 28, 2021
Messages
30
Reaction score
4
maybe cost relocate to mysql database? why need mssql?
 
Newbie Spellweaver
Joined
Jul 13, 2019
Messages
86
Reaction score
37
I played with the character's shadow a bit while reading this post https://forum.ragezone.com/threads/how-improve-quality-of-shadows.1086361/
1691979987360 - [Development] Source Mu Main 1.03.35 [Season 5.1 - Season 5.2] - RaGEZONE Forums


I leave the code for anyone who wants to use it, it's not optimized for darklost cloak, someone can optimize it

void RenderCharacter(CHARACTER* c, OBJECT* o, int Select)
find o->EnableShadow = true;
C++:
#ifdef THEM_BONG_ITEM_WING
            for (int i = MAX_BODYPART - 1; i >= 0; i--)
            {
                PART_t* p = &c->BodyPart[i];
                if (p->Type != -1)
                {
                    int Type = p->Type;

                    RenderPartObject(&c->Object, Type, p, c->Light, o->Alpha, 0, 0, 0, false, false, Translate);
                }
                else
                {
                    RenderPartObject(&c->Object, MODEL_SHADOW_BODY, NULL, c->Light, o->Alpha, 0, 0, 0, false, false, Translate);
                }
            }

            for (int i = 0; i < 2; i++)
            {
                if (c->Weapon[i].Type >= MODEL_BOW + 0 && c->Weapon[i].Type <= MODEL_BOW + 32)
                {
                    continue;
                }

                PART_t* p = &c->Weapon[i];

                if (p->Type != -1 && c->SafeZone == false)
                {
                    int Type = p->Type;

                    RenderPartObject(&c->Object, Type, p, c->Light, o->Alpha, 0, 0, 0, false, false, Translate);
                }
            }
#else
            RenderPartObject(&c->Object, MODEL_SHADOW_BODY, NULL, c->Light, o->Alpha, 0, 0, 0, false, false, Translate);
#endif
void RenderLinkObject(float x, float y, float z, CHARACTER* c, PART_t* f, int Type, int Level, int Option1, bool Link, bool Translate, int RenderType, bool bRightHandItem)
Add to end of function
C++:
#ifdef THEM_BONG_ITEM_WING

    if (World != WD_10HEAVEN && InHellas() == FALSE && !g_Direction.m_CKanturu.IsMayaScene())
    {
        switch (Type)        // ³¯°³ÀÎÁö °Ë»ç
        {
        case MODEL_WING + 0:            // ¿äÁ¤³¯°³
        case MODEL_WING + 1:        // õ°ø³¯°³
        case MODEL_WING + 2:        // »çź³¯°³
        case MODEL_WING + 3:        // Á¤·É³¯°³
        case MODEL_WING + 4:        // ¿µÈ¥³¯°³
        case MODEL_WING + 5:        // µå¶ó°ï³¯°³
        case MODEL_WING + 6:        // ¾ÏÈ泯°³
        //case MODEL_HELPER + 30:    // ±ºÁÖÀÇ ¸ÁÅä
        case MODEL_WING + 36:        // ÆødzÀdz¯°³
        case MODEL_WING + 37:        // ½Ã°øÀdz¯°³
        case MODEL_WING + 38:        // ȯ¿µÀdz¯°³
        case MODEL_WING + 39:        // ÆĸêÀdz¯°³
        //case MODEL_WING + 40:        // Á¦¿ÕÀǸÁÅä
        {
            b->RenderBodyShadow();
        }
        break;
        }
    }

#endif


void BMD::RenderBodyShadow(int BlendMesh, int HiddenMesh, int StartMeshNumber, int EndMeshNumber)

C++:
void BMD::RenderBodyShadow(int BlendMesh, int HiddenMesh, int StartMeshNumber, int EndMeshNumber)
{
    if (NumMeshs == 0) return;

    if (World != WD_7ATLANSE) { EnableAlphaTest(false); }

    glColor4f(0.0f, 0.0f, 0.0f, 0.7f); // 30% opacity for shadow

    DisableTexture();
    DisableDepthMask();
    BeginRender(1.f);

    // enable stencil and continue draw
    glEnable(GL_STENCIL_TEST);
    glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);

    int startMesh = 0;
    int endMesh = NumMeshs;

    if (StartMeshNumber != -1) startMesh = StartMeshNumber;
    if (EndMeshNumber != -1)   endMesh = EndMeshNumber;

    float sx = 2000.f;
    float sy = 4000.f;

    if (battleCastle::InBattleCastle())
    {
        sx = 2500.f;
        sy = 4000.f;
    }

    for (int i = startMesh; i < endMesh; i++)
    {
        if (i != HiddenMesh)
        {
            Mesh_t* m = &Meshs[i];
            if (m->NumTriangles > 0 && m->Texture != BlendMesh)
            {
                glBegin(GL_TRIANGLES);
                for (int j = 0; j < m->NumTriangles; j++)
                {
                    Triangle_t* tp = &m->Triangles[j];
                    for (int k = 0; k < tp->Polygon; k++)
                    {
                        int vi = tp->VertexIndex[k];
                        vec3_t Position;
                        VectorSubtract(VertexTransform[i][vi], BodyOrigin, Position);
                        Position[0] += Position[2] * (Position[0] + sx) / (Position[2] - sy);
                        Position[2] = 5.f;
                        VectorAdd(Position, BodyOrigin, Position);
                        glVertex3fv(Position);
                    }
                }
                glEnd();
            }
        }
    }
    EndRender();
    EnableDepthMask();

    glDisable(GL_STENCIL_TEST);
}
 

Attachments

You must be registered for see attachments list
Last edited:
Joined
Aug 6, 2005
Messages
552
Reaction score
298
son1xx2 fixed
and improved shadows with
😅

Hey guys. BTW, here is the result of 5 minute look into client, FPS is capped to monitor refresh rate, I just made few changes in code to keep animation and camera movement properly. I don't know why WebZen never improved this.



Hey, what is your hardware to get this high fps? Nvidia Card?

I'm also working on improving fps, and the most fps I get with debug build is 60~90 fps. I have an AMD RX6800 GPU and a Ryzen 5900X CPU. The GPU is almost idle, however OpenGL support of AMD is probably not the best. Release build is not much better, too. Edit: Just tried it again, Release build is much better for me... 120~200 fps 😀 The windows energy plan and gpu driver settings are also affecting the fps I can get, because MU alone is not enough to make my CPU and GPU maintain high frequency. The GPU would stay at 60 mhz, if I don't select a tuning preset like 'Silent' or 'Balanced' - then it rises to about 500mhz, which is enough to get over the 100 fps mark.

If you wanna try:
 
Last edited:
Initiate Mage
Joined
Aug 24, 2023
Messages
2
Reaction score
1
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.
Thanks a lot for the example! By changing the color of the fog, there was a . Where is the best place to fix it?

Who can guess what with the teleport to Vulcanus?
 
Last edited:
Banned
Banned
Joined
Feb 8, 2015
Messages
108
Reaction score
19
Thanks a lot for the example! By changing the color of the fog, there was a . Where is the best place to fix it?

Who can guess what with the teleport to Vulcanus?
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++)
{
float d = (FrustrumX - x) * (FrustrumY[j] - y) -
(FrustrumX[j] - x) * (FrustrumY - y);
Range -= 70;
if (d <= Range)
{
return false;
}
}
return true;
}
demo :
dsw_pool - [Development] Source Mu Main 1.03.35 [Season 5.1 - Season 5.2] - RaGEZONE Forums
 
Last edited:
Back
Top