Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/Client/WarFare/GameDef.h
Original file line number Diff line number Diff line change
Expand Up @@ -427,7 +427,6 @@ struct __InfoPlayerOther
int iKnightsGrade; // Clan grade
int iKnightsRank; // Clan ranking

int iRank; // Noble rank - used to identify high-ranking titles like King [1], Senator [2].
int iTitle; // Bitmask representing various titles/roles including:
// Clan Leader, Clan Assistant, Castle Lord, Feudal Lord, King, Emperor, Party leader, Solo player

Expand Down
69 changes: 38 additions & 31 deletions src/Client/WarFare/GameProcMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1088,6 +1088,9 @@ bool CGameProcMain::ProcessPacket(Packet& pkt)
}
}
break;
case WIZ_SERVER_INDEX:
this->MsgRecv_ServerIndex(pkt);
return true;

case WIZ_ITEM_UPGRADE:
MsgRecv_ItemUpgrade(pkt);
Expand Down Expand Up @@ -1867,7 +1870,7 @@ bool CGameProcMain::MsgRecv_MyInfo_All(Packet& pkt)
__ASSERT(pLooks, "failed find character resource data");
s_pPlayer->InitChr(pLooks); // 관절 세팅..

s_pPlayer->m_InfoExt.iRank = pkt.read<uint8_t>();
s_pPlayer->m_InfoBase.iRank = pkt.read<uint8_t>();
s_pPlayer->m_InfoExt.iTitle = pkt.read<uint8_t>();
s_pPlayer->m_InfoBase.iLevel = pkt.read<uint8_t>();
s_pPlayer->m_InfoExt.iLevelPrev = s_pPlayer->m_InfoBase.iLevel;
Expand All @@ -1890,16 +1893,17 @@ bool CGameProcMain::MsgRecv_MyInfo_All(Packet& pkt)
/*int iAllianceID =*/pkt.read<int16_t>();
/*uint8_t byFlag =*/pkt.read<uint8_t>();

int iKnightNameLen = pkt.read<uint8_t>(); // 소속 기사단 이름 길이.
int iKnightNameLen = pkt.read<uint8_t>(); // 소속 기사단 이름 길이.
pkt.readString(szKnightsName, iKnightNameLen);
int iKnightsGrade = pkt.read<uint8_t>(); // 소속 기사단 등급
int iKnightsRank = pkt.read<uint8_t>(); // 소속 기사단 순위
int iKnightsGrade = pkt.read<uint8_t>(); // 소속 기사단 등급
int iKnightsRank = pkt.read<uint8_t>(); // 소속 기사단 순위

/*int16_t sMarkVersion =*/pkt.read<int16_t>();
/*int16_t sCapeID =*/pkt.read<int16_t>();
int16_t sMarkVersion = pkt.read<int16_t>(); // Clan mark
int16_t sCapeID = pkt.read<int16_t>(); // Clan cloak

// 기사단 관련 세팅..
s_pPlayer->m_InfoExt.eKnightsDuty = eKnightsDuty; // 기사단에서의 권한..
s_pPlayer->m_InfoExt.eKnightsDuty = eKnightsDuty; // 기사단에서의 권한..
s_pPlayer->m_InfoBase.iMarkVersion = sMarkVersion; // Clan mark
s_pPlayer->KnightsInfoSet(iKnightsID, szKnightsName, iKnightsGrade, iKnightsRank);
m_pUIVar->UpdateKnightsInfo();

Expand Down Expand Up @@ -2177,16 +2181,8 @@ bool CGameProcMain::MsgRecv_MyInfo_All(Packet& pkt)

InitPlayerPosition(__Vector3(fX, fY, fZ)); // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다.
s_pPlayer->RegenerateCollisionMesh();

// berserk temp
//s_pPlayer->PlugSet(PLUG_POS_BACK, "item/babacloak.n3cplug_cloak", nullptr); // 파트를 셋팅..
Comment thread
reignsprime marked this conversation as resolved.
// end berserk temp

