Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 6 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
# DarkEden Makefile

.PHONY: all fmt fmt fmt-check fmt-check-all clean help
.PHONY: all fmt fmt fmt-check fmt-check-all clean help debug

# Default target
all:
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(shell sysctl -n hw.ncpu 2>/dev/null || nproc 2>/dev/null || echo 4)

debug:
cmake -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build -j$(shell sysctl -n hw.ncpu 2>/dev/null || nproc 2>/dev/null || echo 4)


# Format code with clang-format
fmt:
@echo "Formatting C++ code with clang-format..."
Expand Down
2 changes: 0 additions & 2 deletions bin/game

This file was deleted.

2 changes: 0 additions & 2 deletions bin/login

This file was deleted.

2 changes: 0 additions & 2 deletions bin/share

This file was deleted.

26 changes: 0 additions & 26 deletions bin/start.sh

This file was deleted.

4 changes: 0 additions & 4 deletions bin/stop.sh

This file was deleted.

Empty file removed lib/.gitignore
Empty file.
8 changes: 4 additions & 4 deletions src/Core/BloodBibleSignInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
//
// Filename : BloodBibleSignInfo.cpp
// Written By : elca@ewestsoft.com
// Description : Àڽſ¡°Ô ¾²´Â ±â¼úÀÇ ¼º°øÀ» ¾Ë¸®±â À§ÇÑ ÆÐŶ Ŭ·¡½ºÀÇ
// ¸â¹ö Á¤ÀÇ.
// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의
// 멤버 정의.
//
//////////////////////////////////////////////////////////////////////

