Most visitors online was 18079 , on 7 Jul 2024
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!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 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;
你个小老外 我以为有多吊。还不是个小垃圾
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;
if ( dwCheckSum != GenerateCheckSum2( Buffer, Size*MAX_SKILLS, 0x5A18)) // With CRC
if ( dwCheckSum == GenerateCheckSum2( Buffer, Size*MAX_SKILLS, 0x5A18)) // Without CRC
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);
}
}
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);
}
}
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);
}
}
void SaveSkillScript(char *FileName)
// ---- 3D camera ----
extern float CameraZoom;
extern float AngleY3D;
// -------------------
// ---- 3D camera ----
extern float CameraZoom;
extern float AngleY3D;
// -------------------
float AgleRL = 0.f;
float AgleX3D = 0.f;
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.
AttackDamage = (AttackDamage+(Vitality/8)+(Energy/10))*(100 + (Vitality/8) + (Energy/10))/100.0f;
100 + (Dexterity / 8 + Energy / 10);
AttackDamage += 100 + (Dexterity / 8 + Energy / 10);
Could something solved the Hits in the 3d Camera ?
You must be registered to see links
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.
Ok, i will try to do it. Really i dont understood but i will try![]()
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]
You must be registered to see links
Position[1]
You must be registered to see links
Position[2]
You must be registered to see links
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;
}
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]
You must be registered to see links
Position[1]
You must be registered to see links
Position[2]
You must be registered to see links
p[0] += Scale * 0.5f;
p[1] += Scale * 0.5f;
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;
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.