// berserk
//s_pPlayer->AttachCloak();

//..
s_pOPMgr->Release(); // 다른 유저 관리 클래스 초기화..
s_pPlayer->AttachCloak(sCapeID); // Cloak
s_pOPMgr->Release(); // 다른 유저 관리 클래스 초기화..

if (m_pUICmdList != nullptr)
m_pUICmdList->CreateCategoryList();
Expand Down Expand Up @@ -2542,24 +2538,24 @@ bool CGameProcMain::MsgRecv_UserIn(Packet& pkt, bool bWithFX)

/*int16_t sAllianceID =*/pkt.read<int16_t>();

int iKnightNameLen = pkt.read<uint8_t>(); // 소속 기사단 이름 길이.
int iKnightNameLen = pkt.read<uint8_t>(); // 소속 기사단 이름 길이.
std::string szKnightsName;
pkt.readString(szKnightsName, iKnightNameLen);
int iKnightsGrade = pkt.read<uint8_t>(); // 등급
int iKnightsRank = pkt.read<uint8_t>(); // 순위
int iKnightsGrade = pkt.read<uint8_t>(); // 등급
int iKnightsRank = pkt.read<uint8_t>(); // 순위

/*int16_t sMarkVersion =*/pkt.read<int16_t>();
/*int16_t sCapeID =*/pkt.read<int16_t>();
int16_t sMarkVersion = pkt.read<int16_t>(); // Clan mark
int16_t sCapeID = pkt.read<int16_t>(); // Cloak

int iLevel = pkt.read<uint8_t>(); // 레벨...
e_Race eRace = (e_Race) pkt.read<uint8_t>();
e_Class eClass = (e_Class) pkt.read<int16_t>();
float fXPos = (pkt.read<uint16_t>()) / 10.0f;
float fZPos = (pkt.read<uint16_t>()) / 10.0f;
float fYPos = (pkt.read<int16_t>()) / 10.0f;
int iLevel = pkt.read<uint8_t>(); // 레벨...
e_Race eRace = (e_Race) pkt.read<uint8_t>();
e_Class eClass = (e_Class) pkt.read<int16_t>();
float fXPos = (pkt.read<uint16_t>()) / 10.0f;
float fZPos = (pkt.read<uint16_t>()) / 10.0f;
float fYPos = (pkt.read<int16_t>()) / 10.0f;

float fYTerrain = ACT_WORLD->GetHeightWithTerrain(fXPos, fZPos); // 지형의 높이값 얻기..
float fYObject = ACT_WORLD->GetHeightNearstPosWithShape(__Vector3(fXPos, fYPos, fZPos)); // 오브젝트에서 가장 가까운 높이값 얻기..
float fYTerrain = ACT_WORLD->GetHeightWithTerrain(fXPos, fZPos); // 지형의 높이값 얻기..
float fYObject = ACT_WORLD->GetHeightNearstPosWithShape(__Vector3(fXPos, fYPos, fZPos)); // 오브젝트에서 가장 가까운 높이값 얻기..
if (fYObject > fYTerrain)
fYPos = fYObject;
else
Expand All @@ -2581,7 +2577,7 @@ bool CGameProcMain::MsgRecv_UserIn(Packet& pkt, bool bWithFX)
/*uint8_t bInvisibilityType =*/pkt.read<uint8_t>();
/*int16_t sDirection =*/pkt.read<int16_t>();
/*bool bIsChicken =*/pkt.read<bool>();
/*uint8_t bRank =*/pkt.read<uint8_t>();
uint8_t byRank = pkt.read<uint8_t>(); // Noble rank - used to identify high-ranking titles like King [1], Senator [2]
/*uint8_t bKnightsRank =*/pkt.read<uint8_t>();
/*uint8_t bPersonalRank =*/pkt.read<uint8_t>();

