하아찡
[C++] 몬스터 정보, 아이템 정보 XML에서 불러오기 본문
언리얼 버전 5.5.3
서버언어 C++로 구성했습니다.
아이템 정보와 몬스터 정보를 파일로 만들어서 불러다 써야 관리하기 쉬울꺼같아서 작업했습니다.
json으로 할라다가 xml로 작업했습니다.
장비 XML
<?xml version="1.0" encoding="utf-8"?>
<Items>
<Item id="1001">
<Name>레드 포션</Name>
<Type>Consumable</Type>
<Heal>50</Heal>
<Icon>/Game/IMG/hp.hp</Icon>
<Drop>0.1</Drop>
</Item>
<Item id="2001">
<Name>장검</Name>
<Type>Equipment</Type>
<Attack>30</Attack>
<Critical>15</Critical>
<CriticalRate>30</CriticalRate>
<Icon>/Game/IMG/sword.sword</Icon>
<Drop>0.1</Drop>
</Item>
<Item id="3001">
<Name>헬멧</Name>
<Type>Equipment</Type>
<Defense>50</Defense>
<Icon>/Game/IMG/head.head</Icon>
<Drop>0.1</Drop>
</Item>
</Items>
몬스터 XML
<?xml version="1.0" encoding="utf-8"?>
<Monsters>
<Monster id="0">
<Name>고블린</Name>
<Hp>5000</Hp>
<Mp>0</Mp>
<Shield>0</Shield>
<Speed>200</Speed>
<SearchRadius>1000</SearchRadius>
<RegenTime>3000</RegenTime>
<Exp>50</Exp>
<Gold>100</Gold>
<DropTable>
<Drop code="1001" rate="0.1" />
<Drop code="2001" rate="0.05" />
<Drop code="3001" rate="0.05" />
</DropTable>
</Monster>
</Monsters>
C++에서 Xml파일을 불러오기위해서 tinyxml을 사용했습니다.
https://github.com/leethomason/tinyxml2
GitHub - leethomason/tinyxml2: TinyXML2 is a simple, small, efficient, C++ XML parser that can be easily integrated into other p
TinyXML2 is a simple, small, efficient, C++ XML parser that can be easily integrated into other programs. - leethomason/tinyxml2
github.com
위 깃헙가셔서 tinyxml2.cpp 파일과 tinyxml2.h 파일을 받으셔서 프로젝트에 넣어주시면 됩니다.
몬스터 정보를 XML에서 추출해서 메모리에 올려놓는 작업입니다.
bool MonsterTable::LoadMonstersFromXML(const char* FilePath)
{
XMLDocument doc;
if (doc.LoadFile(FilePath) == XML_SUCCESS)
{
XMLElement* root = doc.FirstChildElement("Monsters");
for (XMLElement* item = root->FirstChildElement("Monster"); item != nullptr; item = item->NextSiblingElement("Monster"))
{
int id = item->IntAttribute("id");
StatInfo MonsterInfo;
MonsterInfo.name = item->FirstChildElement("Name")->GetText();
if (XMLElement* Hp = item->FirstChildElement("Hp")) {
MonsterInfo.max_hp = atoi(Hp->GetText()); //HP 저장
MonsterInfo.cur_hp = atoi(Hp->GetText());
}
if (XMLElement* Mp = item->FirstChildElement("Mp")) {
MonsterInfo.max_mp = atoi(Mp->GetText()); // Mp
MonsterInfo.cur_mp = atoi(Mp->GetText());
}
if (XMLElement* Speed = item->FirstChildElement("Speed")) {
MonsterInfo.defalut_speed = atoi(Speed->GetText()); // Mp
MonsterInfo.cur_speed = atoi(Speed->GetText());
}
if (XMLElement* Shield = item->FirstChildElement("Shield"))
MonsterInfo.shield = atoi(Shield->GetText()); // 쉴드
if (XMLElement* SearchRadius = item->FirstChildElement("SearchRadius"))
MonsterInfo.searchradius = atoi(SearchRadius->GetText()); // 어그로 범위
if (XMLElement* RegenTime = item->FirstChildElement("RegenTime"))
MonsterInfo.regentime = atoi(RegenTime->GetText()); // 몬스터 리젠주기
if (XMLElement* Exp = item->FirstChildElement("Exp"))
MonsterInfo.exp = std::stof(Exp->GetText()); // 경험치
if (XMLElement* Gold = item->FirstChildElement("Gold"))
MonsterInfo.gold = std::stof(Gold->GetText()); // 경험치
// 몬스터 잡았을때 드랍 여부
if (XMLElement* dropTable = item->FirstChildElement("DropTable"))
{
for (XMLElement* drop = dropTable->FirstChildElement("Drop"); drop != nullptr; drop = drop->NextSiblingElement("Drop"))
{
int code = 0;
float rate = 0.0f;
drop->QueryIntAttribute("code", &code);
drop->QueryFloatAttribute("rate", &rate);
MonsterDropInfo dropInfo;
dropInfo.code = code;
dropInfo.rate = rate;
MonsterInfo.dropTable.push_back(dropInfo);
}
}
MonsterInfos.insert({ id, MonsterInfo });
}
LOG("Monster Load Success!!!");
return true;
}
else {
LOG("Monster Load Fail!!!");
return false;
}
}
해당 몬스터가 드랍 할 아이템 코드를 Xml에 DropTable에 추가해주시면 해당 아이템코드를 해당 몬스터가 드랍할수있게됩니다.
해당 아이템 드랍률도 같이 rate로 설정해서 몬스터를 잡았을때 드랍률을 확인해서 아이템을 드랍할수가 있습니다.
이제는 xml파일만 수정을 하면 별다른 코드 수정없이 몬스터 및 아이템 정보를 수정할 수 있습니다.
실행화면
<?xml version="1.0" encoding="utf-8"?>
<Monsters>
<Monster id="0">
<Name>고블린</Name>
<Hp>5000</Hp>
<Mp>0</Mp>
<Shield>0</Shield>
<Speed>200</Speed>
<SearchRadius>1000</SearchRadius>
<RegenTime>3000</RegenTime>
<Exp>50</Exp>
<Gold>100</Gold>
<DropTable>
<Drop code="1001" rate="0.1" />
<Drop code="2001" rate="0.05" />
<Drop code="3001" rate="0.05" />
</DropTable>
</Monster>
</Monsters>