Expand Down Expand Up @@ -39,7 +39,7 @@ BloodBibleSignInfo::~BloodBibleSignInfo() {


//////////////////////////////////////////////////////////////////////
// ÀԷ½ºÆ®¸²(¹öÆÛ)À¸·ÎºÎÅÍ µ¥ÀÌŸ¸¦ Àо ÆÐŶÀ» ÃʱâÈ­ÇÑ´Ù.
// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다.
//////////////////////////////////////////////////////////////////////
void BloodBibleSignInfo::read(SocketInputStream& iStream) {
__BEGIN_TRY
Expand All @@ -58,7 +58,7 @@ void BloodBibleSignInfo::read(SocketInputStream& iStream) {


//////////////////////////////////////////////////////////////////////
// Ãâ·Â½ºÆ®¸²(¹öÆÛ)À¸·Î ÆÐŶÀÇ ¹ÙÀ̳ʸ® À̹ÌÁö¸¦ º¸³½´Ù.
// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다.
//////////////////////////////////////////////////////////////////////
void BloodBibleSignInfo::write(SocketOutputStream& oStream) const {
__BEGIN_TRY
Expand Down
4 changes: 2 additions & 2 deletions src/Core/BloodBibleSignInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
// Filename : BloodBibleSignInfo.h
// Written By : elca@ewestsoft.com
// Description :
// ÀÔ°í ÀÖ´Â ±â¾î ¾ÆÀÌÅÛµéÀÇ Á¤º¸ ¸®½ºÆ®ÀÌ´Ù.
// °¢°¢ÀÇ ±â¾î ¾ÆÀÌÅÛ¿¡ ´ëÇÑ Á¤º¸´Â BloodBibleSignSlotInfo¸¦ ÂüÁ¶ÇÏ¸é µÈ´Ù.
// 입고 있는 기어 아이템들의 정보 리스트이다.
// 각각의 기어 아이템에 대한 정보는 BloodBibleSignSlotInfo를 참조하면 된다.
//////////////////////////////////////////////////////////////////////////////

#ifndef __BLOOD_BIBLE_SIGN_INFO_H__
Expand Down
14 changes: 7 additions & 7 deletions src/Core/CGAbsorbSoul.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ class CGAbsorbSoul : public Packet {


public:
// ÀԷ½ºÆ®¸²(¹öÆÛ)À¸·ÎºÎÅÍ µ¥ÀÌŸ¸¦ Àо ÆÐŶÀ» ÃʱâÈ­ÇÑ´Ù.
// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다.
void read(SocketInputStream& iStream);

// Ãâ·Â½ºÆ®¸²(¹öÆÛ)À¸·Î ÆÐŶÀÇ ¹ÙÀ̳ʸ® À̹ÌÁö¸¦ º¸³½´Ù.
// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다.
void write(SocketOutputStream& oStream) const;

// execute packet's handler
Expand Down Expand Up @@ -123,11 +123,11 @@ class CGAbsorbSoul : public Packet {
ZoneCoord_t m_TargetZoneX;
ZoneCoord_t m_TargetZoneY;

ObjectID_t m_InvenObjectID; // ¶ó¹ÙÀÇ ObjectID
CoordInven_t m_InvenX; // X ÁÂÇ¥
CoordInven_t m_InvenY; // Y ÁÂÇ¥
CoordInven_t m_TargetInvenX; // Target X ÁÂÇ¥
CoordInven_t m_TargetInvenY; // Target Y ÁÂÇ¥
ObjectID_t m_InvenObjectID; // 라바의 ObjectID
CoordInven_t m_InvenX; // X 좌표
CoordInven_t m_InvenY; // Y 좌표
CoordInven_t m_TargetInvenX; // Target X 좌표
CoordInven_t m_TargetInvenY; // Target Y 좌표
};


Expand Down
4 changes: 2 additions & 2 deletions src/Core/CGAbsorbSoulHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,13 @@ void CGAbsorbSoulHandler::execute(CGAbsorbSoul* pPacket, Player* pPlayer)
Creature* pCreature = pGamePlayer->getCreature();
Assert(pCreature != NULL);

// ¾Æ¿ì½ºÅÍÁî°¡ ¾Æ´Ñ ³ðÀÌ Èí¿µÀ» ÇÒ ¼ö´Â ¾ø´Ù.
// 아우스터즈가 아닌 놈이 흡영을 할 수는 없다.
if (!pCreature->isOusters())
return;

Ousters* pOusters = dynamic_cast<Ousters*>(pCreature);

// ¿ÏÀü ¾ÈÀüÁö´ë¶ó¸é ±â¼ú »ç¿ë ºÒ°¡. by sigi. 2002.11.14
// 완전 안전지대라면 기술 사용 불가. by sigi. 2002.11.14
ZoneLevel_t ZoneLevel = pCreature->getZone()->getZoneLevel(pCreature->getX(), pCreature->getY());
if ((ZoneLevel & COMPLETE_SAFE_ZONE) || (!isAbleToUseObjectSkill(pOusters, SKILL_ABSORB_SOUL))) {
GCSkillFailed1 gcSkillFailed1;
Expand Down
4 changes: 2 additions & 2 deletions src/Core/CGAcceptUnion.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ class CGAcceptUnion : public Packet {
public:
CGAcceptUnion() {};
~CGAcceptUnion() {};
// ÀԷ½ºÆ®¸²(¹öÆÛ)À¸·ÎºÎÅÍ µ¥ÀÌŸ¸¦ Àо ÆÐŶÀ» ÃʱâÈ­ÇÑ´Ù.
// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다.
void read(SocketInputStream& iStream);

// Ãâ·Â½ºÆ®¸²(¹öÆÛ)À¸·Î ÆÐŶÀÇ ¹ÙÀ̳ʸ® À̹ÌÁö¸¦ º¸³½´Ù.
// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다.
void write(SocketOutputStream& oStream) const;

// execute packet's handler
Expand Down
28 changes: 14 additions & 14 deletions src/Core/CGAcceptUnionHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ void CGAcceptUnionHandler::execute(CGAcceptUnion* pPacket, Player* pPlayer)

#ifdef __OLD_GUILD_WAR__
GCSystemMessage gcSM;
gcSM.setMessage("¾ÆÁ÷ Áö¿øµÇÁö ¾Ê´Â ±â´ÉÀÔ´Ï´Ù.");
gcSM.setMessage("아직 지원되지 않는 기능입니다.");
pGamePlayer->sendPacket(&gcSM);
return;
#endif
Expand All @@ -66,11 +66,11 @@ void CGAcceptUnionHandler::execute(CGAcceptUnion* pPacket, Player* pPlayer)
return;
}

// ¿äûÇѳðÀÌ Áö°¡ ¼ÓÇÑ ±æµåÀÇ ¸¶½ºÅÍÀΰ¡? || ¿¬ÇÕÀÇ ¸¶½ºÅͱæµå°¡ ³» ±æµå°¡ ¸Â³ª?
// 요청한놈이 지가 속한 길드의 마스터인가? || 연합의 마스터길드가 내 길드가 맞나?
if (!g_pGuildManager->isGuildMaster(pPlayerCreature->getGuildID(), pPlayerCreature) ||
pUnion->getMasterGuildID() != pPlayerCreature->getGuildID()) {
// GC_GUILD_RESPONSE ³¯·ÁÁØ´Ù.
// ³»¿ë : ±æµå ¸¶½ºÅͰ¡ ¾Æ´ÏÀÚ³à -.-+
// GC_GUILD_RESPONSE 날려준다.
// 내용 : 길드 마스터가 아니자녀 -.-+

gcGuildResponse.setCode(GuildUnionOfferManager::SOURCE_IS_NOT_MASTER);
pPlayer->sendPacket(&gcGuildResponse);
Expand All @@ -94,7 +94,7 @@ void CGAcceptUnionHandler::execute(CGAcceptUnion* pPacket, Player* pPlayer)
}
string TargetGuildMaster = pGuild->getMaster();

// cout << "°¡ÀÔÀÌ ¼ö¶ôµÇ¾ú´Ù. Å뺸¹ÞÀ» À¯Àú´Â : " << TargetGuildMaster.c_str() << endl;
// cout << "가입이 수락되었다. 통보받을 유저는 : " << TargetGuildMaster.c_str() << endl;


Statement* pStmt = NULL;
Expand All @@ -108,7 +108,7 @@ void CGAcceptUnionHandler::execute(CGAcceptUnion* pPacket, Player* pPlayer)
END_DB(pStmt)


// ¿¬ÇÕ¸¶½ºÅͰ¡ µÈ ¾ÆÇÑÅ× ¿¬ÇÕ¾ÆÀ̵ð¿Í UNION_MASTER¸¦ º¸³»Áà¾ß Çϰí..
// 연합마스터가 된 아한테 연합아이디와 UNION_MASTER를 보내줘야 하고..
Creature* pCreature = NULL;
pCreature = pGamePlayer->getCreature();

Expand All @@ -121,9 +121,9 @@ void CGAcceptUnionHandler::execute(CGAcceptUnion* pPacket, Player* pPlayer)
pPlayer->sendPacket(&gcModifyInformation);


// ¿¬ÇÕ¿¡ °¡ÀÔµÈ ±æµå ¸¶½ºÅÍ ÇÑÅ×´Â ¿¬ÇÕ¾ÆÀ̵ð¿Í UNION_GUILD_MASTER¸¦ º¸³»Áà¾ß ÇѵÂ..
// 연합에 가입된 길드 마스터 한테는 연합아이디와 UNION_GUILD_MASTER를 보내줘야 한돠..
//
// Å뺸¹ÞÀ» À¯Àú¿¡°Ô ±æµåUnionÁ¤º¸¸¦ ´Ù½Ã º¸³½´Ù
// 통보받을 유저에게 길드Union정보를 다시 보낸다

Creature* pTargetCreature = NULL;
__ENTER_CRITICAL_SECTION((*g_pPCFinder))
Expand All @@ -142,20 +142,20 @@ void CGAcceptUnionHandler::execute(CGAcceptUnion* pPacket, Player* pPlayer)
//////////////////////////////


// ³» ¼­¹ö¿¡ ÀÖ´Â ³ðµé¿¡°Ô º¯°æ»çÇ×À» ¾Ë¸°´Ù.
// 내 서버에 있는 놈들에게 변경사항을 알린다.
sendGCOtherModifyInfoGuildUnion(pTargetCreature);
sendGCOtherModifyInfoGuildUnion(pCreature);


// ´Ù¸¥ ¼­¹ö¿¡ ÀÖ´Â ³ðµé¿¡°Ô º¯°æ»çÇ×À» ¾Ë¸°´Ù.
// 다른 서버에 있는 놈들에게 변경사항을 알린다.
GuildUnionManager::Instance().sendModifyUnionInfo(dynamic_cast<PlayerCreature*>(pTargetCreature)->getGuildID());
GuildUnionManager::Instance().sendModifyUnionInfo(dynamic_cast<PlayerCreature*>(pCreature)->getGuildID());


// GCModifyInformation / GCOtherModifyInfo ¸¦ Á¶¸³Çؼ­ ³¯¸°´Ù.
// GCModifyInformation Àº pPlayerCreature ¿¡°Ô
// GCOtherModifyInfo ´Â broadcast ÇÑ´Ù.
// ³Ö¾î º¸³¾ Á¤º¸´Â GuildUnionID ¿Í GuildUnionGrade´Ù?
// GCModifyInformation / GCOtherModifyInfo 를 조립해서 날린다.
// GCModifyInformation 은 pPlayerCreature 에게
// GCOtherModifyInfo 는 broadcast 한다.
// 넣어 보낼 정보는 GuildUnionID 와 GuildUnionGrade다?
}

#endif // __GAME_SERVER__
Expand Down
36 changes: 18 additions & 18 deletions src/Core/CGAddGearToMouseHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,16 @@ void CGAddGearToMouseHandler::execute(CGAddGearToMouse* pPacket, Player* pPlayer
Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature);
Assert(pSlayer != NULL);

// ¸¶¿ì½º¿¡ ¹º°¡¸¦ µé°í À־ ¾È µÇ°í,
// ¹þÀ¸·Á´Â ºÎºÐ¿¡ ¾ÆÀÌÅÛÀ» ÀÔ°í ÀÖÁö ¾Ê¾Æ¼­µµ ¾È µÈ´Ù.
// 마우스에 뭔가를 들고 있어선 안 되고,
// 벗으려는 부분에 아이템을 입고 있지 않아서도 안 된다.
if (pSlayer->getExtraInventorySlotItem() == NULL && pSlayer->isWear((Slayer::WearPart)SlotID)) {
// ÀåÂøÇϰí ÀÖ´Â ItemÀ» ¹Þ¾Æ¿Â´Ù.
// 장착하고 있는 Item을 받아온다.
Item* pItem = pSlayer->getWearItem((Slayer::WearPart)SlotID);

// ¾ÆÀÌÅÛÀÌ ÀÖ´ÂÁö ±× ¾ÆÀÌÅÛÀÇ ObjectID°¡ ÀÏÄ¡ÇÏ´ÂÁö üũÇÑ´Ù.
// 아이템이 있는지 그 아이템의 ObjectID가 일치하는지 체크한다.
if (pItem != NULL && pItem->getObjectID() == pPacket->getObjectID()) {
// ¾ÆÀÌÅÛÀ» ÀåÂøÃ¢¿¡¼­ Áö¿ì°í Mouse·Î À̵¿½ÃŲ´Ù.
// ¿ÊÀ» ¹þ±â¸é¼­ ´É·ÂÄ¡¸¦ ´Ù¿î½ÃŰ°í ¹þÀº ¾ÆÀÌÅÛÀ» Mouse·Î À̵¿½ÃŲ´Ù.
// 아이템을 장착창에서 지우고 Mouse로 이동시킨다.
// 옷을 벗기면서 능력치를 다운시키고 벗은 아이템을 Mouse로 이동시킨다.
pSlayer->takeOffItem((Slayer::WearPart)SlotID, true, true);
bSuccess = true;
}
Expand All @@ -62,16 +62,16 @@ void CGAddGearToMouseHandler::execute(CGAddGearToMouse* pPacket, Player* pPlayer

Assert(pVampire != NULL);

// ¸¶¿ì½º¿¡ ¹º°¡¸¦ µé°í À־ ¾È µÇ°í,
// ¹þÀ¸·Á´Â ºÎºÐ¿¡ ¾ÆÀÌÅÛÀ» ÀÔ°í ÀÖÁö ¾Ê¾Æ¼­µµ ¾È µÈ´Ù.
// 마우스에 뭔가를 들고 있어선 안 되고,
// 벗으려는 부분에 아이템을 입고 있지 않아서도 안 된다.
if (pVampire->getExtraInventorySlotItem() == NULL && pVampire->isWear((Vampire::WearPart)SlotID)) {
// ÀåÂøÇϰí ÀÖ´Â ItemÀ» ¹Þ¾Æ¿Â´Ù.
// 장착하고 있는 Item을 받아온다.
Item* pItem = pVampire->getWearItem((Vampire::WearPart)SlotID);

// ¾ÆÀÌÅÛÀÌ ÀÖ´ÂÁö ±× ¾ÆÀÌÅÛÀÇ ObjectID°¡ ÀÏÄ¡ÇÏ´ÂÁö üũÇÑ´Ù.
// 아이템이 있는지 그 아이템의 ObjectID가 일치하는지 체크한다.
if (pItem != NULL && pItem->getObjectID() == pPacket->getObjectID()) {
// ¾ÆÀÌÅÛÀ» ÀåÂøÃ¢¿¡¼­ Áö¿ì°í Mouse·Î À̵¿½ÃŲ´Ù.
// ¿ÊÀ» ¹þ±â¸é¼­ ´É·ÂÄ¡¸¦ ´Ù¿î½ÃŰ°í ¹þÀº ¾ÆÀÌÅÛÀ» Mouse·Î À̵¿½ÃŲ´Ù.
// 아이템을 장착창에서 지우고 Mouse로 이동시킨다.
// 옷을 벗기면서 능력치를 다운시키고 벗은 아이템을 Mouse로 이동시킨다.
pVampire->takeOffItem((Vampire::WearPart)SlotID, true, true);
bSuccess = true;
}
Expand All @@ -81,16 +81,16 @@ void CGAddGearToMouseHandler::execute(CGAddGearToMouse* pPacket, Player* pPlayer

Assert(pOusters != NULL);

// ¸¶¿ì½º¿¡ ¹º°¡¸¦ µé°í À־ ¾È µÇ°í,
// ¹þÀ¸·Á´Â ºÎºÐ¿¡ ¾ÆÀÌÅÛÀ» ÀÔ°í ÀÖÁö ¾Ê¾Æ¼­µµ ¾È µÈ´Ù.
// 마우스에 뭔가를 들고 있어선 안 되고,
// 벗으려는 부분에 아이템을 입고 있지 않아서도 안 된다.
if (pOusters->getExtraInventorySlotItem() == NULL && pOusters->isWear((Ousters::WearPart)SlotID)) {
// ÀåÂøÇϰí ÀÖ´Â ItemÀ» ¹Þ¾Æ¿Â´Ù.
// 장착하고 있는 Item을 받아온다.
Item* pItem = pOusters->getWearItem((Ousters::WearPart)SlotID);

// ¾ÆÀÌÅÛÀÌ ÀÖ´ÂÁö ±× ¾ÆÀÌÅÛÀÇ ObjectID°¡ ÀÏÄ¡ÇÏ´ÂÁö üũÇÑ´Ù.
// 아이템이 있는지 그 아이템의 ObjectID가 일치하는지 체크한다.
if (pItem != NULL && pItem->getObjectID() == pPacket->getObjectID()) {
// ¾ÆÀÌÅÛÀ» ÀåÂøÃ¢¿¡¼­ Áö¿ì°í Mouse·Î À̵¿½ÃŲ´Ù.
// ¿ÊÀ» ¹þ±â¸é¼­ ´É·ÂÄ¡¸¦ ´Ù¿î½ÃŰ°í ¹þÀº ¾ÆÀÌÅÛÀ» Mouse·Î À̵¿½ÃŲ´Ù.
// 아이템을 장착창에서 지우고 Mouse로 이동시킨다.
// 옷을 벗기면서 능력치를 다운시키고 벗은 아이템을 Mouse로 이동시킨다.
pOusters->takeOffItem((Ousters::WearPart)SlotID, true, true);
bSuccess = true;
}
Expand Down
4 changes: 2 additions & 2 deletions src/Core/CGAddInjuriousCreature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ void CGAddInjuriousCreature::read(SocketInputStream& iStream)
{
__BEGIN_TRY

// À̸§ Àбâ
// 이름 읽기
BYTE szName;

iStream.read(szName);
Expand All @@ -32,7 +32,7 @@ void CGAddInjuriousCreature::write(SocketOutputStream& oStream) const
{
__BEGIN_TRY

// À̸§ ¾²±â
// 이름 쓰기
BYTE szName = m_Name.size();

if (szName == 0)
Expand Down
10 changes: 5 additions & 5 deletions src/Core/CGAddInjuriousCreature.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,19 @@
//
// class CGAddInjuriousCreature;
//
// Ŭ¶óÀÌ¾ðÆ®°¡ ¼­¹ö¿¡°Ô º¸³»´Â AddInjuriousCreature ÆÐŶÀÌ´Ù.
// ³»ºÎ¿¡ AddInjuriousCreature String ¸¸À» µ¥ÀÌŸ Çʵå·Î °¡Áø´Ù.
// 클라이언트가 서버에게 보내는 AddInjuriousCreature 패킷이다.
// 내부에 AddInjuriousCreature String 만을 데이타 필드로 가진다.
//
//////////////////////////////////////////////////////////////////////

class CGAddInjuriousCreature : public Packet {
public:
CGAddInjuriousCreature() {};
~CGAddInjuriousCreature() {};
// ÀԷ½ºÆ®¸²(¹öÆÛ)À¸·ÎºÎÅÍ µ¥ÀÌŸ¸¦ Àо ÆÐŶÀ» ÃʱâÈ­ÇÑ´Ù.
// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다.
void read(SocketInputStream& iStream);

// Ãâ·Â½ºÆ®¸²(¹öÆÛ)À¸·Î ÆÐŶÀÇ ¹ÙÀ̳ʸ® À̹ÌÁö¸¦ º¸³½´Ù.
// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다.
void write(SocketOutputStream& oStream) const;

// execute packet's handler
Expand Down Expand Up @@ -92,7 +92,7 @@ class CGAddInjuriousCreatureFactory : public PacketFactory {
}

// get packet's max body size
// message ÀÇ ÃÖ´ë Å©±â¿¡ ´ëÇÑ ¼³Á¤ÀÌ ÇÊ¿äÇÏ´Ù.
// message 의 최대 크기에 대한 설정이 필요하다.
PacketSize_t getPacketMaxSize() const {
return szBYTE + 10;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Core/CGAddInventoryToMouse.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class CGAddInventoryToMouse : public Packet {
private:
ObjectID_t m_ObjectID;

// º¸Á¶ Àκ¥Å丮 ¾ÆÀÌÅÛÀÇ ¿ÀºêÁ§Æ® ¾ÆÀ̵ð. 0ÀÌ¸é ¸ÞÀÎ Àκ¥Å丮¿¡¼­ ²¨³¿
// 보조 인벤토리 아이템의 오브젝트 아이디. 0이면 메인 인벤토리에서 꺼냄
ObjectID_t m_InventoryItemObjectID;

CoordInven_t m_InvenX;
Expand Down
Loading
Loading