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.