<?xml version="1.0" encoding="utf-8"?>
<Monsters>
<Monster id="0">
<Name>고블린</Name>
<Hp>5000</Hp>
<Mp>0</Mp>
<Shield>0</Shield>
<Speed>200</Speed>
<SearchRadius>1000</SearchRadius>
<RegenTime>3000</RegenTime>
<Exp>50</Exp>
<Gold>100</Gold>
<DropTable>
<Drop code="1001" rate="0.1" />
<Drop code="2001" rate="0.05" />
<Drop code="3001" rate="0.05" />
</DropTable>
</Monster>
<Monster id="1">
<Name>테스트몬스터</Name>
<Hp>1000</Hp>
<Mp>0</Mp>
<Shield>0</Shield>
<Speed>200</Speed>
<SearchRadius>1000</SearchRadius>
<RegenTime>3000</RegenTime>
<Exp>50</Exp>
<Gold>100</Gold>
<DropTable>
<Drop code="1001" rate="0.1" />
<Drop code="2001" rate="0.05" />
<Drop code="3001" rate="0.05" />
</DropTable>
</Monster>
</Monsters>

해당 xml값만 변경되면 클라이언트도 동일하게 변경이됩니다.
클라이언트는 몬스터 체력값을 서버에서 받기때문 입니다.
'C++ > 이것저것서버테스트' 카테고리의 다른 글
[C++] 인벤토리 (1) | 2025.03.22 |
---|---|
[C++] 서버에서 아이템 드랍 처리 (0) | 2025.03.22 |
[C++] 서버 DB업로드 (1) | 2025.03.20 |
[C++] 몬스터 움직임 - 2 (0) | 2025.03.17 |
[언리얼5] 마지막 종료지점 저장 (0) | 2025.03.12 |