#include "stdafx.h" #include "ModifyCharacter.h" #include #include #include #include #include #include #include #include #include #include CModifyCharacter::CModifyCharacter() : CCharacter(0, 0) , m_dwServerGroup(0) , m_byChangedInfo(0) , m_bScheduleClose(false) , m_bSave(false) , m_bIsOwnCopyItem(false) { Initialize(NULL); ZeroMemory(&m_ExtraData, sizeof(CHAR_EXTRA_DATA)); m_ModifyCharItemSerialInfo.clear(); m_OverlapSerialInfo.clear(); m_cOldServerGroupID = UnifiedConst::Part2Selectable; } // À̳༮Àº »ç¿ëÇÏÁö ¸»ÀÚ Initialize <- À̳༮ ij¸¯ÅÍ »ý¼ºÈÄ µü~~ 1¹ø¸¸ »ç¿ëÇÏÀÚ // ±×·¸Áö ¾ÊÀ¸¸é ¸Þ¸ð¸® »÷´Ù ¤Ñ.¤Ñ; void CModifyCharacter::Reset() { SetUID(0); SetCID(0); m_dwServerGroup = 0; m_byChangedInfo = 0; m_bScheduleClose = false; ZeroMemory(&m_DBData, sizeof(CharacterDBData)); Initialize(NULL); } unsigned short CModifyCharacter::GetMaxSkillPoint() { // CalculateStatusData°¡ ¼±ÇàµÇ¾î¾ß ÇÔ. return m_CreatureStatus.m_StatusInfo.m_wSkillPoint; } // ½ºÅ³ Ãß°¡ ¹× ½ºÅ³ ·¹º§ º¯°æ (ÀÌ¹Ì ½ÀµæÇÑ ½ºÅ³À» Ãß°¡ ¿äûÇÑ´Ù¸é ·¹º§ ¼öÁ¤À¸·Î ÀνÄ) unsigned char CModifyCharacter::AppendSkill(unsigned short wSkillID, char cLevel, char cLockCount) { m_DBData.m_Skill.wSkillNum = m_DBData.m_Skill.GetSkillNum(); // ÇöÀç ½ºÅ³¼ö Àç °è»ê const Skill::ProtoType* lpSkillProtoType = CSkillMgr::GetInstance().GetSkillProtoType(wSkillID); short sSlotIndex = GetSkillSlotIndex(wSkillID); bool bIsNewSkill = false; // »õ ½ºÅ³ ½Àµæ ¿©ºÎ if(-1 == sSlotIndex) bIsNewSkill = true; if(NULL == lpSkillProtoType) { ERRLOG1(g_Log, "½ºÅ³ ÇÁ·ÎÅä ŸÀÔ ¾ò±â ½ÇÆÐ. ½ºÅ³ID: 0x%04x", wSkillID); return PktAdminMgr::PktSkillEdit::FAILED_TO_GET_SKILLPROTOTYPE; } if(CSkillMgr::MAX_SKILL_LOCKCOUNT <= cLockCount) { ERRLOG1(g_Log, "ÃÖ´ë ½ºÅ³ ¶ô Ä«¿îÆ®¸¦ ÃʰúÇÏ¿´½À´Ï´Ù. ¶ô Ä«¿îÆ®: %c", cLockCount); return PktAdminMgr::PktSkillEdit::OVERED_MAX_LOCKCOUNT; } if(CSkillMgr::MAX_SKILL_LEVEL < cLevel) { ERRLOG1(g_Log, "ÃÖ´ë ½ºÅ³ ·¹º§À» ÃʰúÇÏ¿´½À´Ï´Ù. ½ºÅ³ ·¹º§: %c", cLevel); return PktAdminMgr::PktSkillEdit::OVERED_MAX_SKILL_LEVEL; } if(lpSkillProtoType[0].m_usSkill_ID != lpSkillProtoType[cLockCount].m_usSkill_ID) { ERRLOG2(g_Log, "½ºÅ³ ID°¡ ´Ù¸¨´Ï´Ù. 0x%04x : 0x%04x", lpSkillProtoType[0].m_usSkill_ID, lpSkillProtoType[cLockCount].m_usSkill_ID); return PktAdminMgr::PktSkillEdit::FAILED; } // ÃÖ´ë ½ºÅ³ ·¹º§À» Ãß°¡ÇÒ °æ¿ì (´ÙÀ½ ´Ü°è·Î ³Ñ¾î°¡´Â °æ¿ì) if(cLevel == CSkillMgr::MAX_SKILL_LEVEL) { // ÃÖÁ¾ ´Ü°è ½ºÅ³ÀÌ ¾Æ´Ñ°æ¿ì ´ÙÀ½ ´Ü°è 0·¹º§ ½ºÅ³·Î ½Àµæ if(cLockCount < CSkillMgr::MAX_SKILL_LOCKCOUNT - 1) // ¾ÆÁ÷ 0~3 ´Ü°è±îÁö¸¸ »ç¿ëÁß { cLevel = 0; ++cLockCount; } } // »õ·Î¿î ½ºÅ³ ½Àµæ if(bIsNewSkill && (m_DBData.m_Skill.wSlotNum < SKILL::MAX_SLOT_NUM)) { sSlotIndex = m_DBData.m_Skill.wSlotNum; // »õ ½½·Ô ¾ò±â } else if(m_DBData.m_Skill.wSlotNum == SKILL::MAX_SLOT_NUM) { ERRLOG0(g_Log, "ÀÌ¹Ì »ç¿ëÇÒ ¼ö ÀÖ´Â ÃÖ´ë ½½·ÔÀ» »ç¿ëÁßÀÔ´Ï´Ù."); return PktAdminMgr::PktSkillEdit::NOT_ENOUGH_SKILLSLOT; } SKILLSLOT TempSkillSlot; TempSkillSlot.SKILLINFO.wSkill = wSkillID; TempSkillSlot.SKILLINFO.cSkillLevel = cLevel; TempSkillSlot.SKILLINFO.cLockCount = cLockCount; unsigned short cResult = ReadSkill(TempSkillSlot, wSkillID, cLockCount); if(PktBase::NO_SERVER_ERR == cResult) // »ç¿ë °¡´ÉÇÑ ½ºÅ³ÀÓ { SKILL& Skill = m_DBData.m_Skill; SKILLSLOT& SkillSlot = Skill.SSlot[sSlotIndex]; ChkEmptySlot(Skill); // ºó ½½·ÔÀ» °¡Áö°í ÀÖ´ÂÁö üũ unsigned short BeforePoint = (SkillSlot.SKILLINFO.cLockCount * CSkillMgr::MAX_SKILL_LOCKCOUNT) + SkillSlot.SKILLINFO.cSkillLevel; unsigned short AfterPoint = (cLockCount * CSkillMgr::MAX_SKILL_LOCKCOUNT) + cLevel; // ±âÁ¸ ½ºÅ³ ·¹º§ º¯°æ if((!bIsNewSkill) && (GetMaxSkillPoint() >= ((GetSkillPoint() - BeforePoint) + AfterPoint))) { SkillSlot.SKILLINFO.wSkill = wSkillID; SkillSlot.SKILLINFO.cSkillLevel = cLevel; SkillSlot.SKILLINFO.cLockCount = cLockCount; } // »õ·Î¿î ½ºÅ³ Ãß°¡ else if(bIsNewSkill && (GetMaxSkillPoint() >= (GetSkillPoint() + AfterPoint))) { SkillSlot.SKILLINFO.wSkill = wSkillID; SkillSlot.SKILLINFO.cSkillLevel = cLevel; SkillSlot.SKILLINFO.cLockCount = cLockCount; ++m_DBData.m_Skill.wSlotNum; // »ç¿ëÁßÀÎ ½½·Ô¼ö + 1 } UpdateQuickSlotSkill(SkillSlot); m_DBData.m_Skill.wSkillNum = m_DBData.m_Skill.GetSkillNum(); } else { switch(cResult) { case PktSk::FAIL_NOT_CURRENT_CLASS: return PktAdminMgr::PktSkillEdit::NOT_CURRENT_CLASS; case PktSk::FAIL_NOT_ENOUGH_STATUS: return PktAdminMgr::PktSkillEdit::NOT_ENOUGH_STAT; case PktSk::FAIL_MAX_LEVEL: return PktAdminMgr::PktSkillEdit::OVERED_MAX_SKILL_LEVEL; case PktSk::FAIL_NOT_CURRENT_LOCK_COUNT: return PktAdminMgr::PktSkillEdit::FAILED; default: return PktAdminMgr::PktSkillEdit::FAILED; } } return PktAdminMgr::PktSkillEdit::SUCCESS; } // ½ºÅ³ »èÁ¦ (½ºÅ³ Æ÷ÀÎÆ® Á¶Á¤ ¹× ÇØ´ç ½ºÅ³ ½½·Ô Á¤º¸ ÃʱâÈ­) unsigned char CModifyCharacter::DeleteSkill(unsigned short wSkillID, char cLevel, char cLockCount) { m_DBData.m_Skill.wSkillNum = m_DBData.m_Skill.GetSkillNum(); // ÇöÀç ½ºÅ³¼ö Àç °è»ê short sDelSlotIndex = GetSkillSlotIndex(wSkillID); if(-1 != sDelSlotIndex) { SKILL& Skill = m_DBData.m_Skill; SKILLSLOT& DelSlot = Skill.SSlot[sDelSlotIndex]; ChkEmptySlot(Skill); // ºó ½½·ÔÀ» °¡Áö°í ÀÖ´ÂÁö üũ const Skill::ProtoType* lpSkillProtoType = CSkillMgr::GetInstance().GetSkillProtoType(wSkillID); if(NULL == lpSkillProtoType) { ERRLOG1(g_Log, "½ºÅ³ ÇÁ·ÎÅä ŸÀÔ ¾ò±â ½ÇÆÐ. ½ºÅ³ID: 0x%04x", wSkillID); return PktAdminMgr::PktSkillEdit::FAILED_TO_GET_SKILLPROTOTYPE; } if(DelSlot.SKILLINFO.wSkill != wSkillID) { ERRLOG3(g_Log, "»èÁ¦ ¿äû ¹ÞÀº ½ºÅ³°ú »èÁ¦ ÇÒ ½½·ÔÀÇ ½ºÅ³ÀÌ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù." "½½·Ô¹øÈ£: %d , »èÁ¦ÇÒ ½½·ÔÀÇ ½ºÅ³ID: 0x%04x, »èÁ¦ ¿äû ÇÑ ½ºÅ³ID: 0x%04x", sDelSlotIndex, DelSlot.SKILLINFO.wSkill, wSkillID); return PktAdminMgr::PktSkillEdit::FAILED; } if(true == lpSkillProtoType->m_bIsClassSkill) { ERRLOG0(g_Log, "»èÁ¦ÇÏ·Á´Â ½ºÅ³ÀÌ Å¬·¡½º ½ºÅ³ÀÔ´Ï´Ù."); return PktAdminMgr::PktSkillEdit::FAILED; } // ½ºÅ³ ½½·Ô Áß°£ÀÌ ºñ¸é ÇÑÄ­¾¿ ¾ÕÀ¸·Î ´ç°Ü¿È (Áß°£¿¡ ºñ´Â ½½·ÔÀÌ ¾øµµ·Ï!) unsigned short sLastSlotIndex = Skill.wSlotNum - 1; for(unsigned short sSlotIndex = sDelSlotIndex; sSlotIndex < sLastSlotIndex; ++sSlotIndex) { Skill.SSlot[sSlotIndex] = Skill.SSlot[sSlotIndex + 1]; } Skill.SSlot[sLastSlotIndex].SKILLINFO.wSkill = 0; Skill.SSlot[sLastSlotIndex].SKILLINFO.cSkillLevel = 0; Skill.SSlot[sLastSlotIndex].SKILLINFO.cLockCount = 0; Skill.wSkillNum -= (DelSlot.SKILLINFO.cLockCount * CSkillMgr::MAX_SKILL_LEVEL) + DelSlot.SKILLINFO.cSkillLevel; Skill.wSlotNum -= 1; UpdateQuickSlotSkill(DelSlot); return PktAdminMgr::PktSkillEdit::SUCCESS; } return PktAdminMgr::PktSkillEdit::FAILED; } bool CModifyCharacter::ChkEmptySlot(SKILL Skill) { CString strEmptySlotIndex; for(unsigned short sSlotIndex = 0; sSlotIndex < Skill.wSlotNum; ++sSlotIndex) { if(0 == Skill.SSlot[sSlotIndex].SKILLINFO.wSkill) { strEmptySlotIndex.AppendFormat("%d ", sSlotIndex); } } if(!strEmptySlotIndex.IsEmpty()) { ERRLOG3(g_Log, "½ºÅ³ ½½·Ô¿¡ ºó½½·ÔÀÌ ÀÖ½À´Ï´Ù. CID: %u, ½½·Ô¼ö: %d, ºó½½·Ô: %s", GetCID(), Skill.wSlotNum, strEmptySlotIndex); return true; } return false; } // °Á ³¯¸² ½ºÅ³·¹º§°¡Á®¿À±â.. // Return : // Á¸ÀçÇÏ´Â ½ºÅ³À̸é ÇöÀç ³»·¹º§.. °°Àº°è¿­ÀÇ ÇÏÀ§½ºÅ³Àϰæ¿ì MaxSkillLevelÀ»... // °°Àº °è¿­½ºÅ³Áß »óÀ§°è¿­À̸é 0À» ¸®ÅÏ.. short CModifyCharacter::GetSkillLevelEX(unsigned short usSkillType, char cLockCount) { const Skill::ProtoType* lpSkillProtoType = CSkillMgr::GetInstance().GetSkillProtoType(usSkillType); if(NULL != lpSkillProtoType) { int nMaxSlotNum = m_DBData.m_Skill.wSlotNum; if(SKILL::MAX_SLOT_NUM >= nMaxSlotNum) { for( int nSlot = 0; nSlot < nMaxSlotNum; ++ nSlot ) { const SKILLSLOT& SkillSlot = m_DBData.m_Skill.SSlot[ nSlot ]; if( SkillSlot.SKILLINFO.wSkill == usSkillType ) { if( SkillSlot.SKILLINFO.cLockCount == cLockCount ) { return SkillSlot.SKILLINFO.cSkillLevel; } else if( SkillSlot.SKILLINFO.cLockCount > cLockCount ) { return SKILL::MAX_SKILL_LEVEL; } else { return 0; } } } } } return -1; } bool CModifyCharacter::SetGold(unsigned long dwGold) { if(dwGold > ULONG_MAX) { return false; } m_DBData.m_Info.Gold = dwGold; return true; } // ij¸¯Å͸¦ Àâ°í ÀÖ´Â °ü¸®ÀÚÀÇ SessionÀ» ¸®ÅÏ~~ CSession* CModifyCharacter::GetCheckSession( unsigned long dwUID ) { if( m_dwUID == dwUID ) { if( NULL != m_lpPacketDispatch ) { CSession& lpSession = m_lpPacketDispatch->GetSession( ); //if( NULL != lpSession ) return lpSession; return &lpSession; } } return NULL; } // ij¸¯ÅÍ Á¤º¸°¡ º¯°æ‰çÀ½À» ±â¾ïÇØ³õÀÚ.. void CModifyCharacter::OnChangedInfo( int iMask ) { m_byChangedInfo |= iMask; } // ij¸¯ÅÍ º¯°æÁ¤º¸¸¦ Áö¿î´Ù.. void CModifyCharacter::OffChangedInfo( int iMask ) { m_byChangedInfo &= iMask; } // ij¸¯ÅÍÀÇ Status void CModifyCharacter::GetModifyCharStatus(PktAdminMgr::CHAR_STATUS_ST& StatusST) { StatusST.m_cFace = m_DBData.m_Info.Face; StatusST.m_cHair = m_DBData.m_Info.Hair; StatusST.m_cLevel = m_DBData.m_Info.Level; StatusST.m_cRace = m_DBData.m_Info.Race; StatusST.m_cSex = m_DBData.m_Info.Sex; StatusST.m_dwExp = m_DBData.m_Info.Exp; StatusST.m_dwFame = m_DBData.m_Info.Fame; StatusST.m_dwMileage = m_DBData.m_Info.Mileage; StatusST.m_nClass = m_DBData.m_Info.Class; StatusST.m_nCON = m_DBData.m_Info.CON; StatusST.m_nDEX = m_DBData.m_Info.DEX; StatusST.m_nINT = m_DBData.m_Info.INT; StatusST.m_nIP = m_DBData.m_Info.IP; StatusST.m_nSTR = m_DBData.m_Info.STR; StatusST.m_nWIS = m_DBData.m_Info.WIS; StatusST.m_cChance = m_DBData.m_Info.Chance; } // ij¸¯ÅÍ Statusº¯°æ.. bool CModifyCharacter::UpdataStatus(PktAdminMgr::CHAR_STATUS_ST& StatusST) { CHAR_INFOST OrgCharInfo; CopyMemory(&OrgCharInfo, &m_DBData.m_Info, sizeof(CHAR_INFOST)); m_DBData.m_Info.Sex = StatusST.m_cSex; m_DBData.m_Info.Hair = StatusST.m_cHair; m_DBData.m_Info.Face = StatusST.m_cFace; m_DBData.m_Info.Race = StatusST.m_cRace; m_DBData.m_Info.Class = StatusST.m_nClass; m_DBData.m_Info.Fame = StatusST.m_dwFame; m_DBData.m_Info.Mileage = StatusST.m_dwMileage; m_DBData.m_Info.Level = StatusST.m_cLevel; m_DBData.m_Info.Exp = StatusST.m_dwExp; m_DBData.m_Info.IP = StatusST.m_nIP; m_DBData.m_Info.STR = StatusST.m_nSTR; m_DBData.m_Info.CON = StatusST.m_nCON; m_DBData.m_Info.DEX = StatusST.m_nDEX; m_DBData.m_Info.INT = StatusST.m_nINT; m_DBData.m_Info.WIS = StatusST.m_nWIS; m_DBData.m_Info.Chance = StatusST.m_cChance; m_CreatureStatus.m_nExp = StatusST.m_dwExp; m_CreatureStatus.m_nLevel = StatusST.m_cLevel; // Status °è»ê½ÄÀ» ³ÖÀÚ if(!CalculateStatusData(false)) { // À߸øµÈ Status°ª CopyMemory(&m_DBData.m_Info, &OrgCharInfo, sizeof(CHAR_INFOST)); return false; } return true; } // ij¸¯ÅͰ¡ ¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀ» UID·Î °Ë»öÇÏ¿© ¸®ÅÏÇÑ´Ù.. // ÇØ´ç ¾ÆÀÌÅÛÀÌ ¾øÀ¸¸é NULL Item::CItem* CModifyCharacter::UIDbyItem(unsigned __int64 ItemUID, unsigned char cTakeType) { Item::CItemContainer::iterator Itr; if(cTakeType == TakeType::TS_INVEN) // Àκ¥Å丮 ¾ÆÀÌÅÛ { Item::CArrayContainer& ArrayContainer = GetInventory(); Itr = ArrayContainer.begin(); for(;Itr != ArrayContainer.end(); ++Itr) { if(NULL != (*Itr)) { if((*Itr)->GetUID() == ItemUID) return (*Itr); } } } else if( cTakeType == TakeType::TS_EQUIP ) // Àåºñâ ¾ÆÀÌÅÛ { Item::CEquipmentsContainer& EquipContainer = GetEquipments( ); Itr = EquipContainer.begin( ); for(;Itr != EquipContainer.end(); ++Itr ) { if(NULL != (*Itr)) { if((*Itr)->GetUID() == ItemUID) return (*Itr); } } } else if(cTakeType == TakeType::TS_DEPOSIT) // â°í ¾ÆÀÌÅÛ { Item::CDepositContainer& DepositContainer = GetDeposit(); for (unsigned char cTab = 0; cTab < DepositContainer.GetMaxTabNum(); ++cTab) { Item::CItemContainer* DepositTabContainer = DepositContainer.GetTab(cTab); Itr = DepositTabContainer->begin(); for(; Itr != DepositTabContainer->end( ); ++Itr ) { if( NULL != ( *Itr ) ) { if( ( *Itr )->GetUID( ) == ItemUID ) return ( *Itr ); } } } } return NULL; } void CModifyCharacter::ChangeName(char* szName) { strncpy(m_DBData.m_Info.Name, szName, CHAR_INFOST::MAX_NAME_LEN); } // ij¸¯Å͸¦ ÆíÁýÁßÀÎ °ü¸®ÀÚ °èÁ¤À» ÀúÀåÇÑ´Ù. void CModifyCharacter::SetModifyAdmin(char* Account, int Length) { strncpy(m_szModifyAdmin, Account, Length); } void CModifyCharacter::ParseQuestData() { Quest::ExecutingQuest* aryExecutingQuest = GetExecutingQuest(); unsigned short* aryHistoryQuest = GetHistoryQuest(); // ¼öÇàÁßÀÎ Äù½ºÆ® ¸ñ·Ï int nIndex = 0; PktQuestDB::ExecutingQuest* lpExecuteQuestPos = reinterpret_cast(m_ExtraData.m_Quest.Data); PktQuestDB::ExecutingQuest* lpExecuteQuestEnd = reinterpret_cast(m_ExtraData.m_Quest.Data) + (m_ExtraData.m_Quest.dwSize / sizeof(PktQuestDB::ExecutingQuest)); for(; lpExecuteQuestPos != lpExecuteQuestEnd; ++lpExecuteQuestPos) { Quest::QuestNode* lpQuest = CQuestMgr::GetInstance().GetQuestNode(lpExecuteQuestPos->m_wQuestID); if (0 != lpQuest && false == lpQuest->CheckNationDependent(GetUserNation())) { aryExecutingQuest[nIndex] = Quest::ExecutingQuest(lpExecuteQuestPos->m_wQuestID, lpExecuteQuestPos->m_cPhase, lpExecuteQuestPos->m_cTriggerCount); ++nIndex; } } nIndex = 0; // ¿Ï·á Äù½ºÆ® ¸ñ·Ï unsigned short* lpHistoryQuestPos = reinterpret_cast(m_ExtraData.m_History.Data); unsigned short* lpHistoryQuestEnd = reinterpret_cast(m_ExtraData.m_History.Data) + (m_ExtraData.m_History.dwSize / sizeof(unsigned short)); for (; lpHistoryQuestPos != lpHistoryQuestEnd; ++lpHistoryQuestPos) { Quest::QuestNode* lpQuest = CQuestMgr::GetInstance().GetQuestNode(*lpHistoryQuestPos); if (0 != lpQuest && false == lpQuest->CheckNationDependent(GetUserNation())) { aryHistoryQuest[nIndex] = *lpHistoryQuestPos; ++nIndex; } } // Äù½ºÆ®¿¡ ÀÇÇØ ¹Þ´Â ¿µÇâÀ» °è»ê CalculateStatusData(false); } void CModifyCharacter::SetQuestData() { const int MAX_BUFFER = sizeof(PktQuestDB) + PktQuestDB::MAX_EXECUTING_QUEST * sizeof(PktQuestDB::ExecutingQuest) + PktQuestDB::MAX_HISTORY_QUEST * sizeof(unsigned short); char szBuffer[MAX_BUFFER]; PktQuestDB* lpPktQuestDB = reinterpret_cast(szBuffer); lpPktQuestDB->m_dwUID = GetUID(); lpPktQuestDB->m_dwCID = GetCID(); lpPktQuestDB->m_wExecuteQuestSize = 0; lpPktQuestDB->m_wHistoryQuestSize = 0; Quest::ExecutingQuest* ExecutingQuest = GetExecutingQuest(); unsigned short *wHistoryQuest = GetHistoryQuest(); int nIndex = 0; for (nIndex = 0; nIndex < PktQuestDB::MAX_EXECUTING_QUEST; ++nIndex) { if (NULL == ExecutingQuest[nIndex].m_QuestNode) { break; } PktQuestDB::ExecutingQuest* ExecuteQuest = reinterpret_cast (szBuffer + sizeof(PktQuestDB) + lpPktQuestDB->m_wExecuteQuestSize); ExecuteQuest->m_wQuestID = ExecutingQuest[nIndex].m_QuestNode->m_wQuestID; ExecuteQuest->m_cPhase = ExecutingQuest[nIndex].m_cPhase; memcpy(ExecuteQuest->m_cTriggerCount, ExecutingQuest[nIndex].m_cTriggerCount, sizeof(unsigned char) * PktQuestDB::MAX_TRIGGER); lpPktQuestDB->m_wExecuteQuestSize += sizeof(PktQuestDB::ExecutingQuest);; } for (nIndex = 0; nIndex < PktQuestDB::MAX_HISTORY_QUEST; nIndex++) { if (0 == wHistoryQuest[nIndex]) { break; } unsigned short* wHistoryQuestForPkt = reinterpret_cast(szBuffer + sizeof(PktQuestDB) + lpPktQuestDB->m_wExecuteQuestSize + lpPktQuestDB->m_wHistoryQuestSize); *wHistoryQuestForPkt = wHistoryQuest[nIndex]; lpPktQuestDB->m_wHistoryQuestSize += sizeof(unsigned short); } memset(&m_ExtraData.m_Quest, 0, sizeof(QUEST)); m_ExtraData.m_Quest.dwSize = lpPktQuestDB->m_wExecuteQuestSize; memcpy(m_ExtraData.m_Quest.Data, lpPktQuestDB + 1, lpPktQuestDB->m_wExecuteQuestSize); memset(&m_ExtraData.m_History, 0, sizeof(HISTORY)); m_ExtraData.m_History.dwSize = lpPktQuestDB->m_wHistoryQuestSize; memcpy(m_ExtraData.m_History.Data, reinterpret_cast(lpPktQuestDB + 1) + lpPktQuestDB->m_wExecuteQuestSize, lpPktQuestDB->m_wHistoryQuestSize); } void CModifyCharacter::RevisionQuestNation() { using namespace Creature; // ¾ç±¹Ã¼Á¦¿¡¼± ¹«Á¶°Ç ÈÞ¸ÕÀº Ä«¸£Å×¶õÆ®, ¾ÆÄ­Àº ¸Þ¸£Ä«µð¾Æ! (Äù½ºÆ® ÆÄ½ÌÇÒ¶§ ÇÊ¿ä) switch(GetRace()) { case CClass::RaceType::HUMAN: m_cQuestNation = Creature::KARTERANT; break; case CClass::RaceType::AKHAN: m_cQuestNation = Creature::MERKADIA; break; default: m_cQuestNation = Creature::MAX_NATION; break; } } // class CModifyItem Down_Cast ---------------------------------------------------------------------------------------------------------------------------------- void CModifyItem::SetUID(unsigned __int64 UID) { m_ItemData.m_dwUID = UID; } void CModifyItem::SetPrototoypID(unsigned short PrototypeID) { m_ItemData.m_usProtoTypeID = PrototypeID; }