#include "stdafx.h" #include "DummyCharacters.h" #include #include #include #include #include #include struct DummyData { unsigned long m_dwDressChangeFreq; unsigned long m_dwAttackFreq; unsigned long m_dwSkillFreq; DummyData() : m_dwDressChangeFreq(0), m_dwAttackFreq(0), m_dwSkillFreq(0) { } }; class CModifyDummyCharacter : public CCharacter { public: CModifyDummyCharacter(unsigned long dwCID) : CCharacter(dwCID, 0) { } virtual ~CModifyDummyCharacter() { }; void ModifyCharacterData(CharacterDBData& DBData, DummyData& dummyData) { m_bLogout = false; m_DBData = DBData; m_DummyData = dummyData; } void ModifyEquipmentData(CDummyCharacterList::EquipmentData& EquipmentData); void SetLogout() { m_bLogout = true; } private: DummyData m_DummyData; }; void CModifyDummyCharacter::ModifyEquipmentData(CDummyCharacterList::EquipmentData& equipmentData) { Item::CEquipmentsContainer& Equipments = GetEquipments(); Equipments.ClearItems(); for(int nCount = 0; nCount < Item::EquipmentPos::MAX_EQUPMENT_POS; ++nCount) { if(0 != equipmentData.m_usEquipments[nCount]) { // UID¾ø´Â Àӽà ¾ÆÀÌÅÛÀ» »ý¼ºÇÑ´Ù. Item::CItem* lpItem = Item::CItemFactory::GetInstance().CreateTempItem( equipmentData.m_usEquipments[nCount]); if(0 != lpItem) { // ¾ÆÀÌÅÛÀ» ½ºÅÈ¿¡ °ü°è¾øÀÌ °­Á¦·Î »ðÀÔÇÑ´Ù. Equipments.CListContainer::SetItem( Item::ItemPos(TakeType::TS_EQUIP, nCount), lpItem); } } }; } CDummyCharacterList& CDummyCharacterList::GetInstance() { static CDummyCharacterList dummyCharacterList; return dummyCharacterList; } CDummyCharacterList::CDummyCharacterList() { } CDummyCharacterList::~CDummyCharacterList() { Destroy(); } bool CDummyCharacterList::Initialize(unsigned long dwLoadCharNum) { EquipmentVector emptyVector; std::pair insertResult; #define INSERT_CLASS_SET(fileName, Class) \ insertResult = m_EquipmentClassSet.insert(std::make_pair(Class, emptyVector)); \ if(insertResult.second) \ { if(!LoadEquipments(fileName, insertResult.first->second)) { return false; } } INSERT_CLASS_SET("./Dummies/CONµðÆæ´õ.txt", CClass::Defender); INSERT_CLASS_SET("./Dummies/½ºÅÄ´Ùµå¿ö¸®¾î.txt", CClass::Warrior); INSERT_CLASS_SET("./Dummies/½ºÅÄ´Ùµå¾î½Ø½Å.txt", CClass::Assassin); INSERT_CLASS_SET("./Dummies/½ºÅÄ´Ùµå¾ÆÃ³.txt", CClass::Archer); INSERT_CLASS_SET("./Dummies/½ºÅÄ´Ùµå¼Ò¼­·¯.txt", CClass::Sorcerer); INSERT_CLASS_SET("./Dummies/½ºÅÄ´ÙµåÀÎæÅÍ.txt", CClass::Enchanter); INSERT_CLASS_SET("./Dummies/½ºÅÄ´ÙµåÇÁ¸®½ºÆ®.txt", CClass::Priest); INSERT_CLASS_SET("./Dummies/½ºÅÄ´ÙµåŬ·¹¸¯.txt", CClass::Cleric); INSERT_CLASS_SET("./Dummies/½ºÅÄ´ÙµåÅÛÇ÷¯.txt", CClass::Templar); INSERT_CLASS_SET("./Dummies/½ºÅÄ´Ùµå¾îÅÂÄ¿.txt", CClass::Attacker); INSERT_CLASS_SET("./Dummies/½ºÅÄ´Ùµå°Å³Ê.txt", CClass::Gunner); INSERT_CLASS_SET("./Dummies/½ºÅÄ´Ùµå·é¿ÀÇÁ.txt", CClass::RuneOff); INSERT_CLASS_SET("./Dummies/½ºÅÄ´Ùµå¶óÀÌÇÁ¿ÀÇÁ.txt", CClass::LifeOff); INSERT_CLASS_SET("./Dummies/½ºÅĴٵ彦µµ¿ì¿ÀÇÁ.txt", CClass::ShadowOff); // ´õ¹Ì ij¸¯Å͵éÀ» ·ÎµåÇØ¼­ ¼¼ÆÃÇÑ´Ù. return LoadDummyChars("./Dummies/ij¸¯Å͵¥ÀÌÅÍ.txt", m_EquipmentClassSet, m_DummyCharacterList, dwLoadCharNum); } bool CDummyCharacterList::Destroy() { DummyCharList::iterator pos = m_DummyCharacterList.begin(); DummyCharList::iterator end = m_DummyCharacterList.end(); for(;pos != end; ++pos) { CModifyDummyCharacter* lpDummyChar = *pos; CCell* lpCell = lpDummyChar->GetCellPos().m_lpCell; if(0 != lpCell) { lpCell->DeleteCreature(lpDummyChar->GetCID()); } lpDummyChar->SetLogout(); delete lpDummyChar; } m_DummyCharacterList.clear(); m_EquipmentClassSet.clear(); return true; } bool CDummyCharacterList::LoadEquipments(const char* szFileName, EquipmentVector& equipmentVector) { FILE* lpFile = fopen(szFileName, "rt"); if(0 != lpFile) { const int MAX_BUFFER = 1024; char szBuffer[MAX_BUFFER]; const char* szDelimiter = " \t\r\n"; char* szToken = 0; EquipmentData equipmentData; EquipmentData oldEquipmentData; while(fgets(szBuffer, MAX_BUFFER, lpFile)) { memset(equipmentData.m_usEquipments, 0, sizeof(unsigned short) * Item::EquipmentPos::MAX_EQUPMENT_POS); szToken = strtok(szBuffer, szDelimiter); if(0 != szToken) { // ¹«±â equipmentData.m_usEquipments[Item::EquipmentPos::WEAPON_HAND1] = static_cast(atoi(szToken)); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // ¹æÆÐ equipmentData.m_usEquipments[Item::EquipmentPos::SHIELD_HAND1] = static_cast(atoi(szToken)); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // Åõ±¸ equipmentData.m_usEquipments[Item::EquipmentPos::HELM] = static_cast(atoi(szToken)); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // °©¿Ê equipmentData.m_usEquipments[Item::EquipmentPos::ARMOUR] = static_cast(atoi(szToken)); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // Àå°© equipmentData.m_usEquipments[Item::EquipmentPos::GLOVE] = static_cast(atoi(szToken)); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // ½Å¹ß equipmentData.m_usEquipments[Item::EquipmentPos::BOOTS] = static_cast(atoi(szToken)); } if(0 != memcmp(oldEquipmentData.m_usEquipments, equipmentData.m_usEquipments, sizeof(unsigned short) * Item::EquipmentPos::MAX_EQUPMENT_POS)) { // ÀÌÀü Àåºñ µ¥ÀÌÅÍ¿Í °ãÄ¡Áö ¾ÊÀ¸¸é Ãß°¡. equipmentVector.push_back(equipmentData); } oldEquipmentData = equipmentData; } fclose(lpFile); return true; } return false; } bool CDummyCharacterList::LoadDummyChars(const char* szFileName, EquipmentClassSet& equipmentSet, DummyCharList& dummyCharList, unsigned long dwLoadCharNum) { FILE* lpFile = fopen(szFileName, "rt"); if(lpFile) { const int MAX_BUFFER = 8192; char szBuffer[MAX_BUFFER]; const char* szDelimiter = " \t\r\n"; char* szToken = 0; CharacterDBData charDBData; DummyData dummyData; unsigned long dwCharCount = 0; while(fgets(szBuffer, MAX_BUFFER - 1, lpFile) && dwCharCount < dwLoadCharNum) { memset(&charDBData, 0, sizeof(charDBData)); memset(&dummyData, 0, sizeof(dummyData)); szBuffer[MAX_BUFFER - 1] = 0; szToken = strtok(szBuffer, szDelimiter); if(0 != szToken) { // CID charDBData.m_Info.CID = atol(szToken); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // À̸§ strncpy(charDBData.m_Info.Name, szToken, CHAR_INFOST::MAX_NAME_LEN); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // ·¹º§ charDBData.m_Info.Level = atoi(szToken); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // Ŭ·¡½º, Á¾Á· charDBData.m_Info.Class = atoi(szToken); charDBData.m_Info.Race = CClass::GetRace(static_cast(charDBData.m_Info.Class)); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // ¸Ó¸®Ä® charDBData.m_Info.Hair = atoi(szToken); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // ¾ó±¼ charDBData.m_Info.Face = atoi(szToken); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // ¼ºº° charDBData.m_Info.Sex = atoi(szToken); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // XÁÂÇ¥ charDBData.m_Pos.LastPoint.fPointX = static_cast(atoi(szToken)); // charDBData.m_Pos.SavePoint.fPointX = static_cast(atoi(szToken)); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // YÁÂÇ¥ charDBData.m_Pos.LastPoint.fPointY = static_cast(atoi(szToken)); // charDBData.m_Pos.SavePoint.fPointY = static_cast(atoi(szToken)); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // ZÁÂÇ¥ charDBData.m_Pos.LastPoint.fPointZ = static_cast(atoi(szToken)); // charDBData.m_Pos.SavePoint.fPointZ = static_cast(atoi(szToken)); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // ¿Ê°¥¾ÆÀÔ±â ºóµµ (nÃÊ´ç Çѹø Á¤µµ ·£´ýÀ¸·Î °áÁ¤) dummyData.m_dwDressChangeFreq = atoi(szToken); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // °ø°Ý¸ð¼Ç ºóµµ (nÃÊ´ç Çѹø Á¤µµ ·£´ýÀ¸·Î °áÁ¤) dummyData.m_dwAttackFreq = atoi(szToken); } szToken = strtok(0, szDelimiter); if(0 != szToken) { // ½ºÅ³»ç¿ë ºóµµ (nÃÊ´ç Çѹø Á¤µµ ·£´ýÀ¸·Î °áÁ¤) dummyData.m_dwSkillFreq = atoi(szToken); } CModifyDummyCharacter* lpCharacter = new CModifyDummyCharacter(charDBData.m_Info.CID); if(0 != lpCharacter) { lpCharacter->Initialize(0); CCreatureManager::GetInstance().CancelLogout(lpCharacter); charDBData.m_Info.Fame = rand(); charDBData.m_Info.HP = 100; charDBData.m_Info.MP = 100; charDBData.m_Info.STR = rand(); charDBData.m_Info.DEX = rand(); charDBData.m_Info.CON = rand(); charDBData.m_Info.INT = rand(); charDBData.m_Info.WIS = rand(); lpCharacter->ModifyCharacterData(charDBData, dummyData); EquipmentClassSet::iterator pos = equipmentSet.find(lpCharacter->GetClass()); EquipmentClassSet::iterator end = equipmentSet.end(); if(pos != end) { EquipmentVector& equipmentVector = pos->second; if(!equipmentVector.empty()) { lpCharacter->ModifyEquipmentData( equipmentVector[rand() % equipmentVector.size()]); } } dummyCharList.push_back(lpCharacter); Position newPosition(charDBData.m_Pos.LastPoint.fPointX, charDBData.m_Pos.LastPoint.fPointY, charDBData.m_Pos.LastPoint.fPointZ); lpCharacter->Login(); lpCharacter->GetSerializeData().PrepareData(*lpCharacter); lpCharacter->GetSerializeData().ClearDeltaData(); lpCharacter->MoveTo(newPosition, false); ++dwCharCount; } } fclose(lpFile); return true; } return false; }