Expand Down Expand Up @@ -2629,9 +2625,12 @@ bool CGameProcMain::MsgRecv_UserIn(Packet& pkt, bool bWithFX)
pUPC->m_InfoBase.eClass = eClass;
pUPC->m_InfoBase.iLevel = iLevel;
pUPC->m_InfoBase.iAuthority = byAuthority;
pUPC->m_InfoBase.iRank = byRank;
pUPC->Init(eRace, iFace, iHair, dwItemIDs, iItemDurabilities, byItemFlags);
pUPC->RotateTo(DegreesToRadians(rand() % 360), true);
pUPC->m_InfoBase.iMarkVersion = sMarkVersion;
pUPC->KnightsInfoSet(iKnightsID, szKnightsName, iKnightsGrade, iKnightsRank);
pUPC->AttachCloak(sCapeID);

//__KnightsInfoBase* pKIB = m_pUIKnightsOp->KnightsInfoFind(iKightsID);
//if(pKIB) pUPC->KnightsNameSet(pKIB->szName, 0xffff0000);
Expand Down Expand Up @@ -8051,3 +8050,11 @@ void CGameProcMain::MsgRecv_ZoneAbility(Packet& pkt)
s_pPlayer->m_InfoExt.sZoneTariff = pkt.read<int16_t>();
}
}

void CGameProcMain::MsgRecv_ServerIndex(Packet& pkt)
{
int16_t sResult = pkt.read<int16_t>();
if (sResult == 0) // 1 = success, 0 = server index unavailable
return;
m_nServerIndex = pkt.read<int16_t>();
}
2 changes: 2 additions & 0 deletions src/Client/WarFare/GameProcMain.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,8 @@ class CGameProcMain : public CGameProcedure

bool MsgRecv_CharacterSelect(Packet& pkt) override; // virtual
int MsgRecv_VersionCheck(Packet& pkt) override; // virtual
void MsgRecv_ServerIndex(Packet& pkt); // Server index
int m_nServerIndex = 0;

bool MsgRecv_MyInfo_All(Packet& pkt);
void MsgRecv_MyInfo_HP(Packet& pkt);
Expand Down
10 changes: 10 additions & 0 deletions src/Client/WarFare/GameProcedure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -711,6 +711,16 @@ std::string CGameProcedure::GetStrRegKeySetting()
return fmt::format("Software\\KnightOnline\\{}_{}_{}", s_szAccount, s_szServer, s_iChrSelectIndex);
}

std::string CGameProcedure::GetSymbolFilename(const int serverIndex, const int knightsId, const int markVersion)
{
return fmt::format("symbol_us\\s_{}_{}_{}.dxt", serverIndex, knightsId, markVersion);
}

int CGameProcedure::GetServerIndex()
{
return s_pProcMain ? s_pProcMain->m_nServerIndex : 0;
}

