- Joined
- Feb 8, 2015
- Messages
- 108
- Reaction score
- 19
you can use louis update 15, it works on vs 2019 and newer
You must be registered to see links
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!I use the OpenMU server, ofc ;-) I'm extending/adapting the client to features and protocol of season 6.Awesome work! which server files are you using with this client nevS ?
You can try using latest source with fixesScottLy 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...
nevS Is there a way to compile your MuClient on GlobalRelease? I only managed to compile it on GlobalDebug
#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
#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)
{
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);
}
I leave the code for anyone who wants to use it, it's not optimized for darklost cloak, someone can optimize it
thank you, it's great, but I don't see it running with Cape of LordShadows for DL and RF capes fixed:You must be registered to see links
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.
Where is the brother, how to contact the compilation environment and how to configure it
Thanks a lot for the example! By changing the color of the fog, there was a3D 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
- Then create a new function in the NewUIOptionWindow.cpp filePHP:void SetCameraOnOff();
- This function checks if a setting for the camera exists in the registry and has permission to change the value of that setting
- Go to the Render Buttons() function in the NewUIOption Window.cpp file and create a checkbox for the 3D cameraPHP: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); }
- My settings save is next to the Effects render settings name
- 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 cameraPHP:// 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); }
- Now go to the UpdateMouseEvent() function in the NewUIOption Window.cpp file and create an action when the 3D camera checkbox is checkedPHP: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"); }
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.
- In the same function, go to this condition and edit as followsPHP: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; } } }
- At the end of this function, add the following condition before return bLockCamera;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
- Go to the MoveMainScene() function and modify this condition. Thus...PHP:// Field of vision if (m_CameraOnOff == 1) { if (CameraZoom > 0) CameraViewFar += 458.33f + (458.33f * CameraZoom); else CameraViewFar += 1458.33f; }
- Go to the next condition in the MoveMainScene() function and edit that 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 RenderMainScene() 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(); }
- And the last condition in this file in the RenderMainScene() function modify this 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; }
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.
- Find another condition and edit it like thisPHP:// ! ¸¶żě˝ş µű¶óĽ Äł¸ŻĹÍŔÇ Č¸Ŕü °˘µµ¸¦ şŻ°ćÇŃ´Ů. 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;
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.
- Then find the function bool bool TestFrustrum(vec3_t Position,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; }
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.
- Go to the ZzzScene.cpp file and find the RenderMainScene() function. Replace the following linePHP: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);
with this linePHP:FogEnable = true;
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.
bool TestFrustrum2D(float x, float y, float Range)Thanks a lot for the example! By changing the color of the fog, there was aYou must be registered to see links. Where is the best place to fix it?
Who can guess what with the teleport to Vulcanus?