|
| 1 | +// Client.cpp: implementation of the CClient class. |
| 2 | +// |
| 3 | +////////////////////////////////////////////////////////////////////// |
| 4 | + |
| 5 | +#include "Client.h" |
| 6 | + |
| 7 | +////////////////////////////////////////////////////////////////////// |
| 8 | +// Construction/Destruction |
| 9 | +////////////////////////////////////////////////////////////////////// |
| 10 | + |
| 11 | +CClient::CClient(HWND hWnd) |
| 12 | +{ |
| 13 | + register int i; |
| 14 | + |
| 15 | + m_pXSock = NULL; |
| 16 | + m_pXSock = new class XSocket(hWnd, DEF_CLIENTSOCKETBLOCKLIMIT); |
| 17 | + m_pXSock->bInitBufferSize(DEF_MSGBUFFERSIZE); |
| 18 | + |
| 19 | + ZeroMemory(m_cProfile, sizeof(m_cProfile)); |
| 20 | + strcpy(m_cProfile, "__________"); |
| 21 | + |
| 22 | + ZeroMemory(m_cCharName, sizeof(m_cCharName)); |
| 23 | + ZeroMemory(m_cAccountName, sizeof(m_cAccountName)); |
| 24 | + ZeroMemory(m_cAccountPassword, sizeof(m_cAccountPassword)); |
| 25 | + |
| 26 | + ZeroMemory(m_cGuildName, sizeof(m_cGuildName)); |
| 27 | + ZeroMemory(m_cLocation, sizeof(m_cLocation)); |
| 28 | + strcpy(m_cLocation, "NONE"); |
| 29 | + m_iGuildRank = -1; |
| 30 | + m_iGuildGUID = -1; |
| 31 | + |
| 32 | + m_bIsInitComplete = FALSE; |
| 33 | + |
| 34 | + m_cLU_Str = m_cLU_Int = m_cLU_Vit = m_cLU_Dex = m_cLU_Mag = m_cLU_Char = 0; |
| 35 | + |
| 36 | + // v1.432 사용하지 않는다. |
| 37 | + //m_iHitRatio_ItemEffect_SM = 0; |
| 38 | + //m_iHitRatio_ItemEffect_L = 0; |
| 39 | + |
| 40 | + m_iEnemyKillCount = 0; |
| 41 | + m_iPKCount = 0; |
| 42 | + m_iRewardGold = 0; |
| 43 | + m_iCurWeightLoad = 0; |
| 44 | + |
| 45 | + m_bIsSafeAttackMode = FALSE; |
| 46 | + |
| 47 | + // 아이템 장착 상태 초기화한 후 설정한다. |
| 48 | + for (i = 0; i < DEF_MAXITEMEQUIPPOS; i++) |
| 49 | + m_sItemEquipmentStatus[i] = -1; |
| 50 | + |
| 51 | + // 아이템 리스트 초기화 |
| 52 | + for (i = 0; i < DEF_MAXITEMS; i++) { |
| 53 | + m_pItemList[i] = NULL; |
| 54 | + m_ItemPosList[i].x = 40; |
| 55 | + m_ItemPosList[i].y = 30; |
| 56 | + m_bIsItemEquipped[i] = FALSE; |
| 57 | + } |
| 58 | + m_cArrowIndex = -1; // 화살 아이템 인덱스는 할당되지 않은 상태 |
| 59 | + |
| 60 | + // 맡겨논 아이템 리스트 초기화. |
| 61 | + for (i = 0; i < DEF_MAXBANKITEMS; i++) { |
| 62 | + m_pItemInBankList[i] = NULL; |
| 63 | + } |
| 64 | + |
| 65 | + // Magic - Skill 숙련도 리스트 초기화 |
| 66 | + for (i = 0; i < DEF_MAXMAGICTYPE; i++) |
| 67 | + m_cMagicMastery[i] = NULL; |
| 68 | + |
| 69 | + for (i = 0; i < DEF_MAXSKILLTYPE; i++) |
| 70 | + m_cSkillMastery[i] = NULL; |
| 71 | + |
| 72 | + for (i = 0; i < DEF_MAXSKILLTYPE; i++) { |
| 73 | + m_bSkillUsingStatus[i] = FALSE; |
| 74 | + m_iSkillUsingTimeID[i] = NULL; |
| 75 | + } |
| 76 | + |
| 77 | + // testcode |
| 78 | + m_cMapIndex = -1; |
| 79 | + m_sX = -1; |
| 80 | + m_sY = -1; |
| 81 | + m_cDir = 5; |
| 82 | + m_sType = 0; |
| 83 | + m_sOriginalType = 0; |
| 84 | + m_sAppr1 = 0; |
| 85 | + m_sAppr2 = 0; |
| 86 | + m_sAppr3 = 0; |
| 87 | + m_sAppr4 = 0; |
| 88 | + m_iApprColor = 0; // v1.4 |
| 89 | + m_sStatus = 0; |
| 90 | + |
| 91 | + m_cSex = 0; |
| 92 | + m_cSkin = 0; |
| 93 | + m_cHairStyle = 0; |
| 94 | + m_cHairColor = 0; |
| 95 | + m_cUnderwear = 0; |
| 96 | + |
| 97 | + m_cAttackDiceThrow_SM = 0; // 공격치 주사위 던지는 회수 @@@@@@@@@@@@@ |
| 98 | + m_cAttackDiceRange_SM = 0; |
| 99 | + m_cAttackDiceThrow_L = 0; // 공격치 주사위 던지는 회수 @@@@@@@@@@@@@ |
| 100 | + m_cAttackDiceRange_L = 0; |
| 101 | + m_cAttackBonus_SM = 0; |
| 102 | + m_cAttackBonus_L = 0; |
| 103 | + |
| 104 | + // 플레이어의 소속 마을에 따라서 사이드가 결정되며 이것을 보고 NPC가 공격여부를 결정할 것이다. |
| 105 | + m_cSide = 0; |
| 106 | + |
| 107 | + m_iHitRatio = 0; |
| 108 | + m_iDefenseRatio = 0; |
| 109 | + |
| 110 | + for (i = 0; i < DEF_MAXITEMEQUIPPOS; i++) m_iDamageAbsorption_Armor[i] = 0; |
| 111 | + m_iDamageAbsorption_Shield = 0; |
| 112 | + |
| 113 | + m_iHPstock = 0; |
| 114 | + m_bIsKilled = FALSE; |
| 115 | + |
| 116 | + for (i = 0; i < DEF_MAXMAGICEFFECTS; i++) |
| 117 | + m_cMagicEffectStatus[i] = 0; |
| 118 | + |
| 119 | + m_iWhisperPlayerIndex = -1; |
| 120 | + |
| 121 | + m_iHungerStatus = 100; // 최대값은 100 |
| 122 | + |
| 123 | + m_bIsWarLocation = FALSE; |
| 124 | + |
| 125 | + m_bIsPoisoned = FALSE; |
| 126 | + m_iPoisonLevel = NULL; |
| 127 | + |
| 128 | + m_iAdminUserLevel = 0; |
| 129 | + m_iRating = 0; |
| 130 | + m_iTimeLeft_ShutUp = 0; |
| 131 | + m_iTimeLeft_Rating = 0; |
| 132 | + m_iTimeLeft_ForceRecall = 0; |
| 133 | + m_iTimeLeft_FirmStaminar = 0; |
| 134 | + |
| 135 | + m_bIsOnServerChange = FALSE; |
| 136 | + |
| 137 | + m_iExpStock = 0; |
| 138 | + |
| 139 | + m_iAllocatedFish = NULL; |
| 140 | + m_iFishChance = 0; |
| 141 | + |
| 142 | + ZeroMemory(m_cIPaddress, sizeof(m_cIPaddress)); |
| 143 | + m_bIsOnWaitingProcess = FALSE; |
| 144 | + |
| 145 | + m_iSuperAttackLeft = 0; |
| 146 | + m_iSuperAttackCount = 0; |
| 147 | + |
| 148 | + m_sUsingWeaponSkill = 5; // 기본적으로 맨손격투 |
| 149 | + |
| 150 | + m_iManaSaveRatio = 0; |
| 151 | + m_iAddResistMagic = 0; |
| 152 | + m_iAddPhysicalDamage = 0; |
| 153 | + m_iAddMagicalDamage = 0; |
| 154 | + m_bIsLuckyEffect = FALSE; |
| 155 | + m_iSideEffect_MaxHPdown = 0; |
| 156 | + |
| 157 | + m_iAddAbsAir = 0; // 속성별 대미지 흡수 |
| 158 | + m_iAddAbsEarth = 0; |
| 159 | + m_iAddAbsFire = 0; |
| 160 | + m_iAddAbsWater = 0; |
| 161 | + |
| 162 | + m_iComboAttackCount = 0; |
| 163 | + m_iDownSkillIndex = -1; |
| 164 | + |
| 165 | + m_iMagicDamageSaveItemIndex = -1; |
| 166 | + |
| 167 | + m_sCharIDnum1 = m_sCharIDnum2 = m_sCharIDnum3 = 0; |
| 168 | + |
| 169 | + m_iPartyRank = -1; // v1.42 |
| 170 | + m_iPartyMemberCount = 0; |
| 171 | + m_iPartyGUID = 0; |
| 172 | + |
| 173 | + for (i = 0; i < DEF_MAXPARTYMEMBERS; i++) { |
| 174 | + m_stPartyMemberName[i].iIndex = 0; |
| 175 | + ZeroMemory(m_stPartyMemberName[i].cName, sizeof(m_stPartyMemberName[i].cName)); |
| 176 | + } |
| 177 | + |
| 178 | + m_iAbuseCount = 0; |
| 179 | + m_bIsBWMonitor = FALSE; |
| 180 | + m_bIsExchangeMode = FALSE; |
| 181 | + |
| 182 | + // v1.4311-3 추가 변수 초기화 사투장 예약 관련 변수 |
| 183 | + m_iFightZoneTicketNumber = m_iFightzoneNumber = m_iReserveTime = 0 ; |
| 184 | + |
| 185 | + m_iPenaltyBlockYear = m_iPenaltyBlockMonth = m_iPenaltyBlockDay = 0; // v1.4 |
| 186 | + |
| 187 | + m_iExchangeH = NULL; // 교환할 대상의 인덱스 |
| 188 | + ZeroMemory(m_cExchangeName, sizeof(m_cExchangeName)); // 교환할 대상의 이름 |
| 189 | + ZeroMemory(m_cExchangeItemName, sizeof(m_cExchangeItemName)); // 교환할 아이템 이름 |
| 190 | + |
| 191 | + m_cExchangeItemIndex = -1; // 교환할 아이템 인덱스 |
| 192 | + m_iExchangeItemAmount = 0; // 교환할 아이템 갯수 |
| 193 | + |
| 194 | + m_bIsExchangeConfirm = FALSE; |
| 195 | + |
| 196 | + m_iQuest = NULL; // 현재 할당된 Quest |
| 197 | + m_iQuestID = NULL; // QuestID |
| 198 | + m_iAskedQuest = NULL; // 물어본 퀘스트 |
| 199 | + m_iCurQuestCount = NULL; // 현재 퀘스트 상태 |
| 200 | + |
| 201 | + m_iQuestRewardType = NULL; // 퀘스트 해결시 상품 종류 -> 아이템의 ID값이다. |
| 202 | + m_iQuestRewardAmount = NULL; // 상품 갯수 |
| 203 | + |
| 204 | + m_iContribution = NULL; // 공헌도 |
| 205 | + m_bQuestMatchFlag_Loc = FALSE; // 퀘스트 장소 확인용 플래그. |
| 206 | + m_bIsQuestCompleted = FALSE; |
| 207 | + |
| 208 | + m_bIsNeutral = FALSE; |
| 209 | + m_bIsObserverMode = FALSE; |
| 210 | + |
| 211 | + // 2000.8.1 이벤트 상품 수여 확인용 |
| 212 | + m_iSpecialEventID = 200081; |
| 213 | + |
| 214 | + m_iSpecialWeaponEffectType = 0; // 희귀 아이템 효과 종류: 0-None 1-필살기대미지추가 2-중독효과 3-정의의 4-저주의 |
| 215 | + m_iSpecialWeaponEffectValue = 0; // 희귀 아이템 효과 값 |
| 216 | + |
| 217 | + m_iAddHP = m_iAddSP = m_iAddMP = 0; |
| 218 | + m_iAddAR = m_iAddPR = m_iAddDR = 0; |
| 219 | + m_iAddAbsPD = m_iAddAbsMD = 0; |
| 220 | + m_iAddCD = m_iAddExp = m_iAddGold = 0; |
| 221 | + |
| 222 | + m_iSpecialAbilityTime = DEF_SPECABLTYTIMESEC; // DEF_SPECABLTYTIMESEC 초마다 한번씩 특수 능력을 쓸 수 있다. |
| 223 | + m_iSpecialAbilityType = NULL; |
| 224 | + m_bIsSpecialAbilityEnabled = FALSE; |
| 225 | + m_iSpecialAbilityLastSec = 0; |
| 226 | + |
| 227 | + m_iSpecialAbilityEquipPos = 0; |
| 228 | + |
| 229 | + m_iMoveMsgRecvCount = 0; |
| 230 | + m_iAttackMsgRecvCount = 0; |
| 231 | + m_iRunMsgRecvCount = 0; |
| 232 | + m_iSkillMsgRecvCount = 0; |
| 233 | + |
| 234 | + m_bIsAdminCreateItemEnabled = FALSE; |
| 235 | + m_iAlterItemDropIndex = -1; |
| 236 | + |
| 237 | + m_iAutoExpAmount = 0; |
| 238 | + m_iWarContribution = 0; |
| 239 | + |
| 240 | + m_dwMoveLAT = m_dwRunLAT = m_dwAttackLAT = 0; |
| 241 | + |
| 242 | + m_dwInitCCTimeRcv = 0; |
| 243 | + m_dwInitCCTime = 0; |
| 244 | + |
| 245 | + ZeroMemory(m_cLockedMapName, sizeof(m_cLockedMapName)); |
| 246 | + strcpy(m_cLockedMapName, "NONE"); |
| 247 | + m_iLockedMapTime = NULL; |
| 248 | + |
| 249 | + m_iCrusadeDuty = NULL; |
| 250 | + m_dwCrusadeGUID = NULL; |
| 251 | + |
| 252 | + for (i = 0; i < DEF_MAXCRUSADESTRUCTURES; i++) { |
| 253 | + m_stCrusadeStructureInfo[i].cType = NULL; |
| 254 | + m_stCrusadeStructureInfo[i].cSide = NULL; |
| 255 | + m_stCrusadeStructureInfo[i].sX = NULL; |
| 256 | + m_stCrusadeStructureInfo[i].sY = NULL; |
| 257 | + } |
| 258 | + m_iCSIsendPoint = NULL; |
| 259 | + |
| 260 | + m_bIsSendingMapStatus = FALSE; |
| 261 | + ZeroMemory(m_cSendingMapName, sizeof(m_cSendingMapName)); |
| 262 | + |
| 263 | + m_iConstructionPoint = NULL; |
| 264 | + |
| 265 | + ZeroMemory(m_cConstructMapName, sizeof(m_cConstructMapName)); |
| 266 | + m_iConstructLocX = m_iConstructLocY = -1; |
| 267 | +} |
| 268 | + |
| 269 | +CClient::~CClient() |
| 270 | +{ |
| 271 | + int i; |
| 272 | + |
| 273 | + if (m_pXSock != NULL) delete m_pXSock; |
| 274 | + for (i = 0; i < DEF_MAXITEMS; i++) |
| 275 | + if (m_pItemList[i] != NULL) { |
| 276 | + delete m_pItemList[i]; |
| 277 | + m_pItemList[i] = NULL; |
| 278 | + } |
| 279 | +} |
| 280 | + |
| 281 | + |
| 282 | +BOOL CClient::bCreateNewParty() |
| 283 | +{ |
| 284 | + int i; |
| 285 | + |
| 286 | + if (m_iPartyRank != -1) return FALSE; |
| 287 | + |
| 288 | + m_iPartyRank = 0; |
| 289 | + m_iPartyMemberCount = 0; |
| 290 | + m_iPartyGUID = (rand() % 999999) + timeGetTime(); |
| 291 | + |
| 292 | + for (i = 0; i < DEF_MAXPARTYMEMBERS; i++) { |
| 293 | + m_stPartyMemberName[i].iIndex = 0; |
| 294 | + ZeroMemory(m_stPartyMemberName[i].cName, sizeof(m_stPartyMemberName[i].cName)); |
| 295 | + } |
| 296 | + |
| 297 | + return TRUE; |
| 298 | +} |
0 commit comments