bool CGameProcedure::ProcessPacket(Packet& pkt)
{
int iCmd = pkt.read<uint8_t>(); // 커멘드 파싱..
Expand Down
3 changes: 3 additions & 0 deletions src/Client/WarFare/GameProcedure.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,9 @@ class CGameProcedure : public CGameBase
static void SetGameCursor(e_Cursor eCursor, bool bLocked = false);
static void RestoreGameCursor();

static std::string GetSymbolFilename(const int serverIndex, const int knightsId, const int markVersion);
static int GetServerIndex();

protected:
virtual bool ProcessPacket(Packet& pkt);
void MsgRecv_ServerChange(Packet& pkt);
Expand Down
83 changes: 74 additions & 9 deletions src/Client/WarFare/PlayerBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -304,9 +304,10 @@ void CPlayerBase::KnightsInfoSet(int iID, const std::string& /*szName*/, int iGr
szPlug = fmt::format("Item\\ClanAddOn_{:03}_{}.n3cplug", static_cast<int>(m_InfoBase.eRace), iGrade);
}

m_InfoBase.iKnightsID = iID;
m_InfoBase.iKnightsID = iID;
m_InfoBase.iKnightsGrade = iGrade;

CN3CPlugBase* pPlug = PlugSet(PLUG_POS_KNIGHTS_GRADE, szPlug, nullptr, nullptr);
CN3CPlugBase* pPlug = PlugSet(PLUG_POS_KNIGHTS_GRADE, szPlug, nullptr, nullptr);
if (pPlug == nullptr)
return;

Expand Down Expand Up @@ -528,12 +529,24 @@ void CPlayerBase::TickAnimation()
// 걷고 뛰고, 에니메이션등... 속도 적용
float fAniSpeedDelta = 1.0f;
if (PSM_STOP != m_eStateMove)
fAniSpeedDelta = m_fMoveDelta; // 이동중이면 스피드 적용..
fAniSpeedDelta = m_fMoveDelta; // 이동중이면 스피드 적용..
else if (PSA_ATTACK == m_eState)
fAniSpeedDelta = m_fAttackDelta; // 공격중이면 공격 스피드 적용..
fAniSpeedDelta = m_fAttackDelta; // 공격중이면 공격 스피드 적용..
__ASSERT(fAniSpeedDelta >= 0.1f && fAniSpeedDelta < 10.0f, "Invalid Animation Speed Delta!!!");
m_Chr.AniSpeedDeltaSet(fAniSpeedDelta); // 에니메이션 스피드 실제 적용..
m_Chr.Tick(); // 에니메이션 틱..
m_Chr.AniSpeedDeltaSet(fAniSpeedDelta); // 에니메이션 스피드 실제 적용..
m_Chr.Tick(); // 에니메이션 틱..

if (m_Chr.CloakPlug() != nullptr)
{
e_CloakMove eCloakMove = CLOAK_MOVE_STOP;
if (m_eStateMove == PSM_RUN)
eCloakMove = CLOAK_MOVE_RUN;
else if (m_eStateMove == PSM_WALK)
eCloakMove = CLOAK_MOVE_WALK;
else if (m_eStateMove == PSM_WALK_BACKWARD)
eCloakMove = CLOAK_MOVE_WALK_BACKWARD;
m_Chr.CloakPlug()->GetCloak()->Tick(m_Chr.m_nLOD, m_fYawCur, eCloakMove);
}

m_bAnimationChanged = false; // 큐에 넣은 에니메이션이 변하는 순간만 세팅된다..
if (m_Chr.IsAnimEnd()) // 에니메이션이 끝나면..
Expand Down Expand Up @@ -1702,14 +1715,22 @@ bool CPlayerBase::CheckCollisionToTargetByPlug(CPlayerBase* pTarget, int nPlug,
return pTarget->CheckCollisionByBox(v1, v2, pVCol, nullptr);
}

CN3CPlugBase* CPlayerBase::PlugSet(e_PlugPosition ePos, const std::string& szFN, __TABLE_ITEM_BASIC* pItemBasic, __TABLE_ITEM_EXT* pItemExt)
CN3CPlugBase* CPlayerBase::PlugSet(
e_PlugPosition ePos, const std::string& szFN, __TABLE_ITEM_BASIC* pItemBasic, __TABLE_ITEM_EXT* pItemExt, bool isForce)
{
if (ePos < PLUG_POS_RIGHTHAND || ePos >= PLUG_POS_COUNT)
{
__ASSERT(0, "Invalid Plug Position");
return nullptr;
}

if (m_InfoBase.bIsTransformed && !isForce) // Skip plug if player is transformed
{
if (pItemBasic)
m_pItemPlugBasics[ePos] = pItemBasic;
if (pItemExt)
m_pItemPlugExts[ePos] = pItemExt;
return nullptr;
}
int iJoint = 0;
if (PLUG_POS_RIGHTHAND == ePos)
{
Expand All @@ -1736,7 +1757,14 @@ CN3CPlugBase* CPlayerBase::PlugSet(e_PlugPosition ePos, const std::string& szFN,
}
else if (PLUG_POS_BACK == ePos)
{
//m_pItemPlugBasics[PLUG_POS_BACK] = pItem;
m_pItemPlugBasics[ePos] = pItemBasic;
m_pItemPlugExts[ePos] = pItemExt;

CN3CPlug_Cloak* pCloak = m_Chr.CloakPlugSet(szFN);
if (pCloak != nullptr)
pCloak->m_nJointIndex = ITEM_POS_SHOULDER;

return pCloak;
}
else
{
Expand Down Expand Up @@ -1849,6 +1877,43 @@ CN3CPlugBase* CPlayerBase::PlugSet(e_PlugPosition ePos, const std::string& szFN,
return pPlug;
}

void CPlayerBase::AttachCloak(int16_t sCapeID, bool isForce)
{
PlugSet(PLUG_POS_BACK, "", nullptr, nullptr, /*isForce=*/true); // Remove cloak

if (sCapeID < 0) // No cloak
return;

Comment thread
reignsprime marked this conversation as resolved.
const std::string sMeshPath = fmt::format("Item\\Cloak_{:03}.n3cplug", static_cast<int>(m_InfoBase.eRace)); // Cloak mesh for each race
CN3CPlug_Cloak* pCloak = static_cast<CN3CPlug_Cloak*>(PlugSet(PLUG_POS_BACK, sMeshPath, nullptr, nullptr, isForce));
if (pCloak == nullptr)
return;

std::string SColourTexPath;
std::string sPatternTexPath;
std::string sClanMarkTexPath;

if (m_InfoBase.iRank == 1)
{
SColourTexPath = "Item\\Cloak_C_99.dxt"; // King cloak
}
else
{
int nColour = sCapeID % 100;
int nPattern = sCapeID / 100;

SColourTexPath = fmt::format("Item\\Cloak_C_{:02}.dxt", nColour); // Cloak colour
sPatternTexPath = fmt::format("Item\\Cloak_M_{:02}.dxt", nPattern); // Cloak pattern
sClanMarkTexPath = ""; // No Clan Mark

if (m_InfoBase.iKnightsGrade <= 2)
sClanMarkTexPath = CGameProcedure::GetSymbolFilename(
CGameProcedure::GetServerIndex(), m_InfoBase.iKnightsID, m_InfoBase.iMarkVersion); // Clan Mark
}

pCloak->Init(pCloak->Mesh(), SColourTexPath, sClanMarkTexPath, sPatternTexPath);
}

CN3CPart* CPlayerBase::PartSet(e_PartPosition ePos, const std::string& szFN, __TABLE_ITEM_BASIC* pItemBasic, __TABLE_ITEM_EXT* pItemExt)
{
if (ePos < PART_POS_UPPER || ePos >= PART_POS_COUNT)
Expand Down
18 changes: 14 additions & 4 deletions src/Client/WarFare/PlayerBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,16 @@ struct __InfoPlayerBase
int iHP;
int iMP;
int iMPMax;
int iAuthority; // 권한 - 0 관리자, 1 - 일반유저, 255 - 블럭당한 유저...
int iKnightsID; // Clan ID
int iAuthority; // 권한 - 0 관리자, 1 - 일반유저, 255 - 블럭당한 유저...
int iKnightsID; // Clan ID
int iAllianceID;
int iKnightsWarEnemyID;
int iKnightsGrade; // Clan grade
int16_t iMarkVersion; // Clan mark
int iRank; // Noble rank - used to identify high-ranking titles like King [1], Senator [2]. Always 0 for NPCs.
bool bIsTransformed;

bool bRenderID; // 화면에 ID 를 찍는지..
bool bRenderID; // 화면에 ID 를 찍는지..

__InfoPlayerBase()
{
Expand All @@ -70,7 +74,11 @@ struct __InfoPlayerBase
iKnightsID = 0;
iAllianceID = 0;
iKnightsWarEnemyID = 0;
iKnightsGrade = 0;
iMarkVersion = 0;
iRank = 0;
bRenderID = true;
bIsTransformed = false;
}
};

Expand Down Expand Up @@ -412,8 +420,10 @@ class CPlayerBase : public CGameBase
}

virtual CN3CPart* PartSet(e_PartPosition ePos, const std::string& szFN, __TABLE_ITEM_BASIC* pItemBasic, __TABLE_ITEM_EXT* pItemExt);
virtual CN3CPlugBase* PlugSet(e_PlugPosition ePos, const std::string& szFN, __TABLE_ITEM_BASIC* pItemBasic, __TABLE_ITEM_EXT* pItemExt);
virtual CN3CPlugBase* PlugSet(
e_PlugPosition ePos, const std::string& szFN, __TABLE_ITEM_BASIC* pItemBasic, __TABLE_ITEM_EXT* pItemExt, bool isForce = false);
virtual void DurabilitySet(e_ItemSlot eSlot, int iDurability);
void AttachCloak(int16_t sCapeID, bool isForce = false);

void TickYaw(); // 회전값 처리.
void TickAnimation(); // 에니메이션 처리.
Expand Down
10 changes: 3 additions & 7 deletions src/Client/WarFare/PlayerMySelf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -566,7 +566,7 @@ void CPlayerMySelf::InventoryChrAnimationInitialize()
}

CN3CPlugBase* CPlayerMySelf::PlugSet(
e_PlugPosition ePos, const std::string& szFN, __TABLE_ITEM_BASIC* pItemBasic, __TABLE_ITEM_EXT* pItemExt)
e_PlugPosition ePos, const std::string& szFN, __TABLE_ITEM_BASIC* pItemBasic, __TABLE_ITEM_EXT* pItemExt, bool isForce)
{
int iJoint = 0;
if (PLUG_POS_RIGHTHAND == ePos)
Expand Down Expand Up @@ -595,7 +595,7 @@ CN3CPlugBase* CPlayerMySelf::PlugSet(
}
else if (PLUG_POS_BACK == ePos)
{
//m_pItemBasicPlugRefs[PLUG_POS_BACK] = pItem;
return CPlayerBase::PlugSet(ePos, szFN, pItemBasic, pItemExt, isForce);
}
else
{
Expand All @@ -613,13 +613,9 @@ CN3CPlugBase* CPlayerMySelf::PlugSet(
pPlug->ScaleSet(__Vector3(fScale, fScale, fScale));
pPlug->m_nJointIndex = iJoint; // 관절 번호 세팅..
}
// else if(PLUG_POS_BACK == ePos)
// {
// CN3CPlug_Cloak *pPlugCloak = (CN3CPlug_Cloak*)pPlug;
// }

this->SetSoundPlug(pItemBasic);
return CPlayerBase::PlugSet(ePos, szFN, pItemBasic, pItemExt);
return CPlayerBase::PlugSet(ePos, szFN, pItemBasic, pItemExt, isForce);
}

CN3CPart* CPlayerMySelf::PartSet(e_PartPosition ePos, const std::string& szFN, __TABLE_ITEM_BASIC* pItemBasic, __TABLE_ITEM_EXT* pItemExt)
Expand Down
4 changes: 2 additions & 2 deletions src/Client/WarFare/PlayerMySelf.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,8 @@ class CPlayerMySelf : public CPlayerBase

bool InitChr(__TABLE_PLAYER_LOOKS* pTblUPC) override;
CN3CPart* PartSet(e_PartPosition ePos, const std::string& szFN, __TABLE_ITEM_BASIC* pItemBasic, __TABLE_ITEM_EXT* pItemExt) override;
CN3CPlugBase* PlugSet(
e_PlugPosition ePos, const std::string& szFN, __TABLE_ITEM_BASIC* pItemBasic, __TABLE_ITEM_EXT* pItemExt) override;
CN3CPlugBase* PlugSet(e_PlugPosition ePos, const std::string& szFN, __TABLE_ITEM_BASIC* pItemBasic, __TABLE_ITEM_EXT* pItemExt,
bool isForce = false) override;

void Tick() override;
void Render(float fSunAngle) override;
Expand Down
Loading
Loading