Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
337
GameTools/NeoRylClient/SkillNode.cpp
Normal file
337
GameTools/NeoRylClient/SkillNode.cpp
Normal file
@@ -0,0 +1,337 @@
|
||||
// SkillNode.cpp: implementation of the CSkillNode class.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
//#include <crtdbg.h>
|
||||
#include "ClientMain.h"
|
||||
#include "CharacterControl.h"
|
||||
#include "SkillNode.h"
|
||||
|
||||
#include "SkillSystem.h"
|
||||
|
||||
#include "Skill\SkillMgr.h"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Construction/Destruction
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
CSkillNode::CSkillNode()
|
||||
{
|
||||
m_lpButtonNormal = NULL;
|
||||
m_lpButtonDown = NULL;
|
||||
m_lpButtonSuccess = NULL;
|
||||
}
|
||||
|
||||
CSkillNode::~CSkillNode()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void CSkillNode::Create(unsigned long dwChrID, unsigned char cSuccess, unsigned short wSkill, unsigned short wSkillGrade, unsigned long dwCastingTick)
|
||||
{
|
||||
if(wSkill & 0x8000) // <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20>ƴ<EFBFBD><C6B4><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
{
|
||||
const Skill::ProtoType *lpSkillTypeTemp = g_SkillMgr.GetSkillProtoType(wSkill);
|
||||
const Skill::ProtoType *lpSkillType = &lpSkillTypeTemp[wSkillGrade];
|
||||
const Skill::ProtoType *lpSkillTypeforStartMP = lpSkillType;
|
||||
|
||||
if(lpSkillType)
|
||||
{
|
||||
if(Skill::Type::INSTANCE == lpSkillType->m_eSkillType)
|
||||
{
|
||||
m_cLevel = (unsigned char)dwCastingTick;
|
||||
} else
|
||||
{
|
||||
unsigned long dwLevelTick = lpSkillType->m_LevelTick * ((500 - ((g_ClientMain.m_csStatus.m_Info.DEX + g_ClientMain.m_csStatus.m_lAddDEX) - 20)) / 500.0f);
|
||||
m_cLevel = dwCastingTick / dwLevelTick;
|
||||
}
|
||||
|
||||
if(g_ClientMain.m_csStatus.m_Info.MP < lpSkillTypeforStartMP->m_StartMP + lpSkillType->m_LevelMP * m_cLevel)
|
||||
{
|
||||
for(int i = wSkillGrade; i >= 0; i--)
|
||||
{
|
||||
if(g_ClientMain.m_csStatus.m_Info.MP >= lpSkillTypeforStartMP->m_StartMP)
|
||||
{
|
||||
wSkillGrade = i;
|
||||
lpSkillType = &lpSkillTypeTemp[wSkillGrade];
|
||||
|
||||
m_cLevel = (g_ClientMain.m_csStatus.m_Info.MP - lpSkillTypeforStartMP->m_StartMP) / lpSkillType->m_LevelMP;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_cSuccess = cSuccess;
|
||||
m_dwTargetChrID = dwChrID;
|
||||
if(lpSkillType->m_eTargetType == Skill::Target::MELEE) m_bMelee = TRUE; else m_bMelee = FALSE;
|
||||
|
||||
CEffScript *test_script;
|
||||
////////// skil ///////////
|
||||
CEffScript *skill_name;
|
||||
|
||||
char skill[256]={0};
|
||||
char *skill_ptr = NULL;
|
||||
bool skill_nameuse = true;
|
||||
|
||||
if(strstr("A_Firing",lpSkillType->m_szEffectFileName) != NULL) //Firing <20><> skill name <20><><EFBFBD><EFBFBD> X
|
||||
skill_nameuse = false;
|
||||
|
||||
// _ASSERTE(_CrtCheckMemory());
|
||||
test_script = new CEffScript;
|
||||
|
||||
if(skill_nameuse == true) {
|
||||
// _ASSERTE(_CrtCheckMemory());
|
||||
skill_name = new CEffScript;
|
||||
strcpy(skill,lpSkillType->m_szEffectFileName);
|
||||
skill_ptr = strrchr(skill,'.');
|
||||
(*skill_ptr) = '_';skill_ptr++;
|
||||
(*skill_ptr) = 'n';skill_ptr++;
|
||||
(*skill_ptr) = 'a';skill_ptr++;
|
||||
(*skill_ptr) = 'm';skill_ptr++;
|
||||
(*skill_ptr) = 'e';skill_ptr++;
|
||||
(*skill_ptr) = '.';skill_ptr++;
|
||||
(*skill_ptr) = 'e';skill_ptr++;
|
||||
(*skill_ptr) = 's';skill_ptr++;
|
||||
(*skill_ptr) = 'f';skill_ptr++;
|
||||
(*skill_ptr) = '\0';skill_ptr++;
|
||||
}
|
||||
//////////////////////
|
||||
|
||||
if(g_ClientMain.m_csStatus.m_lstEquipment[11 + g_ClientMain.m_csStatus.m_cWeaponPos])
|
||||
{
|
||||
test_script->SetSkillInfo(g_ClientMain.m_csStatus.m_Info.Sex, g_ClientMain.m_csStatus.m_lstEquipment[11 + g_ClientMain.m_csStatus.m_cWeaponPos]->GetItemType());
|
||||
} else
|
||||
{
|
||||
test_script->SetSkillInfo(g_ClientMain.m_csStatus.m_Info.Sex, 0);
|
||||
}
|
||||
if(skill_nameuse == true) {
|
||||
skill_name->SetInterfaceSet(true);
|
||||
skill_name->GetScriptBinData(skill);
|
||||
}
|
||||
test_script->GetScriptBinData((char *)lpSkillType->m_szEffectFileName);
|
||||
|
||||
// <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD>Ʈ ó<><C3B3>
|
||||
if(wSkill == 0x8603) // chain action
|
||||
g_CharacterData.m_SkillAttackValue = lpSkillType->m_cStrikeNum; //Hit Count Setting
|
||||
|
||||
test_script->SetStartPos(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.x,
|
||||
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.y,
|
||||
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.z);
|
||||
if(m_dwTargetChrID != 0xFFFFFFFF)
|
||||
{
|
||||
vector3 *vecPos = g_CharacterData.GetFindChrPos(m_dwTargetChrID);
|
||||
if(vecPos) test_script->SetEndPos((D3DXVECTOR3 *)vecPos, 1);
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CCreature *target_chr = g_CharacterData.GetCreature(m_dwTargetChrID);
|
||||
test_script->SetChr(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lpChrModel,
|
||||
target_chr->m_lpChrModel);
|
||||
|
||||
} else
|
||||
{
|
||||
if(m_bMelee)
|
||||
{
|
||||
float fChrDir = g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_fDirection;
|
||||
fChrDir = -fChrDir;
|
||||
fChrDir -= FLOAT_PHI / 2.0f;
|
||||
|
||||
vector3 vecChrToward;
|
||||
vecChrToward.x = cosf(fChrDir);
|
||||
vecChrToward.z = sinf(fChrDir);
|
||||
vecChrToward.y = 0.0f;
|
||||
vecChrToward.Normalize();
|
||||
vecChrToward *= 50.0f;
|
||||
|
||||
vector3 vecEnd = g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos + vecChrToward;
|
||||
test_script->SetEndPos((D3DXVECTOR3 *)&vecEnd, 1);
|
||||
}
|
||||
}
|
||||
|
||||
float fChrDir = g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_fDirection;
|
||||
fChrDir = -fChrDir;
|
||||
fChrDir -= FLOAT_PHI / 2.0f;
|
||||
|
||||
vector3 vecChrToward;
|
||||
vecChrToward.x = cosf(fChrDir);
|
||||
vecChrToward.z = sinf(fChrDir);
|
||||
vecChrToward.y = 0.0f;
|
||||
vecChrToward.Normalize();
|
||||
test_script->SetChrFwd(-vecChrToward.x, -vecChrToward.y, -vecChrToward.z);
|
||||
test_script->SetPlayer(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter],g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwChrID);
|
||||
m_lpEffectIndex = CSceneManager::m_EffectManager.AddEffScript(test_script); // <20><><EFBFBD><EFBFBD>Ʈ <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
|
||||
|
||||
if(skill_nameuse == true) {
|
||||
skill_name->m_InterfacePos[0] += 0.0f;
|
||||
skill_name->m_InterfacePos[1] += 310.0f;
|
||||
CSceneManager::m_EffectManager.AddInterfaceScript(skill_name);
|
||||
}
|
||||
m_bAngle = TRUE;
|
||||
m_wSkill = wSkill;
|
||||
m_wSkillGrade = wSkillGrade;
|
||||
m_wNumAttack = lpSkillType->m_cStrikeNum;
|
||||
m_wNumAttackCount = 0;
|
||||
|
||||
vector3 *vecPos;
|
||||
if(m_dwTargetChrID != 0xFFFFFFFF)
|
||||
{
|
||||
vecPos = g_CharacterData.GetFindChrPos(m_dwTargetChrID);
|
||||
} else
|
||||
{
|
||||
vecPos = &g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos;
|
||||
}
|
||||
|
||||
CastObject pCastObject;
|
||||
pCastObject.m_wTypeID = g_ClientMain.m_csStatus.m_lpQuickSelected->GetProtoTypeID();
|
||||
if(g_ClientMain.m_csStatus.m_lstEquipment[11 + g_ClientMain.m_csStatus.m_cWeaponPos])
|
||||
{
|
||||
pCastObject.m_cObjectType = g_ClientMain.m_csStatus.m_lstEquipment[11 + g_ClientMain.m_csStatus.m_cWeaponPos]->GetItemType();
|
||||
} else
|
||||
{
|
||||
pCastObject.m_cObjectType = 0;
|
||||
}
|
||||
pCastObject.m_cObjectLevel = wSkillGrade;
|
||||
pCastObject.m_DstPos.fPointX = vecPos->x;
|
||||
pCastObject.m_DstPos.fPointY = vecPos->y;
|
||||
pCastObject.m_DstPos.fPointZ = vecPos->z;
|
||||
|
||||
List<DWORD> SendCharacterList;
|
||||
g_CharacterData.GetSendCharacterAroundList(SendCharacterList);
|
||||
for(int i=0;i<SendCharacterList.num;i++)
|
||||
{
|
||||
g_ClientMain.m_Network.m_pSocket->RegistInstanceUDPList(SendCharacterList[i]);
|
||||
}
|
||||
g_ClientMain.m_Network.m_pSocket->CharCastObjectInfo(g_ClientMain.m_dwMyChrID, m_dwTargetChrID, pCastObject);
|
||||
|
||||
g_SkillSystem.AddSkill(this);
|
||||
g_ClientMain.SetSkillCoolDown(wSkillGrade, lpSkillType->m_cEndCoolDown);
|
||||
|
||||
if(lpSkillType->m_cEndScript)
|
||||
{
|
||||
LPEffectNode lpEffect;
|
||||
lpEffect = new EffectNode;
|
||||
lpEffect->m_lpEffect = m_lpEffectIndex;
|
||||
lpEffect->m_dwTargetID = m_dwTargetChrID;
|
||||
g_SkillSystem.m_lstEffect.push_back(lpEffect);
|
||||
}
|
||||
}
|
||||
} else if(wSkill == AtType::Bow || wSkill == AtType::CrossBow)
|
||||
{
|
||||
// Ȱ / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
m_cLevel = 0;
|
||||
m_cSuccess = cSuccess;
|
||||
m_dwTargetChrID = dwChrID;
|
||||
m_wSkill = wSkill;
|
||||
m_wSkillGrade = wSkillGrade;
|
||||
m_wNumAttack = 1;
|
||||
m_wNumAttackCount = 0;
|
||||
m_bAngle = TRUE;
|
||||
m_bMelee = FALSE;
|
||||
|
||||
CEffScript *test_script;
|
||||
// _ASSERTE(_CrtCheckMemory());
|
||||
test_script = new CEffScript;
|
||||
|
||||
if(g_ClientMain.m_csStatus.m_lstEquipment[11 + g_ClientMain.m_csStatus.m_cWeaponPos])
|
||||
{
|
||||
test_script->SetSkillInfo(g_ClientMain.m_csStatus.m_Info.Sex, g_ClientMain.m_csStatus.m_lstEquipment[11 + g_ClientMain.m_csStatus.m_cWeaponPos]->GetItemType());
|
||||
} else
|
||||
{
|
||||
test_script->SetSkillInfo(g_ClientMain.m_csStatus.m_Info.Sex, 0);
|
||||
}
|
||||
test_script->GetScriptBinData("arrow_normal.esf");
|
||||
test_script->SetStartPos(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.x,
|
||||
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.y,
|
||||
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.z);
|
||||
if(m_dwTargetChrID != 0xFFFFFFFF)
|
||||
{
|
||||
vector3 *vecPos = g_CharacterData.GetFindChrPos(m_dwTargetChrID);
|
||||
if(vecPos) test_script->SetEndPos((D3DXVECTOR3 *)vecPos, 1);
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CCreature *target_chr = g_CharacterData.GetCreature(m_dwTargetChrID);
|
||||
test_script->SetChr(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lpChrModel,
|
||||
target_chr->m_lpChrModel);
|
||||
}
|
||||
|
||||
float fChrDir = g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_fDirection;
|
||||
fChrDir = -fChrDir;
|
||||
fChrDir -= FLOAT_PHI / 2.0f;
|
||||
|
||||
vector3 vecChrToward;
|
||||
vecChrToward.x = cosf(fChrDir);
|
||||
vecChrToward.z = sinf(fChrDir);
|
||||
vecChrToward.y = 0.0f;
|
||||
vecChrToward.Normalize();
|
||||
test_script->SetChrFwd(-vecChrToward.x, -vecChrToward.y, -vecChrToward.z);
|
||||
|
||||
m_lpEffectIndex = CSceneManager::m_EffectManager.AddEffScript(test_script); // <20><><EFBFBD><EFBFBD>Ʈ <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
|
||||
|
||||
vector3 *vecPos;
|
||||
if(m_dwTargetChrID != 0xFFFFFFFF)
|
||||
{
|
||||
vecPos = g_CharacterData.GetFindChrPos(m_dwTargetChrID);
|
||||
} else
|
||||
{
|
||||
vecPos = &g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos;
|
||||
}
|
||||
|
||||
CastObject pCastObject;
|
||||
pCastObject.m_wTypeID = wSkill;
|
||||
if(g_ClientMain.m_csStatus.m_lstEquipment[11 + g_ClientMain.m_csStatus.m_cWeaponPos])
|
||||
{
|
||||
pCastObject.m_cObjectType = g_ClientMain.m_csStatus.m_lstEquipment[11 + g_ClientMain.m_csStatus.m_cWeaponPos]->GetItemType();
|
||||
} else
|
||||
{
|
||||
pCastObject.m_cObjectType = 0;
|
||||
}
|
||||
pCastObject.m_cObjectLevel = wSkillGrade;
|
||||
pCastObject.m_DstPos.fPointX = vecPos->x;
|
||||
pCastObject.m_DstPos.fPointY = vecPos->y;
|
||||
pCastObject.m_DstPos.fPointZ = vecPos->z;
|
||||
|
||||
List<DWORD> SendCharacterList;
|
||||
g_CharacterData.GetSendCharacterAroundList(SendCharacterList);
|
||||
for(int i=0;i<SendCharacterList.num;i++)
|
||||
{
|
||||
g_ClientMain.m_Network.m_pSocket->RegistInstanceUDPList(SendCharacterList[i]);
|
||||
}
|
||||
g_ClientMain.m_Network.m_pSocket->CharCastObjectInfo(g_ClientMain.m_dwMyChrID, m_dwTargetChrID, pCastObject);
|
||||
|
||||
g_SkillSystem.AddSkill(this);
|
||||
} else
|
||||
{
|
||||
// <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
m_cLevel = 0;
|
||||
m_cSuccess = cSuccess;
|
||||
m_dwTargetChrID = dwChrID;
|
||||
// m_nEffectIndex // <20><><EFBFBD><EFBFBD>Ʈ <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
|
||||
m_wSkill = wSkill;
|
||||
m_wSkillGrade = wSkillGrade;
|
||||
if(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_JUMPATTACK)
|
||||
{
|
||||
const char *strMotionSheet = g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lpChrModel->GetCurrentMotionSheetName();
|
||||
if(strMotionSheet && !strcmp(strMotionSheet, "CLASS_ROGUE"))
|
||||
m_wNumAttack = 2;
|
||||
else
|
||||
m_wNumAttack = 1;
|
||||
|
||||
m_bAngle = FALSE;
|
||||
} else if(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_JUMPATTACK2)
|
||||
{
|
||||
m_wNumAttack = 4;
|
||||
m_bAngle = FALSE;
|
||||
} else if(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_JUMPATTACK3)
|
||||
{
|
||||
m_wNumAttack = 3;
|
||||
m_bAngle = FALSE;
|
||||
} else
|
||||
{
|
||||
m_wNumAttack = 1;
|
||||
m_bAngle = TRUE;
|
||||
}
|
||||
m_wNumAttackCount = 0;
|
||||
m_bMelee = TRUE;
|
||||
|
||||
g_SkillSystem.AddSkill(this);
|
||||
}
|
||||
|
||||
m_bFirstAttack = FALSE;
|
||||
}
|
||||
Reference in New Issue
Block a user