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>
291 lines
11 KiB
C++
291 lines
11 KiB
C++
#ifndef _MODIFY_CHARACTER_H_
|
|
#define _MODIFY_CHARACTER_H_
|
|
|
|
#include < Creature/Character/Character.h >
|
|
#include < Network/Protocol/Ryl_AdminMgrProtocol.h >
|
|
#include < Pattern/Singleton.h >
|
|
|
|
// 전처리 ------------------------
|
|
class CPacketDispatch;
|
|
class CModifyCharacterMgr;
|
|
class CBuffer;
|
|
class CSession;
|
|
//--------------------------------
|
|
|
|
// Ryl_ItemData.cpp
|
|
namespace ItemData
|
|
{
|
|
// 아이템 좌표를 만든다.
|
|
Item::ItemPos MakeItemPos(unsigned char cPos, unsigned char cX, unsigned char cY, unsigned char cZ);
|
|
// 어떤위치에 아이템이 존재할까?
|
|
inline bool IsArrayContainer(unsigned char cTakePos);
|
|
// 아이템을 복사한다.
|
|
Item::CItem* CloneItem(Item::CItem* lpSrcItem, PktAdminMgr::CreateItemInfo EquipInfo);
|
|
|
|
// 한개의 UID에 3명의 캐릭터가 있고 3명의 캐릭터는 1개의 창고를 사용한다..
|
|
// 여러 계정의 창고 접근을 막자..
|
|
// 창고데이터가 갱신됬을경우 해당 UID에 걸려있는 캐릭터를 작업중인 관리자들에게 창고 정보를 갱신시켜 주자.
|
|
class CDepositLock
|
|
{
|
|
public:
|
|
struct DepositInfo
|
|
{
|
|
unsigned long m_dwCID;
|
|
CPacketDispatch* m_lpPacketDispatch;
|
|
|
|
DepositInfo()
|
|
: m_dwCID(0)
|
|
, m_lpPacketDispatch(NULL) { ;}
|
|
|
|
DepositInfo(unsigned long dwCID, CPacketDispatch* lpPacketDispatch)
|
|
: m_dwCID(dwCID)
|
|
, m_lpPacketDispatch(lpPacketDispatch) { ;}
|
|
};
|
|
|
|
typedef std::map< unsigned long, DepositInfo > isMapDeposit;
|
|
typedef isMapDeposit::iterator isDepositPos;
|
|
|
|
public:
|
|
isDepositPos begin() { return m_DepositUser.begin(); }
|
|
isDepositPos end() { return m_DepositUser.end(); }
|
|
|
|
size_t size() { return m_DepositUser.size(); }
|
|
|
|
bool isUse(unsigned long dwUID, unsigned long dwCID, CPacketDispatch* lpPacketDispatch, bool& bisLock);
|
|
void DepositLock(unsigned long dwUID, unsigned long dwCID, CPacketDispatch* lpPacketDispatch);
|
|
void DepositUnLock(unsigned long dwUID);
|
|
|
|
CPacketDispatch* GetDispatch(unsigned long dwUID);
|
|
void RemoveAllSelectDispatch(CPacketDispatch* lpPacketDispatch);
|
|
bool GetLockInfo(unsigned long dwUID, DepositInfo& Info);
|
|
|
|
private:
|
|
isMapDeposit m_DepositUser;
|
|
};
|
|
};
|
|
|
|
// LearnSkill.cpp
|
|
// 특정 캐릭터가 습득가능한 스킬을 표시하기 위해 필요한 클래스
|
|
// 스킬 스크립트를 로드하여 아이템타입을 제외한 모든 스킬의 ID만 보관
|
|
class CSkillID : public CStaticSingleton<CSkillID>
|
|
{
|
|
public:
|
|
|
|
typedef std::list<unsigned short> isListSkillUID;
|
|
typedef isListSkillUID::iterator isListSkillPos;
|
|
|
|
~CSkillID() { m_listSkillUID.clear(); }
|
|
|
|
isListSkillPos begin() { return m_listSkillUID.begin(); }
|
|
isListSkillPos end() { return m_listSkillUID.end(); }
|
|
|
|
void insert(unsigned short SkillUID) { m_listSkillUID.push_back(SkillUID); }
|
|
bool ReadSkillScript(char* szScriptName = "./Script/Game/SkillScript.txt");
|
|
|
|
private:
|
|
|
|
isListSkillUID m_listSkillUID;
|
|
};
|
|
|
|
|
|
// Item::CEquipment 다운 캐스트 클래스 (멤버 변수 추가하지 마시오!)
|
|
class CModifyEquipment : public Item::CEquipment
|
|
{
|
|
public:
|
|
void AdjustData(PktAdminMgr::CreateItemInfo EquipInfo)
|
|
{
|
|
m_cMaxNumOrDurability = EquipInfo.m_cMaxDurability;
|
|
m_cMaxSocket = EquipInfo.m_cMaxSocketNum;
|
|
m_cUpgradeLevel = EquipInfo.m_cUpgradeLevel;
|
|
m_cSeasonRecord = EquipInfo.m_cSeasonRecord;
|
|
m_cCoreLevel = EquipInfo.m_cCoreLevel;
|
|
|
|
for(m_cSocketNum = 0; m_cSocketNum < m_cMaxSocket; ++m_cSocketNum)
|
|
{
|
|
if (0 == EquipInfo.m_cSocket[m_cSocketNum]) break;
|
|
}
|
|
|
|
CopyMemory(m_cSocket, EquipInfo.m_cSocket,
|
|
sizeof(unsigned char) * m_cSocketNum);
|
|
CopyMemory(m_usRuneSocket, EquipInfo.m_usRuneSocket,
|
|
sizeof(unsigned short) * Item::EquipmentInfo::MAX_RUNE_SOCKET_NUM);
|
|
CopyMemory(m_wAttribute, EquipInfo.m_usAttribute,
|
|
sizeof(unsigned short) * Item::Attribute::MAX_ATTRIBUTE_NUM);
|
|
}
|
|
|
|
void AddGemAttribute() { ApplyGemAttribute(APPLY); }
|
|
void RemoveGemAttribute() { ApplyGemAttribute(REMOVE); }
|
|
|
|
void AddUpgradeAttribute() { ApplyUpgradeAttribute(APPLY); }
|
|
void RemoveUpgradeAttribute() { ApplyUpgradeAttribute(REMOVE); }
|
|
|
|
void AddRuneAttribute() { ApplyRuneAttribute(APPLY); }
|
|
void RemoveRuneAttribute() { ApplyRuneAttribute(REMOVE); }
|
|
};
|
|
|
|
// Item::CItem 다운 캐스트 클래스 (멤버 변수 추가하지 마시오!)
|
|
class CModifyItem : public Item::CItem
|
|
{
|
|
public:
|
|
void SetUID(unsigned __int64 UID);
|
|
void SetPrototoypID(unsigned short PrototypeID);
|
|
};
|
|
|
|
|
|
// 캐릭터 정보 수정을 위한 확장 클래스
|
|
class CModifyCharacter : public CCharacter
|
|
{
|
|
friend CModifyCharacterMgr;
|
|
|
|
public:
|
|
#pragma pack(1)
|
|
struct CHAR_EXTRA_DATA
|
|
{
|
|
CHAR_INFOEX m_CharInfoEX;
|
|
QUEST m_Quest;
|
|
HISTORY m_History;
|
|
CONFIG m_Config;
|
|
};
|
|
#pragma pack()
|
|
|
|
enum MASK
|
|
{
|
|
ON_BASIC = 1, // ON_BASIC 정보 수정
|
|
ON_EXTRA = 2, // ON_EXTRA 정보 수정
|
|
ON_FRIEND = 4, // ON_FRIEND 정보 수정
|
|
ON_BAN = 8, // ON_BAN 정보 수정
|
|
ON_STROE12 = 16, // ON_STROE12 정보 수정
|
|
ON_STORE34 = 32, // ON_STORE34 정보 수정
|
|
|
|
OFF_BASIC = 62, // ON_BASIC 정보 없음
|
|
OFF_EXTRA = 61, // ON_EXTRA 정보 없음
|
|
OFF_FRIEND = 59, // ON_FRIEND 정보 없음
|
|
OFF_BAN = 55, // ON_BAN 정보 없음
|
|
OFF_STORE12 = 47, // ON_STROE12 정보 없음
|
|
OFF_STORE34 = 31, // ON_STORE34 정보 없음
|
|
};
|
|
|
|
CModifyCharacter();
|
|
~CModifyCharacter() { }
|
|
|
|
BYTE m_byChangedInfo;
|
|
|
|
void SetUID(unsigned long dwUID) { m_dwUID = dwUID; } // 캐릭터 UID 변경
|
|
void SetCID(unsigned long dwCID) { m_dwCID = dwCID; } // 캐릭터 CID 변경
|
|
void SetUserNation(unsigned char cNation) { m_cQuestNation = cNation; } // 캐릭터 국적 변경
|
|
void SetServerGroup(unsigned long dwServerGroup) { m_dwServerGroup = dwServerGroup; } // 서버그룹 변경
|
|
void SetOldServerGroup(unsigned char cGroupID) { m_cOldServerGroupID = cGroupID; } // Old 서버 그룹 변경
|
|
unsigned long GetServerGroup() { return m_dwServerGroup; } // 현재 서버그룹 얻기
|
|
|
|
void SetModifyAdmin(char* Account, int Length); // 에디팅중인 관리자 아이디 변경
|
|
void SetDispatch(CPacketDispatch* lpPacketDispatch) { m_lpPacketDispatch = lpPacketDispatch; } // 에디팅중인 관리자 Dispatch변경
|
|
CPacketDispatch* GetDispatch() { return m_lpPacketDispatch; } // 에디팅중인 관리자의 Dispatch를 가져온다
|
|
|
|
unsigned short GetMaxHP() { return m_CreatureStatus.m_StatusInfo.m_nMaxHP; } // 캐릭터의 최대 체력
|
|
unsigned short GetNowHP() { return m_CreatureStatus.m_nNowHP; } // 캐릭터의 현재 체력
|
|
unsigned short GetMaxMP() { return m_CreatureStatus.m_StatusInfo.m_nMaxMP; } // 캐릭터의 최대 마나
|
|
unsigned short GetNowMP() { return m_CreatureStatus.m_nNowMP; } // 캐릭터의 현재 마나
|
|
|
|
char* GetName() { return m_DBData.m_Info.Name; } // 캐릭명 얻기
|
|
void ChangeName(char* szName); // 캐릭명 변경
|
|
void GetModifyCharStatus(PktAdminMgr::CHAR_STATUS_ST& StatusST); // 스테이터스 정보 얻기
|
|
CHAR_EXTRA_DATA& GetExtraData() { return m_ExtraData; } // 기타 정보 얻기
|
|
bool UpdataStatus(PktAdminMgr::CHAR_STATUS_ST& StatusST); // 스테이터스 정보 수정
|
|
bool SetGold(unsigned long dwGold); // 캐릭터 소지금 변경
|
|
Item::CItem* UIDbyItem(unsigned __int64 ItemUID, unsigned char cTakeType); // 아이템UID로 캐릭터 아이템 검색
|
|
|
|
unsigned short GetMaxSkillPoint(); // 캐릭터가 사용할 수 있는 스킬 포인트
|
|
unsigned short GetSkillPoint() { return m_DBData.m_Skill.GetSkillNum(); } // 현재 스킬 수
|
|
SKILL& GetSkill() { return m_DBData.m_Skill; } // 캐릭터의 스킬 정보
|
|
unsigned char AppendSkill(unsigned short wSkillID, char cLevel, char cLockCount); // 스킬 추가
|
|
unsigned char DeleteSkill(unsigned short wSkillID, char cLevel, char cLockCount); // 스킬 삭제
|
|
short GetSkillLevelEX(unsigned short usSkillType, char cLockCount); // 스킬 레벨 얻기
|
|
bool ChkEmptySlot(SKILL Skill); // 빈 슬롯이 있는지 체크
|
|
|
|
CHAR_POS& GetLastPos() { return m_DBData.m_Pos; } // 캐릭터의 마지막 위치 얻기
|
|
Position& GetCurPos() { return m_CurrentPos; } // 캐릭터의 마지막 위치를 얻기(데이터베이스 정보)
|
|
void SetServerID(unsigned long dwServerID) { m_ExtraData.m_CharInfoEX.ServerID = dwServerID; } // 캐릭터의 마지막 서버 아이디(존) 수정
|
|
unsigned long GetServerID() { return m_ExtraData.m_CharInfoEX.ServerID; } // 마지막 존 얻기
|
|
|
|
void Reset(); // 전부 초기화
|
|
|
|
void OnChangedInfo(int iMask); // 정보가 변경된 섹션 저장
|
|
void OffChangedInfo(int iMask); // 정보 변경 섹션을 해제
|
|
void SetNextClose() { m_bScheduleClose = true; } // 저장후 캐릭터닫음 설정
|
|
bool isClose() { return m_bScheduleClose; } // 캐릭터의 닫힌 상태 여부
|
|
void SetClientKey(unsigned long dwClientKey) { m_dwClientRequestKey = dwClientKey; } // 관리자의 클라이언트 키를 변경 ( 클라이언트가 MDI로 계발되었기때문에 있어야함 )
|
|
unsigned long GetClientKey() { return m_dwClientRequestKey; } // 관리자의 클라이언트키 가져오기
|
|
unsigned char GetOldServerGroupID() { return m_cOldServerGroupID; } // 이전 서버군 ID 얻기 (Part2Selectable)
|
|
|
|
CSession* GetCheckSession(unsigned long dwUID); // 세션 무결성 체크
|
|
|
|
void SetSaveState(bool bSave) { m_bSave = bSave; } // 저장임을 알리자
|
|
bool GetSaveState() { return m_bSave; } // 저장 중인지 여부
|
|
|
|
// 중복 아이템 검사 관련
|
|
typedef std::set <__int64> ModifyCharItemSerialInfo;
|
|
typedef std::vector<__int64> OverlapSerialInfo;
|
|
|
|
ModifyCharItemSerialInfo m_ModifyCharItemSerialInfo;
|
|
OverlapSerialInfo m_OverlapSerialInfo;
|
|
|
|
void SetOwnCopyItemState(bool IsOwn) { m_bIsOwnCopyItem = IsOwn; } // 복사 아이템 소유여부 셋팅
|
|
bool IsOwnCopyItem() { return m_bIsOwnCopyItem; } // 복사 아이템 소유여부
|
|
|
|
void ParseQuestData();
|
|
void SetQuestData();
|
|
|
|
unsigned char GetUserNation() { return m_cQuestNation; }
|
|
|
|
char GetChance() { return m_DBData.m_Info.Chance; }
|
|
|
|
unsigned char GetNameChangeChance() { return m_ExtraData.m_CharInfoEX.cNameChangeCount; }
|
|
void SetNameChangeChance(unsigned char cChance) { m_ExtraData.m_CharInfoEX.cNameChangeCount = cChance; }
|
|
|
|
void RevisionQuestNation(); // 퀘스트 종속성 체크용 국적 설정(2005-11-23 추가)
|
|
|
|
private:
|
|
|
|
CPacketDispatch* m_lpPacketDispatch; // 접근중인 관리자 디스패치
|
|
|
|
unsigned long m_dwServerGroup; // 해당 캐릭터가 존재하는 중계서버의 그룹
|
|
char m_szModifyAdmin[40]; // 에디팅중인 관리자 계정명
|
|
bool m_bScheduleClose; // 업데이트후 캐릭터 세션을 닫을지 여부
|
|
unsigned long m_dwClientRequestKey; // 클라이언트 수정창(문서)의 식별번호
|
|
bool m_bSave; // 저장 중인지 여부
|
|
bool m_bIsOwnCopyItem; // 복사 아이템 소유 여부
|
|
|
|
unsigned char m_cQuestNation; // 국적 퀘스트 종속성 검사용
|
|
unsigned char m_cOldServerGroupID; // Part2Selectable 타입일때 필요한 정보
|
|
|
|
CHAR_EXTRA_DATA m_ExtraData; // 캐릭터 정보 구조체 (기타, 퀘스트, 히스토리, 설정)
|
|
};
|
|
|
|
|
|
// 정보 열람, 수정 중인 캐릭터 목록 관리
|
|
// 각 서버 그룹의 Dispatch가 각각 1개씩 소유
|
|
class CModifyCharacterMgr
|
|
{
|
|
public:
|
|
typedef std::map<unsigned long, CModifyCharacter*> isMapCharList;
|
|
typedef isMapCharList::iterator iterator;
|
|
|
|
iterator begin() { return m_mapModifyChar.begin(); }
|
|
iterator end() { return m_mapModifyChar.end(); }
|
|
size_t size() { return m_mapModifyChar.size(); }
|
|
|
|
CModifyCharacter* GetCharacter(unsigned long dwCID); // 캐릭터 얻기
|
|
CModifyCharacter* InsertChar(unsigned long dwCID); // 캐릭터 등록
|
|
bool EraseChar(unsigned long dwCID); // 캐릭터 삭제
|
|
|
|
void AllRemoveChar(CPacketDispatch* lpPacketDispatch); // lpPacketDispatch를 사용하는 캐릭터를 목록에서 모두 삭제
|
|
|
|
void isUIDSendAll(unsigned long dwUID, CBuffer* lpBuffer); // UID가 같은 캐릭터 목록의 Dispatch로 패킷 전송
|
|
|
|
private:
|
|
CModifyCharacter* CreateCharacter() { return new CModifyCharacter; }
|
|
|
|
isMapCharList m_mapModifyChar;
|
|
};
|
|
|
|
#endif |